durable-objects

GitHub

用于构建、调试或审查 Cloudflare Durable Objects 代码,支持持久状态与协调逻辑开发。涵盖配置 wrangler、实现 RPC/WebSocket、编写测试及设计分片策略等场景。

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

触发场景

创建新的 Durable Object 类 实现 RPC 方法或 WebSocket 处理器 审查 DO 代码最佳实践 配置 wrangler.jsonc 绑定与迁移 使用 Vitest 编写测试

安装

npx skills add fcakyon/claude-codex-settings --skill durable-objects -g -y
更多选项

非标准路径

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

不安装直接使用

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/
API Reference https://developers.cloudflare.com/durable-objects/api/
Best Practices https://developers.cloudflare.com/durable-objects/best-practices/
Examples https://developers.cloudflare.com/durable-objects/examples/

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

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.

版本历史

  • 4632eb3 当前 2026-09-09 11:52

同 Skill 集合

plugins/adhd-output-style/skills/adhd-output-style/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/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/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/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
plugins/openship-skills/skills/openship-config/SKILL.md
plugins/openship-skills/skills/openship-deploy/SKILL.md
plugins/overleaf-skills/skills/review-overleaf/SKILL.md
plugins/overleaf-skills/skills/setup/SKILL.md
plugins/paper-search-tools/skills/paper-search-usage/SKILL.md
plugins/paper-search-tools/skills/setup/SKILL.md
plugins/polar-skills/skills/polar-billing/SKILL.md

元信息

文件数
0
版本
4632eb3
Hash
9dda84ec
收录时间
2026-09-09 11:52

首页 - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-09-09 18:34
浙ICP备14020137号-1 $访客地图$