इस प्रोजेक्ट के बारे में

grpc-web ब्राउज़र क्लाइंट के लिए gRPC का JavaScript कार्यान्वयन है, जिसे grpc/grpc-web रिपॉजिटरी के अंतर्गत बनाए रखा जाता है। चूंकि ब्राउज़र कच्चे HTTP/2 gRPC कनेक्शन नहीं खोल सकते, gRPC-web क्लाइंट एक विशेष प्रॉक्सी के माध्यम से gRPC सेवाओं से बात करते हैं; Envoy डिफ़ॉल्ट प्रॉक्सी है, और परियोजना gRPC-web Go प्रॉक्सी, Apache APISIX, और Nginx के gRPC मॉड्यूल के साथ अंतर-संचालन का दस्तावेजीकरण भी करती है। परियोजना दो मुख्य भाग भेजती है। पहला, npm पर `grpc-web` के रूप में प्रकाशित एक रनटाइम लाइब्रेरी, जो अब पूरी तरह से TypeScript में लिखी गई है और इसलिए प्रथम श्रेणी की प्रकार सुरक्षा, शून्य रनटाइम निर्भरताएं, और अंतर्निहित प्रकार परिभाषाएं प्रदान करती है। दूसरा, एक protoc प्लगइन, `protoc-gen-grpc-web`, जो `.proto` परिभाषाओं से क्लाइंट सेवा स्टब उत्पन्न करता है। जनरेशन आमतौर पर मानक `--js_out` प्लगइन (प्रोटोबफ संदेश वर्गों के लिए) को `--grpc-web_out` (सेवा स्टब के लिए) के साथ जोड़ता है, और इसे Browserify, Webpack, या Closure Compiler के साथ बंडल किया जा सकता है। समर्थित RPC मोड यूनरी कॉल और सर्वर-साइड स्ट्रीमिंग हैं। सर्वर-साइड स्ट्रीमिंग केवल `grpcwebtext` वायर प्रारूप मोड में उपलब्ध है, जहां पेलोड base64-एन्कोडेड होते हैं और `Content-Type: application/grpc-web-text` के साथ भेजे जाते हैं। एक बाइनरी मोड, `grpcweb`, बाइनरी प्रोटोबफ पेलोड के साथ `Content-Type: application/grpc-web+proto` का उपयोग करता है लेकिन केवल यूनरी कॉल का समर्थन करता है। क्लाइंट-साइड और द्विदिश स्ट्रीमिंग वर्तमान में समर्थित नहीं हैं। कोड जनरेशन कई आयात शैलियाँ प्रदान करता है: `closure` (डिफ़ॉल्ट, `goog.require()` का उपयोग करके), `commonjs` (`require()` का उपयोग करके), `commonjs+dts` (CommonJS स्टब प्लस एक `.d.ts` टाइपिंग फ़ाइल), और `typescript` (पूर्ण TypeScript आउटपुट)। `commonjs+dts` और `typescript` शैलियाँ केवल `--grpc-web_out` द्वारा समर्थित हैं, `--js_out` द्वारा नहीं। README में बाइनरी वायर प्रारूप के साथ TypeScript कोड उत्पन्न करने का एक ठोस उदाहरण शामिल है, जो एक TypeScript सेवा क्लाइंट, एक JavaScript प्रोटोबफ मॉड्यूल, और एक मिलान `.d.ts` परिभाषा फ़ाइल उत्पन्न करता है। क्लाइंट उपयोग सीधा है: प्रॉक्सी URL के साथ एक सेवा क्लाइंट को इंस्टैंशिएट करें, एक अनुरोध संदेश बनाएं, और वैकल्पिक मेटाडेटा और कॉलबैक के साथ RPC को कॉल करें। सर्वर-साइड स्ट्रीमिंग `data`, `status`, और `end` इवेंट के साथ एक स्ट्रीम ऑब्जेक्ट लौटाती है, साथ ही एक `cancel()` विधि भी। मिलीसेकंड में यूनिक्स टाइमस्टैम्प वाले `deadline` हेडर को पारित करके एक समय सीमा निर्धारित की जा सकती है। दो क्लाइंट शैलियाँ उपलब्ध हैं: कॉलबैक-आधारित क्लाइंट और Promise-आधारित क्लाइंट, हालांकि Promise संस्करण मेटाडेटा और स्थिति के लिए `.on(...)` कॉलबैक तक नहीं पहुंच सकता। प्रमाणीकरण और पुनर्प्रयास जैसी सुविधाओं के लिए कस्टम इंटरसेप्टर लागू और श्रृंखलाबद्ध किए जा सकते हैं। दो इंटरसेप्टर प्रकार मौजूद हैं: `UnaryInterceptor`, जो यूनरी RPC को इंटरसेप्ट करता है और केवल Promise क्लाइंट के साथ उपयोग किया जा सकता है, और `StreamInterceptor`, जो अधिक बहुमुखी है और नियमित क्लाइंट के साथ काम करता है। रिपॉजिटरी में एक Hello World उदाहरण शामिल है जो प्रोटोकॉल बफर के साथ एक सेवा को परिभाषित करने, Node.js gRPC सेवा को लागू करने, Envoy प्रॉक्सी को कॉन्फ़िगर करने, प्रोटोबफ क्लास और क्लाइंट स्टब उत्पन्न करने, और JS निर्भरताओं को एक स्थिर लाइब्रेरी में संकलित करने के माध्यम से चलता है। एक अधिक उन्नत Echo डेमो Docker Compose के साथ चलाया जा सकता है और स्ट्रीमिंग के परीक्षण के लिए एक ब्राउज़र पेज उजागर करता है। README पारिस्थितिकी तंत्र एकीकरण की ओर भी इशारा करता है, जिसमें gRPC-web समर्थन के साथ Armeria (JVM) और Tonic (Rust) सर्वर फ्रेमवर्क, और एक Vite संगतता डेमो शामिल है। एक रोडमैप दस्तावेज़ भविष्य के काम की रूपरेखा तैयार करता है, जिसमें Python, Java, और Node के लिए भाषा-विशिष्ट वेब फ्रेमवर्क समर्थन शामिल है।