منصوبے کے بارے میں

grpc-web براؤزر کلائنٹس کے لیے جاوا اسکرپٹ کی تنصیب ہے، جو grpc/grpc-web ریپوزیٹری کے تحت برقرار ہے۔ کیونکہ براؤزرز کھلی HTTP/2 gRPC کنکشنز نہیں کھول سکتے، gRPC-web کلائنٹس gRPC خدمات سے ایک خصوصی پراکسی کے ذریعے بات چیت کرتے ہیں۔ Envoy ڈیفالٹ پراکسی ہے، اور منصوبہ gRPC-web Go پراکسی، Apache APISIX، اور Nginx کے gRPC ماڈیول کے ساتھ بین الاقوامی تعاون کی دستاویزات بھی فراہم کرتا ہے۔ منصوبہ دو اہم حصے فراہم کرتا ہے۔ پہلا، ایک رن ٹائم لائبریری جو npm پر `grpc-web` کے نام سے شائع کی گئی ہے، جو اب مکمل طور پر ٹائپ اسکرپٹ میں لکھی گئی ہے اور اس لیے پہلی کلاس ٹائپ سیفٹی، زیرو رن ٹائم منحصریتوں، اور بلٹ ان ٹائپ کی تعریفیں فراہم کرتی ہے۔ دوسرا، ایک protoc پلاگ ان، `protoc-gen-grpc-web`، جو `.proto` تعریفیں سے کلائنٹ سروس اسٹبس جنریٹ کرتا ہے۔ جنریشن عام طور پر معیاری `--js_out` پلاگ ان (پروٹو بف میسج کلاسز کے لیے) کو `--grpc-web_out` (سروس اسٹب کے لیے) کے ساتھ جوڑتا ہے، اور Browserify، Webpack، یا Closure Compiler کے ساتھ بنڈل کیا جا سکتا ہے۔ سپورٹڈ RPC موڈز یونری کالز اور سرور سائڈ اسٹریمنگ ہیں۔ سرور سائڈ اسٹریمنگ صرف `grpcwebtext` وائر فارمیٹ موڈ میں دستیاب ہے، جہاں پی لوڈز بیس64-انکودڈ ہوتے ہیں اور `Content-Type: application/grpc-web-text` کے ساتھ بھیجے جاتے ہیں۔ ایک بائنری موڈ، `grpcweb`، بائنری پروٹو بف پی لوڈز کے ساتھ `Content-Type: application/grpc-web+proto` استعمال کرتا ہے لیکن صرف یونری کالز کی سپورٹ کرتا ہے۔ کلائنٹ سائڈ اور دو طرفہ اسٹریمنگ فی الحال سپورٹڈ نہیں ہیں۔ کوڈ جنریشن کئی امپورٹ اسٹائلز کی پیشکش کرتا ہے: `closure` (ڈیفالٹ، `goog.require()` کا استعمال کرتے ہوئے)، `commonjs` (جہاں `require()` کا استعمال ہوتا ہے)، `commonjs+dts` (کومن جے ایس اسٹبس پلس ایک `.d.ts` ٹائپنگز فائل)، اور `typescript` (پوری ٹائپ اسکرپٹ آؤٹ پٹ)۔ `commonjs+dts` اور `typescript` اسٹائلز کی سپورٹ صرف `--grpc-web_out` کے ذریعے کی جاتی ہے، `--js_out` کے ذریعے نہیں۔ README میں بائنری وائر فارمیٹ کے ساتھ ٹائپ اسکرپٹ کوڈ جنریٹ کرنے کا ایک konkret مثال شامل ہے، جو ایک ٹائپ اسکرپٹ سروس کلائنٹ، ایک جاوا اسکرپٹ پروٹو بف ماڈیول، اور ایک میچنگ `.d.ts` تعریفی فائل تیار کرتا ہے۔ کلائنٹ استعمال آسان ہے: ایک سروس کلائنٹ کو پراکسی یو آر ایل کے ساتھ انسٹینشیٹ کریں، ایک درخواست پیغام بنائیں، اور اختیاری میٹا ڈیٹا اور کال بیک کے ساتھ RPC کو کال کریں۔ سرور سائڈ اسٹریمنگ ایک اسٹریم آبجیکٹ کو واپس کرتا ہے جس میں `data`، `status`، اور `end` ایونٹس ہوتے ہیں، پلس ایک `cancel()` میتھڈ۔ ایک ڈیڈ لائن کو ایک `deadline` ہیڈر کو پاس کرکے سیٹ کیا جا سکتا ہے جس میں ایک یونکس ٹائم اسٹیمپ ہوتا ہے۔ دو کلائنٹ اسٹائلز دستیاب ہیں: کال بیک بیسڈ کلائنٹس اور پرومیز بیسڈ کلائنٹس، حالانکہ پرومیز ویریئنٹ میٹا ڈیٹا اور اسٹیٹس کے لیے `.on(...)` کال بیک تک رسائی حاصل نہیں کر سکتا۔ کسٹم انٹر سیپٹرز کو لاگو کیا جا سکتا ہے اور ان کی خصوصیات جیسے کہ اثباتی اور ریٹرائیز کے لیے چین کی جا سکتی ہیں۔ دو انٹر سیپٹر ٹائپس موجود ہیں: `UnaryInterceptor`، جو یونری RPCs کو انٹر سیپٹ کرتا ہے اور صرف پرومیز کلائنٹس کے ساتھ استعمال کیا جا سکتا ہے، اور `StreamInterceptor`، جو زیادہ لچکدار ہے اور ریگولر کلائنٹس کے ساتھ کام کرتا ہے۔ ریپوزیٹری میں ایک ہیلو ورلڈ مثال شامل ہے جو پروٹو کول سے سروس کی تعریف، ایک Node.js gRPC سروس کی имплементیشن، Envoy پراکسی کی تشکیل، پروٹو بف کلاسز اور کلائنٹ اسٹبس کی جنریشن، اور JS ڈپنڈنسیز کو ایک سٹیٹک لائبریری میں کمپائل کرنے کے ذریعے چلتی ہے۔ ایک زیادہ ترقی یافتہ ایکو ڈیمو کو ڈاکر کمپوز کے ساتھ چلایا جا سکتا ہے اور اسٹریمنگ کے لیے ایک براؤزر پیج کو ایکسپوز کرتا ہے۔ README بھی ایکو سسٹم انٹیگریشنز کی طرف اشارہ کرتا ہے، بشمول Armeria (JVM) اور Tonic (Rust) سرور فریم ورکس جو gRPC-web کی سپورٹ کرتے ہیں، اور ایک Vite کمپٹیبلٹی ڈیمو۔ ایک روڈ میپ ڈاکومنٹ مستقبل کے کام کی وضاحت کرتا ہے، بشمول پائٹھون، جاوا، اور Node کے لیے زبان-خصوصی ویب فریم ورکس کی سپورٹ۔