1// Reads/increments the user's Counter Durable Object (exported by
2// worker-entry.ts through nitro's entry/exports seam) via the COUNTER
3// namespace binding — same-worker JS RPC.
4interface CounterStub {
5 get: () => Promise<number>;
6 increment: () => Promise<number>;
7}
8
9interface CounterNamespace {
10 idFromName: (name: string) => unknown;
11 get: (id: unknown) => CounterStub;
12}
13
14export default defineEventHandler(async (event) => {
15 const env = (
16 event.context.cloudflare as { env?: Record<string, unknown> } | undefined
17 )?.env;
18 const namespace = env?.COUNTER as CounterNamespace | undefined;
19 if (namespace === undefined) {
20 throw createError({
21 statusCode: 500,
22 statusMessage: "COUNTER binding missing",
23 });
24 }
25 const stub = namespace.get(namespace.idFromName("fixture"));
26 const count =
27 event.method === "POST" ? await stub.increment() : await stub.get();
28 return { count };
29});