
भाषा 🇮🇳 हिन्दी
Val Town इंस्टॉलेशन
पोल
Val Town ऐप्स में लाइव कमेंटिंग जोड़ें
Val Town Deno पर TypeScript चलाता है, इसलिए एक val एक वास्तविक सर्वर है। इससे यह FastComments के लिए उपयुक्त बनता है: विजेट पेज पर एक script टैग होता है, और जो कुछ भी सीक्रेट की आवश्यकता रखता है, जैसे Secure SSO या वेबहुक सत्यापित करना, वह उसी val में सर्वर-साइड पर चल सकता है।
यह गाइड एक HTTP val में कमेंट विजेट जोड़ना, इंडेक्स पेज पर कमेंट काउंट दिखाना, उपयोगकर्ताओं को उनके मौजूदा Val Town खाते से साइन इन कराना, और कमेंट वेबहुक प्राप्त करना शामिल करती है।
इसे आज़माने के लिए आपको खाते की आवश्यकता नहीं है। उदाहरण tenantId: "demo" का उपयोग करते हैं, जो एक साझा सैंडबॉक्स है, और चरण 2 में अपने स्वयं के पर स्विच करना बताया गया है।
चरण 1: विजेट जोड़ें 
विजेट एक स्क्रिप्ट टैग और एक कंटेनर एलिमेंट है, इसलिए यह आपके val द्वारा पहले से रेंडर की गई किसी भी चीज़ में आसानी से जुड़ जाता है। यह उदाहरण Hono JSX का उपयोग करता है, जो Val Town के HTTP टेम्पलेट्स द्वारा उपयोग किया जाने वाला है।
Run 
शिप करने से पहले एक urlId चुनें
urlId तय करता है कि कोई कमेंट किस थ्रेड में जाएगा। इसे अनसेट छोड़ने पर यह वर्तमान पेज URL के एक साफ़ किए गए संस्करण पर डिफ़ॉल्ट हो जाता है, जो Val Town पर बदलने वाली चीज़ है: सबडोमेन क्लेम करने तक एक val का लंबा *.web.val.run होस्टनाम रहता है, ब्रांचेस के अपने URL होते हैं, और पेज का नाम बदलने से पाथ बदल जाता है। हर विविधता चुपचाप एक अलग, खाली थ्रेड बन जाती है, और लक्षण ऐसा दिखता है जैसे "मेरे कमेंट्स गायब हो गए"।
इसे किसी स्थिर चीज़ पर सेट करें जिसे आप नियंत्रित करते हैं, जैसे पोस्ट स्लग या डेटाबेस id, जैसा ऊपर दिखाया गया है। url भी पास करें, ताकि नोटिफिकेशन ईमेल और मॉडरेशन टूल्स वास्तविक पेज से लिंक कर सकें।
JavaScript के बिना कमेंट्स बनाए रखना
FastComments पूरे थ्रेड को सर्वर-साइड रेंडर करता है, जिसे एक val <noscript> ब्लॉक में डाल सकता है:
Run 
पैरामीटर्स को URL-encode करें। सर्वर-साइड संस्करण एनोनिमस और लॉग-इन कमेंटिंग, SSO, और नेस्टेड रिप्लाईज़ को सपोर्ट करता है।
चरण 2: अपना खुद का खाता उपयोग करें 
tenantId: "demo" एक साझा सार्वजनिक सैंडबॉक्स है। यह बिना साइनअप के काम करता है, इसीलिए उदाहरण इसका उपयोग करते हैं, लेकिन FastComments आज़माने वाले सभी अन्य लोग उन्हीं थ्रेड्स में लिखते हैं और कोई भी उन्हें मॉडरेट कर सकता है। जिस चीज़ की आपको परवाह है, उसे प्रकाशित करने से पहले इसे बदल लें।
आपकी tenant ID API secret पेज पर मौजूद है।
Tenant ID सार्वजनिक होती है और ब्राउज़र कोड में रहनी चाहिए। API secret ऐसा नहीं है, और इस पेज पर किसी चीज़ को इसकी आवश्यकता नहीं है।
इसे एनवायरनमेंट वेरिएबल से पढ़ें
Val Town के वैल्स फ्री टियर पर सार्वजनिक होते हैं, इसलिए उनका सोर्स सबको दिखाई देता है। किसी भी संवेदनशील चीज़ को एनवायरनमेंट वेरिएबल में रखें और Deno.env.get से पढ़ें:
Run 
यह Val Town पर एक दूसरे कारण से भी आमतौर पर ज़रूरी से ज़्यादा मायने रखता है: किसी वैल को रीमिक्स करने पर एनवायरनमेंट वेरिएबल की कुंजियाँ कॉपी होती हैं, लेकिन उनके मान नहीं। एनवायरनमेंट वेरिएबल में रखा गया secret आपके वैल के साथ किसी और के अकाउंट में नहीं जाता। फ़ाइल में लिखा गया secret जाता है।
"demo" पर फ़ॉलबैक वैल को उन सभी के लिए काम करते रखता है जो अपनी tenant सेट करने से पहले इसे रीमिक्स करते हैं।
EU अकाउंट्स
एक अकाउंट, उसका डेटा और उसकी कुंजियाँ एक ही क्षेत्र में रहते हैं। यदि आपका अकाउंट eu.fastcomments.com पर बनाया गया था, तो हर विजेट कॉन्फ़िग में region: "eu" भी चाहिए, और स्क्रिप्ट्स cdn-eu.fastcomments.com से लोड होती हैं। अन्यथा दोनों को वैसे ही छोड़ दें।
इंडेक्स पेज पर कमेंट काउंट 
अनुक्रमणिका (index) पेज पर, प्रत्येक पंक्ति के लिए एक comment-count विजेट रेंडर न करें। इसका मतलब है प्रत्येक पोस्ट के लिए एक अनुरोध। बल्क काउंट का उपयोग करें, जो पूरे पेज के लिए एक ही अनुरोध लेता है।
प्रत्येक पंक्ति को उसके थ्रेड द्वारा उपयोग किए जाने वाले urlId से चिह्नित करें, फिर बल्क विजेट को एक बार लोड करें:
Run 
स्क्रिप्ट पेज पर हर .fast-comments-count एलिमेंट को ढूंढती है और उसमें उसकी गणना भरती है।
data-fast-comments-url-id को उस पोस्ट के कमेंट विजेट द्वारा उपयोग किए जाने वाले urlId से मेल खाना चाहिए। यदि विजेट स्लग का उपयोग करता है, तो मार्कर स्लग का उपयोग करता है। बेमेल होने पर ऐसे थ्रेड पर शून्य दिखाई देगा जिसमें टिप्पणियाँ मौजूद हैं।
स्क्रिप्ट window.FastCommentsBulkCountConfig के लिए पोलिंग करती है, इसलिए यह मायने नहीं रखता कि आपने कॉन्फ़िग को स्क्रिप्ट टैग से पहले या बाद में सेट किया है।
std/oauth के साथ सुरक्षित SSO 
यदि आपका val पहले से जानता है कि विज़िटर कौन है, तो Secure SSO उस पहचान को विजेट को सौंप देता है ताकि उन्हें दूसरा लॉगिन कभी न दिखे। बनाने के लिए कोई endpoints नहीं हैं और runtime पर कुछ भी कॉल करने की ज़रूरत नहीं है: आप तीन मान server-side पर compute करते हैं और उन्हें widget config में पास कर देते हैं।
Val Town std/oauth के साथ zero-config लॉगिन देता है, ताकि विज़िटर उसी Val Town खाते से साइन इन कर सके जो उनके पास पहले से है। इसे अपने ऐप द्वारा उपयोग किए जाने वाले किसी भी विकल्प से बदल दें; FastComments वाला हिस्सा नहीं बदलता।
Payload को server पर बनाएँ
API secret payload पर हस्ताक्षर करता है और इसे कभी भी browser कोड तक नहीं पहुँचना चाहिए। SDK को npm से इंस्टॉल करें, जो Val Town के Deno runtime पर as-is काम करता है:
Run 
getPayload() { userDataJSONBase64, verificationHash, timestamp } लौटाता है। यही तीन मान browser तक पहुँचते हैं। Secret इन पर हस्ताक्षर करता है और फिर हटा दिया जाता है, इसलिए पेज में कुछ भी ऐसा नहीं होता जिससे कोई पाठक किसी भिन्न उपयोगकर्ता का forge कर सके।
इसे विजेट को पास करें
Run 
oauthMiddleware आपके लिए GET /auth/login, GET /auth/callback और POST /auth/logout जोड़ देता है। ध्यान दें कि logout एक POST है, जबकि विजेट logoutURL पर GET के साथ नेविगेट करता है, इसलिए logoutURL को अपने द्वारा बनाए गए एक छोटे route की ओर इंगित करें जो वह POST सबमिट करता है।
जब विज़िटर लॉग आउट हो, तो केवल loginURL के साथ sso पास करें। तब विजेट एक अनाम comment बॉक्स के बजाय लॉगिन प्रॉम्प्ट दिखाता है।
जो चीज़ें गलत हो जाती हैं
timestamp epoch milliseconds में होना चाहिए, भविष्य में नहीं होना चाहिए, और दो दिन से अधिक पुराना नहीं होना चाहिए। इसे उसी request में server पर generate करें जो hash compute करती है। इसे browser में generate करना क्लासिक विफलता है: मान उससे भिन्न होता है जिस पर hash बना था और हर comment अस्वीकार कर दिया जाता है।
कभी भी identity provider से isAdmin या isModerator सेट न करें। Val Town खाते से साइन इन करने का इस बात से कोई लेना-देना नहीं है कि आपकी साइट कौन moderate करेगा।
पूरी field सूची, group-gated threads, और badges के लिए SSO गाइड देखें।
वेबहुक प्राप्त करना 
एक val एक स्वाभाविक webhook रिसीवर है: इसका एक स्थिर URL होता है, यह सिग्नेचर सत्यापित कर सकता है, और इसमें SQLite और blob storage इनबिल्ट होते हैं।
FastComments आपके खाते के API secret से ${timestamp}.${body} पर सिग्न करके दो हेडर भेजता है:
Run 
मेथड इवेंट को व्यक्त करता है: बनाए गए या अपडेट किए गए कमेंट के लिए PUT, और डिलीट किए गए कमेंट के लिए DELETE।
Run 
दो चीज़ें जो परेशान करती हैं
रॉ बाइट्स सत्यापित करें। JSON को पार्स करके दोबारा सीरियलाइज़ करने से key क्रम और व्हाइटस्पेस बदल जाता है, जिससे हैश अलग हो जाता है और हर डिलीवरी बिना स्पष्ट कारण के विफल हो जाती है। यही आम तौर पर वह कारण है जिससे webhook रिसीवर "बस काम नहीं करता"।
कॉन्स्टेंट टाइम में तुलना करें। सिग्नेचर पर साधारण === यह लीक कर देता है कि कितने बाइट्स मैच हुए, जो एक-एक बाइट करके फोर्ज करने के लिए पर्याप्त है।
इवेंट हैंडल करना
जल्दी जवाब दें। FastComments नॉन-2xx पर रिट्राई करता है, और लगातार विफल होने वाला एंडपॉइंट अंततः स्वचालित रूप से डिसेबल कर दिया जाता है, इसलिए असली काम जवाब देने के बाद करें, इनलाइन नहीं।
उस काम को कमेंट id पर idempotent बनाएं। रिट्राई एक नए टाइमस्टैम्प के साथ दोबारा सिग्न किया जाता है, और एडिट और डिलीट पर वही कमेंट id फिर से आता है, इसलिए डिडुप्लिकेट करने के लिए कुछ भी स्थिर नहीं होता।
उदाहरण Vals 
चार सार्वजनिक vals जिन्हें आप remix कर सकते हैं, जिनमें से प्रत्येक इस गाइड के एक हिस्से को कवर करता है।
Blog with comments (live) एक Markdown ब्लॉग है जिसमें हर पोस्ट के नीचे एक थ्रेड और इंडेक्स पर बल्क कमेंट काउंट हैं। यह remix करते ही काम करने लगता है, और एक environment variable इसे आपके अपने खाते से जोड़ देता है।
SSO demo (live) विज़िटर को उनके Val Town खाते से साइन इन करता है और उस पहचान को विजेट को सौंप देता है, ताकि दूसरा लॉगिन करने की ज़रूरत न पड़े।
Webhook receiver (live) हर डिलीवरी पर HMAC सिग्नेचर को सत्यापित करता है और इवेंट्स को SQLite में सहेजता है। इसमें एक बटन है जो एक टेस्ट पेलोड पर सिग्न करके उसे स्वयं को डिलीवर करता है, ताकि आप असली webhook कॉन्फ़िगर करने से पहले सत्यापन सफल होते देख सकें।
Agent skills (live) FastComments एजेंट स्किल्स की एक लाइब्रेरी है जो विजेट, SSO, REST API, मॉडरेशन, और Disqus से माइग्रेशन को कवर करती है। इसे remix करें और Val Town का एजेंट, Townie, skills/ से स्किल्स को स्वतः उठा लेता है, ताकि आपका एजेंट बिना डॉक्यूमेंटेशन चैट में पेस्ट किए कमेंट्स सेट अप करना जानता हो।
वही स्किल्स कहीं और भी npx skills add fastcomments/skills के साथ इंस्टॉल हो जाती हैं।
डोमेन त्रुटियाँ 
demo टेनेंट बंद करने के बाद, विजेट एक अधिकृति (authorization) त्रुटि के साथ लोड होने से इनकार कर सकता है। ऐसा इसलिए है क्योंकि FastComments को नहीं पता होता कि उसे आपके खाते को उस डोमेन पर उपयोग करने की अनुमति देनी है।
अपनी साइट को अपने खाते में जोड़ने के लिए यहाँ जाएँ।
Val Town यहाँ एक बार फिर देखने लायक है, क्योंकि एक val एक से अधिक होस्टनेम पर पहुँचा जा सकता है:
- हर HTTP val का एक लंबा डिफ़ॉल्ट एंडपॉइंट होता है,
<org>--<id>.web.val.run। - कस्टम सबडोमेन का दावा करने पर
<name>.val.runजुड़ता है। - एक कस्टम डोमेन तीसरा जोड़ता है।
- ब्रांच (branches) के अपने अलग URL होते हैं।
जिन होस्टनेम से आप वास्तव में विजेट सर्व करते हैं, उन सभी को जोड़ें। यदि आप सब कुछ सेट अप करने के बाद कोई सबडोमेन का दावा करते हैं, तो उसे भी जोड़ें, अन्यथा विजेट पुराने URL पर काम करेगा और नए पर विफल होगा।
अपने Val Town ऐप में पोल जोड़ें 
FastComments आपके Val Town ऐप में एक बार जुड़ जाने के बाद, आप कमेंट्स के भीतर ही लाइव पोल भी चला सकते हैं। अपनी विजेट कस्टमाइज़ेशन सेटिंग्स में Enable Polls चालू करें और कमेंट टूलबार में एक पोल बटन दिखाई देने लगता है। पोल में 2 से 10 विकल्प हो सकते हैं, परिणाम पेज पर मौजूद सभी के लिए लाइव अपडेट होते हैं, और आप तय करते हैं कि कौन पोल बना सकता है और क्या वोट करने के लिए लॉग इन ज़रूरी है। Val Town पर इसके अलावा कुछ और इंस्टॉल करने की आवश्यकता नहीं है।
लाइव पोल्स डेमो आज़माएँ या उन्हें सेट अप करने के लिए पोल्स दस्तावेज़ीकरण पढ़ें।