UNPKG

@metamask/kernel-store

Version:
1 lines 16.2 kB
{"version":3,"file":"nodejs.mjs","sourceRoot":"","sources":["../../src/sqlite/nodejs.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from '@metamask/logger';\nimport type { Database as SqliteDatabase } from 'better-sqlite3';\n// eslint-disable-next-line @typescript-eslint/naming-convention\nimport Sqlite from 'better-sqlite3';\nimport { mkdir } from 'fs/promises';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\n\nimport {\n SQL_QUERIES,\n DEFAULT_DB_FILENAME,\n assertSafeIdentifier,\n} from './common.ts';\nimport { getDBFolder } from './env.ts';\nimport type { KVStore, VatStore, KernelDatabase } from '../types.ts';\n\nexport type Database = SqliteDatabase & {\n // stack of active savepoint names\n _spStack: string[];\n};\n\n/**\n * Ensure that SQLite is initialized.\n *\n * @param dbFilename - The filename of the database to use.\n * @param logger - The logger to use, if any.\n * @returns The SQLite database object.\n */\nasync function initDB(dbFilename: string, logger?: Logger): Promise<Database> {\n const dbPath = await getDBFilename(dbFilename);\n logger?.debug('dbPath:', dbPath);\n const db = new Sqlite(dbPath, {\n verbose: (logger ? logger.info.bind(logger) : undefined) as\n | ((...args: unknown[]) => void)\n | undefined,\n }) as Database;\n db._spStack = [];\n return db;\n}\n\n/**\n * Makes a persistent {@link KVStore} on top of a SQLite database.\n *\n * @param db - The (open) database to use.\n * @returns A key/value store using the given database.\n */\nfunction makeKVStore(db: Database): KVStore {\n const sqlKVInit = db.prepare(SQL_QUERIES.CREATE_TABLE);\n sqlKVInit.run();\n\n const sqlKVGet = db.prepare<[string], string>(SQL_QUERIES.GET);\n sqlKVGet.pluck(true);\n\n /**\n * Read a key's value from the database.\n *\n * @param key - A key to fetch.\n * @param required - True if it is an error for the entry not to be there.\n * @returns The value at that key.\n */\n function kvGet(key: string, required: boolean): string | undefined {\n const result = sqlKVGet.get(key);\n if (required && !result) {\n throw Error(`no record matching key '${key}'`);\n }\n return result;\n }\n\n const sqlKVGetNextKey = db.prepare(SQL_QUERIES.GET_NEXT);\n sqlKVGetNextKey.pluck(true);\n\n /**\n * Get the lexicographically next key in the KV store after a given key.\n *\n * @param previousKey - The key you want to know the key after.\n *\n * @returns The key after `previousKey`, or undefined if `previousKey` is the\n * last key in the store.\n */\n function kvGetNextKey(previousKey: string): string | undefined {\n if (typeof previousKey !== 'string') {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`previousKey ${previousKey} must be a string`);\n }\n return sqlKVGetNextKey.get(previousKey) as string | undefined;\n }\n\n const sqlKVSet = db.prepare(SQL_QUERIES.SET);\n\n /**\n * Set the value associated with a key in the database.\n *\n * @param key - A key to assign.\n * @param value - The value to assign to it.\n */\n function kvSet(key: string, value: string): void {\n sqlKVSet.run(key, value);\n }\n\n const sqlKVDelete = db.prepare(SQL_QUERIES.DELETE);\n\n /**\n * Delete a key from the database.\n *\n * @param key - The key to remove.\n */\n function kvDelete(key: string): void {\n sqlKVDelete.run(key);\n }\n\n return {\n get: (key) => kvGet(key, false),\n getNextKey: kvGetNextKey,\n getRequired: (key) => kvGet(key, true) as string,\n set: kvSet,\n delete: kvDelete,\n };\n}\n\n/**\n * Makes a {@link KernelDatabase} for low-level persistent storage.\n *\n * @param options - The options for the database.\n * @param options.dbFilename - The filename of the database to use. Defaults to {@link DEFAULT_DB_FILENAME}.\n * @param options.logger - A logger to use.\n * @returns The key/value store to base the kernel store on.\n */\nexport async function makeSQLKernelDatabase({\n dbFilename,\n logger,\n}: {\n dbFilename?: string | undefined;\n logger?: Logger;\n}): Promise<KernelDatabase> {\n const db = await initDB(dbFilename ?? DEFAULT_DB_FILENAME, logger);\n\n const kvStore = makeKVStore(db);\n\n const sqlKVInitVS = db.prepare(SQL_QUERIES.CREATE_TABLE_VS);\n sqlKVInitVS.run();\n\n const sqlKVClear = db.prepare(SQL_QUERIES.CLEAR);\n const sqlKVClearVS = db.prepare(SQL_QUERIES.CLEAR_VS);\n const sqlVatstoreGetAll = db.prepare(SQL_QUERIES.GET_ALL_VS);\n const sqlVatstoreSet = db.prepare(SQL_QUERIES.SET_VS);\n const sqlVatstoreDelete = db.prepare(SQL_QUERIES.DELETE_VS);\n const sqlVatstoreDeleteAll = db.prepare(SQL_QUERIES.DELETE_VS_ALL);\n const sqlBeginTransaction = db.prepare(SQL_QUERIES.BEGIN_TRANSACTION);\n const sqlCommitTransaction = db.prepare(SQL_QUERIES.COMMIT_TRANSACTION);\n const sqlAbortTransaction = db.prepare(SQL_QUERIES.ABORT_TRANSACTION);\n\n /**\n * Begin a transaction if not already in one\n *\n * @returns True if a new transaction was started, false if already in one\n */\n function beginIfNeeded(): boolean {\n if (db.inTransaction) {\n return false;\n }\n sqlBeginTransaction.run();\n return true;\n }\n\n /**\n * Commit a transaction if one is active and no savepoints remain\n */\n function commitIfNeeded(): void {\n if (db.inTransaction && db._spStack.length === 0) {\n sqlCommitTransaction.run();\n }\n }\n\n /**\n * Rollback a transaction\n */\n function rollbackIfNeeded(): void {\n if (db.inTransaction) {\n sqlAbortTransaction.run();\n db._spStack.length = 0;\n }\n }\n\n /**\n * Delete everything from the database.\n */\n function kvClear(): void {\n sqlKVClear.run();\n sqlKVClearVS.run();\n }\n\n /**\n * Execute an arbitrary query and return the results.\n *\n * @param sql - The query to execute.\n * @returns The results\n */\n function kvExecuteQuery(sql: string): Record<string, string>[] {\n const query = db.prepare(sql);\n return query.all() as Record<string, string>[];\n }\n\n /**\n * Create a new VatStore for a vat.\n *\n * @param vatID - The vat for which this is being done.\n *\n * @returns a a VatStore object for the given vat.\n */\n function makeVatStore(vatID: string): VatStore {\n /**\n * Fetch all the data in the vatstore.\n *\n * @returns the vatstore contents as a key-value Map.\n */\n function getKVData(): [string, string][] {\n const result: [string, string][] = [];\n type KVPair = {\n key: string;\n value: string;\n };\n for (const kvPair of sqlVatstoreGetAll.iterate(vatID)) {\n const { key, value } = kvPair as KVPair;\n result.push([key, value]);\n }\n return result;\n }\n\n /**\n * Update the state of the vatstore\n *\n * @param sets - A map of key values that have been changed.\n * @param deletes - A set of keys that have been deleted.\n */\n function updateKVData(sets: [string, string][], deletes: string[]): void {\n db.transaction(() => {\n for (const [key, value] of sets) {\n sqlVatstoreSet.run(vatID, key, value);\n }\n for (const value of deletes) {\n sqlVatstoreDelete.run(vatID, value);\n }\n })();\n }\n\n return {\n getKVData,\n updateKVData,\n };\n }\n\n /**\n * Delete an entire VatStore.\n *\n * @param vatId - The vat whose store is to be deleted.\n */\n function deleteVatStore(vatId: string): void {\n sqlVatstoreDeleteAll.run(vatId);\n }\n\n /**\n * Create a savepoint in the database.\n *\n * @param name - The name of the savepoint.\n */\n function createSavepoint(name: string): void {\n // We must be in a transaction when creating the savepoint or releasing it\n // later will cause an autocommit.\n // See https://github.com/Agoric/agoric-sdk/issues/8423\n beginIfNeeded();\n assertSafeIdentifier(name);\n const query = SQL_QUERIES.CREATE_SAVEPOINT.replace('%NAME%', name);\n db.exec(query);\n db._spStack.push(name);\n }\n\n /**\n * Rollback to a savepoint in the database.\n *\n * @param name - The name of the savepoint.\n */\n function rollbackSavepoint(name: string): void {\n assertSafeIdentifier(name);\n const idx = db._spStack.lastIndexOf(name);\n if (idx < 0) {\n throw new Error(`No such savepoint: ${name}`);\n }\n const query = SQL_QUERIES.ROLLBACK_SAVEPOINT.replace('%NAME%', name);\n db.exec(query);\n db._spStack.splice(idx);\n if (db._spStack.length === 0) {\n rollbackIfNeeded();\n }\n }\n\n /**\n * Release a savepoint in the database.\n *\n * @param name - The name of the savepoint.\n */\n function releaseSavepoint(name: string): void {\n assertSafeIdentifier(name);\n const idx = db._spStack.lastIndexOf(name);\n if (idx < 0) {\n throw new Error(`No such savepoint: ${name}`);\n }\n const query = SQL_QUERIES.RELEASE_SAVEPOINT.replace('%NAME%', name);\n db.exec(query);\n db._spStack.splice(idx);\n if (db._spStack.length === 0) {\n commitIfNeeded();\n }\n }\n\n return {\n kernelKVStore: kvStore,\n executeQuery: kvExecuteQuery,\n clear: db.transaction(kvClear),\n makeVatStore,\n deleteVatStore,\n createSavepoint,\n rollbackSavepoint,\n releaseSavepoint,\n };\n}\n\n/**\n * Get the filename for a database.\n *\n * @param label - A label for the database.\n * @returns The filename for the database.\n */\nexport async function getDBFilename(label: string): Promise<string> {\n if (label.startsWith(':')) {\n return label;\n }\n const dbRoot = join(tmpdir(), './ocap-sqlite', getDBFolder());\n await mkdir(dbRoot, { recursive: true });\n return join(dbRoot, label);\n}\n"]}