@enbox/dwn-server 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/esm/src/admin/admin-api.d.ts +5 -1
  2. package/dist/esm/src/admin/admin-api.d.ts.map +1 -1
  3. package/dist/esm/src/admin/admin-api.js +327 -7
  4. package/dist/esm/src/admin/admin-api.js.map +1 -1
  5. package/dist/esm/src/admin/admin-auth.d.ts +21 -3
  6. package/dist/esm/src/admin/admin-auth.d.ts.map +1 -1
  7. package/dist/esm/src/admin/admin-auth.js +17 -9
  8. package/dist/esm/src/admin/admin-auth.js.map +1 -1
  9. package/dist/esm/src/admin/admin-passkey-store.d.ts +68 -0
  10. package/dist/esm/src/admin/admin-passkey-store.d.ts.map +1 -0
  11. package/dist/esm/src/admin/admin-passkey-store.js +132 -0
  12. package/dist/esm/src/admin/admin-passkey-store.js.map +1 -0
  13. package/dist/esm/src/admin/admin-session.d.ts +35 -0
  14. package/dist/esm/src/admin/admin-session.d.ts.map +1 -0
  15. package/dist/esm/src/admin/admin-session.js +91 -0
  16. package/dist/esm/src/admin/admin-session.js.map +1 -0
  17. package/dist/esm/src/admin/audit-log.d.ts.map +1 -1
  18. package/dist/esm/src/admin/audit-log.js +5 -43
  19. package/dist/esm/src/admin/audit-log.js.map +1 -1
  20. package/dist/esm/src/admin/index.d.ts +5 -1
  21. package/dist/esm/src/admin/index.d.ts.map +1 -1
  22. package/dist/esm/src/admin/index.js +2 -0
  23. package/dist/esm/src/admin/index.js.map +1 -1
  24. package/dist/esm/src/admin/types.d.ts +22 -0
  25. package/dist/esm/src/admin/types.d.ts.map +1 -1
  26. package/dist/esm/src/admin/webhook-manager.d.ts.map +1 -1
  27. package/dist/esm/src/admin/webhook-manager.js +11 -10
  28. package/dist/esm/src/admin/webhook-manager.js.map +1 -1
  29. package/dist/esm/src/config.d.ts +18 -0
  30. package/dist/esm/src/config.d.ts.map +1 -1
  31. package/dist/esm/src/config.js +18 -0
  32. package/dist/esm/src/config.js.map +1 -1
  33. package/dist/esm/src/dwn-server.d.ts.map +1 -1
  34. package/dist/esm/src/dwn-server.js +46 -11
  35. package/dist/esm/src/dwn-server.js.map +1 -1
  36. package/dist/esm/src/http-api.d.ts +4 -0
  37. package/dist/esm/src/http-api.d.ts.map +1 -1
  38. package/dist/esm/src/http-api.js +14 -4
  39. package/dist/esm/src/http-api.js.map +1 -1
  40. package/dist/esm/src/migrations/001-initial-server-schema.d.ts +21 -0
  41. package/dist/esm/src/migrations/001-initial-server-schema.d.ts.map +1 -0
  42. package/dist/esm/src/migrations/001-initial-server-schema.js +97 -0
  43. package/dist/esm/src/migrations/001-initial-server-schema.js.map +1 -0
  44. package/dist/esm/src/migrations/index.d.ts +13 -0
  45. package/dist/esm/src/migrations/index.d.ts.map +1 -0
  46. package/dist/esm/src/migrations/index.js +5 -0
  47. package/dist/esm/src/migrations/index.js.map +1 -0
  48. package/dist/esm/src/registration/registration-store.d.ts +4 -0
  49. package/dist/esm/src/registration/registration-store.d.ts.map +1 -1
  50. package/dist/esm/src/registration/registration-store.js +11 -34
  51. package/dist/esm/src/registration/registration-store.js.map +1 -1
  52. package/dist/esm/src/server-migration-runner.d.ts +23 -0
  53. package/dist/esm/src/server-migration-runner.d.ts.map +1 -0
  54. package/dist/esm/src/server-migration-runner.js +57 -0
  55. package/dist/esm/src/server-migration-runner.js.map +1 -0
  56. package/dist/esm/src/storage.d.ts +15 -0
  57. package/dist/esm/src/storage.d.ts.map +1 -1
  58. package/dist/esm/src/storage.js +135 -17
  59. package/dist/esm/src/storage.js.map +1 -1
  60. package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts +11 -1
  61. package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts.map +1 -1
  62. package/dist/esm/src/web5-connect/sql-ttl-cache.js +19 -20
  63. package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -1
  64. package/dist/esm/src/web5-connect/web5-connect-server.d.ts +10 -3
  65. package/dist/esm/src/web5-connect/web5-connect-server.d.ts.map +1 -1
  66. package/dist/esm/src/web5-connect/web5-connect-server.js +10 -4
  67. package/dist/esm/src/web5-connect/web5-connect-server.js.map +1 -1
  68. package/package.json +3 -2
  69. package/src/admin/admin-api.ts +403 -10
  70. package/src/admin/admin-auth.ts +38 -9
  71. package/src/admin/admin-passkey-store.ts +190 -0
  72. package/src/admin/admin-session.ts +116 -0
  73. package/src/admin/audit-log.ts +7 -44
  74. package/src/admin/index.ts +5 -0
  75. package/src/admin/types.ts +28 -0
  76. package/src/admin/webhook-manager.ts +12 -10
  77. package/src/config.ts +21 -0
  78. package/src/dwn-server.ts +49 -11
  79. package/src/http-api.ts +20 -5
  80. package/src/migrations/001-initial-server-schema.ts +114 -0
  81. package/src/migrations/index.ts +18 -0
  82. package/src/registration/registration-store.ts +13 -36
  83. package/src/server-migration-runner.ts +74 -0
  84. package/src/storage.ts +145 -17
  85. package/src/web5-connect/sql-ttl-cache.ts +21 -22
  86. package/src/web5-connect/web5-connect-server.ts +14 -5
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Baseline server migration: creates all DWN server admin and cache tables.
3
+ *
4
+ * Tables:
5
+ * - `registeredTenants`: tenant registration data
6
+ * - `tenantQuotas`: per-tenant storage quotas
7
+ * - `adminAuditLog`: append-only admin event log
8
+ * - `adminWebhooks`: webhook registrations
9
+ * - `adminPasskeys`: WebAuthn admin passkeys
10
+ * - `cacheEntries`: TTL-based key/value cache (Web5 Connect state, etc.)
11
+ */
12
+ export const migration001InitialServerSchema = (dialect) => ({
13
+ async up(db) {
14
+ // ─── registeredTenants ────────────────────────────────────────────
15
+ await db.schema
16
+ .createTable('registeredTenants')
17
+ .ifNotExists()
18
+ .addColumn('did', 'text', (col) => col.primaryKey())
19
+ .addColumn('termsOfServiceHash', 'text')
20
+ .addColumn('suspended', 'integer', (col) => col.defaultTo(0))
21
+ .addColumn('accountId', 'text')
22
+ .addColumn('registrationType', 'text')
23
+ .addColumn('registeredAt', 'text')
24
+ .addColumn('metadata', 'text')
25
+ .execute();
26
+ // ─── tenantQuotas ─────────────────────────────────────────────────
27
+ await db.schema
28
+ .createTable('tenantQuotas')
29
+ .ifNotExists()
30
+ .addColumn('did', 'text', (col) => col.primaryKey())
31
+ .addColumn('maxMessages', 'integer', (col) => col.defaultTo(0))
32
+ .addColumn('maxStorageBytes', 'bigint', (col) => col.defaultTo(0))
33
+ .execute();
34
+ // ─── adminAuditLog ────────────────────────────────────────────────
35
+ let auditTable = db.schema
36
+ .createTable('adminAuditLog')
37
+ .ifNotExists()
38
+ .addColumn('timestamp', 'text', (col) => col.notNull())
39
+ .addColumn('actor', 'text', (col) => col.notNull())
40
+ .addColumn('action', 'text', (col) => col.notNull())
41
+ .addColumn('target', 'text')
42
+ .addColumn('detail', 'text');
43
+ auditTable = dialect.addAutoIncrementingColumn(auditTable, 'id', (col) => col.primaryKey());
44
+ await auditTable.execute();
45
+ try {
46
+ await db.schema.createIndex('index_audit_timestamp')
47
+ .ifNotExists().on('adminAuditLog').column('timestamp').execute();
48
+ }
49
+ catch { /* index already exists */ }
50
+ try {
51
+ await db.schema.createIndex('index_audit_target')
52
+ .ifNotExists().on('adminAuditLog').column('target').execute();
53
+ }
54
+ catch { /* index already exists */ }
55
+ try {
56
+ await db.schema.createIndex('index_audit_action')
57
+ .ifNotExists().on('adminAuditLog').column('action').execute();
58
+ }
59
+ catch { /* index already exists */ }
60
+ // ─── adminWebhooks ────────────────────────────────────────────────
61
+ await db.schema
62
+ .createTable('adminWebhooks')
63
+ .ifNotExists()
64
+ .addColumn('id', 'text', (col) => col.primaryKey())
65
+ .addColumn('url', 'text', (col) => col.notNull())
66
+ .addColumn('events', 'text', (col) => col.notNull())
67
+ .addColumn('secret', 'text')
68
+ .addColumn('createdAt', 'text', (col) => col.notNull())
69
+ .execute();
70
+ // ─── adminPasskeys ────────────────────────────────────────────────
71
+ await db.schema
72
+ .createTable('adminPasskeys')
73
+ .ifNotExists()
74
+ .addColumn('id', 'text', (col) => col.primaryKey())
75
+ .addColumn('name', 'text', (col) => col.notNull())
76
+ .addColumn('publicKey', 'text', (col) => col.notNull())
77
+ .addColumn('counter', 'integer', (col) => col.notNull().defaultTo(0))
78
+ .addColumn('transports', 'text', (col) => col.notNull().defaultTo('[]'))
79
+ .addColumn('createdAt', 'text', (col) => col.notNull())
80
+ .addColumn('lastUsedAt', 'text')
81
+ .execute();
82
+ // ─── cacheEntries (TTL cache) ─────────────────────────────────────
83
+ await db.schema
84
+ .createTable('cacheEntries')
85
+ .ifNotExists()
86
+ .addColumn('key', 'varchar(512)', (col) => col.primaryKey())
87
+ .addColumn('value', 'text', (col) => col.notNull())
88
+ .addColumn('expiry', 'bigint', (col) => col.notNull())
89
+ .execute();
90
+ try {
91
+ await db.schema.createIndex('index_expiry')
92
+ .ifNotExists().on('cacheEntries').column('expiry').execute();
93
+ }
94
+ catch { /* index already exists */ }
95
+ },
96
+ });
97
+ //# sourceMappingURL=001-initial-server-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"001-initial-server-schema.js","sourceRoot":"","sources":["../../../../src/migrations/001-initial-server-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ServerMigrationFactory } from './001-initial-server-schema.js';
2
+ /**
3
+ * All DWN server migrations in sequential order.
4
+ *
5
+ * Each entry is a `[name, factory]` tuple where the factory receives the
6
+ * `Dialect` and returns a standard Kysely `Migration`. This mirrors the
7
+ * pattern used by DWN store migrations in `@enbox/dwn-sql-store`.
8
+ *
9
+ * **Ordering contract:** Entries MUST be sorted by name (lexicographic).
10
+ */
11
+ export type { ServerMigrationFactory };
12
+ export declare const allServerMigrations: ReadonlyArray<readonly [name: string, factory: ServerMigrationFactory]>;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAI7E;;;;;;;;GAQG;AACH,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAEvC,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAEvG,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { migration001InitialServerSchema } from './001-initial-server-schema.js';
2
+ export const allServerMigrations = [
3
+ ['001-initial-server-schema', migration001InitialServerSchema],
4
+ ];
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/migrations/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAajF,MAAM,CAAC,MAAM,mBAAmB,GAA4E;IAC1G,CAAC,2BAA2B,EAAE,+BAA+B,CAAC;CAC/D,CAAC"}
@@ -12,6 +12,10 @@ export declare class RegistrationStore {
12
12
  * Creates a new RegistrationStore instance.
13
13
  */
14
14
  static create(sqlDialect: Dialect): Promise<RegistrationStore>;
15
+ /**
16
+ * Verifies that the required tables exist. Throws a clear error directing
17
+ * the caller to run server migrations first.
18
+ */
15
19
  private initialize;
16
20
  /**
17
21
  * Inserts or updates the tenant registration information.
@@ -1 +1 @@
1
- {"version":3,"file":"registration-store.d.ts","sourceRoot":"","sources":["../../../../src/registration/registration-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAuB;IACxE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAkB;IAE/D,OAAO,CAAC,EAAE,CAA+B;IAEzC,OAAO;IAIP;;OAEG;WACiB,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAQ7D,UAAU;IA2CxB;;OAEG;IACU,gCAAgC,CAAC,gBAAgB,EAAE;QAC9D,GAAG,EAAE,MAAM,CAAC;QACZ,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CjB;;OAEG;IACU,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAkB/F;;;;OAIG;IACU,WAAW,CAAC,OAAO,CAAC,EAAE;QACjC,MAAM,CAAC,EAAG,MAAM,CAAC;QACjB,KAAK,CAAC,EAAG,MAAM,CAAC;QAChB,MAAM,CAAC,EAAG,MAAM,CAAC;QACjB,MAAM,CAAC,EAAG,QAAQ,GAAG,WAAW,CAAC;KAClC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkChE;;OAEG;IACU,cAAc,CAAC,OAAO,CAAC,EAAE;QACpC,MAAM,CAAC,EAAG,MAAM,CAAC;QACjB,MAAM,CAAC,EAAG,QAAQ,GAAG,WAAW,CAAC;KAClC,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBnB;;;;OAIG;IACU,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxD;;OAEG;IACU,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzD;;OAEG;IACU,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3D;;OAEG;IACU,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD;;;;OAIG;IACU,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IASpF;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAcjD;;OAEG;IACU,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAkBpE;;OAEG;IACU,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD;;OAEG;IACU,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQxD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAG,MAAM,CAAC;IACb,kBAAkB,EAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAG,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"registration-store.d.ts","sourceRoot":"","sources":["../../../../src/registration/registration-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAuB;IACxE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAkB;IAE/D,OAAO,CAAC,EAAE,CAA+B;IAEzC,OAAO;IAIP;;OAEG;WACiB,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ3E;;;OAGG;YACW,UAAU;IAgBxB;;OAEG;IACU,gCAAgC,CAAC,gBAAgB,EAAE;QAC9D,GAAG,EAAE,MAAM,CAAC;QACZ,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CjB;;OAEG;IACU,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAkB/F;;;;OAIG;IACU,WAAW,CAAC,OAAO,CAAC,EAAE;QACjC,MAAM,CAAC,EAAG,MAAM,CAAC;QACjB,KAAK,CAAC,EAAG,MAAM,CAAC;QAChB,MAAM,CAAC,EAAG,MAAM,CAAC;QACjB,MAAM,CAAC,EAAG,QAAQ,GAAG,WAAW,CAAC;KAClC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkChE;;OAEG;IACU,cAAc,CAAC,OAAO,CAAC,EAAE;QACpC,MAAM,CAAC,EAAG,MAAM,CAAC;QACjB,MAAM,CAAC,EAAG,QAAQ,GAAG,WAAW,CAAC;KAClC,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBnB;;;;OAIG;IACU,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxD;;OAEG;IACU,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzD;;OAEG;IACU,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3D;;OAEG;IACU,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD;;;;OAIG;IACU,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IASpF;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAcjD;;OAEG;IACU,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAkBpE;;OAEG;IACU,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD;;OAEG;IACU,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQxD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAG,MAAM,CAAC;IACb,kBAAkB,EAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAG,MAAM,CAAC;CACpB"}
@@ -18,46 +18,23 @@ export class RegistrationStore {
18
18
  await store.initialize();
19
19
  return store;
20
20
  }
21
+ /**
22
+ * Verifies that the required tables exist. Throws a clear error directing
23
+ * the caller to run server migrations first.
24
+ */
21
25
  async initialize() {
22
- await this.db.schema
23
- .createTable(RegistrationStore.registeredTenantTableName)
24
- .ifNotExists()
25
- .addColumn('did', 'text', (column) => column.primaryKey())
26
- .addColumn('termsOfServiceHash', 'text')
27
- .addColumn('suspended', 'integer', (column) => column.defaultTo(0))
28
- .execute();
29
- // Add the `suspended` column to existing tables that don't have it yet.
30
- // Kysely doesn't support `ADD COLUMN IF NOT EXISTS` across all dialects, so we
31
- // catch and ignore the "column already exists" error.
32
- try {
33
- await this.db.schema
34
- .alterTable(RegistrationStore.registeredTenantTableName)
35
- .addColumn('suspended', 'integer', (column) => column.defaultTo(0))
36
- .execute();
37
- }
38
- catch {
39
- // Column already exists — expected for new installations.
40
- }
41
- // Add provider-auth columns (idempotent migration). https://github.com/enboxorg/enbox/issues/404
42
- for (const col of ['accountId', 'registrationType', 'registeredAt', 'metadata']) {
26
+ const tables = [
27
+ RegistrationStore.registeredTenantTableName,
28
+ RegistrationStore.tenantQuotasTableName,
29
+ ];
30
+ for (const table of tables) {
43
31
  try {
44
- await this.db.schema
45
- .alterTable(RegistrationStore.registeredTenantTableName)
46
- .addColumn(col, 'text')
47
- .execute();
32
+ await sql `SELECT 1 FROM ${sql.table(table)} LIMIT 0`.execute(this.db);
48
33
  }
49
34
  catch {
50
- // Column already exists expected.
35
+ throw new Error(`RegistrationStore: table '${table}' does not exist. Run server migrations before starting.`);
51
36
  }
52
37
  }
53
- // Per-tenant storage quotas table.
54
- await this.db.schema
55
- .createTable(RegistrationStore.tenantQuotasTableName)
56
- .ifNotExists()
57
- .addColumn('did', 'text', (column) => column.primaryKey())
58
- .addColumn('maxMessages', 'integer', (column) => column.defaultTo(0))
59
- .addColumn('maxStorageBytes', 'bigint', (column) => column.defaultTo(0))
60
- .execute();
61
38
  }
62
39
  /**
63
40
  * Inserts or updates the tenant registration information.
@@ -1 +1 @@
1
- {"version":3,"file":"registration-store.js","sourceRoot":"","sources":["../../../../src/registration/registration-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registration-store.js","sourceRoot":"","sources":["../../../../src/registration/registration-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Dialect } from '@enbox/dwn-sql-store';
2
+ import type { ServerMigrationFactory } from './migrations/index.js';
3
+ import type { Kysely } from 'kysely';
4
+ /**
5
+ * Runs all pending DWN server migrations against the given database.
6
+ *
7
+ * Uses Kysely's native {@link Migrator} with a separate migration table
8
+ * (`dwn_server_migration`) to avoid collisions with the DWN store
9
+ * migrations that use the default `kysely_migration` table.
10
+ *
11
+ * Call this once during server startup, before creating admin stores,
12
+ * registration stores, or the TTL cache.
13
+ *
14
+ * @param db - An open Kysely instance connected to the target database.
15
+ * @param dialect - The dialect for the target database. Passed to each
16
+ * migration factory so it can use dialect-specific DDL helpers.
17
+ * @param migrations - Optional custom migration list; defaults to the
18
+ * built-in {@link allServerMigrations}.
19
+ * @returns The names of newly applied migrations (empty if already up-to-date).
20
+ * @throws If any migration fails.
21
+ */
22
+ export declare function runServerMigrations(db: Kysely<any>, dialect: Dialect, migrations?: ReadonlyArray<readonly [name: string, factory: ServerMigrationFactory]>): Promise<string[]>;
23
+ //# sourceMappingURL=server-migration-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-migration-runner.d.ts","sourceRoot":"","sources":["../../../src/server-migration-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAoD,MAAM,QAAQ,CAAC;AA+BvF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC,GACnF,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB"}
@@ -0,0 +1,57 @@
1
+ import { allServerMigrations } from './migrations/index.js';
2
+ import { Migrator } from 'kysely';
3
+ /**
4
+ * {@link MigrationProvider} for server migrations. Wraps an ordered list of
5
+ * `(name, factory)` pairs. At resolution time each factory is called with the
6
+ * dialect, producing the concrete Kysely {@link Migration} objects.
7
+ */
8
+ class ServerMigrationProvider {
9
+ #dialect;
10
+ #factories;
11
+ constructor(dialect, factories) {
12
+ this.#dialect = dialect;
13
+ this.#factories = factories;
14
+ }
15
+ async getMigrations() {
16
+ const migrations = {};
17
+ for (const [name, factory] of this.#factories) {
18
+ migrations[name] = factory(this.#dialect);
19
+ }
20
+ return migrations;
21
+ }
22
+ }
23
+ /**
24
+ * Runs all pending DWN server migrations against the given database.
25
+ *
26
+ * Uses Kysely's native {@link Migrator} with a separate migration table
27
+ * (`dwn_server_migration`) to avoid collisions with the DWN store
28
+ * migrations that use the default `kysely_migration` table.
29
+ *
30
+ * Call this once during server startup, before creating admin stores,
31
+ * registration stores, or the TTL cache.
32
+ *
33
+ * @param db - An open Kysely instance connected to the target database.
34
+ * @param dialect - The dialect for the target database. Passed to each
35
+ * migration factory so it can use dialect-specific DDL helpers.
36
+ * @param migrations - Optional custom migration list; defaults to the
37
+ * built-in {@link allServerMigrations}.
38
+ * @returns The names of newly applied migrations (empty if already up-to-date).
39
+ * @throws If any migration fails.
40
+ */
41
+ export async function runServerMigrations(db, dialect, migrations) {
42
+ const provider = new ServerMigrationProvider(dialect, migrations ?? allServerMigrations);
43
+ const migrator = new Migrator({
44
+ db,
45
+ provider,
46
+ migrationTableName: 'dwn_server_migration',
47
+ migrationLockTableName: 'dwn_server_migration_lock',
48
+ });
49
+ const resultSet = await migrator.migrateToLatest();
50
+ if (resultSet.error) {
51
+ throw resultSet.error;
52
+ }
53
+ return (resultSet.results ?? [])
54
+ .filter((r) => r.status === 'Success')
55
+ .map((r) => r.migrationName);
56
+ }
57
+ //# sourceMappingURL=server-migration-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-migration-runner.js","sourceRoot":"","sources":["../../../src/server-migration-runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC;;;;GAIG;AACH,MAAM,uBAAuB;IAC3B,QAAQ,CAAU;IAClB,UAAU,CAA0E;IAEpF,YACE,OAAgB,EAChB,SAAkF;QAElF,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,MAAM,UAAU,GAA8B,EAAE,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAe,EACf,OAAgB,EAChB,UAAoF;IAEpF,MAAM,QAAQ,GAAG,IAAI,uBAAuB,CAAC,OAAO,EAAE,UAAU,IAAI,mBAAmB,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;QAC5B,EAAE;QACF,QAAQ;QACR,kBAAkB,EAAO,sBAAsB;QAC/C,sBAAsB,EAAG,2BAA2B;KACrD,CAAC,CAAC;IAEH,MAAM,SAAS,GAAuB,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;IAEvE,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,SAAS,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;SACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC"}
@@ -20,5 +20,20 @@ export declare function getDwnConfig(config: DwnServerConfig, options: {
20
20
  tenantGate?: TenantGate;
21
21
  eventLog?: EventLog;
22
22
  }): Promise<DwnConfig>;
23
+ /**
24
+ * Runs DWN server schema migrations (admin stores, registration, TTL cache)
25
+ * if the given URL points to a SQL backend. Uses the `registrationStoreUrl`
26
+ * (or the TTL cache URL) as the target database.
27
+ *
28
+ * Server migrations use a separate tracking table (`dwn_server_migration`)
29
+ * so they do not conflict with the DWN store migrations.
30
+ *
31
+ * Call this once during server startup, before creating admin stores.
32
+ *
33
+ * @returns The dialect used for the target database (so the caller can reuse
34
+ * it for the TTL cache and admin stores), or `undefined` if no SQL
35
+ * backend was configured or needed.
36
+ */
37
+ export declare function runServerMigrationsIfNeeded(config: DwnServerConfig): Promise<Dialect | undefined>;
23
38
  export declare function getDialectFromUrl(connectionUrl: URL): Dialect;
24
39
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,UAAU,EACX,MAAM,mBAAmB,CAAC;AA6B3B,oBAAY,SAAS;IACnB,SAAS,IAAA;IACT,YAAY,IAAA;IACZ,UAAU,IAAA;IACV,kBAAkB,IAAA;CACnB;AAED,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,kBAAkB,CAAC;AA4ClF,wBAAsB,YAAY,CAChC,MAAM,EAAG,eAAe,EACxB,OAAO,EAAG;IACR,WAAW,CAAC,EAAG,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAG,UAAU,CAAC;IACzB,QAAQ,CAAC,EAAG,QAAQ,CAAC;CACtB,GACA,OAAO,CAAC,SAAS,CAAC,CAcpB;AAmJD,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,GAAG,GAAG,OAAO,CA4B7D"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,UAAU,EACX,MAAM,mBAAmB,CAAC;AA8B3B,oBAAY,SAAS;IACnB,SAAS,IAAA;IACT,YAAY,IAAA;IACZ,UAAU,IAAA;IACV,kBAAkB,IAAA;CACnB;AAED,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,kBAAkB,CAAC;AA6ClF,wBAAsB,YAAY,CAChC,MAAM,EAAG,eAAe,EACxB,OAAO,EAAG;IACR,WAAW,CAAC,EAAG,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAG,UAAU,CAAC;IACzB,QAAQ,CAAC,EAAG,QAAQ,CAAC;CACtB,GACA,OAAO,CAAC,SAAS,CAAC,CAcpB;AAyCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAyEvG;AAwHD,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,GAAG,GAAG,OAAO,CAqD7D"}
@@ -5,6 +5,7 @@ import pg from 'pg';
5
5
  import { Kysely } from 'kysely';
6
6
  import { createBunSqliteDatabase } from '@enbox/dwn-sql-store';
7
7
  import { PluginLoader } from './plugin-loader.js';
8
+ import { runServerMigrations } from './server-migration-runner.js';
8
9
  import { DataStoreLevel, MessageStoreLevel, ResumableTaskStoreLevel, StateIndexLevel, } from '@enbox/dwn-sdk-js';
9
10
  import { DataStoreSql, MessageStoreSql, MysqlDialect, PostgresDialect, ResumableTaskStoreSql, runDwnStoreMigrations, SqliteDialect, StateIndexSql, } from '@enbox/dwn-sql-store';
10
11
  export var StoreType;
@@ -22,23 +23,24 @@ export var BackendTypes;
22
23
  BackendTypes["POSTGRES"] = "postgres";
23
24
  })(BackendTypes || (BackendTypes = {}));
24
25
  /**
25
- * Cache of shared PostgreSQL dialects keyed by connection URL. When multiple
26
- * DWN stores share the same Postgres URL, they reuse a single dialect (and
27
- * thus a single `pg.Pool`) instead of each creating their own. This reduces
28
- * connection count from 4 × pool_max to 1 × pool_max per DWN process.
29
- */
30
- const sharedDialectCache = new Map();
31
- /**
32
- * Returns a (potentially cached) dialect for the given Postgres connection URL.
33
- * Non-Postgres URLs always return a fresh dialect (no caching).
26
+ * Returns a (potentially cached) dialect for the given connection URL. For
27
+ * Postgres, creates a pool with configurable sizing from the server config.
28
+ * For other backends, delegates to `getDialectFromUrl()` which handles its
29
+ * own caching (critical for in-memory SQLite).
30
+ *
31
+ * All Postgres dialects are cached in a separate map keyed by URL so that
32
+ * multiple DWN stores sharing the same Postgres URL reuse a single
33
+ * `pg.Pool`, reducing connection count from 4 × pool_max to 1 × pool_max.
34
34
  */
35
+ const postgresDialectCache = new Map();
35
36
  function getOrCreateDialect(connectionUrl, config) {
36
37
  const protocol = connectionUrl.protocol.slice(0, -1);
37
38
  if (protocol !== BackendTypes.POSTGRES) {
39
+ // getDialectFromUrl handles its own caching for SQLite/MySQL.
38
40
  return getDialectFromUrl(connectionUrl);
39
41
  }
40
42
  const key = connectionUrl.toString();
41
- const cached = sharedDialectCache.get(key);
43
+ const cached = postgresDialectCache.get(key);
42
44
  if (cached !== undefined) {
43
45
  return cached;
44
46
  }
@@ -53,7 +55,7 @@ function getOrCreateDialect(connectionUrl, config) {
53
55
  pool: async () => pool,
54
56
  cursor: Cursor,
55
57
  });
56
- sharedDialectCache.set(key, dialect);
58
+ postgresDialectCache.set(key, dialect);
57
59
  return dialect;
58
60
  }
59
61
  export async function getDwnConfig(config, options) {
@@ -100,13 +102,91 @@ async function runSqlMigrationsIfNeeded(config) {
100
102
  }
101
103
  }
102
104
  finally {
103
- // Don't destroy the Kysely instance if using a shared Postgres pool
104
- // the pool is cached in sharedDialectCache and will be reused by stores.
105
- // Only destroy for non-cached dialects (SQLite, MySQL).
106
- if (protocol !== BackendTypes.POSTGRES) {
107
- await db.destroy();
105
+ // Do NOT destroy the Kysely instance the dialect is cached and will be
106
+ // reused by stores. For in-memory SQLite, destroying would close the
107
+ // database and lose all migrated schema. For Postgres, the pool is shared.
108
+ }
109
+ }
110
+ /**
111
+ * Runs DWN server schema migrations (admin stores, registration, TTL cache)
112
+ * if the given URL points to a SQL backend. Uses the `registrationStoreUrl`
113
+ * (or the TTL cache URL) as the target database.
114
+ *
115
+ * Server migrations use a separate tracking table (`dwn_server_migration`)
116
+ * so they do not conflict with the DWN store migrations.
117
+ *
118
+ * Call this once during server startup, before creating admin stores.
119
+ *
120
+ * @returns The dialect used for the target database (so the caller can reuse
121
+ * it for the TTL cache and admin stores), or `undefined` if no SQL
122
+ * backend was configured or needed.
123
+ */
124
+ export async function runServerMigrationsIfNeeded(config) {
125
+ const sqlBackends = [BackendTypes.SQLITE, BackendTypes.MYSQL, BackendTypes.POSTGRES];
126
+ // Determine the target URL for server migrations. Prefer registrationStoreUrl
127
+ // since admin stores and the TTL cache share that database. Fall back to
128
+ // ttlCacheUrl when no registration store is configured (the cacheEntries
129
+ // table still needs a schema).
130
+ const targetUrl = config.registrationStoreUrl ?? config.ttlCacheUrl;
131
+ if (!targetUrl) {
132
+ return undefined;
133
+ }
134
+ if (isFilePath(targetUrl)) {
135
+ return undefined;
136
+ }
137
+ let parsedUrl;
138
+ try {
139
+ parsedUrl = new URL(targetUrl);
140
+ }
141
+ catch {
142
+ return undefined;
143
+ }
144
+ const protocol = parsedUrl.protocol.slice(0, -1);
145
+ if (!sqlBackends.includes(protocol)) {
146
+ return undefined;
147
+ }
148
+ // When both registrationStoreUrl and ttlCacheUrl are set and differ,
149
+ // validate they point at the same database — the cacheEntries table is
150
+ // included in the server migration so it must live alongside the other
151
+ // server tables.
152
+ if (config.registrationStoreUrl && config.ttlCacheUrl
153
+ && config.ttlCacheUrl !== config.registrationStoreUrl) {
154
+ let ttlUrl;
155
+ try {
156
+ ttlUrl = new URL(config.ttlCacheUrl);
157
+ }
158
+ catch { /* not a URL */ }
159
+ if (ttlUrl) {
160
+ const ttlProtocol = ttlUrl.protocol.slice(0, -1);
161
+ if (sqlBackends.includes(ttlProtocol)) {
162
+ throw new Error('DWN server misconfiguration: DWN_TTL_CACHE_URL must point to the same database as ' +
163
+ 'DWN_REGISTRATION_STORE_URL (or DWN_STORAGE) because the cacheEntries table is managed ' +
164
+ 'by the server migration system. ' +
165
+ `Got registrationStoreUrl="${config.registrationStoreUrl}", ttlCacheUrl="${config.ttlCacheUrl}".`);
166
+ }
167
+ }
168
+ }
169
+ const dialect = getOrCreateDialect(parsedUrl, config);
170
+ const db = new Kysely({ dialect });
171
+ try {
172
+ const applied = await runServerMigrations(db, dialect);
173
+ if (applied.length > 0) {
174
+ console.log(`Server migrations applied: ${applied.join(', ')}`);
175
+ }
176
+ }
177
+ finally {
178
+ // For Postgres, don't destroy — the pool is cached in sharedDialectCache.
179
+ // For SQLite/MySQL, we also keep the Kysely instance alive so the caller
180
+ // can reuse the same dialect (critical for in-memory SQLite).
181
+ if (protocol === BackendTypes.POSTGRES) {
182
+ // Pool stays alive via sharedDialectCache.
108
183
  }
184
+ // NOTE: We intentionally do NOT destroy the Kysely instance for any
185
+ // backend. The dialect is returned to the caller for reuse (e.g. by the
186
+ // TTL cache and admin stores). For in-memory SQLite, destroying would
187
+ // lose the database.
109
188
  }
189
+ return dialect;
110
190
  }
111
191
  function getLevelStore(storeURI, storeType) {
112
192
  switch (storeType) {
@@ -187,6 +267,20 @@ async function loadStoreFromFilePath(filePath, storeType) {
187
267
  throw new Error(`Loading store for unsupported store type ${storeType} from path ${filePath}`);
188
268
  }
189
269
  }
270
+ /**
271
+ * Cache for the in-memory SQLite dialect. Since every call to
272
+ * `createBunSqliteDatabase(':memory:')` creates a separate, empty database,
273
+ * we must ensure that `getDialectFromUrl(new URL('sqlite://'))` always
274
+ * returns the same dialect (and thus the same underlying database) within a
275
+ * process. This is critical for the DWN server startup flow where migrations,
276
+ * the registration store, and the TTL cache all need to share the same
277
+ * in-memory database.
278
+ *
279
+ * File-based SQLite and other backends are NOT cached here — file-based SQLite
280
+ * connections naturally share state through the filesystem, and caching would
281
+ * break test isolation when multiple test files run in the same process.
282
+ */
283
+ let inMemorySqliteDialect;
190
284
  export function getDialectFromUrl(connectionUrl) {
191
285
  switch (connectionUrl.protocol.slice(0, -1)) {
192
286
  case BackendTypes.SQLITE: {
@@ -196,8 +290,30 @@ export function getDialectFromUrl(connectionUrl) {
196
290
  console.log('SQL-lite directory does not exist, creating:', connectionUrl.host);
197
291
  fs.mkdirSync(connectionUrl.host, { recursive: true });
198
292
  }
199
- // Use in-memory database if no path is provided (for tests)
293
+ // Use in-memory database if no path is provided (for tests).
200
294
  const dbPath = path || ':memory:';
295
+ // For in-memory SQLite, return a cached dialect so that all callers
296
+ // (migrations, registration store, TTL cache) share the same database.
297
+ // The wrapper makes close() a no-op so that individual consumers (e.g.
298
+ // DwnServer.stop() → Dwn.close() → store.close()) cannot destroy the
299
+ // shared database out from under other consumers.
300
+ if (dbPath === ':memory:') {
301
+ if (inMemorySqliteDialect === undefined) {
302
+ const sharedDb = createBunSqliteDatabase(':memory:');
303
+ const nonCloseableDb = {
304
+ close() {
305
+ // no-op — shared instance must survive the process
306
+ },
307
+ prepare(sql) {
308
+ return sharedDb.prepare(sql);
309
+ },
310
+ };
311
+ inMemorySqliteDialect = new SqliteDialect({
312
+ database: async () => nonCloseableDb,
313
+ });
314
+ }
315
+ return inMemorySqliteDialect;
316
+ }
201
317
  return new SqliteDialect({
202
318
  database: async () => createBunSqliteDatabase(dbPath),
203
319
  });
@@ -211,6 +327,8 @@ export function getDialectFromUrl(connectionUrl) {
211
327
  pool: async () => new pg.Pool({ connectionString: connectionUrl.toString() }),
212
328
  cursor: Cursor,
213
329
  });
330
+ default:
331
+ throw new Error(`Unsupported database protocol: ${connectionUrl.protocol}`);
214
332
  }
215
333
  }
216
334
  function invalidStorageSchemeMessage(protocol) {