From b7ff71161752ab35f46a49aee0f1012540852b50 Mon Sep 17 00:00:00 2001 From: Rizky Date: Thu, 18 Jul 2024 22:48:10 +0700 Subject: [PATCH] add kv --- bun.lockb | Bin 117484 -> 117912 bytes package.json | 1 + pkgs/api/_deploy.ts | 17 ++++++--------- pkgs/api/_file.ts | 1 + pkgs/api/_kv.ts | 48 +++++++++++++++++++++++++++++++++++++++++++ pkgs/utils/global.ts | 2 ++ 6 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 pkgs/api/_kv.ts diff --git a/bun.lockb b/bun.lockb index 5ac24eeaaf22aec276577147d88ce29480e6b296..ba9c6deb7a0c80a88ab64ff73ee3fd0b81c2b974 100755 GIT binary patch delta 19286 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 delta 19040 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 a>7B7`zrToH&K8QQWvo}}_siMFHva=u4=0@f diff --git a/package.json b/package.json index 4ce5398..9cb8d28 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ }, "dependencies": { "brotli-wasm": "^2.0.1", + "bun-sqlite-key-value": "^1.4.5", "exit-hook": "^4.0.0", "firebase-admin": "^12.2.0", "prisma": "^5.17.0" diff --git a/pkgs/api/_deploy.ts b/pkgs/api/_deploy.ts index 0d959a3..47de049 100644 --- a/pkgs/api/_deploy.ts +++ b/pkgs/api/_deploy.ts @@ -1,17 +1,12 @@ -import { $ } from "execa"; import * as fs from "fs"; -import { - dirAsync, - readAsync, - removeAsync, - writeAsync -} from "fs-jetpack"; +import { dirAsync, readAsync, removeAsync, writeAsync } from "fs-jetpack"; import { apiContext } from "service-srv"; import { deploy } from "utils/deploy"; import { dir } from "utils/dir"; import { g } from "utils/global"; import { genEnv, parseEnv } from "utils/parse-env"; import { restartServer } from "utils/restart"; +import { $ } from "bun"; export const _ = { url: "/_deploy", @@ -84,7 +79,7 @@ export const _ = { return "ok"; case "db-gen": { - await $({ cwd: dir("app/db") })`bun prisma generate`; + await $`bun prisma generate`.cwd(dir("app/db")); res.send("ok"); setTimeout(() => { @@ -118,9 +113,9 @@ export const _ = { dir("app/db/.env"), `DATABASE_URL=${ENV.DATABASE_URL}` ); - await $({ cwd: dir("app/db") })`bun install`; - await $({ cwd: dir("app/db") })`bun prisma db pull --force`; - await $({ cwd: dir("app/db") })`bun prisma generate`; + await $`bun install`.cwd(dir("app/db")); + await $`bun prisma db pull --force`.cwd(dir("app/db")); + await $`bun prisma generate`.cwd(dir("app/db")); await Bun.write( dir(`${g.datadir}/db-ver`), Date.now().toString() diff --git a/pkgs/api/_file.ts b/pkgs/api/_file.ts index d3b7bab..83cb898 100644 --- a/pkgs/api/_file.ts +++ b/pkgs/api/_file.ts @@ -11,6 +11,7 @@ import { removeAsync, renameAsync, } from "fs-jetpack"; + export const _ = { url: "/_file/**", async api() { diff --git a/pkgs/api/_kv.ts b/pkgs/api/_kv.ts new file mode 100644 index 0000000..e500a79 --- /dev/null +++ b/pkgs/api/_kv.ts @@ -0,0 +1,48 @@ +import { BunSqliteKeyValue } from "bun-sqlite-key-value"; +import { apiContext } from "service-srv"; +import { dir } from "utils/dir"; +import { g } from "utils/global"; + +export const _ = { + url: "/_kv/**", + raw: true, + async api() { + const { req } = apiContext(this); + + if (!g.kv) { + g.kv = new BunSqliteKeyValue(dir(`${g.datadir}/db-kv.sqlite`)); + } + + try { + const parts = req.params._.split("/"); + switch (parts[0]) { + case "set": { + const body = await req.json(); + if (typeof parts[1] === "string" && typeof body !== "undefined") { + g.kv.set(parts[1], body); + + return new Response(JSON.stringify({ status: "ok" }), { + headers: { "content-type": "application/json" }, + }); + } + + return new Response( + JSON.stringify({ status: "failed", reason: "no key or body" }), + { + headers: { "content-type": "application/json" }, + } + ); + } + case "get": { + return new Response(JSON.stringify(g.kv.get(parts[1])), { + headers: { "content-type": "application/json" }, + }); + } + } + } catch (e) {} + + return new Response(JSON.stringify({ status: "failed" }), { + headers: { "content-type": "application/json" }, + }); + }, +}; diff --git a/pkgs/utils/global.ts b/pkgs/utils/global.ts index d4a9f41..6bc52c8 100644 --- a/pkgs/utils/global.ts +++ b/pkgs/utils/global.ts @@ -6,6 +6,7 @@ import { PrismaClient } from "../../app/db/db"; import admin from "firebase-admin"; import { Database } from "bun:sqlite"; import { prodIndex } from "./prod-index"; +import { BunSqliteKeyValue } from "bun-sqlite-key-value"; type SingleRoute = { url: string; @@ -39,6 +40,7 @@ type PrasiServer = { export const g = global as unknown as { db: PrismaClient; + kv: BunSqliteKeyValue; dburl: string; datadir: string; mode: "dev" | "prod";