import assert from "node:assert/strict"; import fs from "node:fs"; import path from "node:path"; import process from "node:process"; import url from "node:url"; import util from "node:util"; import sqlite from "./sqlite.cjs"; import * as u from "./utils.mjs"; import * as accretion from "./accretion.mjs"; export const promisifyDb = dbHandle => ({ ref: dbHandle, all: util.promisify((...args) => dbHandle.all(...args)), exec: util.promisify((...args) => dbHandle.exec(...args)), run: util.promisify((...args) => dbHandle.run(...args)), each: (...args) => new Promise((resolve, reject) => { const cb = args[args.length - 1]; dbHandle.each( ...args.slice(0, args.length - 1), (err, row) => err ? reject(err) : cb(row), (err, data) => err ? reject(err) : resolve(data), ); }), prepare: (...args) => new Promise((resolve, reject) => { const mkStmt = stmtRef => ({ ref: stmtRef, run: util.promisify((...args) => stmtRef.run(...args)), finalize: util.promisify((...args) => stmtRef.finalize(...args)), }); const ref = dbHandle.prepare( ...args, err => err ? reject(err) : resolve(mkStmt(ref)), ); }), }); export const open = (...args) => new Promise((resolve, reject) => { const dbName = args[0]; assert(dbName); const ref = promisifyDb(new sqlite.Database( ...args, err => err ? reject(err) : resolve(ref), )); }); export let handle = null; export const init = async (logFn, dbName = process.env.PAPO_DB_PATH || ":memory:") => { handle = await open(dbName); await accretion.runMigrations(logFn, handle); };