Представляем capn web — новейший протокол RPC на основе JavaScript.

Представляем capn web — новейший протокол RPC на основе JavaScript.

Представлен новый протокол удаленного вызова процедур (RPC) под названием Cap'n Web, полностью написанный на TypeScript. Этот протокол, задуманный как духовный наследник Cap'n Proto, специально разработан для современной веб-стека. Cap'n Web выделяется отсутствием схем и минимальным количеством шаблонного кода, что упрощает его настройку и интеграцию с TypeScript. Он использует человекочитаемый формат сериализации на основе JSON с некоторыми предварительными и постобработками для обработки специальных типов данных. Система легковесна, сжатая до менее 10 кБ без зависимостей, и доступна в открытом доступе по лицензии MIT. Она поддерживает несколько транспортов, включая HTTP, WebSocket и postMessage(), и совместима со всеми основными браузерами, Cloudflare Workers, Node.js и другими современными средами выполнения JavaScript. Cap'n Web особенно подходит для интерактивных веб-приложений с функциями реального времени и для моделирования взаимодействий через сложные границы безопасности. Несмотря на то, что система новая и считается экспериментальной, она уже используется в таких функциях, как "удаленные привязки" в Wrangler, позволяя локальной тестовой среде общаться через RPC с производственными сервисами.

Понимание протокола JavaScript RPC Cap'n Web

Удаленные вызовы процедур (RPC) позволяют программам общаться по сети, делая сетевые взаимодействия похожими на стандартные вызовы функций. Вместо ручного форматирования HTTP-запросов и анализа ответов, система RPC позволяет клиенту вызвать метод на объекте "заглушке", который затем обрабатывает сериализацию и передачу параметров на сервер, вызывает метод и возвращает результат. Исторически системы RPC часто критиковались за синхронность, из-за которой вызывающий поток блокировался в ожидании сетевого ответа, что могло приводить к медленным или неотзывчивым приложениям. Однако современный программный ландшафт, с такими возможностями, как Promises и async/await, решил эти фундаментальные проблемы. Cap'n Web использует эти современные конструкции для обеспечения эффективного и удобного для разработчиков опыта работы с RPC. Система построена на модели объектно-ориентированного RPC, что делает её более выразительной, чем многие другие системы RPC. Эта модель поддерживает несколько мощных функций, включая двусторонние вызовы, когда сервер может делать вызовы обратно к клиенту. Это достигается благодаря возможности передавать функции и объекты по ссылке; когда функция передается через RPC, получатель получает заглушку, которая при вызове делает RPC для вызова исходной функции. Этот шаблон полезен для реализации обратных вызовов, когда клиент передает функцию серверу для последующего выполнения. Модель также позволяет использовать "конвейеризацию обещаний", при которой разработчик может сразу использовать обещание, возвращенное от одного RPC, как входные данные для последующего RPC, что позволяет выполнить цепочку вызовов в одном сетевом раунде. Такой подход позволяет разработчикам разрабатывать сетевые интерфейсы, которые кажутся естественными для программистов JavaScript, снижая необходимость постоянно переводить между различными ментальными моделями.

Продвинутые функции протокола JavaScript RPC Cap'n Web

Помимо своей основной модели, Cap'n Web включает в себя несколько продвинутых функций, предназначенных для повышения эффективности и безопасности. Одной из значительных возможностей является конвейеризация обещаний. Когда инициируется RPC, он возвращает специальное обещание, которое также является объектом JavaScript Proxy. Это позволяет разработчикам цепочить зависимые вызовы, не дожидаясь завершения первого вызова. Например, клиент может вызвать метод аутентификации и получить объект сессии, а затем сразу же вызвать метод на этом объекте-обещании сессии, все в рамках одного сетевого раунда. Клиент отправляет сообщения серверу, инструктируя его использовать результат первого вызова в качестве цели для второго. Этот шаблон также обеспечивает мощную модель безопасности на основе возможностей. В типичном сценарии клиент может вызвать метод authenticate() с API-ключом. После успешной проверки сервер возвращает аутентифицированный объект сессии. Клиент затем может выполнять авторизованные операции, вызывая методы на этом конкретном объекте сессии. Существенно, что клиент не может подделать этот объект сессии; единственный способ его получить — успешно пройти аутентификацию. Этот дизайн аккуратно интегрирует авторизацию в абстракцию RPC, что является общей проблемой для таких протоколов, как WebSockets, где заголовки и куки трудно использовать для авторизации. Для разработчиков, использующих TypeScript, Cap'n Web предоставляет сильную интеграцию. RPC API может быть объявлен в виде интерфейса TypeScript, который затем можно реализовать на сервере и использовать на клиенте для получения сквозной проверки типов и автозаполнения. Важно отметить, что эти проверки происходят на этапе компиляции, а не выполнения, поэтому злонамеренные клиенты все еще могут отправлять параметры неправильного типа. Для ситуаций, когда постоянное соединение WebSocket не требуется, Cap'n Web предлагает режим пакетной обработки HTTP, позволяющий клиенту быстро выполнить пакет вызовов в одном HTTP-запросе.

Сравнение протокола JavaScript RPC Cap'n Web с GraphQL

Современная веб-разработка видела рост технологий, таких как GraphQL, которые были созданы для решения проблемы "водопада" традиционных REST API, когда клиенту может потребоваться выполнить несколько последовательных запросов для получения всех необходимых данных. GraphQL позволяет клиенту запрашивать несколько частей данных в одном запросе, улучшая эффективность. Однако GraphQL вводит свой собственный набор компромиссов, включая новый язык схем, специализированные инструменты и декларативную модель запросов, которая может быть неудобной для цепочки операций или мутаций. Cap'n Web решает ту же проблему водопада, но делает это без введения нового языка или экосистемы; он остается в рамках парадигмы JavaScript. Через конвейеризацию обещаний разработчики могут естественно выражать цепочки операций в стандартном JavaScript, например, создавать пользователя и затем сразу использовать этот новый объект пользователя для выполнения другого действия, все в рамках одного сетевого раунда. Основная область, где GraphQL превосходит, это работа со списками данных, например, получение друзей пользователя и затем получение фото профиля для каждого из них. Cap'n Web предлагает инновационное решение для этого сценария через специализированную функцию .map(), которую можно вызвать на обещании, которое будет разрешено в массив. При использовании этой .map() код функции обратного вызова не отправляется на сервер. Вместо этого на клиенте используется механизм "запись-воспроизведение" для захвата конвейерных вызовов, сделанных внутри обратного вызова. Эти записанные инструкции затем отправляются на сервер, который воспроизводит их для каждого элемента массива, эффективно выполняя преобразование на стороне сервера без дополнительных сетевых раундов. Это позволяет разработчикам достигать сложных шаблонов извлечения данных, похожих на GraphQL, но используя знакомый императивный код на JavaScript.

Оставить коментарий
Комментарий:
Комментарии
  1. user

    Очень интересно узнать о Cap'n Web, особенно в контексте сравнения с GraphQL. Возможность использовать обещания и конвейеризацию кажется очень мощной функцией. Интересно, как это будет работать в больших проектах и насколько легко будет интегрироваться с существующими системами.