@powersync/web 0.0.0-dev-20250207081035 → 0.0.0-dev-20250210155038

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -34086,8 +34086,12 @@ __webpack_require__.r(__webpack_exports__);
34086
34086
  */
34087
34087
  class WorkerWrappedAsyncDatabaseConnection {
34088
34088
  options;
34089
+ releaseSharedConnectionLock;
34090
+ lockAbortController;
34089
34091
  constructor(options) {
34090
34092
  this.options = options;
34093
+ this.releaseSharedConnectionLock = null;
34094
+ this.lockAbortController = new AbortController();
34091
34095
  }
34092
34096
  get baseConnection() {
34093
34097
  return this.options.baseConnection;
@@ -34100,6 +34104,30 @@ class WorkerWrappedAsyncDatabaseConnection {
34100
34104
  */
34101
34105
  async shareConnection() {
34102
34106
  const { identifier, remote } = this.options;
34107
+ /**
34108
+ * Hold a navigator lock in order to avoid features such as Chrome's frozen tabs,
34109
+ * or Edge's sleeping tabs from pausing the thread for this connection.
34110
+ * This promise resolves once a lock is obtained.
34111
+ * This lock will be held as long as this connection is open.
34112
+ * The `shareConnection` method should not be called on multiple tabs concurrently.
34113
+ */
34114
+ await new Promise((lockObtained) => navigator.locks
34115
+ .request(`shared-connection-${this.options.identifier}`, {
34116
+ signal: this.lockAbortController.signal
34117
+ }, async () => {
34118
+ lockObtained();
34119
+ // Free the lock when the connection is already closed.
34120
+ if (this.lockAbortController.signal.aborted) {
34121
+ return;
34122
+ }
34123
+ // Hold the lock while the shared connection is in use.
34124
+ await new Promise((releaseLock) => {
34125
+ // We can use the resolver to free the lock
34126
+ this.releaseSharedConnectionLock = releaseLock;
34127
+ });
34128
+ })
34129
+ // We aren't concerned with errors here
34130
+ .catch(() => { }));
34103
34131
  const newPort = await remote[comlink__WEBPACK_IMPORTED_MODULE_0__.createEndpoint]();
34104
34132
  return { port: newPort, identifier };
34105
34133
  }
@@ -34111,6 +34139,9 @@ class WorkerWrappedAsyncDatabaseConnection {
34111
34139
  return this.baseConnection.registerOnTableChange(comlink__WEBPACK_IMPORTED_MODULE_0__.proxy(callback));
34112
34140
  }
34113
34141
  async close() {
34142
+ // Abort any pending lock requests.
34143
+ this.lockAbortController.abort();
34144
+ this.releaseSharedConnectionLock?.();
34114
34145
  await this.baseConnection.close();
34115
34146
  this.options.remote[comlink__WEBPACK_IMPORTED_MODULE_0__.releaseProxy]();
34116
34147
  this.options.onClose?.();
@@ -34338,6 +34369,7 @@ class WASqliteConnection extends _powersync_common__WEBPACK_IMPORTED_MODULE_1__.
34338
34369
  await this.openDB();
34339
34370
  this.registerBroadcastListeners();
34340
34371
  await this.executeSingleStatement(`PRAGMA temp_store = ${this.options.temporaryStorage};`);
34372
+ await this.executeSingleStatement(`PRAGMA cache_size = -${this.options.cacheSizeKb};`);
34341
34373
  await this.executeEncryptionPragma();
34342
34374
  this.sqliteAPI.update_hook(this.dbP, (updateType, dbName, tableName) => {
34343
34375
  if (!tableName) {
@@ -34531,7 +34563,7 @@ class WASQLiteDBAdapter extends _LockedAsyncDatabaseAdapter__WEBPACK_IMPORTED_MO
34531
34563
  super({
34532
34564
  name: options.dbFilename,
34533
34565
  openConnection: async () => {
34534
- const { workerPort, temporaryStorage } = options;
34566
+ const { workerPort, temporaryStorage, cacheSizeKb } = options;
34535
34567
  if (workerPort) {
34536
34568
  const remote = comlink__WEBPACK_IMPORTED_MODULE_0__.wrap(workerPort);
34537
34569
  return new _WorkerWrappedAsyncDatabaseConnection__WEBPACK_IMPORTED_MODULE_4__.WorkerWrappedAsyncDatabaseConnection({
@@ -34540,6 +34572,7 @@ class WASQLiteDBAdapter extends _LockedAsyncDatabaseAdapter__WEBPACK_IMPORTED_MO
34540
34572
  baseConnection: await remote({
34541
34573
  ...options,
34542
34574
  temporaryStorage: temporaryStorage ?? _web_sql_flags__WEBPACK_IMPORTED_MODULE_3__.TemporaryStorageOption.MEMORY,
34575
+ cacheSizeKb: cacheSizeKb ?? _web_sql_flags__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_CACHE_SIZE_KB,
34543
34576
  flags: (0,_PowerSyncDatabase__WEBPACK_IMPORTED_MODULE_1__.resolveWebPowerSyncFlags)(options.flags),
34544
34577
  encryptionKey: options.encryptionKey
34545
34578
  })
@@ -34551,6 +34584,7 @@ class WASQLiteDBAdapter extends _LockedAsyncDatabaseAdapter__WEBPACK_IMPORTED_MO
34551
34584
  debugMode: options.debugMode,
34552
34585
  flags: options.flags,
34553
34586
  temporaryStorage,
34587
+ cacheSizeKb,
34554
34588
  logger: options.logger,
34555
34589
  vfs: options.vfs,
34556
34590
  encryptionKey: options.encryptionKey,
@@ -34615,7 +34649,7 @@ class WASQLiteOpenFactory extends _AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_M
34615
34649
  }
34616
34650
  async openConnection() {
34617
34651
  const { enableMultiTabs, useWebWorker } = this.resolvedFlags;
34618
- const { vfs = _WASQLiteConnection__WEBPACK_IMPORTED_MODULE_6__.WASQLiteVFS.IDBBatchAtomicVFS, temporaryStorage = _web_sql_flags__WEBPACK_IMPORTED_MODULE_4__.TemporaryStorageOption.MEMORY, encryptionKey } = this.waOptions;
34652
+ const { vfs = _WASQLiteConnection__WEBPACK_IMPORTED_MODULE_6__.WASQLiteVFS.IDBBatchAtomicVFS, temporaryStorage = _web_sql_flags__WEBPACK_IMPORTED_MODULE_4__.TemporaryStorageOption.MEMORY, cacheSizeKb = _web_sql_flags__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_CACHE_SIZE_KB, encryptionKey } = this.waOptions;
34619
34653
  if (!enableMultiTabs) {
34620
34654
  this.logger.warn('Multiple tabs are not enabled in this browser');
34621
34655
  }
@@ -34625,6 +34659,7 @@ class WASQLiteOpenFactory extends _AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_M
34625
34659
  ? (0,_worker_db_open_worker_database__WEBPACK_IMPORTED_MODULE_1__.resolveWorkerDatabasePortFactory)(() => optionsDbWorker({
34626
34660
  ...this.options,
34627
34661
  temporaryStorage,
34662
+ cacheSizeKb,
34628
34663
  flags: this.resolvedFlags,
34629
34664
  encryptionKey
34630
34665
  }))
@@ -34636,6 +34671,7 @@ class WASQLiteOpenFactory extends _AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_M
34636
34671
  dbFilename: this.options.dbFilename,
34637
34672
  vfs,
34638
34673
  temporaryStorage,
34674
+ cacheSizeKb,
34639
34675
  flags: this.resolvedFlags,
34640
34676
  encryptionKey: encryptionKey
34641
34677
  }),
@@ -34658,6 +34694,7 @@ class WASQLiteOpenFactory extends _AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_M
34658
34694
  debugMode: this.options.debugMode,
34659
34695
  vfs,
34660
34696
  temporaryStorage,
34697
+ cacheSizeKb,
34661
34698
  flags: this.resolvedFlags,
34662
34699
  encryptionKey: encryptionKey
34663
34700
  });
@@ -34728,6 +34765,7 @@ class WASQLitePowerSyncDatabaseOpenFactory extends _AbstractWebPowerSyncDatabase
34728
34765
  "use strict";
34729
34766
  __webpack_require__.r(__webpack_exports__);
34730
34767
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
34768
+ /* harmony export */ DEFAULT_CACHE_SIZE_KB: () => (/* binding */ DEFAULT_CACHE_SIZE_KB),
34731
34769
  /* harmony export */ DEFAULT_WEB_SQL_FLAGS: () => (/* binding */ DEFAULT_WEB_SQL_FLAGS),
34732
34770
  /* harmony export */ TemporaryStorageOption: () => (/* binding */ TemporaryStorageOption),
34733
34771
  /* harmony export */ isServerSide: () => (/* binding */ isServerSide),
@@ -34738,6 +34776,7 @@ var TemporaryStorageOption;
34738
34776
  TemporaryStorageOption["MEMORY"] = "memory";
34739
34777
  TemporaryStorageOption["FILESYSTEM"] = "file";
34740
34778
  })(TemporaryStorageOption || (TemporaryStorageOption = {}));
34779
+ const DEFAULT_CACHE_SIZE_KB = 50 * 1024;
34741
34780
  function isServerSide() {
34742
34781
  return typeof window == 'undefined';
34743
34782
  }
@@ -34951,10 +34990,10 @@ class SharedWebStreamingSyncImplementation extends _WebStreamingSyncImplementati
34951
34990
  * This worker will manage all syncing operations remotely.
34952
34991
  */
34953
34992
  const resolvedWorkerOptions = {
34954
- ...options,
34955
34993
  dbFilename: this.options.identifier,
34956
- // TODO
34957
34994
  temporaryStorage: _adapters_web_sql_flags__WEBPACK_IMPORTED_MODULE_3__.TemporaryStorageOption.MEMORY,
34995
+ cacheSizeKb: _adapters_web_sql_flags__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_CACHE_SIZE_KB,
34996
+ ...options,
34958
34997
  flags: (0,_adapters_web_sql_flags__WEBPACK_IMPORTED_MODULE_3__.resolveWebSQLFlags)(options.flags)
34959
34998
  };
34960
34999
  const syncWorker = options.sync?.worker;
@@ -43416,6 +43455,7 @@ __webpack_require__.r(__webpack_exports__);
43416
43455
  /* harmony export */ AbstractWebPowerSyncDatabaseOpenFactory: () => (/* reexport safe */ _db_adapters_AbstractWebPowerSyncDatabaseOpenFactory__WEBPACK_IMPORTED_MODULE_1__.AbstractWebPowerSyncDatabaseOpenFactory),
43417
43456
  /* harmony export */ AbstractWebSQLOpenFactory: () => (/* reexport safe */ _db_adapters_AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_MODULE_2__.AbstractWebSQLOpenFactory),
43418
43457
  /* harmony export */ AsyncWASQLiteModuleFactory: () => (/* reexport safe */ _db_adapters_wa_sqlite_WASQLiteConnection__WEBPACK_IMPORTED_MODULE_3__.AsyncWASQLiteModuleFactory),
43458
+ /* harmony export */ DEFAULT_CACHE_SIZE_KB: () => (/* reexport safe */ _db_adapters_web_sql_flags__WEBPACK_IMPORTED_MODULE_7__.DEFAULT_CACHE_SIZE_KB),
43419
43459
  /* harmony export */ DEFAULT_MODULE_FACTORIES: () => (/* reexport safe */ _db_adapters_wa_sqlite_WASQLiteConnection__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_MODULE_FACTORIES),
43420
43460
  /* harmony export */ DEFAULT_POWERSYNC_FLAGS: () => (/* reexport safe */ _db_PowerSyncDatabase__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_POWERSYNC_FLAGS),
43421
43461
  /* harmony export */ DEFAULT_WEB_SQL_FLAGS: () => (/* reexport safe */ _db_adapters_web_sql_flags__WEBPACK_IMPORTED_MODULE_7__.DEFAULT_WEB_SQL_FLAGS),