Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Durable Object Stub

最終更新 Markdown で表示Agent セットアップ

説明

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

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

nameDurableObjectStub の省略可能なプロパティです。スタブ作成時に、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"

関連リソース

役に立ちましたか?