← Cloudflare Durable Objects / durable-objects / api
Durable Object Stub
Описание
DurableObjectStub интерфейс представляет собой клиент для вызова методов на удалённом Durable Object. Тип DurableObjectStub является обобщённым, что позволяет вызывать RPC-методы на стабе.
Durable Objects реализуют семантику E-order, концепцию, восходящую к язык распределённого программирования E ↗. При выполнении нескольких вызовов одного и того же Durable Object гарантируется, что они будут доставлены удалённому Durable Object в том порядке, в котором были сделаны. Семантика E-order упрощает решение многих задач распределённого программирования. E-order реализуется с помощью Cap'n Proto ↗ распределённый RPC протокол на основе object capability, который Cloudflare Workers использует для внутренних коммуникаций.
Если Durable Object выбрасывает исключение заглушку, все выполняемые и последующие вызовы завершатся ошибкой с исключения. Чтобы продолжить вызывать методы удалённого Durable Object, Worker должен заново создать заглушку. Между разными заглушками порядок вызовов не гарантируется.
import { DurableObject } from "cloudflare:workers";
// Durable Object
export class MyDurableObject extends DurableObject {
constructor(ctx, env) {
super(ctx, env);
}
async sayHello() {
return "Hello, World!";
}
}
// Worker
export default {
async fetch(request, env) {
// A stub is a client used to invoke methods on the Durable Object
const stub = env.MY_DURABLE_OBJECT.getByName("foo");
// Methods on the Durable Object are invoked via the stub
const rpcResponse = await stub.sayHello();
return new Response(rpcResponse);
},
};import { DurableObject } from "cloudflare:workers";
export interface Env {
MY_DURABLE_OBJECT: DurableObjectNamespace<MyDurableObject>;
}
// Durable Object
export class MyDurableObject extends DurableObject {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
async sayHello(): Promise<string> {
return "Hello, World!";
}
}
// Worker
export default {
async fetch(request, env) {
// A stub is a client used to invoke methods on the Durable Object
const stub = env.MY_DURABLE_OBJECT.getByName("foo");
// Methods on the Durable Object are invoked via the stub
const rpcResponse = await stub.sayHello();
return new Response(rpcResponse);
},
} satisfies ExportedHandler<Env>;Свойства
id
id является свойством DurableObjectStub соответствующий DurableObjectId используемый для создания stub.
const id = env.MY_DURABLE_OBJECT.newUniqueId();
const stub = env.MY_DURABLE_OBJECT.get(id);
console.assert(id.equals(stub.id), "This should always be true");id = env.MY_DURABLE_OBJECT.newUniqueId()
stub = env.MY_DURABLE_OBJECT.get(id)
assert id.equals(stub.id), "This should always be true"name
name является необязательным свойством DurableObjectStub, который возвращает имя, если оно было указано при создании stub, либо напрямую через DurableObjectNamespace::getByName или косвенно через DurableObjectId созданный DurableObjectNamespace::idFromName. Это значение не определено, если DurableObjectId используемый для создания DurableObjectStub был создан с использованием DurableObjectNamespace::newUniqueId.
const stub = env.MY_DURABLE_OBJECT.getByName("foo");
console.assert(stub.name === "foo", "This should always be true");stub = env.MY_DURABLE_OBJECT.getByName("foo")
assert stub.name == "foo", "This should always be true"