← Cloudflare Durable Objects / durable-objects / api
Базовый класс Durable Object
DurableObject базовый класс представляет собой абстрактный класс, от которого наследуются все Durable Objects. Этот базовый класс предоставляет набор необязательных методов, которые часто называют обработчиками; они реагируют на события, например webSocketMessage при использовании WebSocket Hibernation API. В качестве конкретного примера рассмотрим Durable Object MyDurableObject который расширяет DurableObject и реализует обработчик fetch, который возвращает вызывающему Worker строку "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!")Методы
fetch
fetch(request:Request)Response|Promise<Response>- Принимает HTTP Запрос ↗ и возвращает HTTP Ответ ↗. Этот метод позволяет Durable Object эмулировать HTTP-сервер, в котором клиентом выступает Worker с binding к этому объекту. - Этот метод может бытьasync.- Durable Objects поддерживают RPC-вызовы начиная с даты совместимости 2024-04-03. RPC-методам следует отдавать предпочтение перед
fetch()когда ваше приложение не следует модели запрос/ответ HTTP.
- Durable Objects поддерживают RPC-вызовы начиная с даты совместимости 2024-04-03. RPC-методам следует отдавать предпочтение перед
Параметры
requestRequest- объект входящего HTTP-запроса.
Возвращаемые значения
- A
ResponseилиPromise<Response>.
Пример
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>- Вызывается системой при наступлении запланированного времени будильника.
-
alarm()-обработчик гарантирует выполнение как минимум один раз и при сбое будет повторяться с экспоненциальной задержкой, начиная с двух секунд, до шести повторов. Повторные попытки выполняются, если метод завершается неперехваченным исключением. - Этот метод можно
async. - См. Будильники, где это описано подробнее.
Параметры
alarmInfoAlarmInvocationInfo(необязательно) - объект с информацией о повторных попытках:retryCountnumber- количество повторных попыток обработки этого события alarm.isRetryboolean-true, если это событие alarm является повтором,falseв противном случае.
Возвращаемые значения
- Нет.
Пример
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>- Вызывается системой когда принятый WebSocket получает сообщение. - Этот метод не вызывается для управляющих фреймов WebSocket. Система ответит на входящий WebSocket пинг протокола ↗ автоматически, не прерывая гибернацию.- Этот метод можно
async.
- Этот метод можно
Параметры
wsWebSocket- WebSocket ↗ который получил сообщение. Используйте эту ссылку для отправки ответов или доступа к сериализованным вложениям.messagestring | ArrayBuffer- данные сообщения. Текстовые сообщения передаются какstring, бинарные сообщения какArrayBuffer.
Возвращаемые значения
- Нет.
Пример
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>- Вызывается системой при закрытии соединения WebSocket.- С
web_socket_auto_reply_to_closeфлаг совместимости (включён по умолчанию при дате совместимости от2026-04-07), среда выполнения автоматически отправляет ответный Close-фрейм и переводитreadyStateкCLOSEDперед вызовом этого обработчика. Вам не нужно вызыватьws.close(): но это безопасно (вызов молча игнорируется). - На более старых датах совместимости (до
2026-04-07), вы обязательно вызовws.close(code, reason)внутри этого обработчика, чтобы завершить закрывающее рукопожатие WebSocket. Если не ответить на закрытие соединения, это приведёт к1006ошибки на клиенте, что соответствует аварийному закрытию согласно спецификации WebSocket. - Этот метод можно
async.
- С
Параметры
wsWebSocket- WebSocket ↗ который был закрыт.codenumber- Код закрытия WebSocket ↗ отправленный удалённой стороной (например,1000для обычного закрытия,1001для случая ухода).reasonstring- строка с указанием причины закрытия соединения. Может быть пустой.wasCleanboolean-true, если соединение было закрыто корректно, с полноценным closing handshake,falseв противном случае.
Возвращаемые значения
- Нет.
Пример
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>- Вызывается системой при возникновении ошибки, не связанной с разрывом соединения, на соединении WebSocket. - Этот метод может бытьasync.
Параметры
wsWebSocket- WebSocket ↗ в котором произошла ошибка.errorunknown- произошедшая ошибка. Может бытьErrorобъект или значение другого типа в зависимости от источника ошибки.
Возвращаемые значения
- Нет.
Пример
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}")Свойства
ctx
ctx является доступным только для чтения свойством типа DurableObjectState предоставляющий доступ к хранилищу, управлению WebSocket и другим функциям, специфичным для конкретного экземпляра.
env
env содержит привязки окружения, доступные этому Durable Object, как указано в конфигурации Wrangler.
Дополнительные материалы
- Используйте WebSocket с рекомендациями по обработчикам WebSocket.
- Alarms API для планирования будущей работы.
- Методы RPC для типобезопасных вызовов методов.