diff --git a/src/plugin/ultrawork-db-model-override.bun-sqlite-unavailable.test.ts b/src/plugin/ultrawork-db-model-override.bun-sqlite-unavailable.test.ts index ef3d3c8bd..070a69956 100644 --- a/src/plugin/ultrawork-db-model-override.bun-sqlite-unavailable.test.ts +++ b/src/plugin/ultrawork-db-model-override.bun-sqlite-unavailable.test.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test" -import * as sharedModule from "../shared" +import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test" +import * as loggerModule from "../shared/logger" import { scheduleDeferredModelOverride, - __setBunSqliteImporterForTesting, __resetBunSqliteImporterForTesting, + __setBunSqliteImporterForTesting, } from "./ultrawork-db-model-override" function flushMicrotasks(depth: number): Promise { @@ -25,22 +25,22 @@ describe("scheduleDeferredModelOverride bun:sqlite unavailable", () => { let logCalls: Array<[string, Record?]> = [] beforeEach(() => { - // Simulate non-Bun runtime (Node/Electron): bun:sqlite import returns null - __setBunSqliteImporterForTesting(async () => null) - - spyOn(sharedModule, "log").mockImplementation((message: string, metadata?: Record) => { + spyOn(loggerModule, "log").mockImplementation((message: string, metadata?: Record) => { logCalls.push([message, metadata]) }) }) afterEach(() => { __resetBunSqliteImporterForTesting() - mock.restore() logCalls = [] }) - test("#given non-Bun runtime #when scheduleDeferredModelOverride is called #then it returns without throwing", async () => { + test("#given bun:sqlite import fails #when scheduleDeferredModelOverride is called #then it returns without throwing", async () => { //#given + __setBunSqliteImporterForTesting(async () => { + throw new Error("bun:sqlite unavailable") + }) + //#when expect(() => { scheduleDeferredModelOverride("msg_unavailable", { @@ -52,9 +52,9 @@ describe("scheduleDeferredModelOverride bun:sqlite unavailable", () => { await flushMicrotasks(5) //#then - const logMessages = logCalls.map(([msg]) => msg) - expect(logMessages).toContain( - "[ultrawork-db-override] bun:sqlite unavailable (non-Bun runtime), skipping deferred override", - ) + expect(logCalls).toContainEqual([ + "[ultrawork-db-override] bun:sqlite unavailable (non-Bun runtime), skipping", + undefined, + ]) }) }) diff --git a/src/plugin/ultrawork-db-model-override.ts b/src/plugin/ultrawork-db-model-override.ts index 59e4d58c3..cb44bfd93 100644 --- a/src/plugin/ultrawork-db-model-override.ts +++ b/src/plugin/ultrawork-db-model-override.ts @@ -6,20 +6,16 @@ import { log } from "../shared" type BunDatabase = import("bun:sqlite").Database type SqliteModule = { Database: new (path: string) => BunDatabase } -/** @internal test-only seam: override to simulate non-Bun runtime */ -let _bunSqliteImporter: () => Promise = () => - import("bun:sqlite").catch(() => null) as Promise +let bunSqliteImporter: () => Promise = () => import("bun:sqlite") -/** @internal test-only */ export function __setBunSqliteImporterForTesting( - impl: () => Promise, + importer: () => Promise, ): void { - _bunSqliteImporter = impl + bunSqliteImporter = importer } -/** @internal test-only */ export function __resetBunSqliteImporterForTesting(): void { - _bunSqliteImporter = () => import("bun:sqlite").catch(() => null) as Promise + bunSqliteImporter = () => import("bun:sqlite") } function getDbPath(): string { @@ -124,7 +120,6 @@ function retryViaMicrotask( * Session.updateMessage() to save the message first, then overwrites the model. * * Falls back to setTimeout(fn, 0) after 10 microtask attempts. - * */ export function scheduleDeferredModelOverride( messageId: string, @@ -132,16 +127,14 @@ export function scheduleDeferredModelOverride( variant?: string, ): void { queueMicrotask(async () => { - // Lazy-load bun:sqlite so this module can be imported under Node/Electron - // without crashing the ESM loader (bun: protocol is Bun-only). - const sqliteModule = await _bunSqliteImporter() - if (sqliteModule === null) { - log("[ultrawork-db-override] bun:sqlite unavailable (non-Bun runtime), skipping deferred override") + let DatabaseCtor: (new (path: string) => import("bun:sqlite").Database) | undefined + try { + DatabaseCtor = (await bunSqliteImporter()).Database + } catch { + log("[ultrawork-db-override] bun:sqlite unavailable (non-Bun runtime), skipping") return } - const { Database } = sqliteModule - const dbPath = getDbPath() if (!existsSync(dbPath)) { log("[ultrawork-db-override] DB not found, skipping deferred override") @@ -150,7 +143,7 @@ export function scheduleDeferredModelOverride( let db: BunDatabase try { - db = new Database(dbPath) + db = new DatabaseCtor(dbPath) } catch (error) { log("[ultrawork-db-override] Failed to open DB, skipping deferred override", { messageId,