ASD

Durable Objects

Crea y revisa Durable Objects de Cloudflare: coordinación con estado, RPC, SQLite, alarms y WebSockets, con integración en Workers, wrangler y tests con Vitest.

Oficial
Estrellas
2.6k

en todo el repo

Actividad
33

0–100, la ruta de este skill

Actualizado
hace 5 meses

último commit aquí

Commits
0

últimos 90 días

Contexto
1.5k tok

96 tok en reposo

Paquete
4 archivos

28 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add cloudflare/skills --skill durable-objects --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Ayuda a crear y revisar clases Durable Object de Cloudflare
  • Guía la configuración de wrangler.jsonc/toml para bindings y migraciones de DO
  • Aporta patrones para RPC, almacenamiento SQLite, alarms y WebSockets
  • Da pautas para escribir tests con @cloudflare/vitest-pool-workers
  • Prioriza la consulta de la documentación de Cloudflare sobre el conocimiento preentrenado

Úsalo cuando

  • Crear nuevas clases Durable Object para coordinación con estado
  • Implementar métodos RPC, alarms o manejadores de WebSocket
  • Revisar código de DO existente en busca de buenas prácticas
  • Configurar wrangler.jsonc/toml para bindings de DO y migraciones, o escribir tests con vitest-pool-workers

No lo uses cuando

  • Manejo de peticiones sin estado (usar Workers normales)
  • Necesidades de máxima distribución global
  • Peticiones independientes con alto fan-out

Qué lo activa

Di cualquiera de estas frases y el agente debería cargar este skill.

  • Crea un Durable Object para una sala de chat con WebSockets
  • Revisa este código de Durable Object según las mejores prácticas
  • Configura wrangler.jsonc para bindings de Durable Objects con SQLite
  • Escribe tests con vitest-pool-workers para mi Durable Object
  • Implementa un alarm para renovar suscripciones en un DO

SKILL.md

En inglés

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/vitest-pool-workers
  • Designing sharding strategies and parent-child relationships

Reference Documentation

  • ./references/rules.md - Core rules, storage, concurrency, RPC, alarms
  • ./references/testing.md - Vitest setup, unit/integration tests, alarm testing
  • ./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 Quick Start

import { env } from "cloudflare:test";
import { describe, it, expect } from "vitest";

describe("MyDO", () => {
  it("should work", async () => {
    const stub = env.MY_DO.getByName("test");
    const result = await stub.addItem("test");
    expect(result).toBe(1);
  });
});

Reproducido de cloudflare/skills bajo licencia Apache-2.0. Leer esta página en markdown.

Archivos

4 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

Antes de instalar

Requiere Wrangler y, para tests, @cloudflare/vitest-pool-workers.

Detalles

Creador
cloudflare
Licencia
Apache-2.0
Recursos incluidos
referencias
Código fuente
Ver SKILL.md

Etiquetas

Más de cloudflare/skills

Este repo incluye 13 skills. Si instalas uno, normalmente ya tienes los demás.

Configura Cloudflare Turnstile de extremo a extremo: crea el widget, lo inserta donde haga falta verificar bots, conecta el siteverify server-side y valida todo antes de reportar éxito.

Costo de contexto al activarse
7.2k tok
Tamaño del paquete
13 archivos
Última actualización
hace 20 días
Oficialseguridad

Úsalo al construir apps de Cloudflare Sandbox sobre @cloudflare/sandbox@next: ejecución de código, AI runners, intérpretes, jobs CI, terminales, archivos, mounts, tunnels, preview URLs, lifecycle o errores.

Costo de contexto al activarse
1.8k tok
Tamaño del paquete
3 archivos
Última actualización
hace 7 días
Oficialdevops infraestructura

Úsalo al construir o modificar apps de Cloudflare Sandbox sobre el paquete estable @cloudflare/sandbox: comandos, sesiones, ficheros, puertos, tunnels, terminales, bridge, producción o limpieza de APIs deprecated en stable.

Costo de contexto al activarse
2.3k tok
Tamaño del paquete
1 archivo
Última actualización
hace 7 días
Oficialdevops infraestructura

Úsalo al portar una app Cloudflare Sandbox de @cloudflare/sandbox estable a @cloudflare/sandbox@next (Sandbox SDK 1.0 preview), o al migrar/actualizar a Sandbox 1.0 / @next.

Costo de contexto al activarse
2k tok
Tamaño del paquete
1 archivo
Última actualización
hace 7 días
Oficialdevops infraestructura

Skill integral de la plataforma Cloudflare: Workers, Pages, almacenamiento (KV, D1, R2), IA, feature flags, redes, seguridad e infraestructura como código (Terraform, Pulumi).

Costo de contexto al activarse
2.2k tok
Tamaño del paquete
320 archivos
Última actualización
el mes pasado
Oficialdevops infraestructura

Guía el trabajo de Zero Trust y SASE en Cloudflare One (Access, Gateway, WARP, Tunnel, WAN, DLP, CASB, device posture, identidad), priorizando siempre la documentación y esquemas de API actuales.

Costo de contexto al activarse
5.6k tok
Tamaño del paquete
1 archivo
Última actualización
hace 2 meses
Oficialdevops infraestructura

Skills relacionados

Integra el procesamiento de pagos de PayPal, con soporte para express checkout, suscripciones y gestión de reembolsos en flujos de comercio electrónico.

Costo de contexto al activarse
1k tok
Tamaño del paquete
2 archivos
Última actualización
hace 2 meses
desarrollo apis

Construye sistemas RAG (Retrieval-Augmented Generation) para aplicaciones LLM con bases de datos vectoriales y búsqueda semántica, integrando conocimiento externo.

Costo de contexto al activarse
1.1k tok
Tamaño del paquete
2 archivos
Última actualización
el mes pasado
desarrollo apis

Construye servicios backend de Node.js listos para producción con Express/Fastify, cubriendo middleware, manejo de errores, autenticación, bases de datos y diseño de APIs.

Costo de contexto al activarse
499 tok
Tamaño del paquete
3 archivos
Última actualización
hace 2 meses
desarrollo apis