@powersync/web 0.0.0-dev-20250127153955 → 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
@@ -33585,10 +33585,12 @@ class PowerSyncDatabase extends _powersync_common__WEBPACK_IMPORTED_MODULE_0__.A
33585
33585
  }
33586
33586
  return (0,_shared_navigator__WEBPACK_IMPORTED_MODULE_2__.getNavigatorLocks)().request(`lock-${this.database.name}`, cb);
33587
33587
  }
33588
- generateSyncStreamImplementation(connector) {
33588
+ generateSyncStreamImplementation(connector, options) {
33589
33589
  const remote = new _sync_WebRemote__WEBPACK_IMPORTED_MODULE_7__.WebRemote(connector);
33590
33590
  const syncOptions = {
33591
33591
  ...this.options,
33592
+ retryDelayMs: options.retryDelayMs,
33593
+ crudUploadThrottleMs: options.crudUploadThrottleMs,
33592
33594
  flags: this.resolvedFlags,
33593
33595
  adapter: this.bucketStorageAdapter,
33594
33596
  remote,
@@ -34084,8 +34086,12 @@ __webpack_require__.r(__webpack_exports__);
34084
34086
  */
34085
34087
  class WorkerWrappedAsyncDatabaseConnection {
34086
34088
  options;
34089
+ releaseSharedConnectionLock;
34090
+ lockAbortController;
34087
34091
  constructor(options) {
34088
34092
  this.options = options;
34093
+ this.releaseSharedConnectionLock = null;
34094
+ this.lockAbortController = new AbortController();
34089
34095
  }
34090
34096
  get baseConnection() {
34091
34097
  return this.options.baseConnection;
@@ -34098,6 +34104,30 @@ class WorkerWrappedAsyncDatabaseConnection {
34098
34104
  */
34099
34105
  async shareConnection() {
34100
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(() => { }));
34101
34131
  const newPort = await remote[comlink__WEBPACK_IMPORTED_MODULE_0__.createEndpoint]();
34102
34132
  return { port: newPort, identifier };
34103
34133
  }
@@ -34109,6 +34139,9 @@ class WorkerWrappedAsyncDatabaseConnection {
34109
34139
  return this.baseConnection.registerOnTableChange(comlink__WEBPACK_IMPORTED_MODULE_0__.proxy(callback));
34110
34140
  }
34111
34141
  async close() {
34142
+ // Abort any pending lock requests.
34143
+ this.lockAbortController.abort();
34144
+ this.releaseSharedConnectionLock?.();
34112
34145
  await this.baseConnection.close();
34113
34146
  this.options.remote[comlink__WEBPACK_IMPORTED_MODULE_0__.releaseProxy]();
34114
34147
  this.options.onClose?.();
@@ -34336,6 +34369,7 @@ class WASqliteConnection extends _powersync_common__WEBPACK_IMPORTED_MODULE_1__.
34336
34369
  await this.openDB();
34337
34370
  this.registerBroadcastListeners();
34338
34371
  await this.executeSingleStatement(`PRAGMA temp_store = ${this.options.temporaryStorage};`);
34372
+ await this.executeSingleStatement(`PRAGMA cache_size = -${this.options.cacheSizeKb};`);
34339
34373
  await this.executeEncryptionPragma();
34340
34374
  this.sqliteAPI.update_hook(this.dbP, (updateType, dbName, tableName) => {
34341
34375
  if (!tableName) {
@@ -34529,7 +34563,7 @@ class WASQLiteDBAdapter extends _LockedAsyncDatabaseAdapter__WEBPACK_IMPORTED_MO
34529
34563
  super({
34530
34564
  name: options.dbFilename,
34531
34565
  openConnection: async () => {
34532
- const { workerPort, temporaryStorage } = options;
34566
+ const { workerPort, temporaryStorage, cacheSizeKb } = options;
34533
34567
  if (workerPort) {
34534
34568
  const remote = comlink__WEBPACK_IMPORTED_MODULE_0__.wrap(workerPort);
34535
34569
  return new _WorkerWrappedAsyncDatabaseConnection__WEBPACK_IMPORTED_MODULE_4__.WorkerWrappedAsyncDatabaseConnection({
@@ -34538,6 +34572,7 @@ class WASQLiteDBAdapter extends _LockedAsyncDatabaseAdapter__WEBPACK_IMPORTED_MO
34538
34572
  baseConnection: await remote({
34539
34573
  ...options,
34540
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,
34541
34576
  flags: (0,_PowerSyncDatabase__WEBPACK_IMPORTED_MODULE_1__.resolveWebPowerSyncFlags)(options.flags),
34542
34577
  encryptionKey: options.encryptionKey
34543
34578
  })
@@ -34549,6 +34584,7 @@ class WASQLiteDBAdapter extends _LockedAsyncDatabaseAdapter__WEBPACK_IMPORTED_MO
34549
34584
  debugMode: options.debugMode,
34550
34585
  flags: options.flags,
34551
34586
  temporaryStorage,
34587
+ cacheSizeKb,
34552
34588
  logger: options.logger,
34553
34589
  vfs: options.vfs,
34554
34590
  encryptionKey: options.encryptionKey,
@@ -34613,7 +34649,7 @@ class WASQLiteOpenFactory extends _AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_M
34613
34649
  }
34614
34650
  async openConnection() {
34615
34651
  const { enableMultiTabs, useWebWorker } = this.resolvedFlags;
34616
- 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;
34617
34653
  if (!enableMultiTabs) {
34618
34654
  this.logger.warn('Multiple tabs are not enabled in this browser');
34619
34655
  }
@@ -34623,6 +34659,7 @@ class WASQLiteOpenFactory extends _AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_M
34623
34659
  ? (0,_worker_db_open_worker_database__WEBPACK_IMPORTED_MODULE_1__.resolveWorkerDatabasePortFactory)(() => optionsDbWorker({
34624
34660
  ...this.options,
34625
34661
  temporaryStorage,
34662
+ cacheSizeKb,
34626
34663
  flags: this.resolvedFlags,
34627
34664
  encryptionKey
34628
34665
  }))
@@ -34634,6 +34671,7 @@ class WASQLiteOpenFactory extends _AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_M
34634
34671
  dbFilename: this.options.dbFilename,
34635
34672
  vfs,
34636
34673
  temporaryStorage,
34674
+ cacheSizeKb,
34637
34675
  flags: this.resolvedFlags,
34638
34676
  encryptionKey: encryptionKey
34639
34677
  }),
@@ -34656,6 +34694,7 @@ class WASQLiteOpenFactory extends _AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_M
34656
34694
  debugMode: this.options.debugMode,
34657
34695
  vfs,
34658
34696
  temporaryStorage,
34697
+ cacheSizeKb,
34659
34698
  flags: this.resolvedFlags,
34660
34699
  encryptionKey: encryptionKey
34661
34700
  });
@@ -34726,6 +34765,7 @@ class WASQLitePowerSyncDatabaseOpenFactory extends _AbstractWebPowerSyncDatabase
34726
34765
  "use strict";
34727
34766
  __webpack_require__.r(__webpack_exports__);
34728
34767
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
34768
+ /* harmony export */ DEFAULT_CACHE_SIZE_KB: () => (/* binding */ DEFAULT_CACHE_SIZE_KB),
34729
34769
  /* harmony export */ DEFAULT_WEB_SQL_FLAGS: () => (/* binding */ DEFAULT_WEB_SQL_FLAGS),
34730
34770
  /* harmony export */ TemporaryStorageOption: () => (/* binding */ TemporaryStorageOption),
34731
34771
  /* harmony export */ isServerSide: () => (/* binding */ isServerSide),
@@ -34736,6 +34776,7 @@ var TemporaryStorageOption;
34736
34776
  TemporaryStorageOption["MEMORY"] = "memory";
34737
34777
  TemporaryStorageOption["FILESYSTEM"] = "file";
34738
34778
  })(TemporaryStorageOption || (TemporaryStorageOption = {}));
34779
+ const DEFAULT_CACHE_SIZE_KB = 50 * 1024;
34739
34780
  function isServerSide() {
34740
34781
  return typeof window == 'undefined';
34741
34782
  }
@@ -34949,10 +34990,10 @@ class SharedWebStreamingSyncImplementation extends _WebStreamingSyncImplementati
34949
34990
  * This worker will manage all syncing operations remotely.
34950
34991
  */
34951
34992
  const resolvedWorkerOptions = {
34952
- ...options,
34953
34993
  dbFilename: this.options.identifier,
34954
- // TODO
34955
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,
34956
34997
  flags: (0,_adapters_web_sql_flags__WEBPACK_IMPORTED_MODULE_3__.resolveWebSQLFlags)(options.flags)
34957
34998
  };
34958
34999
  const syncWorker = options.sync?.worker;
@@ -43414,6 +43455,7 @@ __webpack_require__.r(__webpack_exports__);
43414
43455
  /* harmony export */ AbstractWebPowerSyncDatabaseOpenFactory: () => (/* reexport safe */ _db_adapters_AbstractWebPowerSyncDatabaseOpenFactory__WEBPACK_IMPORTED_MODULE_1__.AbstractWebPowerSyncDatabaseOpenFactory),
43415
43456
  /* harmony export */ AbstractWebSQLOpenFactory: () => (/* reexport safe */ _db_adapters_AbstractWebSQLOpenFactory__WEBPACK_IMPORTED_MODULE_2__.AbstractWebSQLOpenFactory),
43416
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),
43417
43459
  /* harmony export */ DEFAULT_MODULE_FACTORIES: () => (/* reexport safe */ _db_adapters_wa_sqlite_WASQLiteConnection__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_MODULE_FACTORIES),
43418
43460
  /* harmony export */ DEFAULT_POWERSYNC_FLAGS: () => (/* reexport safe */ _db_PowerSyncDatabase__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_POWERSYNC_FLAGS),
43419
43461
  /* harmony export */ DEFAULT_WEB_SQL_FLAGS: () => (/* reexport safe */ _db_adapters_web_sql_flags__WEBPACK_IMPORTED_MODULE_7__.DEFAULT_WEB_SQL_FLAGS),