@powersync/web 2.4.2 → 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.
- package/dist/index.react_native_web.js +64 -6
- package/dist/index.react_native_web.js.map +1 -1
- package/dist/worker/{AccessHandlePoolVFS-BPUHfZME.js → AccessHandlePoolVFS-B9CKqcQ3.js} +2 -2
- package/dist/worker/AccessHandlePoolVFS-B9CKqcQ3.js.map +1 -0
- package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -1
- package/dist/worker/IDBBatchAtomicVFS-BfRzbRoV.js +2 -0
- package/dist/worker/IDBBatchAtomicVFS-BfRzbRoV.js.map +1 -0
- package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -1
- package/dist/worker/OPFSCoopSyncVFS-BxXAVpVQ.js +2 -0
- package/dist/worker/OPFSCoopSyncVFS-BxXAVpVQ.js.map +1 -0
- package/dist/worker/OPFSWriteAheadVFS-DuqXaOct.js +2 -0
- package/dist/worker/OPFSWriteAheadVFS-DuqXaOct.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-PubB6u8c.js.map +1 -1
- package/dist/worker/mc-wa-sqlite-async-DJG_ANKO.js.map +1 -1
- package/dist/worker/wa-sqlite-D1_4mGs8.js.map +1 -1
- package/dist/worker/wa-sqlite-async-BxkwNY-2.js.map +1 -1
- package/dist/worker/worker.js +1 -1
- package/dist/worker/worker.js.map +1 -1
- package/lib/db/PowerSyncDatabase.js +6 -2
- package/lib/db/PowerSyncDatabase.js.map +1 -1
- package/lib/db/sync/SharedWebStreamingSyncImplementation.d.ts +1 -0
- package/lib/db/sync/SharedWebStreamingSyncImplementation.js +17 -3
- package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -1
- package/lib/db/sync/WebStreamingSyncImplementation.d.ts +8 -1
- package/lib/db/sync/WebStreamingSyncImplementation.js +14 -0
- package/lib/db/sync/WebStreamingSyncImplementation.js.map +1 -1
- package/lib/devtools/index.d.ts +7 -0
- package/lib/devtools/index.js +8 -0
- package/lib/devtools/index.js.map +1 -0
- package/lib/devtools/registry.d.ts +12 -0
- package/lib/devtools/registry.js +42 -0
- package/lib/devtools/registry.js.map +1 -0
- package/lib/worker/sync/BroadcastLogger.d.ts +1 -4
- package/lib/worker/sync/BroadcastLogger.js +14 -15
- package/lib/worker/sync/BroadcastLogger.js.map +1 -1
- package/package.json +12 -8
- package/src/db/PowerSyncDatabase.ts +6 -2
- package/src/db/sync/SharedWebStreamingSyncImplementation.ts +22 -4
- package/src/db/sync/WebStreamingSyncImplementation.ts +18 -0
- package/src/devtools/index.ts +7 -0
- package/src/devtools/registry.ts +53 -0
- package/src/worker/sync/BroadcastLogger.ts +15 -15
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +0 -1
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js +0 -2
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +0 -1
- package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js +0 -2
- package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +0 -1
- package/dist/worker/OPFSWriteAheadVFS-BW9pqSNn.js +0 -2
- 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
|
-
|
|
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;
|
|
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":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,OAAO,EAA2B,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAG/G,OAAO,EACL,8BAA8B,EAE/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"SharedWebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/SharedWebStreamingSyncImplementation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,OAAO,EAA2B,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAG/G,OAAO,EACL,8BAA8B,EAE/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAIL,sBAAsB,EACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAoB,MAAM,wBAAwB,CAAC;AAEpG;;;GAGG;AACH,MAAM,wBAAyB,SAAQ,gCAAgC;IAEzD;IACH;IACG;IAHZ,YACY,OAA8C,EACjD,aAA+C,EAC5C,KAAmB;QAE7B,KAAK,EAAE,CAAC;QAJE,YAAO,GAAP,OAAO,CAAuC;QACjD,kBAAa,GAAb,aAAa,CAAkC;QAC5C,UAAK,GAAL,KAAK,CAAc;IAG/B,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,MAAwB;QACtC,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ;;;;eAIG;YACH,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAClF,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD;;;;;WAKG;QACH,OAAO;YACL,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,KAAK,EAAE,WAAW,CAAC,KAAK;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd;;;WAGG;QACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACrD,CAAC;IAEQ,KAAK,CAAC,qBAAqB,CAAC,QAAgB,EAAE,SAAiB;QACtE,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAsB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACjH,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,MAAiB;QACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;CACF;AAQD;;GAEG;AACH,MAAM,OAAO,oCAAqC,SAAQ,8BAA8B;IAC5E,WAAW,CAA+B;IAC1C,cAAc,CAA2B;IACzC,MAAM,CAAmB;IAEzB,aAAa,CAAgB;IAC7B,SAAS,CAAe;IAC1B,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,QAAQ,CAAS;IACjB,mBAAmB,CAAU;IAErC,YAAY,OAAoD;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;QAEvD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;QACxC,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,GAAG,uBAAuB,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC;gBAC5B,OAAO,EAAE,MAAM;gBACf,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,UAAW;gBAC/C,MAAM,EAAE,IAAI;gBACZ,YAAY,EAAE,UAAU;gBACxB,eAAe,EAAE,OAAO,CAAC,MAAM;aAChC,CAAC,CAAC;QACL,CAAC;QAED;;WAEG;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,wBAAwB,CAChD,IAAI,CAAC,UAAU,EACf,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YACrB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC,EACD,OAAO,CAAC,EAAE,CACX,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpE;;;;WAIG;QACH,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE1D,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC;QAE5D;;;;;WAKG;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAES,KAAK,CAAC,KAAK;QACnB;;;;;;;;;;;;WAYG;QACH,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3E,2DAA2D;QAC3D,MAAM,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAE5D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAEpC,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAC9B;YACE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE;YAC3C,aAAa,EAAE;gBACb,UAAU;gBACV,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB;aAChD;YACD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,EACD,IAAI,CAAC,OAAO,CAAC,aAAa,CAC3B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE1B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,kEAAkE;YAClE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAuB,CAAC;YAExD,sDAAsD;YACtD,WAAW,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAA+B,CAAC;gBACtD,IAAI,OAAO,EAAE,KAAK,KAAK,qBAAqB,CAAC,SAAS,EAAE,CAAC;oBACvD,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,oFAAoF;YACpF,MAAM,mBAAmB,GAA4B;gBACnD,KAAK,EAAE,qBAAqB,CAAC,YAAY;gBACzC,IAAI,EAAE,EAAE;aACT,CAAC;YACF,WAAW,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAE1B,oBAAoB;QACpB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;IAC9C,CAAC;IAED,mBAAmB,CAAC,aAAiC;QACnD,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -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,
|
|
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
|
-
|
|
45
|
+
// Preserve explicit undefined rejection reasons.
|
|
46
|
+
if (!('error' in record)) {
|
|
48
47
|
return record;
|
|
49
48
|
}
|
|
50
|
-
|
|
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;
|
|
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.
|
|
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.
|
|
58
|
-
"@powersync/shared-internals": "^1.
|
|
61
|
+
"@powersync/common": "^2.4.0",
|
|
62
|
+
"@powersync/shared-internals": "^1.4.0"
|
|
59
63
|
},
|
|
60
64
|
"dependencies": {
|
|
61
|
-
"@journeyapps/wa-sqlite": "2.0.
|
|
65
|
+
"@journeyapps/wa-sqlite": "2.0.7",
|
|
62
66
|
"comlink": "^4.4.2",
|
|
63
67
|
"commander": "^12.1.0",
|
|
64
|
-
"@powersync/common": "2.
|
|
65
|
-
"@powersync/shared-internals": "1.
|
|
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.
|
|
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
|
-
|
|
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 {
|
|
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
|
+
}
|