Pular para o conteúdo

Durable Object Time To Live

Implement a Time To Live (TTL) for Durable Object instances.

Atualizado em Ver como Markdown

A common feature request for Durable Objects is a Time To Live (TTL) for Durable Object instances. Durable Objects give developers the tools to implement a custom TTL in only a few lines of code. This example demonstrates how to implement a TTL making use of alarms. While this TTL will be extended upon every new request to the Durable Object, this can be customized based on a particular use case.

import { DurableObject } from "cloudflare:workers";

// Durable Object
export class MyDurableObject extends DurableObject {
  // Time To Live (TTL) in milliseconds
  timeToLiveMs = 1000;

  constructor(ctx, env) {
    super(ctx, env);
  }

  async fetch(_request) {
    // Extend the TTL immediately following every fetch request to a Durable Object.
    await this.ctx.storage.setAlarm(Date.now() + this.timeToLiveMs);
    ...
   }

  async alarm() {
    await this.ctx.storage.deleteAll();
  }
}

// Worker
export default {
  async fetch(request, env) {
    const stub = env.MY_DURABLE_OBJECT.getByName("foo");
    return await stub.fetch(request);
  },
};
import { DurableObject } from "cloudflare:workers";

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

// Durable Object
export class MyDurableObject extends DurableObject {
  // Time To Live (TTL) in milliseconds
  timeToLiveMs = 1000;

  constructor(ctx: DurableObjectState, env: Env) {
    super(ctx, env);
  }

  async fetch(_request: Request) {
    // Extend the TTL immediately following every fetch request to a Durable Object.
    await this.ctx.storage.setAlarm(Date.now() + this.timeToLiveMs);
    ...
   }

  async alarm() {
    await this.ctx.storage.deleteAll();
  }
}

// Worker
export default {
  async fetch(request, env) {
    const stub = env.MY_DURABLE_OBJECT.getByName("foo");
    return await stub.fetch(request);
  },
} satisfies ExportedHandler<Env>;
from workers import DurableObject, Response, WorkerEntrypoint
import time

# Durable Object
class MyDurableObject(DurableObject):
	# Time To Live (TTL) in milliseconds
	timeToLiveMs = 1000

	def __init__(self, ctx, env):
		super().__init__(ctx, env)

	async def fetch(self, _request):
		# Extend the TTL immediately following every fetch request to a Durable Object.
		await self.ctx.storage.setAlarm(int(time.time() * 1000) + self.timeToLiveMs)
		...

	async def alarm(self):
		await self.ctx.storage.deleteAll()

# Worker
class Default(WorkerEntrypoint):
	async def fetch(self, request):
		stub = self.env.MY_DURABLE_OBJECT.getByName("foo")
		return await stub.fetch(request)

To test and deploy this example, configure your Wrangler file to include a Durable Object binding and migration based on the namespace and class name chosen previously.

{
	"$schema": "./node_modules/wrangler/config-schema.json",
	"name": "durable-object-ttl",
	"main": "src/index.ts",
	"durable_objects": {
		"bindings": [
			{
				"name": "MY_DURABLE_OBJECT",
				"class_name": "MyDurableObject"
			}
		]
	},
	"migrations": [
		{
			"tag": "v1",
			"new_sqlite_classes": [
				"MyDurableObject"
			]
		}
	]
}
"$schema" = "./node_modules/wrangler/config-schema.json"
name = "durable-object-ttl"
main = "src/index.ts"

[[durable_objects.bindings]]
name = "MY_DURABLE_OBJECT"
class_name = "MyDurableObject"

[[migrations]]
tag = "v1"
new_sqlite_classes = [ "MyDurableObject" ]