durable-objects

GitHub

用于在 Cloudflare Durable Objects 上构建、调试和审查具有持久状态和协调能力的边缘应用代码。涵盖 API 使用、配置、最佳实践及测试,优先检索最新文档以确保准确性。

plugins/cloudflare-skills/skills/durable-objects/SKILL.md fcakyon/claude-codex-settings

Trigger Scenarios

需要创建或管理有状态的后端服务 涉及分布式协调或强一致性数据存储 编写或审查 Cloudflare Workers 中的 Durable Object 代码 配置 wrangler.jsonc 以绑定 Durable Objects

Install

npx skills add fcakyon/claude-codex-settings --skill durable-objects -g -y
More Options

Non-standard path

npx skills add https://github.com/fcakyon/claude-codex-settings/tree/main/plugins/cloudflare-skills/skills/durable-objects -g -y

Use without installing

npx skills use fcakyon/claude-codex-settings@durable-objects

指定 Agent (Claude Code)

npx skills add fcakyon/claude-codex-settings --skill durable-objects -a claude-code -g -y

安装 repo 全部 skill

npx skills add fcakyon/claude-codex-settings --all -g -y

预览 repo 内 skill

npx skills add fcakyon/claude-codex-settings --list

SKILL.md

Frontmatter
{
    "name": "durable-objects",
    "license": "Apache-2.0",
    "description": "Build, debug, or review Cloudflare Durable Objects code for persistent state and coordination."
}

Durable Objects

Build stateful, coordinated applications on Cloudflare's edge using Durable Objects.

Retrieval Sources

Your knowledge of Durable Objects APIs and configuration may be outdated. Prefer retrieval over pre-training for any Durable Objects task.

Resource URL
Docs https://developers.cloudflare.com/durable-objects/index.md
API Reference https://developers.cloudflare.com/durable-objects/api/index.md
Best Practices https://developers.cloudflare.com/durable-objects/best-practices/index.md
Examples https://developers.cloudflare.com/durable-objects/examples/index.md
Roles and permissions https://developers.cloudflare.com/workers/authorization/durable-objects/index.md

Fetch the relevant doc page when implementing features.

When to Use

  • Creating new Durable Object classes for stateful coordination
  • Implementing RPC methods, alarms, or WebSocket handlers
  • Reviewing existing DO code for best practices
  • Configuring wrangler.jsonc/toml for DO bindings and migrations
  • Writing tests with Cloudflare’s Vitest integration
  • Designing sharding strategies and parent-child relationships

Reference Documentation

  • ./references/rules.md - Core rules, storage, concurrency, RPC, alarms
  • Testing reference - Current Vitest documentation, migration choices, and test selection
  • ./references/workers.md - Workers handlers, types, wrangler config, observability

Search: blockConcurrencyWhile, idFromName, getByName, setAlarm, sql.exec

Core Principles

Use Durable Objects For

Need Example
Coordination Chat rooms, multiplayer games, collaborative docs
Strong consistency Inventory, booking systems, turn-based games
Per-entity storage Multi-tenant SaaS, per-user data
Persistent connections WebSockets, real-time notifications
Scheduled work per entity Subscription renewals, game timeouts

Do NOT Use For

  • Stateless request handling (use plain Workers)
  • Maximum global distribution needs
  • High fan-out independent requests

Quick Reference

Wrangler Configuration

// wrangler.jsonc
{
  "durable_objects": {
    "bindings": [{ "name": "MY_DO", "class_name": "MyDurableObject" }]
  },
  "migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyDurableObject"] }]
}

Basic Durable Object Pattern

import { DurableObject } from "cloudflare:workers";

export interface Env {
  MY_DO: DurableObjectNamespace<MyDurableObject>;
}

export class MyDurableObject extends DurableObject<Env> {
  constructor(ctx: DurableObjectState, env: Env) {
    super(ctx, env);
    ctx.blockConcurrencyWhile(async () => {
      this.ctx.storage.sql.exec(`
        CREATE TABLE IF NOT EXISTS items (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          data TEXT NOT NULL
        )
      `);
    });
  }

  async addItem(data: string): Promise<number> {
    const result = this.ctx.storage.sql.exec<{ id: number }>(
      "INSERT INTO items (data) VALUES (?) RETURNING id",
      data
    );
    return result.one().id;
  }
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const stub = env.MY_DO.getByName("my-instance");
    const id = await stub.addItem("hello");
    return Response.json({ id });
  },
};

Critical Rules

  1. Model around coordination atoms - One DO per chat room/game/user, not one global DO
  2. Use getByName() for deterministic routing - Same input = same DO instance
  3. Use SQLite storage - Configure new_sqlite_classes in migrations
  4. Initialize in constructor - Use blockConcurrencyWhile() for schema setup only
  5. Use RPC methods - Not fetch() handler (compatibility date >= 2024-04-03)
  6. Persist first, cache second - Always write to storage before updating in-memory state
  7. One alarm per DO - setAlarm() replaces any existing alarm

Authorization

Durable Objects do not have separate roles or permissions; access follows the Worker that implements them. Retrieve the current Durable Objects authorization guidance before granting observability or Data Studio access, and scope the Workers role to the intended Worker or Workers product.

Anti-Patterns (NEVER)

  • Single global DO handling all requests (bottleneck)
  • Using blockConcurrencyWhile() on every request (kills throughput)
  • Storing critical state only in memory (lost on eviction/crash)
  • Using await between related storage writes (breaks atomicity)
  • Holding blockConcurrencyWhile() across fetch() or external I/O

Stub Creation

// Deterministic - preferred for most cases
const stub = env.MY_DO.getByName("room-123");

// From existing ID string
const id = env.MY_DO.idFromString(storedIdString);
const stub = env.MY_DO.get(id);

// New unique ID - store mapping externally
const id = env.MY_DO.newUniqueId();
const stub = env.MY_DO.get(id);

Storage Operations

// SQL (synchronous, recommended)
this.ctx.storage.sql.exec("INSERT INTO t (c) VALUES (?)", value);
const rows = this.ctx.storage.sql.exec<Row>("SELECT * FROM t").toArray();

// KV (async)
await this.ctx.storage.put("key", value);
const val = await this.ctx.storage.get<Type>("key");

Alarms

// Schedule (replaces existing)
await this.ctx.storage.setAlarm(Date.now() + 60_000);

// Handler
async alarm(): Promise<void> {
  // Process scheduled work
  // Optionally reschedule: await this.ctx.storage.setAlarm(...)
}

// Cancel
await this.ctx.storage.deleteAlarm();

Testing

Read the testing reference before configuring a suite or writing Durable Object tests. It routes to current setup, APIs, and examples and identifies the behavior to cover.

Version History

  • 216ec22 Current 2026-10-19 12:58

    更新官方文档链接路径,新增 Roles and permissions 参考源,完善 Core Principles 中关于不适用场景的说明。

  • 4632eb3 2026-09-09 11:52

Same Skill Collection

plugins/adhd-output-style/skills/adhd-output-style/SKILL.md
plugins/agent-browser/skills/derive-client/SKILL.md
plugins/agent-browser/skills/dogfood/SKILL.md
plugins/agent-browser/skills/ui-regression/SKILL.md
plugins/agent-browser/skills/webmcp-gen/SKILL.md
plugins/anthropic-office-skills/skills/pdf/SKILL.md
plugins/azure-tools/skills/azure-usage/SKILL.md
plugins/azure-tools/skills/setup/SKILL.md
plugins/cloudflare-skills/skills/agents-sdk/SKILL.md
plugins/cloudflare-skills/skills/basin/SKILL.md
plugins/cloudflare-skills/skills/cloudflare-deploy/SKILL.md
plugins/cloudflare-skills/skills/cloudflare-email-service/SKILL.md
plugins/cloudflare-skills/skills/cloudflare-one-migrations/SKILL.md
plugins/cloudflare-skills/skills/cloudflare-one/SKILL.md
plugins/cloudflare-skills/skills/k2/SKILL.md
plugins/cloudflare-skills/skills/sandbox-migrate-to-next/SKILL.md
plugins/cloudflare-skills/skills/sandbox-next/SKILL.md
plugins/cloudflare-skills/skills/sandbox-stable/SKILL.md
plugins/cloudflare-skills/skills/turnstile-spin/SKILL.md
plugins/cloudflare-skills/skills/web-perf/SKILL.md
plugins/cloudflare-skills/skills/workers-best-practices/SKILL.md
plugins/cloudflare-skills/skills/wrangler/SKILL.md
plugins/codex-advisor/skills/codex-advisor/SKILL.md
plugins/dokploy-skills/skills/dokploy-deploy/SKILL.md
plugins/fable-advisor/skills/fable-advisor/SKILL.md
plugins/frontend-design-skills/skills/anthropic-frontend-design/SKILL.md
plugins/frontend-design-skills/skills/frontend-testing-debugging/SKILL.md
plugins/frontend-design-skills/skills/openai-frontend-design/SKILL.md
plugins/frontend-design-skills/skills/writing-guidelines/SKILL.md
plugins/gcloud-tools/skills/gcloud-usage/SKILL.md
plugins/gcloud-tools/skills/setup/SKILL.md
plugins/github-dev/skills/clean-gone-branches/SKILL.md
plugins/github-dev/skills/commit-staged/SKILL.md
plugins/github-dev/skills/create-pr/SKILL.md
plugins/github-dev/skills/resolve-pr-comments/SKILL.md
plugins/github-dev/skills/review-pr/SKILL.md
plugins/github-dev/skills/setup/SKILL.md
plugins/github-dev/skills/update-pr-summary/SKILL.md
plugins/hetzner-skills/skills/hetzner-deploy/SKILL.md
plugins/humanize/skills/humanize/SKILL.md
plugins/livekit-skills/skills/livekit-skills/SKILL.md
plugins/mongodb-skills/skills/mongodb-atlas-stream-processing/SKILL.md
plugins/mongodb-skills/skills/mongodb-mcp-setup/SKILL.md
plugins/mongodb-skills/skills/mongodb-query-optimizer/SKILL.md
plugins/openai-office-skills/skills/doc/SKILL.md
plugins/openai-office-skills/skills/pdf/SKILL.md
plugins/openai-office-skills/skills/slides/SKILL.md
plugins/openai-office-skills/skills/spreadsheet/SKILL.md
plugins/openobserve-skills/skills/openobserve-api/SKILL.md

Metadata

Files
0
Version
216ec22
Hash
80adfefc
Indexed
2026-09-09 11:52

홈 - 위키
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-10-21 11:58
浙ICP备14020137号-1