Tarayıcılar ve web sunucuları için yeni bir RPC sistemi: Cap'n Web
(blog.cloudflare.com)- Cap'n Web, TypeScript ile geliştirilmiş yeni bir RPC protokolü olup web ortamına optimize edilmiştir ve çeşitli JavaScript çalışma zamanlarında çalışır
- Şema veya zahmetli boilerplate olmadan, JSON tabanlı serileştirme ve insan tarafından okunabilir veri biçimi sunar
- Nesne-yetki tabanlı model sayesinde çift yönlü çağrılar, fonksiyon·nesne referansı aktarımı, promise pipelining ve güvenlik desenleri uygulanabilir
- WebSocket, HTTP, postMessage gibi çeşitli ağ ortamlarını destekler ve 10kB'nin altında hafif bir açık kaynak projedir
- Yalnızca GraphQL'e benzer waterfall sorununu çözmekle kalmaz, aynı zamanda sıradan JavaScript API'leri gibi doğal RPC modellemesine olanak tanır
Cap'n Web nedir
- Cap'n Web, Cloudflare tarafından geliştirilen TypeScript tabanlı açık kaynak bir RPC (protocol) sistemidir
- Cap'n Proto'dan ilham almıştır ancak ayrı bir şema tanımı olmadan çalışır ve JSON kullanan insan dostu serileştirme yaklaşımını benimser
- TypeScript ile entegre çalışarak otomatik tamamlama, tip kontrolü gibi geliştirici deneyimini iyileştirir; çalışma zamanı tip doğrulaması ise ayrıca (
type guardvb.) ele alınabilir - HTTP, WebSocket, postMessage gibi ağ protokollerini destekler ve başlıca tarayıcılarda, Cloudflare Workers ve Node.js üzerinde çalışır
- Bağımlılığı olmayan hafif yapısıyla minify + gzip sonrasında 10kB'den küçük boyutta sunulur
Cap'n Web'in nesne-yetki tabanlı modeli (OCap)
- Nesne-yetki (object-capability) tabanlı model benimsenerek, geleneksel RPC sistemlerinden daha zengin ifade imkanı sunulur
- Çift yönlü çağrılar: İstemci ve sunucu birbirlerinin fonksiyonlarını çağırabilir
- Fonksiyon·nesne referansı aktarımı: Bir fonksiyon veya nesne RPC ile gönderildiğinde, karşı taraf bir stub alır ve çağrı sırasında asıl bulunduğu yerde çalıştırır
- Promise Pipelining: Birden fazla RPC zincir halinde bağlandığında tek bir ağ gidiş-dönüşüyle işlenir
- Güvenlik desenleri: Yetkilendirme ve oturum yönetimi gibi güvenlik kontrolleri doğal şekilde uygulanabilir
Temel kullanım
-
İstemci örneği
import { newWebSocketRpcSession } from "capnweb" let api = newWebSocketRpcSession("wss://example.com/api") let result = await api.hello("World") console.log(result) -
Sunucu örneği (Cloudflare Worker tabanlı)
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'ye metot eklemek, istemcinin callback fonksiyonlarını aktarmak, TypeScript arayüzlerini tanımlamak ve uygulamak kolaydır
RPC nedir ve Cap'n Web'deki özellikleri nelerdir
- RPC (Remote Procedure Call), ağ üzerindeki iki programın sanki fonksiyon çağrısı yapıyormuş gibi iletişim kurmasını sağlayan bir kavramdır
- Geleneksel HTTP/REST protokollerinden farklı olarak RPC, fonksiyon çağrısı soyutlamasıyla geliştiricinin düşünme biçimiyle uyumlu kod yazılmasına olanak tanır
- Cap'n Web, async/await, Promise, Exception desteği gibi modern JavaScript akışlarıyla iyi uyum sağlar
- RPC'nin tarihsel tartışmalarının (senkron çağrılar, ağ hataları) aksine, modern JS ortamlarında daha güvenli ve verimli kullanım mümkündür
Cap'n Web kullanım senaryoları
- İki JavaScript uygulaması arasında ağ iletişimi gereken her ortamda kullanılabilir
- İstemci-sunucu, mikroservisler arası çağrılar vb.
- Özellikle gerçek zamanlı iş birliği web uygulamaları ve karmaşık güvenlik sınırlarını aşan etkileşimler için uygundur
- Deneysel aşamada olduğundan, yeni teknolojileri benimsemeye açık geliştiriciler için daha faydalı olabilir
Çeşitli özellikler
HTTP batch modu
-
Kalıcı bağlantının gerekli olmadığı durumlarda HTTP batch modu ile birden fazla RPC çağrısı tek seferde gruplanıp işlenebilir
import { newHttpBatchRpcSession } from "capnweb" let batch = newHttpBatchRpcSession("https://example.com/api") let result = await batch.hello("World") console.log(result) -
Tek bir batch içinde birden fazla çağrı eşzamanlı yürütülebilir ve sonuçlar paralel olarak alınabilir
let promise1 = batch.hello("Alice") let promise2 = batch.hello("Bob") let [result1, result2] = await Promise.all([promise1, promise2])
Promise Pipelining (zincir çağrılar)
-
Önceki çağrının sonucunu beklemeden, sonucu doğrudan bir sonraki çağrının argümanı olarak kullanma yöntemi desteklenir
-
Örnek)
getMyName()sonucundaki Promise'i doğrudanhello()içine aktararak tek bir ağ gidiş-dönüşüyle işlem yapılırlet namePromise = batch.getMyName() let result = await batch.hello(namePromise) -
Cap'n Web'in Promise yapısı bir proxy nesnesi gibi davranır; ek metot çağrıları da bekleme olmadan zincirlenebilir
let sessionPromise = batch.authenticate(apiKey) let name = await sessionPromise.whoami()
Güvenlik: kimlik doğrulama ve nesne-yetki
authenticatemetodu üzerinden başarılı olursa yetki (oturum) nesnesi atanır; sonrasında ek kimlik doğrulama adımı olmadan fonksiyonlar çağrılabilir- Geleneksel RPC'den farklı olarak oturum nesnesi taklit edilemez ve kimlik doğrulama olmadan yetki gerektiren metotlara erişilemez
- WebSocket'in yapısal sınırlamalarını doğal biçimde aşar ve kimlik doğrulama mantığının tutarlılığını korur
- API arayüzü TypeScript ile tanımlandığında istemci ile sunucu arasında otomatik uygulanabilir; otomatik tamamlama ve tip güvenliği sağlar
GraphQL ile karşılaştırma ve Cap'n Web'in farkı
-
GraphQL, REST'in waterfall (çok aşamalı çağrı) sorununu hafifletir ancak yeni bir dil·şema·toolchain kullanımını gerektirir
-
Cap'n Web ise yalnızca JavaScript koduyla waterfall sorununu çözer ve
- promise pipelining/nesne referansları desteği sayesinde iç içe çağrılar veya karmaşık işlem mantıkları doğal şekilde modellenebilir
let user = api.createUser({ name: "Alice" }) let friendRequest = await user.sendFriendRequest("Bob") -
GraphQL'in karmaşıklığı ve öğrenme·yönetim maliyeti olmadan, JavaScript API'lerine benzer şekilde kullanılabilir
Dizi işlemleri (array.map vb.) ve optimizasyon
-
Cap'n Web'de dizinin her bir öğesi için ek ağ gidiş-dönüşü olmadan
mapişlemi yapılabilir -
mapcallback fonksiyonu istemcide bir kez çalıştırılarak işlem içeriği kaydedilir (record-replay), ardından sunucuya gönderilip sunucu tarafında toplu işlenirlet friendsWithPhotos = friendsPromise.map(friend => { return {friend, photo: api.getUserPhoto(friend.id)} }) let results = await friendsWithPhotos -
Sınırlı bir alan-özgü dil (DSL) aracılığıyla JavaScript fonksiyonu gibi ifade edilir, ancak gerçekte çoklu çağrılar Cap'n Web protokolüyle optimize edilerek işlenir
Dahili protokol yapısı ve iletişim akışı
- JSON + özel ön işleme ile yapılandırılmış veri aktarımı yapılır; diziler, tarihler gibi özel tipler desteklenir
- Simetrik bir protokol olduğundan istemci-sunucu ayrımı olmaksızın çift yönlü iletişim mümkündür
- Her taraf (ör. Alice ve Bob) export/import tablolarını yönetir ve nesne·fonksiyon referanslarını ID'lerle ayırt eder
- push/pull mesajları ve Promise ID atamaları sayesinde tek bir round trip içinde çok sayıda çağrı işlenebilir
Durum ve kullanım örnekleri
- Cap'n Web halen deneysel bir açık kaynak proje olup, Cloudflare Wrangler'ın remote bindings gibi gerçek hizmetlerde kullanılmaktadır
- Ek blog yazıları ve çeşitli frontend deneyleri planlanmaktadır
- MIT lisansı ile yayımlanmıştır ve herkes tarafından özgürce uygulanabilir
- GitHub deposuna git
Henüz yorum yok.