6 puan yazan GN⁺ 2025-09-23 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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 guard vb.) 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ğrudan hello() içine aktararak tek bir ağ gidiş-dönüşüyle işlem yapılır

    let 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

  • authenticate metodu ü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 map işlemi yapılabilir

  • map callback 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şlenir

    let 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.

Henüz yorum yok.