@powersync/web 1.39.0 → 1.39.1

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 (35) hide show
  1. package/dist/index.umd.js +85 -32
  2. package/dist/index.umd.js.map +1 -1
  3. package/dist/worker/SharedSyncImplementation.umd.js +15 -9
  4. package/dist/worker/SharedSyncImplementation.umd.js.map +1 -1
  5. package/dist/worker/WASQLiteDB.umd.js +24 -9
  6. package/dist/worker/WASQLiteDB.umd.js.map +1 -1
  7. package/lib/package.json +2 -2
  8. package/lib/src/db/adapters/AsyncWebAdapter.js +1 -1
  9. package/lib/src/db/adapters/AsyncWebAdapter.js.map +1 -1
  10. package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.d.ts +8 -0
  11. package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.js +9 -0
  12. package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -1
  13. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +8 -2
  14. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -1
  15. package/lib/src/db/sync/SharedWebStreamingSyncImplementation.d.ts +1 -0
  16. package/lib/src/db/sync/SharedWebStreamingSyncImplementation.js +10 -5
  17. package/lib/src/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -1
  18. package/lib/src/worker/db/open-worker-database.d.ts +3 -2
  19. package/lib/src/worker/db/open-worker-database.js +30 -22
  20. package/lib/src/worker/db/open-worker-database.js.map +1 -1
  21. package/lib/src/worker/errors.d.ts +2 -0
  22. package/lib/src/worker/errors.js +7 -0
  23. package/lib/src/worker/errors.js.map +1 -0
  24. package/lib/src/worker/sync/SharedSyncImplementation.d.ts +1 -0
  25. package/lib/src/worker/sync/SharedSyncImplementation.js +2 -1
  26. package/lib/src/worker/sync/SharedSyncImplementation.js.map +1 -1
  27. package/lib/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +3 -3
  29. package/src/db/adapters/AsyncWebAdapter.ts +1 -1
  30. package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +10 -0
  31. package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +24 -9
  32. package/src/db/sync/SharedWebStreamingSyncImplementation.ts +17 -11
  33. package/src/worker/db/open-worker-database.ts +34 -22
  34. package/src/worker/errors.ts +9 -0
  35. package/src/worker/sync/SharedSyncImplementation.ts +3 -1
@@ -1,6 +1,8 @@
1
1
  import * as Comlink from 'comlink';
2
2
  import { vfsRequiresDedicatedWorkers, WASQLiteVFS } from '../../db/adapters/wa-sqlite/vfs.js';
3
3
  import { OpenWorkerConnection } from '../../db/adapters/wa-sqlite/DatabaseClient.js';
4
+ import type { ILogger } from '@powersync/common';
5
+ import { logWorkerErrors } from '../errors.js';
4
6
 
5
7
  /**
6
8
  * Opens a shared or dedicated worker which exposes opening of database connections
@@ -9,20 +11,23 @@ export function openWorkerDatabasePort(
9
11
  workerIdentifier: string,
10
12
  multipleTabs = true,
11
13
  worker: string | URL = '',
12
- vfs?: WASQLiteVFS
14
+ vfs?: WASQLiteVFS,
15
+ logger?: ILogger
13
16
  ) {
14
17
  const needsDedicated = vfs && vfsRequiresDedicatedWorkers(vfs);
18
+ let resolvedWorker: Worker | SharedWorker;
15
19
 
16
20
  if (worker) {
17
- return !needsDedicated && multipleTabs
18
- ? new SharedWorker(`${worker}`, {
19
- /* @vite-ignore */
20
- name: `shared-DB-worker-${workerIdentifier}`
21
- }).port
22
- : new Worker(`${worker}`, {
23
- /* @vite-ignore */
24
- name: `DB-worker-${workerIdentifier}`
25
- });
21
+ resolvedWorker =
22
+ !needsDedicated && multipleTabs
23
+ ? new SharedWorker(`${worker}`, {
24
+ /* @vite-ignore */
25
+ name: `shared-DB-worker-${workerIdentifier}`
26
+ })
27
+ : new Worker(`${worker}`, {
28
+ /* @vite-ignore */
29
+ name: `DB-worker-${workerIdentifier}`
30
+ });
26
31
  } else {
27
32
  /**
28
33
  * Webpack V5 can bundle the worker automatically if the full Worker constructor syntax is used
@@ -30,18 +35,21 @@ export function openWorkerDatabasePort(
30
35
  * This enables multi tab support by default, but falls back if SharedWorker is not available
31
36
  * (in the case of Android)
32
37
  */
33
- return !needsDedicated && multipleTabs
34
- ? new SharedWorker(new URL('./WASQLiteDB.worker.js', import.meta.url), {
35
- /* @vite-ignore */
36
- name: `shared-DB-worker-${workerIdentifier}`,
37
- type: 'module'
38
- }).port
39
- : new Worker(new URL('./WASQLiteDB.worker.js', import.meta.url), {
40
- /* @vite-ignore */
41
- name: `DB-worker-${workerIdentifier}`,
42
- type: 'module'
43
- });
38
+ resolvedWorker =
39
+ !needsDedicated && multipleTabs
40
+ ? new SharedWorker(new URL('./WASQLiteDB.worker.js', import.meta.url), {
41
+ /* @vite-ignore */
42
+ name: `shared-DB-worker-${workerIdentifier}`,
43
+ type: 'module'
44
+ })
45
+ : new Worker(new URL('./WASQLiteDB.worker.js', import.meta.url), {
46
+ /* @vite-ignore */
47
+ name: `DB-worker-${workerIdentifier}`,
48
+ type: 'module'
49
+ });
44
50
  }
51
+
52
+ return resolveWorkerDatabasePortFactory(() => resolvedWorker, logger);
45
53
  }
46
54
 
47
55
  /**
@@ -52,8 +60,12 @@ export function getWorkerDatabaseOpener(workerIdentifier: string, multipleTabs =
52
60
  return Comlink.wrap<OpenWorkerConnection>(openWorkerDatabasePort(workerIdentifier, multipleTabs, worker));
53
61
  }
54
62
 
55
- export function resolveWorkerDatabasePortFactory(worker: () => Worker | SharedWorker) {
63
+ export function resolveWorkerDatabasePortFactory(worker: () => Worker | SharedWorker, logger?: ILogger) {
56
64
  const workerInstance = worker();
65
+ if (logger) {
66
+ logWorkerErrors(workerInstance, logger);
67
+ }
68
+
57
69
  return isSharedWorker(workerInstance) ? workerInstance.port : workerInstance;
58
70
  }
59
71
 
@@ -0,0 +1,9 @@
1
+ import type { ILogger } from '@powersync/common';
2
+
3
+ export function logWorkerErrors(worker: AbstractWorker, logger: ILogger) {
4
+ function logError(event: ErrorEvent) {
5
+ logger.error('Error in database or sync worker, this likely disrupts PowerSync.', event.error);
6
+ }
7
+
8
+ worker.addEventListener('error', logError);
9
+ }
@@ -122,6 +122,8 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
122
122
  broadCastLogger: ILogger;
123
123
  protected readonly database = this.generateReconnectableDatabase();
124
124
 
125
+ private sharedCloseSignal = generateTabCloseSignal();
126
+
125
127
  constructor() {
126
128
  super();
127
129
  this.ports = [];
@@ -508,7 +510,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
508
510
  const remote = Comlink.wrap<OpenWorkerConnection>(workerPort);
509
511
  const identifier = this.syncParams!.dbParams.dbFilename;
510
512
 
511
- const clientLockName = await generateTabCloseSignal();
513
+ const clientLockName = await this.sharedCloseSignal;
512
514
 
513
515
  /**
514
516
  * The open could fail if the tab is closed while we're busy opening the database.