@rocicorp/zero 0.23.2025090100 → 0.23.2025090400

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 (65) hide show
  1. package/out/{chunk-FMWNU2YJ.js → chunk-6QYVZALS.js} +2 -2
  2. package/out/{chunk-6USDOK3X.js → chunk-LCK57CQL.js} +44 -41
  3. package/out/chunk-LCK57CQL.js.map +7 -0
  4. package/out/react-native.js +68 -85
  5. package/out/react-native.js.map +2 -2
  6. package/out/react.js +1 -1
  7. package/out/replicache/src/expo/store.d.ts +2 -3
  8. package/out/replicache/src/expo/store.d.ts.map +1 -1
  9. package/out/replicache/src/kv/sqlite-store.d.ts +1 -8
  10. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  11. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  12. package/out/solid.js +2 -2
  13. package/out/zero/package.json +1 -1
  14. package/out/zero-cache/src/custom/fetch.d.ts +2 -1
  15. package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
  16. package/out/zero-cache/src/custom/fetch.js +8 -6
  17. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  18. package/out/zero-cache/src/custom-queries/transform-query.d.ts +3 -2
  19. package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +1 -1
  20. package/out/zero-cache/src/custom-queries/transform-query.js +6 -3
  21. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  22. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  23. package/out/zero-cache/src/db/lite-tables.js +1 -0
  24. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  25. package/out/zero-cache/src/db/specs.d.ts +5 -0
  26. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  27. package/out/zero-cache/src/db/specs.js.map +1 -1
  28. package/out/zero-cache/src/services/mutagen/pusher.d.ts +2 -3
  29. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  30. package/out/zero-cache/src/services/mutagen/pusher.js +25 -6
  31. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  32. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts.map +1 -1
  33. package/out/zero-cache/src/services/view-syncer/client-schema.js +10 -1
  34. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  35. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +1 -0
  36. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  37. package/out/zero-cache/src/services/view-syncer/view-syncer.js +20 -3
  38. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  39. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +1 -1
  40. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  41. package/out/zero-client/src/client/options.d.ts +8 -12
  42. package/out/zero-client/src/client/options.d.ts.map +1 -1
  43. package/out/zero-client/src/client/zero.d.ts +1 -2
  44. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  45. package/out/zero-protocol/src/client-schema.d.ts +2 -0
  46. package/out/zero-protocol/src/client-schema.d.ts.map +1 -1
  47. package/out/zero-protocol/src/client-schema.js +9 -4
  48. package/out/zero-protocol/src/client-schema.js.map +1 -1
  49. package/out/zero-protocol/src/connect.d.ts +6 -32
  50. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  51. package/out/zero-protocol/src/connect.js +2 -17
  52. package/out/zero-protocol/src/connect.js.map +1 -1
  53. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  54. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  55. package/out/zero-protocol/src/protocol-version.js +2 -1
  56. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  57. package/out/zero-protocol/src/up.d.ts +3 -8
  58. package/out/zero-protocol/src/up.d.ts.map +1 -1
  59. package/out/zero-schema/src/builder/schema-builder.d.ts.map +1 -1
  60. package/out/zero-schema/src/builder/schema-builder.js +2 -1
  61. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  62. package/out/zero.js +2 -2
  63. package/package.json +1 -1
  64. package/out/chunk-6USDOK3X.js.map +0 -7
  65. /package/out/{chunk-FMWNU2YJ.js.map → chunk-6QYVZALS.js.map} +0 -0
@@ -36,9 +36,8 @@ var SQLiteReadConnectionManager = class {
36
36
  }
37
37
  this.#rwLock = rwLock;
38
38
  for (let i = 0; i < opts.readPoolSize; i++) {
39
- const { db, preparedStatements } = manager.open(name, opts);
39
+ const { preparedStatements } = manager.open(name, opts);
40
40
  this.#pool.push({
41
- db,
42
41
  lock: new Lock(),
43
42
  preparedStatements
44
43
  });
@@ -65,40 +64,19 @@ var SQLiteReadConnectionManager = class {
65
64
  }
66
65
  };
67
66
  }
68
- /**
69
- * Finalizes all prepared statements and closes the underlying connections.
70
- * After calling this method the manager can no longer be used.
71
- */
72
- close() {
73
- for (const entry of this.#pool) {
74
- for (const stmt of Object.values(entry.preparedStatements)) {
75
- stmt.finalize();
76
- }
77
- entry.db.close();
78
- }
79
- this.#pool = [];
80
- }
81
67
  };
82
68
  var SQLiteWriteConnectionManager = class {
83
69
  #rwLock;
84
70
  #preparedStatements;
85
- #db;
86
71
  constructor(name, manager, rwLock, opts) {
87
- const { db, preparedStatements } = manager.open(name, opts);
72
+ const { preparedStatements } = manager.open(name, opts);
88
73
  this.#preparedStatements = preparedStatements;
89
- this.#db = db;
90
74
  this.#rwLock = rwLock;
91
75
  }
92
76
  async acquire() {
93
77
  const release = await this.#rwLock.write();
94
78
  return { preparedStatements: this.#preparedStatements, release };
95
79
  }
96
- close() {
97
- for (const stmt of Object.values(this.#preparedStatements)) {
98
- stmt.finalize();
99
- }
100
- this.#db.close();
101
- }
102
80
  };
103
81
  var SQLiteStore = class {
104
82
  #name;
@@ -132,8 +110,6 @@ var SQLiteStore = class {
132
110
  return new SQLiteStoreWrite(preparedStatements, release);
133
111
  }
134
112
  close() {
135
- this.#writeConnectionManager.close();
136
- this.#readConnectionManager.close();
137
113
  this.#dbm.close(this.#name);
138
114
  this.#closed = true;
139
115
  return promiseVoid;
@@ -210,10 +186,11 @@ var SQLiteStoreWrite = class extends SQLiteStoreRWBase {
210
186
  this._release();
211
187
  }
212
188
  };
213
- var safeFilename = (name) => name.replace(/[^a-zA-Z0-9]/g, "_");
214
- function createSQLiteStore(dbm) {
215
- return (name, opts) => new SQLiteStore(name, dbm, opts);
189
+ function safeFilename(name) {
190
+ return name.replace(/[^a-zA-Z0-9]/g, "_");
216
191
  }
192
+ var OPEN = 1;
193
+ var CLOSED = 0;
217
194
  var SQLiteDatabaseManager = class {
218
195
  #dbm;
219
196
  #dbInstances = /* @__PURE__ */ new Map();
@@ -260,7 +237,7 @@ var SQLiteDatabaseManager = class {
260
237
  this.#dbInstances.set(name, {
261
238
  instances: [
262
239
  ...dbInstance?.instances ?? [],
263
- { db: newDb, preparedStatements }
240
+ { db: newDb, preparedStatements, state: OPEN }
264
241
  ]
265
242
  });
266
243
  return {
@@ -268,28 +245,28 @@ var SQLiteDatabaseManager = class {
268
245
  preparedStatements
269
246
  };
270
247
  }
271
- close(name) {
248
+ #closeDBInstance(name) {
272
249
  const dbInstance = this.#dbInstances.get(name);
273
- if (!dbInstance) return;
274
- for (const instance of dbInstance.instances) {
275
- for (const stmt of Object.values(instance.preparedStatements)) {
276
- stmt.finalize();
250
+ if (dbInstance) {
251
+ for (const instance of dbInstance.instances) {
252
+ if (instance.state === CLOSED) {
253
+ continue;
254
+ }
255
+ for (const stmt of Object.values(instance.preparedStatements)) {
256
+ stmt.finalize();
257
+ }
258
+ instance.db.close();
259
+ instance.state = CLOSED;
277
260
  }
278
- instance.db.close();
279
261
  }
262
+ return dbInstance;
263
+ }
264
+ close(name) {
265
+ this.#closeDBInstance(name);
280
266
  }
281
267
  destroy(name) {
282
- const dbInstance = this.#dbInstances.get(name);
283
- if (!dbInstance) return;
284
- for (const instance of dbInstance.instances) {
285
- for (const stmt of Object.values(instance.preparedStatements)) {
286
- stmt.finalize();
287
- }
288
- instance.db.close();
289
- }
290
- for (const instance of dbInstance.instances) {
291
- instance.db.destroy();
292
- }
268
+ const dbInstance = this.#closeDBInstance(name);
269
+ dbInstance?.instances[0].db.destroy();
293
270
  this.#dbInstances.delete(name);
294
271
  }
295
272
  #ensureSchema(exec, preparedStatements) {
@@ -307,47 +284,53 @@ var SQLiteDatabaseManager = class {
307
284
  };
308
285
 
309
286
  // ../replicache/src/expo/store.ts
310
- var expoDbManagerInstance = new SQLiteDatabaseManager({
311
- open: (fileName) => {
312
- const db = openDatabaseSync(fileName);
313
- const genericDb = {
314
- close: () => db.closeSync(),
315
- destroy: () => {
316
- db.closeSync();
317
- deleteDatabaseSync(fileName);
318
- },
319
- prepare: (sql) => {
320
- const stmt = db.prepareSync(sql);
321
- return {
322
- run: (...params) => {
323
- stmt.executeSync(params);
324
- },
325
- all: (...params) => {
326
- const result = stmt.executeSync(params);
327
- return result.getAllSync();
328
- },
329
- finalize: () => stmt.finalizeSync()
330
- };
331
- }
332
- };
333
- return genericDb;
334
- }
335
- });
336
287
  function expoSQLiteStoreProvider(opts) {
337
288
  return {
338
- create: (name) => createSQLiteStore(expoDbManagerInstance)(name, {
339
- // we default to 3 read connections for mobile devices
340
- readPoolSize: 3,
341
- busyTimeout: 200,
342
- synchronous: "NORMAL",
343
- readUncommitted: false,
344
- ...opts,
345
- // we override the journal mode to undefined because
346
- // setting it to WAL causes hanging COMMITs on Expo
347
- journalMode: void 0
348
- }),
289
+ create: (name) => {
290
+ const expoDbManagerInstance = new SQLiteDatabaseManager({
291
+ open: (fileName) => {
292
+ const db = openDatabaseSync(fileName);
293
+ let closed = false;
294
+ const close = () => {
295
+ if (!closed) {
296
+ db.closeSync();
297
+ closed = true;
298
+ }
299
+ };
300
+ return {
301
+ close,
302
+ destroy() {
303
+ close();
304
+ deleteDatabaseSync(fileName);
305
+ },
306
+ prepare(sql) {
307
+ const stmt = db.prepareSync(sql);
308
+ return {
309
+ run: (...params) => {
310
+ stmt.executeSync(params);
311
+ },
312
+ all: (...params) => {
313
+ const result = stmt.executeSync(params);
314
+ return result.getAllSync();
315
+ },
316
+ finalize: () => stmt.finalizeSync()
317
+ };
318
+ }
319
+ };
320
+ }
321
+ });
322
+ return new SQLiteStore(name, expoDbManagerInstance, {
323
+ // we default to 3 read connections for mobile devices
324
+ readPoolSize: 3,
325
+ busyTimeout: 200,
326
+ synchronous: "NORMAL",
327
+ readUncommitted: false,
328
+ journalMode: "WAL",
329
+ ...opts
330
+ });
331
+ },
349
332
  drop: (name) => {
350
- expoDbManagerInstance.destroy(name);
333
+ deleteDatabaseSync(safeFilename(name));
351
334
  return Promise.resolve();
352
335
  }
353
336
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../replicache/src/expo/store.ts", "../../replicache/src/kv/sqlite-store.ts"],
4
- "sourcesContent": ["import {\n deleteDatabaseSync,\n openDatabaseSync,\n type SQLiteBindParams,\n} from 'expo-sqlite';\nimport {\n createSQLiteStore,\n SQLiteDatabaseManager,\n type SQLiteDatabase,\n type SQLiteDatabaseManagerOptions,\n} from '../kv/sqlite-store.ts';\nimport type {StoreProvider} from '../kv/store.ts';\n\nexport const expoDbManagerInstance = new SQLiteDatabaseManager({\n open: fileName => {\n const db = openDatabaseSync(fileName);\n\n const genericDb: SQLiteDatabase = {\n close: () => db.closeSync(),\n destroy: () => {\n db.closeSync();\n deleteDatabaseSync(fileName);\n },\n prepare: (sql: string) => {\n const stmt = db.prepareSync(sql);\n return {\n run: (...params: unknown[]): void => {\n stmt.executeSync(params as SQLiteBindParams);\n },\n all: <T>(...params: unknown[]): T[] => {\n const result = stmt.executeSync(params as SQLiteBindParams);\n return result.getAllSync() as unknown as T[];\n },\n finalize: () => stmt.finalizeSync(),\n };\n },\n };\n\n return genericDb;\n },\n});\n\nexport function expoSQLiteStoreProvider(\n opts?: Partial<Omit<SQLiteDatabaseManagerOptions, 'journalMode'>>,\n): StoreProvider {\n return {\n create: (name: string) =>\n createSQLiteStore(expoDbManagerInstance)(name, {\n // we default to 3 read connections for mobile devices\n readPoolSize: 3,\n busyTimeout: 200,\n synchronous: 'NORMAL',\n readUncommitted: false,\n ...opts,\n // we override the journal mode to undefined because\n // setting it to WAL causes hanging COMMITs on Expo\n journalMode: undefined,\n }),\n drop: (name: string) => {\n expoDbManagerInstance.destroy(name);\n\n return Promise.resolve();\n },\n };\n}\n", "import {Lock, RWLock} from '@rocicorp/lock';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {\n promiseUndefined,\n promiseVoid,\n} from '../../../shared/src/resolved-promises.ts';\nimport {deepFreeze} from '../frozen-json.ts';\nimport type {Read, Store, Write} from './store.ts';\n\n/**\n * A SQLite prepared statement.\n *\n * `run` executes the statement with optional parameters.\n * `all` executes the statement and returns the result rows.\n * `finalize` releases the statement.\n */\nexport interface PreparedStatement {\n run(...params: unknown[]): void;\n all<T>(...params: unknown[]): T[];\n finalize(): void;\n}\n\nexport interface SQLiteDatabase {\n /**\n * Close the database connection.\n */\n close(): void;\n\n /**\n * Destroy or delete the database (e.g. delete file).\n */\n destroy(): void;\n\n /**\n * Prepare a SQL string, returning a statement you can execute.\n * E.g. `const stmt = db.prepare(\"SELECT * FROM todos WHERE id=?\");`\n */\n prepare(sql: string): PreparedStatement;\n}\n\ntype SQLiteTransactionPreparedStatements = {\n begin: PreparedStatement;\n beginImmediate: PreparedStatement;\n commit: PreparedStatement;\n rollback: PreparedStatement;\n};\n\nconst getTransactionPreparedStatements = (\n db: SQLiteDatabase,\n): SQLiteTransactionPreparedStatements => ({\n begin: db.prepare('BEGIN'),\n beginImmediate: db.prepare('BEGIN IMMEDIATE'),\n commit: db.prepare('COMMIT'),\n rollback: db.prepare('ROLLBACK'),\n});\n\ntype SQLiteRWPreparedStatements = {\n get: PreparedStatement;\n put: PreparedStatement;\n del: PreparedStatement;\n};\n\nconst getRWPreparedStatements = (\n db: SQLiteDatabase,\n): SQLiteRWPreparedStatements => ({\n get: db.prepare('SELECT value FROM entry WHERE key = ?'),\n put: db.prepare('INSERT OR REPLACE INTO entry (key, value) VALUES (?, ?)'),\n del: db.prepare('DELETE FROM entry WHERE key = ?'),\n});\n\ntype SQLitePreparedStatements = SQLiteTransactionPreparedStatements &\n SQLiteRWPreparedStatements;\n\ninterface SQLiteConnectionManager {\n acquire(): Promise<{\n preparedStatements: SQLitePreparedStatements;\n release: () => void;\n }>;\n close(): void;\n}\n\ntype SQLitePreparedStatementPoolEntry = {\n db: SQLiteDatabase;\n lock: Lock;\n preparedStatements: SQLitePreparedStatements;\n};\n\n/**\n * Manages a pool of read-only SQLite connections.\n *\n * Each connection in the pool is protected by its own `Lock` instance which\n * guarantees that it is held by at most one reader at a time. Consumers call\n * {@link acquire} to get access to a set of prepared statements for a\n * connection and must invoke the provided `release` callback when they are\n * finished.\n *\n * The pool eagerly creates the configured number of connections up-front so\n * that the first `acquire` call never has to pay the connection setup cost.\n */\nclass SQLiteReadConnectionManager implements SQLiteConnectionManager {\n #pool: SQLitePreparedStatementPoolEntry[] = [];\n #nextIndex = 0;\n readonly #rwLock: RWLock;\n\n constructor(\n name: string,\n manager: SQLiteDatabaseManager,\n rwLock: RWLock,\n opts: SQLiteDatabaseManagerOptions,\n ) {\n if (opts.readPoolSize <= 1) {\n throw new Error('readPoolSize must be greater than 1');\n }\n\n this.#rwLock = rwLock;\n\n for (let i = 0; i < opts.readPoolSize; i++) {\n // create a new readonly SQLiteDatabase for each instance in the pool\n const {db, preparedStatements} = manager.open(name, opts);\n this.#pool.push({\n db,\n lock: new Lock(),\n preparedStatements,\n });\n }\n }\n\n /**\n * Acquire a round-robin read connection from the pool.\n *\n * The returned `release` callback **must** be invoked once the caller is done\n * using the prepared statements, otherwise other readers may be blocked\n * indefinitely.\n */\n async acquire(): Promise<{\n preparedStatements: SQLitePreparedStatements;\n release: () => void;\n }> {\n const slot = this.#nextIndex;\n this.#nextIndex = (this.#nextIndex + 1) % this.#pool.length;\n\n const entry = this.#pool[slot];\n\n // we have two levels of locking\n // 1. the RWLock to prevent concurrent read operations while a write is in progress\n // 2. the Lock to prevent concurrent read operations on the same connection\n const releaseRWLock = await this.#rwLock.read();\n const releaseLock = await entry.lock.lock();\n\n return {\n preparedStatements: entry.preparedStatements,\n release: () => {\n releaseRWLock();\n releaseLock();\n },\n };\n }\n\n /**\n * Finalizes all prepared statements and closes the underlying connections.\n * After calling this method the manager can no longer be used.\n */\n close(): void {\n for (const entry of this.#pool) {\n for (const stmt of Object.values(entry.preparedStatements)) {\n stmt.finalize();\n }\n entry.db.close();\n }\n this.#pool = [];\n }\n}\n\n/**\n * Manages a single write connection with an external RWLock.\n */\nclass SQLiteWriteConnectionManager implements SQLiteConnectionManager {\n readonly #rwLock: RWLock;\n readonly #preparedStatements: SQLitePreparedStatements;\n readonly #db: SQLiteDatabase;\n\n constructor(\n name: string,\n manager: SQLiteDatabaseManager,\n rwLock: RWLock,\n opts: SQLiteDatabaseManagerOptions,\n ) {\n const {db, preparedStatements} = manager.open(name, opts);\n this.#preparedStatements = preparedStatements;\n this.#db = db;\n this.#rwLock = rwLock;\n }\n\n async acquire(): Promise<{\n preparedStatements: SQLitePreparedStatements;\n release: () => void;\n }> {\n const release = await this.#rwLock.write();\n return {preparedStatements: this.#preparedStatements, release};\n }\n\n close(): void {\n for (const stmt of Object.values(this.#preparedStatements)) {\n stmt.finalize();\n }\n this.#db.close();\n }\n}\n\n/**\n * A SQLite-based Store implementation.\n *\n * This store provides a generic SQLite implementation that can be used with different\n * SQLite providers (expo-sqlite, better-sqlite3, etc). It implements the Store\n * interface using a single 'entry' table with key-value pairs.\n *\n * The store uses a single RWLock to prevent concurrent read and write operations.\n *\n * The store also uses a pool of read connections to allow concurrent reads with separate transactions.\n */\nexport class SQLiteStore implements Store {\n readonly #name: string;\n readonly #dbm: SQLiteDatabaseManager;\n readonly #writeConnectionManager: SQLiteConnectionManager;\n readonly #readConnectionManager: SQLiteConnectionManager;\n readonly #rwLock = new RWLock();\n\n #closed = false;\n\n constructor(\n name: string,\n dbm: SQLiteDatabaseManager,\n opts: SQLiteDatabaseManagerOptions,\n ) {\n this.#name = name;\n this.#dbm = dbm;\n\n this.#writeConnectionManager = new SQLiteWriteConnectionManager(\n name,\n dbm,\n this.#rwLock,\n opts,\n );\n this.#readConnectionManager = new SQLiteReadConnectionManager(\n name,\n dbm,\n this.#rwLock,\n opts,\n );\n }\n\n async read(): Promise<Read> {\n const {preparedStatements, release} =\n await this.#readConnectionManager.acquire();\n return new SQLiteStoreRead(preparedStatements, release);\n }\n\n async write(): Promise<Write> {\n const {preparedStatements, release} =\n await this.#writeConnectionManager.acquire();\n return new SQLiteStoreWrite(preparedStatements, release);\n }\n\n close(): Promise<void> {\n this.#writeConnectionManager.close();\n this.#readConnectionManager.close();\n this.#dbm.close(this.#name);\n this.#closed = true;\n\n return promiseVoid;\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n}\n\nclass SQLiteStoreRWBase {\n protected readonly _preparedStatements: SQLitePreparedStatements;\n readonly #release: () => void;\n #closed = false;\n\n constructor(\n preparedStatements: SQLitePreparedStatements,\n release: () => void,\n ) {\n this._preparedStatements = preparedStatements;\n this.#release = release;\n }\n\n has(key: string): Promise<boolean> {\n const unsafeValue = this.#getSql(key);\n return Promise.resolve(unsafeValue !== undefined);\n }\n\n get(key: string): Promise<ReadonlyJSONValue | undefined> {\n const unsafeValue = this.#getSql(key);\n if (unsafeValue === undefined) return promiseUndefined;\n const parsedValue = JSON.parse(unsafeValue) as ReadonlyJSONValue;\n const frozenValue = deepFreeze(parsedValue);\n return Promise.resolve(frozenValue);\n }\n\n #getSql(key: string): string | undefined {\n const rows = this._preparedStatements.get.all<{value: string}>(key);\n if (rows.length === 0) return undefined;\n return rows[0].value;\n }\n\n protected _release(): void {\n this.#closed = true;\n this.#release();\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n}\n\nexport class SQLiteStoreRead extends SQLiteStoreRWBase implements Read {\n constructor(\n preparedStatements: SQLitePreparedStatements,\n release: () => void,\n ) {\n super(preparedStatements, release);\n\n // BEGIN\n this._preparedStatements.begin.run();\n }\n\n release(): void {\n // COMMIT\n this._preparedStatements.commit.run();\n\n this._release();\n }\n}\n\nexport class SQLiteStoreWrite extends SQLiteStoreRWBase implements Write {\n #committed = false;\n\n constructor(\n preparedStatements: SQLitePreparedStatements,\n release: () => void,\n ) {\n super(preparedStatements, release);\n\n // BEGIN IMMEDIATE grabs a RESERVED lock\n this._preparedStatements.beginImmediate.run();\n }\n\n put(key: string, value: ReadonlyJSONValue): Promise<void> {\n this._preparedStatements.put.run(key, JSON.stringify(value));\n return promiseVoid;\n }\n\n del(key: string): Promise<void> {\n this._preparedStatements.del.run(key);\n return promiseVoid;\n }\n\n commit(): Promise<void> {\n // COMMIT\n this._preparedStatements.commit.run();\n this.#committed = true;\n return promiseVoid;\n }\n\n release(): void {\n if (!this.#committed) {\n // ROLLBACK if not committed\n this._preparedStatements.rollback.run();\n }\n\n this._release();\n }\n}\n\nexport interface GenericSQLiteDatabaseManager {\n open(fileName: string): SQLiteDatabase;\n}\n\n// we replace non-alphanumeric characters with underscores\n// because SQLite doesn't allow them in database names\nconst safeFilename = (name: string) => name.replace(/[^a-zA-Z0-9]/g, '_');\n\n/**\n * Creates a function that returns new SQLite store instances.\n * This is the main entry point for using the SQLite store implementation.\n *\n * @param dbm The SQLite database manager implementation\n * @returns A function that creates new store instances\n */\nexport function createSQLiteStore(dbm: SQLiteDatabaseManager) {\n return (name: string, opts: SQLiteDatabaseManagerOptions) =>\n new SQLiteStore(name, dbm, opts);\n}\n\nexport type SQLiteDatabaseManagerOptions = {\n /**\n * The number of read connections to keep open.\n *\n * This must be greater than 1 to support concurrent reads.\n */\n readPoolSize: number;\n\n busyTimeout?: number | undefined;\n journalMode?: 'WAL' | 'DELETE' | undefined;\n synchronous?: 'NORMAL' | 'FULL' | undefined;\n readUncommitted?: boolean | undefined;\n};\n\nexport class SQLiteDatabaseManager {\n readonly #dbm: GenericSQLiteDatabaseManager;\n readonly #dbInstances = new Map<\n string,\n {\n instances: {\n db: SQLiteDatabase;\n preparedStatements: SQLitePreparedStatements;\n }[];\n }\n >();\n\n constructor(dbm: GenericSQLiteDatabaseManager) {\n this.#dbm = dbm;\n }\n\n clearAllStoresForTesting(): void {\n for (const [name] of this.#dbInstances) {\n this.destroy(name);\n }\n }\n\n open(\n name: string,\n opts: Omit<SQLiteDatabaseManagerOptions, 'poolSize'>,\n ): {db: SQLiteDatabase; preparedStatements: SQLitePreparedStatements} {\n const dbInstance = this.#dbInstances.get(name);\n\n const fileName = safeFilename(name);\n const newDb = this.#dbm.open(fileName);\n\n const txPreparedStatements = getTransactionPreparedStatements(newDb);\n\n const exec = (sql: string) => {\n const statement = newDb.prepare(sql);\n statement.run();\n statement.finalize();\n };\n\n if (!dbInstance) {\n // we only ensure the schema for the first open\n // the schema is the same for all connections\n this.#ensureSchema(exec, txPreparedStatements);\n }\n\n if (opts.busyTimeout !== undefined) {\n // we set a busy timeout to wait for write locks to be released\n exec(`PRAGMA busy_timeout = ${opts.busyTimeout}`);\n }\n if (opts.journalMode !== undefined) {\n // WAL allows concurrent readers (improves write throughput ~15x and read throughput ~1.5x)\n // but does not work on all platforms (e.g. Expo)\n exec(`PRAGMA journal_mode = ${opts.journalMode}`);\n }\n if (opts.synchronous !== undefined) {\n exec(`PRAGMA synchronous = ${opts.synchronous}`);\n }\n if (opts.readUncommitted !== undefined) {\n exec(\n `PRAGMA read_uncommitted = ${opts.readUncommitted ? 'true' : 'false'}`,\n );\n }\n\n // we prepare these after the schema is created\n const rwPreparedStatements = getRWPreparedStatements(newDb);\n\n const preparedStatements = {\n ...txPreparedStatements,\n ...rwPreparedStatements,\n };\n\n this.#dbInstances.set(name, {\n instances: [\n ...(dbInstance?.instances ?? []),\n {db: newDb, preparedStatements},\n ],\n });\n\n return {\n db: newDb,\n preparedStatements,\n };\n }\n\n close(name: string) {\n const dbInstance = this.#dbInstances.get(name);\n if (!dbInstance) return;\n\n for (const instance of dbInstance.instances) {\n for (const stmt of Object.values(instance.preparedStatements)) {\n stmt.finalize();\n }\n instance.db.close();\n }\n }\n\n destroy(name: string): void {\n const dbInstance = this.#dbInstances.get(name);\n if (!dbInstance) return;\n\n // we close all databases first before destroying\n for (const instance of dbInstance.instances) {\n for (const stmt of Object.values(instance.preparedStatements)) {\n stmt.finalize();\n }\n instance.db.close();\n }\n for (const instance of dbInstance.instances) {\n instance.db.destroy();\n }\n this.#dbInstances.delete(name);\n }\n\n #ensureSchema(\n exec: (sql: string) => void,\n preparedStatements: SQLiteTransactionPreparedStatements,\n ): void {\n preparedStatements.begin.run();\n\n try {\n // WITHOUT ROWID increases write throughput\n exec(\n 'CREATE TABLE IF NOT EXISTS entry (key TEXT PRIMARY KEY, value TEXT NOT NULL) WITHOUT ROWID',\n );\n preparedStatements.commit.run();\n } catch (e) {\n preparedStatements.rollback.run();\n throw e;\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n deleteDatabaseSync,\n openDatabaseSync,\n type SQLiteBindParams,\n} from 'expo-sqlite';\nimport {\n safeFilename,\n SQLiteDatabaseManager,\n SQLiteStore,\n type SQLiteDatabaseManagerOptions,\n} from '../kv/sqlite-store.ts';\nimport type {StoreProvider} from '../kv/store.ts';\n\nexport function expoSQLiteStoreProvider(\n opts?: Partial<SQLiteDatabaseManagerOptions>,\n): StoreProvider {\n return {\n create: (name: string) => {\n const expoDbManagerInstance = new SQLiteDatabaseManager({\n open: fileName => {\n const db = openDatabaseSync(fileName);\n let closed = false;\n\n const close = () => {\n if (!closed) {\n db.closeSync();\n closed = true;\n }\n };\n\n return {\n close,\n destroy() {\n close();\n deleteDatabaseSync(fileName);\n },\n prepare(sql: string) {\n const stmt = db.prepareSync(sql);\n return {\n run: (...params: unknown[]): void => {\n stmt.executeSync(params as SQLiteBindParams);\n },\n all: <T>(...params: unknown[]): T[] => {\n const result = stmt.executeSync(params as SQLiteBindParams);\n return result.getAllSync() as unknown as T[];\n },\n finalize: () => stmt.finalizeSync(),\n };\n },\n };\n },\n });\n\n return new SQLiteStore(name, expoDbManagerInstance, {\n // we default to 3 read connections for mobile devices\n readPoolSize: 3,\n busyTimeout: 200,\n synchronous: 'NORMAL',\n readUncommitted: false,\n journalMode: 'WAL',\n ...opts,\n });\n },\n\n drop: (name: string) => {\n // Note that we cannot drop a database if it is open.\n // All connections must be closed before calling drop.\n deleteDatabaseSync(safeFilename(name));\n\n return Promise.resolve();\n },\n };\n}\n", "import {Lock, RWLock} from '@rocicorp/lock';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {\n promiseUndefined,\n promiseVoid,\n} from '../../../shared/src/resolved-promises.ts';\nimport {deepFreeze} from '../frozen-json.ts';\nimport type {Read, Store, Write} from './store.ts';\n\n/**\n * A SQLite prepared statement.\n *\n * `run` executes the statement with optional parameters.\n * `all` executes the statement and returns the result rows.\n * `finalize` releases the statement.\n */\nexport interface PreparedStatement {\n run(...params: unknown[]): void;\n all<T>(...params: unknown[]): T[];\n finalize(): void;\n}\n\nexport interface SQLiteDatabase {\n /**\n * Close the database connection.\n */\n close(): void;\n\n /**\n * Destroy or delete the database (e.g. delete file).\n */\n destroy(): void;\n\n /**\n * Prepare a SQL string, returning a statement you can execute.\n * E.g. `const stmt = db.prepare(\"SELECT * FROM todos WHERE id=?\");`\n */\n prepare(sql: string): PreparedStatement;\n}\n\ntype SQLiteTransactionPreparedStatements = {\n begin: PreparedStatement;\n beginImmediate: PreparedStatement;\n commit: PreparedStatement;\n rollback: PreparedStatement;\n};\n\nconst getTransactionPreparedStatements = (\n db: SQLiteDatabase,\n): SQLiteTransactionPreparedStatements => ({\n begin: db.prepare('BEGIN'),\n beginImmediate: db.prepare('BEGIN IMMEDIATE'),\n commit: db.prepare('COMMIT'),\n rollback: db.prepare('ROLLBACK'),\n});\n\ntype SQLiteRWPreparedStatements = {\n get: PreparedStatement;\n put: PreparedStatement;\n del: PreparedStatement;\n};\n\nconst getRWPreparedStatements = (\n db: SQLiteDatabase,\n): SQLiteRWPreparedStatements => ({\n get: db.prepare('SELECT value FROM entry WHERE key = ?'),\n put: db.prepare('INSERT OR REPLACE INTO entry (key, value) VALUES (?, ?)'),\n del: db.prepare('DELETE FROM entry WHERE key = ?'),\n});\n\ntype SQLitePreparedStatements = SQLiteTransactionPreparedStatements &\n SQLiteRWPreparedStatements;\n\ninterface SQLiteConnectionManager {\n acquire(): Promise<{\n preparedStatements: SQLitePreparedStatements;\n release: () => void;\n }>;\n}\n\ntype SQLitePreparedStatementPoolEntry = {\n lock: Lock;\n preparedStatements: SQLitePreparedStatements;\n};\n\n/**\n * Manages a pool of read-only SQLite connections.\n *\n * Each connection in the pool is protected by its own `Lock` instance which\n * guarantees that it is held by at most one reader at a time. Consumers call\n * {@link acquire} to get access to a set of prepared statements for a\n * connection and must invoke the provided `release` callback when they are\n * finished.\n *\n * The pool eagerly creates the configured number of connections up-front so\n * that the first `acquire` call never has to pay the connection setup cost.\n */\nclass SQLiteReadConnectionManager implements SQLiteConnectionManager {\n #pool: SQLitePreparedStatementPoolEntry[] = [];\n #nextIndex = 0;\n readonly #rwLock: RWLock;\n\n constructor(\n name: string,\n manager: SQLiteDatabaseManager,\n rwLock: RWLock,\n opts: SQLiteDatabaseManagerOptions,\n ) {\n if (opts.readPoolSize <= 1) {\n throw new Error('readPoolSize must be greater than 1');\n }\n\n this.#rwLock = rwLock;\n\n for (let i = 0; i < opts.readPoolSize; i++) {\n // create a new readonly SQLiteDatabase for each instance in the pool\n const {preparedStatements} = manager.open(name, opts);\n this.#pool.push({\n lock: new Lock(),\n preparedStatements,\n });\n }\n }\n\n /**\n * Acquire a round-robin read connection from the pool.\n *\n * The returned `release` callback **must** be invoked once the caller is done\n * using the prepared statements, otherwise other readers may be blocked\n * indefinitely.\n */\n async acquire(): Promise<{\n preparedStatements: SQLitePreparedStatements;\n release: () => void;\n }> {\n const slot = this.#nextIndex;\n this.#nextIndex = (this.#nextIndex + 1) % this.#pool.length;\n\n const entry = this.#pool[slot];\n\n // we have two levels of locking\n // 1. the RWLock to prevent concurrent read operations while a write is in progress\n // 2. the Lock to prevent concurrent read operations on the same connection\n const releaseRWLock = await this.#rwLock.read();\n const releaseLock = await entry.lock.lock();\n\n return {\n preparedStatements: entry.preparedStatements,\n release: () => {\n releaseRWLock();\n releaseLock();\n },\n };\n }\n}\n\n/**\n * Manages a single write connection with an external RWLock.\n */\nclass SQLiteWriteConnectionManager implements SQLiteConnectionManager {\n readonly #rwLock: RWLock;\n readonly #preparedStatements: SQLitePreparedStatements;\n\n constructor(\n name: string,\n manager: SQLiteDatabaseManager,\n rwLock: RWLock,\n opts: SQLiteDatabaseManagerOptions,\n ) {\n const {preparedStatements} = manager.open(name, opts);\n this.#preparedStatements = preparedStatements;\n this.#rwLock = rwLock;\n }\n\n async acquire(): Promise<{\n preparedStatements: SQLitePreparedStatements;\n release: () => void;\n }> {\n const release = await this.#rwLock.write();\n return {preparedStatements: this.#preparedStatements, release};\n }\n}\n\n/**\n * A SQLite-based Store implementation.\n *\n * This store provides a generic SQLite implementation that can be used with different\n * SQLite providers (expo-sqlite, better-sqlite3, etc). It implements the Store\n * interface using a single 'entry' table with key-value pairs.\n *\n * The store uses a single RWLock to prevent concurrent read and write operations.\n *\n * The store also uses a pool of read connections to allow concurrent reads with separate transactions.\n */\nexport class SQLiteStore implements Store {\n readonly #name: string;\n readonly #dbm: SQLiteDatabaseManager;\n readonly #writeConnectionManager: SQLiteConnectionManager;\n readonly #readConnectionManager: SQLiteConnectionManager;\n readonly #rwLock = new RWLock();\n\n #closed = false;\n\n constructor(\n name: string,\n dbm: SQLiteDatabaseManager,\n opts: SQLiteDatabaseManagerOptions,\n ) {\n this.#name = name;\n this.#dbm = dbm;\n\n this.#writeConnectionManager = new SQLiteWriteConnectionManager(\n name,\n dbm,\n this.#rwLock,\n opts,\n );\n this.#readConnectionManager = new SQLiteReadConnectionManager(\n name,\n dbm,\n this.#rwLock,\n opts,\n );\n }\n\n async read(): Promise<Read> {\n const {preparedStatements, release} =\n await this.#readConnectionManager.acquire();\n return new SQLiteStoreRead(preparedStatements, release);\n }\n\n async write(): Promise<Write> {\n const {preparedStatements, release} =\n await this.#writeConnectionManager.acquire();\n return new SQLiteStoreWrite(preparedStatements, release);\n }\n\n close(): Promise<void> {\n this.#dbm.close(this.#name);\n this.#closed = true;\n\n return promiseVoid;\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n}\n\nclass SQLiteStoreRWBase {\n protected readonly _preparedStatements: SQLitePreparedStatements;\n readonly #release: () => void;\n #closed = false;\n\n constructor(\n preparedStatements: SQLitePreparedStatements,\n release: () => void,\n ) {\n this._preparedStatements = preparedStatements;\n this.#release = release;\n }\n\n has(key: string): Promise<boolean> {\n const unsafeValue = this.#getSql(key);\n return Promise.resolve(unsafeValue !== undefined);\n }\n\n get(key: string): Promise<ReadonlyJSONValue | undefined> {\n const unsafeValue = this.#getSql(key);\n if (unsafeValue === undefined) return promiseUndefined;\n const parsedValue = JSON.parse(unsafeValue) as ReadonlyJSONValue;\n const frozenValue = deepFreeze(parsedValue);\n return Promise.resolve(frozenValue);\n }\n\n #getSql(key: string): string | undefined {\n const rows = this._preparedStatements.get.all<{value: string}>(key);\n if (rows.length === 0) return undefined;\n return rows[0].value;\n }\n\n protected _release(): void {\n this.#closed = true;\n this.#release();\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n}\n\nexport class SQLiteStoreRead extends SQLiteStoreRWBase implements Read {\n constructor(\n preparedStatements: SQLitePreparedStatements,\n release: () => void,\n ) {\n super(preparedStatements, release);\n\n // BEGIN\n this._preparedStatements.begin.run();\n }\n\n release(): void {\n // COMMIT\n this._preparedStatements.commit.run();\n\n this._release();\n }\n}\n\nexport class SQLiteStoreWrite extends SQLiteStoreRWBase implements Write {\n #committed = false;\n\n constructor(\n preparedStatements: SQLitePreparedStatements,\n release: () => void,\n ) {\n super(preparedStatements, release);\n\n // BEGIN IMMEDIATE grabs a RESERVED lock\n this._preparedStatements.beginImmediate.run();\n }\n\n put(key: string, value: ReadonlyJSONValue): Promise<void> {\n this._preparedStatements.put.run(key, JSON.stringify(value));\n return promiseVoid;\n }\n\n del(key: string): Promise<void> {\n this._preparedStatements.del.run(key);\n return promiseVoid;\n }\n\n commit(): Promise<void> {\n // COMMIT\n this._preparedStatements.commit.run();\n this.#committed = true;\n return promiseVoid;\n }\n\n release(): void {\n if (!this.#committed) {\n // ROLLBACK if not committed\n this._preparedStatements.rollback.run();\n }\n\n this._release();\n }\n}\n\nexport interface GenericSQLiteDatabaseManager {\n open(fileName: string): SQLiteDatabase;\n}\n\n// we replace non-alphanumeric characters with underscores\n// because SQLite doesn't allow them in database names\nexport function safeFilename(name: string) {\n return name.replace(/[^a-zA-Z0-9]/g, '_');\n}\n\nexport type SQLiteDatabaseManagerOptions = {\n /**\n * The number of read connections to keep open.\n *\n * This must be greater than 1 to support concurrent reads.\n */\n readPoolSize: number;\n\n busyTimeout?: number | undefined;\n journalMode?: 'WAL' | 'DELETE' | undefined;\n synchronous?: 'NORMAL' | 'FULL' | undefined;\n readUncommitted?: boolean | undefined;\n};\n\nconst OPEN = 1;\nconst CLOSED = 0;\n\ntype DBInstance = {\n instances: {\n db: SQLiteDatabase;\n preparedStatements: SQLitePreparedStatements;\n state: typeof OPEN | typeof CLOSED;\n }[];\n};\n\nexport class SQLiteDatabaseManager {\n readonly #dbm: GenericSQLiteDatabaseManager;\n readonly #dbInstances = new Map<string, DBInstance>();\n\n constructor(dbm: GenericSQLiteDatabaseManager) {\n this.#dbm = dbm;\n }\n\n clearAllStoresForTesting(): void {\n for (const [name] of this.#dbInstances) {\n this.destroy(name);\n }\n }\n\n open(\n name: string,\n opts: Omit<SQLiteDatabaseManagerOptions, 'poolSize'>,\n ): {db: SQLiteDatabase; preparedStatements: SQLitePreparedStatements} {\n const dbInstance = this.#dbInstances.get(name);\n\n const fileName = safeFilename(name);\n const newDb = this.#dbm.open(fileName);\n\n const txPreparedStatements = getTransactionPreparedStatements(newDb);\n\n const exec = (sql: string) => {\n const statement = newDb.prepare(sql);\n statement.run();\n statement.finalize();\n };\n\n if (!dbInstance) {\n // we only ensure the schema for the first open\n // the schema is the same for all connections\n this.#ensureSchema(exec, txPreparedStatements);\n }\n\n if (opts.busyTimeout !== undefined) {\n // we set a busy timeout to wait for write locks to be released\n exec(`PRAGMA busy_timeout = ${opts.busyTimeout}`);\n }\n if (opts.journalMode !== undefined) {\n // WAL allows concurrent readers (improves write throughput ~15x and read throughput ~1.5x)\n // but does not work on all platforms (e.g. Expo)\n exec(`PRAGMA journal_mode = ${opts.journalMode}`);\n }\n if (opts.synchronous !== undefined) {\n exec(`PRAGMA synchronous = ${opts.synchronous}`);\n }\n if (opts.readUncommitted !== undefined) {\n exec(\n `PRAGMA read_uncommitted = ${opts.readUncommitted ? 'true' : 'false'}`,\n );\n }\n\n // we prepare these after the schema is created\n const rwPreparedStatements = getRWPreparedStatements(newDb);\n\n const preparedStatements = {\n ...txPreparedStatements,\n ...rwPreparedStatements,\n };\n\n this.#dbInstances.set(name, {\n instances: [\n ...(dbInstance?.instances ?? []),\n {db: newDb, preparedStatements, state: OPEN},\n ],\n });\n\n return {\n db: newDb,\n preparedStatements,\n };\n }\n\n #closeDBInstance(name: string): DBInstance | undefined {\n const dbInstance = this.#dbInstances.get(name);\n if (dbInstance) {\n for (const instance of dbInstance.instances) {\n if (instance.state === CLOSED) {\n continue;\n }\n\n for (const stmt of Object.values(instance.preparedStatements)) {\n stmt.finalize();\n }\n instance.db.close();\n instance.state = CLOSED;\n }\n }\n return dbInstance;\n }\n\n close(name: string) {\n this.#closeDBInstance(name);\n }\n\n destroy(name: string): void {\n const dbInstance = this.#closeDBInstance(name);\n\n // All the instances in dbInstance share one underlying file.\n dbInstance?.instances[0].db.destroy();\n\n this.#dbInstances.delete(name);\n }\n\n #ensureSchema(\n exec: (sql: string) => void,\n preparedStatements: SQLiteTransactionPreparedStatements,\n ): void {\n preparedStatements.begin.run();\n\n try {\n // WITHOUT ROWID increases write throughput\n exec(\n 'CREATE TABLE IF NOT EXISTS entry (key TEXT PRIMARY KEY, value TEXT NOT NULL) WITHOUT ROWID',\n );\n preparedStatements.commit.run();\n } catch (e) {\n preparedStatements.rollback.run();\n throw e;\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/out/react.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Zero
3
- } from "./chunk-6USDOK3X.js";
3
+ } from "./chunk-LCK57CQL.js";
4
4
  import "./chunk-MKB4RXL3.js";
5
5
  import {
6
6
  DEFAULT_TTL_MS
@@ -1,5 +1,4 @@
1
- import { SQLiteDatabaseManager, type SQLiteDatabaseManagerOptions } from '../kv/sqlite-store.ts';
1
+ import { type SQLiteDatabaseManagerOptions } from '../kv/sqlite-store.ts';
2
2
  import type { StoreProvider } from '../kv/store.ts';
3
- export declare const expoDbManagerInstance: SQLiteDatabaseManager;
4
- export declare function expoSQLiteStoreProvider(opts?: Partial<Omit<SQLiteDatabaseManagerOptions, 'journalMode'>>): StoreProvider;
3
+ export declare function expoSQLiteStoreProvider(opts?: Partial<SQLiteDatabaseManagerOptions>): StoreProvider;
5
4
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../replicache/src/expo/store.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,qBAAqB,EAErB,KAAK,4BAA4B,EAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAElD,eAAO,MAAM,qBAAqB,uBA2BhC,CAAC;AAEH,wBAAgB,uBAAuB,CACrC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,aAAa,CAAC,CAAC,GAChE,aAAa,CAoBf"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../replicache/src/expo/store.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,4BAA4B,EAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAElD,wBAAgB,uBAAuB,CACrC,IAAI,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,GAC3C,aAAa,CAyDf"}
@@ -82,14 +82,7 @@ export declare class SQLiteStoreWrite extends SQLiteStoreRWBase implements Write
82
82
  export interface GenericSQLiteDatabaseManager {
83
83
  open(fileName: string): SQLiteDatabase;
84
84
  }
85
- /**
86
- * Creates a function that returns new SQLite store instances.
87
- * This is the main entry point for using the SQLite store implementation.
88
- *
89
- * @param dbm The SQLite database manager implementation
90
- * @returns A function that creates new store instances
91
- */
92
- export declare function createSQLiteStore(dbm: SQLiteDatabaseManager): (name: string, opts: SQLiteDatabaseManagerOptions) => SQLiteStore;
85
+ export declare function safeFilename(name: string): string;
93
86
  export type SQLiteDatabaseManagerOptions = {
94
87
  /**
95
88
  * The number of read connections to keep open.
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../../../../replicache/src/kv/sqlite-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../../../../replicache/src/kv/sqlite-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAMnE,OAAO,KAAK,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,YAAY,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC;CACzC;AAED,KAAK,mCAAmC,GAAG;IACzC,KAAK,EAAE,iBAAiB,CAAC;IACzB,cAAc,EAAE,iBAAiB,CAAC;IAClC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AAWF,KAAK,0BAA0B,GAAG;IAChC,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,iBAAiB,CAAC;CACxB,CAAC;AAUF,KAAK,wBAAwB,GAAG,mCAAmC,GACjE,0BAA0B,CAAC;AAgH7B;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,YAAW,KAAK;;gBAUrC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,qBAAqB,EAC1B,IAAI,EAAE,4BAA4B;IAmB9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAM7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF;AAED,cAAM,iBAAiB;;IACrB,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;gBAK/D,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,EAAE,MAAM,IAAI;IAMrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAcxD,SAAS,CAAC,QAAQ,IAAI,IAAI;IAK1B,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF;AAED,qBAAa,eAAgB,SAAQ,iBAAkB,YAAW,IAAI;gBAElE,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,EAAE,MAAM,IAAI;IAQrB,OAAO,IAAI,IAAI;CAMhB;AAED,qBAAa,gBAAiB,SAAQ,iBAAkB,YAAW,KAAK;;gBAIpE,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,EAAE,MAAM,IAAI;IAQrB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvB,OAAO,IAAI,IAAI;CAQhB;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC;CACxC;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,UAExC;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACvC,CAAC;AAaF,qBAAa,qBAAqB;;gBAIpB,GAAG,EAAE,4BAA4B;IAI7C,wBAAwB,IAAI,IAAI;IAMhC,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,CAAC,4BAA4B,EAAE,UAAU,CAAC,GACnD;QAAC,EAAE,EAAE,cAAc,CAAC;QAAC,kBAAkB,EAAE,wBAAwB,CAAA;KAAC;IA6ErE,KAAK,CAAC,IAAI,EAAE,MAAM;IAIlB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CA0B5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"collect-idb-databases.d.ts","sourceRoot":"","sources":["../../../../../replicache/src/persist/collect-idb-databases.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAKpE,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAU3C,OAAO,KAAK,EAAC,SAAS,EAAE,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAQ7D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAsB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAgB,CAAC;AAEvD,wBAAgB,uBAAuB,CACrC,iBAAiB,EAAE,iBAAiB,EACpC,WAAW,EAAE,SAAS,EACtB,eAAe,EAAE,MAAM,EACvB,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,MAAM,EACd,sBAAsB,EAAE,OAAO,EAC/B,gBAAgB,EAAE,gBAAgB,EAClC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,WAAW,GAClB,IAAI,CAwBN;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,sBAAsB,EAAE,OAAO,EAC/B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,4BAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAoEf;AAsCD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAG/C;AA8CD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,SAAS,CAAC;IACpD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,mBAAmB,GAAG,SAAS,iBAWvC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,CAAC,EAAE,mBAAmB,GAAG,SAAS,GACrC,OAAO,CAAC;IACT,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC,CAUD;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,CAAC,EAAE,mBAAmB,GAAG,SAAS;aAvB7B,MAAM,EAAE;YACT,OAAO,EAAE;GAyBlB"}
1
+ {"version":3,"file":"collect-idb-databases.d.ts","sourceRoot":"","sources":["../../../../../replicache/src/persist/collect-idb-databases.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAKpE,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAU3C,OAAO,KAAK,EAAC,SAAS,EAAE,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAQ7D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAsB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAgB,CAAC;AAEvD,wBAAgB,uBAAuB,CACrC,iBAAiB,EAAE,iBAAiB,EACpC,WAAW,EAAE,SAAS,EACtB,eAAe,EAAE,MAAM,EACvB,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,MAAM,EACd,sBAAsB,EAAE,OAAO,EAC/B,gBAAgB,EAAE,gBAAgB,EAClC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,WAAW,GAClB,IAAI,CAwBN;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,sBAAsB,EAAE,OAAO,EAC/B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,4BAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAoEf;AAsCD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAG/C;AA8CD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,SAAS,CAAC;IACpD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,mBAAmB,GAAG,SAAS,iBAWvC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,CAAC,EAAE,mBAAmB,GAAG,SAAS,GACrC,OAAO,CAAC;IACT,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC,CASD;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,CAAC,EAAE,mBAAmB,GAAG,SAAS;aAtB7B,MAAM,EAAE;YACT,OAAO,EAAE;GAwBlB"}
package/out/solid.js CHANGED
@@ -1,7 +1,7 @@
1
- import "./chunk-FMWNU2YJ.js";
1
+ import "./chunk-6QYVZALS.js";
2
2
  import {
3
3
  Zero
4
- } from "./chunk-6USDOK3X.js";
4
+ } from "./chunk-LCK57CQL.js";
5
5
  import "./chunk-MKB4RXL3.js";
6
6
  import {
7
7
  DEFAULT_TTL_MS,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rocicorp/zero",
3
- "version": "0.23.2025090100",
3
+ "version": "0.23.2025090400",
4
4
  "description": "Zero is a web framework for serverless web development.",
5
5
  "author": "Rocicorp, Inc.",
6
6
  "repository": {
@@ -1,3 +1,4 @@
1
+ import type { LogContext } from '@rocicorp/logger';
1
2
  import { type ShardID } from '../types/shards.ts';
2
3
  import type { ReadonlyJSONValue } from '../../../shared/src/json.ts';
3
4
  export type HeaderOptions = {
@@ -5,7 +6,7 @@ export type HeaderOptions = {
5
6
  token?: string | undefined;
6
7
  cookie?: string | undefined;
7
8
  };
8
- export declare function fetchFromAPIServer(url: string, allowedUrls: string[], shard: ShardID, headerOptions: HeaderOptions, queryParams: Record<string, string> | undefined, body: ReadonlyJSONValue): Promise<Response>;
9
+ export declare function fetchFromAPIServer(lc: LogContext, url: string, allowedUrls: string[], shard: ShardID, headerOptions: HeaderOptions, body: ReadonlyJSONValue): Promise<Response>;
9
10
  /**
10
11
  * Returns true if:
11
12
  * 1. the url is an exact match with one of the allowedUrls
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/custom/fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAKnE,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC/C,IAAI,EAAE,iBAAiB,qBAgExB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CA+CpE"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/custom/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAiB,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAKnE,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,UAAU,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,iBAAiB,qBAoExB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CA4CpE"}
@@ -3,7 +3,11 @@ import { upstreamSchema } from "../types/shards.js";
3
3
  import { ErrorForClient } from "../types/error-for-client.js";
4
4
  import { ErrorKind } from "../../../zero-protocol/src/error-kind.js";
5
5
  const reservedParams = ['schema', 'appID'];
6
- export async function fetchFromAPIServer(url, allowedUrls, shard, headerOptions, queryParams, body) {
6
+ export async function fetchFromAPIServer(lc, url, allowedUrls, shard, headerOptions, body) {
7
+ lc.info?.('fetchFromAPIServer called', {
8
+ url,
9
+ allowedUrls,
10
+ });
7
11
  if (!urlMatch(url, allowedUrls)) {
8
12
  throw new Error(`URL "${url}" is not allowed by the ZERO_MUTATE/GET_QUERIES_URL configuration`);
9
13
  }
@@ -21,16 +25,14 @@ export async function fetchFromAPIServer(url, allowedUrls, shard, headerOptions,
21
25
  }
22
26
  const urlObj = new URL(url);
23
27
  const params = new URLSearchParams(urlObj.search);
24
- for (const [key, value] of Object.entries(queryParams ?? {})) {
25
- params.append(key, value);
26
- }
27
28
  for (const reserved of reservedParams) {
28
29
  assert(!params.has(reserved), `The push URL cannot contain the reserved query param "${reserved}"`);
29
30
  }
30
31
  params.append('schema', upstreamSchema(shard));
31
32
  params.append('appID', shard.appID);
32
33
  urlObj.search = params.toString();
33
- const response = await fetch(urlObj.toString(), {
34
+ const finalUrl = urlObj.toString();
35
+ const response = await fetch(finalUrl, {
34
36
  method: 'POST',
35
37
  headers,
36
38
  body: JSON.stringify(body),
@@ -68,7 +70,7 @@ export async function fetchFromAPIServer(url, allowedUrls, shard, headerOptions,
68
70
  * - "https://*.*.example.com" does not match "https://api.example.com" (only one subdomain)
69
71
  */
70
72
  export function urlMatch(url, allowedUrls) {
71
- assert(url.includes('*') === false, 'Client provided URLs may not include `*`');
73
+ assert(url.includes('*') === false, 'URL to fetch may not include `*`');
72
74
  // ignore query parameters in the URL
73
75
  url = url.split('?')[0];
74
76
  for (let allowedUrl of allowedUrls) {
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../../zero-cache/src/custom/fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../../zero-cache/src/custom/fetch.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { LogContext } from '@rocicorp/logger';
1
2
  import type { TransformedAndHashed } from '../auth/read-authorizer.ts';
2
3
  import type { CustomQueryRecord } from '../services/view-syncer/schema/types.ts';
3
4
  import { type ErroredQuery } from '../../../zero-protocol/src/custom-queries.ts';
@@ -24,10 +25,10 @@ export type HttpError = {
24
25
  */
25
26
  export declare class CustomQueryTransformer {
26
27
  #private;
27
- constructor(config: {
28
+ constructor(lc: LogContext, config: {
28
29
  url: string[];
29
30
  forwardCookies: boolean;
30
31
  }, shard: ShardID);
31
- transform(headerOptions: HeaderOptions, queries: Iterable<CustomQueryRecord>): Promise<(TransformedAndHashed | ErroredQuery)[]>;
32
+ transform(headerOptions: HeaderOptions, queries: Iterable<CustomQueryRecord>, userQueryURL: string | undefined): Promise<(TransformedAndHashed | ErroredQuery)[]>;
32
33
  }
33
34
  //# sourceMappingURL=transform-query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform-query.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/custom-queries/transform-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAqB,KAAK,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAMhD,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,qBAAa,sBAAsB;;gBAS/B,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,cAAc,EAAE,OAAO,CAAC;KACzB,EACD,KAAK,EAAE,OAAO;IAOV,SAAS,CACb,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GACnC,OAAO,CAAC,CAAC,oBAAoB,GAAG,YAAY,CAAC,EAAE,CAAC;CAwFpD"}
1
+ {"version":3,"file":"transform-query.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/custom-queries/transform-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAqB,KAAK,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAMhD,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,qBAAa,sBAAsB;;gBAU/B,EAAE,EAAE,UAAU,EACd,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,cAAc,EAAE,OAAO,CAAC;KACzB,EACD,KAAK,EAAE,OAAO;IAQV,SAAS,CACb,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACpC,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,OAAO,CAAC,CAAC,oBAAoB,GAAG,YAAY,CAAC,EAAE,CAAC;CAyFpD"}
@@ -22,12 +22,14 @@ export class CustomQueryTransformer {
22
22
  #shard;
23
23
  #cache;
24
24
  #config;
25
- constructor(config, shard) {
25
+ #lc;
26
+ constructor(lc, config, shard) {
26
27
  this.#config = config;
27
28
  this.#shard = shard;
29
+ this.#lc = lc;
28
30
  this.#cache = new TimedCache(5000); // 5 seconds cache TTL
29
31
  }
30
- async transform(headerOptions, queries) {
32
+ async transform(headerOptions, queries, userQueryURL) {
31
33
  const request = [];
32
34
  const cachedResponses = [];
33
35
  if (!this.#config.forwardCookies && headerOptions.cookie) {
@@ -56,7 +58,8 @@ export class CustomQueryTransformer {
56
58
  }
57
59
  let response;
58
60
  try {
59
- response = await fetchFromAPIServer(must(this.#config.url[0], 'A ZERO_GET_QUERIES_URL must be configured for custom queries'), this.#config.url, this.#shard, headerOptions, undefined, ['transform', request]);
61
+ response = await fetchFromAPIServer(this.#lc, userQueryURL ??
62
+ must(this.#config.url[0], 'A ZERO_GET_QUERIES_URL must be configured for custom queries'), this.#config.url, this.#shard, headerOptions, ['transform', request]);
60
63
  }
61
64
  catch (e) {
62
65
  return request.map(r => ({
@@ -1 +1 @@
1
- {"version":3,"file":"transform-query.js","sourceRoot":"","sources":["../../../../../zero-cache/src/custom-queries/transform-query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-query.js","sourceRoot":"","sources":["../../../../../zero-cache/src/custom-queries/transform-query.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lite-tables.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/db/lite-tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAKjD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AASxD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EAGd,MAAM,YAAY,CAAC;AAWpB,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,EAAE,CA0DxD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,EAAE,CAyCzD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,QAAQ,EACjB,UAAU,GAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAa,EACnD,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACtC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CA6E7B;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACvC,SAAS,EAAE,MAAM,GAChB,cAAc,CAWhB"}
1
+ {"version":3,"file":"lite-tables.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/db/lite-tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAKjD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AASxD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EAGd,MAAM,YAAY,CAAC;AAWpB,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,EAAE,CA0DxD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,EAAE,CAyCzD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,QAAQ,EACjB,UAAU,GAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAa,EACnD,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACtC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CA8E7B;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACvC,SAAS,EAAE,MAAM,GAChB,cAAc,CAWhB"}
@@ -151,6 +151,7 @@ export function computeZqlSpecs(lc, replica, tableSpecs = new Map(), fullTables)
151
151
  // See row-key.ts: normalizedKeyOrder()
152
152
  primaryKey: v.parse(primaryKey.sort(), primaryKeySchema),
153
153
  unionKey: v.parse(unionKey.sort(), primaryKeySchema),
154
+ allKeys: keys.map(key => v.parse(key.sort(), primaryKeySchema)),
154
155
  };
155
156
  tableSpecs.set(tableSpec.name, {
156
157
  tableSpec,