DurableObjectStub インターフェイスは、リモートの Durable Object のメソッドを呼び出すクライアントです。DurableObjectStub の型はジェネリックで、スタブから RPC メソッドを呼び出せます。
Durable Objects は E-order セマンティクスを実装しています。これは E 分散プログラミング言語 ↗ に由来する概念です。同じ Durable Object へ複数回呼び出すと、呼び出した順にリモート Durable Object へ届くことが保証されます。E-order セマンティクスにより、多くの分散プログラミングの問題が扱いやすくなります。E-order は Cap'n Proto ↗ の分散 object-capability RPC プロトコルで実装されており、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) {
// スタブは、Durable Object のメソッドを呼び出すためのクライアントです
const stub = env.MY_DURABLE_OBJECT.getByName("foo");
// Durable Object のメソッドはスタブ経由で呼び出します
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) {
// スタブは、Durable Object のメソッドを呼び出すためのクライアントです
const stub = env.MY_DURABLE_OBJECT.getByName("foo");
// Durable Object のメソッドはスタブ経由で呼び出します
const rpcResponse = await stub.sayHello();
return new Response(rpcResponse);
},
} satisfies ExportedHandler<Env>;id は、スタブ作成に使った DurableObjectId に対応する DurableObjectStub のプロパティです。
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 は DurableObjectStub の省略可能なプロパティです。スタブ作成時に、DurableObjectNamespace::getByName で直接指定したか、DurableObjectNamespace::idFromName で作った DurableObjectId 経由で間接的に名前を渡した場合に、その名前を返します。DurableObjectNamespace::newUniqueId で作った DurableObjectId から DurableObjectStub を作成した場合、この値は undefined です。
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"