import { DurableObject } from "cloudflare:workers";
export class Counter extends DurableObject {
constructor(ctx, env) {
super(ctx, env);
this.ctx.storage.sql.exec(`
CREATE TABLE IF NOT EXISTS counters (
name TEXT PRIMARY KEY,
value INTEGER NOT NULL
)
`);
}
async fetch(request) {
const name = new URL(request.url).searchParams.get("name") ?? "default";
this.ctx.storage.sql.exec(
`INSERT INTO counters (name, value) VALUES (?, 1)
ON CONFLICT(name) DO UPDATE SET value = value + 1`,
name,
);
const row = this.ctx.storage.sql
.exec("SELECT value FROM counters WHERE name = ?", name)
.one();
return Response.json(row);
}
}
export default {
async fetch(request, env) {
const id = env.COUNTER.idFromName("global");
return env.COUNTER.get(id).fetch(request);
},
};