@powersync/web 0.0.0-dev-20260708104358 → 0.0.0-dev-20260917074240
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/README.md +1 -11
- package/bin/powersync.cjs +1 -1
- package/dist/index.react_native_web.js +2095 -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-Rt5CGCZP.js +2 -0
- package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js.map +1 -0
- package/dist/worker/assets/mc-wa-sqlite-BHScYYZw.wasm +0 -0
- package/dist/worker/assets/mc-wa-sqlite-async-DdlQmAUV.wasm +0 -0
- package/dist/worker/assets/wa-sqlite-CIxTmRHQ.wasm +0 -0
- package/dist/worker/assets/wa-sqlite-async-zc68fxQq.wasm +0 -0
- package/dist/worker/mc-wa-sqlite-PubB6u8c.js +2 -0
- package/dist/worker/mc-wa-sqlite-PubB6u8c.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-async-DJG_ANKO.js +2 -0
- package/dist/worker/mc-wa-sqlite-async-DJG_ANKO.js.map +1 -0
- package/dist/worker/wa-sqlite-D1_4mGs8.js +2 -0
- package/dist/worker/wa-sqlite-D1_4mGs8.js.map +1 -0
- package/dist/worker/wa-sqlite-async-BxkwNY-2.js +2 -0
- package/dist/worker/wa-sqlite-async-BxkwNY-2.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 +66 -0
- package/lib/{src/db → db}/PowerSyncDatabase.js +60 -79
- 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 +18 -69
- 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/acquireFromPool.d.ts +7 -0
- package/lib/db/adapters/acquireFromPool.js +60 -0
- package/lib/db/adapters/acquireFromPool.js.map +1 -0
- package/lib/db/adapters/memory-pool/client.d.ts +70 -0
- package/lib/db/adapters/memory-pool/client.js +269 -0
- package/lib/db/adapters/memory-pool/client.js.map +1 -0
- package/lib/db/adapters/memory-pool/shared.d.ts +51 -0
- package/lib/db/adapters/memory-pool/shared.js +16 -0
- package/lib/db/adapters/memory-pool/shared.js.map +1 -0
- package/lib/db/adapters/memory-pool/vfs.d.ts +19 -0
- package/lib/db/adapters/memory-pool/vfs.js +247 -0
- package/lib/db/adapters/memory-pool/vfs.js.map +1 -0
- package/lib/db/adapters/memory-pool/worker.js +45 -0
- package/lib/db/adapters/memory-pool/worker.js.map +1 -0
- package/lib/db/adapters/options.d.ts +94 -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 +13 -0
- package/lib/db/adapters/resolveAndValidateOptions.js +41 -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 +14 -7
- package/lib/db/adapters/wa-sqlite/DatabaseServer.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.d.ts +30 -12
- package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.js +70 -16
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -0
- package/lib/db/adapters/wa-sqlite/StatementCache.d.ts +16 -0
- package/lib/db/adapters/wa-sqlite/StatementCache.js +44 -0
- package/lib/db/adapters/wa-sqlite/StatementCache.js.map +1 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +18 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +140 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/vfs.d.ts +9 -2
- package/lib/{src/db → db}/adapters/wa-sqlite/vfs.js +6 -6
- package/lib/db/adapters/wa-sqlite/vfs.js.map +1 -0
- package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.d.ts +5 -16
- package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.js +7 -23
- package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
- package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.d.ts +15 -15
- package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.js +38 -70
- package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -0
- package/lib/db/sync/TabLocalStreamingSyncImplementation.d.ts +19 -0
- package/lib/db/sync/TabLocalStreamingSyncImplementation.js +70 -0
- package/lib/db/sync/TabLocalStreamingSyncImplementation.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 +17 -0
- package/lib/worker/client.js +90 -0
- package/lib/worker/client.js.map +1 -0
- package/lib/worker/db/MultiDatabaseServer.d.ts +21 -0
- package/lib/{src/worker → worker}/db/MultiDatabaseServer.js +45 -24
- package/lib/worker/db/MultiDatabaseServer.js.map +1 -0
- package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +14 -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 +14 -25
- package/lib/{src/worker → worker}/sync/SharedSyncImplementation.js +140 -107
- package/lib/worker/sync/SharedSyncImplementation.js.map +1 -0
- package/lib/{src/worker → worker}/sync/WorkerClient.d.ts +4 -4
- package/lib/{src/worker → worker}/sync/WorkerClient.js +5 -5
- package/lib/worker/sync/WorkerClient.js.map +1 -0
- package/lib/worker/worker.d.ts +1 -0
- package/lib/worker/worker.js +34 -0
- package/lib/worker/worker.js.map +1 -0
- package/package.json +31 -32
- package/src/db/NavigatorTriggerClaimManager.ts +1 -1
- package/src/db/PowerSyncDatabase.ts +96 -144
- package/src/db/adapters/AsyncWebAdapter.ts +29 -86
- package/src/db/adapters/SSRDBAdapter.ts +14 -64
- package/src/db/adapters/WebDBAdapter.ts +1 -1
- package/src/db/adapters/acquireFromPool.ts +73 -0
- package/src/db/adapters/memory-pool/client.ts +367 -0
- package/src/db/adapters/memory-pool/shared.ts +79 -0
- package/src/db/adapters/memory-pool/vfs.ts +293 -0
- package/src/db/adapters/memory-pool/worker.ts +53 -0
- package/src/db/adapters/options.ts +108 -0
- package/src/db/adapters/resolveAndValidateOptions.ts +49 -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 +18 -12
- package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +108 -30
- package/src/db/adapters/wa-sqlite/StatementCache.ts +50 -0
- package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +82 -125
- package/src/db/adapters/wa-sqlite/vfs.ts +13 -8
- package/src/db/sync/SSRWebStreamingSyncImplementation.ts +8 -36
- package/src/db/sync/SharedWebStreamingSyncImplementation.ts +47 -82
- package/src/db/sync/TabLocalStreamingSyncImplementation.ts +90 -0
- 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 +121 -0
- package/src/worker/db/MultiDatabaseServer.ts +59 -33
- package/src/worker/sync/AbstractSharedSyncClientProvider.ts +5 -10
- package/src/worker/sync/BroadcastLogger.ts +35 -103
- package/src/worker/sync/SharedSyncImplementation.ts +197 -138
- package/src/worker/sync/WorkerClient.ts +8 -8
- package/src/worker/worker.ts +38 -0
- package/dist/2075a31bb151adbb9767.wasm +0 -0
- package/dist/3322bc84de986b63c2cd.wasm +0 -0
- package/dist/8e97452e297be23b5e50.wasm +0 -0
- package/dist/fbc178b70d530e8ce02b.wasm +0 -0
- package/dist/index.umd.js +0 -7821
- 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 -17434
- 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-833585.umd.js +0 -1400
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-833585.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.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/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/worker/sync/SharedSyncImplementation.worker.d.ts → db/adapters/memory-pool/worker.d.ts} +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
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseObserver, DBAdapter, LogLevels, SyncStreamConnectionMethod } from '@powersync/common';
|
|
2
|
+
import { AbortOperation, ConnectionManager, SqliteBucketStorage, Mutex, SyncStatusSnapshot } 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';
|
|
@@ -24,6 +25,10 @@ export var SharedSyncClientEvent;
|
|
|
24
25
|
* We provide this unused placeholder when connecting with the ConnectionManager.
|
|
25
26
|
*/
|
|
26
27
|
const CONNECTOR_PLACEHOLDER = {};
|
|
28
|
+
/**
|
|
29
|
+
* How long to wait for a client tab to answer a call before giving up on it.
|
|
30
|
+
*/
|
|
31
|
+
const CONNECTOR_CALL_TIMEOUT_MS = 30_000;
|
|
27
32
|
/**
|
|
28
33
|
* @internal
|
|
29
34
|
* Shared sync implementation which runs inside a shared webworker
|
|
@@ -32,22 +37,19 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
32
37
|
ports;
|
|
33
38
|
isInitialized;
|
|
34
39
|
statusListener;
|
|
35
|
-
fetchCredentialsController;
|
|
36
|
-
uploadDataController;
|
|
37
40
|
syncParams;
|
|
38
|
-
logger;
|
|
39
41
|
lastConnectOptions;
|
|
40
42
|
portMutex;
|
|
41
43
|
subscriptions = [];
|
|
42
44
|
connectionManager;
|
|
43
45
|
syncStatus;
|
|
44
|
-
|
|
46
|
+
logger;
|
|
45
47
|
database = this.generateReconnectableDatabase();
|
|
48
|
+
sharedCloseSignal = generateTabCloseSignal();
|
|
46
49
|
constructor() {
|
|
47
50
|
super();
|
|
48
51
|
this.ports = [];
|
|
49
52
|
this.syncParams = null;
|
|
50
|
-
this.logger = createLogger('shared-sync');
|
|
51
53
|
this.lastConnectOptions = undefined;
|
|
52
54
|
this.portMutex = new Mutex();
|
|
53
55
|
this.isInitialized = new Promise((resolve) => {
|
|
@@ -58,23 +60,33 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
58
60
|
}
|
|
59
61
|
});
|
|
60
62
|
});
|
|
61
|
-
this.
|
|
62
|
-
this.broadCastLogger = new BroadcastLogger(this.ports);
|
|
63
|
+
this.logger = new BroadcastLogger('shared-sync', this.ports);
|
|
63
64
|
this.connectionManager = new ConnectionManager({
|
|
64
65
|
createSyncImplementation: async () => {
|
|
65
66
|
await this.waitForReady();
|
|
66
67
|
const sync = this.generateStreamingImplementation();
|
|
67
|
-
const
|
|
68
|
-
statusChanged: (
|
|
69
|
-
this.
|
|
68
|
+
const removeStatusListener = sync.registerListener({
|
|
69
|
+
statusChanged: (snapshot) => {
|
|
70
|
+
this.syncStatus = snapshot;
|
|
71
|
+
const json = snapshot.toJSON();
|
|
72
|
+
this.ports.forEach((p) => p.clientProvider.statusChanged(json));
|
|
70
73
|
}
|
|
71
74
|
});
|
|
72
75
|
return {
|
|
73
76
|
sync,
|
|
74
|
-
onDispose
|
|
77
|
+
onDispose: () => {
|
|
78
|
+
removeStatusListener();
|
|
79
|
+
// Drop the JavaScript state along with the implementation that produced it: it describes in-flight work of
|
|
80
|
+
// a sync client that no longer exists. `addPort` hands this status to every tab that connects afterwards,
|
|
81
|
+
// so a `downloadError` left here is shown by tabs that never saw the failure, and nothing can clear it
|
|
82
|
+
// because only a completed sync does. The core status is kept - `hasSynced` and `lastSyncedAt` are
|
|
83
|
+
// persisted facts that remain true while disconnected.
|
|
84
|
+
this.syncStatus &&= new SyncStatusSnapshot(this.syncStatus.core, {});
|
|
85
|
+
}
|
|
75
86
|
};
|
|
76
87
|
},
|
|
77
|
-
logger: this.logger
|
|
88
|
+
logger: this.logger,
|
|
89
|
+
defaultConnectionMethod: SyncStreamConnectionMethod.HTTP
|
|
78
90
|
});
|
|
79
91
|
}
|
|
80
92
|
get isConnected() {
|
|
@@ -104,11 +116,6 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
104
116
|
return nonClosingPorts[Math.floor(Math.random() * nonClosingPorts.length)];
|
|
105
117
|
});
|
|
106
118
|
}
|
|
107
|
-
async waitForStatus(status) {
|
|
108
|
-
return this.withSyncImplementation(async (sync) => {
|
|
109
|
-
return sync.waitForStatus(status);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
119
|
async waitUntilStatusMatches(predicate) {
|
|
113
120
|
return this.withSyncImplementation(async (sync) => {
|
|
114
121
|
return sync.waitUntilStatusMatches(predicate);
|
|
@@ -118,7 +125,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
118
125
|
return this.isInitialized;
|
|
119
126
|
}
|
|
120
127
|
collectActiveSubscriptions() {
|
|
121
|
-
this.logger.debug
|
|
128
|
+
this.logger.log({ level: LogLevels.debug, message: 'Collecting active stream subscriptions across tabs' });
|
|
122
129
|
const active = new Map();
|
|
123
130
|
for (const port of this.ports) {
|
|
124
131
|
for (const stream of port.currentSubscriptions) {
|
|
@@ -127,7 +134,10 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
127
134
|
}
|
|
128
135
|
}
|
|
129
136
|
this.subscriptions = [...active.values()];
|
|
130
|
-
this.logger.
|
|
137
|
+
this.logger.log({
|
|
138
|
+
level: LogLevels.debug,
|
|
139
|
+
message: `Collected stream subscriptions, ${JSON.stringify(this.subscriptions)}`
|
|
140
|
+
});
|
|
131
141
|
this.connectionManager.syncStreamImplementation?.updateSubscriptions(this.subscriptions);
|
|
132
142
|
}
|
|
133
143
|
updateSubscriptions(port, subscriptions) {
|
|
@@ -136,7 +146,6 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
136
146
|
}
|
|
137
147
|
setLogLevel(level) {
|
|
138
148
|
this.logger.setLevel(level);
|
|
139
|
-
this.broadCastLogger.setLevel(level);
|
|
140
149
|
}
|
|
141
150
|
/**
|
|
142
151
|
* Configures the DBAdapter connection and a streaming sync client.
|
|
@@ -151,14 +160,16 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
151
160
|
}
|
|
152
161
|
// First time setting params
|
|
153
162
|
this.syncParams = params;
|
|
154
|
-
|
|
155
|
-
this.logger = this.broadCastLogger;
|
|
156
|
-
}
|
|
163
|
+
this.logger.sendBroadcasts = params.enableBroadcastLogs;
|
|
157
164
|
// Ensure we have a usable database connection, the reconnectable database will connect lazily on first use.
|
|
158
165
|
await this.database.readLock(async () => { });
|
|
159
166
|
self.onerror = (event) => {
|
|
160
167
|
// Share any uncaught events on the broadcast logger
|
|
161
|
-
this.logger.
|
|
168
|
+
this.logger.log({
|
|
169
|
+
level: LogLevels.error,
|
|
170
|
+
message: 'Uncaught exception in PowerSync shared sync worker',
|
|
171
|
+
error: event
|
|
172
|
+
});
|
|
162
173
|
};
|
|
163
174
|
this.iterateListeners((l) => l.initialized?.());
|
|
164
175
|
}
|
|
@@ -173,9 +184,9 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
173
184
|
* The connection will simply be reconnected whenever a new tab
|
|
174
185
|
* connects.
|
|
175
186
|
*/
|
|
176
|
-
async connect(options) {
|
|
187
|
+
async connect(options, serializedSchema) {
|
|
177
188
|
this.lastConnectOptions = options;
|
|
178
|
-
return this.connectionManager.connect(CONNECTOR_PLACEHOLDER, options ?? {});
|
|
189
|
+
return this.connectionManager.connect(CONNECTOR_PLACEHOLDER, options ?? {}, serializedSchema);
|
|
179
190
|
}
|
|
180
191
|
async disconnect() {
|
|
181
192
|
return this.connectionManager.disconnect();
|
|
@@ -194,7 +205,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
194
205
|
};
|
|
195
206
|
this.ports.push(portProvider);
|
|
196
207
|
// Give the newly connected client the latest status
|
|
197
|
-
const status = this.
|
|
208
|
+
const status = this.syncStatus;
|
|
198
209
|
if (status) {
|
|
199
210
|
portProvider.clientProvider.statusChanged(status.toJSON());
|
|
200
211
|
}
|
|
@@ -214,21 +225,15 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
214
225
|
return await this.portMutex.runExclusive(async () => {
|
|
215
226
|
const index = this.ports.findIndex((p) => p == port);
|
|
216
227
|
if (index < 0) {
|
|
217
|
-
this.logger.
|
|
228
|
+
this.logger.log({
|
|
229
|
+
level: LogLevels.warn,
|
|
230
|
+
message: `Could not remove port ${port} since it is not present in active ports.`
|
|
231
|
+
});
|
|
218
232
|
return () => { };
|
|
219
233
|
}
|
|
220
234
|
const trackedPort = this.ports[index];
|
|
221
235
|
// Remove from the list of active ports
|
|
222
236
|
this.ports.splice(index, 1);
|
|
223
|
-
/**
|
|
224
|
-
* The port might currently be in use. Any active functions might
|
|
225
|
-
* not resolve. Abort them here.
|
|
226
|
-
*/
|
|
227
|
-
[this.fetchCredentialsController, this.uploadDataController].forEach((abortController) => {
|
|
228
|
-
if (abortController?.activePort == port) {
|
|
229
|
-
abortController.controller.abort(new AbortOperation('Closing pending requests after client port is removed'));
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
237
|
// Close the worker wrapped database connection, we can't accurately rely on this connection
|
|
233
238
|
for (const closeListener of trackedPort.closeListeners) {
|
|
234
239
|
await closeListener();
|
|
@@ -242,10 +247,8 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
242
247
|
sync.triggerCrudUpload();
|
|
243
248
|
});
|
|
244
249
|
}
|
|
245
|
-
|
|
246
|
-
return this.withSyncImplementation(
|
|
247
|
-
return sync.getWriteCheckpoint();
|
|
248
|
-
});
|
|
250
|
+
requestCheckpoint() {
|
|
251
|
+
return this.withSyncImplementation((sync) => sync.requestCheckpoint());
|
|
249
252
|
}
|
|
250
253
|
async withSyncImplementation(callback) {
|
|
251
254
|
await this.waitForReady();
|
|
@@ -275,68 +278,106 @@ 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
|
-
fetchCredentials:
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
};
|
|
296
|
-
abortController.signal.onabort = reject;
|
|
297
|
-
try {
|
|
298
|
-
this.logger.log('calling the last port client provider for credentials');
|
|
299
|
-
resolve(await lastPort.clientProvider.fetchCredentials());
|
|
300
|
-
}
|
|
301
|
-
catch (ex) {
|
|
302
|
-
reject(ex);
|
|
303
|
-
}
|
|
304
|
-
finally {
|
|
305
|
-
this.fetchCredentialsController = undefined;
|
|
306
|
-
}
|
|
307
|
-
});
|
|
291
|
+
fetchCredentials: () => {
|
|
292
|
+
return this.#useConnector((port) => {
|
|
293
|
+
this.logger.log({
|
|
294
|
+
level: LogLevels.info,
|
|
295
|
+
message: 'calling the last port client provider for credentials'
|
|
296
|
+
});
|
|
297
|
+
return port.clientProvider.fetchCredentials();
|
|
298
|
+
}, 'fetchCredentials',
|
|
299
|
+
// No sync abort signal reaches the remote, so this relies on the timeout alone.
|
|
300
|
+
{ timeoutMs: CONNECTOR_CALL_TIMEOUT_MS });
|
|
308
301
|
}
|
|
309
302
|
}, this.logger),
|
|
310
|
-
uploadCrud:
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const abortController = new AbortController();
|
|
317
|
-
this.uploadDataController = {
|
|
318
|
-
controller: abortController,
|
|
319
|
-
activePort: lastPort
|
|
320
|
-
};
|
|
321
|
-
// Resolving will make it retry
|
|
322
|
-
abortController.signal.onabort = () => resolve();
|
|
323
|
-
try {
|
|
324
|
-
resolve(await lastPort.clientProvider.uploadCrud());
|
|
325
|
-
}
|
|
326
|
-
catch (ex) {
|
|
327
|
-
reject(ex);
|
|
328
|
-
}
|
|
329
|
-
finally {
|
|
330
|
-
this.uploadDataController = undefined;
|
|
331
|
-
}
|
|
303
|
+
uploadCrud: (signal) => {
|
|
304
|
+
return this.#useConnector((port) => port.clientProvider.uploadCrud(), 'uploadCrud', {
|
|
305
|
+
signal,
|
|
306
|
+
// Uploads are user-defined and legitimately unbounded (large batches over slow connections), so a timeout
|
|
307
|
+
// would cut valid work short. Disconnecting aborts the signal, which is what releases this.
|
|
308
|
+
timeoutMs: null
|
|
332
309
|
});
|
|
333
310
|
},
|
|
311
|
+
postCheckpointRequest: (clientId, requestId, signal) => {
|
|
312
|
+
return this.#useConnector((port) => port.clientProvider.postCheckpointRequest(clientId, requestId), 'postCheckpointRequest', { signal, timeoutMs: CONNECTOR_CALL_TIMEOUT_MS });
|
|
313
|
+
},
|
|
334
314
|
...syncParams.streamOptions,
|
|
335
315
|
subscriptions: this.subscriptions,
|
|
336
316
|
// Logger cannot be transferred just yet
|
|
337
317
|
logger: this.logger
|
|
338
318
|
});
|
|
339
319
|
}
|
|
320
|
+
/**
|
|
321
|
+
* Calls into a client tab.
|
|
322
|
+
*
|
|
323
|
+
* A tab can stop servicing its message port without ever closing it: it may be frozen or in the back/forward cache,
|
|
324
|
+
* or its sync implementation may have been abandoned without being disposed. Comlink has no timeout of its own, so a
|
|
325
|
+
* call to such a port settles neither way, and the `closeListeners` below only fire for ports we know have closed.
|
|
326
|
+
*
|
|
327
|
+
* That is not a local problem. `disconnect()` awaits the sync loops, so a single call that can never settle wedges
|
|
328
|
+
* the disconnect, and with it every `connect()` queued behind it. Every call is therefore bounded by the caller's
|
|
329
|
+
* abort signal, a timeout, or both.
|
|
330
|
+
*/
|
|
331
|
+
async #useConnector(inner, debugContext, options = {}) {
|
|
332
|
+
const { signal, timeoutMs = CONNECTOR_CALL_TIMEOUT_MS } = options;
|
|
333
|
+
const controller = new AbortController();
|
|
334
|
+
const abortWith = (reason) => {
|
|
335
|
+
if (controller.signal.aborted) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
this.logger.log({ level: LogLevels.warn, message: `Aborting ${debugContext}: ${reason}` });
|
|
339
|
+
controller.abort(new AbortOperation(`Aborted ${debugContext}: ${reason}`));
|
|
340
|
+
};
|
|
341
|
+
const timeout = timeoutMs == null
|
|
342
|
+
? undefined
|
|
343
|
+
: setTimeout(() => abortWith(`the client tab did not respond within ${timeoutMs}ms`), timeoutMs);
|
|
344
|
+
const onRequestedAbort = () => abortWith('the sync client disconnected');
|
|
345
|
+
signal?.addEventListener('abort', onRequestedAbort, { once: true });
|
|
346
|
+
if (signal?.aborted) {
|
|
347
|
+
onRequestedAbort();
|
|
348
|
+
}
|
|
349
|
+
try {
|
|
350
|
+
return await withAbort({
|
|
351
|
+
signal: controller.signal,
|
|
352
|
+
// Resolving the port takes the portMutex, which is held while other ports are being removed, so it has to be
|
|
353
|
+
// inside the guard as well.
|
|
354
|
+
action: async () => {
|
|
355
|
+
const lastPort = await this.getLastWrappedPort();
|
|
356
|
+
if (!lastPort) {
|
|
357
|
+
throw new Error(`No client port found for ${debugContext}`);
|
|
358
|
+
}
|
|
359
|
+
return await new Promise((resolve, reject) => {
|
|
360
|
+
const portClosed = () => {
|
|
361
|
+
reject(new Error(`Tab closed while handling ${debugContext}`));
|
|
362
|
+
};
|
|
363
|
+
lastPort.closeListeners.push(portClosed);
|
|
364
|
+
inner(lastPort)
|
|
365
|
+
.then(resolve, reject)
|
|
366
|
+
.finally(() => {
|
|
367
|
+
const index = lastPort.closeListeners.indexOf(portClosed);
|
|
368
|
+
if (index >= 0) {
|
|
369
|
+
lastPort.closeListeners.splice(index, 1);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
finally {
|
|
377
|
+
clearTimeout(timeout);
|
|
378
|
+
signal?.removeEventListener('abort', onRequestedAbort);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
340
381
|
/**
|
|
341
382
|
* Requests a random client to share its database connection with us.
|
|
342
383
|
*/
|
|
@@ -376,7 +417,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
376
417
|
});
|
|
377
418
|
const remote = Comlink.wrap(workerPort);
|
|
378
419
|
const identifier = this.syncParams.dbParams.dbFilename;
|
|
379
|
-
const clientLockName = await
|
|
420
|
+
const clientLockName = await this.sharedCloseSignal;
|
|
380
421
|
/**
|
|
381
422
|
* The open could fail if the tab is closed while we're busy opening the database.
|
|
382
423
|
* This operation is typically executed inside an exclusive portMutex lock.
|
|
@@ -404,7 +445,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
404
445
|
});
|
|
405
446
|
clearTimeout(timeout);
|
|
406
447
|
client.closeListeners.push(async () => {
|
|
407
|
-
this.logger.info
|
|
448
|
+
this.logger.log({ level: LogLevels.info, message: 'Aborting open connection because associated tab closed.' });
|
|
408
449
|
handleClosed(db);
|
|
409
450
|
/**
|
|
410
451
|
* Don't await this close operation. It might never resolve if the tab is closed.
|
|
@@ -412,14 +453,14 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
412
453
|
* We then call close. The close operation is configured to fire-and-forget, the main promise will reject immediately.
|
|
413
454
|
*/
|
|
414
455
|
db.markRemoteClosed();
|
|
415
|
-
db.close().catch((
|
|
456
|
+
db.close().catch((error) => this.logger.log({ level: LogLevels.warn, message: 'error closing database connection', error }));
|
|
416
457
|
});
|
|
417
458
|
return db;
|
|
418
459
|
}
|
|
419
460
|
generateReconnectableDatabase() {
|
|
420
461
|
const syncParams = this.syncParams;
|
|
421
462
|
const sharedSync = this;
|
|
422
|
-
class
|
|
463
|
+
return new (class extends DBAdapter {
|
|
423
464
|
connectionState = null;
|
|
424
465
|
get name() {
|
|
425
466
|
return syncParams?.dbParams.dbFilename;
|
|
@@ -476,17 +517,7 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
476
517
|
async refreshSchema() {
|
|
477
518
|
// Not used by sync client.
|
|
478
519
|
}
|
|
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));
|
|
520
|
+
})();
|
|
490
521
|
}
|
|
491
522
|
}
|
|
492
523
|
/**
|
|
@@ -494,14 +525,16 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
494
525
|
*/
|
|
495
526
|
function withAbort(options) {
|
|
496
527
|
const { action, signal, cleanupOnAbort } = options;
|
|
528
|
+
// Callers that abort with an `Error` reason get it propagated, so the failure says what actually went wrong.
|
|
529
|
+
const abortError = () => signal.reason instanceof Error ? signal.reason : new AbortOperation('Operation aborted by abort controller');
|
|
497
530
|
return new Promise((resolve, reject) => {
|
|
498
531
|
if (signal.aborted) {
|
|
499
|
-
reject(
|
|
532
|
+
reject(abortError());
|
|
500
533
|
return;
|
|
501
534
|
}
|
|
502
535
|
function handleAbort() {
|
|
503
536
|
signal.removeEventListener('abort', handleAbort);
|
|
504
|
-
reject(
|
|
537
|
+
reject(abortError());
|
|
505
538
|
}
|
|
506
539
|
signal.addEventListener('abort', handleAbort, { once: true });
|
|
507
540
|
function completePromise(action) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedSyncImplementation.js","sourceRoot":"","sources":["../../../src/worker/sync/SharedSyncImplementation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ILogLevel, PowerSyncConnectionOptions, SubscribedStream } from '@powersync/common';
|
|
2
1
|
import { SharedSyncImplementation, SharedSyncInitOptions, WrappedSyncPort } from './SharedSyncImplementation.js';
|
|
2
|
+
import { SubscribedStream, ResolvedSyncOptions } from '@powersync/shared-internals';
|
|
3
3
|
/**
|
|
4
4
|
* A client to the shared sync worker.
|
|
5
5
|
*
|
|
@@ -20,11 +20,11 @@ export declare class WorkerClient {
|
|
|
20
20
|
* it can consider the connection to be closed.
|
|
21
21
|
*/
|
|
22
22
|
addLockBasedCloseSignal(name: string): Promise<void>;
|
|
23
|
-
setLogLevel(level:
|
|
23
|
+
setLogLevel(level: number): void;
|
|
24
24
|
triggerCrudUpload(): void;
|
|
25
25
|
setParams(params: SharedSyncInitOptions, subscriptions: SubscribedStream[]): Promise<void>;
|
|
26
|
-
|
|
27
|
-
connect(options?: PowerSyncConnectionOptions): Promise<void>;
|
|
26
|
+
connect(options: ResolvedSyncOptions, schema: any): Promise<void>;
|
|
28
27
|
updateSubscriptions(subscriptions: SubscribedStream[]): void;
|
|
28
|
+
requestCheckpoint(): Promise<bigint>;
|
|
29
29
|
disconnect(): Promise<void>;
|
|
30
30
|
}
|
|
@@ -64,17 +64,17 @@ export class WorkerClient {
|
|
|
64
64
|
this.resolvedPort.currentSubscriptions = subscriptions;
|
|
65
65
|
return this.sync.setParams(params);
|
|
66
66
|
}
|
|
67
|
-
|
|
68
|
-
return this.sync.
|
|
69
|
-
}
|
|
70
|
-
connect(options) {
|
|
71
|
-
return this.sync.connect(options);
|
|
67
|
+
connect(options, schema) {
|
|
68
|
+
return this.sync.connect(options, schema);
|
|
72
69
|
}
|
|
73
70
|
updateSubscriptions(subscriptions) {
|
|
74
71
|
if (this.resolvedPort) {
|
|
75
72
|
this.sync.updateSubscriptions(this.resolvedPort, subscriptions);
|
|
76
73
|
}
|
|
77
74
|
}
|
|
75
|
+
requestCheckpoint() {
|
|
76
|
+
return this.sync.requestCheckpoint();
|
|
77
|
+
}
|
|
78
78
|
disconnect() {
|
|
79
79
|
return this.sync.disconnect();
|
|
80
80
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerClient.js","sourceRoot":"","sources":["../../../src/worker/sync/WorkerClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as Comlink from 'comlink';
|
|
2
|
+
import { createConsoleLogger, LogLevels } from '@powersync/common';
|
|
3
|
+
import { isSharedWorker, MultiDatabaseServer } from './db/MultiDatabaseServer.js';
|
|
4
|
+
import { SharedSyncImplementation } from './sync/SharedSyncImplementation.js';
|
|
5
|
+
import { WorkerClient } from './sync/WorkerClient.js';
|
|
6
|
+
const server = new MultiDatabaseServer(createConsoleLogger({ prefix: 'db-worker', minLevel: LogLevels.trace }));
|
|
7
|
+
const exposedDatabaseFunctions = {
|
|
8
|
+
connect: (config) => server.handleConnection(config),
|
|
9
|
+
connectToExisting: ({ identifier, lockName }) => server.connectToExisting(identifier, lockName)
|
|
10
|
+
};
|
|
11
|
+
if (isSharedWorker) {
|
|
12
|
+
const sharedSyncImplementation = new SharedSyncImplementation();
|
|
13
|
+
// A shared worker can either be an IndexedDB-VFS database server or a shared sync coordinator.
|
|
14
|
+
// To be able to know what service a client is connecting to, we let clients send an inner MessagePort through the
|
|
15
|
+
// top-level port along with a tag describing what they need.
|
|
16
|
+
const _self = self;
|
|
17
|
+
_self.onconnect = (outerEvent) => {
|
|
18
|
+
const port = outerEvent.ports[0];
|
|
19
|
+
port.onmessage = (event) => {
|
|
20
|
+
const { service, port } = event.data;
|
|
21
|
+
if (service === 'database') {
|
|
22
|
+
Comlink.expose(exposedDatabaseFunctions, port);
|
|
23
|
+
}
|
|
24
|
+
else if (service === 'sync') {
|
|
25
|
+
new WorkerClient(sharedSyncImplementation, port);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Dedicated workers are only used for databases, so we don't need an intermediate layer.
|
|
32
|
+
Comlink.expose(exposedDatabaseFunctions);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAG9E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAEhH,MAAM,wBAAwB,GAAyB;IACrD,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACpD,iBAAiB,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;CAChG,CAAC;AAEF,IAAI,cAAc,EAAE,CAAC;IACnB,MAAM,wBAAwB,GAAG,IAAI,wBAAwB,EAAE,CAAC;IAEhE,+FAA+F;IAC/F,kHAAkH;IAClH,6DAA6D;IAC7D,MAAM,KAAK,GAAG,IAA0C,CAAC;IACzD,KAAK,CAAC,SAAS,GAAG,CAAC,UAAwB,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAkD,EAAE,EAAE;YACtE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YACrC,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC3B,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC9B,IAAI,YAAY,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;KAAM,CAAC;IACN,yFAAyF;IACzF,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAC3C,CAAC"}
|