Оглавление

Cloudflare выпустила Cap’n Web — новую RPC-библиотеку на TypeScript, предназначенную для упрощения взаимодействия между браузерными и серверными приложениями. Библиотека весит менее 10 КБ и не имеет зависимостей.

Что такое Cap’n Web

Cap’n Web представляет собой духовного преемника Cap’n Proto, но спроектированного специально для веб-стека. Ключевые особенности:

  • Объектно-ориентированная модель возможностей (object-capability)
  • Полное отсутствие схем и шаблонного кода
  • Интеграция с TypeScript
  • Человекочитаемая JSON-сериализация
  • Поддержка HTTP, WebSocket и postMessage()
  • Работа во всех основных браузерах, Cloudflare Workers и Node.js

Основные возможности

Библиотека реализует объектно-ориентированную RPC-модель, которая предоставляет:

  • Двусторонние вызовы (клиент→сервер и сервер→клиент)
  • Передачу функций по ссылке
  • Передачу объектов по ссылке через наследование от RpcTarget
  • Конвейеризацию промисов для цепочек вызовов
  • Поддержку паттернов безопасности на основе возможностей

Простота использования

Клиентская часть выглядит крайне просто:

import { newWebSocketRpcSession } from "capnweb";

let api = newWebSocketRpcSession("wss://example.com/api");
let result = await api.hello("World");
console.log(result);

Серверная реализация для 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});
 }
}

HTTP batch mode

Для случаев, когда WebSocket избыточен, доступен HTTP-режим:

import { newHttpBatchRpcSession } from "capnweb";

let batch = newHttpBatchRpcSession("https://example.com/api");
let result = await batch.hello("World");
console.log(result);

Cap’n Web — это тот редкий случай, когда элегантность архитектуры сочетается с практической полезностью. Объектно-ориентированный подход с передачей ссылок — это именно то, чего не хватало веб-разработке для создания сложных распределенных систем. Жаль, что такая библиотека не появилась лет на пять раньше — сколько бы костылей с callback-ами можно было бы избежать!

Библиотека особенно хорошо подходит для интерактивных веб-приложений с функциями реального времени и моделирования взаимодействий через сложные границы безопасности. Хотя проект пока экспериментальный, он демонстрирует зрелый подход к распределенным вычислениям в современном JavaScript-стеке.

По материалам Cloudflare Blog