← Cloudflare Durable Objects / durable-objects / api
Základní třída Durable Object
DurableObject základní třída je abstraktní třída, ze které dědí všechny Durable Objects. Tato základní třída poskytuje sadu volitelných metod, často označovaných jako obslužné metody, které mohou reagovat na události, například na webSocketMessage při použití WebSocket Hibernation API. Pro konkrétní příklad zde uvádíme Durable Object MyDurableObject která rozšiřuje DurableObject a implementuje obslužnou rutinu fetch, která volajícímu Workeru vrátí "Hello, World!".
export class MyDurableObject extends DurableObject {
constructor(ctx, env) {
super(ctx, env);
}
async fetch(request) {
return new Response("Hello, World!");
}
}export class MyDurableObject extends DurableObject {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
async fetch(request: Request) {
return new Response("Hello, World!");
}
}from workers import DurableObject, Response
class MyDurableObject(DurableObject):
def __init__(self, ctx, env):
super().__init__(ctx, env)
async def fetch(self, request):
return Response("Hello, World!")Metody
fetch
fetch(request:Request)Response|Promise<Response>- Přijímá HTTP Požadavek ↗ a vrací HTTP Odpověď ↗. Tato metoda umožňuje Durable Objectu emulovat HTTP server, kde je klientem Worker s vazbou na daný objekt. - Tuto metodu lzeasync.- Durable Objects podporují Volání RPC od data kompatibility 2024-04-03. Metody RPC se upřednostňují před
fetch()pokud vaše aplikace nesleduje tok HTTP požadavek/odpověď.
- Durable Objects podporují Volání RPC od data kompatibility 2024-04-03. Metody RPC se upřednostňují před
Parametry
requestRequest- příchozí objekt HTTP požadavku.
Návratové hodnoty
- A
ResponseneboPromise<Response>.
Příklad
export class MyDurableObject extends DurableObject {
async fetch(request) {
const url = new URL(request.url);
if (url.pathname === "/hello") {
return new Response("Hello, World!");
}
return new Response("Not found", { status: 404 });
}
}export class MyDurableObject extends DurableObject<Env> {
async fetch(request: Request): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === "/hello") {
return new Response("Hello, World!");
}
return new Response("Not found", { status: 404 });
}
}from workers import DurableObject, Response
from urllib.parse import urlparse
class MyDurableObject(DurableObject):
async def fetch(self, request):
path = urlparse(request.url).path
if path == "/hello":
return Response("Hello, World!")
return Response("Not found", status=404)alarm
alarm(alarmInfo?:AlarmInvocationInfo)void|Promise<void>- Systém tuto metodu volá, jakmile nastane naplánovaný čas alarmu.
-
alarm()má zaručeno spuštění alespoň jednou a v případě selhání se opakuje s exponenciálním prodlením, počínaje prodlevou dvě sekundy až po šest opakování. K opakování dojde, pokud metoda selže s nezachycenou výjimkou. - Tuto metodu lze
async. - Viz Alarmy s dalšími informacemi.
Parametry
alarmInfoAlarmInvocationInfo(volitelné) - objekt obsahující informace o opakování:retryCountnumber- počet, kolikrát byla tato událost alarmu opakována.isRetryboolean-truepokud je tato událost alarmu opakováním,falsev opačném případě.
Návratové hodnoty
- Žádné.
Příklad
export class MyDurableObject extends DurableObject {
async alarm(alarmInfo) {
if (alarmInfo?.isRetry) {
console.log(`Alarm retry attempt ${alarmInfo.retryCount}`);
}
await this.processScheduledTask();
}
}export class MyDurableObject extends DurableObject<Env> {
async alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> {
if (alarmInfo?.isRetry) {
console.log(`Alarm retry attempt ${alarmInfo.retryCount}`);
}
await this.processScheduledTask();
}
}from workers import DurableObject
class MyDurableObject(DurableObject):
async def alarm(self, alarm_info=None):
if alarm_info and alarm_info.isRetry:
print(f"Alarm retry attempt {alarm_info.retryCount}")
await self.process_scheduled_task()webSocketMessage
webSocketMessage(ws:WebSocket, messagestring | ArrayBuffer)void|Promise<void>- Volá systém při přijetí zprávy přijatým WebSocketem. - Tato metoda se nevolá pro řídicí rámce WebSocket. Systém odpoví na příchozí WebSocket ping protokolu ↗ automaticky, aniž by to přerušilo hibernaci.- Tuto metodu lze
async.
- Tuto metodu lze
Parametry
wsWebSocket- WebSocket ↗ která zprávu přijala. Pomocí této reference můžete odesílat odpovědi nebo přistupovat k serializovaným přílohám.messagestring | ArrayBuffer- data zprávy. Textové zprávy přicházejí jakostring, binární zprávy jakoArrayBuffer.
Návratové hodnoty
- Žádné.
Příklad
export class MyDurableObject extends DurableObject {
async webSocketMessage(ws, message) {
if (typeof message === "string") {
ws.send(`Received: ${message}`);
} else {
ws.send(`Received ${message.byteLength} bytes`);
}
}
}export class MyDurableObject extends DurableObject<Env> {
async webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) {
if (typeof message === "string") {
ws.send(`Received: ${message}`);
} else {
ws.send(`Received ${message.byteLength} bytes`);
}
}
}from workers import DurableObject
class MyDurableObject(DurableObject):
async def webSocketMessage(self, ws, message):
if isinstance(message, str):
ws.send(f"Received: {message}")
else:
ws.send(f"Received {len(message)} bytes")webSocketClose
webSocketClose(ws:WebSocket, codenumber, reasonstring, wasCleanboolean)void|Promise<void>- Volá systém když se uzavře WebSocket připojení.- S
web_socket_auto_reply_to_closepříznak kompatibility (ve výchozím nastavení povolen u dat kompatibility od2026-04-07), runtime automaticky odešle reciproční Close frame a přejde doreadyStatenaCLOSEDpřed voláním této obslužné rutiny. Nemusíte volatws.close(), ale je to bezpečné (volání se tiše ignoruje). - Na starších datech kompatibility (před
2026-04-07, vy musí voláníws.close(code, reason)uvnitř tohoto handleru, aby se dokončil close handshake WebSocketu. Pokud uzavření neopětujete, dojde k1006chyby na straně klienta, což představuje abnormální uzavření podle specifikace WebSocket. - Tuto metodu lze
async.
- S
Parametry
wsWebSocket- WebSocket ↗ který byl uzavřen.codenumber- Kód uzavření WebSocketu ↗ odeslaný druhou stranou (např.1000pro normální ukončení,1001pro odchod).reasonstring- řetězec udávající důvod uzavření spojení. Může být prázdný.wasCleanboolean-truepokud se připojení uzavřelo čistě pomocí řádného ukončovacího handshaku,falsev opačném případě.
Návratové hodnoty
- Žádné.
Příklad
export class MyDurableObject extends DurableObject {
async webSocketClose(ws, code, reason, wasClean) {
// With web_socket_auto_reply_to_close (compat date >= 2026-04-07),
// the runtime has already completed the close handshake.
// On older compat dates, call ws.close(code, reason) here.
ws.close(code, reason);
console.log(`WebSocket closed: code=${code}, reason=${reason}`);
}
}export class MyDurableObject extends DurableObject<Env> {
async webSocketClose(ws: WebSocket, code: number, reason: string, wasClean: boolean) {
// With web_socket_auto_reply_to_close (compat date >= 2026-04-07),
// the runtime has already completed the close handshake.
// On older compat dates, call ws.close(code, reason) here.
ws.close(code, reason);
console.log(`WebSocket closed: code=${code}, reason=${reason}`);
}
}from workers import DurableObject
class MyDurableObject(DurableObject):
async def webSocketClose(self, ws, code, reason, was_clean):
ws.close(code, reason)
print(f"WebSocket closed: code={code}, reason={reason}")webSocketError
webSocketError(ws:WebSocket, errorunknown)void|Promise<void>- Volá systém při chybě na WebSocket připojení, která nesouvisí s odpojením. - Tuto metodu lzeasync.
Parametry
wsWebSocket- WebSocket ↗ u kterého došlo k chybě.errorunknown- chyba, ke které došlo. Může jít oErrorobjekt nebo jiný typ v závislosti na zdroji chyby.
Návratové hodnoty
- Žádné.
Příklad
export class MyDurableObject extends DurableObject {
async webSocketError(ws, error) {
const message = error instanceof Error ? error.message : String(error);
console.error(`WebSocket error: ${message}`);
}
}export class MyDurableObject extends DurableObject<Env> {
async webSocketError(ws: WebSocket, error: unknown) {
const message = error instanceof Error ? error.message : String(error);
console.error(`WebSocket error: ${message}`);
}
}from workers import DurableObject
class MyDurableObject(DurableObject):
async def webSocketError(self, ws, error):
print(f"WebSocket error: {error}")Vlastnosti
ctx
ctx je vlastnost pouze pro čtení typu DurableObjectState poskytující přístup k úložišti, správě WebSocketů a dalším funkcím specifickým pro danou instanci.
env
env obsahuje environment bindings dostupné pro tento Durable Object, jak jsou definované v konfiguraci Wrangler.
Související zdroje
- Použití WebSockets pro osvědčené postupy pro WebSocket handlery.
- Alarms API pro plánování budoucí práce.
- Metody RPC pro typově bezpečná volání metod.