curl and Terminal Clients
curl, Wget, HTTPie and xh get a page's first frame as truecolor ANSI text. Configure its size or turn it off.
टर्मिनल HTTP क्लाइंट को HTML डॉक्यूमेंट की जगह पेज का पहला फ़्रेम ट्रूकलर ANSI टेक्स्ट के रूप में मिलता है। आपको कुछ भी कॉन्फ़िगर करने की ज़रूरत नहीं है।
curl https://my-app.example.com/aboutफ़्रेम पाने वाले रिक्वेस्ट
किसी रिक्वेस्ट को फ़्रेम तब मिलता है जब ये सभी शर्तें पूरी हों:
- मेथड
GETयाHEADहो; User-Agentकी शुरुआतcurl/,Wget/,wget2/,HTTPie/याxh/से हो;Acceptहेडर मौजूद न हो या उसमेंtext/htmlका ज़िक्र न हो।
ब्राउज़र, क्रॉलर और लिंक प्रीव्यू को HTML पेज मिलता है। curl से HTML पाने के लिए, इसकी मांग करें:
curl -H 'Accept: text/html' https://my-app.example.com/aboutफ़्रेम उस बिंदु पर चुना जाता है जहां पेज सर्व होता: मिडलवेयर, rewrites और रूट हैंडलर के बाद, और उन फ़ाइलों या पाथ के लिए कभी नहीं जिनके आख़िरी हिस्से में डॉट हो। मिडलवेयर रीडायरेक्ट, 401 रिस्पॉन्स, हेडर और रीड़राइट curl पर वैसे ही लागू होते हैं जैसे ब्राउज़र पर। /api/health अब भी अपना हैंडलर चलाता है और /robots.txt अब भी फ़ाइल सर्व करता है।
फ़्रेम की सामग्री
फ़्रेम पेज का पहला रेंडर है, जैसा प्रीरेंडरिंग वाले शेल में होता है: हर <Suspense> बाउंड्री जो अब भी इंतज़ार कर रही है, अपना फ़ॉलबैक दिखाती है। एसिंक सर्वर कंपोनेंट नहीं चलते और fetch() कभी रिज़ॉल्व नहीं होता, इसलिए इफ़ेक्ट में लोड होने वाला डेटा अपनी लोडिंग स्थिति में रहता है।
- आकार: 80 × 24 सेल। तय व्यूपोर्ट (
viewport.responsive: false) वाला ऐप इसके बजायviewport.width × viewport.heightइस्तेमाल करता है। - रंग: ऐप की
viewport.themeमें 24-बिट SGR एस्केप कोड। हर पंक्ति के अंत में रीसेट होता है, और फ़्रेम के अंत में न्यूलाइन होती है। - स्टेटस:
200, या जब कोई पेज मैच न करे या पेजnotFound()कॉल करे, तो ऐप के not-found पेज के साथ404। रेंडरिंग के दौरानredirect()कॉल करने वाला पेज HTML सर्व करता है।
रिस्पॉन्स text/plain; charset=utf-8 होते हैं और उनके साथ Vary: User-Agent, Accept और Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate होते हैं, इसलिए शेयर किए गए कैश कभी फ़्रेम स्टोर करके उसे ब्राउज़र को सर्व नहीं करते। जिस पाथ पर curl को फ़्रेम मिलता है, वहां के HTML पेज में वही Vary हेडर होता है।
समर्थित होस्ट
| होस्ट | स्टैटिक पेज | डायनैमिक पेज, अज्ञात पाथ |
|---|---|---|
text dev | रिक्वेस्ट पर रेंडरिंग | रिक्वेस्ट पर रेंडरिंग |
text start, bun | text build से प्रीरेंडरिंग | रिक्वेस्ट पर रेंडरिंग |
vercel, cloudflare | text build से प्रीरेंडरिंग | HTML पेज |
static | HTML पेज | HTML पेज |
सर्वर पर रेंडर किए गए पेजों के लिए text start या bun चाहिए (डिप्लॉय करना देखें)।
स्टैटिक होस्ट अलग-अलग क्लाइंट को अलग जवाब नहीं दे सकते, इसलिए static अडैप्टर फ़्रेम सपोर्ट नहीं करता। Vercel और Cloudflare पर स्टैटिक पेजों के फ़्रेम बिल्ड के साथ आते हैं। वहां डायनैमिक पेज ([id], force-dynamic) HTML सर्व करते हैं, क्योंकि vercel और cloudflare अडैप्टर रेंडरर डिप्लॉय नहीं करते।
text start और bun dist/server.js कमांड बाकी पेजों को रिक्वेस्ट पर .text/server/live.mjs से रेंडर करते हैं, और पिछले 128 फ़्रेम 10 सेकंड तक रखते हैं। हर सर्वर प्रति 10 सेकंड में ज़्यादा से ज़्यादा 20 ऐसे पेज रेंडर करता है जो कैश में नहीं हैं। इसके बाद, बजट फिर से भरने तक curl को HTML पेज मिलता है। अगर सर्वर पर live.mjs लोड नहीं हो सकता, उदाहरण के लिए किसी पेज मॉड्यूल के टॉप लेवल पर window पढ़ने के कारण, तो वे पेज HTML सर्व करते हैं।
text build कमांड प्रीरेंडरिंग किए गए फ़्रेम की रिपोर्ट देता है:
✓ Prerendering curl frames (5/5)कॉन्फ़िगरेशन
पूरे ऐप का आकार बदलें, या फ़्रेम बंद करें:
import { defineConfig } from "@textjs/app";export default defineConfig({ ansi: { cols: 100, rows: 30 }, // ansi: false,});पेज अपना आकार बदल सकता है, या टर्मिनल को भी HTML सर्व कर सकता है:
export const ansi = { cols: 120, rows: 40 };// export const ansi = false;आकार 1–500 सेल की सीमा में रखे जाते हैं। text.config.ts फ़ाइल में ansi: false होने पर पेज एक्सपोर्ट नज़रअंदाज़ होते हैं।
सादा HTTP
जब तक आप -L पास नहीं करते, curl रीडायरेक्ट फ़ॉलो नहीं करता। Vercel http:// रिक्वेस्ट को https:// पर रीडायरेक्ट करता है, और हमेशा HTTPS इस्तेमाल करें चालू होने पर Cloudflare भी ऐसा करता है, इसलिए curl http://… फ़्रेम की जगह रीडायरेक्ट प्रिंट करता है। https:// URL शेयर करें।
कस्टम सर्वर
@textjs/app/ansi उन सर्वर और फ़ंक्शन के लिए डिटेक्शन और रिस्पॉन्स हेल्पर एक्सपोर्ट करता है जो text start या कोई अडैप्टर नहीं चलाते:
import { ansiResponse, wantsAnsi } from "@textjs/app/ansi";import { frameToAnsi } from "@textjs/react";if (wantsAnsi(request)) return ansiResponse(frameToAnsi(buffer, { theme: "geistDark" }), request.method);wantsAnsi(request) फ़ंक्शन Web Headers या Node के IncomingHttpHeaders के साथ (method, headers) भी स्वीकार करता है। frameToAnsi(buffer, { theme }) फ़ंक्शन रेंडर किए गए CellBuffer को उसी तरह एनकोड करता है जैसे फ़्रेमवर्क करता है।