@powersync/web 0.0.0-dev-20260630141119 → 0.0.0-dev-20260708103617
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.umd.js +7821 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/worker/SharedSyncImplementation.umd.js +16139 -0
- package/dist/worker/SharedSyncImplementation.umd.js.map +1 -0
- package/dist/worker/WASQLiteDB.umd.js +17434 -0
- package/dist/worker/WASQLiteDB.umd.js.map +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js +31 -0
- 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 +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js +31 -0
- 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 +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js +31 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js.map +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js +31 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js.map +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js +3562 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js.map +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-833585.umd.js +1400 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-833585.umd.js.map +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js +2478 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js.map +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js +1681 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js.map +1 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js +1820 -0
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js.map +1 -0
- package/lib/package.json +91 -0
- package/lib/src/attachments/IndexDBFileSystemAdapter.js.map +1 -0
- package/lib/{db → src/db}/NavigatorTriggerClaimManager.d.ts +1 -1
- package/lib/src/db/NavigatorTriggerClaimManager.js.map +1 -0
- package/lib/src/db/PowerSyncDatabase.d.ts +78 -0
- package/lib/{db → src/db}/PowerSyncDatabase.js +61 -47
- package/lib/src/db/PowerSyncDatabase.js.map +1 -0
- package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.d.ts +23 -0
- package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js +27 -0
- package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js.map +1 -0
- package/lib/src/db/adapters/AsyncWebAdapter.d.ts +50 -0
- package/lib/{db → src/db}/adapters/AsyncWebAdapter.js +14 -14
- package/lib/src/db/adapters/AsyncWebAdapter.js.map +1 -0
- package/lib/src/db/adapters/SSRDBAdapter.d.ts +30 -0
- package/lib/src/db/adapters/SSRDBAdapter.js +69 -0
- package/lib/src/db/adapters/SSRDBAdapter.js.map +1 -0
- package/lib/{db → src/db}/adapters/WebDBAdapter.d.ts +1 -1
- package/lib/src/db/adapters/WebDBAdapter.js.map +1 -0
- package/lib/{db → src/db}/adapters/wa-sqlite/ConcurrentConnection.d.ts +4 -3
- package/lib/{db → src/db}/adapters/wa-sqlite/ConcurrentConnection.js +2 -2
- package/lib/src/db/adapters/wa-sqlite/ConcurrentConnection.js.map +1 -0
- package/lib/{db → src/db}/adapters/wa-sqlite/DatabaseClient.d.ts +4 -4
- package/lib/{db → src/db}/adapters/wa-sqlite/DatabaseClient.js +37 -11
- package/lib/src/db/adapters/wa-sqlite/DatabaseClient.js.map +1 -0
- package/lib/{db → src/db}/adapters/wa-sqlite/DatabaseServer.d.ts +5 -5
- package/lib/{db → src/db}/adapters/wa-sqlite/DatabaseServer.js +7 -11
- package/lib/src/db/adapters/wa-sqlite/DatabaseServer.js.map +1 -0
- package/lib/{db → src/db}/adapters/wa-sqlite/RawSqliteConnection.d.ts +12 -23
- package/lib/{db → src/db}/adapters/wa-sqlite/RawSqliteConnection.js +11 -17
- package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -0
- package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +45 -0
- package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +146 -0
- package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -0
- package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.d.ts +15 -0
- package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js +22 -0
- package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js.map +1 -0
- package/lib/src/db/adapters/wa-sqlite/vfs.d.ts +40 -0
- package/lib/src/db/adapters/wa-sqlite/vfs.js +95 -0
- package/lib/src/db/adapters/wa-sqlite/vfs.js.map +1 -0
- package/lib/src/db/adapters/web-sql-flags.d.ts +92 -0
- package/lib/src/db/adapters/web-sql-flags.js +37 -0
- package/lib/src/db/adapters/web-sql-flags.js.map +1 -0
- package/lib/{db → src/db}/sync/SSRWebStreamingSyncImplementation.d.ts +8 -4
- package/lib/{db → src/db}/sync/SSRWebStreamingSyncImplementation.js +11 -4
- package/lib/src/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
- package/lib/{db → src/db}/sync/SharedWebStreamingSyncImplementation.d.ts +14 -13
- package/lib/{db → src/db}/sync/SharedWebStreamingSyncImplementation.js +66 -31
- package/lib/src/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -0
- package/lib/src/db/sync/WebRemote.d.ts +7 -0
- package/lib/src/db/sync/WebRemote.js +33 -0
- package/lib/src/db/sync/WebRemote.js.map +1 -0
- package/lib/{db → src/db}/sync/WebStreamingSyncImplementation.d.ts +4 -2
- package/lib/{db → src/db}/sync/WebStreamingSyncImplementation.js +2 -3
- package/lib/src/db/sync/WebStreamingSyncImplementation.js.map +1 -0
- package/lib/src/db/sync/userAgent.js.map +1 -0
- package/lib/{index.d.ts → src/index.d.ts} +3 -1
- package/lib/{index.js → src/index.js} +3 -1
- package/lib/src/index.js.map +1 -0
- package/lib/src/shared/navigator.js.map +1 -0
- package/lib/src/shared/tab_close_signal.js.map +1 -0
- package/lib/src/worker/db/MultiDatabaseServer.d.ts +17 -0
- package/lib/{worker → src/worker}/db/MultiDatabaseServer.js +18 -26
- package/lib/src/worker/db/MultiDatabaseServer.js.map +1 -0
- package/lib/src/worker/db/WASQLiteDB.worker.d.ts +4 -0
- package/lib/src/worker/db/WASQLiteDB.worker.js +31 -0
- package/lib/src/worker/db/WASQLiteDB.worker.js.map +1 -0
- package/lib/src/worker/db/open-worker-database.d.ts +14 -0
- package/lib/src/worker/db/open-worker-database.js +53 -0
- package/lib/src/worker/db/open-worker-database.js.map +1 -0
- package/lib/src/worker/sync/AbstractSharedSyncClientProvider.d.ts +19 -0
- package/lib/src/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -0
- package/lib/src/worker/sync/BroadcastLogger.d.ts +47 -0
- package/lib/src/worker/sync/BroadcastLogger.js +129 -0
- package/lib/src/worker/sync/BroadcastLogger.js.map +1 -0
- package/lib/{worker → src/worker}/sync/SharedSyncImplementation.d.ts +15 -11
- package/lib/{worker → src/worker}/sync/SharedSyncImplementation.js +43 -42
- package/lib/src/worker/sync/SharedSyncImplementation.js.map +1 -0
- package/lib/src/worker/sync/SharedSyncImplementation.worker.js +12 -0
- package/lib/src/worker/sync/SharedSyncImplementation.worker.js.map +1 -0
- package/lib/{worker → src/worker}/sync/WorkerClient.d.ts +3 -3
- package/lib/{worker → src/worker}/sync/WorkerClient.js +2 -2
- package/lib/src/worker/sync/WorkerClient.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +29 -22
- package/src/db/NavigatorTriggerClaimManager.ts +1 -1
- package/src/db/PowerSyncDatabase.ts +122 -80
- package/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts +47 -0
- package/src/db/adapters/AsyncWebAdapter.ts +26 -17
- package/src/db/adapters/SSRDBAdapter.ts +64 -14
- package/src/db/adapters/WebDBAdapter.ts +1 -1
- package/src/db/adapters/wa-sqlite/ConcurrentConnection.ts +5 -4
- package/src/db/adapters/wa-sqlite/DatabaseClient.ts +56 -20
- package/src/db/adapters/wa-sqlite/DatabaseServer.ts +12 -15
- package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +24 -41
- package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +126 -63
- package/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts +24 -0
- package/src/db/adapters/wa-sqlite/vfs.ts +67 -54
- package/src/db/adapters/web-sql-flags.ts +141 -0
- package/src/db/sync/SSRWebStreamingSyncImplementation.ts +22 -4
- package/src/db/sync/SharedWebStreamingSyncImplementation.ts +77 -38
- package/src/db/sync/WebRemote.ts +26 -23
- package/src/db/sync/WebStreamingSyncImplementation.ts +5 -4
- package/src/index.ts +3 -1
- package/src/worker/db/MultiDatabaseServer.ts +25 -41
- package/src/worker/db/WASQLiteDB.worker.ts +35 -0
- package/src/worker/db/open-worker-database.ts +62 -0
- package/src/worker/sync/AbstractSharedSyncClientProvider.ts +10 -4
- package/src/worker/sync/BroadcastLogger.ts +103 -35
- package/src/worker/sync/SharedSyncImplementation.ts +63 -62
- package/src/worker/sync/SharedSyncImplementation.worker.ts +14 -0
- package/src/worker/sync/WorkerClient.ts +4 -4
- package/dist/index.react_native_web.js +0 -1879
- package/dist/index.react_native_web.js.map +0 -1
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js +0 -2
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +0 -1
- package/dist/worker/FacadeVFS-d1ZDvud7.js +0 -2
- package/dist/worker/FacadeVFS-d1ZDvud7.js.map +0 -1
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js +0 -2
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +0 -1
- package/dist/worker/OPFSCoopSyncVFS-DRKedN0p.js +0 -2
- package/dist/worker/OPFSCoopSyncVFS-DRKedN0p.js.map +0 -1
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +0 -2
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +0 -1
- package/dist/worker/mc-wa-sqlite-DiBqIVE5.js +0 -2
- package/dist/worker/mc-wa-sqlite-DiBqIVE5.js.map +0 -1
- package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js +0 -2
- package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js.map +0 -1
- package/dist/worker/wa-sqlite-BlSx7-_P.js +0 -2
- package/dist/worker/wa-sqlite-BlSx7-_P.js.map +0 -1
- package/dist/worker/wa-sqlite-async-BdR24Ucf.js +0 -2
- package/dist/worker/wa-sqlite-async-BdR24Ucf.js.map +0 -1
- package/dist/worker/websockets-Q8W_lerF.js +0 -9
- package/dist/worker/websockets-Q8W_lerF.js.map +0 -1
- package/dist/worker/worker.js +0 -7
- package/dist/worker/worker.js.map +0 -1
- package/lib/attachments/IndexDBFileSystemAdapter.js.map +0 -1
- package/lib/db/NavigatorTriggerClaimManager.js.map +0 -1
- package/lib/db/PowerSyncDatabase.d.ts +0 -67
- package/lib/db/PowerSyncDatabase.js.map +0 -1
- package/lib/db/adapters/AsyncWebAdapter.d.ts +0 -32
- package/lib/db/adapters/AsyncWebAdapter.js.map +0 -1
- package/lib/db/adapters/SSRDBAdapter.d.ts +0 -17
- package/lib/db/adapters/SSRDBAdapter.js +0 -37
- package/lib/db/adapters/SSRDBAdapter.js.map +0 -1
- package/lib/db/adapters/WebDBAdapter.js.map +0 -1
- package/lib/db/adapters/options.d.ts +0 -87
- package/lib/db/adapters/options.js +0 -6
- package/lib/db/adapters/options.js.map +0 -1
- package/lib/db/adapters/resolveAndValidateOptions.d.ts +0 -5
- package/lib/db/adapters/resolveAndValidateOptions.js +0 -33
- package/lib/db/adapters/resolveAndValidateOptions.js.map +0 -1
- package/lib/db/adapters/wa-sqlite/ConcurrentConnection.js.map +0 -1
- package/lib/db/adapters/wa-sqlite/DatabaseClient.js.map +0 -1
- package/lib/db/adapters/wa-sqlite/DatabaseServer.js.map +0 -1
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +0 -1
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +0 -18
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +0 -131
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +0 -1
- package/lib/db/adapters/wa-sqlite/vfs.d.ts +0 -50
- package/lib/db/adapters/wa-sqlite/vfs.js +0 -77
- package/lib/db/adapters/wa-sqlite/vfs.js.map +0 -1
- package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +0 -1
- package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +0 -1
- package/lib/db/sync/WebRemote.d.ts +0 -10
- package/lib/db/sync/WebRemote.js +0 -33
- package/lib/db/sync/WebRemote.js.map +0 -1
- package/lib/db/sync/WebStreamingSyncImplementation.js.map +0 -1
- package/lib/db/sync/userAgent.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/shared/navigator.js.map +0 -1
- package/lib/shared/tab_close_signal.js.map +0 -1
- package/lib/worker/SharedWorkerConnectionRequest.d.ts +0 -5
- package/lib/worker/SharedWorkerConnectionRequest.js +0 -2
- package/lib/worker/SharedWorkerConnectionRequest.js.map +0 -1
- package/lib/worker/client.d.ts +0 -15
- package/lib/worker/client.js +0 -77
- package/lib/worker/client.js.map +0 -1
- package/lib/worker/db/MultiDatabaseServer.d.ts +0 -22
- package/lib/worker/db/MultiDatabaseServer.js.map +0 -1
- package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +0 -13
- package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +0 -1
- package/lib/worker/sync/BroadcastLogger.d.ts +0 -27
- package/lib/worker/sync/BroadcastLogger.js +0 -65
- package/lib/worker/sync/BroadcastLogger.js.map +0 -1
- package/lib/worker/sync/SharedSyncImplementation.js.map +0 -1
- package/lib/worker/sync/WorkerClient.js.map +0 -1
- package/lib/worker/worker.js +0 -34
- package/lib/worker/worker.js.map +0 -1
- package/src/db/adapters/options.ts +0 -100
- package/src/db/adapters/resolveAndValidateOptions.ts +0 -40
- package/src/worker/SharedWorkerConnectionRequest.ts +0 -6
- package/src/worker/client.ts +0 -100
- package/src/worker/worker.ts +0 -38
- /package/dist/{worker/assets/mc-wa-sqlite-async-D6idQS2r.wasm → 2075a31bb151adbb9767.wasm} +0 -0
- /package/dist/{worker/assets/wa-sqlite-XZW__iJk.wasm → 3322bc84de986b63c2cd.wasm} +0 -0
- /package/dist/{worker/assets/mc-wa-sqlite-CnHbhWvs.wasm → 8e97452e297be23b5e50.wasm} +0 -0
- /package/dist/{worker/assets/wa-sqlite-async-rHzzC98y.wasm → fbc178b70d530e8ce02b.wasm} +0 -0
- /package/lib/{attachments → src/attachments}/IndexDBFileSystemAdapter.d.ts +0 -0
- /package/lib/{attachments → src/attachments}/IndexDBFileSystemAdapter.js +0 -0
- /package/lib/{db → src/db}/NavigatorTriggerClaimManager.js +0 -0
- /package/lib/{db → src/db}/adapters/WebDBAdapter.js +0 -0
- /package/lib/{db → src/db}/sync/userAgent.d.ts +0 -0
- /package/lib/{db → src/db}/sync/userAgent.js +0 -0
- /package/lib/{shared → src/shared}/navigator.d.ts +0 -0
- /package/lib/{shared → src/shared}/navigator.js +0 -0
- /package/lib/{shared → src/shared}/tab_close_signal.d.ts +0 -0
- /package/lib/{shared → src/shared}/tab_close_signal.js +0 -0
- /package/lib/{worker → src/worker}/sync/AbstractSharedSyncClientProvider.js +0 -0
- /package/lib/{worker/worker.d.ts → src/worker/sync/SharedSyncImplementation.worker.d.ts} +0 -0
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
PowerSyncConnectionOptions,
|
|
3
|
+
PowerSyncCredentials,
|
|
4
|
+
SubscribedStream,
|
|
5
|
+
SyncStatusOptions
|
|
6
|
+
} from '@powersync/common';
|
|
2
7
|
import * as Comlink from 'comlink';
|
|
8
|
+
import { getNavigatorLocks } from '../../shared/navigator.js';
|
|
3
9
|
import { AbstractSharedSyncClientProvider } from '../../worker/sync/AbstractSharedSyncClientProvider.js';
|
|
4
10
|
import { ManualSharedSyncPayload, SharedSyncClientEvent } from '../../worker/sync/SharedSyncImplementation.js';
|
|
5
11
|
import { WorkerClient } from '../../worker/sync/WorkerClient.js';
|
|
6
12
|
import { WebDBAdapter } from '../adapters/WebDBAdapter.js';
|
|
13
|
+
import { DEFAULT_CACHE_SIZE_KB, TemporaryStorageOption, resolveWebSQLFlags } from '../adapters/web-sql-flags.js';
|
|
7
14
|
import {
|
|
8
15
|
WebStreamingSyncImplementation,
|
|
9
16
|
WebStreamingSyncImplementationOptions
|
|
10
17
|
} from './WebStreamingSyncImplementation.js';
|
|
11
18
|
import { generateTabCloseSignal } from '../../shared/tab_close_signal.js';
|
|
12
|
-
import { SubscribedStream, SyncStatusJson, ResolvedSyncOptions } from '@powersync/shared-internals';
|
|
13
|
-
import { connectToExistingWorker, connectToWorker, WorkerConnection } from '../../worker/client.js';
|
|
14
19
|
|
|
15
20
|
/**
|
|
16
21
|
* The shared worker will trigger methods on this side of the message port
|
|
@@ -19,7 +24,7 @@ import { connectToExistingWorker, connectToWorker, WorkerConnection } from '../.
|
|
|
19
24
|
class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
|
|
20
25
|
constructor(
|
|
21
26
|
protected options: WebStreamingSyncImplementationOptions,
|
|
22
|
-
public statusChanged: (status:
|
|
27
|
+
public statusChanged: (status: SyncStatusOptions) => void,
|
|
23
28
|
protected webDB: WebDBAdapter
|
|
24
29
|
) {
|
|
25
30
|
super();
|
|
@@ -63,15 +68,34 @@ class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
|
|
|
63
68
|
return this.options.logger;
|
|
64
69
|
}
|
|
65
70
|
|
|
66
|
-
|
|
67
|
-
this.logger
|
|
71
|
+
trace(...x: any[]): void {
|
|
72
|
+
this.logger?.trace(...x);
|
|
73
|
+
}
|
|
74
|
+
debug(...x: any[]): void {
|
|
75
|
+
this.logger?.debug(...x);
|
|
76
|
+
}
|
|
77
|
+
info(...x: any[]): void {
|
|
78
|
+
this.logger?.info(...x);
|
|
79
|
+
}
|
|
80
|
+
log(...x: any[]): void {
|
|
81
|
+
this.logger?.log(...x);
|
|
82
|
+
}
|
|
83
|
+
warn(...x: any[]): void {
|
|
84
|
+
this.logger?.warn(...x);
|
|
85
|
+
}
|
|
86
|
+
error(...x: any[]): void {
|
|
87
|
+
this.logger?.error(...x);
|
|
88
|
+
}
|
|
89
|
+
time(label: string): void {
|
|
90
|
+
this.logger?.time(label);
|
|
91
|
+
}
|
|
92
|
+
timeEnd(label: string): void {
|
|
93
|
+
this.logger?.timeEnd(label);
|
|
68
94
|
}
|
|
69
95
|
}
|
|
70
96
|
|
|
71
97
|
export interface SharedWebStreamingSyncImplementationOptions extends WebStreamingSyncImplementationOptions {
|
|
72
|
-
logLevel: number;
|
|
73
98
|
db: WebDBAdapter;
|
|
74
|
-
enableBroadcastLogs: boolean;
|
|
75
99
|
}
|
|
76
100
|
|
|
77
101
|
/**
|
|
@@ -80,30 +104,46 @@ export interface SharedWebStreamingSyncImplementationOptions extends WebStreamin
|
|
|
80
104
|
export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplementation {
|
|
81
105
|
protected syncManager: Comlink.Remote<WorkerClient>;
|
|
82
106
|
protected clientProvider: SharedSyncClientProvider;
|
|
83
|
-
protected
|
|
107
|
+
protected messagePort: MessagePort;
|
|
84
108
|
|
|
85
109
|
protected isInitialized: Promise<void>;
|
|
86
110
|
protected dbAdapter: WebDBAdapter;
|
|
87
111
|
private abortOnClose = new AbortController();
|
|
88
|
-
private logLevel: number;
|
|
89
|
-
private enableBroadcastLogs: boolean;
|
|
90
112
|
|
|
91
113
|
constructor(options: SharedWebStreamingSyncImplementationOptions) {
|
|
92
114
|
super(options);
|
|
93
115
|
this.dbAdapter = options.db;
|
|
94
|
-
|
|
95
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Configure or connect to the shared sync worker.
|
|
118
|
+
* This worker will manage all syncing operations remotely.
|
|
119
|
+
*/
|
|
120
|
+
const resolvedWorkerOptions = {
|
|
121
|
+
dbFilename: this.options.identifier!,
|
|
122
|
+
temporaryStorage: TemporaryStorageOption.MEMORY,
|
|
123
|
+
cacheSizeKb: DEFAULT_CACHE_SIZE_KB,
|
|
124
|
+
...options,
|
|
125
|
+
flags: resolveWebSQLFlags(options.flags)
|
|
126
|
+
};
|
|
96
127
|
|
|
97
128
|
const syncWorker = options.sync?.worker;
|
|
98
|
-
if (
|
|
99
|
-
|
|
129
|
+
if (syncWorker) {
|
|
130
|
+
if (typeof syncWorker === 'function') {
|
|
131
|
+
this.messagePort = syncWorker(resolvedWorkerOptions).port;
|
|
132
|
+
} else {
|
|
133
|
+
this.messagePort = new SharedWorker(`${syncWorker}`, {
|
|
134
|
+
/* @vite-ignore */
|
|
135
|
+
name: `shared-sync-${this.webOptions.identifier}`
|
|
136
|
+
}).port;
|
|
137
|
+
}
|
|
100
138
|
} else {
|
|
101
|
-
this.
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
139
|
+
this.messagePort = new SharedWorker(
|
|
140
|
+
new URL('../../worker/sync/SharedSyncImplementation.worker.js', import.meta.url),
|
|
141
|
+
{
|
|
142
|
+
/* @vite-ignore */
|
|
143
|
+
name: `shared-sync-${this.webOptions.identifier}`,
|
|
144
|
+
type: 'module'
|
|
145
|
+
}
|
|
146
|
+
).port;
|
|
107
147
|
}
|
|
108
148
|
|
|
109
149
|
/**
|
|
@@ -111,21 +151,21 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem
|
|
|
111
151
|
*/
|
|
112
152
|
this.clientProvider = new SharedSyncClientProvider(
|
|
113
153
|
this.webOptions,
|
|
114
|
-
(
|
|
115
|
-
this.updateSyncStatus(
|
|
154
|
+
(status) => {
|
|
155
|
+
this.updateSyncStatus(status);
|
|
116
156
|
},
|
|
117
157
|
options.db
|
|
118
158
|
);
|
|
119
159
|
|
|
120
|
-
this.syncManager = Comlink.wrap<WorkerClient>(this.
|
|
160
|
+
this.syncManager = Comlink.wrap<WorkerClient>(this.messagePort);
|
|
121
161
|
/**
|
|
122
162
|
* The sync worker will call this client provider when it needs
|
|
123
163
|
* to fetch credentials or upload data.
|
|
124
164
|
* This performs bi-directional method calling.
|
|
125
165
|
*/
|
|
126
|
-
Comlink.expose(this.clientProvider, this.
|
|
166
|
+
Comlink.expose(this.clientProvider, this.messagePort);
|
|
127
167
|
|
|
128
|
-
this.syncManager.setLogLevel(this.
|
|
168
|
+
this.syncManager.setLogLevel(this.logger.getLevel());
|
|
129
169
|
|
|
130
170
|
this.triggerCrudUpload = this.syncManager.triggerCrudUpload;
|
|
131
171
|
|
|
@@ -157,16 +197,18 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem
|
|
|
157
197
|
// Awaiting here ensures the worker is waiting for the lock
|
|
158
198
|
await this.syncManager.addLockBasedCloseSignal(closeSignal);
|
|
159
199
|
|
|
160
|
-
const { identifier } = this.options;
|
|
200
|
+
const { crudUploadThrottleMs, identifier, retryDelayMs } = this.options;
|
|
201
|
+
const flags = { ...this.webOptions.flags, workers: undefined };
|
|
161
202
|
|
|
162
203
|
await this.syncManager.setParams(
|
|
163
204
|
{
|
|
164
205
|
dbParams: this.dbAdapter.getConfiguration(),
|
|
165
206
|
streamOptions: {
|
|
207
|
+
crudUploadThrottleMs,
|
|
166
208
|
identifier,
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
209
|
+
retryDelayMs,
|
|
210
|
+
flags: flags
|
|
211
|
+
}
|
|
170
212
|
},
|
|
171
213
|
this.options.subscriptions
|
|
172
214
|
);
|
|
@@ -176,9 +218,9 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem
|
|
|
176
218
|
* Starts the sync process, this effectively acts as a call to
|
|
177
219
|
* `connect` if not yet connected.
|
|
178
220
|
*/
|
|
179
|
-
async connect(options
|
|
221
|
+
async connect(options?: PowerSyncConnectionOptions): Promise<void> {
|
|
180
222
|
await this.waitForReady();
|
|
181
|
-
return this.syncManager.connect(options
|
|
223
|
+
return this.syncManager.connect(options);
|
|
182
224
|
}
|
|
183
225
|
|
|
184
226
|
async disconnect(): Promise<void> {
|
|
@@ -195,11 +237,8 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem
|
|
|
195
237
|
await this.waitForReady();
|
|
196
238
|
|
|
197
239
|
await new Promise<void>((resolve) => {
|
|
198
|
-
// This will always be a message port since we use shared workers.
|
|
199
|
-
const messagePort = this.worker.endpoint as MessagePort;
|
|
200
|
-
|
|
201
240
|
// Listen for the close acknowledgment from the worker
|
|
202
|
-
messagePort.addEventListener('message', (event) => {
|
|
241
|
+
this.messagePort.addEventListener('message', (event) => {
|
|
203
242
|
const payload = event.data as ManualSharedSyncPayload;
|
|
204
243
|
if (payload?.event === SharedSyncClientEvent.CLOSE_ACK) {
|
|
205
244
|
resolve();
|
|
@@ -211,7 +250,7 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem
|
|
|
211
250
|
event: SharedSyncClientEvent.CLOSE_CLIENT,
|
|
212
251
|
data: {}
|
|
213
252
|
};
|
|
214
|
-
messagePort.postMessage(closeMessagePayload);
|
|
253
|
+
this.messagePort.postMessage(closeMessagePayload);
|
|
215
254
|
});
|
|
216
255
|
|
|
217
256
|
await super.dispose();
|
|
@@ -220,7 +259,7 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem
|
|
|
220
259
|
|
|
221
260
|
// Release the proxy
|
|
222
261
|
this.syncManager[Comlink.releaseProxy]();
|
|
223
|
-
this.
|
|
262
|
+
this.messagePort.close();
|
|
224
263
|
}
|
|
225
264
|
|
|
226
265
|
async waitForReady() {
|
package/src/db/sync/WebRemote.ts
CHANGED
|
@@ -1,40 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
AbstractRemote,
|
|
3
|
+
AbstractRemoteOptions,
|
|
4
|
+
DEFAULT_REMOTE_LOGGER,
|
|
5
|
+
FetchImplementation,
|
|
6
|
+
FetchImplementationProvider,
|
|
7
|
+
ILogger,
|
|
8
|
+
RemoteConnector
|
|
9
|
+
} from '@powersync/common';
|
|
3
10
|
|
|
4
11
|
import { getUserAgentInfo } from './userAgent.js';
|
|
5
|
-
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Depends on browser's implementation of global fetch.
|
|
15
|
+
*/
|
|
16
|
+
class WebFetchProvider extends FetchImplementationProvider {
|
|
17
|
+
getFetch(): FetchImplementation {
|
|
18
|
+
return fetch.bind(globalThis);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
6
21
|
|
|
7
22
|
export class WebRemote extends AbstractRemote {
|
|
8
23
|
constructor(
|
|
9
24
|
protected connector: RemoteConnector,
|
|
10
|
-
logger:
|
|
25
|
+
protected logger: ILogger = DEFAULT_REMOTE_LOGGER,
|
|
26
|
+
options?: Partial<AbstractRemoteOptions>
|
|
11
27
|
) {
|
|
12
|
-
super(connector, logger
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return fetch(resource, request);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
protected async loadWebSocketSupport(platform: WebSocketSyncStreamPlatform): Promise<WebSocketSupport> {
|
|
20
|
-
if (!websockets) {
|
|
21
|
-
// loadWebSocketSupport being called concurrently is safe, the import resolves to the same module in that case.
|
|
22
|
-
const module = await import('@powersync/shared-internals/websockets');
|
|
23
|
-
websockets = new module.WebSocketSupport(platform);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return websockets;
|
|
28
|
+
super(connector, logger, {
|
|
29
|
+
...(options ?? {}),
|
|
30
|
+
fetchImplementation: options?.fetchImplementation ?? new WebFetchProvider()
|
|
31
|
+
});
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
getUserAgent(): string {
|
|
30
35
|
let ua = [super.getUserAgent(), `powersync-web`];
|
|
31
36
|
try {
|
|
32
37
|
ua.push(...getUserAgentInfo());
|
|
33
|
-
} catch (
|
|
34
|
-
this.logger.
|
|
38
|
+
} catch (e) {
|
|
39
|
+
this.logger.warn('Failed to get user agent info', e);
|
|
35
40
|
}
|
|
36
41
|
return ua.join(' ');
|
|
37
42
|
}
|
|
38
43
|
}
|
|
39
|
-
|
|
40
|
-
let websockets: WebSocketSupport | undefined;
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { LogLevels } from '@powersync/common';
|
|
2
1
|
import {
|
|
3
2
|
AbstractStreamingSyncImplementation,
|
|
4
3
|
AbstractStreamingSyncImplementationOptions,
|
|
5
4
|
LockOptions,
|
|
6
5
|
LockType
|
|
7
|
-
} from '@powersync/
|
|
6
|
+
} from '@powersync/common';
|
|
8
7
|
import { getNavigatorLocks } from '../../shared/navigator.js';
|
|
8
|
+
import { ResolvedWebSQLOpenOptions, WebSQLFlags } from '../adapters/web-sql-flags.js';
|
|
9
9
|
|
|
10
10
|
export interface WebStreamingSyncImplementationOptions extends AbstractStreamingSyncImplementationOptions {
|
|
11
|
+
flags?: WebSQLFlags;
|
|
11
12
|
sync?: {
|
|
12
|
-
worker?: string | URL | (() => SharedWorker);
|
|
13
|
+
worker?: string | URL | ((options: ResolvedWebSQLOpenOptions) => SharedWorker);
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
16
|
|
|
@@ -26,7 +27,7 @@ export class WebStreamingSyncImplementation extends AbstractStreamingSyncImpleme
|
|
|
26
27
|
async obtainLock<T>(lockOptions: LockOptions<T>): Promise<T> {
|
|
27
28
|
const identifier = `streaming-sync-${lockOptions.type}-${this.webOptions.identifier}`;
|
|
28
29
|
if (lockOptions.type == LockType.SYNC) {
|
|
29
|
-
this.logger.
|
|
30
|
+
this.logger.debug('requesting lock for ', identifier);
|
|
30
31
|
}
|
|
31
32
|
return getNavigatorLocks().request(identifier, { signal: lockOptions.signal }, lockOptions.callback);
|
|
32
33
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export * from '@powersync/common';
|
|
2
2
|
export * from './attachments/IndexDBFileSystemAdapter.js';
|
|
3
|
+
export * from './db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js';
|
|
3
4
|
export { WASQLiteVFS } from './db/adapters/wa-sqlite/vfs.js';
|
|
4
5
|
export * from './db/adapters/wa-sqlite/WASQLiteOpenFactory.js';
|
|
5
|
-
export * from './db/adapters/
|
|
6
|
+
export * from './db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js';
|
|
7
|
+
export * from './db/adapters/web-sql-flags.js';
|
|
6
8
|
export * from './db/PowerSyncDatabase.js';
|
|
7
9
|
export * from './db/sync/SharedWebStreamingSyncImplementation.js';
|
|
8
10
|
export * from './db/sync/WebRemote.js';
|
|
@@ -1,38 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ILogger } from '@powersync/common';
|
|
2
2
|
import * as Comlink from 'comlink';
|
|
3
3
|
import { ClientConnectionView, DatabaseServer } from '../../db/adapters/wa-sqlite/DatabaseServer.js';
|
|
4
|
+
import {
|
|
5
|
+
ResolvedWASQLiteOpenFactoryOptions,
|
|
6
|
+
WorkerDBOpenerOptions
|
|
7
|
+
} from '../../db/adapters/wa-sqlite/WASQLiteOpenFactory.js';
|
|
4
8
|
import { getNavigatorLocks } from '../../shared/navigator.js';
|
|
5
|
-
import { RawSqliteConnection
|
|
9
|
+
import { RawSqliteConnection } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
|
|
6
10
|
import { ConcurrentSqliteConnection } from '../../db/adapters/wa-sqlite/ConcurrentConnection.js';
|
|
11
|
+
import { WASQLiteVFS } from '../../db/adapters/wa-sqlite/vfs.js';
|
|
7
12
|
|
|
8
13
|
const OPEN_DB_LOCK = 'open-wasqlite-db';
|
|
9
14
|
|
|
10
|
-
export interface ConnectToMultiDatabaseServerOptions {
|
|
11
|
-
logLevel: number;
|
|
12
|
-
database: RawWaSqliteDatabaseOptions;
|
|
13
|
-
lockName: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
15
|
/**
|
|
17
16
|
* Shared state to manage multiple database connections hosted by a worker.
|
|
18
17
|
*/
|
|
19
18
|
export class MultiDatabaseServer {
|
|
20
19
|
private activeDatabases = new Map<string, DatabaseServer>();
|
|
21
20
|
|
|
22
|
-
constructor(readonly logger:
|
|
21
|
+
constructor(readonly logger: ILogger) {}
|
|
23
22
|
|
|
24
|
-
async handleConnection({
|
|
25
|
-
logLevel
|
|
26
|
-
|
|
27
|
-
lockName
|
|
28
|
-
}: ConnectToMultiDatabaseServerOptions): Promise<ClientConnectionView> {
|
|
29
|
-
const logger: PowerSyncLogger = {
|
|
30
|
-
log: (record) => {
|
|
31
|
-
if (record.level >= logLevel) this.logger.log(record);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
return Comlink.proxy(await this.openConnectionLocally(logger, database, lockName));
|
|
23
|
+
async handleConnection(options: WorkerDBOpenerOptions): Promise<ClientConnectionView> {
|
|
24
|
+
this.logger.setLevel(options.logLevel);
|
|
25
|
+
return Comlink.proxy(await this.openConnectionLocally(options, options.lockName));
|
|
36
26
|
}
|
|
37
27
|
|
|
38
28
|
async connectToExisting(name: string, lockName: string): Promise<ClientConnectionView> {
|
|
@@ -46,7 +36,7 @@ export class MultiDatabaseServer {
|
|
|
46
36
|
});
|
|
47
37
|
}
|
|
48
38
|
|
|
49
|
-
async openConnectionLocally(
|
|
39
|
+
async openConnectionLocally(options: ResolvedWASQLiteOpenFactoryOptions, lockName?: string) {
|
|
50
40
|
// Especially on Firefox, we're sometimes seeing "NoModificationAllowedError"s when opening OPFS databases we can
|
|
51
41
|
// work around by retrying.
|
|
52
42
|
const maxAttempts = 3;
|
|
@@ -54,35 +44,29 @@ export class MultiDatabaseServer {
|
|
|
54
44
|
|
|
55
45
|
for (let count = 0; count < maxAttempts - 1; count++) {
|
|
56
46
|
try {
|
|
57
|
-
server = await this.databaseOpenAttempt(
|
|
58
|
-
} catch (
|
|
59
|
-
this.logger.
|
|
60
|
-
level: LogLevels.warn,
|
|
61
|
-
message: `Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`,
|
|
62
|
-
error
|
|
63
|
-
});
|
|
47
|
+
server = await this.databaseOpenAttempt(options);
|
|
48
|
+
} catch (ex) {
|
|
49
|
+
this.logger.warn(`Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`, ex);
|
|
64
50
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
65
51
|
}
|
|
66
52
|
}
|
|
67
53
|
|
|
68
54
|
// Final attempt if we haven't been able to open the server - rethrow errors if we still can't open.
|
|
69
|
-
server ??= await this.databaseOpenAttempt(
|
|
55
|
+
server ??= await this.databaseOpenAttempt(options);
|
|
70
56
|
return server.connect(lockName);
|
|
71
57
|
}
|
|
72
58
|
|
|
73
|
-
private async databaseOpenAttempt(
|
|
74
|
-
logger: PowerSyncLogger,
|
|
75
|
-
options: RawWaSqliteDatabaseOptions
|
|
76
|
-
): Promise<DatabaseServer> {
|
|
59
|
+
private async databaseOpenAttempt(options: ResolvedWASQLiteOpenFactoryOptions): Promise<DatabaseServer> {
|
|
77
60
|
return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
|
|
78
|
-
const {
|
|
61
|
+
const { dbFilename, isReadOnly, vfs } = options;
|
|
79
62
|
|
|
80
|
-
let server: DatabaseServer | undefined = this.activeDatabases.get(
|
|
63
|
+
let server: DatabaseServer | undefined = this.activeDatabases.get(dbFilename);
|
|
81
64
|
if (server == null) {
|
|
82
65
|
// We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
|
|
83
66
|
// For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
|
|
84
|
-
// fine).
|
|
85
|
-
|
|
67
|
+
// fine). In-memory databases either run in a shared worker or aren't shared across tabs at all, so the internal
|
|
68
|
+
// lock is enough.
|
|
69
|
+
const needsNavigatorLocks = !(isSharedWorker || isReadOnly || vfs == WASQLiteVFS.InMemoryVfs);
|
|
86
70
|
const connection = new RawSqliteConnection(options);
|
|
87
71
|
const withSafeConcurrency = new ConcurrentSqliteConnection(connection, needsNavigatorLocks);
|
|
88
72
|
|
|
@@ -99,13 +83,13 @@ export class MultiDatabaseServer {
|
|
|
99
83
|
}
|
|
100
84
|
returnLease();
|
|
101
85
|
|
|
102
|
-
const onClose = () => this.activeDatabases.delete(
|
|
86
|
+
const onClose = () => this.activeDatabases.delete(dbFilename);
|
|
103
87
|
server = new DatabaseServer({
|
|
104
88
|
inner: withSafeConcurrency,
|
|
105
|
-
logger,
|
|
89
|
+
logger: this.logger,
|
|
106
90
|
onClose
|
|
107
91
|
});
|
|
108
|
-
this.activeDatabases.set(
|
|
92
|
+
this.activeDatabases.set(dbFilename, server);
|
|
109
93
|
}
|
|
110
94
|
|
|
111
95
|
return server;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supports both shared and dedicated workers, based on how the worker is constructed (new SharedWorker vs new Worker()).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import '@journeyapps/wa-sqlite';
|
|
6
|
+
import { createBaseLogger, createLogger } from '@powersync/common';
|
|
7
|
+
import * as Comlink from 'comlink';
|
|
8
|
+
import { isSharedWorker, MultiDatabaseServer } from './MultiDatabaseServer.js';
|
|
9
|
+
import { OpenWorkerConnection } from '../../db/adapters/wa-sqlite/DatabaseClient.js';
|
|
10
|
+
|
|
11
|
+
const baseLogger = createBaseLogger();
|
|
12
|
+
baseLogger.useDefaults();
|
|
13
|
+
const logger = createLogger('db-worker');
|
|
14
|
+
|
|
15
|
+
const server = new MultiDatabaseServer(logger);
|
|
16
|
+
const exposedFunctions: OpenWorkerConnection = {
|
|
17
|
+
connect: (config) => server.handleConnection(config),
|
|
18
|
+
connectToExisting: ({ identifier, lockName }) => server.connectToExisting(identifier, lockName)
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// Check if we're in a SharedWorker context
|
|
22
|
+
if (isSharedWorker) {
|
|
23
|
+
const _self: SharedWorkerGlobalScope = self as any;
|
|
24
|
+
_self.onconnect = function (event: MessageEvent<string>) {
|
|
25
|
+
const port = event.ports[0];
|
|
26
|
+
Comlink.expose(exposedFunctions, port);
|
|
27
|
+
};
|
|
28
|
+
} else {
|
|
29
|
+
// A dedicated worker can be shared externally
|
|
30
|
+
Comlink.expose(exposedFunctions);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
addEventListener('unload', () => {
|
|
34
|
+
server.closeAll();
|
|
35
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as Comlink from 'comlink';
|
|
2
|
+
import { vfsRequiresDedicatedWorkers, WASQLiteVFS } from '../../db/adapters/wa-sqlite/vfs.js';
|
|
3
|
+
import { OpenWorkerConnection } from '../../db/adapters/wa-sqlite/DatabaseClient.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Opens a shared or dedicated worker which exposes opening of database connections
|
|
7
|
+
*/
|
|
8
|
+
export function openWorkerDatabasePort(
|
|
9
|
+
workerIdentifier: string,
|
|
10
|
+
multipleTabs = true,
|
|
11
|
+
worker: string | URL = '',
|
|
12
|
+
vfs?: WASQLiteVFS
|
|
13
|
+
) {
|
|
14
|
+
const needsDedicated = vfs && vfsRequiresDedicatedWorkers(vfs);
|
|
15
|
+
|
|
16
|
+
if (worker) {
|
|
17
|
+
return !needsDedicated && multipleTabs
|
|
18
|
+
? new SharedWorker(`${worker}`, {
|
|
19
|
+
/* @vite-ignore */
|
|
20
|
+
name: `shared-DB-worker-${workerIdentifier}`
|
|
21
|
+
}).port
|
|
22
|
+
: new Worker(`${worker}`, {
|
|
23
|
+
/* @vite-ignore */
|
|
24
|
+
name: `DB-worker-${workerIdentifier}`
|
|
25
|
+
});
|
|
26
|
+
} else {
|
|
27
|
+
/**
|
|
28
|
+
* Webpack V5 can bundle the worker automatically if the full Worker constructor syntax is used
|
|
29
|
+
* https://webpack.js.org/guides/web-workers/
|
|
30
|
+
* This enables multi tab support by default, but falls back if SharedWorker is not available
|
|
31
|
+
* (in the case of Android)
|
|
32
|
+
*/
|
|
33
|
+
return !needsDedicated && multipleTabs
|
|
34
|
+
? new SharedWorker(new URL('./WASQLiteDB.worker.js', import.meta.url), {
|
|
35
|
+
/* @vite-ignore */
|
|
36
|
+
name: `shared-DB-worker-${workerIdentifier}`,
|
|
37
|
+
type: 'module'
|
|
38
|
+
}).port
|
|
39
|
+
: new Worker(new URL('./WASQLiteDB.worker.js', import.meta.url), {
|
|
40
|
+
/* @vite-ignore */
|
|
41
|
+
name: `DB-worker-${workerIdentifier}`,
|
|
42
|
+
type: 'module'
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @returns A function which allows for opening database connections inside
|
|
49
|
+
* a worker.
|
|
50
|
+
*/
|
|
51
|
+
export function getWorkerDatabaseOpener(workerIdentifier: string, multipleTabs = true, worker: string | URL = '') {
|
|
52
|
+
return Comlink.wrap<OpenWorkerConnection>(openWorkerDatabasePort(workerIdentifier, multipleTabs, worker));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function resolveWorkerDatabasePortFactory(worker: () => Worker | SharedWorker) {
|
|
56
|
+
const workerInstance = worker();
|
|
57
|
+
return isSharedWorker(workerInstance) ? workerInstance.port : workerInstance;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function isSharedWorker(worker: Worker | SharedWorker): worker is SharedWorker {
|
|
61
|
+
return 'port' in worker;
|
|
62
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import { SyncStatusJson } from '@powersync/shared-internals';
|
|
1
|
+
import type { PowerSyncCredentials, SyncStatusOptions } from '@powersync/common';
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* The client side port should provide these methods.
|
|
@@ -8,8 +7,15 @@ export abstract class AbstractSharedSyncClientProvider {
|
|
|
8
7
|
abstract fetchCredentials(): Promise<PowerSyncCredentials | null>;
|
|
9
8
|
abstract invalidateCredentials(): void;
|
|
10
9
|
abstract uploadCrud(): Promise<void>;
|
|
11
|
-
abstract statusChanged(status:
|
|
10
|
+
abstract statusChanged(status: SyncStatusOptions): void;
|
|
12
11
|
abstract getDBWorkerPort(): Promise<MessagePort>;
|
|
13
12
|
|
|
14
|
-
abstract
|
|
13
|
+
abstract trace(...x: any[]): void;
|
|
14
|
+
abstract debug(...x: any[]): void;
|
|
15
|
+
abstract info(...x: any[]): void;
|
|
16
|
+
abstract log(...x: any[]): void;
|
|
17
|
+
abstract warn(...x: any[]): void;
|
|
18
|
+
abstract error(...x: any[]): void;
|
|
19
|
+
abstract time(label: string): void;
|
|
20
|
+
abstract timeEnd(label: string): void;
|
|
15
21
|
}
|