ब्राउज़र और वेब सर्वर के लिए नया RPC सिस्टम Cap'n Web
(blog.cloudflare.com)- Cap'n Web एक TypeScript में इम्प्लीमेंट किया गया नया RPC प्रोटोकॉल है, जो वेब वातावरण के लिए ऑप्टिमाइज़ किया गया है और विभिन्न JavaScript runtimes में काम करता है
- यह schema या झंझटीले boilerplate के बिना JSON-आधारित serialization और इंसानों के पढ़ने योग्य data format प्रदान करता है
- object-capability आधारित मॉडल के जरिए bidirectional calls, function·object references पास करना, promise pipelining, और security patterns को इम्प्लीमेंट करना संभव है
- यह WebSocket, HTTP, postMessage जैसे विभिन्न नेटवर्क वातावरणों को सपोर्ट करता है और 10kB से कम आकार का lightweight open source है
- यह केवल GraphQL जैसे waterfall problem को हल नहीं करता, बल्कि सामान्य JavaScript API जैसी natural RPC modeling भी संभव बनाता है
Cap'n Web क्या है
- Cap'n Web Cloudflare द्वारा विकसित TypeScript-आधारित open source RPC (protocol) system है
- यह Cap'n Proto से प्रेरित है, लेकिन अलग से schema definition के बिना काम करता है और JSON का उपयोग करने वाला human-friendly serialization अपनाता है
- यह TypeScript के साथ इंटीग्रेट होता है, जिससे autocomplete, type check आदि के जरिए developer experience बेहतर होता है, जबकि runtime type validation को अलग से (जैसे type guard) संभाला जा सकता है
- यह HTTP, WebSocket, postMessage जैसे network protocols को सपोर्ट करता है और प्रमुख browsers, Cloudflare Workers, Node.js आदि पर चलता है
- dependency-free lightweight structure के साथ यह minify + gzip के बाद 10kB से कम आकार में उपलब्ध है
Cap'n Web का object-capability model (OCap)
- यह object-capability (OCap) आधारित मॉडल अपनाता है, जिससे पारंपरिक RPC systems की तुलना में कहीं अधिक अभिव्यक्ति संभव होती है
- bidirectional calls: client और server एक-दूसरे के functions को कॉल कर सकते हैं
- function·object reference passing: किसी function या object को RPC के जरिए पास करने पर, सामने वाला एक stub पाता है और उसे कॉल करने पर वह मूल स्थान पर execute होता है
- Promise Pipelining: कई RPC calls को chain में जोड़ने पर उन्हें एक ही network round-trip में प्रोसेस किया जा सकता है
- security patterns: authorization और session management जैसे security controls को स्वाभाविक रूप से इम्प्लीमेंट किया जा सकता है
बुनियादी उपयोग
-
client example
import { newWebSocketRpcSession } from "capnweb" let api = newWebSocketRpcSession("wss://example.com/api") let result = await api.hello("World") console.log(result) -
server example (Cloudflare Worker आधारित)
import { RpcTarget, newWorkersRpcResponse } from "capnweb" class MyApiServer extends RpcTarget { hello(name) { return `Hello, ${name}!` } } export default { fetch(request, env, ctx) { let url = new URL(request.url) if (url.pathname === "/api") { return newWorkersRpcResponse(request, new MyApiServer()) } return new Response("Not found", {status: 404}) } } -
API में methods जोड़ना, client की callback function पास करना, और TypeScript interface को define व apply करना आसानी से किया जा सकता है
RPC क्या है, और Cap'n Web में इसकी खासियतें
- RPC(Remote Procedure Call) एक ऐसा कॉन्सेप्ट है, जिसमें नेटवर्क पर मौजूद दो प्रोग्राम आपस में ऐसे communicate कर सकते हैं जैसे वे function calls कर रहे हों
- पारंपरिक HTTP/REST protocols से अलग, RPC function call abstraction के जरिए ऐसा code लिखने देता है जो developer की सोच के अधिक करीब हो
- Cap'n Web async/await, Promise, Exception support आदि के साथ आधुनिक JavaScript flow में अच्छी तरह फिट बैठता है
- RPC से जुड़ी ऐतिहासिक बहसों (synchronous calls, network errors) के विपरीत, आधुनिक JS environment में इसका उपयोग अधिक सुरक्षित और कुशल तरीके से किया जा सकता है
Cap'n Web के उपयोग के परिदृश्य
- यह उन सभी environments में उपयोगी है जहाँ दो JavaScript applications के बीच network communication की आवश्यकता हो
- client-server, microservices के बीच calls आदि
- खासकर real-time collaboration web apps और जटिल security boundaries को पार करने वाली interactions के लिए उपयुक्त है
- यह अभी experimental stage में है, इसलिए नई तकनीकों को अपनाने के लिए खुले developers के लिए अधिक उपयोगी हो सकता है
विभिन्न फीचर्स
HTTP batch mode
-
जब लगातार connection की आवश्यकता न हो, तब HTTP batch mode में कई RPC calls को एक साथ बाँधकर प्रोसेस किया जा सकता है
import { newHttpBatchRpcSession } from "capnweb" let batch = newHttpBatchRpcSession("https://example.com/api") let result = await batch.hello("World") console.log(result) -
एक ही batch के भीतर कई calls को साथ में execute कर, results को parallel में प्राप्त किया जा सकता है
let promise1 = batch.hello("Alice") let promise2 = batch.hello("Bob") let [result1, result2] = await Promise.all([promise1, promise2])
Promise Pipelining (chain calls)
-
पिछले call के result का इंतज़ार किए बिना, उस result को सीधे अगले call के argument के रूप में उपयोग करने का समर्थन है
-
उदाहरण)
getMyName()के result Promise को सीधेhello()में पास करके एक ही network round-trip में प्रोसेस किया जा सकता हैlet namePromise = batch.getMyName() let result = await batch.hello(namePromise) -
Cap'n Web का Promise एक proxy object की तरह काम करता है, जिससे अतिरिक्त method calls भी बिना देरी के chain में प्रोसेस हो सकते हैं
let sessionPromise = batch.authenticate(apiKey) let name = await sessionPromise.whoami()
सुरक्षा: authentication और object-capability
authenticatemethod के जरिए सफलता पर एक permission (session) object दिया जाता है, जिसके बाद अतिरिक्त authentication steps के बिना features को कॉल किया जा सकता है- पारंपरिक RPC से अलग, session object को forge नहीं किया जा सकता, और authentication के बिना permission-आधारित methods तक पहुँचना संभव नहीं है
- यह WebSocket की संरचनात्मक सीमाओं को स्वाभाविक रूप से पार करता है और authentication logic की consistency सुनिश्चित करता है
- TypeScript में API interface declare करने पर, इसे client~server पर अपने-आप लागू किया जा सकता है, जिससे autocomplete और type safety मिलती है
GraphQL से तुलना और Cap'n Web की अलग पहचान
-
GraphQL REST की waterfall problem को कम करता है, लेकिन इसके लिए नई language·schema·toolchain अपनानी पड़ती है
-
Cap'n Web केवल JavaScript code के जरिए waterfall problem को हल करता है,
- promise pipelining/object references के support से nested calls या complex transaction logic को स्वाभाविक रूप से model किया जा सकता है
let user = api.createUser({ name: "Alice" }) let friendRequest = await user.sendFriendRequest("Bob") -
GraphQL की complexity और learning/management cost के बिना, इसे JavaScript API की तरह इस्तेमाल किया जा सकता है
array operations (array.map आदि) और optimization
-
Cap'n Web में array के प्रत्येक element पर अतिरिक्त network round-trip के बिना map operation संभव है
-
mapcallback function को client पर एक बार चलाकर operation की सामग्री record-replay की जाती है, फिर उसे server पर भेजकर server-side पर bulk processing की जाती हैlet friendsWithPhotos = friendsPromise.map(friend => { return {friend, photo: api.getUserPhoto(friend.id)} }) let results = await friendsWithPhotos -
सीमित domain-specific language (DSL) के जरिए इसे JavaScript function जैसा व्यक्त किया जाता है, लेकिन वास्तव में Cap'n Web protocol का उपयोग करके multiple calls को optimize किया जाता है
आंतरिक protocol structure और communication flow
- JSON + विशेष preprocessing के जरिए structured data transfer किया जाता है, और arrays, dates जैसे विशेष types का support मिलता है
- symmetric protocol होने के कारण client-server का भेद बिना bidirectional communication संभव है
- प्रत्येक party (उदाहरण: Alice और Bob) export/import tables को मैनेज करती है और object·function references को ID के आधार पर अलग करती है
- push/pull messages और Promise ID allocation आदि के जरिए, एक ही round trip में कई calls को शामिल किया जा सकता है
मौजूदा स्थिति और उपयोग के उदाहरण
- Cap'n Web अभी भी experimental open source है, और Cloudflare Wrangler के remote bindings जैसे वास्तविक services में उपयोग किया जा रहा है
- आगे और blog posts तथा विभिन्न frontend experiments की योजना है
- यह MIT license के तहत जारी है, इसलिए कोई भी इसे स्वतंत्र रूप से अपना सकता है
- GitHub repository पर जाएँ
अभी कोई टिप्पणी नहीं है.