| 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. |
| 4 | interface CounterStub { |
| 5 | get: () => Promise<number>; |
| 6 | increment: () => Promise<number>; |
| 7 | } |
| 8 | |
| 9 | interface CounterNamespace { |
| 10 | idFromName: (name: string) => unknown; |
| 11 | get: (id: unknown) => CounterStub; |
| 12 | } |
| 13 | |
| 14 | export 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 | }); |