INTEGRITY Документация

Модель видимости и безопасности

Модель безопасности

Система 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 пример выше, свойства экземпляра функции, доступные вызывающей стороне. На практике свойства редко добавляются к функциям.