summaryrefslogtreecommitdiffhomepage
path: root/packages/storage-sqlite/src/storage.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-27 01:12:40 +0900
committerAdam Malczewski <[email protected]>2026-06-27 01:12:40 +0900
commit98b0638838a8e754927d8c030ce8bded18d63e7d (patch)
tree0d4e21c3d4792fcd77e1040373b260e38efa34ce /packages/storage-sqlite/src/storage.ts
parentd92a4af6191d7d20acf861adf605ad0227b6b287 (diff)
parent61e45e60d699ed1ca46f94a8f181c92a940317c6 (diff)
downloaddispatch-98b0638838a8e754927d8c030ce8bded18d63e7d.tar.gz
dispatch-98b0638838a8e754927d8c030ce8bded18d63e7d.zip
Merge branch 'dev' into feature/heartbeat
# Conflicts: # packages/host-bin/package.json # packages/host-bin/src/main.ts # packages/session-orchestrator/src/orchestrator.ts # packages/system-prompt/src/service.test.ts # packages/system-prompt/src/service.ts # packages/system-prompt/src/types.ts # packages/transport-contract/package.json # packages/transport-http/package.json # packages/transport-http/src/app.test.ts # packages/transport-http/src/app.ts # packages/transport-http/src/extension.ts # packages/transport-http/tsconfig.json # tsconfig.json
Diffstat (limited to 'packages/storage-sqlite/src/storage.ts')
-rw-r--r--packages/storage-sqlite/src/storage.ts120
1 files changed, 60 insertions, 60 deletions
diff --git a/packages/storage-sqlite/src/storage.ts b/packages/storage-sqlite/src/storage.ts
index 2499664..94a826d 100644
--- a/packages/storage-sqlite/src/storage.ts
+++ b/packages/storage-sqlite/src/storage.ts
@@ -3,17 +3,17 @@ import type { StorageNamespace } from "@dispatch/kernel";
import { computePending, type Migration } from "./migrate.js";
export interface SqliteStorageBackend {
- readonly storage: (namespace: string) => StorageNamespace;
- readonly migrate: (namespace: string, migrations: readonly Migration[]) => Promise<void>;
- readonly close: () => void;
+ readonly storage: (namespace: string) => StorageNamespace;
+ readonly migrate: (namespace: string, migrations: readonly Migration[]) => Promise<void>;
+ readonly close: () => void;
}
export type StorageFactory = (opts: { path: string }) => SqliteStorageBackend;
export function createSqliteStorage(opts: { path: string }): SqliteStorageBackend {
- const db = new Database(opts.path);
- db.exec("PRAGMA journal_mode = WAL;");
- db.exec(`
+ const db = new Database(opts.path);
+ db.exec("PRAGMA journal_mode = WAL;");
+ db.exec(`
CREATE TABLE IF NOT EXISTS kv (
namespace TEXT NOT NULL,
key TEXT NOT NULL,
@@ -21,7 +21,7 @@ export function createSqliteStorage(opts: { path: string }): SqliteStorageBacken
PRIMARY KEY (namespace, key)
);
`);
- db.exec(`
+ db.exec(`
CREATE TABLE IF NOT EXISTS _migrations (
namespace TEXT NOT NULL,
version INTEGER NOT NULL,
@@ -31,62 +31,62 @@ export function createSqliteStorage(opts: { path: string }): SqliteStorageBacken
);
`);
- const getStmt = db.prepare("SELECT value FROM kv WHERE namespace = ?1 AND key = ?2");
- const setStmt = db.prepare(
- "INSERT OR REPLACE INTO kv (namespace, key, value) VALUES (?1, ?2, ?3)",
- );
- const deleteStmt = db.prepare("DELETE FROM kv WHERE namespace = ?1 AND key = ?2");
- const hasStmt = db.prepare("SELECT 1 FROM kv WHERE namespace = ?1 AND key = ?2");
- const keysAllStmt = db.prepare("SELECT key FROM kv WHERE namespace = ?1");
- const keysPrefixStmt = db.prepare("SELECT key FROM kv WHERE namespace = ?1 AND key LIKE ?2");
- const appliedVersionsStmt = db.prepare("SELECT version FROM _migrations WHERE namespace = ?1");
- const recordMigrationStmt = db.prepare(
- "INSERT INTO _migrations (namespace, version, name) VALUES (?1, ?2, ?3)",
- );
+ const getStmt = db.prepare("SELECT value FROM kv WHERE namespace = ?1 AND key = ?2");
+ const setStmt = db.prepare(
+ "INSERT OR REPLACE INTO kv (namespace, key, value) VALUES (?1, ?2, ?3)",
+ );
+ const deleteStmt = db.prepare("DELETE FROM kv WHERE namespace = ?1 AND key = ?2");
+ const hasStmt = db.prepare("SELECT 1 FROM kv WHERE namespace = ?1 AND key = ?2");
+ const keysAllStmt = db.prepare("SELECT key FROM kv WHERE namespace = ?1");
+ const keysPrefixStmt = db.prepare("SELECT key FROM kv WHERE namespace = ?1 AND key LIKE ?2");
+ const appliedVersionsStmt = db.prepare("SELECT version FROM _migrations WHERE namespace = ?1");
+ const recordMigrationStmt = db.prepare(
+ "INSERT INTO _migrations (namespace, version, name) VALUES (?1, ?2, ?3)",
+ );
- function storage(namespace: string): StorageNamespace {
- return {
- get: async (key: string) => {
- const row = getStmt.get(namespace, key) as { value: string } | null;
- return row?.value ?? null;
- },
- set: async (key: string, value: string) => {
- setStmt.run(namespace, key, value);
- },
- delete: async (key: string) => {
- deleteStmt.run(namespace, key);
- },
- has: async (key: string) => {
- return hasStmt.get(namespace, key) !== null;
- },
- keys: async (prefix?: string) => {
- if (prefix !== undefined) {
- const rows = keysPrefixStmt.all(namespace, `${prefix}%`) as { key: string }[];
- return rows.map((r) => r.key);
- }
- const rows = keysAllStmt.all(namespace) as { key: string }[];
- return rows.map((r) => r.key);
- },
- };
- }
+ function storage(namespace: string): StorageNamespace {
+ return {
+ get: async (key: string) => {
+ const row = getStmt.get(namespace, key) as { value: string } | null;
+ return row?.value ?? null;
+ },
+ set: async (key: string, value: string) => {
+ setStmt.run(namespace, key, value);
+ },
+ delete: async (key: string) => {
+ deleteStmt.run(namespace, key);
+ },
+ has: async (key: string) => {
+ return hasStmt.get(namespace, key) !== null;
+ },
+ keys: async (prefix?: string) => {
+ if (prefix !== undefined) {
+ const rows = keysPrefixStmt.all(namespace, `${prefix}%`) as { key: string }[];
+ return rows.map((r) => r.key);
+ }
+ const rows = keysAllStmt.all(namespace) as { key: string }[];
+ return rows.map((r) => r.key);
+ },
+ };
+ }
- async function migrate(namespace: string, migrations: readonly Migration[]): Promise<void> {
- const rows = appliedVersionsStmt.all(namespace) as { version: number }[];
- const applied = new Set(rows.map((r) => r.version));
- const pending = computePending(applied, migrations);
+ async function migrate(namespace: string, migrations: readonly Migration[]): Promise<void> {
+ const rows = appliedVersionsStmt.all(namespace) as { version: number }[];
+ const applied = new Set(rows.map((r) => r.version));
+ const pending = computePending(applied, migrations);
- for (const m of pending) {
- const runInTransaction = db.transaction(() => {
- db.exec(m.up);
- recordMigrationStmt.run(namespace, m.version, m.name);
- });
- runInTransaction();
- }
- }
+ for (const m of pending) {
+ const runInTransaction = db.transaction(() => {
+ db.exec(m.up);
+ recordMigrationStmt.run(namespace, m.version, m.name);
+ });
+ runInTransaction();
+ }
+ }
- function close(): void {
- db.close();
- }
+ function close(): void {
+ db.close();
+ }
- return { storage, migrate, close };
+ return { storage, migrate, close };
}