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, buntext build से प्रीरेंडरिंगरिक्वेस्ट पर रेंडरिंग
vercel, cloudflaretext build से प्रीरेंडरिंगHTML पेज
staticHTML पेज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)

कॉन्फ़िगरेशन

पूरे ऐप का आकार बदलें, या फ़्रेम बंद करें:

text.config.tsts
import { defineConfig } from "@textjs/app";export default defineConfig({  ansi: { cols: 100, rows: 30 },  // ansi: false,});

पेज अपना आकार बदल सकता है, या टर्मिनल को भी HTML सर्व कर सकता है:

app/dashboard/page.tsxtsx
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 को उसी तरह एनकोड करता है जैसे फ़्रेमवर्क करता है।

GitHub पर यह पेज एडिट करें