@powersync/web 2.4.1 → 2.5.0

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 (49) hide show
  1. package/dist/index.react_native_web.js +64 -6
  2. package/dist/index.react_native_web.js.map +1 -1
  3. package/dist/worker/{AccessHandlePoolVFS-BPUHfZME.js → AccessHandlePoolVFS-B9CKqcQ3.js} +2 -2
  4. package/dist/worker/AccessHandlePoolVFS-B9CKqcQ3.js.map +1 -0
  5. package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -1
  6. package/dist/worker/IDBBatchAtomicVFS-BfRzbRoV.js +2 -0
  7. package/dist/worker/IDBBatchAtomicVFS-BfRzbRoV.js.map +1 -0
  8. package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -1
  9. package/dist/worker/OPFSCoopSyncVFS-BxXAVpVQ.js +2 -0
  10. package/dist/worker/OPFSCoopSyncVFS-BxXAVpVQ.js.map +1 -0
  11. package/dist/worker/OPFSWriteAheadVFS-DuqXaOct.js +2 -0
  12. package/dist/worker/OPFSWriteAheadVFS-DuqXaOct.js.map +1 -0
  13. package/dist/worker/mc-wa-sqlite-PubB6u8c.js.map +1 -1
  14. package/dist/worker/mc-wa-sqlite-async-DJG_ANKO.js.map +1 -1
  15. package/dist/worker/wa-sqlite-D1_4mGs8.js.map +1 -1
  16. package/dist/worker/wa-sqlite-async-BxkwNY-2.js.map +1 -1
  17. package/dist/worker/worker.js +1 -1
  18. package/dist/worker/worker.js.map +1 -1
  19. package/lib/db/PowerSyncDatabase.js +6 -2
  20. package/lib/db/PowerSyncDatabase.js.map +1 -1
  21. package/lib/db/sync/SharedWebStreamingSyncImplementation.d.ts +1 -0
  22. package/lib/db/sync/SharedWebStreamingSyncImplementation.js +17 -3
  23. package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -1
  24. package/lib/db/sync/WebStreamingSyncImplementation.d.ts +8 -1
  25. package/lib/db/sync/WebStreamingSyncImplementation.js +14 -0
  26. package/lib/db/sync/WebStreamingSyncImplementation.js.map +1 -1
  27. package/lib/devtools/index.d.ts +7 -0
  28. package/lib/devtools/index.js +8 -0
  29. package/lib/devtools/index.js.map +1 -0
  30. package/lib/devtools/registry.d.ts +12 -0
  31. package/lib/devtools/registry.js +42 -0
  32. package/lib/devtools/registry.js.map +1 -0
  33. package/lib/worker/sync/BroadcastLogger.d.ts +1 -4
  34. package/lib/worker/sync/BroadcastLogger.js +14 -15
  35. package/lib/worker/sync/BroadcastLogger.js.map +1 -1
  36. package/package.json +12 -8
  37. package/src/db/PowerSyncDatabase.ts +6 -2
  38. package/src/db/sync/SharedWebStreamingSyncImplementation.ts +22 -4
  39. package/src/db/sync/WebStreamingSyncImplementation.ts +18 -0
  40. package/src/devtools/index.ts +7 -0
  41. package/src/devtools/registry.ts +53 -0
  42. package/src/worker/sync/BroadcastLogger.ts +15 -15
  43. package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +0 -1
  44. package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js +0 -2
  45. package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +0 -1
  46. package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js +0 -2
  47. package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +0 -1
  48. package/dist/worker/OPFSWriteAheadVFS-BW9pqSNn.js +0 -2
  49. package/dist/worker/OPFSWriteAheadVFS-BW9pqSNn.js.map +0 -1
@@ -9,6 +9,7 @@ import { WebRemote } from './sync/WebRemote.js';
9
9
  import { AsyncDbAdapter } from './adapters/AsyncWebAdapter.js';
10
10
  import { resolveAndValidateOptions } from './adapters/resolveAndValidateOptions.js';
11
11
  import { TabLocalStreamingSyncImplementation } from './sync/TabLocalStreamingSyncImplementation.js';
12
+ import { registerDatabase, unregisterDatabase } from '../devtools/registry.js';
12
13
  /**
13
14
  * @internal Use {@link PowerSyncDatabase} instead, this class is only used by other SDKs also needing web support.
14
15
  */
@@ -21,6 +22,8 @@ export class WebPowerSyncDatabase extends BasePowerSyncDatabase {
21
22
  super(options);
22
23
  this.resolvedOpenOptions = resolvedOpenOptions;
23
24
  this.enableBroadcastLogs = options.broadcastLogs ?? true;
25
+ // Lets development tooling in this page find the live databases.
26
+ registerDatabase(this);
24
27
  }
25
28
  async _initialize() {
26
29
  if (this.database instanceof AsyncDbAdapter) {
@@ -61,11 +64,12 @@ export class WebPowerSyncDatabase extends BasePowerSyncDatabase {
61
64
  * By default the sync stream client is only disconnected if
62
65
  * multiple tabs are not enabled.
63
66
  */
64
- close(options) {
65
- return super.close({
67
+ async close(options) {
68
+ await super.close({
66
69
  // Don't disconnect by default if multiple tabs are enabled
67
70
  disconnect: options?.disconnect ?? !this.resolvedOpenOptions.enableMultiTabs
68
71
  });
72
+ unregisterDatabase(this);
69
73
  }
70
74
  async loadVersion() {
71
75
  if (this.resolvedOpenOptions.ssrMode) {
@@ -1 +1 @@
1
- {"version":3,"file":"PowerSyncDatabase.js","sourceRoot":"","sources":["../../src/db/PowerSyncDatabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAMV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EAGrB,KAAK,EAIL,YAAY,EACb,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,OAAO,EAAE,8BAA8B,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,oCAAoC,EAAE,MAAM,gDAAgD,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,mCAAmC,EAAE,MAAM,+CAA+C,CAAC;AAiCpG;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,qBAAkD;IAC1F,MAAM,CAAC,YAAY,GAAG,IAAI,KAAK,EAAE,CAAC;IAExB,mBAAmB,CAAyB;IAC5C,mBAAmB,CAAU;IAEvC,YAAY,OAAoC;QAC9C,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAErG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAC/C,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,QAAQ,YAAY,cAAc,EAAE,CAAC;YAC5C;;;;eAIG;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,4FAA4F;QAC5F,IAAI,OAAQ,IAAI,CAAC,QAAyB,CAAC,gBAAgB,IAAI,UAAU,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAI,IAAI,CAAC,QAAyB,CAAC,gBAAgB,EAAE,CAAC;YAClE,IAAI,MAAM,CAAC,0BAA0B,EAAE,CAAC;gBACtC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;oBAC/B,mBAAmB,EAAE,IAAI;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAES,4BAA4B;QACpC,OAAO;YACL,yDAAyD;YACzD,YAAY,EAAE,+BAA+B;SAC9C,CAAC;IACJ,CAAC;IAEkB,aAAa;QAC9B,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YAC5C,MAAM,cAAc,GAAG,IAAI,mBAAmB,CAAC;gBAC7C,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YACH,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAA+B;QACnC,OAAO,KAAK,CAAC,KAAK,CAAC;YACjB,2DAA2D;YAC3D,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAe;SAC7E,CAAC,CAAC;IACL,CAAC;IAES,KAAK,CAAC,WAAW;QACzB,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAES,KAAK,CAAC,wBAAwB;QACtC,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,OAAO,KAAK,CAAC,wBAAwB,EAAE,CAAC;IAC1C,CAAC;IAES,KAAK,CAAC,YAAY,CAAI,EAAoB;QAClD,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO,oBAAoB,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,iBAAiB,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAES,gCAAgC,CACxC,SAAoC,EACpC,OAAwC;QAExC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,WAAW,GAA0C;YACzD,GAAI,IAAI,CAAC,OAAc;YACvB,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC;YAC7C,MAAM;SACP,CAAC;QAEF,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO,IAAI,8BAA8B,EAAE,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG;;;WAGb,CAAC;gBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBACnC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3F,CAAC;YAED,IAAI,iBAAiB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvC,OAAO,IAAI,oCAAoC,CAAC;oBAC9C,GAAG,WAAW;oBACd,EAAE,EAAE,IAAI,CAAC,QAAwB,EAAE,iCAAiC;oBACpE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC,IAAI;oBACvD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;iBAC9C,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBACd,KAAK,EAAE,SAAS,CAAC,IAAI;gBACrB,OAAO,EAAE,iFAAiF;aAC3F,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,mCAAmC,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC;;AAEH;;;;;;;;;;;;;GAaG;AACH,yFAAyF;AACzF,MAAM,CAAC,MAAM,iBAAiB,GAA8D,oBAAoB,CAAC"}
1
+ {"version":3,"file":"PowerSyncDatabase.js","sourceRoot":"","sources":["../../src/db/PowerSyncDatabase.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ import { WorkerConnection } from '../../worker/client.js';
11
11
  * via this client provider.
12
12
  */
13
13
  declare class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
14
+ #private;
14
15
  protected options: WebStreamingSyncImplementationOptions;
15
16
  statusChanged: (status: SyncStatusJson) => void;
16
17
  protected webDB: WebDBAdapter;
@@ -3,6 +3,7 @@ import { AbstractSharedSyncClientProvider } from '../../worker/sync/AbstractShar
3
3
  import { SharedSyncClientEvent } from '../../worker/sync/SharedSyncImplementation.js';
4
4
  import { WebStreamingSyncImplementation } from './WebStreamingSyncImplementation.js';
5
5
  import { generateTabCloseSignal } from '../../shared/tab_close_signal.js';
6
+ import { serializeErrorForRelay } from '@powersync/shared-internals';
6
7
  import { connectToExistingWorker, connectToWorker } from '../../worker/client.js';
7
8
  /**
8
9
  * The shared worker will trigger methods on this side of the message port
@@ -22,11 +23,24 @@ class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
22
23
  const { port } = await this.webDB.shareConnection();
23
24
  return Comlink.transfer(port, [port]);
24
25
  }
26
+ async #relay(action) {
27
+ try {
28
+ return await action();
29
+ }
30
+ catch (ex) {
31
+ /**
32
+ * Connector callbacks run in this tab and their rejection crosses the
33
+ * MessagePort to the sync worker, so serialize it here, where the error
34
+ * originates, before Comlink's error transfer can drop custom fields.
35
+ */
36
+ throw serializeErrorForRelay(ex);
37
+ }
38
+ }
25
39
  invalidateCredentials() {
26
40
  this.options.remote.invalidateCredentials();
27
41
  }
28
42
  async fetchCredentials() {
29
- const credentials = await this.options.remote.getCredentials();
43
+ const credentials = await this.#relay(() => this.options.remote.getCredentials());
30
44
  if (credentials == null) {
31
45
  return null;
32
46
  }
@@ -46,10 +60,10 @@ class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
46
60
  * Don't return anything here, just incase something which is not
47
61
  * serializable is returned from the `uploadCrud` function.
48
62
  */
49
- await this.options.uploadCrud();
63
+ await this.#relay(() => this.options.uploadCrud());
50
64
  }
51
65
  async postCheckpointRequest(clientId, requestId) {
52
- return await this.options.postCheckpointRequest(clientId, requestId);
66
+ return await this.#relay(async () => (await this.options.postCheckpointRequest(clientId, requestId)) ?? null);
53
67
  }
54
68
  get logger() {
55
69
  return this.options.logger;
@@ -1 +1 @@
1
- {"version":3,"file":"SharedWebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/SharedWebStreamingSyncImplementation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SharedWebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/SharedWebStreamingSyncImplementation.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,18 @@
1
- import { AbstractStreamingSyncImplementation, AbstractStreamingSyncImplementationOptions, LockOptions } from '@powersync/shared-internals';
1
+ import { AbstractStreamingSyncImplementation, AbstractStreamingSyncImplementationOptions, DiagnosticsEvent, LockOptions } from '@powersync/shared-internals';
2
2
  export interface WebStreamingSyncImplementationOptions extends AbstractStreamingSyncImplementationOptions {
3
3
  sync?: {
4
4
  worker?: string | URL | (() => SharedWorker);
5
5
  };
6
6
  }
7
7
  export declare class WebStreamingSyncImplementation extends AbstractStreamingSyncImplementation {
8
+ private diagnosticsChannel?;
8
9
  constructor(options: WebStreamingSyncImplementationOptions);
10
+ /**
11
+ * Broadcasts a core diagnostics event on a same-origin channel for diagnostics tooling to consume.
12
+ * The channel reaches the page even when sync runs in a shared worker.
13
+ */
14
+ protected emitDiagnostics(event: DiagnosticsEvent): void;
15
+ dispose(): Promise<void>;
9
16
  get webOptions(): WebStreamingSyncImplementationOptions;
10
17
  obtainLock<T>(lockOptions: LockOptions<T>): Promise<T>;
11
18
  }
@@ -2,10 +2,24 @@ import { LogLevels } from '@powersync/common';
2
2
  import { AbstractStreamingSyncImplementation, LockType } from '@powersync/shared-internals';
3
3
  import { getNavigatorLocks } from '../../shared/navigator.js';
4
4
  export class WebStreamingSyncImplementation extends AbstractStreamingSyncImplementation {
5
+ diagnosticsChannel;
5
6
  constructor(options) {
6
7
  // Super will store and provide default values for options
7
8
  super(options);
8
9
  }
10
+ /**
11
+ * Broadcasts a core diagnostics event on a same-origin channel for diagnostics tooling to consume.
12
+ * The channel reaches the page even when sync runs in a shared worker.
13
+ */
14
+ emitDiagnostics(event) {
15
+ this.diagnosticsChannel ??= new BroadcastChannel('powersync-diagnostics-events');
16
+ this.diagnosticsChannel.postMessage(event);
17
+ }
18
+ async dispose() {
19
+ await super.dispose();
20
+ this.diagnosticsChannel?.close();
21
+ this.diagnosticsChannel = undefined;
22
+ }
9
23
  get webOptions() {
10
24
  return this.options;
11
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/WebStreamingSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,mCAAmC,EAGnC,QAAQ,EACT,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAQ9D,MAAM,OAAO,8BAA+B,SAAQ,mCAAmC;IACrF,YAAY,OAA8C;QACxD,0DAA0D;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAgD,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,UAAU,CAAI,WAA2B;QAC7C,MAAM,UAAU,GAAG,kBAAkB,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QACtF,IAAI,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,iBAAiB,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvG,CAAC;CACF"}
1
+ {"version":3,"file":"WebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/WebStreamingSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,mCAAmC,EAInC,QAAQ,EACT,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAQ9D,MAAM,OAAO,8BAA+B,SAAQ,mCAAmC;IAC7E,kBAAkB,CAAoB;IAE9C,YAAY,OAA8C;QACxD,0DAA0D;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAED;;;OAGG;IACgB,eAAe,CAAC,KAAuB;QACxD,IAAI,CAAC,kBAAkB,KAAK,IAAI,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QACjF,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAEQ,KAAK,CAAC,OAAO;QACpB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACtC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAgD,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,UAAU,CAAI,WAA2B;QAC7C,MAAM,UAAU,GAAG,kBAAkB,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QACtF,IAAI,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,iBAAiB,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvG,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Development-tooling entry point (`@powersync/web/devtools`).
3
+ *
4
+ * Kept off the main index so the public API of `@powersync/web` is unchanged; tooling imports this
5
+ * subpath explicitly.
6
+ */
7
+ export { getRegisteredDatabases, observeRegisteredDatabases } from './registry.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Development-tooling entry point (`@powersync/web/devtools`).
3
+ *
4
+ * Kept off the main index so the public API of `@powersync/web` is unchanged; tooling imports this
5
+ * subpath explicitly.
6
+ */
7
+ export { getRegisteredDatabases, observeRegisteredDatabases } from './registry.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { WebPowerSyncDatabase } from '../db/PowerSyncDatabase.js';
2
+ /** @internal Called by the database constructor. */
3
+ export declare function registerDatabase(db: WebPowerSyncDatabase): void;
4
+ /** @internal Called when the database closes. */
5
+ export declare function unregisterDatabase(db: WebPowerSyncDatabase): void;
6
+ /** The databases currently open in this page. */
7
+ export declare function getRegisteredDatabases(): readonly WebPowerSyncDatabase[];
8
+ /**
9
+ * Calls `listener` with the current databases now, and again whenever one is opened or closed.
10
+ * Returns a function that stops listening.
11
+ */
12
+ export declare function observeRegisteredDatabases(listener: (databases: readonly WebPowerSyncDatabase[]) => void): () => void;
@@ -0,0 +1,42 @@
1
+ import { BaseObserver } from '@powersync/common';
2
+ /**
3
+ * Live database instances in this page, for development tooling.
4
+ *
5
+ * Every {@link WebPowerSyncDatabase} registers itself when constructed and leaves when closed, so a
6
+ * tool that runs in the same page (for example the diagnostics Vite plugin's injected agent) can find
7
+ * the app's databases without the app wiring anything up. The set holds only instances that already
8
+ * exist, so it adds nothing to a production bundle beyond the references themselves.
9
+ */
10
+ class DatabaseRegistry extends BaseObserver {
11
+ databases = new Set();
12
+ notify() {
13
+ const snapshot = [...this.databases];
14
+ this.iterateListeners((listener) => listener.databasesChanged?.(snapshot));
15
+ }
16
+ }
17
+ const registry = new DatabaseRegistry();
18
+ /** @internal Called by the database constructor. */
19
+ export function registerDatabase(db) {
20
+ registry.databases.add(db);
21
+ registry.notify();
22
+ }
23
+ /** @internal Called when the database closes. */
24
+ export function unregisterDatabase(db) {
25
+ if (registry.databases.delete(db)) {
26
+ registry.notify();
27
+ }
28
+ }
29
+ /** The databases currently open in this page. */
30
+ export function getRegisteredDatabases() {
31
+ return [...registry.databases];
32
+ }
33
+ /**
34
+ * Calls `listener` with the current databases now, and again whenever one is opened or closed.
35
+ * Returns a function that stops listening.
36
+ */
37
+ export function observeRegisteredDatabases(listener) {
38
+ const stop = registry.registerListener({ databasesChanged: listener });
39
+ listener([...registry.databases]);
40
+ return stop;
41
+ }
42
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/devtools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,mBAAmB,CAAC;AAOpE;;;;;;;GAOG;AACH,MAAM,gBAAiB,SAAQ,YAA8B;IAClD,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAErD,MAAM;QACJ,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,CAAC;CACF;AAED,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAExC,oDAAoD;AACpD,MAAM,UAAU,gBAAgB,CAAC,EAAwB;IACvD,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,kBAAkB,CAAC,EAAwB;IACzD,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,QAAQ,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,sBAAsB;IACpC,OAAO,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAA8D;IACvG,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvE,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -7,6 +7,7 @@ export declare class BroadcastLogger implements PowerSyncLogger {
7
7
  private clients;
8
8
  private readonly inner;
9
9
  private currentLevel;
10
+ private sequence;
10
11
  sendBroadcasts: boolean;
11
12
  constructor(prefix: string, clients: WrappedSyncPort[]);
12
13
  log(record: LogRecord): void;
@@ -19,9 +20,5 @@ export declare class BroadcastLogger implements PowerSyncLogger {
19
20
  * and proceeds to execute for all clients.
20
21
  */
21
22
  protected iterateClients(callback: (client: WrappedSyncPort) => Promise<void>): Promise<void>;
22
- /**
23
- * Guards against any logging errors.
24
- * We don't want a logging exception to cause further issues upstream
25
- */
26
23
  protected sanitizeRecord(record: LogRecord): LogRecord;
27
24
  }
@@ -1,4 +1,5 @@
1
1
  import { LogLevels, createConsoleLogger } from '@powersync/common';
2
+ import { serializeErrorForRelay } from '@powersync/shared-internals';
2
3
  /**
3
4
  * Broadcasts logs to all clients
4
5
  */
@@ -6,6 +7,7 @@ export class BroadcastLogger {
6
7
  clients;
7
8
  inner;
8
9
  currentLevel = LogLevels.info;
10
+ sequence = 0;
9
11
  sendBroadcasts = true;
10
12
  constructor(prefix, clients) {
11
13
  this.clients = clients;
@@ -39,26 +41,23 @@ export class BroadcastLogger {
39
41
  }
40
42
  }
41
43
  }
42
- /**
43
- * Guards against any logging errors.
44
- * We don't want a logging exception to cause further issues upstream
45
- */
46
44
  sanitizeRecord(record) {
47
- if (!record.error) {
45
+ // Preserve explicit undefined rejection reasons.
46
+ if (!('error' in record)) {
48
47
  return record;
49
48
  }
50
- let error;
51
- try {
52
- // Try and clone here first. If it fails it won't be passable over a MessagePort
53
- error = structuredClone(record.error);
54
- }
55
- catch (ex) {
56
- console.error(ex);
57
- error = 'Could not serialize log params. Check shared worker logs for more details.';
58
- }
49
+ const serialized = serializeErrorForRelay(record.error);
59
50
  return {
60
51
  ...record,
61
- error
52
+ error: {
53
+ ...serialized,
54
+ relay: {
55
+ origin: 'shared-sync-worker',
56
+ sequence: this.sequence++,
57
+ errorState: serialized.state,
58
+ relayedAt: new Date().toISOString()
59
+ }
60
+ }
62
61
  };
63
62
  }
64
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BroadcastLogger.js","sourceRoot":"","sources":["../../../src/worker/sync/BroadcastLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAuB,mBAAmB,EAAa,MAAM,mBAAmB,CAAC;AAGpH;;GAEG;AACH,MAAM,OAAO,eAAe;IAQhB;IAPO,KAAK,CAAwC;IACtD,YAAY,GAAW,SAAS,CAAC,IAAI,CAAC;IAE9C,cAAc,GAAG,IAAI,CAAC;IAEtB,YACE,MAAc,EACN,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;QAElC,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,GAAG,CAAC,MAAiB;QACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEvB,IAAI,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,cAAc,CAAC,QAAoD;QACjF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,cAAc,CAAC,MAAiB;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,gFAAgF;YAChF,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,KAAK,GAAG,4EAA4E,CAAC;QACvF,CAAC;QAED,OAAO;YACL,GAAG,MAAM;YACT,KAAK;SACN,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"BroadcastLogger.js","sourceRoot":"","sources":["../../../src/worker/sync/BroadcastLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAuB,mBAAmB,EAAa,MAAM,mBAAmB,CAAC;AACpH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAGrE;;GAEG;AACH,MAAM,OAAO,eAAe;IAUhB;IATO,KAAK,CAAwC;IACtD,YAAY,GAAW,SAAS,CAAC,IAAI,CAAC;IAEtC,QAAQ,GAAG,CAAC,CAAC;IAErB,cAAc,GAAG,IAAI,CAAC;IAEtB,YACE,MAAc,EACN,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;QAElC,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,GAAG,CAAC,MAAiB;QACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEvB,IAAI,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,cAAc,CAAC,QAAoD;QACjF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAES,cAAc,CAAC,MAAiB;QACxC,iDAAiD;QACjD,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxD,OAAO;YACL,GAAG,MAAM;YACT,KAAK,EAAE;gBACL,GAAG,UAAU;gBACb,KAAK,EAAE;oBACL,MAAM,EAAE,oBAAoB;oBAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;oBACzB,UAAU,EAAE,UAAU,CAAC,KAAK;oBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powersync/web",
3
- "version": "2.4.1",
3
+ "version": "2.5.0",
4
4
  "description": "PowerSync Web SDK",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.js",
@@ -23,6 +23,10 @@
23
23
  "react-native": "./dist/index.react_native_web.js",
24
24
  "default": "./lib/index.js"
25
25
  },
26
+ "./devtools": {
27
+ "types": "./lib/devtools/index.d.ts",
28
+ "default": "./lib/devtools/index.js"
29
+ },
26
30
  "./extra/shared-memory-pool": {
27
31
  "types": "./lib/db/adapters/memory-pool/client.d.ts",
28
32
  "default": "./lib/db/adapters/memory-pool/client.js"
@@ -54,15 +58,15 @@
54
58
  "author": "PowerSync",
55
59
  "license": "Apache-2.0",
56
60
  "peerDependencies": {
57
- "@powersync/common": "^2.3.0",
58
- "@powersync/shared-internals": "^1.3.0"
61
+ "@powersync/common": "^2.4.0",
62
+ "@powersync/shared-internals": "^1.4.0"
59
63
  },
60
64
  "dependencies": {
61
- "@journeyapps/wa-sqlite": "2.0.6",
65
+ "@journeyapps/wa-sqlite": "2.0.7",
62
66
  "comlink": "^4.4.2",
63
67
  "commander": "^12.1.0",
64
- "@powersync/common": "2.3.0",
65
- "@powersync/shared-internals": "1.3.0"
68
+ "@powersync/common": "2.4.0",
69
+ "@powersync/shared-internals": "1.4.0"
66
70
  },
67
71
  "devDependencies": {
68
72
  "@types/uuid": "^9.0.6",
@@ -71,7 +75,7 @@
71
75
  "p-defer": "^4.0.1",
72
76
  "source-map-loader": "^5.0.0",
73
77
  "uuid": "^11.1.0",
74
- "vite": "^7.3.1",
78
+ "vite": "^7.3.6",
75
79
  "rollup": "^4.52.5",
76
80
  "@rollup/plugin-node-resolve": "^16.0.3",
77
81
  "@rollup/plugin-terser": "^1.0.0",
@@ -85,6 +89,6 @@
85
89
  "clean": "rm -rf lib dist tsconfig.tsbuildinfo",
86
90
  "watch": "tsc --build -w",
87
91
  "test": "pnpm build && vitest",
88
- "test:exports": "attw --pack . --entrypoints . extra/shared-memory-pool --profile=esm-only "
92
+ "test:exports": "attw --pack . --entrypoints . devtools extra/shared-memory-pool --profile=esm-only "
89
93
  }
90
94
  }
@@ -30,6 +30,7 @@ import { WebStreamingSyncImplementationOptions } from './sync/WebStreamingSyncIm
30
30
  import { AsyncDbAdapter } from './adapters/AsyncWebAdapter.js';
31
31
  import { resolveAndValidateOptions } from './adapters/resolveAndValidateOptions.js';
32
32
  import { TabLocalStreamingSyncImplementation } from './sync/TabLocalStreamingSyncImplementation.js';
33
+ import { registerDatabase, unregisterDatabase } from '../devtools/registry.js';
33
34
 
34
35
  export type WebPowerSyncDatabaseOptions = BasePowerSyncDatabaseOptions &
35
36
  DatabaseSource<WebSQLOpenOptions> &
@@ -77,6 +78,8 @@ export class WebPowerSyncDatabase extends BasePowerSyncDatabase<WebPowerSyncData
77
78
  super(options);
78
79
  this.resolvedOpenOptions = resolvedOpenOptions;
79
80
  this.enableBroadcastLogs = options.broadcastLogs ?? true;
81
+ // Lets development tooling in this page find the live databases.
82
+ registerDatabase(this);
80
83
  }
81
84
 
82
85
  async _initialize(): Promise<void> {
@@ -122,11 +125,12 @@ export class WebPowerSyncDatabase extends BasePowerSyncDatabase<WebPowerSyncData
122
125
  * By default the sync stream client is only disconnected if
123
126
  * multiple tabs are not enabled.
124
127
  */
125
- close(options?: PowerSyncCloseOptions): Promise<void> {
126
- return super.close({
128
+ async close(options?: PowerSyncCloseOptions): Promise<void> {
129
+ await super.close({
127
130
  // Don't disconnect by default if multiple tabs are enabled
128
131
  disconnect: options?.disconnect ?? !this.resolvedOpenOptions.enableMultiTabs
129
132
  });
133
+ unregisterDatabase(this);
130
134
  }
131
135
 
132
136
  protected async loadVersion(): Promise<void> {
@@ -9,7 +9,12 @@ import {
9
9
  WebStreamingSyncImplementationOptions
10
10
  } from './WebStreamingSyncImplementation.js';
11
11
  import { generateTabCloseSignal } from '../../shared/tab_close_signal.js';
12
- import { SubscribedStream, SyncStatusJson, ResolvedSyncOptions } from '@powersync/shared-internals';
12
+ import {
13
+ SubscribedStream,
14
+ SyncStatusJson,
15
+ ResolvedSyncOptions,
16
+ serializeErrorForRelay
17
+ } from '@powersync/shared-internals';
13
18
  import { connectToExistingWorker, connectToWorker, WorkerConnection } from '../../worker/client.js';
14
19
 
15
20
  /**
@@ -30,12 +35,25 @@ class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
30
35
  return Comlink.transfer(port, [port]);
31
36
  }
32
37
 
38
+ async #relay<T>(action: () => Promise<T>): Promise<T> {
39
+ try {
40
+ return await action();
41
+ } catch (ex) {
42
+ /**
43
+ * Connector callbacks run in this tab and their rejection crosses the
44
+ * MessagePort to the sync worker, so serialize it here, where the error
45
+ * originates, before Comlink's error transfer can drop custom fields.
46
+ */
47
+ throw serializeErrorForRelay(ex);
48
+ }
49
+ }
50
+
33
51
  invalidateCredentials() {
34
52
  this.options.remote.invalidateCredentials();
35
53
  }
36
54
 
37
55
  async fetchCredentials(): Promise<PowerSyncCredentials | null> {
38
- const credentials = await this.options.remote.getCredentials();
56
+ const credentials = await this.#relay(() => this.options.remote.getCredentials());
39
57
  if (credentials == null) {
40
58
  return null;
41
59
  }
@@ -56,11 +74,11 @@ class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
56
74
  * Don't return anything here, just incase something which is not
57
75
  * serializable is returned from the `uploadCrud` function.
58
76
  */
59
- await this.options.uploadCrud();
77
+ await this.#relay(() => this.options.uploadCrud());
60
78
  }
61
79
 
62
80
  override async postCheckpointRequest(clientId: string, requestId: string): Promise<string | null> {
63
- return await this.options.postCheckpointRequest(clientId, requestId);
81
+ return await this.#relay(async () => (await this.options.postCheckpointRequest!(clientId, requestId)) ?? null);
64
82
  }
65
83
 
66
84
  get logger() {
@@ -2,6 +2,7 @@ import { LogLevels } from '@powersync/common';
2
2
  import {
3
3
  AbstractStreamingSyncImplementation,
4
4
  AbstractStreamingSyncImplementationOptions,
5
+ DiagnosticsEvent,
5
6
  LockOptions,
6
7
  LockType
7
8
  } from '@powersync/shared-internals';
@@ -14,11 +15,28 @@ export interface WebStreamingSyncImplementationOptions extends AbstractStreaming
14
15
  }
15
16
 
16
17
  export class WebStreamingSyncImplementation extends AbstractStreamingSyncImplementation {
18
+ private diagnosticsChannel?: BroadcastChannel;
19
+
17
20
  constructor(options: WebStreamingSyncImplementationOptions) {
18
21
  // Super will store and provide default values for options
19
22
  super(options);
20
23
  }
21
24
 
25
+ /**
26
+ * Broadcasts a core diagnostics event on a same-origin channel for diagnostics tooling to consume.
27
+ * The channel reaches the page even when sync runs in a shared worker.
28
+ */
29
+ protected override emitDiagnostics(event: DiagnosticsEvent): void {
30
+ this.diagnosticsChannel ??= new BroadcastChannel('powersync-diagnostics-events');
31
+ this.diagnosticsChannel.postMessage(event);
32
+ }
33
+
34
+ override async dispose(): Promise<void> {
35
+ await super.dispose();
36
+ this.diagnosticsChannel?.close();
37
+ this.diagnosticsChannel = undefined;
38
+ }
39
+
22
40
  get webOptions(): WebStreamingSyncImplementationOptions {
23
41
  return this.options as WebStreamingSyncImplementationOptions;
24
42
  }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Development-tooling entry point (`@powersync/web/devtools`).
3
+ *
4
+ * Kept off the main index so the public API of `@powersync/web` is unchanged; tooling imports this
5
+ * subpath explicitly.
6
+ */
7
+ export { getRegisteredDatabases, observeRegisteredDatabases } from './registry.js';
@@ -0,0 +1,53 @@
1
+ import { BaseObserver, type BaseListener } from '@powersync/common';
2
+ import type { WebPowerSyncDatabase } from '../db/PowerSyncDatabase.js';
3
+
4
+ interface RegistryListener extends BaseListener {
5
+ databasesChanged: (databases: readonly WebPowerSyncDatabase[]) => void;
6
+ }
7
+
8
+ /**
9
+ * Live database instances in this page, for development tooling.
10
+ *
11
+ * Every {@link WebPowerSyncDatabase} registers itself when constructed and leaves when closed, so a
12
+ * tool that runs in the same page (for example the diagnostics Vite plugin's injected agent) can find
13
+ * the app's databases without the app wiring anything up. The set holds only instances that already
14
+ * exist, so it adds nothing to a production bundle beyond the references themselves.
15
+ */
16
+ class DatabaseRegistry extends BaseObserver<RegistryListener> {
17
+ readonly databases = new Set<WebPowerSyncDatabase>();
18
+
19
+ notify(): void {
20
+ const snapshot = [...this.databases];
21
+ this.iterateListeners((listener) => listener.databasesChanged?.(snapshot));
22
+ }
23
+ }
24
+
25
+ const registry = new DatabaseRegistry();
26
+
27
+ /** @internal Called by the database constructor. */
28
+ export function registerDatabase(db: WebPowerSyncDatabase): void {
29
+ registry.databases.add(db);
30
+ registry.notify();
31
+ }
32
+
33
+ /** @internal Called when the database closes. */
34
+ export function unregisterDatabase(db: WebPowerSyncDatabase): void {
35
+ if (registry.databases.delete(db)) {
36
+ registry.notify();
37
+ }
38
+ }
39
+
40
+ /** The databases currently open in this page. */
41
+ export function getRegisteredDatabases(): readonly WebPowerSyncDatabase[] {
42
+ return [...registry.databases];
43
+ }
44
+
45
+ /**
46
+ * Calls `listener` with the current databases now, and again whenever one is opened or closed.
47
+ * Returns a function that stops listening.
48
+ */
49
+ export function observeRegisteredDatabases(listener: (databases: readonly WebPowerSyncDatabase[]) => void): () => void {
50
+ const stop = registry.registerListener({ databasesChanged: listener });
51
+ listener([...registry.databases]);
52
+ return stop;
53
+ }