@powersync/web 1.38.7 → 2.0.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/bin/powersync.cjs +1 -1
- package/dist/index.react_native_web.js +1893 -0
- package/dist/index.react_native_web.js.map +1 -0
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js +2 -0
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +1 -0
- package/dist/worker/FacadeVFS-d1ZDvud7.js +2 -0
- package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -0
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js +2 -0
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +1 -0
- package/dist/worker/MemoryVFS-DVJL5F8j.js +2 -0
- package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -0
- package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js +2 -0
- package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +1 -0
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +2 -0
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-DiBqIVE5.js +2 -0
- package/dist/worker/mc-wa-sqlite-DiBqIVE5.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js +2 -0
- package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js.map +1 -0
- package/dist/worker/wa-sqlite-BlSx7-_P.js +2 -0
- package/dist/worker/wa-sqlite-BlSx7-_P.js.map +1 -0
- package/dist/worker/wa-sqlite-async-BdR24Ucf.js +2 -0
- package/dist/worker/wa-sqlite-async-BdR24Ucf.js.map +1 -0
- package/dist/worker/websockets-Q8W_lerF.js +9 -0
- package/dist/worker/websockets-Q8W_lerF.js.map +1 -0
- package/dist/worker/worker.js +7 -0
- package/dist/worker/worker.js.map +1 -0
- package/lib/attachments/IndexDBFileSystemAdapter.js.map +1 -0
- package/lib/{src/db → db}/NavigatorTriggerClaimManager.d.ts +1 -1
- package/lib/db/NavigatorTriggerClaimManager.js.map +1 -0
- package/lib/db/PowerSyncDatabase.d.ts +67 -0
- package/lib/{src/db → db}/PowerSyncDatabase.js +47 -61
- package/lib/db/PowerSyncDatabase.js.map +1 -0
- package/lib/db/adapters/AsyncWebAdapter.d.ts +32 -0
- package/lib/{src/db → db}/adapters/AsyncWebAdapter.js +14 -14
- package/lib/db/adapters/AsyncWebAdapter.js.map +1 -0
- package/lib/db/adapters/SSRDBAdapter.d.ts +17 -0
- package/lib/db/adapters/SSRDBAdapter.js +37 -0
- package/lib/db/adapters/SSRDBAdapter.js.map +1 -0
- package/lib/{src/db → db}/adapters/WebDBAdapter.d.ts +1 -1
- package/lib/db/adapters/WebDBAdapter.js.map +1 -0
- package/lib/db/adapters/options.d.ts +87 -0
- package/lib/db/adapters/options.js +6 -0
- package/lib/db/adapters/options.js.map +1 -0
- package/lib/db/adapters/resolveAndValidateOptions.d.ts +5 -0
- package/lib/db/adapters/resolveAndValidateOptions.js +33 -0
- package/lib/db/adapters/resolveAndValidateOptions.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.d.ts +3 -4
- package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.js +2 -2
- package/lib/db/adapters/wa-sqlite/ConcurrentConnection.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.d.ts +4 -4
- package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.js +11 -37
- package/lib/db/adapters/wa-sqlite/DatabaseClient.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.d.ts +5 -5
- package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.js +11 -7
- package/lib/db/adapters/wa-sqlite/DatabaseServer.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.d.ts +22 -13
- package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.js +14 -18
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +18 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +131 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -0
- package/lib/db/adapters/wa-sqlite/vfs.d.ts +47 -0
- package/lib/db/adapters/wa-sqlite/vfs.js +95 -0
- package/lib/db/adapters/wa-sqlite/vfs.js.map +1 -0
- package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.d.ts +4 -8
- package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.js +4 -11
- package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
- package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.d.ts +13 -14
- package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.js +31 -66
- package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -0
- package/lib/db/sync/WebRemote.d.ts +10 -0
- package/lib/db/sync/WebRemote.js +33 -0
- package/lib/db/sync/WebRemote.js.map +1 -0
- package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.d.ts +2 -4
- package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.js +3 -2
- package/lib/db/sync/WebStreamingSyncImplementation.js.map +1 -0
- package/lib/db/sync/userAgent.js.map +1 -0
- package/lib/{src/index.d.ts → index.d.ts} +1 -3
- package/lib/{src/index.js → index.js} +1 -3
- package/lib/index.js.map +1 -0
- package/lib/shared/navigator.js.map +1 -0
- package/lib/shared/tab_close_signal.js.map +1 -0
- package/lib/worker/SharedWorkerConnectionRequest.d.ts +5 -0
- package/lib/worker/SharedWorkerConnectionRequest.js +2 -0
- package/lib/worker/SharedWorkerConnectionRequest.js.map +1 -0
- package/lib/worker/client.d.ts +15 -0
- package/lib/worker/client.js +77 -0
- package/lib/worker/client.js.map +1 -0
- package/lib/worker/db/MultiDatabaseServer.d.ts +22 -0
- package/lib/{src/worker → worker}/db/MultiDatabaseServer.js +28 -16
- package/lib/worker/db/MultiDatabaseServer.js.map +1 -0
- package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +13 -0
- package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -0
- package/lib/worker/sync/BroadcastLogger.d.ts +27 -0
- package/lib/worker/sync/BroadcastLogger.js +65 -0
- package/lib/worker/sync/BroadcastLogger.js.map +1 -0
- package/lib/{src/worker → worker}/sync/SharedSyncImplementation.d.ts +11 -15
- package/lib/{src/worker → worker}/sync/SharedSyncImplementation.js +42 -43
- package/lib/worker/sync/SharedSyncImplementation.js.map +1 -0
- package/lib/{src/worker → worker}/sync/WorkerClient.d.ts +3 -3
- package/lib/{src/worker → worker}/sync/WorkerClient.js +2 -2
- package/lib/worker/sync/WorkerClient.js.map +1 -0
- package/lib/worker/worker.js +34 -0
- package/lib/worker/worker.js.map +1 -0
- package/package.json +22 -29
- package/src/db/NavigatorTriggerClaimManager.ts +1 -1
- package/src/db/PowerSyncDatabase.ts +80 -122
- package/src/db/adapters/AsyncWebAdapter.ts +17 -26
- package/src/db/adapters/SSRDBAdapter.ts +14 -64
- package/src/db/adapters/WebDBAdapter.ts +1 -1
- package/src/db/adapters/options.ts +100 -0
- package/src/db/adapters/resolveAndValidateOptions.ts +40 -0
- package/src/db/adapters/wa-sqlite/ConcurrentConnection.ts +4 -5
- package/src/db/adapters/wa-sqlite/DatabaseClient.ts +20 -56
- package/src/db/adapters/wa-sqlite/DatabaseServer.ts +15 -12
- package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +37 -32
- package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +63 -126
- package/src/db/adapters/wa-sqlite/vfs.ts +67 -49
- package/src/db/sync/SSRWebStreamingSyncImplementation.ts +4 -22
- package/src/db/sync/SharedWebStreamingSyncImplementation.ts +38 -77
- package/src/db/sync/WebRemote.ts +23 -26
- package/src/db/sync/WebStreamingSyncImplementation.ts +4 -5
- package/src/index.ts +1 -3
- package/src/worker/SharedWorkerConnectionRequest.ts +6 -0
- package/src/worker/client.ts +100 -0
- package/src/worker/db/MultiDatabaseServer.ts +43 -23
- package/src/worker/sync/AbstractSharedSyncClientProvider.ts +4 -10
- package/src/worker/sync/BroadcastLogger.ts +35 -103
- package/src/worker/sync/SharedSyncImplementation.ts +62 -63
- package/src/worker/sync/WorkerClient.ts +4 -4
- package/src/worker/worker.ts +38 -0
- package/dist/index.umd.js +0 -7613
- package/dist/index.umd.js.map +0 -1
- package/dist/worker/SharedSyncImplementation.umd.js +0 -16139
- package/dist/worker/SharedSyncImplementation.umd.js.map +0 -1
- package/dist/worker/WASQLiteDB.umd.js +0 -17418
- package/dist/worker/WASQLiteDB.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js +0 -31
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js +0 -31
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js +0 -31
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js +0 -31
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js +0 -3562
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js +0 -2478
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js +0 -1681
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js +0 -1820
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js.map +0 -1
- package/lib/package.json +0 -91
- package/lib/src/attachments/IndexDBFileSystemAdapter.js.map +0 -1
- package/lib/src/db/NavigatorTriggerClaimManager.js.map +0 -1
- package/lib/src/db/PowerSyncDatabase.d.ts +0 -78
- package/lib/src/db/PowerSyncDatabase.js.map +0 -1
- package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.d.ts +0 -23
- package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js +0 -27
- package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js.map +0 -1
- package/lib/src/db/adapters/AsyncWebAdapter.d.ts +0 -50
- package/lib/src/db/adapters/AsyncWebAdapter.js.map +0 -1
- package/lib/src/db/adapters/SSRDBAdapter.d.ts +0 -30
- package/lib/src/db/adapters/SSRDBAdapter.js +0 -69
- package/lib/src/db/adapters/SSRDBAdapter.js.map +0 -1
- package/lib/src/db/adapters/WebDBAdapter.js.map +0 -1
- package/lib/src/db/adapters/wa-sqlite/ConcurrentConnection.js.map +0 -1
- package/lib/src/db/adapters/wa-sqlite/DatabaseClient.js.map +0 -1
- package/lib/src/db/adapters/wa-sqlite/DatabaseServer.js.map +0 -1
- package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.js.map +0 -1
- package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +0 -45
- package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +0 -146
- package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +0 -1
- package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.d.ts +0 -15
- package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js +0 -22
- package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js.map +0 -1
- package/lib/src/db/adapters/wa-sqlite/vfs.d.ts +0 -50
- package/lib/src/db/adapters/wa-sqlite/vfs.js +0 -77
- package/lib/src/db/adapters/wa-sqlite/vfs.js.map +0 -1
- package/lib/src/db/adapters/web-sql-flags.d.ts +0 -92
- package/lib/src/db/adapters/web-sql-flags.js +0 -37
- package/lib/src/db/adapters/web-sql-flags.js.map +0 -1
- package/lib/src/db/sync/SSRWebStreamingSyncImplementation.js.map +0 -1
- package/lib/src/db/sync/SharedWebStreamingSyncImplementation.js.map +0 -1
- package/lib/src/db/sync/WebRemote.d.ts +0 -7
- package/lib/src/db/sync/WebRemote.js +0 -33
- package/lib/src/db/sync/WebRemote.js.map +0 -1
- package/lib/src/db/sync/WebStreamingSyncImplementation.js.map +0 -1
- package/lib/src/db/sync/userAgent.js.map +0 -1
- package/lib/src/index.js.map +0 -1
- package/lib/src/shared/navigator.js.map +0 -1
- package/lib/src/shared/tab_close_signal.js.map +0 -1
- package/lib/src/worker/db/MultiDatabaseServer.d.ts +0 -17
- package/lib/src/worker/db/MultiDatabaseServer.js.map +0 -1
- package/lib/src/worker/db/WASQLiteDB.worker.d.ts +0 -4
- package/lib/src/worker/db/WASQLiteDB.worker.js +0 -31
- package/lib/src/worker/db/WASQLiteDB.worker.js.map +0 -1
- package/lib/src/worker/db/open-worker-database.d.ts +0 -14
- package/lib/src/worker/db/open-worker-database.js +0 -53
- package/lib/src/worker/db/open-worker-database.js.map +0 -1
- package/lib/src/worker/sync/AbstractSharedSyncClientProvider.d.ts +0 -19
- package/lib/src/worker/sync/AbstractSharedSyncClientProvider.js.map +0 -1
- package/lib/src/worker/sync/BroadcastLogger.d.ts +0 -47
- package/lib/src/worker/sync/BroadcastLogger.js +0 -129
- package/lib/src/worker/sync/BroadcastLogger.js.map +0 -1
- package/lib/src/worker/sync/SharedSyncImplementation.js.map +0 -1
- package/lib/src/worker/sync/SharedSyncImplementation.worker.js +0 -12
- package/lib/src/worker/sync/SharedSyncImplementation.worker.js.map +0 -1
- package/lib/src/worker/sync/WorkerClient.js.map +0 -1
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts +0 -47
- package/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts +0 -24
- package/src/db/adapters/web-sql-flags.ts +0 -141
- package/src/worker/db/WASQLiteDB.worker.ts +0 -35
- package/src/worker/db/open-worker-database.ts +0 -62
- package/src/worker/sync/SharedSyncImplementation.worker.ts +0 -14
- /package/dist/{8e97452e297be23b5e50.wasm → worker/assets/mc-wa-sqlite-CnHbhWvs.wasm} +0 -0
- /package/dist/{2075a31bb151adbb9767.wasm → worker/assets/mc-wa-sqlite-async-D6idQS2r.wasm} +0 -0
- /package/dist/{3322bc84de986b63c2cd.wasm → worker/assets/wa-sqlite-XZW__iJk.wasm} +0 -0
- /package/dist/{fbc178b70d530e8ce02b.wasm → worker/assets/wa-sqlite-async-rHzzC98y.wasm} +0 -0
- /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.d.ts +0 -0
- /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.js +0 -0
- /package/lib/{src/db → db}/NavigatorTriggerClaimManager.js +0 -0
- /package/lib/{src/db → db}/adapters/WebDBAdapter.js +0 -0
- /package/lib/{src/db → db}/sync/userAgent.d.ts +0 -0
- /package/lib/{src/db → db}/sync/userAgent.js +0 -0
- /package/lib/{src/shared → shared}/navigator.d.ts +0 -0
- /package/lib/{src/shared → shared}/navigator.js +0 -0
- /package/lib/{src/shared → shared}/tab_close_signal.d.ts +0 -0
- /package/lib/{src/shared → shared}/tab_close_signal.js +0 -0
- /package/lib/{src/worker → worker}/sync/AbstractSharedSyncClientProvider.js +0 -0
- /package/lib/{src/worker/sync/SharedSyncImplementation.worker.d.ts → worker/worker.d.ts} +0 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export function connectToWorker({ service, databaseIdentifier, customWorker, shared }) {
|
|
2
|
+
const name = `${shared ? 'shared-' : ''}powersync-${databaseIdentifier}`;
|
|
3
|
+
let worker;
|
|
4
|
+
if (customWorker) {
|
|
5
|
+
worker = shared
|
|
6
|
+
? new SharedWorker(customWorker, {
|
|
7
|
+
/* @vite-ignore */
|
|
8
|
+
name,
|
|
9
|
+
type: 'module'
|
|
10
|
+
})
|
|
11
|
+
: new Worker(customWorker, {
|
|
12
|
+
/* @vite-ignore */
|
|
13
|
+
name,
|
|
14
|
+
type: 'module'
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
worker = spawnDefaultPowerSyncWorker(shared, name);
|
|
19
|
+
}
|
|
20
|
+
return connectToExistingWorker(worker, service);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Opens the default PowerSync worker.
|
|
24
|
+
*
|
|
25
|
+
* When users depend on the web SDK, we assume they use their own bundler (either vite or webpack). Both recognize the
|
|
26
|
+
* syntax of worker constructors with a string literal and will rewrite the URL as part of their bundling processes.
|
|
27
|
+
*
|
|
28
|
+
* React Native / Metro users can't rely on this on the web, as their app is not a JavaScript module and import.meta.url
|
|
29
|
+
* is not rewritten by Metro. For those users, we include a pre-bundled worker they can copy into a static assets
|
|
30
|
+
* directory and load with a custom URI. This also means that defaultWorker cannot work with Metro for React Native Web.
|
|
31
|
+
* We have a custom rollup plugin and conditional exports that replaces this function with a throwing stub for that
|
|
32
|
+
* platform. This allows a helpful error message.
|
|
33
|
+
*/
|
|
34
|
+
// Note: When changing this function, also update disableDefaultWorkers in rollup.config.ts.
|
|
35
|
+
function spawnDefaultPowerSyncWorker(shared, name) {
|
|
36
|
+
return shared
|
|
37
|
+
? new SharedWorker(new URL('./worker.js', import.meta.url), {
|
|
38
|
+
/* @vite-ignore */
|
|
39
|
+
name,
|
|
40
|
+
type: 'module'
|
|
41
|
+
})
|
|
42
|
+
: new Worker(new URL('./worker.js', import.meta.url), {
|
|
43
|
+
/* @vite-ignore */
|
|
44
|
+
name,
|
|
45
|
+
type: 'module'
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function connectToExistingWorker(worker, service) {
|
|
49
|
+
const isShared = isSharedWorker(worker);
|
|
50
|
+
if (isShared) {
|
|
51
|
+
const { port1, port2 } = new MessageChannel();
|
|
52
|
+
const mainPort = worker.port;
|
|
53
|
+
mainPort.start();
|
|
54
|
+
mainPort.postMessage({ port: port1, service }, [port1]);
|
|
55
|
+
port2.start();
|
|
56
|
+
return {
|
|
57
|
+
endpoint: port2,
|
|
58
|
+
worker,
|
|
59
|
+
close() {
|
|
60
|
+
port2.close();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
return {
|
|
66
|
+
endpoint: worker,
|
|
67
|
+
worker,
|
|
68
|
+
close() {
|
|
69
|
+
worker.terminate();
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function isSharedWorker(worker) {
|
|
75
|
+
return 'port' in worker;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,MAAM,EACY;IAClB,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,kBAAkB,EAAE,CAAC;IACzE,IAAI,MAA6B,CAAC;IAElC,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,GAAG,MAAM;YACb,CAAC,CAAC,IAAI,YAAY,CAAC,YAAY,EAAE;gBAC7B,kBAAkB;gBAClB,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC;YACJ,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE;gBACvB,kBAAkB;gBAClB,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;IACT,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,4FAA4F;AAC5F,SAAS,2BAA2B,CAAC,MAAe,EAAE,IAAY;IAChE,OAAO,MAAM;QACX,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACxD,kBAAkB;YAClB,IAAI;YACJ,IAAI,EAAE,QAAQ;SACf,CAAC;QACJ,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAClD,kBAAkB;YAClB,IAAI;YACJ,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;AACT,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAA6B,EAAE,OAAsB;IAC3F,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAI,MAAuB,CAAC,IAAI,CAAC;QAC/C,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAA0C,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhG,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,MAAM;YACN,KAAK;gBACH,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;SACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO;YACL,QAAQ,EAAE,MAAgB;YAC1B,MAAM;YACN,KAAK;gBACH,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA6B;IAC1D,OAAO,MAAM,IAAI,MAAM,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PowerSyncLogger } from '@powersync/common';
|
|
2
|
+
import { ClientConnectionView } from '../../db/adapters/wa-sqlite/DatabaseServer.js';
|
|
3
|
+
import { RawWaSqliteDatabaseOptions } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
|
|
4
|
+
export interface ConnectToMultiDatabaseServerOptions {
|
|
5
|
+
logLevel: number;
|
|
6
|
+
database: RawWaSqliteDatabaseOptions;
|
|
7
|
+
lockName: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Shared state to manage multiple database connections hosted by a worker.
|
|
11
|
+
*/
|
|
12
|
+
export declare class MultiDatabaseServer {
|
|
13
|
+
readonly logger: PowerSyncLogger;
|
|
14
|
+
private activeDatabases;
|
|
15
|
+
constructor(logger: PowerSyncLogger);
|
|
16
|
+
handleConnection({ logLevel, database, lockName }: ConnectToMultiDatabaseServerOptions): Promise<ClientConnectionView>;
|
|
17
|
+
connectToExisting(name: string, lockName: string): Promise<ClientConnectionView>;
|
|
18
|
+
openConnectionLocally(logger: PowerSyncLogger, options: RawWaSqliteDatabaseOptions, lockName?: string): Promise<ClientConnectionView>;
|
|
19
|
+
private databaseOpenAttempt;
|
|
20
|
+
closeAll(): Promise<void[]>;
|
|
21
|
+
}
|
|
22
|
+
export declare const isSharedWorker: boolean;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { LogLevels } from '@powersync/common';
|
|
1
2
|
import * as Comlink from 'comlink';
|
|
2
3
|
import { DatabaseServer } from '../../db/adapters/wa-sqlite/DatabaseServer.js';
|
|
3
4
|
import { getNavigatorLocks } from '../../shared/navigator.js';
|
|
4
5
|
import { RawSqliteConnection } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
|
|
5
6
|
import { ConcurrentSqliteConnection } from '../../db/adapters/wa-sqlite/ConcurrentConnection.js';
|
|
7
|
+
import { WASQLiteVFS } from '../../db/adapters/wa-sqlite/vfs.js';
|
|
6
8
|
const OPEN_DB_LOCK = 'open-wasqlite-db';
|
|
7
9
|
/**
|
|
8
10
|
* Shared state to manage multiple database connections hosted by a worker.
|
|
@@ -13,9 +15,14 @@ export class MultiDatabaseServer {
|
|
|
13
15
|
constructor(logger) {
|
|
14
16
|
this.logger = logger;
|
|
15
17
|
}
|
|
16
|
-
async handleConnection(
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
async handleConnection({ logLevel, database, lockName }) {
|
|
19
|
+
const logger = {
|
|
20
|
+
log: (record) => {
|
|
21
|
+
if (record.level >= logLevel)
|
|
22
|
+
this.logger.log(record);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return Comlink.proxy(await this.openConnectionLocally(logger, database, lockName));
|
|
19
26
|
}
|
|
20
27
|
async connectToExisting(name, lockName) {
|
|
21
28
|
return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
|
|
@@ -26,33 +33,38 @@ export class MultiDatabaseServer {
|
|
|
26
33
|
return Comlink.proxy(await server.connect(lockName));
|
|
27
34
|
});
|
|
28
35
|
}
|
|
29
|
-
async openConnectionLocally(options, lockName) {
|
|
36
|
+
async openConnectionLocally(logger, options, lockName) {
|
|
30
37
|
// Especially on Firefox, we're sometimes seeing "NoModificationAllowedError"s when opening OPFS databases we can
|
|
31
38
|
// work around by retrying.
|
|
32
39
|
const maxAttempts = 3;
|
|
33
40
|
let server;
|
|
34
41
|
for (let count = 0; count < maxAttempts - 1; count++) {
|
|
35
42
|
try {
|
|
36
|
-
server = await this.databaseOpenAttempt(options);
|
|
43
|
+
server = await this.databaseOpenAttempt(logger, options);
|
|
37
44
|
}
|
|
38
|
-
catch (
|
|
39
|
-
this.logger.
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.logger.log({
|
|
47
|
+
level: LogLevels.warn,
|
|
48
|
+
message: `Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`,
|
|
49
|
+
error
|
|
50
|
+
});
|
|
40
51
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
41
52
|
}
|
|
42
53
|
}
|
|
43
54
|
// Final attempt if we haven't been able to open the server - rethrow errors if we still can't open.
|
|
44
|
-
server ??= await this.databaseOpenAttempt(options);
|
|
55
|
+
server ??= await this.databaseOpenAttempt(logger, options);
|
|
45
56
|
return server.connect(lockName);
|
|
46
57
|
}
|
|
47
|
-
async databaseOpenAttempt(options) {
|
|
58
|
+
async databaseOpenAttempt(logger, options) {
|
|
48
59
|
return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
|
|
49
|
-
const {
|
|
50
|
-
let server = this.activeDatabases.get(
|
|
60
|
+
const { filename, readonly, vfs } = options;
|
|
61
|
+
let server = this.activeDatabases.get(filename);
|
|
51
62
|
if (server == null) {
|
|
52
63
|
// We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
|
|
53
64
|
// For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
|
|
54
|
-
// fine).
|
|
55
|
-
|
|
65
|
+
// fine). In-memory databases either run in a shared worker or aren't shared across tabs at all, so the internal
|
|
66
|
+
// lock is enough.
|
|
67
|
+
const needsNavigatorLocks = !(isSharedWorker || readonly || vfs == WASQLiteVFS.InMemoryVfs);
|
|
56
68
|
const connection = new RawSqliteConnection(options);
|
|
57
69
|
const withSafeConcurrency = new ConcurrentSqliteConnection(connection, needsNavigatorLocks);
|
|
58
70
|
// Initializing the RawSqliteConnection will run some pragmas that might write to the database file, so we want
|
|
@@ -68,13 +80,13 @@ export class MultiDatabaseServer {
|
|
|
68
80
|
throw e;
|
|
69
81
|
}
|
|
70
82
|
returnLease();
|
|
71
|
-
const onClose = () => this.activeDatabases.delete(
|
|
83
|
+
const onClose = () => this.activeDatabases.delete(filename);
|
|
72
84
|
server = new DatabaseServer({
|
|
73
85
|
inner: withSafeConcurrency,
|
|
74
|
-
logger
|
|
86
|
+
logger,
|
|
75
87
|
onClose
|
|
76
88
|
});
|
|
77
|
-
this.activeDatabases.set(
|
|
89
|
+
this.activeDatabases.set(filename, server);
|
|
78
90
|
}
|
|
79
91
|
return server;
|
|
80
92
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiDatabaseServer.js","sourceRoot":"","sources":["../../../src/worker/db/MultiDatabaseServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LogRecord, PowerSyncCredentials } from '@powersync/common';
|
|
2
|
+
import { SyncStatusJson } from '@powersync/shared-internals';
|
|
3
|
+
/**
|
|
4
|
+
* The client side port should provide these methods.
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class AbstractSharedSyncClientProvider {
|
|
7
|
+
abstract fetchCredentials(): Promise<PowerSyncCredentials | null>;
|
|
8
|
+
abstract invalidateCredentials(): void;
|
|
9
|
+
abstract uploadCrud(): Promise<void>;
|
|
10
|
+
abstract statusChanged(status: SyncStatusJson): void;
|
|
11
|
+
abstract getDBWorkerPort(): Promise<MessagePort>;
|
|
12
|
+
abstract log(record: LogRecord): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractSharedSyncClientProvider.js","sourceRoot":"","sources":["../../../src/worker/sync/AbstractSharedSyncClientProvider.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAgB,gCAAgC;CAQrD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { PowerSyncLogger, LogRecord } from '@powersync/common';
|
|
2
|
+
import { type WrappedSyncPort } from './SharedSyncImplementation.js';
|
|
3
|
+
/**
|
|
4
|
+
* Broadcasts logs to all clients
|
|
5
|
+
*/
|
|
6
|
+
export declare class BroadcastLogger implements PowerSyncLogger {
|
|
7
|
+
private clients;
|
|
8
|
+
private readonly inner;
|
|
9
|
+
private currentLevel;
|
|
10
|
+
sendBroadcasts: boolean;
|
|
11
|
+
constructor(prefix: string, clients: WrappedSyncPort[]);
|
|
12
|
+
log(record: LogRecord): void;
|
|
13
|
+
/**
|
|
14
|
+
* Set the global log level.
|
|
15
|
+
*/
|
|
16
|
+
setLevel(level: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Iterates all clients, catches individual client exceptions
|
|
19
|
+
* and proceeds to execute for all clients.
|
|
20
|
+
*/
|
|
21
|
+
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
|
+
protected sanitizeRecord(record: LogRecord): LogRecord;
|
|
27
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { LogLevels, createConsoleLogger } from '@powersync/common';
|
|
2
|
+
/**
|
|
3
|
+
* Broadcasts logs to all clients
|
|
4
|
+
*/
|
|
5
|
+
export class BroadcastLogger {
|
|
6
|
+
clients;
|
|
7
|
+
inner;
|
|
8
|
+
currentLevel = LogLevels.info;
|
|
9
|
+
sendBroadcasts = true;
|
|
10
|
+
constructor(prefix, clients) {
|
|
11
|
+
this.clients = clients;
|
|
12
|
+
this.inner = createConsoleLogger({ prefix: prefix });
|
|
13
|
+
}
|
|
14
|
+
log(record) {
|
|
15
|
+
this.inner.log(record);
|
|
16
|
+
if (this.sendBroadcasts && record.level >= this.currentLevel) {
|
|
17
|
+
const sanitized = this.sanitizeRecord(record);
|
|
18
|
+
this.iterateClients((client) => client.clientProvider.log(sanitized));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set the global log level.
|
|
23
|
+
*/
|
|
24
|
+
setLevel(level) {
|
|
25
|
+
this.inner.minLevel = level;
|
|
26
|
+
this.currentLevel = level;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Iterates all clients, catches individual client exceptions
|
|
30
|
+
* and proceeds to execute for all clients.
|
|
31
|
+
*/
|
|
32
|
+
async iterateClients(callback) {
|
|
33
|
+
for (const client of this.clients) {
|
|
34
|
+
try {
|
|
35
|
+
await callback(client);
|
|
36
|
+
}
|
|
37
|
+
catch (ex) {
|
|
38
|
+
console.error('Caught exception when iterating client', ex);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Guards against any logging errors.
|
|
44
|
+
* We don't want a logging exception to cause further issues upstream
|
|
45
|
+
*/
|
|
46
|
+
sanitizeRecord(record) {
|
|
47
|
+
if (!record.error) {
|
|
48
|
+
return record;
|
|
49
|
+
}
|
|
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
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
...record,
|
|
61
|
+
error
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=BroadcastLogger.js.map
|
|
@@ -0,0 +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,8 +1,10 @@
|
|
|
1
|
-
import { BaseObserver,
|
|
1
|
+
import { BaseObserver, DBAdapter, SyncStatus } from '@powersync/common';
|
|
2
|
+
import { ConnectionManager, SubscribedStream, type StreamingSyncImplementation, type StreamingSyncImplementationListener, Mutex, ResolvedSyncOptions } from '@powersync/shared-internals';
|
|
2
3
|
import * as Comlink from 'comlink';
|
|
3
4
|
import { WebStreamingSyncImplementation, WebStreamingSyncImplementationOptions } from '../../db/sync/WebStreamingSyncImplementation.js';
|
|
4
|
-
import { ResolvedWebSQLOpenOptions } from '../../db/adapters/web-sql-flags.js';
|
|
5
5
|
import { AbstractSharedSyncClientProvider } from './AbstractSharedSyncClientProvider.js';
|
|
6
|
+
import { BroadcastLogger } from './BroadcastLogger.js';
|
|
7
|
+
import { ResolvedWebSQLOpenOptions } from '../../db/adapters/options.js';
|
|
6
8
|
/**
|
|
7
9
|
* @internal
|
|
8
10
|
* Manual message events for shared sync clients
|
|
@@ -26,8 +28,9 @@ export type ManualSharedSyncPayload = {
|
|
|
26
28
|
* @internal
|
|
27
29
|
*/
|
|
28
30
|
export type SharedSyncInitOptions = {
|
|
29
|
-
streamOptions: Omit<WebStreamingSyncImplementationOptions, 'adapter' | 'uploadCrud' | 'remote' | 'subscriptions'>;
|
|
31
|
+
streamOptions: Omit<WebStreamingSyncImplementationOptions, 'adapter' | 'uploadCrud' | 'remote' | 'subscriptions' | 'logger'>;
|
|
30
32
|
dbParams: ResolvedWebSQLOpenOptions;
|
|
33
|
+
enableBroadcastLogs: boolean;
|
|
31
34
|
};
|
|
32
35
|
/**
|
|
33
36
|
* @internal
|
|
@@ -64,13 +67,12 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
64
67
|
protected fetchCredentialsController?: RemoteOperationAbortController;
|
|
65
68
|
protected uploadDataController?: RemoteOperationAbortController;
|
|
66
69
|
protected syncParams: SharedSyncInitOptions | null;
|
|
67
|
-
protected
|
|
68
|
-
protected lastConnectOptions: PowerSyncConnectionOptions | undefined;
|
|
70
|
+
protected lastConnectOptions: ResolvedSyncOptions | undefined;
|
|
69
71
|
protected portMutex: Mutex;
|
|
70
72
|
private subscriptions;
|
|
71
73
|
protected connectionManager: ConnectionManager;
|
|
72
|
-
syncStatus
|
|
73
|
-
|
|
74
|
+
private syncStatus?;
|
|
75
|
+
logger: BroadcastLogger;
|
|
74
76
|
protected readonly database: DBAdapter;
|
|
75
77
|
constructor();
|
|
76
78
|
get isConnected(): boolean;
|
|
@@ -83,12 +85,11 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
83
85
|
* This returns a random port which is not closing.
|
|
84
86
|
*/
|
|
85
87
|
protected getRandomWrappedPort(): Promise<WrappedSyncPort | undefined>;
|
|
86
|
-
waitForStatus(status: SyncStatusOptions): Promise<void>;
|
|
87
88
|
waitUntilStatusMatches(predicate: (status: SyncStatus) => boolean): Promise<void>;
|
|
88
89
|
waitForReady(): Promise<void>;
|
|
89
90
|
private collectActiveSubscriptions;
|
|
90
91
|
updateSubscriptions(port: WrappedSyncPort, subscriptions: SubscribedStream[]): void;
|
|
91
|
-
setLogLevel(level:
|
|
92
|
+
setLogLevel(level: number): void;
|
|
92
93
|
/**
|
|
93
94
|
* Configures the DBAdapter connection and a streaming sync client.
|
|
94
95
|
*/
|
|
@@ -100,7 +101,7 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
100
101
|
* The connection will simply be reconnected whenever a new tab
|
|
101
102
|
* connects.
|
|
102
103
|
*/
|
|
103
|
-
connect(options
|
|
104
|
+
connect(options: ResolvedSyncOptions, serializedSchema: any): Promise<void>;
|
|
104
105
|
disconnect(): Promise<void>;
|
|
105
106
|
/**
|
|
106
107
|
* Adds a new client tab's message port to the list of connected ports
|
|
@@ -126,9 +127,4 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
126
127
|
*/
|
|
127
128
|
private openInternalDB;
|
|
128
129
|
private generateReconnectableDatabase;
|
|
129
|
-
/**
|
|
130
|
-
* A method to update the all shared statuses for each
|
|
131
|
-
* client.
|
|
132
|
-
*/
|
|
133
|
-
private updateAllStatuses;
|
|
134
130
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseObserver, DBAdapter, LogLevels, SyncStreamConnectionMethod } from '@powersync/common';
|
|
2
|
+
import { AbortOperation, ConnectionManager, SqliteBucketStorage, Mutex } from '@powersync/shared-internals';
|
|
2
3
|
import * as Comlink from 'comlink';
|
|
3
4
|
import { WebRemote } from '../../db/sync/WebRemote.js';
|
|
4
5
|
import { WebStreamingSyncImplementation } from '../../db/sync/WebStreamingSyncImplementation.js';
|
|
@@ -35,19 +36,17 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
35
36
|
fetchCredentialsController;
|
|
36
37
|
uploadDataController;
|
|
37
38
|
syncParams;
|
|
38
|
-
logger;
|
|
39
39
|
lastConnectOptions;
|
|
40
40
|
portMutex;
|
|
41
41
|
subscriptions = [];
|
|
42
42
|
connectionManager;
|
|
43
43
|
syncStatus;
|
|
44
|
-
|
|
44
|
+
logger;
|
|
45
45
|
database = this.generateReconnectableDatabase();
|
|
46
46
|
constructor() {
|
|
47
47
|
super();
|
|
48
48
|
this.ports = [];
|
|
49
49
|
this.syncParams = null;
|
|
50
|
-
this.logger = createLogger('shared-sync');
|
|
51
50
|
this.lastConnectOptions = undefined;
|
|
52
51
|
this.portMutex = new Mutex();
|
|
53
52
|
this.isInitialized = new Promise((resolve) => {
|
|
@@ -58,15 +57,16 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
58
57
|
}
|
|
59
58
|
});
|
|
60
59
|
});
|
|
61
|
-
this.
|
|
62
|
-
this.broadCastLogger = new BroadcastLogger(this.ports);
|
|
60
|
+
this.logger = new BroadcastLogger('shared-sync', this.ports);
|
|
63
61
|
this.connectionManager = new ConnectionManager({
|
|
64
62
|
createSyncImplementation: async () => {
|
|
65
63
|
await this.waitForReady();
|
|
66
64
|
const sync = this.generateStreamingImplementation();
|
|
67
65
|
const onDispose = sync.registerListener({
|
|
68
|
-
statusChanged: (
|
|
69
|
-
this.
|
|
66
|
+
statusChanged: (snapshot) => {
|
|
67
|
+
this.syncStatus = snapshot;
|
|
68
|
+
const json = snapshot.toJSON();
|
|
69
|
+
this.ports.forEach((p) => p.clientProvider.statusChanged(json));
|
|
70
70
|
}
|
|
71
71
|
});
|
|
72
72
|
return {
|
|
@@ -74,7 +74,8 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
74
74
|
onDispose
|
|
75
75
|
};
|
|
76
76
|
},
|
|
77
|
-
logger: this.logger
|
|
77
|
+
logger: this.logger,
|
|
78
|
+
defaultConnectionMethod: SyncStreamConnectionMethod.HTTP
|
|
78
79
|
});
|
|
79
80
|
}
|
|
80
81
|
get isConnected() {
|
|
@@ -104,11 +105,6 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
104
105
|
return nonClosingPorts[Math.floor(Math.random() * nonClosingPorts.length)];
|
|
105
106
|
});
|
|
106
107
|
}
|
|
107
|
-
async waitForStatus(status) {
|
|
108
|
-
return this.withSyncImplementation(async (sync) => {
|
|
109
|
-
return sync.waitForStatus(status);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
108
|
async waitUntilStatusMatches(predicate) {
|
|
113
109
|
return this.withSyncImplementation(async (sync) => {
|
|
114
110
|
return sync.waitUntilStatusMatches(predicate);
|
|
@@ -118,7 +114,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
118
114
|
return this.isInitialized;
|
|
119
115
|
}
|
|
120
116
|
collectActiveSubscriptions() {
|
|
121
|
-
this.logger.debug
|
|
117
|
+
this.logger.log({ level: LogLevels.debug, message: 'Collecting active stream subscriptions across tabs' });
|
|
122
118
|
const active = new Map();
|
|
123
119
|
for (const port of this.ports) {
|
|
124
120
|
for (const stream of port.currentSubscriptions) {
|
|
@@ -127,7 +123,10 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
127
123
|
}
|
|
128
124
|
}
|
|
129
125
|
this.subscriptions = [...active.values()];
|
|
130
|
-
this.logger.
|
|
126
|
+
this.logger.log({
|
|
127
|
+
level: LogLevels.debug,
|
|
128
|
+
message: `Collected stream subscriptions, ${JSON.stringify(this.subscriptions)}`
|
|
129
|
+
});
|
|
131
130
|
this.connectionManager.syncStreamImplementation?.updateSubscriptions(this.subscriptions);
|
|
132
131
|
}
|
|
133
132
|
updateSubscriptions(port, subscriptions) {
|
|
@@ -136,7 +135,6 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
136
135
|
}
|
|
137
136
|
setLogLevel(level) {
|
|
138
137
|
this.logger.setLevel(level);
|
|
139
|
-
this.broadCastLogger.setLevel(level);
|
|
140
138
|
}
|
|
141
139
|
/**
|
|
142
140
|
* Configures the DBAdapter connection and a streaming sync client.
|
|
@@ -151,14 +149,16 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
151
149
|
}
|
|
152
150
|
// First time setting params
|
|
153
151
|
this.syncParams = params;
|
|
154
|
-
|
|
155
|
-
this.logger = this.broadCastLogger;
|
|
156
|
-
}
|
|
152
|
+
this.logger.sendBroadcasts = params.enableBroadcastLogs;
|
|
157
153
|
// Ensure we have a usable database connection, the reconnectable database will connect lazily on first use.
|
|
158
154
|
await this.database.readLock(async () => { });
|
|
159
155
|
self.onerror = (event) => {
|
|
160
156
|
// Share any uncaught events on the broadcast logger
|
|
161
|
-
this.logger.
|
|
157
|
+
this.logger.log({
|
|
158
|
+
level: LogLevels.error,
|
|
159
|
+
message: 'Uncaught exception in PowerSync shared sync worker',
|
|
160
|
+
error: event
|
|
161
|
+
});
|
|
162
162
|
};
|
|
163
163
|
this.iterateListeners((l) => l.initialized?.());
|
|
164
164
|
}
|
|
@@ -173,9 +173,9 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
173
173
|
* The connection will simply be reconnected whenever a new tab
|
|
174
174
|
* connects.
|
|
175
175
|
*/
|
|
176
|
-
async connect(options) {
|
|
176
|
+
async connect(options, serializedSchema) {
|
|
177
177
|
this.lastConnectOptions = options;
|
|
178
|
-
return this.connectionManager.connect(CONNECTOR_PLACEHOLDER, options ?? {});
|
|
178
|
+
return this.connectionManager.connect(CONNECTOR_PLACEHOLDER, options ?? {}, serializedSchema);
|
|
179
179
|
}
|
|
180
180
|
async disconnect() {
|
|
181
181
|
return this.connectionManager.disconnect();
|
|
@@ -194,7 +194,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
194
194
|
};
|
|
195
195
|
this.ports.push(portProvider);
|
|
196
196
|
// Give the newly connected client the latest status
|
|
197
|
-
const status = this.
|
|
197
|
+
const status = this.syncStatus;
|
|
198
198
|
if (status) {
|
|
199
199
|
portProvider.clientProvider.statusChanged(status.toJSON());
|
|
200
200
|
}
|
|
@@ -214,7 +214,10 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
214
214
|
return await this.portMutex.runExclusive(async () => {
|
|
215
215
|
const index = this.ports.findIndex((p) => p == port);
|
|
216
216
|
if (index < 0) {
|
|
217
|
-
this.logger.
|
|
217
|
+
this.logger.log({
|
|
218
|
+
level: LogLevels.warn,
|
|
219
|
+
message: `Could not remove port ${port} since it is not present in active ports.`
|
|
220
|
+
});
|
|
218
221
|
return () => { };
|
|
219
222
|
}
|
|
220
223
|
const trackedPort = this.ports[index];
|
|
@@ -275,11 +278,14 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
275
278
|
throw new Error('No client port found to invalidate credentials');
|
|
276
279
|
}
|
|
277
280
|
try {
|
|
278
|
-
this.logger.log(
|
|
281
|
+
this.logger.log({
|
|
282
|
+
level: LogLevels.info,
|
|
283
|
+
message: 'calling the last port client provider to invalidate credentials'
|
|
284
|
+
});
|
|
279
285
|
lastPort.clientProvider.invalidateCredentials();
|
|
280
286
|
}
|
|
281
|
-
catch (
|
|
282
|
-
this.logger.error
|
|
287
|
+
catch (error) {
|
|
288
|
+
this.logger.log({ level: LogLevels.error, message: 'error invalidating credentials', error });
|
|
283
289
|
}
|
|
284
290
|
},
|
|
285
291
|
fetchCredentials: async () => {
|
|
@@ -295,7 +301,10 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
295
301
|
};
|
|
296
302
|
abortController.signal.onabort = reject;
|
|
297
303
|
try {
|
|
298
|
-
this.logger.log(
|
|
304
|
+
this.logger.log({
|
|
305
|
+
level: LogLevels.info,
|
|
306
|
+
message: 'calling the last port client provider for credentials'
|
|
307
|
+
});
|
|
299
308
|
resolve(await lastPort.clientProvider.fetchCredentials());
|
|
300
309
|
}
|
|
301
310
|
catch (ex) {
|
|
@@ -404,7 +413,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
404
413
|
});
|
|
405
414
|
clearTimeout(timeout);
|
|
406
415
|
client.closeListeners.push(async () => {
|
|
407
|
-
this.logger.info
|
|
416
|
+
this.logger.log({ level: LogLevels.info, message: 'Aborting open connection because associated tab closed.' });
|
|
408
417
|
handleClosed(db);
|
|
409
418
|
/**
|
|
410
419
|
* Don't await this close operation. It might never resolve if the tab is closed.
|
|
@@ -412,14 +421,14 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
412
421
|
* We then call close. The close operation is configured to fire-and-forget, the main promise will reject immediately.
|
|
413
422
|
*/
|
|
414
423
|
db.markRemoteClosed();
|
|
415
|
-
db.close().catch((
|
|
424
|
+
db.close().catch((error) => this.logger.log({ level: LogLevels.warn, message: 'error closing database connection', error }));
|
|
416
425
|
});
|
|
417
426
|
return db;
|
|
418
427
|
}
|
|
419
428
|
generateReconnectableDatabase() {
|
|
420
429
|
const syncParams = this.syncParams;
|
|
421
430
|
const sharedSync = this;
|
|
422
|
-
class
|
|
431
|
+
return new (class extends DBAdapter {
|
|
423
432
|
connectionState = null;
|
|
424
433
|
get name() {
|
|
425
434
|
return syncParams?.dbParams.dbFilename;
|
|
@@ -476,17 +485,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
476
485
|
async refreshSchema() {
|
|
477
486
|
// Not used by sync client.
|
|
478
487
|
}
|
|
479
|
-
}
|
|
480
|
-
const Adapter = DBAdapterDefaultMixin(ReconnectPool);
|
|
481
|
-
return new Adapter();
|
|
482
|
-
}
|
|
483
|
-
/**
|
|
484
|
-
* A method to update the all shared statuses for each
|
|
485
|
-
* client.
|
|
486
|
-
*/
|
|
487
|
-
updateAllStatuses(status) {
|
|
488
|
-
this.syncStatus = new SyncStatus(status);
|
|
489
|
-
this.ports.forEach((p) => p.clientProvider.statusChanged(status));
|
|
488
|
+
})();
|
|
490
489
|
}
|
|
491
490
|
}
|
|
492
491
|
/**
|