From 7c99ae2d26d40928b10e4e76eedd436f04f356c6 Mon Sep 17 00:00:00 2001 From: digua Date: Mon, 11 May 2026 19:45:45 +0800 Subject: [PATCH] feat(node-runtime): add BetterSqliteAdapter implementing DatabaseAdapter Phase 1.2: create @openchatlab/node-runtime package with better-sqlite3 adapter that implements the DatabaseAdapter interface from core. Also add pragma() method to the DatabaseAdapter interface. --- .../core/src/interfaces/database-adapter.ts | 5 ++ packages/node-runtime/package.json | 11 +++ .../src/better-sqlite3-adapter.ts | 74 +++++++++++++++++++ packages/node-runtime/src/index.ts | 8 ++ tsconfig.node.json | 3 +- 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 packages/node-runtime/package.json create mode 100644 packages/node-runtime/src/better-sqlite3-adapter.ts create mode 100644 packages/node-runtime/src/index.ts diff --git a/packages/core/src/interfaces/database-adapter.ts b/packages/core/src/interfaces/database-adapter.ts index a62d7efb..040f8b22 100644 --- a/packages/core/src/interfaces/database-adapter.ts +++ b/packages/core/src/interfaces/database-adapter.ts @@ -56,6 +56,11 @@ export interface DatabaseAdapter { */ transaction(fn: () => T): T + /** + * 执行 PRAGMA 命令 + */ + pragma(pragma: string): unknown + /** * 关闭数据库连接 */ diff --git a/packages/node-runtime/package.json b/packages/node-runtime/package.json new file mode 100644 index 00000000..1554c5f9 --- /dev/null +++ b/packages/node-runtime/package.json @@ -0,0 +1,11 @@ +{ + "name": "@openchatlab/node-runtime", + "version": "0.0.0", + "private": true, + "description": "ChatLab Node.js 运行时适配器:better-sqlite3、文件系统、路径管理", + "main": "./src/index.ts", + "types": "./src/index.ts", + "dependencies": { + "@openchatlab/core": "workspace:*" + } +} diff --git a/packages/node-runtime/src/better-sqlite3-adapter.ts b/packages/node-runtime/src/better-sqlite3-adapter.ts new file mode 100644 index 00000000..dafe2fb2 --- /dev/null +++ b/packages/node-runtime/src/better-sqlite3-adapter.ts @@ -0,0 +1,74 @@ +/** + * DatabaseAdapter 的 better-sqlite3 实现 + * + * 薄包装层:better-sqlite3 的 API 与 DatabaseAdapter 接口天然匹配, + * 本适配器主要做类型桥接,几乎零额外逻辑。 + */ + +import Database from 'better-sqlite3' +import type { DatabaseAdapter, PreparedStatement, RunResult } from '@openchatlab/core' + +class BetterSqlitePreparedStatement implements PreparedStatement { + constructor(private stmt: Database.Statement) {} + + get(...params: unknown[]): Record | undefined { + return this.stmt.get(...params) as Record | undefined + } + + all(...params: unknown[]): Record[] { + return this.stmt.all(...params) as Record[] + } + + run(...params: unknown[]): RunResult { + const result = this.stmt.run(...params) + return { + changes: result.changes, + lastInsertRowid: result.lastInsertRowid, + } + } +} + +/** + * 基于 better-sqlite3 的 DatabaseAdapter 实现 + */ +export class BetterSqliteAdapter implements DatabaseAdapter { + readonly?: boolean + + constructor(private db: Database.Database) { + this.readonly = db.readonly + } + + exec(sql: string): void { + this.db.exec(sql) + } + + prepare(sql: string): PreparedStatement { + return new BetterSqlitePreparedStatement(this.db.prepare(sql)) + } + + transaction(fn: () => T): T { + return this.db.transaction(fn)() + } + + pragma(pragma: string): unknown { + return this.db.pragma(pragma) + } + + close(): void { + this.db.close() + } +} + +/** + * 从文件路径打开数据库并返回适配器 + */ +export function openBetterSqliteDatabase( + filePath: string, + options?: { readonly?: boolean } +): BetterSqliteAdapter { + const db = new Database(filePath, { + readonly: options?.readonly ?? false, + }) + db.pragma('journal_mode = WAL') + return new BetterSqliteAdapter(db) +} diff --git a/packages/node-runtime/src/index.ts b/packages/node-runtime/src/index.ts new file mode 100644 index 00000000..10102893 --- /dev/null +++ b/packages/node-runtime/src/index.ts @@ -0,0 +1,8 @@ +/** + * @openchatlab/node-runtime + * + * Node.js 运行时适配器,提供 better-sqlite3 数据库适配器、 + * 路径管理等平台特定实现。 + */ + +export { BetterSqliteAdapter, openBetterSqliteDatabase } from './better-sqlite3-adapter' diff --git a/tsconfig.node.json b/tsconfig.node.json index d1a1c1fb..943bd6f9 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -8,7 +8,8 @@ "electron/shared/**/*", "src/types/**/*", "packages/shared-types/**/*", - "packages/core/**/*" + "packages/core/**/*", + "packages/node-runtime/**/*" ], "compilerOptions": { "composite": true,