diff --git a/package.json b/package.json index 552d435b..ed36f172 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,6 @@ "ora": "^7.0.1", "pocketbase": "^0.19.0", "semver": "^7.5.4", - "sqlite": "^4.2.1", "sqlite3": "^5.1.6", "tail": "^2.2.6", "tmp": "^0.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 089e355f..5e1051ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,9 +89,6 @@ importers: semver: specifier: ^7.5.4 version: 7.5.4 - sqlite: - specifier: ^4.2.1 - version: 4.2.1 sqlite3: specifier: ^5.1.6 version: 5.1.6 @@ -6339,10 +6336,6 @@ packages: - supports-color dev: false - /sqlite@4.2.1: - resolution: {integrity: sha512-Tll0Ndvnwkuv5Hn6WIbh26rZiYQORuH1t5m/or9LUpSmDmmyFG89G9fKrSeugMPxwmEIXoVxqTun4LbizTs4uw==} - dev: false - /ssh2@1.14.0: resolution: {integrity: sha512-AqzD1UCqit8tbOKoj6ztDDi1ffJZ2rV2SwlgrVVrHPkV5vWqGJOVp5pmtj18PunkPJAuKQsnInyKV+/Nb2bUnA==} engines: {node: '>=10.16.0'} diff --git a/src/server.ts b/src/server.ts index 47bfc79f..fba1ba10 100644 --- a/src/server.ts +++ b/src/server.ts @@ -14,13 +14,13 @@ import { PocketbaseReleaseVersionService, PocketbaseService, PortService, + SqliteService, centralDbService, ftpService, instanceService, ipWhitelistService, proxyService, realtimeLog, - sqliteService, } from '$services' import { LogLevelName, LoggerService } from '$shared' import EventSource from 'eventsource' @@ -97,7 +97,7 @@ global.EventSource = EventSource coreInternalUrl: url, }) await ipWhitelistService({}) - await sqliteService({}) + await SqliteService({}) await realtimeLog({}) await instanceService({ instanceApiCheckIntervalMs: 50, diff --git a/src/services/SqliteService/index.ts b/src/services/SqliteService/index.ts index 3ef9c1d1..7c610863 100644 --- a/src/services/SqliteService/index.ts +++ b/src/services/SqliteService/index.ts @@ -1,38 +1,18 @@ import { createCleanupManager, - createEvent, LoggerService, mkSingleton, serialAsyncExecutionGuard, SingletonBaseConfig, } from '$shared' -import { Database, open } from 'sqlite' -import { JsonObject } from 'type-fest' +import knex from 'knex' -export type SqliteUnsubscribe = () => void -export type SqliteChangeHandler = ( - e: SqliteChangeEvent, -) => void -export type SqliteEventType = 'update' | 'insert' | 'delete' -export type SqliteChangeEvent = { - table: string - action: SqliteEventType - record: TRecord -} -export type SqliteServiceApi = { - all: Database['all'] - get: Database['get'] - migrate: Database['migrate'] - exec: Database['exec'] - subscribe: ( - cb: SqliteChangeHandler, - ) => SqliteUnsubscribe -} +export type SqliteServiceApi = ReturnType export type SqliteServiceConfig = SingletonBaseConfig & {} -export type SqliteService = ReturnType +export type SqliteService = ReturnType -export const sqliteService = mkSingleton((config: SqliteServiceConfig) => { +export const SqliteService = mkSingleton((config: SqliteServiceConfig) => { const { dbg, trace } = LoggerService().create(`sqliteService`) const connections: { [_: string]: SqliteServiceApi } = {} @@ -53,52 +33,21 @@ export const sqliteService = mkSingleton((config: SqliteServiceConfig) => { dbg(`Not yet opened`) const api = await (async () => { - const db = await open({ filename, driver: Database }) - dbg(`Database opened`) - db.db.addListener( - 'change', - async ( - eventType: SqliteEventType, - database: string, - table: string, - rowId: number, - ) => { - trace(`Got a raw change event`, { - eventType, - database, - table, - rowId, - }) - if (eventType === 'delete') return // Not supported + dbg(`Opening ${filename}`) - const record = await db.get( - `select * from ${table} where rowid = '${rowId}'`, - ) - const e: SqliteChangeEvent = { - table, - action: eventType, - record, - } - fireChange(e) + const db = knex({ + client: 'sqlite3', // or 'better-sqlite3' + connection: { + filename, }, - ) + }) cm.add(() => { dbg(`Closing connection`) - db.db.removeAllListeners() - db.close() + db.destroy() }) - db.migrate - const [onChange, fireChange] = createEvent>() - const api: SqliteServiceApi = { - all: db.all.bind(db), - get: db.get.bind(db), - migrate: db.migrate.bind(db), - exec: db.exec.bind(db), - subscribe: onChange, - } - return api + return db })().catch(error) if (!api) { throw new Error(`Unable to connect to SQLite`)