vona-module-a-ormdialect 5.1.18 → 5.1.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"databaseDialect.betterSqlite3.d.ts","sourceRoot":"","sources":["../../src/bean/databaseDialect.betterSqlite3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EACV,oBAAoB,EACpB,4BAA4B,EAC5B,gCAAgC,EAChC,yBAAyB,EACzB,uBAAuB,EACvB,iCAAiC,EAClC,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,0BAA0B,EAAmB,MAAM,mBAAmB,CAAC;AAEhF,MAAM,WAAW,oCAAqC,SAAQ,gCAAgC;CAAG;AAEjG,qBACa,4BAA6B,SAAQ,0BAA0B;IAC1E,SAAS,CAAC,aAAa,EAAE,4BAA4B,CAInD;IAEF,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAOnD;IAEI,cAAc,CAClB,cAAc,EAAE,IAAI,CAAC,aAAa,EAClC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAWjC,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzF,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrF,YAAY,CAChB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAU/B,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,GACX,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAI1C,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,EACZ,EAAE,EAAE,iCAAiC,GACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IAIjB,KAAK,CAAC,MAAM,KAAA;IAIZ,OAAO,CAAC,SAAS;CAGlB"}
1
+ {"version":3,"file":"databaseDialect.betterSqlite3.d.ts","sourceRoot":"","sources":["../../src/bean/databaseDialect.betterSqlite3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EACV,oBAAoB,EACpB,4BAA4B,EAC5B,gCAAgC,EAChC,yBAAyB,EACzB,uBAAuB,EACvB,iCAAiC,EAClC,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAE,0BAA0B,EAAmB,MAAM,mBAAmB,CAAC;AAEhF,MAAM,WAAW,oCAAqC,SAAQ,gCAAgC;CAAG;AAEjG,qBACa,4BAA6B,SAAQ,0BAA0B;IAC1E,SAAS,CAAC,aAAa,EAAE,4BAA4B,CAInD;IAEF,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAOnD;IAEI,cAAc,CAClB,cAAc,EAAE,IAAI,CAAC,aAAa,EAClC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAWjC,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzF,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BrF,YAAY,CAChB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAU/B,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,GACX,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAI1C,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,EACZ,EAAE,EAAE,iCAAiC,GACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IAIjB,KAAK,CAAC,MAAM,KAAA;IAIZ,OAAO,CAAC,SAAS;CAOlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"databaseDialect.mysql.d.ts","sourceRoot":"","sources":["../../src/bean/databaseDialect.mysql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EACV,oBAAoB,EACpB,4BAA4B,EAC5B,gCAAgC,EAChC,yBAAyB,EACzB,iCAAiC,EACjC,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,0BAA0B,EAAmB,MAAM,mBAAmB,CAAC;AAEhF,MAAM,WAAW,4BAA6B,SAAQ,gCAAgC;CAAG;AAEzF,qBACa,oBAAqB,SAAQ,0BAA0B;IAClE,SAAS,CAAC,aAAa,EAAE,4BAA4B,CAInD;IAEF,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAMnD;IAEI,cAAc,CAClB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAUjC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxF,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF,YAAY,CAChB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAW/B,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,GACX,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAI1C,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,EACZ,EAAE,EAAE,iCAAiC,GACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IAIX,YAAY,CAChB,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAgB3C,KAAK,CAAC,MAAM,KAAA;IAIN,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAkBtF"}
1
+ {"version":3,"file":"databaseDialect.mysql.d.ts","sourceRoot":"","sources":["../../src/bean/databaseDialect.mysql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EACV,oBAAoB,EACpB,4BAA4B,EAC5B,gCAAgC,EAChC,yBAAyB,EACzB,iCAAiC,EACjC,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,0BAA0B,EAAmB,MAAM,mBAAmB,CAAC;AAEhF,MAAM,WAAW,4BAA6B,SAAQ,gCAAgC;CAAG;AAEzF,qBACa,oBAAqB,SAAQ,0BAA0B;IAClE,SAAS,CAAC,aAAa,EAAE,4BAA4B,CAInD;IAEF,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAMnD;IAEI,cAAc,CAClB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAajC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxF,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF,YAAY,CAChB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAW/B,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,GACX,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAI1C,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,EACZ,EAAE,EAAE,iCAAiC,GACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IAIX,YAAY,CAChB,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAgB3C,KAAK,CAAC,MAAM,KAAA;IAIN,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAkBtF"}
@@ -1 +1 @@
1
- {"version":3,"file":"databaseDialect.pg.d.ts","sourceRoot":"","sources":["../../src/bean/databaseDialect.pg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EACV,oBAAoB,EACpB,4BAA4B,EAC5B,gCAAgC,EAChC,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,0BAA0B,EAAmB,MAAM,mBAAmB,CAAC;AAEhF,MAAM,WAAW,yBAA0B,SAAQ,gCAAgC;CAAG;AAEtF,qBACa,iBAAkB,SAAQ,0BAA0B;IAC/D,SAAS,CAAC,aAAa,EAAE,4BAA4B,CAInD;IAEF,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAa;IAE5D,cAAc,CAClB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAWjC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKxF,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF,YAAY,CAChB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAa/B,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,GACX,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAIhD,KAAK,CAAC,MAAM,KAAA;IAIN,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAyBtF"}
1
+ {"version":3,"file":"databaseDialect.pg.d.ts","sourceRoot":"","sources":["../../src/bean/databaseDialect.pg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EACV,oBAAoB,EACpB,4BAA4B,EAC5B,gCAAgC,EAChC,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,0BAA0B,EAAmB,MAAM,mBAAmB,CAAC;AAEhF,MAAM,WAAW,yBAA0B,SAAQ,gCAAgC;CAAG;AAEtF,qBACa,iBAAkB,SAAQ,0BAA0B;IAC/D,SAAS,CAAC,aAAa,EAAE,4BAA4B,CAInD;IAEF,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAa;IAE5D,cAAc,CAClB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAYjC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKxF,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF,YAAY,CAChB,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAa/B,MAAM,CACV,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,KAAK,EAAE,GAAG,EAAE,GACX,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAIhD,KAAK,CAAC,MAAM,KAAA;IAIN,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAyBtF"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  export * from './.metadata/index.ts';
2
+ export { createProtectedSqliteRegistry } from './lib/protectedSqliteRegistry.ts';
3
+ export type { ProtectedSqliteRegistry, ProtectedSqliteRegistryCloseResult, ProtectedSqliteRegistryLookupOutcome, ProtectedSqliteRegistryLookupResult, ProtectedSqliteRegistryOptions, ProtectedSqliteRegistryPrepareResult, ProtectedSqliteRegistryRow, ProtectedSqliteRegistrySnapshot, } from './lib/protectedSqliteRegistry.ts';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AACjF,YAAY,EACV,uBAAuB,EACvB,kCAAkC,EAClC,oCAAoC,EACpC,mCAAmC,EACnC,8BAA8B,EAC9B,oCAAoC,EACpC,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,kCAAkC,CAAC"}
package/dist/index.js CHANGED
@@ -1,11 +1,13 @@
1
- import { BeanInfo, $Class, Virtual, BeanScopeBase } from 'vona';
1
+ import { BeanInfo, resolveTestRunId, resolveVonaLocalPaths, assertTestRunOwner, $Class, Virtual, BeanScopeBase, getRequestBoundary } from 'vona';
2
2
  import { __decorate } from 'tslib';
3
3
  import { ensureDir, remove } from 'fs-extra';
4
4
  import { globby } from 'globby';
5
+ import { lstat } from 'node:fs/promises';
5
6
  import path from 'node:path';
6
7
  import { DatabaseDialect, ServiceDatabaseDialectBase } from 'vona-module-a-orm';
7
8
  import { promisify } from 'node:util';
8
9
  import { Scope } from 'vona-module-a-bean';
10
+ import { createRequire } from 'node:module';
9
11
 
10
12
  let DatabaseDialectBetterSqlite3 = class DatabaseDialectBetterSqlite3 extends ServiceDatabaseDialectBase {
11
13
  constructor(...args) {
@@ -42,6 +44,19 @@ let DatabaseDialectBetterSqlite3 = class DatabaseDialectBetterSqlite3 extends Se
42
44
  return path.join(dbDir, `${databaseName}.db`);
43
45
  }
44
46
  async dropDatabase(_schemaBuilder, databaseName) {
47
+ const isolated = resolveTestRunId(this.app.meta.env.META_MODE, this.app.meta.env.VONA_TEST_RUN_ID);
48
+ if (isolated) {
49
+ const paths = resolveVonaLocalPaths(this.app.projectPath, 'test', isolated);
50
+ assertTestRunOwner(paths.dataRoot, isolated);
51
+ const basename = path.basename(databaseName);
52
+ if (path.resolve(databaseName) !== path.join(paths.sqliteRoot, basename) || !/^vona-test-[\w-]+-\d{8}-\d{6}\.db$/.test(basename)) {
53
+ throw new Error(`Isolated test cannot remove SQLite database outside its owned root: ${databaseName}`);
54
+ }
55
+ await assertNotSymlink(paths.sqliteRoot);
56
+ for (const file of [databaseName, ...['shm', 'wal', 'journal'].map(part => `${databaseName}-${part}`)]) {
57
+ await assertNotSymlink(file);
58
+ }
59
+ }
45
60
  await remove(databaseName);
46
61
  for (const part of ['shm', 'wal', 'journal']) {
47
62
  await remove(`${databaseName}-${part}`);
@@ -66,12 +81,21 @@ let DatabaseDialectBetterSqlite3 = class DatabaseDialectBetterSqlite3 extends Se
66
81
  return result;
67
82
  }
68
83
  _getDbDir() {
69
- return path.join(this.app.projectPath, '.app/sqlite3');
84
+ return resolveVonaLocalPaths(this.app.projectPath, this.app.meta.env.META_MODE, this.app.meta.env.VONA_TEST_RUN_ID).sqliteRoot;
70
85
  }
71
86
  };
72
87
  DatabaseDialectBetterSqlite3 = __decorate([DatabaseDialect(), BeanInfo({
73
88
  module: "a-ormdialect"
74
89
  })], DatabaseDialectBetterSqlite3);
90
+ async function assertNotSymlink(file) {
91
+ try {
92
+ if ((await lstat(file)).isSymbolicLink()) {
93
+ throw new Error(`Isolated test SQLite path is a symlink: ${file}`);
94
+ }
95
+ } catch (error) {
96
+ if (error.code !== 'ENOENT') throw error;
97
+ }
98
+ }
75
99
  async function sqlite3_afterCreate(conn) {
76
100
  conn.pragma('busy_timeout = 5000');
77
101
  const pragma = conn.pragma('journal_mode');
@@ -97,7 +121,8 @@ let DatabaseDialectMysql = class DatabaseDialectMysql extends ServiceDatabaseDia
97
121
  };
98
122
  }
99
123
  async fetchDatabases(schemaBuilder, databasePrefix) {
100
- const res = await schemaBuilder.raw(`show databases like '${databasePrefix}%'`);
124
+ const escapedPrefix = databasePrefix.replaceAll("'", "''");
125
+ const res = await schemaBuilder.raw(`select schema_name from information_schema.schemata where left(schema_name, ${databasePrefix.length}) = '${escapedPrefix}'`);
101
126
  let dbs = res[0];
102
127
  dbs = dbs.map(db => {
103
128
  const name = db[Object.keys(db)[0]];
@@ -191,7 +216,8 @@ let DatabaseDialectPg = class DatabaseDialectPg extends ServiceDatabaseDialectBa
191
216
  this._configBase = undefined;
192
217
  }
193
218
  async fetchDatabases(schemaBuilder, databasePrefix) {
194
- const res = await schemaBuilder.raw(`select datname from pg_database where datname like '${databasePrefix}%'`);
219
+ const escapedPrefix = databasePrefix.replaceAll("'", "''");
220
+ const res = await schemaBuilder.raw(`select datname from pg_database where left(datname, ${databasePrefix.length}) = '${escapedPrefix}'`);
195
221
  let dbs = res.rows;
196
222
  dbs = dbs.map(db => {
197
223
  return {
@@ -258,5 +284,239 @@ ScopeModuleAOrmdialect = __decorate([Scope(), BeanInfo({
258
284
  })], ScopeModuleAOrmdialect);
259
285
  /** scope: end */
260
286
 
261
- export { DatabaseDialectBetterSqlite3, DatabaseDialectMysql, DatabaseDialectMysql3, DatabaseDialectPg, ScopeModuleAOrmdialect };
287
+ const MAX_NAME_BYTES = 256;
288
+ const MAX_CONFIG_BYTES = 65_536;
289
+ const LOOKUP_BUDGET_MS = 1_000;
290
+ const PRIVATE_TIMEOUT_MS = 100;
291
+ const PROTECTED_SQLITE_REGISTRY_SQL = `SELECT
292
+ CASE WHEN typeof(id) = 'integer' AND id > 0 AND id <= 9007199254740991 THEN id ELSE NULL END AS id,
293
+ CASE WHEN typeof(name) = 'text' AND length(CAST(name AS BLOB)) <= 256 THEN name ELSE NULL END AS name,
294
+ CASE WHEN typeof(disabled) = 'integer' AND disabled IN (0, 1) THEN disabled ELSE NULL END AS disabled,
295
+ CASE WHEN typeof(isolate) = 'integer' AND isolate IN (0, 1) THEN isolate ELSE NULL END AS isolate,
296
+ CASE
297
+ WHEN config IS NULL THEN NULL
298
+ WHEN typeof(config) = 'text' AND length(CAST(config AS BLOB)) <= 65536 THEN config
299
+ ELSE NULL
300
+ END AS config,
301
+ CASE
302
+ WHEN typeof(id) = 'integer' AND id > 0 AND id <= 9007199254740991
303
+ AND typeof(name) = 'text' AND length(CAST(name AS BLOB)) <= 256
304
+ AND typeof(disabled) = 'integer' AND disabled IN (0, 1)
305
+ AND typeof(isolate) = 'integer' AND isolate IN (0, 1)
306
+ AND (config IS NULL OR (typeof(config) = 'text' AND length(CAST(config AS BLOB)) <= 65536))
307
+ THEN 1
308
+ ELSE 0
309
+ END AS __protected_valid
310
+ FROM aInstance
311
+ WHERE name COLLATE BINARY = ?
312
+ AND deleted = 0
313
+ LIMIT 2`;
314
+ const productionDependencies = Object.freeze({
315
+ open: openNativeSqlite,
316
+ now: () => performance.now(),
317
+ hasRequestBoundary: () => getRequestBoundary() !== undefined
318
+ });
319
+ function createProtectedSqliteRegistry(options) {
320
+ return createProtectedSqliteRegistryInternal(options, productionDependencies);
321
+ }
322
+ function createProtectedSqliteRegistryInternal(options, dependencies) {
323
+ const filename = readSupportedFilename(options);
324
+ let state = 'new';
325
+ let attempted = false;
326
+ let active = false;
327
+ let closing = false;
328
+ let database;
329
+ let statement;
330
+ let closePromise;
331
+ let closeResolve;
332
+ const unavailable = outcome => Object.freeze({
333
+ outcome
334
+ });
335
+ const finalizeClose = () => {
336
+ if (!database) {
337
+ state = 'closed';
338
+ return Object.freeze({
339
+ outcome: 'closed'
340
+ });
341
+ }
342
+ try {
343
+ database.close();
344
+ } catch {
345
+ state = 'faulted';
346
+ return Object.freeze({
347
+ outcome: 'close_failed'
348
+ });
349
+ }
350
+ database = undefined;
351
+ statement = undefined;
352
+ state = 'closed';
353
+ return Object.freeze({
354
+ outcome: 'closed'
355
+ });
356
+ };
357
+ const settleDeferredClose = () => {
358
+ if (!closeResolve) return;
359
+ const resolve = closeResolve;
360
+ closeResolve = undefined;
361
+ resolve(finalizeClose());
362
+ };
363
+ const prepare = () => {
364
+ if (dependencies.hasRequestBoundary()) return Object.freeze({
365
+ outcome: 'boundary_required'
366
+ });
367
+ if (closing || state === 'closed') return Object.freeze({
368
+ outcome: 'unavailable'
369
+ });
370
+ if (attempted) return Object.freeze({
371
+ outcome: 'already_prepared'
372
+ });
373
+ attempted = true;
374
+ if (!filename) {
375
+ state = 'faulted';
376
+ return Object.freeze({
377
+ outcome: 'unsupported'
378
+ });
379
+ }
380
+ try {
381
+ database = dependencies.open(filename, {
382
+ readonly: true,
383
+ fileMustExist: true,
384
+ timeout: PRIVATE_TIMEOUT_MS
385
+ });
386
+ const journalMode = database.pragma('journal_mode', {
387
+ simple: true
388
+ });
389
+ const busyTimeout = database.pragma('busy_timeout', {
390
+ simple: true
391
+ });
392
+ if (journalMode !== 'wal' || busyTimeout !== PRIVATE_TIMEOUT_MS) throw new Error();
393
+ statement = database.prepare(PROTECTED_SQLITE_REGISTRY_SQL);
394
+ const probe = statement.all('');
395
+ if (!Array.isArray(probe) || probe.length > 2 || probe.some(row => !isValidProjectionRow(row))) {
396
+ throw new Error();
397
+ }
398
+ state = 'ready';
399
+ return Object.freeze({
400
+ outcome: 'ready'
401
+ });
402
+ } catch {
403
+ state = 'faulted';
404
+ return Object.freeze({
405
+ outcome: 'unavailable'
406
+ });
407
+ }
408
+ };
409
+ const lookup = (name, deadlineAt = dependencies.now() + LOOKUP_BUDGET_MS) => {
410
+ if (!dependencies.hasRequestBoundary()) return unavailable('boundary_required');
411
+ if (state !== 'ready' || closing || !database || !statement) return unavailable('unavailable');
412
+ if (!isBoundedText(name, MAX_NAME_BYTES)) {
413
+ return unavailable('invalid_input');
414
+ }
415
+ if (!Number.isFinite(deadlineAt) || dependencies.now() >= deadlineAt) {
416
+ return unavailable('expired');
417
+ }
418
+ if (active) return unavailable('reentrant');
419
+ active = true;
420
+ try {
421
+ const rows = statement.all(name);
422
+ if (closing || dependencies.now() >= deadlineAt) return unavailable('expired');
423
+ if (!Array.isArray(rows)) {
424
+ state = 'faulted';
425
+ return unavailable('unavailable');
426
+ }
427
+ if (rows.length > 2) {
428
+ state = 'faulted';
429
+ return unavailable('unavailable');
430
+ }
431
+ if (rows.length === 0) return unavailable('missing');
432
+ if (rows.length === 2) return unavailable('duplicate');
433
+ const row = rows[0];
434
+ if (!isValidProjectionRow(row)) {
435
+ state = 'faulted';
436
+ return unavailable('unavailable');
437
+ }
438
+ const projected = row;
439
+ if (projected.disabled === 1) return unavailable('disabled');
440
+ const result = Object.freeze({
441
+ outcome: 'found',
442
+ row: Object.freeze({
443
+ id: projected.id,
444
+ name: projected.name,
445
+ disabled: projected.disabled === 1,
446
+ isolate: projected.isolate === 1,
447
+ config: projected.config
448
+ })
449
+ });
450
+ return result;
451
+ } catch {
452
+ state = 'faulted';
453
+ return unavailable('unavailable');
454
+ } finally {
455
+ active = false;
456
+ if (closing) settleDeferredClose();
457
+ }
458
+ };
459
+ const close = () => {
460
+ if (closePromise) return closePromise;
461
+ closing = true;
462
+ if (active) {
463
+ closePromise = new Promise(resolve => {
464
+ closeResolve = resolve;
465
+ });
466
+ } else {
467
+ closePromise = Promise.resolve(finalizeClose());
468
+ }
469
+ return closePromise;
470
+ };
471
+ return Object.freeze({
472
+ prepare,
473
+ lookup,
474
+ close,
475
+ snapshot: () => Object.freeze({
476
+ state,
477
+ active,
478
+ closing
479
+ })
480
+ });
481
+ }
482
+ function readSupportedFilename(options) {
483
+ try {
484
+ if (!options || typeof options !== 'object' || Array.isArray(options)) return undefined;
485
+ const prototype = Object.getPrototypeOf(options);
486
+ if (prototype !== Object.prototype && prototype !== null) return undefined;
487
+ const keys = Reflect.ownKeys(options);
488
+ if (keys.length !== 1 || keys[0] !== 'filename') return undefined;
489
+ const descriptor = Object.getOwnPropertyDescriptor(options, 'filename');
490
+ if (!descriptor || !Object.hasOwn(descriptor, 'value')) return undefined;
491
+ const filename = descriptor.value;
492
+ if (typeof filename !== 'string' || !filename.isWellFormed() || !path.isAbsolute(filename) || filename.includes('\0')) {
493
+ return undefined;
494
+ }
495
+ return filename;
496
+ } catch {
497
+ return undefined;
498
+ }
499
+ }
500
+ function isBoundedText(value, maxBytes) {
501
+ return typeof value === 'string' && value.isWellFormed() && Buffer.byteLength(value, 'utf8') <= maxBytes;
502
+ }
503
+ function isValidProjectionRow(row) {
504
+ if (!row || typeof row !== 'object') return false;
505
+ const projected = row;
506
+ if (projected.__protected_valid !== 1) return false;
507
+ if (typeof projected.id !== 'number' || !Number.isSafeInteger(projected.id) || projected.id <= 0) {
508
+ return false;
509
+ }
510
+ if (!isBoundedText(projected.name, MAX_NAME_BYTES)) return false;
511
+ if (projected.disabled !== 0 && projected.disabled !== 1) return false;
512
+ if (projected.isolate !== 0 && projected.isolate !== 1) return false;
513
+ return projected.config === null || isBoundedText(projected.config, MAX_CONFIG_BYTES);
514
+ }
515
+ function openNativeSqlite(filename, options) {
516
+ const require = createRequire(import.meta.url);
517
+ const BetterSqlite3 = require('better-sqlite3');
518
+ return new BetterSqlite3(filename, options);
519
+ }
520
+
521
+ export { DatabaseDialectBetterSqlite3, DatabaseDialectMysql, DatabaseDialectMysql3, DatabaseDialectPg, ScopeModuleAOrmdialect, createProtectedSqliteRegistry };
262
522
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/bean/databaseDialect.betterSqlite3.ts","../src/bean/databaseDialect.mysql.ts","../src/bean/databaseDialect.mysql3.ts","../src/bean/databaseDialect.pg.ts","../src/.metadata/index.ts"],"sourcesContent":[null,null,null,null,null],"names":["DatabaseDialectBetterSqlite3","ServiceDatabaseDialectBase","constructor","args","_capabilities","like","ilike","level","_configBase","useNullAsDefault","pool","afterCreate","conn","done","sqlite3_afterCreate","then","catch","fetchDatabases","_schemaBuilder","databasePrefix","dbDir","_getDbDir","files","globby","cwd","onlyFiles","map","item","name","path","join","createDatabase","databaseName","ensureDir","dropDatabase","remove","part","fetchIndexes","schemaBuilder","tableName","items","raw","indexName","insert","builder","datas","insertAsMysql","select","fn","selectAsSqlite3","query","result","app","projectPath","__decorate","DatabaseDialect","__z_BeanInfo","module","pragma","journal_mode","toLocaleLowerCase","DatabaseDialectMysql","mysql_afterCreate","res","dbs","db","Object","keys","Key_name","selectAsMysql","fetchColumns","connection","columns","column","columnName","columnType","viewDependents","viewName","sqlViews","distinct","fromRaw","where","ref_name","dep_name","_executeQuery","sql","queryAsync","promisify","cb","DatabaseDialectMysql3","$Class","extend","Virtual","DatabaseDialectPg","undefined","rows","datname","indexname","insertAsPg","filter","toLowerCase","ScopeModuleAOrmdialect","BeanScopeBase","Scope"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/bean/databaseDialect.betterSqlite3.ts","../src/bean/databaseDialect.mysql.ts","../src/bean/databaseDialect.mysql3.ts","../src/bean/databaseDialect.pg.ts","../src/.metadata/index.ts","../src/lib/protectedSqliteRegistry.ts"],"sourcesContent":[null,null,null,null,null,null],"names":["DatabaseDialectBetterSqlite3","ServiceDatabaseDialectBase","constructor","args","_capabilities","like","ilike","level","_configBase","useNullAsDefault","pool","afterCreate","conn","done","sqlite3_afterCreate","then","catch","fetchDatabases","_schemaBuilder","databasePrefix","dbDir","_getDbDir","files","globby","cwd","onlyFiles","map","item","name","path","join","createDatabase","databaseName","ensureDir","dropDatabase","isolated","resolveTestRunId","app","meta","env","META_MODE","VONA_TEST_RUN_ID","paths","resolveVonaLocalPaths","projectPath","assertTestRunOwner","dataRoot","basename","resolve","sqliteRoot","test","Error","assertNotSymlink","file","part","remove","fetchIndexes","schemaBuilder","tableName","items","raw","indexName","insert","builder","datas","insertAsMysql","select","fn","selectAsSqlite3","query","result","__decorate","DatabaseDialect","__z_BeanInfo","module","lstat","isSymbolicLink","error","code","pragma","journal_mode","toLocaleLowerCase","DatabaseDialectMysql","mysql_afterCreate","escapedPrefix","replaceAll","res","length","dbs","db","Object","keys","Key_name","selectAsMysql","fetchColumns","connection","columns","column","columnName","columnType","viewDependents","viewName","sqlViews","distinct","fromRaw","where","ref_name","dep_name","_executeQuery","sql","queryAsync","promisify","cb","DatabaseDialectMysql3","$Class","extend","Virtual","DatabaseDialectPg","undefined","rows","datname","indexname","insertAsPg","filter","toLowerCase","ScopeModuleAOrmdialect","BeanScopeBase","Scope","MAX_NAME_BYTES","MAX_CONFIG_BYTES","LOOKUP_BUDGET_MS","PRIVATE_TIMEOUT_MS","PROTECTED_SQLITE_REGISTRY_SQL","productionDependencies","freeze","open","openNativeSqlite","now","performance","hasRequestBoundary","getRequestBoundary","createProtectedSqliteRegistry","options","createProtectedSqliteRegistryInternal","dependencies","filename","readSupportedFilename","state","attempted","active","closing","database","statement","closePromise","closeResolve","unavailable","outcome","finalizeClose","close","settleDeferredClose","prepare","readonly","fileMustExist","timeout","journalMode","simple","busyTimeout","probe","all","Array","isArray","some","row","isValidProjectionRow","lookup","deadlineAt","isBoundedText","Number","isFinite","projected","disabled","id","isolate","config","Promise","snapshot","prototype","getPrototypeOf","Reflect","ownKeys","descriptor","getOwnPropertyDescriptor","hasOwn","value","isWellFormed","isAbsolute","includes","maxBytes","Buffer","byteLength","__protected_valid","isSafeInteger","require","createRequire","import","url","BetterSqlite3"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export declare const PROTECTED_SQLITE_REGISTRY_SQL = "SELECT\n CASE WHEN typeof(id) = 'integer' AND id > 0 AND id <= 9007199254740991 THEN id ELSE NULL END AS id,\n CASE WHEN typeof(name) = 'text' AND length(CAST(name AS BLOB)) <= 256 THEN name ELSE NULL END AS name,\n CASE WHEN typeof(disabled) = 'integer' AND disabled IN (0, 1) THEN disabled ELSE NULL END AS disabled,\n CASE WHEN typeof(isolate) = 'integer' AND isolate IN (0, 1) THEN isolate ELSE NULL END AS isolate,\n CASE\n WHEN config IS NULL THEN NULL\n WHEN typeof(config) = 'text' AND length(CAST(config AS BLOB)) <= 65536 THEN config\n ELSE NULL\n END AS config,\n CASE\n WHEN typeof(id) = 'integer' AND id > 0 AND id <= 9007199254740991\n AND typeof(name) = 'text' AND length(CAST(name AS BLOB)) <= 256\n AND typeof(disabled) = 'integer' AND disabled IN (0, 1)\n AND typeof(isolate) = 'integer' AND isolate IN (0, 1)\n AND (config IS NULL OR (typeof(config) = 'text' AND length(CAST(config AS BLOB)) <= 65536))\n THEN 1\n ELSE 0\n END AS __protected_valid\nFROM aInstance\nWHERE name COLLATE BINARY = ?\n AND deleted = 0\nLIMIT 2";
2
+ type ProtectedSqliteState = 'new' | 'ready' | 'faulted' | 'closed';
3
+ type ProtectedSqlitePrepareOutcome = 'ready' | 'already_prepared' | 'boundary_required' | 'unsupported' | 'unavailable';
4
+ export interface ProtectedSqliteRegistryOptions {
5
+ readonly filename: string;
6
+ }
7
+ export interface ProtectedSqliteRegistryRow {
8
+ readonly id: number;
9
+ readonly name: string;
10
+ readonly disabled: boolean;
11
+ readonly isolate: boolean;
12
+ readonly config: string | null;
13
+ }
14
+ export interface ProtectedSqliteRegistryPrepareResult {
15
+ readonly outcome: ProtectedSqlitePrepareOutcome;
16
+ }
17
+ export type ProtectedSqliteRegistryLookupOutcome = 'found' | 'missing' | 'duplicate' | 'disabled' | 'invalid_input' | 'expired' | 'boundary_required' | 'reentrant' | 'unavailable';
18
+ export type ProtectedSqliteRegistryLookupResult = Readonly<{
19
+ readonly outcome: 'found';
20
+ readonly row: ProtectedSqliteRegistryRow;
21
+ }> | Readonly<{
22
+ readonly outcome: Exclude<ProtectedSqliteRegistryLookupOutcome, 'found'>;
23
+ }>;
24
+ export interface ProtectedSqliteRegistryCloseResult {
25
+ readonly outcome: 'closed' | 'close_failed';
26
+ }
27
+ export interface ProtectedSqliteRegistrySnapshot {
28
+ readonly state: ProtectedSqliteState;
29
+ readonly active: boolean;
30
+ readonly closing: boolean;
31
+ }
32
+ export interface ProtectedSqliteRegistry {
33
+ readonly prepare: () => ProtectedSqliteRegistryPrepareResult;
34
+ readonly lookup: (name: string, deadlineAt?: number) => ProtectedSqliteRegistryLookupResult;
35
+ readonly close: () => Promise<ProtectedSqliteRegistryCloseResult>;
36
+ readonly snapshot: () => ProtectedSqliteRegistrySnapshot;
37
+ }
38
+ interface ProtectedSqliteStatement {
39
+ all(name: string): readonly unknown[];
40
+ }
41
+ interface ProtectedSqliteDatabase {
42
+ pragma(sql: string, options?: Readonly<{
43
+ readonly simple: true;
44
+ }>): unknown;
45
+ prepare(sql: string): ProtectedSqliteStatement;
46
+ close(): void;
47
+ }
48
+ interface ProtectedSqliteOpenOptions {
49
+ readonly readonly: true;
50
+ readonly fileMustExist: true;
51
+ readonly timeout: 100;
52
+ }
53
+ type ProtectedSqliteOpen = (filename: string, options: ProtectedSqliteOpenOptions) => ProtectedSqliteDatabase;
54
+ interface ProtectedSqliteDependencies {
55
+ readonly open: ProtectedSqliteOpen;
56
+ readonly now: () => number;
57
+ readonly hasRequestBoundary: () => boolean;
58
+ }
59
+ export declare function createProtectedSqliteRegistry(options: ProtectedSqliteRegistryOptions): ProtectedSqliteRegistry;
60
+ export declare function createProtectedSqliteRegistryForTest(options: unknown, dependencies: Readonly<Partial<ProtectedSqliteDependencies> & {
61
+ readonly open: ProtectedSqliteOpen;
62
+ }>): ProtectedSqliteRegistry;
63
+ export declare function createProtectedSqliteRegistryInternal(options: unknown, dependencies: ProtectedSqliteDependencies): ProtectedSqliteRegistry;
64
+ export {};
65
+ //# sourceMappingURL=protectedSqliteRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protectedSqliteRegistry.d.ts","sourceRoot":"","sources":["../../src/lib/protectedSqliteRegistry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vona-module-a-ormdialect",
3
- "version": "5.1.18",
4
- "gitHead": "94435329d69fc19d0d15e4e10c3b1111e99ab1cf",
3
+ "version": "5.1.21",
4
+ "gitHead": "c4185c759d9e8933a078182614a83fd43031659f",
5
5
  "description": "",
6
6
  "keywords": [
7
7
  "Vona Module"
@@ -11,7 +11,9 @@ import type {
11
11
 
12
12
  import { ensureDir, remove } from 'fs-extra';
13
13
  import { globby } from 'globby';
14
+ import { lstat } from 'node:fs/promises';
14
15
  import path from 'node:path';
16
+ import { assertTestRunOwner, resolveVonaLocalPaths, resolveTestRunId } from 'vona';
15
17
  import { ServiceDatabaseDialectBase, DatabaseDialect } from 'vona-module-a-orm';
16
18
 
17
19
  export interface IDatabaseDialectOptionsBetterSqlite3 extends IDecoratorDatabaseDialectOptions {}
@@ -54,6 +56,30 @@ export class DatabaseDialectBetterSqlite3 extends ServiceDatabaseDialectBase {
54
56
  }
55
57
 
56
58
  async dropDatabase(_schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<void> {
59
+ const isolated = resolveTestRunId(
60
+ this.app.meta.env.META_MODE,
61
+ this.app.meta.env.VONA_TEST_RUN_ID,
62
+ );
63
+ if (isolated) {
64
+ const paths = resolveVonaLocalPaths(this.app.projectPath, 'test', isolated);
65
+ assertTestRunOwner(paths.dataRoot, isolated);
66
+ const basename = path.basename(databaseName);
67
+ if (
68
+ path.resolve(databaseName) !== path.join(paths.sqliteRoot, basename) ||
69
+ !/^vona-test-[\w-]+-\d{8}-\d{6}\.db$/.test(basename)
70
+ ) {
71
+ throw new Error(
72
+ `Isolated test cannot remove SQLite database outside its owned root: ${databaseName}`,
73
+ );
74
+ }
75
+ await assertNotSymlink(paths.sqliteRoot);
76
+ for (const file of [
77
+ databaseName,
78
+ ...['shm', 'wal', 'journal'].map(part => `${databaseName}-${part}`),
79
+ ]) {
80
+ await assertNotSymlink(file);
81
+ }
82
+ }
57
83
  await remove(databaseName);
58
84
  for (const part of ['shm', 'wal', 'journal']) {
59
85
  await remove(`${databaseName}-${part}`);
@@ -93,7 +119,21 @@ export class DatabaseDialectBetterSqlite3 extends ServiceDatabaseDialectBase {
93
119
  }
94
120
 
95
121
  private _getDbDir() {
96
- return path.join(this.app.projectPath, '.app/sqlite3');
122
+ return resolveVonaLocalPaths(
123
+ this.app.projectPath,
124
+ this.app.meta.env.META_MODE,
125
+ this.app.meta.env.VONA_TEST_RUN_ID,
126
+ ).sqliteRoot;
127
+ }
128
+ }
129
+
130
+ async function assertNotSymlink(file: string) {
131
+ try {
132
+ if ((await lstat(file)).isSymbolicLink()) {
133
+ throw new Error(`Isolated test SQLite path is a symlink: ${file}`);
134
+ }
135
+ } catch (error) {
136
+ if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;
97
137
  }
98
138
  }
99
139
 
@@ -34,7 +34,10 @@ export class DatabaseDialectMysql extends ServiceDatabaseDialectBase {
34
34
  schemaBuilder: Knex.SchemaBuilder,
35
35
  databasePrefix: string,
36
36
  ): Promise<IFetchDatabasesResultItem[]> {
37
- const res = await schemaBuilder.raw(`show databases like '${databasePrefix}%'`);
37
+ const escapedPrefix = databasePrefix.replaceAll("'", "''");
38
+ const res = await schemaBuilder.raw(
39
+ `select schema_name from information_schema.schemata where left(schema_name, ${databasePrefix.length}) = '${escapedPrefix}'`,
40
+ );
38
41
  let dbs = res[0];
39
42
  dbs = dbs.map(db => {
40
43
  const name = db[Object.keys(db)[0]];
@@ -26,8 +26,9 @@ export class DatabaseDialectPg extends ServiceDatabaseDialectBase {
26
26
  schemaBuilder: Knex.SchemaBuilder,
27
27
  databasePrefix: string,
28
28
  ): Promise<IFetchDatabasesResultItem[]> {
29
+ const escapedPrefix = databasePrefix.replaceAll("'", "''");
29
30
  const res: any = await schemaBuilder.raw(
30
- `select datname from pg_database where datname like '${databasePrefix}%'`,
31
+ `select datname from pg_database where left(datname, ${databasePrefix.length}) = '${escapedPrefix}'`,
31
32
  );
32
33
  let dbs = res.rows;
33
34
  dbs = dbs.map(db => {
package/src/index.ts CHANGED
@@ -1 +1,12 @@
1
1
  export * from './.metadata/index.ts';
2
+ export { createProtectedSqliteRegistry } from './lib/protectedSqliteRegistry.ts';
3
+ export type {
4
+ ProtectedSqliteRegistry,
5
+ ProtectedSqliteRegistryCloseResult,
6
+ ProtectedSqliteRegistryLookupOutcome,
7
+ ProtectedSqliteRegistryLookupResult,
8
+ ProtectedSqliteRegistryOptions,
9
+ ProtectedSqliteRegistryPrepareResult,
10
+ ProtectedSqliteRegistryRow,
11
+ ProtectedSqliteRegistrySnapshot,
12
+ } from './lib/protectedSqliteRegistry.ts';
@@ -0,0 +1,356 @@
1
+ import { createRequire } from 'node:module';
2
+ import path from 'node:path';
3
+ import { getRequestBoundary } from 'vona';
4
+
5
+ const MAX_NAME_BYTES = 256;
6
+ const MAX_CONFIG_BYTES = 65_536;
7
+ const LOOKUP_BUDGET_MS = 1_000;
8
+ const PRIVATE_TIMEOUT_MS = 100;
9
+
10
+ export const PROTECTED_SQLITE_REGISTRY_SQL = `SELECT
11
+ CASE WHEN typeof(id) = 'integer' AND id > 0 AND id <= 9007199254740991 THEN id ELSE NULL END AS id,
12
+ CASE WHEN typeof(name) = 'text' AND length(CAST(name AS BLOB)) <= 256 THEN name ELSE NULL END AS name,
13
+ CASE WHEN typeof(disabled) = 'integer' AND disabled IN (0, 1) THEN disabled ELSE NULL END AS disabled,
14
+ CASE WHEN typeof(isolate) = 'integer' AND isolate IN (0, 1) THEN isolate ELSE NULL END AS isolate,
15
+ CASE
16
+ WHEN config IS NULL THEN NULL
17
+ WHEN typeof(config) = 'text' AND length(CAST(config AS BLOB)) <= 65536 THEN config
18
+ ELSE NULL
19
+ END AS config,
20
+ CASE
21
+ WHEN typeof(id) = 'integer' AND id > 0 AND id <= 9007199254740991
22
+ AND typeof(name) = 'text' AND length(CAST(name AS BLOB)) <= 256
23
+ AND typeof(disabled) = 'integer' AND disabled IN (0, 1)
24
+ AND typeof(isolate) = 'integer' AND isolate IN (0, 1)
25
+ AND (config IS NULL OR (typeof(config) = 'text' AND length(CAST(config AS BLOB)) <= 65536))
26
+ THEN 1
27
+ ELSE 0
28
+ END AS __protected_valid
29
+ FROM aInstance
30
+ WHERE name COLLATE BINARY = ?
31
+ AND deleted = 0
32
+ LIMIT 2`;
33
+
34
+ type ProtectedSqliteState = 'new' | 'ready' | 'faulted' | 'closed';
35
+
36
+ type ProtectedSqlitePrepareOutcome =
37
+ | 'ready'
38
+ | 'already_prepared'
39
+ | 'boundary_required'
40
+ | 'unsupported'
41
+ | 'unavailable';
42
+
43
+ export interface ProtectedSqliteRegistryOptions {
44
+ readonly filename: string;
45
+ }
46
+
47
+ export interface ProtectedSqliteRegistryRow {
48
+ readonly id: number;
49
+ readonly name: string;
50
+ readonly disabled: boolean;
51
+ readonly isolate: boolean;
52
+ readonly config: string | null;
53
+ }
54
+
55
+ export interface ProtectedSqliteRegistryPrepareResult {
56
+ readonly outcome: ProtectedSqlitePrepareOutcome;
57
+ }
58
+
59
+ export type ProtectedSqliteRegistryLookupOutcome =
60
+ | 'found'
61
+ | 'missing'
62
+ | 'duplicate'
63
+ | 'disabled'
64
+ | 'invalid_input'
65
+ | 'expired'
66
+ | 'boundary_required'
67
+ | 'reentrant'
68
+ | 'unavailable';
69
+
70
+ export type ProtectedSqliteRegistryLookupResult =
71
+ | Readonly<{
72
+ readonly outcome: 'found';
73
+ readonly row: ProtectedSqliteRegistryRow;
74
+ }>
75
+ | Readonly<{ readonly outcome: Exclude<ProtectedSqliteRegistryLookupOutcome, 'found'> }>;
76
+
77
+ export interface ProtectedSqliteRegistryCloseResult {
78
+ readonly outcome: 'closed' | 'close_failed';
79
+ }
80
+
81
+ export interface ProtectedSqliteRegistrySnapshot {
82
+ readonly state: ProtectedSqliteState;
83
+ readonly active: boolean;
84
+ readonly closing: boolean;
85
+ }
86
+
87
+ export interface ProtectedSqliteRegistry {
88
+ readonly prepare: () => ProtectedSqliteRegistryPrepareResult;
89
+ readonly lookup: (name: string, deadlineAt?: number) => ProtectedSqliteRegistryLookupResult;
90
+ readonly close: () => Promise<ProtectedSqliteRegistryCloseResult>;
91
+ readonly snapshot: () => ProtectedSqliteRegistrySnapshot;
92
+ }
93
+
94
+ interface ProtectedSqliteStatement {
95
+ all(name: string): readonly unknown[];
96
+ }
97
+
98
+ interface ProtectedSqliteDatabase {
99
+ pragma(sql: string, options?: Readonly<{ readonly simple: true }>): unknown;
100
+ prepare(sql: string): ProtectedSqliteStatement;
101
+ close(): void;
102
+ }
103
+
104
+ interface ProtectedSqliteOpenOptions {
105
+ readonly readonly: true;
106
+ readonly fileMustExist: true;
107
+ readonly timeout: 100;
108
+ }
109
+
110
+ type ProtectedSqliteOpen = (
111
+ filename: string,
112
+ options: ProtectedSqliteOpenOptions,
113
+ ) => ProtectedSqliteDatabase;
114
+
115
+ interface ProtectedSqliteDependencies {
116
+ readonly open: ProtectedSqliteOpen;
117
+ readonly now: () => number;
118
+ readonly hasRequestBoundary: () => boolean;
119
+ }
120
+
121
+ const productionDependencies: ProtectedSqliteDependencies = Object.freeze({
122
+ open: openNativeSqlite,
123
+ now: () => performance.now(),
124
+ hasRequestBoundary: () => getRequestBoundary() !== undefined,
125
+ });
126
+
127
+ export function createProtectedSqliteRegistry(
128
+ options: ProtectedSqliteRegistryOptions,
129
+ ): ProtectedSqliteRegistry {
130
+ return createProtectedSqliteRegistryInternal(options, productionDependencies);
131
+ }
132
+
133
+ // This seam is intentionally not exported by the package barrel. It makes lifecycle and
134
+ // diagnostic-containment tests deterministic without accepting an alternate production driver.
135
+ export function createProtectedSqliteRegistryForTest(
136
+ options: unknown,
137
+ dependencies: Readonly<
138
+ Partial<ProtectedSqliteDependencies> & { readonly open: ProtectedSqliteOpen }
139
+ >,
140
+ ): ProtectedSqliteRegistry {
141
+ return createProtectedSqliteRegistryInternal(options, {
142
+ open: dependencies.open,
143
+ now: dependencies.now ?? (() => performance.now()),
144
+ hasRequestBoundary:
145
+ dependencies.hasRequestBoundary ?? (() => getRequestBoundary() !== undefined),
146
+ });
147
+ }
148
+
149
+ export function createProtectedSqliteRegistryInternal(
150
+ options: unknown,
151
+ dependencies: ProtectedSqliteDependencies,
152
+ ): ProtectedSqliteRegistry {
153
+ const filename = readSupportedFilename(options);
154
+ let state: ProtectedSqliteState = 'new';
155
+ let attempted = false;
156
+ let active = false;
157
+ let closing = false;
158
+ let database: ProtectedSqliteDatabase | undefined;
159
+ let statement: ProtectedSqliteStatement | undefined;
160
+ let closePromise: Promise<ProtectedSqliteRegistryCloseResult> | undefined;
161
+ let closeResolve: ((result: ProtectedSqliteRegistryCloseResult) => void) | undefined;
162
+
163
+ const unavailable = (outcome: Exclude<ProtectedSqliteRegistryLookupOutcome, 'found'>) =>
164
+ Object.freeze({ outcome }) as ProtectedSqliteRegistryLookupResult;
165
+
166
+ const finalizeClose = (): ProtectedSqliteRegistryCloseResult => {
167
+ if (!database) {
168
+ state = 'closed';
169
+ return Object.freeze({ outcome: 'closed' });
170
+ }
171
+ try {
172
+ database.close();
173
+ } catch {
174
+ state = 'faulted';
175
+ return Object.freeze({ outcome: 'close_failed' });
176
+ }
177
+ database = undefined;
178
+ statement = undefined;
179
+ state = 'closed';
180
+ return Object.freeze({ outcome: 'closed' });
181
+ };
182
+
183
+ const settleDeferredClose = () => {
184
+ if (!closeResolve) return;
185
+ const resolve = closeResolve;
186
+ closeResolve = undefined;
187
+ resolve(finalizeClose());
188
+ };
189
+
190
+ const prepare = (): ProtectedSqliteRegistryPrepareResult => {
191
+ if (dependencies.hasRequestBoundary()) return Object.freeze({ outcome: 'boundary_required' });
192
+ if (closing || state === 'closed') return Object.freeze({ outcome: 'unavailable' });
193
+ if (attempted) return Object.freeze({ outcome: 'already_prepared' });
194
+ attempted = true;
195
+ if (!filename) {
196
+ state = 'faulted';
197
+ return Object.freeze({ outcome: 'unsupported' });
198
+ }
199
+ try {
200
+ database = dependencies.open(filename, {
201
+ readonly: true,
202
+ fileMustExist: true,
203
+ timeout: PRIVATE_TIMEOUT_MS,
204
+ });
205
+ const journalMode = database.pragma('journal_mode', { simple: true });
206
+ const busyTimeout = database.pragma('busy_timeout', { simple: true });
207
+ if (journalMode !== 'wal' || busyTimeout !== PRIVATE_TIMEOUT_MS) throw new Error();
208
+ statement = database.prepare(PROTECTED_SQLITE_REGISTRY_SQL);
209
+ const probe = statement.all('');
210
+ if (
211
+ !Array.isArray(probe) ||
212
+ probe.length > 2 ||
213
+ probe.some(row => !isValidProjectionRow(row))
214
+ ) {
215
+ throw new Error();
216
+ }
217
+ state = 'ready';
218
+ return Object.freeze({ outcome: 'ready' });
219
+ } catch {
220
+ state = 'faulted';
221
+ return Object.freeze({ outcome: 'unavailable' });
222
+ }
223
+ };
224
+
225
+ const lookup = (name: string, deadlineAt = dependencies.now() + LOOKUP_BUDGET_MS) => {
226
+ if (!dependencies.hasRequestBoundary()) return unavailable('boundary_required');
227
+ if (state !== 'ready' || closing || !database || !statement) return unavailable('unavailable');
228
+ if (!isBoundedText(name, MAX_NAME_BYTES)) {
229
+ return unavailable('invalid_input');
230
+ }
231
+ if (!Number.isFinite(deadlineAt) || dependencies.now() >= deadlineAt) {
232
+ return unavailable('expired');
233
+ }
234
+ if (active) return unavailable('reentrant');
235
+ active = true;
236
+ try {
237
+ const rows = statement.all(name);
238
+ if (closing || dependencies.now() >= deadlineAt) return unavailable('expired');
239
+ if (!Array.isArray(rows)) {
240
+ state = 'faulted';
241
+ return unavailable('unavailable');
242
+ }
243
+ if (rows.length > 2) {
244
+ state = 'faulted';
245
+ return unavailable('unavailable');
246
+ }
247
+ if (rows.length === 0) return unavailable('missing');
248
+ if (rows.length === 2) return unavailable('duplicate');
249
+ const row = rows[0];
250
+ if (!isValidProjectionRow(row)) {
251
+ state = 'faulted';
252
+ return unavailable('unavailable');
253
+ }
254
+ const projected = row as Record<string, unknown>;
255
+ if (projected.disabled === 1) return unavailable('disabled');
256
+ const result = Object.freeze({
257
+ outcome: 'found' as const,
258
+ row: Object.freeze({
259
+ id: projected.id as number,
260
+ name: projected.name as string,
261
+ disabled: projected.disabled === 1,
262
+ isolate: projected.isolate === 1,
263
+ config: projected.config as string | null,
264
+ }),
265
+ });
266
+ return result;
267
+ } catch {
268
+ state = 'faulted';
269
+ return unavailable('unavailable');
270
+ } finally {
271
+ active = false;
272
+ if (closing) settleDeferredClose();
273
+ }
274
+ };
275
+
276
+ const close = () => {
277
+ if (closePromise) return closePromise;
278
+ closing = true;
279
+ if (active) {
280
+ closePromise = new Promise<ProtectedSqliteRegistryCloseResult>(resolve => {
281
+ closeResolve = resolve;
282
+ });
283
+ } else {
284
+ closePromise = Promise.resolve(finalizeClose());
285
+ }
286
+ return closePromise;
287
+ };
288
+
289
+ return Object.freeze({
290
+ prepare,
291
+ lookup,
292
+ close,
293
+ snapshot: () => Object.freeze({ state, active, closing }),
294
+ });
295
+ }
296
+
297
+ function readSupportedFilename(options: unknown): string | undefined {
298
+ try {
299
+ if (!options || typeof options !== 'object' || Array.isArray(options)) return undefined;
300
+ const prototype = Object.getPrototypeOf(options);
301
+ if (prototype !== Object.prototype && prototype !== null) return undefined;
302
+ const keys = Reflect.ownKeys(options);
303
+ if (keys.length !== 1 || keys[0] !== 'filename') return undefined;
304
+ const descriptor = Object.getOwnPropertyDescriptor(options, 'filename');
305
+ if (!descriptor || !Object.hasOwn(descriptor, 'value')) return undefined;
306
+ const filename: unknown = descriptor.value;
307
+ if (
308
+ typeof filename !== 'string' ||
309
+ !filename.isWellFormed() ||
310
+ !path.isAbsolute(filename) ||
311
+ filename.includes('\0')
312
+ ) {
313
+ return undefined;
314
+ }
315
+ return filename;
316
+ } catch {
317
+ return undefined;
318
+ }
319
+ }
320
+
321
+ function isBoundedText(value: unknown, maxBytes: number): value is string {
322
+ return (
323
+ typeof value === 'string' &&
324
+ value.isWellFormed() &&
325
+ Buffer.byteLength(value, 'utf8') <= maxBytes
326
+ );
327
+ }
328
+
329
+ function isValidProjectionRow(row: unknown): boolean {
330
+ if (!row || typeof row !== 'object') return false;
331
+ const projected = row as Record<string, unknown>;
332
+ if (projected.__protected_valid !== 1) return false;
333
+ if (
334
+ typeof projected.id !== 'number' ||
335
+ !Number.isSafeInteger(projected.id) ||
336
+ projected.id <= 0
337
+ ) {
338
+ return false;
339
+ }
340
+ if (!isBoundedText(projected.name, MAX_NAME_BYTES)) return false;
341
+ if (projected.disabled !== 0 && projected.disabled !== 1) return false;
342
+ if (projected.isolate !== 0 && projected.isolate !== 1) return false;
343
+ return projected.config === null || isBoundedText(projected.config, MAX_CONFIG_BYTES);
344
+ }
345
+
346
+ function openNativeSqlite(
347
+ filename: string,
348
+ options: ProtectedSqliteOpenOptions,
349
+ ): ProtectedSqliteDatabase {
350
+ const require = createRequire(import.meta.url);
351
+ const BetterSqlite3 = require('better-sqlite3') as new (
352
+ filename: string,
353
+ options: ProtectedSqliteOpenOptions,
354
+ ) => ProtectedSqliteDatabase;
355
+ return new BetterSqlite3(filename, options);
356
+ }