From c2e36adc6a7b9050b2d78288d550999ddf54a9d4 Mon Sep 17 00:00:00 2001 From: uku Date: Sat, 26 Oct 2024 11:50:41 +0200 Subject: [PATCH] feat: use cloudflare kv --- bun.lockb | Bin 129307 -> 129693 bytes package.json | 1 + src/app.d.ts | 6 +++++- src/lib/index.ts | 19 ++++++++++++------- src/routes/api/check/+server.ts | 8 ++++++-- src/routes/game/+page.server.ts | 7 +++++-- tsconfig.json | 3 ++- wrangler.toml | 4 ++++ 8 files changed, 35 insertions(+), 13 deletions(-) diff --git a/bun.lockb b/bun.lockb index 81c73d520722f738b46eba0e7279c5e03beb3c81..6d350b70ea8d17fd94985a28c5d1f5de633b2916 100755 GIT binary patch delta 17466 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 P7$upEjHcKAV4Md4WE)A) delta 17774 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 diff --git a/package.json b/package.json index 30b97b6..906ddcb 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "leaflet-defaulticon-compatibility": "^0.1.2" }, "devDependencies": { + "@cloudflare/workers-types": "^4.20241022.0", "@sveltejs/adapter-cloudflare": "^4.7.4", "@sveltejs/kit": "^2.7.3", "@sveltejs/vite-plugin-svelte": "^4.0.0", diff --git a/src/app.d.ts b/src/app.d.ts index 743f07b..fb61326 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -6,7 +6,11 @@ declare global { // interface Locals {} // interface PageData {} // interface PageState {} - // interface Platform {} + interface Platform { + env?: { + TCL_GUESSR_KV: KVNamespace; + }; + } } } diff --git a/src/lib/index.ts b/src/lib/index.ts index 9d84954..192853b 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -35,17 +35,22 @@ let lazyMetro: [GeoJSON.Feature, string][] | null = null; let lazyTram: [GeoJSON.Feature, string][] | null = null; let lazyStops: GeoJSON.Feature[] | null = null; -const games: Record = {}; - -export function createGame(stop: GeoJSON.Feature): string { +export async function createGame(stop: GeoJSON.Feature, kv: KVNamespace): Promise { const uuid = crypto.randomUUID(); - games[uuid] = stop; + + await kv.put(`game:${uuid}`, JSON.stringify(stop), { expirationTtl: 600 }); + return uuid; } -export function stopGame(uuid: string): GeoJSON.Feature | null { - const stop = games[uuid]; - delete games[uuid]; +export async function stopGame( + uuid: string, + kv: KVNamespace, +): Promise { + const stop: GeoJSON.Feature | null = await kv.get(`game:${uuid}`, "json"); + + if (stop) await kv.delete(`game:${uuid}`); + return stop; } diff --git a/src/routes/api/check/+server.ts b/src/routes/api/check/+server.ts index 137e6f1..6d5635b 100644 --- a/src/routes/api/check/+server.ts +++ b/src/routes/api/check/+server.ts @@ -1,9 +1,13 @@ import { stopGame, type CheckData, type CheckResponse } from "$lib"; +import { error } from "@sveltejs/kit"; import type { RequestHandler } from "./$types"; -export const POST: RequestHandler = async ({ request }) => { +export const POST: RequestHandler = async ({ request, platform }) => { + const kv = platform?.env?.TCL_GUESSR_KV; + if (!kv) return error(500, "could not connect to kv"); + const data: CheckData = await request.json(); - const stop = stopGame(data.gameId); + const stop = await stopGame(data.gameId, kv); if (stop) { // GeoJSON data is LonLat, not LatLon diff --git a/src/routes/game/+page.server.ts b/src/routes/game/+page.server.ts index feb5753..ecd7593 100644 --- a/src/routes/game/+page.server.ts +++ b/src/routes/game/+page.server.ts @@ -2,7 +2,10 @@ import type { PageServerLoad } from "./$types"; import { createGame, getMetro, getStops, getTram, type GameData, type GameOptions } from "$lib"; import { error } from "@sveltejs/kit"; -export const load: PageServerLoad = async ({ fetch, url }) => { +export const load: PageServerLoad = async ({ fetch, url, platform }) => { + const kv = platform?.env?.TCL_GUESSR_KV; + if (!kv) return error(500, "could not connect to kv"); + const stops = await getStops(fetch); const mode = url.searchParams.get("mode"); @@ -40,7 +43,7 @@ export const load: PageServerLoad = async ({ fetch, url }) => { return error(400, "could not select random stop"); } - const gameId = createGame(randomStop); + const gameId = await createGame(randomStop, kv); const gameData: GameData = { lines: options.mode === "easy" || options.mode === "hard" ? lineColors : [], stops: options.mode === "easy" ? crossingStops : [], diff --git a/tsconfig.json b/tsconfig.json index fc93cbd..cccb10c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "moduleResolution": "bundler" + "moduleResolution": "bundler", + "types": ["@cloudflare/workers-types"] } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files diff --git a/wrangler.toml b/wrangler.toml index c6dd13b..7040cf6 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,3 +1,7 @@ name = "tcl-guessr" compatibility_date = "2024-09-25" pages_build_output_dir = ".svelte-kit/cloudflare" + +[[kv_namespaces]] +binding = "TCL_GUESSR_KV" +id = "b2d8980ac3a74a80854c35bf9569dbf8"