
Език 🇧🇬 Български
Инсталиране на Val Town
Добавете живо коментиране към приложенията на Val Town
Val Town изпълнява TypeScript върху Deno, така че val е истински сървър. Това го прави подходящ за FastComments: уиджетът е script таг в страницата и всичко, което изисква тайна, като Secure SSO или проверка на webhook, може да се изпълни от сървърната страна в същия val.
Този наръчник обхваща добавянето на уиджета за коментари към HTTP val, показването на броя коментари на индексната страница, влизането на потребителите с акаунта им във Val Town, който вече имат, и получаването на webhook‑и за коментари.
Не ви е необходим акаунт, за да го изпробвате. Примерите използват tenantId: "demo", споделен sandbox, а Стъпка 2 обяснява как да преминете към ваш собствен.
Стъпка 1: Добавете уиджета 
The widget is a script tag and a container element, so it drops into whatever your val already renders. This example uses Hono JSX, which is what Val Town's HTTP templates use.
Run 
Изберете urlId преди да пуснете
urlId decides which thread a comment lands in. Leave it unset and it defaults to a cleaned version of the current page URL, which is exactly the thing that changes on Val Town: a val has a long *.web.val.run hostname until you claim a subdomain, branches get their own URLs, and renaming a page changes the path. Each variation silently becomes a separate, empty thread, and the symptom reads as "my comments disappeared".
Set it to something stable that you control, like the post slug or a database id, as above. Pass url too, so notification emails and the moderation tools can link back to the real page.
Запазване на коментари без JavaScript
FastComments renders a full thread server-side, which a val can drop into a <noscript> block:
Run 
URL-encode the parameters. The server-side version supports anonymous and logged-in commenting, SSO, and nested replies.
Стъпка 2: Използвайте вашия собствен акаунт 
tenantId: "demo" е споделен публичен пясъчник. Работи без регистрация, затова примерите го използват, но всички останали, които използват FastComments, пишат в същите теми и всеки може да ги модерира. Превключете преди да публикувате каквото и да е, което ви е важно.
Вашият tenant ID е на страница за API тайни.
Tenant ID е публичен и принадлежи в кода на браузъра. API тайна не е, и нищо на тази страница не се нуждае от такава.
Прочетете го от променлива на околната среда
Val Town валовете са публични в безплатния слой, затова техният източник е достъпен за всички. Пазете всичко чувствително в променливи на околната среда, прочетете с Deno.env.get:
Run 
Това е по-важно от обикновено в Val Town поради втора причина: ремиксирането на вал копира ключовете на променливите на околната среда, но не техните стойности. Тайна, съхранена в променлива на околната среда, не следва вашия вал в акаунта на друг човек. Тайна, записана във файл, го прави.
Връщането към "demo" запазва валът работещ за всеки, който го ремиксира, преди да зададе свой собствен tenant.
EU акаунти
Акаунт, неговите данни и ключове живеят в един регион. Ако вашият е създаден на eu.fastcomments.com, всяка конфигурация на уиджет също се нуждае от region: "eu", а скриптовете се зареждат от cdn-eu.fastcomments.com. В противен случай оставете и двете както са.
Брой коментари на индексната страница 
На индексна страница не рендерирайте по един widget за брой коментари на ред. Това е една заявка за всяка публикация. Използвайте груповия брой, който изпраща една единствена заявка за цялата страница.
Маркирайте всеки ред с urlId, който използва нишката му, след което заредете груповия widget еднократно:
Run 
Скриптът намира всеки елемент .fast-comments-count на страницата и попълва неговия брой.
data-fast-comments-url-id трябва да съвпада с urlId, който използва widget‑ът за коментари на публикацията. Ако widget‑ът използва slug, маркерът използва slug. При несъответствие се показва нула за нишка, която има коментари.
Скриптът проверява наличието на window.FastCommentsBulkCountConfig, затова няма значение дали конфигурацията е зададена преди или след етикета на скрипта.
Сигурен SSO с std/oauth 
Ако вашият val вече знае кой е посетителят, Secure SSO предава тази идентичност на уиджета, така че той никога да не вижда второ влизане. Няма нужда от създаване на крайни точки и нищо не се извиква по време на изпълнение: изчислявате три стойности на сървъра и ги предавате в конфигурацията на уиджета.
Val Town предоставя вход без конфигурация с std/oauth, така че посетителят може да влезе с Val Town акаунта, който вече притежава. Заменете това с каквото вашето приложение използва; частта на FastComments остава непроменена.
Създаване на полезния товар на сървъра
Тайната на API подписва полезния товар и никога не трябва да достигне до кода в браузъра. Инсталирайте SDK от npm, което работи директно в Deno средата на Val Town:
Run 
getPayload() връща { userDataJSONBase64, verificationHash, timestamp }. Тези три стойности са всичко, което достига до браузъра. Тайната ги подписва и след това се изхвърля, така че нищо в страницата не позволява на читателя да подправи различен потребител.
Предайте го на уиджета
Run 
oauthMiddleware добавя GET /auth/login, GET /auth/callback и POST /auth/logout за вас. Обърнете внимание, че изходът е POST, докато уиджетът навигира към logoutURL с GET, затова насочете logoutURL към малка ваша рута, която изпраща POST заявка.
Когато посетителят е излязъл, предайте sso само с loginURL. Уиджетът тогава показва прозорец за вход вместо анонимен кутия за коментари.
Неочаквани проблеми
timestamp е епоха в милисекунди, не трябва да бъде в бъдещето и не трябва да е по-стар от два дни. Генерирайте го на сървъра в същата заявка, която изчислява хеша. Генерирането му в браузъра е класическа грешка: стойността се различава от тази, която е била хеширана, и всеки коментар се отхвърля.
Никога не задавайте isAdmin или isModerator от доставчика на идентичност. Влизането с Val Town акаунт не казва нищо за това кой трябва да модерира вашия сайт.
Вижте ръководството за SSO за пълен списък на полетата, нишки с групово ограничение и значки.
Получаване на уебкуки 
A val е естествен получател на уебхук: има стабилен URL, може да проверява подпис и има вградено SQLite и съхранение на блобове.
FastComments подписва ${timestamp}.${body} с API тайната на вашия акаунт и изпраща две заглавки:
Run 
Методът носи събитието: PUT за създаден или актуализиран коментар, DELETE за изтрит.
Run 
Две неща, които късат
Проверете суровите байтове. Парсирането на JSON и повторното му сериализиране променя реда на ключовете и whitespace, така че хешът се различава и всяка доставка се проваля без очевидна причина. Това е обичайната причина уебхук получателят „просто не работи“.
Сравнявайте в константно време. Обикновен === върху подписа разкрива колко байта съвпадат, което е достатъчно за фалшифициране по един байт наведнъж.
Обработка на събития
Отговаряйте бързо. FastComments прави повторни опити при не‑2xx отговор, а крайна точка, която продължава да се проваля, в крайна сметка се изключва автоматично, затова извършвайте реалната работа след отговора, а не вмъкната.
Направете тази работа идемпотентна спрямо ID‑то на коментара. При повторен опит подписът се генерира отново с нов timestamp, а същото ID на коментара се получава отново при редактиране и изтриване, така че няма стабилна стойност за дедупликация.
Примерни стойности 
Четири публични vals, които можете да ремиксирате, всяка от тях обхваща една част от това ръководство.
Blog with comments (live) е Markdown блог с нишка под всяка публикация и общи броячи на коментари в индекса. Работи веднага след като го ремиксирате, а една променлива на средата го насочва към вашия собствен акаунт.
SSO demo (live) вписва посетителя с техния Val Town акаунт и предава тази идентичност на уиджета, така че няма второ влизане.
Webhook receiver (live) проверява HMAC подписа при всяка доставка и съхранява събития в SQLite. Има бутон, който подписва тестово натоварване и го изпраща към себе си, така че можете да видите проверката да успее преди да конфигурирате истински webhook.
Agent skills (live) е библиотека от FastComments агентски умения, обхващащи уиджета, SSO, REST API, модериране и миграция от Disqus. Ремиксирайте я и агентът на Val Town, Townie, автоматично взема уменията от skills/, така че вашият агент знае как да настрои коментарите без да копирате документацията в чата.
Същите умения се инсталират навсякъде другаде с npx skills add fastcomments/skills.
Грешки в домейна 
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.
Отидете тук, за да добавите вашия сайт към вашия акаунт.
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 персонализиран домейн 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.