
Idioma 🇧🇷 Português (Brasil)
Instalação Val Town
Adicionar Comentários ao Vivo aos Aplicativos Val Town
Val Town executa TypeScript no Deno, então um val é um servidor real. Isso o torna uma boa escolha para o FastComments: o widget é uma tag script na página, e qualquer coisa que precise de um segredo, como Secure SSO ou verificação de webhook, pode ser executada no lado do servidor no mesmo val.
Este guia cobre a adição do widget de comentários a um val HTTP, a exibição de contagens de comentários em uma página de índice, o login de usuários com a conta Val Town que eles já possuem e o recebimento de webhooks de comentários.
Você não precisa de uma conta para experimentá-lo. Os exemplos usam tenantId: "demo", um sandbox compartilhado, e o Passo 2 cobre a troca para o seu próprio.
Passo 1: Adicionar o Widget 
O widget é uma tag de script e um elemento contêiner, portanto ele se insere em qualquer coisa que seu val já renderiza. Este exemplo usa Hono JSX, que é o que os templates HTTP do Val Town utilizam.
Run 
Escolha um urlId antes de enviar
urlId decide em qual thread um comentário será colocado. Se deixá-lo sem definição, ele padrão para uma versão limpa da URL da página atual, que é exatamente o que muda no Val Town: um val tem um hostname longo *.web.val.run até que você reivindique um subdomínio, ramificações recebem suas próprias URLs, e renomear uma página altera o caminho. Cada variação silenciosamente se torna um thread separado e vazio, e o sintoma aparece como "meus comentários desapareceram".
Defina-o para algo estável que você controla, como o slug da postagem ou um ID de banco de dados, como acima. Também passe url, para que os e‑mails de notificação e as ferramentas de moderação possam linkar de volta à página real.
Mantendo comentários sem JavaScript
FastComments renderiza um thread completo no lado do servidor, que um val pode inserir em um bloco <noscript>:
Run 
Codifique os parâmetros em URL. A versão server‑side suporta comentários anônimos e autenticados, SSO e respostas aninhadas.
Passo 2: Use sua própria conta 
tenantId: "demo" é um sandbox público compartilhado. Ele funciona sem cadastro, por isso os exemplos o utilizam, mas todos os outros que experimentam o FastComments escrevem nas mesmas discussões e qualquer pessoa pode moderá‑las. Troque antes de publicar algo que lhe importe.
Seu ID de locatário está na página de segredo da API.
Um ID de locatário é público e deve estar no código do navegador. Um segredo de API não é, e nada nesta página requer um.
Leia-a a partir de uma variável de ambiente
Os vals do Val Town são públicos no plano gratuito, portanto sua origem é legível por todos. Mantenha tudo que for sensível em variáveis de ambiente, lidas com Deno.env.get:
Run 
Isso é ainda mais importante no Val Town por um segundo motivo: remixar um val copia as chaves das variáveis de ambiente, mas não seus valores. Um segredo mantido em uma variável de ambiente não acompanha seu val para a conta de outra pessoa. Um segredo escrito em um arquivo acompanha.
Recuar para "demo" mantém o val funcionando para quem o remixa antes de definir seu próprio locatário.
Contas da UE
Uma conta, seus dados e suas chaves residem em uma única região. Se a sua foi criada em eu.fastcomments.com, toda configuração de widget também precisa de region: "eu", e os scripts são carregados de cdn-eu.fastcomments.com. Caso contrário, deixe ambos como estão.
Contagem de Comentários em uma Página de Índice 
Em uma página de índice, não renderize um widget de contagem de comentários por linha. Isso gera uma solicitação por postagem. Use a contagem em massa, que faz uma única solicitação para a página inteira.
Marque cada linha com o urlId que seu thread usa e, em seguida, carregue o widget em massa uma única vez:
Run 
O script encontra cada elemento .fast-comments-count na página e preenche sua contagem.
data-fast-comments-url-id deve corresponder ao urlId que o widget de comentários da postagem usa. Se o widget usar o slug, o marcador usará o slug. Uma incompatibilidade exibirá zero em um thread que tem comentários.
O script verifica window.FastCommentsBulkCountConfig, portanto não importa se você definir a configuração antes ou depois da tag de script.
SSO Seguro com std/oauth 
If your val already knows who the visitor is, Secure SSO hands that identity to the widget so they never see a second login. There are no endpoints to build and nothing to call at runtime: you compute three values server-side and pass them in the widget config.
Val Town ships zero-config login with std/oauth, so the visitor can sign in with the Val Town account they already have. Swap that for whatever your app uses; the FastComments half does not change.
Build the payload on the server
The API secret signs the payload and must never reach browser code. Install the SDK from npm, which works on Val Town's Deno runtime as-is:
Run 
getPayload() returns { userDataJSONBase64, verificationHash, timestamp }. Those three values are all that reach the browser. The secret signs them and is then dropped, so nothing in the page lets a reader forge a different user.
Pass it to the widget
Run 
oauthMiddleware adds GET /auth/login, GET /auth/callback and POST /auth/logout for you. Note that logout is a POST, while the widget navigates to logoutURL with a GET, so point logoutURL at a small route of your own that submits the POST.
When the visitor is logged out, pass sso with only a loginURL. The widget then shows a login prompt instead of an anonymous comment box.
Things that go wrong
timestamp is epoch milliseconds, must not be in the future, and must not be more than two days old. Generate it on the server in the same request that computes the hash. Generating it in the browser is the classic failure: the value differs from the one that was hashed and every comment is rejected.
Never set isAdmin or isModerator from the identity provider. Signing in with a Val Town account says nothing about who should moderate your site.
See the SSO guide for the full field list, group-gated threads, and badges.
Recebendo Webhooks 
Um val é um receptor de webhook natural: ele tem uma URL estável, pode verificar uma assinatura e inclui SQLite e armazenamento de blobs embutidos.
FastComments assina ${timestamp}.${body} com o segredo da API da sua conta e envia dois cabeçalhos:
Run 
O método transporta o evento: PUT para um comentário criado ou atualizado, DELETE para um comentário excluído.
Run 
Duas coisas que dão dor
Verifique os bytes brutos. Analisar o JSON e reserializá‑lo altera a ordem das chaves e os espaços em branco, portanto o hash difere e cada entrega falha sem causa óbvia. Essa é a razão usual de um receptor de webhook "simplesmente não funciona".
Compare em tempo constante. Um simples === na assinatura vaza quantos bytes coincidem, o que é suficiente para forjar um byte de cada vez.
Manipulando eventos
Responda rapidamente. FastComments tenta novamente em caso de resposta não‑2xx, e um endpoint que continua falhando é eventualmente desativado automaticamente, portanto faça o trabalho real após responder, em vez de inline.
Torne esse trabalho idempotente com base no ID do comentário. Uma nova tentativa é assinada novamente com um timestamp novo, e o mesmo ID de comentário chega novamente em edição e exclusão, portanto não há nada estável para desduplicar.
Exemplos de Vals 
Quatro vals públicos que você pode remixar, cada um cobrindo uma parte deste guia.
Blog com comentários (live) é um blog em Markdown com um tópico sob cada post e contagens de comentários em massa no índice. Ele funciona no momento em que você o remixar, e uma variável de ambiente aponta para sua própria conta.
Demo SSO (live) autentica o visitante com a conta do Val Town dele e entrega essa identidade ao widget, de modo que não há um segundo login.
Receptor de Webhook (live) verifica a assinatura HMAC em cada entrega e armazena os eventos em SQLite. Ele possui um botão que assina uma carga de teste e a entrega a si mesmo, para que você possa observar a verificação ser bem‑sucedida antes de configurar um webhook real.
Habilidades de agente (live) é uma biblioteca de habilidades de agente FastComments que cobre o widget, SSO, a API REST, moderação e migração do Disqus. Remix‑a e o agente da Val Town, Townie, carrega as habilidades de skills/ automaticamente, de modo que seu agente saiba como integrar comentários sem que você precise colar a documentação no chat.
As mesmas habilidades podem ser instaladas em qualquer outro lugar com npx skills add fastcomments/skills.
Erros de Domínio 
Once you switch off the demo tenant, the widget may refuse to load with an authorization error. This is because FastComments doesn't know it's supposed to allow your account to be used on that domain.
Go here to add your site to your account.
Val Town is worth a second look here, because a val can be reachable at more than one hostname:
- Every HTTP val has a long default endpoint,
<org>--<id>.web.val.run. - Claiming a custom subdomain adds
<name>.val.run. - A custom domain adds a third.
- Branches get their own URLs.
Add whichever hostnames you actually serve the widget from. If you claim a subdomain after setting things up, add that too, or the widget works on the old URL and fails on the new one.