@powersync/web 0.0.0-dev-20260708104358 → 0.0.0-dev-20260827080125
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-DoDpgFfE.wasm +0 -0
- package/dist/worker/assets/mc-wa-sqlite-async-DYagSq56.wasm +0 -0
- package/dist/worker/assets/wa-sqlite-CagagB9I.wasm +0 -0
- package/dist/worker/assets/wa-sqlite-async-DCIP8kAx.wasm +0 -0
- package/dist/worker/mc-wa-sqlite-DDFgWP93.js +2 -0
- package/dist/worker/mc-wa-sqlite-DDFgWP93.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-async-lGclTjKJ.js +2 -0
- package/dist/worker/mc-wa-sqlite-async-lGclTjKJ.js.map +1 -0
- package/dist/worker/wa-sqlite-B0tZMM0j.js +2 -0
- package/dist/worker/wa-sqlite-B0tZMM0j.js.map +1 -0
- package/dist/worker/wa-sqlite-async-CM6BmfRh.js +2 -0
- package/dist/worker/wa-sqlite-async-CM6BmfRh.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 +72 -104
- 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 +101 -135
- 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,26 +1,24 @@
|
|
|
1
1
|
import {
|
|
2
|
-
AbortOperation,
|
|
3
2
|
BaseObserver,
|
|
4
|
-
ConnectionManager,
|
|
5
|
-
ConnectionPool,
|
|
6
3
|
DBAdapter,
|
|
7
|
-
DBAdapterDefaultMixin,
|
|
8
|
-
DBAdapterListener,
|
|
9
4
|
DBLockOptions,
|
|
10
5
|
LockContext,
|
|
11
6
|
PowerSyncBackendConnector,
|
|
7
|
+
SyncStatus,
|
|
8
|
+
LogLevels,
|
|
9
|
+
SyncStreamConnectionMethod
|
|
10
|
+
} from '@powersync/common';
|
|
11
|
+
import {
|
|
12
|
+
AbortOperation,
|
|
13
|
+
ConnectionManager,
|
|
12
14
|
SqliteBucketStorage,
|
|
13
15
|
SubscribedStream,
|
|
14
|
-
SyncStatus,
|
|
15
|
-
createLogger,
|
|
16
|
-
Mutex,
|
|
17
|
-
type ILogLevel,
|
|
18
|
-
type ILogger,
|
|
19
|
-
type PowerSyncConnectionOptions,
|
|
20
16
|
type StreamingSyncImplementation,
|
|
21
17
|
type StreamingSyncImplementationListener,
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
Mutex,
|
|
19
|
+
ResolvedSyncOptions,
|
|
20
|
+
SyncStatusSnapshot
|
|
21
|
+
} from '@powersync/shared-internals';
|
|
24
22
|
import * as Comlink from 'comlink';
|
|
25
23
|
import { WebRemote } from '../../db/sync/WebRemote.js';
|
|
26
24
|
import {
|
|
@@ -28,11 +26,11 @@ import {
|
|
|
28
26
|
WebStreamingSyncImplementationOptions
|
|
29
27
|
} from '../../db/sync/WebStreamingSyncImplementation.js';
|
|
30
28
|
|
|
31
|
-
import { ResolvedWebSQLOpenOptions } from '../../db/adapters/web-sql-flags.js';
|
|
32
29
|
import { AbstractSharedSyncClientProvider } from './AbstractSharedSyncClientProvider.js';
|
|
33
30
|
import { BroadcastLogger } from './BroadcastLogger.js';
|
|
34
31
|
import { DatabaseClient, OpenWorkerConnection } from '../../db/adapters/wa-sqlite/DatabaseClient.js';
|
|
35
32
|
import { generateTabCloseSignal } from '../../shared/tab_close_signal.js';
|
|
33
|
+
import { ResolvedWebSQLOpenOptions } from '../../db/adapters/options.js';
|
|
36
34
|
|
|
37
35
|
/**
|
|
38
36
|
* @internal
|
|
@@ -60,8 +58,12 @@ export type ManualSharedSyncPayload = {
|
|
|
60
58
|
* @internal
|
|
61
59
|
*/
|
|
62
60
|
export type SharedSyncInitOptions = {
|
|
63
|
-
streamOptions: Omit<
|
|
61
|
+
streamOptions: Omit<
|
|
62
|
+
WebStreamingSyncImplementationOptions,
|
|
63
|
+
'adapter' | 'uploadCrud' | 'postCheckpointRequest' | 'remote' | 'subscriptions' | 'logger'
|
|
64
|
+
>;
|
|
64
65
|
dbParams: ResolvedWebSQLOpenOptions;
|
|
66
|
+
enableBroadcastLogs: boolean;
|
|
65
67
|
};
|
|
66
68
|
|
|
67
69
|
/**
|
|
@@ -83,14 +85,6 @@ export type WrappedSyncPort = {
|
|
|
83
85
|
isClosing: boolean;
|
|
84
86
|
};
|
|
85
87
|
|
|
86
|
-
/**
|
|
87
|
-
* @internal
|
|
88
|
-
*/
|
|
89
|
-
export type RemoteOperationAbortController = {
|
|
90
|
-
controller: AbortController;
|
|
91
|
-
activePort: WrappedSyncPort;
|
|
92
|
-
};
|
|
93
|
-
|
|
94
88
|
/**
|
|
95
89
|
* HACK: The shared implementation wraps and provides its own
|
|
96
90
|
* PowerSyncBackendConnector when generating the streaming sync implementation.
|
|
@@ -108,25 +102,22 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
108
102
|
protected isInitialized: Promise<void>;
|
|
109
103
|
protected statusListener?: () => void;
|
|
110
104
|
|
|
111
|
-
protected fetchCredentialsController?: RemoteOperationAbortController;
|
|
112
|
-
protected uploadDataController?: RemoteOperationAbortController;
|
|
113
|
-
|
|
114
105
|
protected syncParams: SharedSyncInitOptions | null;
|
|
115
|
-
protected
|
|
116
|
-
protected lastConnectOptions: PowerSyncConnectionOptions | undefined;
|
|
106
|
+
protected lastConnectOptions: ResolvedSyncOptions | undefined;
|
|
117
107
|
protected portMutex: Mutex;
|
|
118
108
|
private subscriptions: SubscribedStream[] = [];
|
|
119
109
|
|
|
120
110
|
protected connectionManager: ConnectionManager;
|
|
121
|
-
syncStatus
|
|
122
|
-
|
|
111
|
+
private syncStatus?: SyncStatusSnapshot;
|
|
112
|
+
logger: BroadcastLogger;
|
|
123
113
|
protected readonly database = this.generateReconnectableDatabase();
|
|
124
114
|
|
|
115
|
+
private sharedCloseSignal = generateTabCloseSignal();
|
|
116
|
+
|
|
125
117
|
constructor() {
|
|
126
118
|
super();
|
|
127
119
|
this.ports = [];
|
|
128
120
|
this.syncParams = null;
|
|
129
|
-
this.logger = createLogger('shared-sync');
|
|
130
121
|
this.lastConnectOptions = undefined;
|
|
131
122
|
this.portMutex = new Mutex();
|
|
132
123
|
|
|
@@ -139,8 +130,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
139
130
|
});
|
|
140
131
|
});
|
|
141
132
|
|
|
142
|
-
this.
|
|
143
|
-
this.broadCastLogger = new BroadcastLogger(this.ports);
|
|
133
|
+
this.logger = new BroadcastLogger('shared-sync', this.ports);
|
|
144
134
|
|
|
145
135
|
this.connectionManager = new ConnectionManager({
|
|
146
136
|
createSyncImplementation: async () => {
|
|
@@ -148,8 +138,10 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
148
138
|
|
|
149
139
|
const sync = this.generateStreamingImplementation();
|
|
150
140
|
const onDispose = sync.registerListener({
|
|
151
|
-
statusChanged: (
|
|
152
|
-
this.
|
|
141
|
+
statusChanged: (snapshot) => {
|
|
142
|
+
this.syncStatus = snapshot;
|
|
143
|
+
const json = snapshot.toJSON();
|
|
144
|
+
this.ports.forEach((p) => p.clientProvider.statusChanged(json));
|
|
153
145
|
}
|
|
154
146
|
});
|
|
155
147
|
|
|
@@ -158,7 +150,8 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
158
150
|
onDispose
|
|
159
151
|
};
|
|
160
152
|
},
|
|
161
|
-
logger: this.logger
|
|
153
|
+
logger: this.logger,
|
|
154
|
+
defaultConnectionMethod: SyncStreamConnectionMethod.HTTP
|
|
162
155
|
});
|
|
163
156
|
}
|
|
164
157
|
|
|
@@ -192,12 +185,6 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
192
185
|
});
|
|
193
186
|
}
|
|
194
187
|
|
|
195
|
-
async waitForStatus(status: SyncStatusOptions): Promise<void> {
|
|
196
|
-
return this.withSyncImplementation(async (sync) => {
|
|
197
|
-
return sync.waitForStatus(status);
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
|
|
201
188
|
async waitUntilStatusMatches(predicate: (status: SyncStatus) => boolean): Promise<void> {
|
|
202
189
|
return this.withSyncImplementation(async (sync) => {
|
|
203
190
|
return sync.waitUntilStatusMatches(predicate);
|
|
@@ -209,7 +196,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
209
196
|
}
|
|
210
197
|
|
|
211
198
|
private collectActiveSubscriptions() {
|
|
212
|
-
this.logger.debug
|
|
199
|
+
this.logger.log({ level: LogLevels.debug, message: 'Collecting active stream subscriptions across tabs' });
|
|
213
200
|
const active = new Map<string, SubscribedStream>();
|
|
214
201
|
for (const port of this.ports) {
|
|
215
202
|
for (const stream of port.currentSubscriptions) {
|
|
@@ -218,7 +205,10 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
218
205
|
}
|
|
219
206
|
}
|
|
220
207
|
this.subscriptions = [...active.values()];
|
|
221
|
-
this.logger.
|
|
208
|
+
this.logger.log({
|
|
209
|
+
level: LogLevels.debug,
|
|
210
|
+
message: `Collected stream subscriptions, ${JSON.stringify(this.subscriptions)}`
|
|
211
|
+
});
|
|
222
212
|
this.connectionManager.syncStreamImplementation?.updateSubscriptions(this.subscriptions);
|
|
223
213
|
}
|
|
224
214
|
|
|
@@ -227,9 +217,8 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
227
217
|
this.collectActiveSubscriptions();
|
|
228
218
|
}
|
|
229
219
|
|
|
230
|
-
setLogLevel(level:
|
|
220
|
+
setLogLevel(level: number) {
|
|
231
221
|
this.logger.setLevel(level);
|
|
232
|
-
this.broadCastLogger.setLevel(level);
|
|
233
222
|
}
|
|
234
223
|
|
|
235
224
|
/**
|
|
@@ -247,16 +236,18 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
247
236
|
|
|
248
237
|
// First time setting params
|
|
249
238
|
this.syncParams = params;
|
|
250
|
-
|
|
251
|
-
this.logger = this.broadCastLogger;
|
|
252
|
-
}
|
|
239
|
+
this.logger.sendBroadcasts = params.enableBroadcastLogs;
|
|
253
240
|
|
|
254
241
|
// Ensure we have a usable database connection, the reconnectable database will connect lazily on first use.
|
|
255
242
|
await this.database.readLock(async () => {});
|
|
256
243
|
|
|
257
244
|
self.onerror = (event) => {
|
|
258
245
|
// Share any uncaught events on the broadcast logger
|
|
259
|
-
this.logger.
|
|
246
|
+
this.logger.log({
|
|
247
|
+
level: LogLevels.error,
|
|
248
|
+
message: 'Uncaught exception in PowerSync shared sync worker',
|
|
249
|
+
error: event
|
|
250
|
+
});
|
|
260
251
|
};
|
|
261
252
|
|
|
262
253
|
this.iterateListeners((l) => l.initialized?.());
|
|
@@ -274,9 +265,9 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
274
265
|
* The connection will simply be reconnected whenever a new tab
|
|
275
266
|
* connects.
|
|
276
267
|
*/
|
|
277
|
-
async connect(options
|
|
268
|
+
async connect(options: ResolvedSyncOptions, serializedSchema: any) {
|
|
278
269
|
this.lastConnectOptions = options;
|
|
279
|
-
return this.connectionManager.connect(CONNECTOR_PLACEHOLDER, options ?? {});
|
|
270
|
+
return this.connectionManager.connect(CONNECTOR_PLACEHOLDER, options ?? {}, serializedSchema);
|
|
280
271
|
}
|
|
281
272
|
|
|
282
273
|
async disconnect() {
|
|
@@ -298,7 +289,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
298
289
|
this.ports.push(portProvider);
|
|
299
290
|
|
|
300
291
|
// Give the newly connected client the latest status
|
|
301
|
-
const status = this.
|
|
292
|
+
const status = this.syncStatus;
|
|
302
293
|
if (status) {
|
|
303
294
|
portProvider.clientProvider.statusChanged(status.toJSON());
|
|
304
295
|
}
|
|
@@ -321,7 +312,10 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
321
312
|
return await this.portMutex.runExclusive(async () => {
|
|
322
313
|
const index = this.ports.findIndex((p) => p == port);
|
|
323
314
|
if (index < 0) {
|
|
324
|
-
this.logger.
|
|
315
|
+
this.logger.log({
|
|
316
|
+
level: LogLevels.warn,
|
|
317
|
+
message: `Could not remove port ${port} since it is not present in active ports.`
|
|
318
|
+
});
|
|
325
319
|
return () => {};
|
|
326
320
|
}
|
|
327
321
|
|
|
@@ -329,18 +323,6 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
329
323
|
// Remove from the list of active ports
|
|
330
324
|
this.ports.splice(index, 1);
|
|
331
325
|
|
|
332
|
-
/**
|
|
333
|
-
* The port might currently be in use. Any active functions might
|
|
334
|
-
* not resolve. Abort them here.
|
|
335
|
-
*/
|
|
336
|
-
[this.fetchCredentialsController, this.uploadDataController].forEach((abortController) => {
|
|
337
|
-
if (abortController?.activePort == port) {
|
|
338
|
-
abortController!.controller.abort(
|
|
339
|
-
new AbortOperation('Closing pending requests after client port is removed')
|
|
340
|
-
);
|
|
341
|
-
}
|
|
342
|
-
});
|
|
343
|
-
|
|
344
326
|
// Close the worker wrapped database connection, we can't accurately rely on this connection
|
|
345
327
|
for (const closeListener of trackedPort.closeListeners) {
|
|
346
328
|
await closeListener();
|
|
@@ -358,10 +340,8 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
358
340
|
});
|
|
359
341
|
}
|
|
360
342
|
|
|
361
|
-
|
|
362
|
-
return this.withSyncImplementation(
|
|
363
|
-
return sync.getWriteCheckpoint();
|
|
364
|
-
});
|
|
343
|
+
requestCheckpoint() {
|
|
344
|
+
return this.withSyncImplementation((sync) => sync.requestCheckpoint());
|
|
365
345
|
}
|
|
366
346
|
|
|
367
347
|
protected async withSyncImplementation<T>(callback: (sync: StreamingSyncImplementation) => Promise<T>): Promise<T> {
|
|
@@ -397,61 +377,36 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
397
377
|
throw new Error('No client port found to invalidate credentials');
|
|
398
378
|
}
|
|
399
379
|
try {
|
|
400
|
-
this.logger.log(
|
|
380
|
+
this.logger.log({
|
|
381
|
+
level: LogLevels.info,
|
|
382
|
+
message: 'calling the last port client provider to invalidate credentials'
|
|
383
|
+
});
|
|
401
384
|
lastPort.clientProvider.invalidateCredentials();
|
|
402
|
-
} catch (
|
|
403
|
-
this.logger.error
|
|
385
|
+
} catch (error) {
|
|
386
|
+
this.logger.log({ level: LogLevels.error, message: 'error invalidating credentials', error });
|
|
404
387
|
}
|
|
405
388
|
},
|
|
406
|
-
fetchCredentials:
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
activePort: lastPort
|
|
416
|
-
};
|
|
417
|
-
|
|
418
|
-
abortController.signal.onabort = reject;
|
|
419
|
-
try {
|
|
420
|
-
this.logger.log('calling the last port client provider for credentials');
|
|
421
|
-
resolve(await lastPort.clientProvider.fetchCredentials());
|
|
422
|
-
} catch (ex) {
|
|
423
|
-
reject(ex);
|
|
424
|
-
} finally {
|
|
425
|
-
this.fetchCredentialsController = undefined;
|
|
426
|
-
}
|
|
427
|
-
});
|
|
389
|
+
fetchCredentials: () => {
|
|
390
|
+
return this.#useConnector((port) => {
|
|
391
|
+
this.logger.log({
|
|
392
|
+
level: LogLevels.info,
|
|
393
|
+
message: 'calling the last port client provider for credentials'
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
return port.clientProvider.fetchCredentials();
|
|
397
|
+
}, 'fetchCredentials');
|
|
428
398
|
}
|
|
429
399
|
},
|
|
430
400
|
this.logger
|
|
431
401
|
),
|
|
432
|
-
uploadCrud:
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
this.uploadDataController = {
|
|
441
|
-
controller: abortController,
|
|
442
|
-
activePort: lastPort
|
|
443
|
-
};
|
|
444
|
-
|
|
445
|
-
// Resolving will make it retry
|
|
446
|
-
abortController.signal.onabort = () => resolve();
|
|
447
|
-
try {
|
|
448
|
-
resolve(await lastPort.clientProvider.uploadCrud());
|
|
449
|
-
} catch (ex) {
|
|
450
|
-
reject(ex);
|
|
451
|
-
} finally {
|
|
452
|
-
this.uploadDataController = undefined;
|
|
453
|
-
}
|
|
454
|
-
});
|
|
402
|
+
uploadCrud: () => {
|
|
403
|
+
return this.#useConnector((port) => port.clientProvider.uploadCrud(), 'uploadCrud');
|
|
404
|
+
},
|
|
405
|
+
postCheckpointRequest: (clientId, requestId) => {
|
|
406
|
+
return this.#useConnector(
|
|
407
|
+
(port) => port.clientProvider.postCheckpointRequest(clientId, requestId),
|
|
408
|
+
'postCheckpointRequest'
|
|
409
|
+
);
|
|
455
410
|
},
|
|
456
411
|
...syncParams.streamOptions,
|
|
457
412
|
subscriptions: this.subscriptions,
|
|
@@ -460,6 +415,27 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
460
415
|
});
|
|
461
416
|
}
|
|
462
417
|
|
|
418
|
+
async #useConnector<T>(inner: (port: WrappedSyncPort) => Promise<T>, debugContext: string): Promise<T> {
|
|
419
|
+
const lastPort = await this.getLastWrappedPort();
|
|
420
|
+
if (!lastPort) {
|
|
421
|
+
throw new Error(`No client port found for ${debugContext}`);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
return new Promise((resolve, reject) => {
|
|
425
|
+
function portClosed() {
|
|
426
|
+
reject(new Error(`Tab closed while handling ${debugContext}`));
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
lastPort.closeListeners.push(portClosed);
|
|
430
|
+
|
|
431
|
+
inner(lastPort)
|
|
432
|
+
.then(resolve, reject)
|
|
433
|
+
.finally(() => {
|
|
434
|
+
lastPort.closeListeners.splice(lastPort.closeListeners.indexOf(portClosed), 1);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
|
|
463
439
|
/**
|
|
464
440
|
* Requests a random client to share its database connection with us.
|
|
465
441
|
*/
|
|
@@ -508,7 +484,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
508
484
|
const remote = Comlink.wrap<OpenWorkerConnection>(workerPort);
|
|
509
485
|
const identifier = this.syncParams!.dbParams.dbFilename;
|
|
510
486
|
|
|
511
|
-
const clientLockName = await
|
|
487
|
+
const clientLockName = await this.sharedCloseSignal;
|
|
512
488
|
|
|
513
489
|
/**
|
|
514
490
|
* The open could fail if the tab is closed while we're busy opening the database.
|
|
@@ -542,7 +518,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
542
518
|
clearTimeout(timeout);
|
|
543
519
|
|
|
544
520
|
client.closeListeners.push(async () => {
|
|
545
|
-
this.logger.info
|
|
521
|
+
this.logger.log({ level: LogLevels.info, message: 'Aborting open connection because associated tab closed.' });
|
|
546
522
|
handleClosed(db);
|
|
547
523
|
/**
|
|
548
524
|
* Don't await this close operation. It might never resolve if the tab is closed.
|
|
@@ -550,7 +526,9 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
550
526
|
* We then call close. The close operation is configured to fire-and-forget, the main promise will reject immediately.
|
|
551
527
|
*/
|
|
552
528
|
db.markRemoteClosed();
|
|
553
|
-
db.close().catch((
|
|
529
|
+
db.close().catch((error) =>
|
|
530
|
+
this.logger.log({ level: LogLevels.warn, message: 'error closing database connection', error })
|
|
531
|
+
);
|
|
554
532
|
});
|
|
555
533
|
return db;
|
|
556
534
|
}
|
|
@@ -559,7 +537,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
559
537
|
const syncParams = this.syncParams;
|
|
560
538
|
const sharedSync = this;
|
|
561
539
|
|
|
562
|
-
class
|
|
540
|
+
return new (class extends DBAdapter {
|
|
563
541
|
private connectionState:
|
|
564
542
|
| null
|
|
565
543
|
| DatabaseClient<ResolvedWebSQLOpenOptions>
|
|
@@ -628,19 +606,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
|
|
|
628
606
|
async refreshSchema(): Promise<void> {
|
|
629
607
|
// Not used by sync client.
|
|
630
608
|
}
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
const Adapter = DBAdapterDefaultMixin(ReconnectPool);
|
|
634
|
-
return new Adapter();
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
/**
|
|
638
|
-
* A method to update the all shared statuses for each
|
|
639
|
-
* client.
|
|
640
|
-
*/
|
|
641
|
-
private updateAllStatuses(status: SyncStatusOptions) {
|
|
642
|
-
this.syncStatus = new SyncStatus(status);
|
|
643
|
-
this.ports.forEach((p) => p.clientProvider.statusChanged(status));
|
|
609
|
+
})();
|
|
644
610
|
}
|
|
645
611
|
}
|
|
646
612
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ILogLevel, PowerSyncConnectionOptions, SubscribedStream } from '@powersync/common';
|
|
2
1
|
import * as Comlink from 'comlink';
|
|
3
2
|
import { getNavigatorLocks } from '../../shared/navigator.js';
|
|
4
3
|
import {
|
|
@@ -8,6 +7,7 @@ import {
|
|
|
8
7
|
SharedSyncInitOptions,
|
|
9
8
|
WrappedSyncPort
|
|
10
9
|
} from './SharedSyncImplementation.js';
|
|
10
|
+
import { SubscribedStream, ResolvedSyncOptions } from '@powersync/shared-internals';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* A client to the shared sync worker.
|
|
@@ -65,7 +65,7 @@ export class WorkerClient {
|
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
setLogLevel(level:
|
|
68
|
+
setLogLevel(level: number) {
|
|
69
69
|
this.sync.setLogLevel(level);
|
|
70
70
|
}
|
|
71
71
|
|
|
@@ -78,12 +78,8 @@ export class WorkerClient {
|
|
|
78
78
|
return this.sync.setParams(params);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
return this.sync.
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
connect(options?: PowerSyncConnectionOptions) {
|
|
86
|
-
return this.sync.connect(options);
|
|
81
|
+
connect(options: ResolvedSyncOptions, schema: any) {
|
|
82
|
+
return this.sync.connect(options, schema);
|
|
87
83
|
}
|
|
88
84
|
|
|
89
85
|
updateSubscriptions(subscriptions: SubscribedStream[]) {
|
|
@@ -92,6 +88,10 @@ export class WorkerClient {
|
|
|
92
88
|
}
|
|
93
89
|
}
|
|
94
90
|
|
|
91
|
+
requestCheckpoint(): Promise<bigint> {
|
|
92
|
+
return this.sync.requestCheckpoint();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
95
|
disconnect() {
|
|
96
96
|
return this.sync.disconnect();
|
|
97
97
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as Comlink from 'comlink';
|
|
2
|
+
|
|
3
|
+
import { createConsoleLogger, LogLevels } from '@powersync/common';
|
|
4
|
+
import { isSharedWorker, MultiDatabaseServer } from './db/MultiDatabaseServer.js';
|
|
5
|
+
import { SharedSyncImplementation } from './sync/SharedSyncImplementation.js';
|
|
6
|
+
import { OpenWorkerConnection } from '../db/adapters/wa-sqlite/DatabaseClient.js';
|
|
7
|
+
import { SharedWorkerConnectionRequest } from './SharedWorkerConnectionRequest.js';
|
|
8
|
+
import { WorkerClient } from './sync/WorkerClient.js';
|
|
9
|
+
|
|
10
|
+
const server = new MultiDatabaseServer(createConsoleLogger({ prefix: 'db-worker', minLevel: LogLevels.trace }));
|
|
11
|
+
|
|
12
|
+
const exposedDatabaseFunctions: OpenWorkerConnection = {
|
|
13
|
+
connect: (config) => server.handleConnection(config),
|
|
14
|
+
connectToExisting: ({ identifier, lockName }) => server.connectToExisting(identifier, lockName)
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
if (isSharedWorker) {
|
|
18
|
+
const sharedSyncImplementation = new SharedSyncImplementation();
|
|
19
|
+
|
|
20
|
+
// A shared worker can either be an IndexedDB-VFS database server or a shared sync coordinator.
|
|
21
|
+
// To be able to know what service a client is connecting to, we let clients send an inner MessagePort through the
|
|
22
|
+
// top-level port along with a tag describing what they need.
|
|
23
|
+
const _self = self as unknown as SharedWorkerGlobalScope;
|
|
24
|
+
_self.onconnect = (outerEvent: MessageEvent) => {
|
|
25
|
+
const port = outerEvent.ports[0];
|
|
26
|
+
port.onmessage = (event: MessageEvent<SharedWorkerConnectionRequest>) => {
|
|
27
|
+
const { service, port } = event.data;
|
|
28
|
+
if (service === 'database') {
|
|
29
|
+
Comlink.expose(exposedDatabaseFunctions, port);
|
|
30
|
+
} else if (service === 'sync') {
|
|
31
|
+
new WorkerClient(sharedSyncImplementation, port);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
} else {
|
|
36
|
+
// Dedicated workers are only used for databases, so we don't need an intermediate layer.
|
|
37
|
+
Comlink.expose(exposedDatabaseFunctions);
|
|
38
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|