Spaces:
Runtime error
Runtime error
| import { fileURLToPath } from "node:url"; | |
| import { dirname, resolve } from "node:path"; | |
| import { apiFetch, isServerUp } from "./api.mjs"; | |
| const PROJECT_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); | |
| export class ServerOfflineError extends Error { | |
| constructor(message = "Server is offline and operation requires HTTP runtime") { | |
| super(message); | |
| this.name = "ServerOfflineError"; | |
| this.exitCode = 3; | |
| } | |
| } | |
| function makeHttpContext(opts) { | |
| return { | |
| kind: "http", | |
| api: (path, fetchOpts = {}) => apiFetch(path, { ...opts, ...fetchOpts }), | |
| baseUrl: opts.baseUrl, | |
| }; | |
| } | |
| async function importDbModules() { | |
| const [combos, recovery] = await Promise.all([ | |
| import(`${PROJECT_ROOT}/src/lib/db/combos.ts`), | |
| import(`${PROJECT_ROOT}/src/lib/db/recovery.ts`), | |
| ]); | |
| return { combos, recovery }; | |
| } | |
| async function makeDbContext() { | |
| const modules = await importDbModules(); | |
| return { kind: "db", db: modules }; | |
| } | |
| export async function withRuntime(fn, opts = {}) { | |
| const requireServer = opts.requireServer === true; | |
| const preferDb = opts.preferDb === true; | |
| if (!preferDb) { | |
| const up = await isServerUp(opts); | |
| if (up) { | |
| return await fn(makeHttpContext(opts)); | |
| } | |
| if (requireServer) { | |
| throw new ServerOfflineError(); | |
| } | |
| } | |
| return fn(await makeDbContext()); | |
| } | |
| export async function withHttp(fn, opts = {}) { | |
| const up = await isServerUp(opts); | |
| if (!up) throw new ServerOfflineError(); | |
| return fn(makeHttpContext(opts)); | |
| } | |
| export async function withDb(fn) { | |
| return fn(await makeDbContext()); | |
| } | |