diff --git a/packages/db/adapters/DittoPglite.test.ts b/packages/db/adapters/DittoPglite.test.ts index b0d9f4d1..4cea878f 100644 --- a/packages/db/adapters/DittoPglite.test.ts +++ b/packages/db/adapters/DittoPglite.test.ts @@ -1,14 +1,22 @@ -import { assertEquals } from '@std/assert'; +import { assertEquals, assertRejects } from '@std/assert'; import { DittoPglite } from './DittoPglite.ts'; Deno.test('DittoPglite', async () => { - const db = new DittoPglite('memory://'); + await using db = new DittoPglite('memory://'); await db.migrate(); assertEquals(db.poolSize, 1); assertEquals(db.availableConnections, 1); - - await db.kysely.destroy(); - await new Promise((resolve) => setTimeout(resolve, 100)); +}); + +Deno.test('DittoPglite query after closing', async () => { + const db = new DittoPglite('memory://'); + await db[Symbol.asyncDispose](); + + await assertRejects( + () => db.kysely.selectFrom('nostr_events').selectAll().execute(), + Error, + 'PGlite is closed', + ); }); diff --git a/packages/db/adapters/DittoPglite.ts b/packages/db/adapters/DittoPglite.ts index 7fcd5bab..bac1ebaa 100644 --- a/packages/db/adapters/DittoPglite.ts +++ b/packages/db/adapters/DittoPglite.ts @@ -47,6 +47,16 @@ export class DittoPglite implements DittoDB { } async [Symbol.asyncDispose](): Promise { - await this.kysely.destroy(); + try { + // FIXME: `kysely.destroy()` calls `pglite.close()` internally, but it doesn't work. + await this.pglite.close(); + await this.kysely.destroy(); + } catch (e) { + if (e instanceof Error && e.message === 'PGlite is closed') { + // Make dispose idempotent. + } else { + throw e; + } + } } }