← Cloudflare Workers / workers / runtime-apis / rpc
Модель видимости и безопасности
Модель безопасности
Система Workers RPC предназначена для безопасного взаимодействия между Workers, которые не доверяют друг другу. Она не позволяет ни одной из сторон сеанса RPC обращаться к произвольным объектам на другой стороне, тем более выполнять произвольный код. Каждая сторона может вызывать только те объекты и функции, на которые она явно получила заглушки (stubs) в результате предыдущих вызовов.
Эта модель безопасности широко известна как Object Capabilities, или Capability-Based Security. Workers RPC построен на Cap'n Proto RPC ↗, который, в свою очередь, основан на CapTP, протоколе передачи объектов, используемом в распределённый язык программирования E ↗.
Видимость методов и свойств
Приватные свойства
Приватные свойства ↗ классов не предоставляются напрямую через RPC.
Стрелочные функции
Стрелочные функции не доступны через RPC, поскольку они определяются на экземплярах класса, а не на его прототипе. Они не должны использоваться как методы класса ↗ WorkerEntrypoint классы.
import { WorkerEntrypoint } from "cloudflare:workers";
export default class extends WorkerEntrypoint {
// add() is exposed over RPC.
add(a, b) {
return a + b;
}
// subtract() is NOT exposed over RPC.
subtract = (a, b) => a - b;
}Свойства экземпляра класса
Когда вы отправляете экземпляр класса, определённого в приложении, получатель может обращаться только к методам и свойствам, объявленным в классе, но не к свойствам самого экземпляра. Например:
class Foo extends RpcTarget {
constructor() {
super();
// i CANNOT be accessed over RPC
this.i = 0;
// funcProp CANNOT be called over RPC
this.funcProp = () => {}
}
// value CAN be accessed over RPC
get value() {
return this.i;
}
// method CAN be called over RPC
method() {}
}Такое поведение сделано намеренно: оно защищает вас от случайного раскрытия внутренней части приватного класса. Как правило, свойства экземпляра следует объявлять приватными, добавив к ним префикс # ↗. Однако приватные свойства являются относительно новой возможностью JavaScript и пока не получили широкого распространения в экосистеме.
Поскольку интерфейс RPC между двумя вашими Workers может быть границей безопасности, нужна повышенная осторожность, поэтому свойства экземпляра всегда приватны при взаимодействии между Workers через RPC, независимо от того, есть ли у них # префикс. Вы всегда можете объявить явный геттер на уровне класса, если хотите открыть доступ к свойству, как показано выше.
Эти правила видимости применяются только к объектам, которые расширяют RpcTarget, WorkerEntrypoint, или DurableObject, и не применяются к обычным объектам (plain objects). Обычные объекты передаются "по значению", при этом отправляются все их "собственные" свойства.
«Собственные» свойства функций
Когда вы передаёте функцию по RPC, вызывающая сторона получает доступ только к «собственным» свойствам самого объекта функции.
someRpcMethod() {
let func = () => {};
func.prop = 123; // `prop` is visible over RPC
return func;
}Доступ к таким свойствам функции осуществляется асинхронно, как и к свойствам класса RpcTarget. Однако, в отличие от RpcTarget пример выше, свойства экземпляра функции, доступные вызывающей стороне. На практике свойства редко добавляются к функциям.