@powersync/web 0.0.0-dev-20260414110516 → 0.0.0-dev-20260503073249

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 (64) hide show
  1. package/dist/2075a31bb151adbb9767.wasm +0 -0
  2. package/dist/3322bc84de986b63c2cd.wasm +0 -0
  3. package/dist/8e97452e297be23b5e50.wasm +0 -0
  4. package/dist/fbc178b70d530e8ce02b.wasm +0 -0
  5. package/dist/index.umd.js +4323 -156
  6. package/dist/index.umd.js.map +1 -1
  7. package/dist/worker/SharedSyncImplementation.umd.js +24 -15
  8. package/dist/worker/SharedSyncImplementation.umd.js.map +1 -1
  9. package/dist/worker/WASQLiteDB.umd.js +86 -78
  10. package/dist/worker/WASQLiteDB.umd.js.map +1 -1
  11. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js +31 -0
  12. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js.map +1 -0
  13. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js +31 -0
  14. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js.map +1 -0
  15. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js +31 -0
  16. package/dist/worker/{node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-cc5fcc.umd.js.map → node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js.map} +1 -1
  17. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js +31 -0
  18. package/dist/worker/{node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js.map → node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js.map} +1 -1
  19. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js +3562 -0
  20. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js.map +1 -0
  21. package/dist/worker/{node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-0df390.umd.js → node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js} +16 -16
  22. package/dist/worker/{node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-0df390.umd.js.map → node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js.map} +1 -1
  23. package/dist/worker/{node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-151024.umd.js → node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js} +12 -12
  24. package/dist/worker/{node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-151024.umd.js.map → node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js.map} +1 -1
  25. package/dist/worker/{node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-c01ef0.umd.js → node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js} +14 -14
  26. package/dist/worker/{node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-c01ef0.umd.js.map → node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js.map} +1 -1
  27. package/lib/package.json +3 -3
  28. package/lib/src/db/PowerSyncDatabase.d.ts +1 -1
  29. package/lib/src/db/PowerSyncDatabase.js +0 -8
  30. package/lib/src/db/adapters/AsyncWebAdapter.d.ts +13 -3
  31. package/lib/src/db/adapters/AsyncWebAdapter.js +115 -21
  32. package/lib/src/db/adapters/wa-sqlite/DatabaseServer.js +1 -2
  33. package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.js +1 -1
  34. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +16 -2
  35. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +60 -38
  36. package/lib/src/db/adapters/wa-sqlite/vfs.d.ts +7 -18
  37. package/lib/src/db/adapters/wa-sqlite/vfs.js +34 -49
  38. package/lib/src/db/sync/SSRWebStreamingSyncImplementation.d.ts +4 -0
  39. package/lib/src/db/sync/SSRWebStreamingSyncImplementation.js +4 -0
  40. package/lib/src/worker/db/MultiDatabaseServer.js +4 -1
  41. package/lib/src/worker/db/open-worker-database.js +2 -2
  42. package/lib/src/worker/sync/SharedSyncImplementation.js +4 -8
  43. package/lib/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +4 -4
  45. package/src/db/PowerSyncDatabase.ts +1 -9
  46. package/src/db/adapters/AsyncWebAdapter.ts +138 -22
  47. package/src/db/adapters/wa-sqlite/DatabaseServer.ts +4 -2
  48. package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +4 -1
  49. package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +89 -44
  50. package/src/db/adapters/wa-sqlite/vfs.ts +33 -49
  51. package/src/db/sync/SSRWebStreamingSyncImplementation.ts +5 -0
  52. package/src/worker/db/MultiDatabaseServer.ts +4 -1
  53. package/src/worker/db/open-worker-database.ts +2 -2
  54. package/src/worker/sync/SharedSyncImplementation.ts +4 -8
  55. package/dist/26d61ca9f5694d064635.wasm +0 -0
  56. package/dist/b4c6283dc473b6b3fd24.wasm +0 -0
  57. package/dist/c78985091a0b22aaef03.wasm +0 -0
  58. package/dist/ca59e199e1138b553fad.wasm +0 -0
  59. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-b9c070.umd.js +0 -31
  60. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-b9c070.umd.js.map +0 -1
  61. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-c99c07.umd.js +0 -31
  62. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-c99c07.umd.js.map +0 -1
  63. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-cc5fcc.umd.js +0 -31
  64. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js +0 -31
@@ -384,9 +384,9 @@ function generateUUID() {
384
384
 
385
385
  /***/ },
386
386
 
387
- /***/ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-api.js"
387
+ /***/ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-api.js"
388
388
  /*!*******************************************************************************************************************!*\
389
- !*** ../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-api.js ***!
389
+ !*** ../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-api.js ***!
390
390
  \*******************************************************************************************************************/
391
391
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
392
392
 
@@ -627,7 +627,7 @@ __webpack_require__.r(__webpack_exports__);
627
627
  /* harmony export */ SQLITE_WARNING: () => (/* reexport safe */ _sqlite_constants_js__WEBPACK_IMPORTED_MODULE_0__.SQLITE_WARNING),
628
628
  /* harmony export */ SQLiteError: () => (/* binding */ SQLiteError)
629
629
  /* harmony export */ });
630
- /* harmony import */ var _sqlite_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sqlite-constants.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-constants.js");
630
+ /* harmony import */ var _sqlite_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sqlite-constants.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-constants.js");
631
631
  // Copyright 2021 Roy T. Hashimoto. All Rights Reserved.
632
632
 
633
633
 
@@ -669,6 +669,7 @@ function Factory(Module) {
669
669
  /** @type {SQLiteAPI} */ const sqlite3 = {};
670
670
 
671
671
  Module.retryOps = [];
672
+ Module.pendingOps = [];
672
673
  const sqliteFreeAddress = Module._getSqliteFree();
673
674
 
674
675
  // Allocate some space for 32-bit returned values.
@@ -1524,7 +1525,7 @@ function Factory(Module) {
1524
1525
  // succeed.
1525
1526
  async function retry(f) {
1526
1527
  let rc;
1527
- do {
1528
+ for (let retryCount = 0; retryCount < 2; ++retryCount) {
1528
1529
  // Wait for all pending retry operations to complete. This is
1529
1530
  // normally empty on the first loop iteration.
1530
1531
  if (Module.retryOps.length) {
@@ -1536,9 +1537,20 @@ function Factory(Module) {
1536
1537
  }
1537
1538
 
1538
1539
  rc = await f();
1539
-
1540
- // Retry on failure with new pending retry operations.
1541
- } while (rc && Module.retryOps.length);
1540
+ if (rc === _sqlite_constants_js__WEBPACK_IMPORTED_MODULE_0__.SQLITE_OK || Module.retryOps.length === 0) {
1541
+ if (Module.pendingOps.length) {
1542
+ try {
1543
+ await Promise.all(Module.pendingOps);
1544
+ } catch (e) {
1545
+ console.error('Error in pendingOps:', e);
1546
+ return e.code || _sqlite_constants_js__WEBPACK_IMPORTED_MODULE_0__.SQLITE_ERROR;
1547
+ } finally {
1548
+ Module.pendingOps = [];
1549
+ }
1550
+ }
1551
+ return rc;
1552
+ }
1553
+ }
1542
1554
  return rc;
1543
1555
  }
1544
1556
 
@@ -1579,9 +1591,9 @@ function decl(s) {
1579
1591
 
1580
1592
  /***/ },
1581
1593
 
1582
- /***/ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-constants.js"
1594
+ /***/ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-constants.js"
1583
1595
  /*!*************************************************************************************************************************!*\
1584
- !*** ../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-constants.js ***!
1596
+ !*** ../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-constants.js ***!
1585
1597
  \*************************************************************************************************************************/
1586
1598
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1587
1599
 
@@ -2332,8 +2344,7 @@ class DatabaseServer {
2332
2344
  },
2333
2345
  requestAccess: async (write, timeoutMs) => {
2334
2346
  requireOpen();
2335
- // TODO: Support timeouts, they don't seem to be supported by the async-mutex package.
2336
- const lease = await this.#inner.acquireConnection();
2347
+ const lease = await this.#inner.acquireConnection(timeoutMs != null ? AbortSignal.timeout(timeoutMs) : undefined);
2337
2348
  if (!isOpen) {
2338
2349
  // Race between requestAccess and close(), the connection was closed while we tried to acquire a lease.
2339
2350
  await lease.returnLease();
@@ -2405,7 +2416,7 @@ __webpack_require__.r(__webpack_exports__);
2405
2416
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2406
2417
  /* harmony export */ RawSqliteConnection: () => (/* binding */ RawSqliteConnection)
2407
2418
  /* harmony export */ });
2408
- /* harmony import */ var _journeyapps_wa_sqlite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @journeyapps/wa-sqlite */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-api.js");
2419
+ /* harmony import */ var _journeyapps_wa_sqlite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @journeyapps/wa-sqlite */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-api.js");
2409
2420
  /* harmony import */ var _vfs_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vfs.js */ "./lib/src/db/adapters/wa-sqlite/vfs.js");
2410
2421
 
2411
2422
 
@@ -2432,7 +2443,7 @@ class RawSqliteConnection {
2432
2443
  }
2433
2444
  async init() {
2434
2445
  const api = (this._sqliteAPI = await this.openSQLiteAPI());
2435
- this.db = await api.open_v2(this.options.dbFilename);
2446
+ this.db = await api.open_v2(this.options.dbFilename, this.options.isReadOnly ? 1 /* SQLITE_OPEN_READONLY */ : 6 /* SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE */);
2436
2447
  await this.executeRaw(`PRAGMA temp_store = ${this.options.temporaryStorage};`);
2437
2448
  if (this.options.encryptionKey) {
2438
2449
  const escapedKey = this.options.encryptionKey.replace("'", "''");
@@ -2566,11 +2577,7 @@ class RawSqliteConnection {
2566
2577
 
2567
2578
  __webpack_require__.r(__webpack_exports__);
2568
2579
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2569
- /* harmony export */ AsyncWASQLiteModuleFactory: () => (/* binding */ AsyncWASQLiteModuleFactory),
2570
2580
  /* harmony export */ DEFAULT_MODULE_FACTORIES: () => (/* binding */ DEFAULT_MODULE_FACTORIES),
2571
- /* harmony export */ MultiCipherAsyncWASQLiteModuleFactory: () => (/* binding */ MultiCipherAsyncWASQLiteModuleFactory),
2572
- /* harmony export */ MultiCipherSyncWASQLiteModuleFactory: () => (/* binding */ MultiCipherSyncWASQLiteModuleFactory),
2573
- /* harmony export */ SyncWASQLiteModuleFactory: () => (/* binding */ SyncWASQLiteModuleFactory),
2574
2581
  /* harmony export */ WASQLiteVFS: () => (/* binding */ WASQLiteVFS),
2575
2582
  /* harmony export */ vfsRequiresDedicatedWorkers: () => (/* binding */ vfsRequiresDedicatedWorkers)
2576
2583
  /* harmony export */ });
@@ -2582,51 +2589,38 @@ var WASQLiteVFS;
2582
2589
  WASQLiteVFS["IDBBatchAtomicVFS"] = "IDBBatchAtomicVFS";
2583
2590
  WASQLiteVFS["OPFSCoopSyncVFS"] = "OPFSCoopSyncVFS";
2584
2591
  WASQLiteVFS["AccessHandlePoolVFS"] = "AccessHandlePoolVFS";
2592
+ WASQLiteVFS["OPFSWriteAheadVFS"] = "OPFSWriteAheadVFS";
2585
2593
  })(WASQLiteVFS || (WASQLiteVFS = {}));
2586
2594
  function vfsRequiresDedicatedWorkers(vfs) {
2587
2595
  return vfs != WASQLiteVFS.IDBBatchAtomicVFS;
2588
2596
  }
2589
- /**
2590
- * @internal
2591
- */
2592
- const AsyncWASQLiteModuleFactory = async () => {
2593
- const { default: factory } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-cc5fcc").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/dist/wa-sqlite-async.mjs */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/dist/wa-sqlite-async.mjs"));
2594
- return factory();
2595
- };
2596
- /**
2597
- * @internal
2598
- */
2599
- const MultiCipherAsyncWASQLiteModuleFactory = async () => {
2600
- const { default: factory } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-c99c07").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/dist/mc-wa-sqlite-async.mjs */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/dist/mc-wa-sqlite-async.mjs"));
2601
- return factory();
2602
- };
2603
- /**
2604
- * @internal
2605
- */
2606
- const SyncWASQLiteModuleFactory = async () => {
2607
- const { default: factory } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/dist/wa-sqlite.mjs */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/dist/wa-sqlite.mjs"));
2608
- return factory();
2609
- };
2610
- /**
2611
- * @internal
2612
- */
2613
- const MultiCipherSyncWASQLiteModuleFactory = async () => {
2614
- const { default: factory } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-b9c070").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/dist/mc-wa-sqlite.mjs */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/dist/mc-wa-sqlite.mjs"));
2615
- return factory();
2616
- };
2597
+ async function asyncModuleFactory(encryptionKey) {
2598
+ if (encryptionKey) {
2599
+ const { default: factory } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/dist/mc-wa-sqlite-async.mjs */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/dist/mc-wa-sqlite-async.mjs"));
2600
+ return factory();
2601
+ }
2602
+ else {
2603
+ const { default: factory } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/dist/wa-sqlite-async.mjs */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/dist/wa-sqlite-async.mjs"));
2604
+ return factory();
2605
+ }
2606
+ }
2607
+ async function syncModuleFactory(encryptionKey) {
2608
+ if (encryptionKey) {
2609
+ const { default: factory } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/dist/mc-wa-sqlite.mjs */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/dist/mc-wa-sqlite.mjs"));
2610
+ return factory();
2611
+ }
2612
+ else {
2613
+ const { default: factory } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/dist/wa-sqlite.mjs */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/dist/wa-sqlite.mjs"));
2614
+ return factory();
2615
+ }
2616
+ }
2617
2617
  /**
2618
2618
  * @internal
2619
2619
  */
2620
2620
  const DEFAULT_MODULE_FACTORIES = {
2621
2621
  [WASQLiteVFS.IDBBatchAtomicVFS]: async (options) => {
2622
- let module;
2623
- if (options.encryptionKey) {
2624
- module = await MultiCipherAsyncWASQLiteModuleFactory();
2625
- }
2626
- else {
2627
- module = await AsyncWASQLiteModuleFactory();
2628
- }
2629
- const { IDBBatchAtomicVFS } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-0df390").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/src/examples/IDBBatchAtomicVFS.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/examples/IDBBatchAtomicVFS.js"));
2622
+ const module = await asyncModuleFactory(options.encryptionKey);
2623
+ const { IDBBatchAtomicVFS } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/src/examples/IDBBatchAtomicVFS.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/examples/IDBBatchAtomicVFS.js"));
2630
2624
  return {
2631
2625
  module,
2632
2626
  // @ts-expect-error The types for this static method are missing upstream
@@ -2634,35 +2628,33 @@ const DEFAULT_MODULE_FACTORIES = {
2634
2628
  };
2635
2629
  },
2636
2630
  [WASQLiteVFS.AccessHandlePoolVFS]: async (options) => {
2637
- let module;
2638
- if (options.encryptionKey) {
2639
- module = await MultiCipherSyncWASQLiteModuleFactory();
2640
- }
2641
- else {
2642
- module = await SyncWASQLiteModuleFactory();
2643
- }
2631
+ const module = await syncModuleFactory(options.encryptionKey);
2644
2632
  // @ts-expect-error The types for this static method are missing upstream
2645
- const { AccessHandlePoolVFS } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-151024").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/src/examples/AccessHandlePoolVFS.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/examples/AccessHandlePoolVFS.js"));
2633
+ const { AccessHandlePoolVFS } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/src/examples/AccessHandlePoolVFS.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/examples/AccessHandlePoolVFS.js"));
2646
2634
  return {
2647
2635
  module,
2648
2636
  vfs: await AccessHandlePoolVFS.create(options.dbFileName, module)
2649
2637
  };
2650
2638
  },
2651
2639
  [WASQLiteVFS.OPFSCoopSyncVFS]: async (options) => {
2652
- let module;
2653
- if (options.encryptionKey) {
2654
- module = await MultiCipherSyncWASQLiteModuleFactory();
2655
- }
2656
- else {
2657
- module = await SyncWASQLiteModuleFactory();
2658
- }
2640
+ const module = await syncModuleFactory(options.encryptionKey);
2659
2641
  // @ts-expect-error The types for this static method are missing upstream
2660
- const { OPFSCoopSyncVFS } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_5_0_node_modules_journeyapps_wa-sqlite_src_examples-c01ef0").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/src/examples/OPFSCoopSyncVFS.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/examples/OPFSCoopSyncVFS.js"));
2642
+ const { OPFSCoopSyncVFS } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/src/examples/OPFSCoopSyncVFS.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/examples/OPFSCoopSyncVFS.js"));
2661
2643
  const vfs = await OPFSCoopSyncVFS.create(options.dbFileName, module);
2662
2644
  return {
2663
2645
  module,
2664
2646
  vfs
2665
2647
  };
2648
+ },
2649
+ [WASQLiteVFS.OPFSWriteAheadVFS]: async (options) => {
2650
+ const module = await syncModuleFactory(options.encryptionKey);
2651
+ // @ts-expect-error The types for this static method are missing upstream
2652
+ const { OPFSWriteAheadVFS } = await __webpack_require__.e(/*! import() */ "node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422").then(__webpack_require__.bind(__webpack_require__, /*! @journeyapps/wa-sqlite/src/examples/OPFSWriteAheadVFS.js */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/examples/OPFSWriteAheadVFS.js"));
2653
+ const vfs = await OPFSWriteAheadVFS.create(options.dbFileName, module, {});
2654
+ return {
2655
+ module,
2656
+ vfs
2657
+ };
2666
2658
  }
2667
2659
  };
2668
2660
 
@@ -2756,7 +2748,10 @@ class MultiDatabaseServer {
2756
2748
  const { dbFilename } = options;
2757
2749
  let server = this.activeDatabases.get(dbFilename);
2758
2750
  if (server == null) {
2759
- const needsNavigatorLocks = !isSharedWorker;
2751
+ // We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
2752
+ // For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
2753
+ // fine).
2754
+ const needsNavigatorLocks = !(isSharedWorker || options.isReadOnly);
2760
2755
  const connection = new _db_adapters_wa_sqlite_RawSqliteConnection_js__WEBPACK_IMPORTED_MODULE_3__.RawSqliteConnection(options);
2761
2756
  const withSafeConcurrency = new _db_adapters_wa_sqlite_ConcurrentConnection_js__WEBPACK_IMPORTED_MODULE_4__.ConcurrentSqliteConnection(connection, needsNavigatorLocks);
2762
2757
  // Initializing the RawSqliteConnection will run some pragmas that might write to the database file, so we want
@@ -5040,16 +5035,12 @@ class SyncStatus {
5040
5035
  *
5041
5036
  * This returns null when the database is currently being opened and we don't have reliable information about all
5042
5037
  * included streams yet.
5043
- *
5044
- * @experimental Sync streams are currently in alpha.
5045
5038
  */
5046
5039
  get syncStreams() {
5047
5040
  return this.options.dataFlow?.internalStreamSubscriptions?.map((core) => new SyncStreamStatusView(this, core));
5048
5041
  }
5049
5042
  /**
5050
5043
  * If the `stream` appears in {@link syncStreams}, returns the current status for that stream.
5051
- *
5052
- * @experimental Sync streams are currently in alpha.
5053
5044
  */
5054
5045
  forStream(stream) {
5055
5046
  const asJson = JSON.stringify(stream.parameters);
@@ -13654,7 +13645,7 @@ function requireDist () {
13654
13645
 
13655
13646
  var distExports = requireDist();
13656
13647
 
13657
- var version = "1.51.0";
13648
+ var version = "1.52.0";
13658
13649
  var PACKAGE = {
13659
13650
  version: version};
13660
13651
 
@@ -14633,6 +14624,7 @@ class AbstractStreamingSyncImplementation extends BaseObserver {
14633
14624
  streamingSyncPromise;
14634
14625
  logger;
14635
14626
  activeStreams;
14627
+ connectionMayHaveChanged = false;
14636
14628
  isUploadingCrud = false;
14637
14629
  notifyCompletedUploads;
14638
14630
  handleActiveStreamsChange;
@@ -14912,6 +14904,11 @@ The next upload iteration will be delayed.`);
14912
14904
  shouldDelayRetry = false;
14913
14905
  // A disconnect was requested, we should not delay since there is no explicit retry
14914
14906
  }
14907
+ else if (this.connectionMayHaveChanged && ex.message?.indexOf('No iteration is active') >= 0) {
14908
+ this.connectionMayHaveChanged = false;
14909
+ this.logger.info('Sync error after changed connection, retrying immediately');
14910
+ shouldDelayRetry = false;
14911
+ }
14915
14912
  else {
14916
14913
  this.logger.error(ex);
14917
14914
  }
@@ -14942,6 +14939,15 @@ The next upload iteration will be delayed.`);
14942
14939
  // Mark as disconnected if here
14943
14940
  this.updateSyncStatus({ connected: false, connecting: false });
14944
14941
  }
14942
+ markConnectionMayHaveChanged() {
14943
+ // By setting this field, we'll immediately retry if the next sync event causes an error triggered by us not having
14944
+ // an active sync iteration on the connection in use.
14945
+ this.connectionMayHaveChanged = true;
14946
+ // This triggers a `powersync_control` invocation if a sync iteration is currently active. This is a cheap call to
14947
+ // make when no subscriptions have actually changed, we're mainly interested in this immediately throwing if no
14948
+ // iteration is active. That allows us to reconnect ASAP, instead of having to wait for the next sync line.
14949
+ this.handleActiveStreamsChange?.();
14950
+ }
14945
14951
  async collectLocalBucketState() {
14946
14952
  const bucketEntries = await this.options.adapter.getBucketStates();
14947
14953
  const req = bucketEntries.map((entry) => ({
@@ -15314,6 +15320,10 @@ The next upload iteration will be delayed.`);
15314
15320
  const rawResponse = await adapter.control(op, payload ?? null);
15315
15321
  const logger = syncImplementation.logger;
15316
15322
  logger.trace('powersync_control', op, payload == null || typeof payload == 'string' ? payload : '<bytes>', rawResponse);
15323
+ if (op != PowerSyncControlCommand.STOP) {
15324
+ // Evidently we have a working connection here, otherwise powersync_control would have failed.
15325
+ syncImplementation.connectionMayHaveChanged = false;
15326
+ }
15317
15327
  await handleInstructions(JSON.parse(rawResponse));
15318
15328
  }
15319
15329
  async function handleInstruction(instruction) {
@@ -17383,10 +17393,8 @@ class Schema {
17383
17393
  * developer instead of automatically by PowerSync.
17384
17394
  * Since raw tables are not backed by JSON, running complex queries on them may be more efficient. Further, they allow
17385
17395
  * using client-side table and column constraints.
17386
- * Note that raw tables are only supported when using the new `SyncClientImplementation.rust` sync client.
17387
17396
  *
17388
17397
  * @param tables An object of (table name, raw table definition) entries.
17389
- * @experimental Note that the raw tables API is still experimental and may change in the future.
17390
17398
  */
17391
17399
  withRawTables(tables) {
17392
17400
  for (const [name, rawTableDefinition] of Object.entries(tables)) {
@@ -17759,7 +17767,7 @@ var __webpack_exports__ = {};
17759
17767
  !*** ./lib/src/worker/db/WASQLiteDB.worker.js ***!
17760
17768
  \************************************************/
17761
17769
  __webpack_require__.r(__webpack_exports__);
17762
- /* harmony import */ var _journeyapps_wa_sqlite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @journeyapps/wa-sqlite */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.5.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-api.js");
17770
+ /* harmony import */ var _journeyapps_wa_sqlite__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @journeyapps/wa-sqlite */ "../../node_modules/.pnpm/@journeyapps+wa-sqlite@1.7.0/node_modules/@journeyapps/wa-sqlite/src/sqlite-api.js");
17763
17771
  /* harmony import */ var _powersync_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @powersync/common */ "../common/dist/bundle.mjs");
17764
17772
  /* harmony import */ var comlink__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! comlink */ "../../node_modules/.pnpm/comlink@4.4.2/node_modules/comlink/dist/esm/comlink.mjs");
17765
17773
  /* harmony import */ var _MultiDatabaseServer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MultiDatabaseServer.js */ "./lib/src/worker/db/MultiDatabaseServer.js");