diff options
| author | Yuval Adam <_@yuv.al> | 2025-07-10 13:29:31 +0200 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2025-07-10 13:29:31 +0200 |
| commit | aec2c16d8cd3748d2ce694b76f868243f7ff88af (patch) | |
| tree | fcfea0aa7fe96cfdc436f013e865d75c7f1c37e8 /src/pages/api/counter.ts | |
| parent | 9b7446cd051cdcea7ed8fd96d35e190625e861f9 (diff) | |
Add durable object
Diffstat (limited to 'src/pages/api/counter.ts')
| -rw-r--r-- | src/pages/api/counter.ts | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/pages/api/counter.ts b/src/pages/api/counter.ts new file mode 100644 index 0000000..152dc54 --- /dev/null +++ b/src/pages/api/counter.ts @@ -0,0 +1,59 @@ +import type { APIRoute } from 'astro'; + +interface Env { + COUNTER_DO: DurableObjectNamespace; +} + +export const GET: APIRoute = async ({ request }) => { + const env = request.cf?.env as Env; + if (!env?.COUNTER_DO) { + return new Response(JSON.stringify({ error: 'Durable Object not available' }), { + status: 500, + headers: { 'Content-Type': 'application/json' } + }); + } + + const id = env.COUNTER_DO.idFromName('global-counter'); + const stub = env.COUNTER_DO.get(id); + + const response = await stub.fetch(new Request('https://counter.do/get')); + const data = await response.json(); + + return new Response(JSON.stringify(data), { + headers: { 'Content-Type': 'application/json' } + }); +}; + +export const POST: APIRoute = async ({ request }) => { + const env = request.cf?.env as Env; + if (!env?.COUNTER_DO) { + return new Response(JSON.stringify({ error: 'Durable Object not available' }), { + status: 500, + headers: { 'Content-Type': 'application/json' } + }); + } + + const url = new URL(request.url); + const action = url.searchParams.get('action') || 'increment'; + + const id = env.COUNTER_DO.idFromName('global-counter'); + const stub = env.COUNTER_DO.get(id); + + let doRequest: Request; + switch (action) { + case 'reset': + doRequest = new Request('https://counter.do/reset'); + break; + case 'increment': + default: + doRequest = new Request('https://counter.do/increment'); + break; + } + + const response = await stub.fetch(doRequest); + const data = await response.json(); + + return new Response(JSON.stringify(data), { + headers: { 'Content-Type': 'application/json' } + }); +};
\ No newline at end of file |
