orez 0.0.44 → 0.0.46

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.
package/README.md CHANGED
@@ -208,9 +208,9 @@ The mutex uses `setImmediate`/`setTimeout` between releases instead of resolving
208
208
 
209
209
  When `execProtocolRaw` throws (PGlite internal error), the proxy sends a proper ErrorResponse + ReadyForQuery over the wire instead of destroying the socket. The client sees an error message and continues working.
210
210
 
211
- ### SQLite shim via NODE_PATH (not require hooks)
211
+ ### SQLite shim via ESM loader hooks
212
212
 
213
- zero-cache imports `@rocicorp/zero-sqlite3` (a native C addon). orez creates a fake package in `/tmp` that redirects to bedrock-sqlite WASM and prepends it to `NODE_PATH`. This avoids `Module._resolveFilename` monkey-patching or require hooks, both of which break Vite's module resolution.
213
+ zero-cache imports `@rocicorp/zero-sqlite3` (a native C addon) via ESM `import`. orez uses Node's `module.register()` API with `--import` to intercept resolution — ESM `resolve` and `load` hooks redirect `@rocicorp/zero-sqlite3` to bedrock-sqlite WASM at runtime. The hook templates live in `src/shim/` and are written to tmpdir with the resolved bedrock-sqlite path substituted.
214
214
 
215
215
  The shim also polyfills the better-sqlite3 API surface zero-cache expects: `unsafeMode()`, `defaultSafeIntegers()`, `serialize()`, `backup()`, and `scanStatus`/`scanStatusV2`/`scanStatusReset` on Statement prototypes (zero-cache's query planner calls these for scan statistics, which WASM doesn't support).
216
216
 
@@ -234,9 +234,9 @@ Columns with types zero-cache can't handle (`tsvector`, `tsquery`, `USER-DEFINED
234
234
 
235
235
  If `ZERO_APP_PUBLICATIONS` is set, only tables in that publication get change-tracking triggers. This prevents streaming changes for private tables (user sessions, accounts) that zero-cache doesn't know about. Stale triggers from previous installs (before the publication existed) are cleaned up automatically.
236
236
 
237
- ### Stale replica cleanup on startup
237
+ ### Stale lock file cleanup on startup
238
238
 
239
- The SQLite replica (`zero-replica.db`) plus its WAL/SHM/WAL2 lock files are deleted on every startup. The replica is just a cache of PGlite data and is safe to recreate. Without cleanup, zero-cache can fail to start with stale lock files from a previous crash.
239
+ Only the SQLite replica's lock files (`-wal`, `-shm`, `-wal2`) are deleted on startup not the replica itself. The replica is a cache of PGlite data; keeping it lets zero-cache catch up via replication (nearly instant) instead of doing a full initial sync (COPY of all tables). If the replica is too stale, `ZERO_AUTO_RESET=true` makes zero-cache wipe and resync automatically. Lock files from a previous crash are cleaned to prevent startup failures.
240
240
 
241
241
  ### Data directory migration
242
242
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC5D,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAe3D,wBAAsB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM;;;;;;;GA+H1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC5D,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAe3D,wBAAsB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM;;;;;;;GA+H1E"}
package/dist/index.js CHANGED
@@ -8,7 +8,9 @@
8
8
  import { spawn } from 'node:child_process';
9
9
  import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
10
10
  import { createRequire } from 'node:module';
11
+ import { totalmem } from 'node:os';
11
12
  import { dirname, resolve } from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
12
14
  import { getConfig, getConnectionString } from './config.js';
13
15
  import { log, port, setLogLevel } from './log.js';
14
16
  import { startPgProxy } from './pg-proxy.js';
@@ -103,8 +105,8 @@ export async function startZeroLite(overrides = {}) {
103
105
  // re-install change tracking on tables created by the callback
104
106
  await installChangeTracking(db);
105
107
  }
106
- // clean up stale sqlite replica from previous runs
107
- cleanupStaleReplica(config);
108
+ // clean up stale lock files from previous crash (keep replica for fast restart)
109
+ cleanupStaleLockFiles(config);
108
110
  // start zero-cache
109
111
  let zeroCacheProcess = null;
110
112
  if (!config.skipZeroCache) {
@@ -143,19 +145,18 @@ export async function startZeroLite(overrides = {}) {
143
145
  };
144
146
  return { config, stop, db, instances, pgPort: config.pgPort, zeroPort: config.zeroPort };
145
147
  }
146
- function cleanupStaleReplica(config) {
148
+ function cleanupStaleLockFiles(config) {
147
149
  const replicaPath = resolve(config.dataDir, 'zero-replica.db');
148
- // delete replica + all lock/wal files so zero-cache does a fresh sync
149
- // the replica is just a cache of pglite data, safe to recreate
150
- for (const suffix of ['', '-wal', '-shm', '-wal2']) {
150
+ // only delete lock/wal files that prevent zero-cache from starting after a crash.
151
+ // keep the replica db itself zero-cache catches up via replication, which is
152
+ // nearly instant vs a full initial sync (COPY of all tables). if the replica is
153
+ // too stale, ZERO_AUTO_RESET=true makes zero-cache wipe and resync automatically.
154
+ for (const suffix of ['-wal', '-shm', '-wal2']) {
151
155
  const file = replicaPath + suffix;
152
156
  try {
153
157
  if (existsSync(file)) {
154
158
  unlinkSync(file);
155
- if (suffix)
156
- log.debug.orez(`cleaned up stale ${suffix} file`);
157
- else
158
- log.debug.orez('cleaned up stale replica (will re-sync)');
159
+ log.debug.orez(`cleaned up stale ${suffix} file`);
159
160
  }
160
161
  }
161
162
  catch {
@@ -190,84 +191,21 @@ async function seedIfNeeded(db, config) {
190
191
  }
191
192
  log.orez('seeded');
192
193
  }
193
- // write three files to tmpdir:
194
- // 1. shim.cjs wraps bedrock-sqlite as @rocicorp/zero-sqlite3
195
- // 2. hooks.mjs — ESM loader hook that resolves @rocicorp/zero-sqlite3 → shim
196
- // 3. register.mjs — --import entrypoint that registers the hook
197
- // uses node's module.register() API for ESM resolution interception.
194
+ // write esm loader hooks to tmpdir that intercept @rocicorp/zero-sqlite3
195
+ // and redirect to bedrock-sqlite wasm. templates live in src/shim/.
198
196
  // returns the path to register.mjs (passed via --import in NODE_OPTIONS).
199
197
  function writeSqliteShim() {
200
198
  const tmp = process.env.TMPDIR || process.env.TEMP || '/tmp';
201
199
  const dir = resolve(tmp, 'orez-sqlite');
202
200
  mkdirSync(dir, { recursive: true });
203
201
  const bedrockEntry = resolvePackage('bedrock-sqlite');
204
- // ESM loader hooks — resolve + load @rocicorp/zero-sqlite3 as our shim.
205
- // uses a load hook to inline the shim source so we control the format.
202
+ const shimDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'src', 'shim');
206
203
  const hooksPath = resolve(dir, 'hooks.mjs');
207
- writeFileSync(hooksPath, `const SHIM_URL = 'orez-sqlite-shim://shim';
208
- const BEDROCK_PATH = '${bedrockEntry}';
209
-
210
- export function resolve(specifier, context, nextResolve) {
211
- if (specifier === '@rocicorp/zero-sqlite3' || specifier.startsWith('@rocicorp/zero-sqlite3/')) {
212
- return { url: SHIM_URL, shortCircuit: true };
213
- }
214
- return nextResolve(specifier, context);
215
- }
216
-
217
- export function load(url, context, nextLoad) {
218
- if (url === SHIM_URL) {
219
- return {
220
- format: 'module',
221
- shortCircuit: true,
222
- source: \`
223
- import { createRequire } from 'node:module';
224
- const require = createRequire('\${BEDROCK_PATH}');
225
- const mod = require('\${BEDROCK_PATH}');
226
- const OrigDatabase = mod.Database;
227
- const SqliteError = mod.SqliteError;
228
- function Database(...args) {
229
- const db = new OrigDatabase(...args);
230
- try { db.pragma('busy_timeout = 30000'); db.pragma('synchronous = normal'); } catch(e) {}
231
- return db;
232
- }
233
- Database.prototype = OrigDatabase.prototype;
234
- Database.prototype.constructor = Database;
235
- Object.keys(OrigDatabase).forEach(k => { Database[k] = OrigDatabase[k]; });
236
- Database.prototype.unsafeMode = function() { return this; };
237
- if (!Database.prototype.defaultSafeIntegers) Database.prototype.defaultSafeIntegers = function() { return this; };
238
- if (!Database.prototype.serialize) Database.prototype.serialize = function() { throw new Error('not supported in wasm'); };
239
- if (!Database.prototype.backup) Database.prototype.backup = function() { throw new Error('not supported in wasm'); };
240
- const tmpDb = new OrigDatabase(':memory:');
241
- const tmpStmt = tmpDb.prepare('SELECT 1');
242
- const SP = Object.getPrototypeOf(tmpStmt);
243
- if (!SP.safeIntegers) SP.safeIntegers = function() { return this; };
244
- SP.scanStatus = function() { return undefined; };
245
- SP.scanStatusV2 = function() { return []; };
246
- SP.scanStatusReset = function() {};
247
- tmpDb.close();
248
- Database.SQLITE_SCANSTAT_NLOOP = 0;
249
- Database.SQLITE_SCANSTAT_NVISIT = 1;
250
- Database.SQLITE_SCANSTAT_EST = 2;
251
- Database.SQLITE_SCANSTAT_NAME = 3;
252
- Database.SQLITE_SCANSTAT_EXPLAIN = 4;
253
- Database.SQLITE_SCANSTAT_SELECTID = 5;
254
- Database.SQLITE_SCANSTAT_PARENTID = 6;
255
- Database.SQLITE_SCANSTAT_NCYCLE = 7;
256
- Database.SQLITE_SCANSTAT_COMPLEX = 8;
257
- export default Database;
258
- export { SqliteError };
259
- \`
260
- };
261
- }
262
- return nextLoad(url, context);
263
- }
264
- `);
265
- // register entrypoint — passed via --import
204
+ const hooksTemplate = readFileSync(resolve(shimDir, 'hooks.mjs'), 'utf-8');
205
+ writeFileSync(hooksPath, hooksTemplate.replace(/__BEDROCK_PATH__/g, bedrockEntry));
266
206
  const registerPath = resolve(dir, 'register.mjs');
267
- const hooksUrl = `file://${hooksPath}`;
268
- writeFileSync(registerPath, `import { register } from 'node:module';
269
- register('${hooksUrl}', import.meta.url);
270
- `);
207
+ const registerTemplate = readFileSync(resolve(shimDir, 'register.mjs'), 'utf-8');
208
+ writeFileSync(registerPath, registerTemplate.replace(/__HOOKS_URL__/g, `file://${hooksPath}`));
271
209
  return registerPath;
272
210
  }
273
211
  async function startZeroCache(config) {
@@ -316,18 +254,20 @@ async function startZeroCache(config) {
316
254
  if (!existsSync(zeroCacheBin)) {
317
255
  throw new Error('zero-cache cli.js not found. install @rocicorp/zero');
318
256
  }
257
+ // calculate heap size: ~25% of system memory, min 4gb
258
+ const memMB = Math.round(totalmem() / 1024 / 1024);
259
+ const heapMB = Math.max(4096, Math.round(memMB * 0.25));
260
+ const existing = process.env.NODE_OPTIONS || '';
319
261
  // wasm sqlite: write shim + ESM loader to tmpdir, pass --import to intercept
320
262
  // @rocicorp/zero-sqlite3 resolution with our bedrock-sqlite wasm build
321
263
  if (!config.disableWasmSqlite) {
322
264
  const registerPath = writeSqliteShim();
323
265
  const registerUrl = `file://${registerPath}`;
324
- const existing = process.env.NODE_OPTIONS || '';
325
- env.NODE_OPTIONS = `--import ${registerUrl} --max-old-space-size=16384 ${existing}`.trim();
266
+ env.NODE_OPTIONS =
267
+ `--import ${registerUrl} --max-old-space-size=${heapMB} ${existing}`.trim();
326
268
  }
327
269
  else {
328
- const existing = process.env.NODE_OPTIONS || '';
329
- if (existing)
330
- env.NODE_OPTIONS = existing;
270
+ env.NODE_OPTIONS = `--max-old-space-size=${heapMB} ${existing}`.trim();
331
271
  }
332
272
  const child = spawn(zeroCacheBin, [], {
333
273
  env,
@@ -382,7 +322,7 @@ async function waitForZeroCache(config, timeoutMs = 120000) {
382
322
  catch {
383
323
  // not ready yet
384
324
  }
385
- await new Promise((r) => setTimeout(r, 500));
325
+ await new Promise((r) => setTimeout(r, 42));
386
326
  }
387
327
  log.zero('health check timed out, continuing anyway');
388
328
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAKvE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAG5D,uEAAuE;AACvE,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,EAAE,CAAA;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,YAAqC,EAAE;IACzE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;IACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAE5B,uBAAuB;IACvB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa;QACnC,CAAC,CAAC,MAAM,CAAC,QAAQ;QACjB,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACnC,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM;QAC1B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,kBAAkB,MAAM,EAAE,CAAC,CAAA;IACjE,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,QAAQ,KAAK,MAAM,CAAC,QAAQ;QACvD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,QAAQ,kBAAkB,QAAQ,EAAE,CAAC,CAAA;IACrE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAE1B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAEtD,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE9C,qEAAqE;IACrE,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAA;IACrD,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAA;IAE7B,6CAA6C;IAC7C,MAAM,iBAAiB,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAEzD,sDAAsD;IACtD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;IAC5C,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAA;IAE/B,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAEtD,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;IAC1C,IAAI,iBAAiB,GAAG,CAAC;QACvB,GAAG,CAAC,IAAI,CACN,GAAG,iBAAiB,aAAa,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CAC9E,CAAA;IAEH,sBAAsB;IACtB,MAAM,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAE9B,qEAAqE;IACrE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QAC1D,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QACtD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE;gBACpC,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,gBAAgB,EAAE,WAAW;oBAC7B,WAAW,EAAE,MAAM;oBACnB,cAAc,EAAE,MAAM;oBACtB,YAAY,EAAE,WAAW;oBACzB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;iBACpC;aACF,CAAC,CAAA;YACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;oBAC5B,OAAO,EAAE,CAAA;gBACX,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC3D,CAAC;YACH,CAAC,CAAC,CAAA;YACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,8DAA8D;QAC9D,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QACjE,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,wEAAwE;IACxE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QAC7C,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAC3B,+DAA+D;QAC/D,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,gFAAgF;IAChF,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAE7B,mBAAmB;IACnB,IAAI,gBAAgB,GAAwB,IAAI,CAAA;IAChD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,gBAAgB,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;QAC/C,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAC9B,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC/B,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YACjD,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAChC,mDAAmD;YACnD,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;gBAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;wBACjD,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;oBAClC,CAAC;oBACD,CAAC,EAAE,CAAA;gBACL,CAAC,EAAE,IAAI,CAAC,CAAA;gBACR,gBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBAChC,YAAY,CAAC,OAAO,CAAC,CAAA;oBACrB,CAAC,EAAE,CAAA;gBACL,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,QAAQ,CAAC,KAAK,EAAE,CAAA;QAChB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE;YAC1B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE;YACrB,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE;SACtB,CAAC,CAAA;QACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3B,CAAC,CAAA;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1F,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAsB;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;IAC9D,kFAAkF;IAClF,+EAA+E;IAC/E,gFAAgF;IAChF,kFAAkF;IAClF,KAAK,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,WAAW,GAAG,MAAM,CAAA;QACjC,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,UAAU,CAAC,IAAI,CAAC,CAAA;gBAChB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,OAAO,CAAC,CAAA;YACnD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,EAAU,EAAE,MAAsB;IAC5D,gCAAgC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B,6CAA6C,CAC9C,CAAA;QACD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,OAAM;QACR,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;QAC9C,OAAM;IACR,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,GAAG;SACnB,KAAK,CAAC,0BAA0B,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAA;IAElB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AACpB,CAAC;AAED,yEAAyE;AACzE,oEAAoE;AACpE,0EAA0E;AAC1E,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAA;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACvC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEnC,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAA;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAErF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IAC3C,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1E,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC,CAAA;IAElF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;IACjD,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAA;IAChF,aAAa,CACX,YAAY,EACZ,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,SAAS,EAAE,CAAC,CAClE,CAAA;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAsB;IAClD,8DAA8D;IAC9D,MAAM,SAAS,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAA;IAElD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;IAC7E,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACtD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAEtD,8CAA8C;IAC9C,MAAM,QAAQ,GAA2B;QACvC,QAAQ,EAAE,aAAa;QACvB,cAAc,EAAE,MAAM,CAAC,QAAQ;QAC/B,qBAAqB,EAAE,GAAG;QAC1B,wEAAwE;QACxE,iEAAiE;QACjE,4DAA4D;QAC5D,yBAAyB,EAAE,OAAO;QAClC,qEAAqE;QACrE,sEAAsE;QACtE,qEAAqE;QACrE,2EAA2E;QAC3E,oCAAoC,EAAE,KAAK;QAC3C,sEAAsE;QACtE,oEAAoE;QACpE,eAAe,EAAE,MAAM;KACxB,CAAA;IAED,MAAM,GAAG,GAA2B;QAClC,GAAG,QAAQ;QACX,GAAI,OAAO,CAAC,GAA8B;QAC1C,yEAAyE;QACzE,yDAAyD;QACzD,QAAQ,EAAE,aAAa;QACvB,gBAAgB,EAAE,WAAW;QAC7B,WAAW,EAAE,MAAM;QACnB,cAAc,EAAE,MAAM;QACtB,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC;QAC7D,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;KACnC,CAAA;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IACvD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;IACxE,CAAC;IAED,sDAAsD;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAA;IAE/C,6EAA6E;IAC7E,uEAAuE;IACvE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;QACtC,MAAM,WAAW,GAAG,UAAU,YAAY,EAAE,CAAA;QAC5C,GAAG,CAAC,YAAY;YACd,YAAY,WAAW,yBAAyB,MAAM,IAAI,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IAC/E,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,YAAY,GAAG,wBAAwB,MAAM,IAAI,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IACxE,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,EAAE,EAAE;QACpC,GAAG;QACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAA;IAEF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,SAAS,GAAG,EAAE,CAAA;IAClB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC7B,SAAS,IAAI,KAAK,CAAA;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,SAAS,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,IAAI,CACN,4EAA4E;oBAC1E,WAAW;oBACX,oEAAoE;oBACpE,4EAA4E;oBAC5E,8EAA8E,CACjF,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACnE,IAAI,SAAS,EAAE,CAAC;oBACd,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,MAAM,SAAS,EAAE,CAAC,CAAA;gBACrD,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAsB,EACtB,SAAS,GAAG,MAAM;IAElB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,MAAM,GAAG,GAAG,oBAAoB,MAAM,CAAC,QAAQ,GAAG,CAAA;IAElD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;YAC5B,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAM;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;AACvD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orez",
3
- "version": "0.0.44",
3
+ "version": "0.0.46",
4
4
  "description": "PGlite-powered zero-sync development backend. No Docker required.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -46,7 +46,7 @@
46
46
  "@electric-sql/pglite": "^0.2.17",
47
47
  "@electric-sql/pglite-tools": "0.2.4",
48
48
  "@rocicorp/zero": ">=0.1.0",
49
- "bedrock-sqlite": "0.0.37",
49
+ "bedrock-sqlite": "0.0.39",
50
50
  "citty": "^0.2.0",
51
51
  "postgres": "^3.4.5",
52
52
  "pgsql-parser": "^17.9.11"
package/src/index.ts CHANGED
@@ -9,7 +9,9 @@
9
9
  import { spawn, type ChildProcess } from 'node:child_process'
10
10
  import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs'
11
11
  import { createRequire } from 'node:module'
12
+ import { totalmem } from 'node:os'
12
13
  import { dirname, resolve } from 'node:path'
14
+ import { fileURLToPath } from 'node:url'
13
15
 
14
16
  import { getConfig, getConnectionString } from './config.js'
15
17
  import { log, port, setLogLevel } from './log.js'
@@ -123,8 +125,8 @@ export async function startZeroLite(overrides: Partial<ZeroLiteConfig> = {}) {
123
125
  await installChangeTracking(db)
124
126
  }
125
127
 
126
- // clean up stale sqlite replica from previous runs
127
- cleanupStaleReplica(config)
128
+ // clean up stale lock files from previous crash (keep replica for fast restart)
129
+ cleanupStaleLockFiles(config)
128
130
 
129
131
  // start zero-cache
130
132
  let zeroCacheProcess: ChildProcess | null = null
@@ -166,17 +168,18 @@ export async function startZeroLite(overrides: Partial<ZeroLiteConfig> = {}) {
166
168
  return { config, stop, db, instances, pgPort: config.pgPort, zeroPort: config.zeroPort }
167
169
  }
168
170
 
169
- function cleanupStaleReplica(config: ZeroLiteConfig): void {
171
+ function cleanupStaleLockFiles(config: ZeroLiteConfig): void {
170
172
  const replicaPath = resolve(config.dataDir, 'zero-replica.db')
171
- // delete replica + all lock/wal files so zero-cache does a fresh sync
172
- // the replica is just a cache of pglite data, safe to recreate
173
- for (const suffix of ['', '-wal', '-shm', '-wal2']) {
173
+ // only delete lock/wal files that prevent zero-cache from starting after a crash.
174
+ // keep the replica db itself zero-cache catches up via replication, which is
175
+ // nearly instant vs a full initial sync (COPY of all tables). if the replica is
176
+ // too stale, ZERO_AUTO_RESET=true makes zero-cache wipe and resync automatically.
177
+ for (const suffix of ['-wal', '-shm', '-wal2']) {
174
178
  const file = replicaPath + suffix
175
179
  try {
176
180
  if (existsSync(file)) {
177
181
  unlinkSync(file)
178
- if (suffix) log.debug.orez(`cleaned up stale ${suffix} file`)
179
- else log.debug.orez('cleaned up stale replica (will re-sync)')
182
+ log.debug.orez(`cleaned up stale ${suffix} file`)
180
183
  }
181
184
  } catch {
182
185
  // ignore
@@ -216,11 +219,8 @@ async function seedIfNeeded(db: PGlite, config: ZeroLiteConfig): Promise<void> {
216
219
  log.orez('seeded')
217
220
  }
218
221
 
219
- // write three files to tmpdir:
220
- // 1. shim.cjs wraps bedrock-sqlite as @rocicorp/zero-sqlite3
221
- // 2. hooks.mjs — ESM loader hook that resolves @rocicorp/zero-sqlite3 → shim
222
- // 3. register.mjs — --import entrypoint that registers the hook
223
- // uses node's module.register() API for ESM resolution interception.
222
+ // write esm loader hooks to tmpdir that intercept @rocicorp/zero-sqlite3
223
+ // and redirect to bedrock-sqlite wasm. templates live in src/shim/.
224
224
  // returns the path to register.mjs (passed via --import in NODE_OPTIONS).
225
225
  function writeSqliteShim(): string {
226
226
  const tmp = process.env.TMPDIR || process.env.TEMP || '/tmp'
@@ -228,80 +228,17 @@ function writeSqliteShim(): string {
228
228
  mkdirSync(dir, { recursive: true })
229
229
 
230
230
  const bedrockEntry = resolvePackage('bedrock-sqlite')
231
+ const shimDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'src', 'shim')
231
232
 
232
- // ESM loader hooks — resolve + load @rocicorp/zero-sqlite3 as our shim.
233
- // uses a load hook to inline the shim source so we control the format.
234
233
  const hooksPath = resolve(dir, 'hooks.mjs')
235
- writeFileSync(
236
- hooksPath,
237
- `const SHIM_URL = 'orez-sqlite-shim://shim';
238
- const BEDROCK_PATH = '${bedrockEntry}';
239
-
240
- export function resolve(specifier, context, nextResolve) {
241
- if (specifier === '@rocicorp/zero-sqlite3' || specifier.startsWith('@rocicorp/zero-sqlite3/')) {
242
- return { url: SHIM_URL, shortCircuit: true };
243
- }
244
- return nextResolve(specifier, context);
245
- }
246
-
247
- export function load(url, context, nextLoad) {
248
- if (url === SHIM_URL) {
249
- return {
250
- format: 'module',
251
- shortCircuit: true,
252
- source: \`
253
- import { createRequire } from 'node:module';
254
- const require = createRequire('\${BEDROCK_PATH}');
255
- const mod = require('\${BEDROCK_PATH}');
256
- const OrigDatabase = mod.Database;
257
- const SqliteError = mod.SqliteError;
258
- function Database(...args) {
259
- const db = new OrigDatabase(...args);
260
- try { db.pragma('busy_timeout = 30000'); db.pragma('synchronous = normal'); } catch(e) {}
261
- return db;
262
- }
263
- Database.prototype = OrigDatabase.prototype;
264
- Database.prototype.constructor = Database;
265
- Object.keys(OrigDatabase).forEach(k => { Database[k] = OrigDatabase[k]; });
266
- Database.prototype.unsafeMode = function() { return this; };
267
- if (!Database.prototype.defaultSafeIntegers) Database.prototype.defaultSafeIntegers = function() { return this; };
268
- if (!Database.prototype.serialize) Database.prototype.serialize = function() { throw new Error('not supported in wasm'); };
269
- if (!Database.prototype.backup) Database.prototype.backup = function() { throw new Error('not supported in wasm'); };
270
- const tmpDb = new OrigDatabase(':memory:');
271
- const tmpStmt = tmpDb.prepare('SELECT 1');
272
- const SP = Object.getPrototypeOf(tmpStmt);
273
- if (!SP.safeIntegers) SP.safeIntegers = function() { return this; };
274
- SP.scanStatus = function() { return undefined; };
275
- SP.scanStatusV2 = function() { return []; };
276
- SP.scanStatusReset = function() {};
277
- tmpDb.close();
278
- Database.SQLITE_SCANSTAT_NLOOP = 0;
279
- Database.SQLITE_SCANSTAT_NVISIT = 1;
280
- Database.SQLITE_SCANSTAT_EST = 2;
281
- Database.SQLITE_SCANSTAT_NAME = 3;
282
- Database.SQLITE_SCANSTAT_EXPLAIN = 4;
283
- Database.SQLITE_SCANSTAT_SELECTID = 5;
284
- Database.SQLITE_SCANSTAT_PARENTID = 6;
285
- Database.SQLITE_SCANSTAT_NCYCLE = 7;
286
- Database.SQLITE_SCANSTAT_COMPLEX = 8;
287
- export default Database;
288
- export { SqliteError };
289
- \`
290
- };
291
- }
292
- return nextLoad(url, context);
293
- }
294
- `
295
- )
234
+ const hooksTemplate = readFileSync(resolve(shimDir, 'hooks.mjs'), 'utf-8')
235
+ writeFileSync(hooksPath, hooksTemplate.replace(/__BEDROCK_PATH__/g, bedrockEntry))
296
236
 
297
- // register entrypoint — passed via --import
298
237
  const registerPath = resolve(dir, 'register.mjs')
299
- const hooksUrl = `file://${hooksPath}`
238
+ const registerTemplate = readFileSync(resolve(shimDir, 'register.mjs'), 'utf-8')
300
239
  writeFileSync(
301
240
  registerPath,
302
- `import { register } from 'node:module';
303
- register('${hooksUrl}', import.meta.url);
304
- `
241
+ registerTemplate.replace(/__HOOKS_URL__/g, `file://${hooksPath}`)
305
242
  )
306
243
 
307
244
  return registerPath
@@ -360,16 +297,20 @@ async function startZeroCache(config: ZeroLiteConfig): Promise<ChildProcess> {
360
297
  throw new Error('zero-cache cli.js not found. install @rocicorp/zero')
361
298
  }
362
299
 
300
+ // calculate heap size: ~25% of system memory, min 4gb
301
+ const memMB = Math.round(totalmem() / 1024 / 1024)
302
+ const heapMB = Math.max(4096, Math.round(memMB * 0.25))
303
+ const existing = process.env.NODE_OPTIONS || ''
304
+
363
305
  // wasm sqlite: write shim + ESM loader to tmpdir, pass --import to intercept
364
306
  // @rocicorp/zero-sqlite3 resolution with our bedrock-sqlite wasm build
365
307
  if (!config.disableWasmSqlite) {
366
308
  const registerPath = writeSqliteShim()
367
309
  const registerUrl = `file://${registerPath}`
368
- const existing = process.env.NODE_OPTIONS || ''
369
- env.NODE_OPTIONS = `--import ${registerUrl} --max-old-space-size=16384 ${existing}`.trim()
310
+ env.NODE_OPTIONS =
311
+ `--import ${registerUrl} --max-old-space-size=${heapMB} ${existing}`.trim()
370
312
  } else {
371
- const existing = process.env.NODE_OPTIONS || ''
372
- if (existing) env.NODE_OPTIONS = existing
313
+ env.NODE_OPTIONS = `--max-old-space-size=${heapMB} ${existing}`.trim()
373
314
  }
374
315
 
375
316
  const child = spawn(zeroCacheBin, [], {
@@ -432,7 +373,7 @@ async function waitForZeroCache(
432
373
  } catch {
433
374
  // not ready yet
434
375
  }
435
- await new Promise((r) => setTimeout(r, 500))
376
+ await new Promise((r) => setTimeout(r, 42))
436
377
  }
437
378
 
438
379
  log.zero('health check timed out, continuing anyway')
@@ -0,0 +1,63 @@
1
+ // esm loader hooks — intercept @rocicorp/zero-sqlite3 with bedrock-sqlite wasm.
2
+ // __BEDROCK_PATH__ is replaced at runtime by orez before writing to tmpdir.
3
+
4
+ const SHIM_URL = 'orez-sqlite-shim://shim'
5
+ const BEDROCK_PATH = '__BEDROCK_PATH__'
6
+
7
+ export function resolve(specifier, context, nextResolve) {
8
+ if (
9
+ specifier === '@rocicorp/zero-sqlite3' ||
10
+ specifier.startsWith('@rocicorp/zero-sqlite3/')
11
+ ) {
12
+ return { url: SHIM_URL, shortCircuit: true }
13
+ }
14
+ return nextResolve(specifier, context)
15
+ }
16
+
17
+ export function load(url, context, nextLoad) {
18
+ if (url === SHIM_URL) {
19
+ return {
20
+ format: 'module',
21
+ shortCircuit: true,
22
+ source: `
23
+ import { createRequire } from 'node:module';
24
+ const require = createRequire('${BEDROCK_PATH}');
25
+ const mod = require('${BEDROCK_PATH}');
26
+ const OrigDatabase = mod.Database;
27
+ const SqliteError = mod.SqliteError;
28
+ function Database(...args) {
29
+ const db = new OrigDatabase(...args);
30
+ try { db.pragma('busy_timeout = 30000'); db.pragma('synchronous = normal'); } catch(e) {}
31
+ return db;
32
+ }
33
+ Database.prototype = OrigDatabase.prototype;
34
+ Database.prototype.constructor = Database;
35
+ Object.keys(OrigDatabase).forEach(k => { Database[k] = OrigDatabase[k]; });
36
+ Database.prototype.unsafeMode = function() { return this; };
37
+ if (!Database.prototype.defaultSafeIntegers) Database.prototype.defaultSafeIntegers = function() { return this; };
38
+ if (!Database.prototype.serialize) Database.prototype.serialize = function() { throw new Error('not supported in wasm'); };
39
+ if (!Database.prototype.backup) Database.prototype.backup = function() { throw new Error('not supported in wasm'); };
40
+ const tmpDb = new OrigDatabase(':memory:');
41
+ const tmpStmt = tmpDb.prepare('SELECT 1');
42
+ const SP = Object.getPrototypeOf(tmpStmt);
43
+ if (!SP.safeIntegers) SP.safeIntegers = function() { return this; };
44
+ SP.scanStatus = function() { return undefined; };
45
+ SP.scanStatusV2 = function() { return []; };
46
+ SP.scanStatusReset = function() {};
47
+ tmpDb.close();
48
+ Database.SQLITE_SCANSTAT_NLOOP = 0;
49
+ Database.SQLITE_SCANSTAT_NVISIT = 1;
50
+ Database.SQLITE_SCANSTAT_EST = 2;
51
+ Database.SQLITE_SCANSTAT_NAME = 3;
52
+ Database.SQLITE_SCANSTAT_EXPLAIN = 4;
53
+ Database.SQLITE_SCANSTAT_SELECTID = 5;
54
+ Database.SQLITE_SCANSTAT_PARENTID = 6;
55
+ Database.SQLITE_SCANSTAT_NCYCLE = 7;
56
+ Database.SQLITE_SCANSTAT_COMPLEX = 8;
57
+ export default Database;
58
+ export { SqliteError };
59
+ `,
60
+ }
61
+ }
62
+ return nextLoad(url, context)
63
+ }
@@ -0,0 +1,4 @@
1
+ // --import entrypoint that registers the esm loader hooks.
2
+ // __HOOKS_URL__ is replaced at runtime by orez before writing to tmpdir.
3
+ import { register } from 'node:module'
4
+ register('__HOOKS_URL__', import.meta.url)