@powersync/web 0.0.0-dev-20260504100448 → 0.0.0-dev-20260630144038
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/powersync.cjs +1 -1
- package/dist/index.react_native_web.js +1879 -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/OPFSCoopSyncVFS-DRKedN0p.js +2 -0
- package/dist/worker/OPFSCoopSyncVFS-DRKedN0p.js.map +1 -0
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +2 -0
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-DiBqIVE5.js +2 -0
- package/dist/worker/mc-wa-sqlite-DiBqIVE5.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js +2 -0
- package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js.map +1 -0
- package/dist/worker/wa-sqlite-BlSx7-_P.js +2 -0
- package/dist/worker/wa-sqlite-BlSx7-_P.js.map +1 -0
- package/dist/worker/wa-sqlite-async-BdR24Ucf.js +2 -0
- package/dist/worker/wa-sqlite-async-BdR24Ucf.js.map +1 -0
- package/dist/worker/websockets-Q8W_lerF.js +9 -0
- package/dist/worker/websockets-Q8W_lerF.js.map +1 -0
- package/dist/worker/worker.js +7 -0
- package/dist/worker/worker.js.map +1 -0
- package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.js +1 -0
- package/lib/attachments/IndexDBFileSystemAdapter.js.map +1 -0
- package/lib/{src/db → db}/NavigatorTriggerClaimManager.d.ts +1 -1
- package/lib/{src/db → db}/NavigatorTriggerClaimManager.js +1 -0
- package/lib/db/NavigatorTriggerClaimManager.js.map +1 -0
- package/lib/db/PowerSyncDatabase.d.ts +67 -0
- package/lib/{src/db → db}/PowerSyncDatabase.js +48 -61
- package/lib/db/PowerSyncDatabase.js.map +1 -0
- package/lib/db/adapters/AsyncWebAdapter.d.ts +32 -0
- package/lib/{src/db → db}/adapters/AsyncWebAdapter.js +15 -14
- package/lib/db/adapters/AsyncWebAdapter.js.map +1 -0
- package/lib/db/adapters/SSRDBAdapter.d.ts +17 -0
- package/lib/db/adapters/SSRDBAdapter.js +37 -0
- package/lib/db/adapters/SSRDBAdapter.js.map +1 -0
- package/lib/{src/db → db}/adapters/WebDBAdapter.d.ts +1 -1
- package/lib/db/adapters/WebDBAdapter.js +2 -0
- package/lib/db/adapters/WebDBAdapter.js.map +1 -0
- package/lib/db/adapters/options.d.ts +87 -0
- package/lib/db/adapters/options.js +6 -0
- package/lib/db/adapters/options.js.map +1 -0
- package/lib/db/adapters/resolveAndValidateOptions.d.ts +5 -0
- package/lib/db/adapters/resolveAndValidateOptions.js +33 -0
- package/lib/db/adapters/resolveAndValidateOptions.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.d.ts +3 -4
- package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.js +3 -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 +12 -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 +12 -7
- package/lib/db/adapters/wa-sqlite/DatabaseServer.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.d.ts +22 -12
- package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.js +12 -10
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +18 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +131 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -0
- package/lib/{src/db → db}/adapters/wa-sqlite/vfs.js +1 -0
- package/lib/db/adapters/wa-sqlite/vfs.js.map +1 -0
- package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.d.ts +4 -8
- package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.js +5 -11
- package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
- package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.d.ts +13 -14
- package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.js +32 -66
- package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -0
- package/lib/db/sync/WebRemote.d.ts +10 -0
- package/lib/db/sync/WebRemote.js +33 -0
- package/lib/db/sync/WebRemote.js.map +1 -0
- package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.d.ts +2 -4
- package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.js +4 -2
- package/lib/db/sync/WebStreamingSyncImplementation.js.map +1 -0
- package/lib/{src/db → db}/sync/userAgent.js +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} +2 -3
- package/lib/index.js.map +1 -0
- package/lib/{src/shared → shared}/navigator.js +1 -0
- package/lib/shared/navigator.js.map +1 -0
- package/lib/{src/shared → shared}/tab_close_signal.js +1 -0
- package/lib/shared/tab_close_signal.js.map +1 -0
- package/lib/worker/SharedWorkerConnectionRequest.d.ts +5 -0
- package/lib/worker/SharedWorkerConnectionRequest.js +2 -0
- package/lib/worker/SharedWorkerConnectionRequest.js.map +1 -0
- package/lib/worker/client.d.ts +15 -0
- package/lib/worker/client.js +77 -0
- package/lib/worker/client.js.map +1 -0
- package/lib/worker/db/MultiDatabaseServer.d.ts +22 -0
- package/lib/{src/worker → worker}/db/MultiDatabaseServer.js +26 -15
- package/lib/worker/db/MultiDatabaseServer.js.map +1 -0
- package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +13 -0
- package/lib/{src/worker → worker}/sync/AbstractSharedSyncClientProvider.js +1 -0
- package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -0
- package/lib/worker/sync/BroadcastLogger.d.ts +27 -0
- package/lib/worker/sync/BroadcastLogger.js +65 -0
- package/lib/worker/sync/BroadcastLogger.js.map +1 -0
- package/lib/{src/worker → worker}/sync/SharedSyncImplementation.d.ts +11 -15
- package/lib/{src/worker → worker}/sync/SharedSyncImplementation.js +43 -43
- package/lib/worker/sync/SharedSyncImplementation.js.map +1 -0
- package/lib/{src/worker → worker}/sync/WorkerClient.d.ts +3 -3
- package/lib/{src/worker → worker}/sync/WorkerClient.js +3 -2
- package/lib/worker/sync/WorkerClient.js.map +1 -0
- package/lib/worker/worker.js +34 -0
- package/lib/worker/worker.js.map +1 -0
- package/package.json +22 -29
- package/src/db/NavigatorTriggerClaimManager.ts +1 -1
- package/src/db/PowerSyncDatabase.ts +80 -122
- package/src/db/adapters/AsyncWebAdapter.ts +17 -26
- package/src/db/adapters/SSRDBAdapter.ts +14 -64
- package/src/db/adapters/WebDBAdapter.ts +1 -1
- package/src/db/adapters/options.ts +100 -0
- package/src/db/adapters/resolveAndValidateOptions.ts +40 -0
- package/src/db/adapters/wa-sqlite/ConcurrentConnection.ts +4 -5
- package/src/db/adapters/wa-sqlite/DatabaseClient.ts +20 -56
- package/src/db/adapters/wa-sqlite/DatabaseServer.ts +15 -12
- package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +35 -24
- package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +63 -126
- package/src/db/sync/SSRWebStreamingSyncImplementation.ts +4 -22
- package/src/db/sync/SharedWebStreamingSyncImplementation.ts +38 -77
- package/src/db/sync/WebRemote.ts +23 -26
- package/src/db/sync/WebStreamingSyncImplementation.ts +4 -5
- package/src/index.ts +1 -3
- package/src/worker/SharedWorkerConnectionRequest.ts +6 -0
- package/src/worker/client.ts +100 -0
- package/src/worker/db/MultiDatabaseServer.ts +40 -22
- package/src/worker/sync/AbstractSharedSyncClientProvider.ts +4 -10
- package/src/worker/sync/BroadcastLogger.ts +35 -103
- package/src/worker/sync/SharedSyncImplementation.ts +62 -63
- package/src/worker/sync/WorkerClient.ts +4 -4
- package/src/worker/worker.ts +38 -0
- package/dist/index.umd.js +0 -7613
- package/dist/index.umd.js.map +0 -1
- package/dist/worker/SharedSyncImplementation.umd.js +0 -15885
- package/dist/worker/SharedSyncImplementation.umd.js.map +0 -1
- package/dist/worker/WASQLiteDB.umd.js +0 -17164
- package/dist/worker/WASQLiteDB.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js +0 -31
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js +0 -31
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js +0 -31
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js +0 -31
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js +0 -3562
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js +0 -2478
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js +0 -1681
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js.map +0 -1
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js +0 -1820
- package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js.map +0 -1
- package/lib/package.json +0 -91
- package/lib/src/db/PowerSyncDatabase.d.ts +0 -78
- package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.d.ts +0 -23
- package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js +0 -26
- package/lib/src/db/adapters/AsyncWebAdapter.d.ts +0 -50
- package/lib/src/db/adapters/SSRDBAdapter.d.ts +0 -30
- package/lib/src/db/adapters/SSRDBAdapter.js +0 -68
- package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +0 -45
- package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +0 -145
- package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.d.ts +0 -15
- package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js +0 -21
- package/lib/src/db/adapters/web-sql-flags.d.ts +0 -92
- package/lib/src/db/adapters/web-sql-flags.js +0 -36
- package/lib/src/db/sync/WebRemote.d.ts +0 -7
- package/lib/src/db/sync/WebRemote.js +0 -32
- package/lib/src/worker/db/MultiDatabaseServer.d.ts +0 -17
- package/lib/src/worker/db/WASQLiteDB.worker.d.ts +0 -4
- package/lib/src/worker/db/WASQLiteDB.worker.js +0 -30
- package/lib/src/worker/db/open-worker-database.d.ts +0 -14
- package/lib/src/worker/db/open-worker-database.js +0 -52
- package/lib/src/worker/sync/AbstractSharedSyncClientProvider.d.ts +0 -19
- package/lib/src/worker/sync/BroadcastLogger.d.ts +0 -47
- package/lib/src/worker/sync/BroadcastLogger.js +0 -128
- package/lib/src/worker/sync/SharedSyncImplementation.worker.d.ts +0 -1
- package/lib/src/worker/sync/SharedSyncImplementation.worker.js +0 -11
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts +0 -47
- package/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts +0 -24
- package/src/db/adapters/web-sql-flags.ts +0 -141
- package/src/worker/db/WASQLiteDB.worker.ts +0 -35
- package/src/worker/db/open-worker-database.ts +0 -62
- package/src/worker/sync/SharedSyncImplementation.worker.ts +0 -14
- /package/dist/{8e97452e297be23b5e50.wasm → worker/assets/mc-wa-sqlite-CnHbhWvs.wasm} +0 -0
- /package/dist/{2075a31bb151adbb9767.wasm → worker/assets/mc-wa-sqlite-async-D6idQS2r.wasm} +0 -0
- /package/dist/{3322bc84de986b63c2cd.wasm → worker/assets/wa-sqlite-XZW__iJk.wasm} +0 -0
- /package/dist/{fbc178b70d530e8ce02b.wasm → worker/assets/wa-sqlite-async-rHzzC98y.wasm} +0 -0
- /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.d.ts +0 -0
- /package/lib/{src/db → db}/adapters/wa-sqlite/vfs.d.ts +0 -0
- /package/lib/{src/db → db}/sync/userAgent.d.ts +0 -0
- /package/lib/{src/shared → shared}/navigator.d.ts +0 -0
- /package/lib/{src/shared → shared}/tab_close_signal.d.ts +0 -0
- /package/lib/{src/db/adapters/WebDBAdapter.js → worker/worker.d.ts} +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { SharedWorkerConnectionRequest, WorkerService } from './SharedWorkerConnectionRequest.js';
|
|
2
|
+
|
|
3
|
+
export interface OpenWorkerOptions {
|
|
4
|
+
service: WorkerService;
|
|
5
|
+
databaseIdentifier: string;
|
|
6
|
+
customWorker?: string | URL;
|
|
7
|
+
shared: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface WorkerConnection {
|
|
11
|
+
endpoint: MessagePort | Worker;
|
|
12
|
+
worker: Worker | SharedWorker;
|
|
13
|
+
close: () => void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function connectToWorker({
|
|
17
|
+
service,
|
|
18
|
+
databaseIdentifier,
|
|
19
|
+
customWorker,
|
|
20
|
+
shared
|
|
21
|
+
}: OpenWorkerOptions): WorkerConnection {
|
|
22
|
+
const name = `${shared ? 'shared-' : ''}powersync-${databaseIdentifier}`;
|
|
23
|
+
let worker: Worker | SharedWorker;
|
|
24
|
+
|
|
25
|
+
if (customWorker) {
|
|
26
|
+
worker = shared
|
|
27
|
+
? new SharedWorker(customWorker, {
|
|
28
|
+
/* @vite-ignore */
|
|
29
|
+
name,
|
|
30
|
+
type: 'module'
|
|
31
|
+
})
|
|
32
|
+
: new Worker(customWorker, {
|
|
33
|
+
/* @vite-ignore */
|
|
34
|
+
name,
|
|
35
|
+
type: 'module'
|
|
36
|
+
});
|
|
37
|
+
} else {
|
|
38
|
+
worker = spawnDefaultPowerSyncWorker(shared, name);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return connectToExistingWorker(worker, service);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Opens the default PowerSync worker.
|
|
46
|
+
*
|
|
47
|
+
* When users depend on the web SDK, we assume they use their own bundler (either vite or webpack). Both recognize the
|
|
48
|
+
* syntax of worker constructors with a string literal and will rewrite the URL as part of their bundling processes.
|
|
49
|
+
*
|
|
50
|
+
* React Native / Metro users can't rely on this on the web, as their app is not a JavaScript module and import.meta.url
|
|
51
|
+
* is not rewritten by Metro. For those users, we include a pre-bundled worker they can copy into a static assets
|
|
52
|
+
* directory and load with a custom URI. This also means that defaultWorker cannot work with Metro for React Native Web.
|
|
53
|
+
* We have a custom rollup plugin and conditional exports that replaces this function with a throwing stub for that
|
|
54
|
+
* platform. This allows a helpful error message.
|
|
55
|
+
*/
|
|
56
|
+
// Note: When changing this function, also update disableDefaultWorkers in rollup.config.ts.
|
|
57
|
+
function spawnDefaultPowerSyncWorker(shared: boolean, name: string): Worker | SharedWorker {
|
|
58
|
+
return shared
|
|
59
|
+
? new SharedWorker(new URL('./worker.js', import.meta.url), {
|
|
60
|
+
/* @vite-ignore */
|
|
61
|
+
name,
|
|
62
|
+
type: 'module'
|
|
63
|
+
})
|
|
64
|
+
: new Worker(new URL('./worker.js', import.meta.url), {
|
|
65
|
+
/* @vite-ignore */
|
|
66
|
+
name,
|
|
67
|
+
type: 'module'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function connectToExistingWorker(worker: Worker | SharedWorker, service: WorkerService): WorkerConnection {
|
|
72
|
+
const isShared = isSharedWorker(worker);
|
|
73
|
+
if (isShared) {
|
|
74
|
+
const { port1, port2 } = new MessageChannel();
|
|
75
|
+
const mainPort = (worker as SharedWorker).port;
|
|
76
|
+
mainPort.start();
|
|
77
|
+
mainPort.postMessage({ port: port1, service } satisfies SharedWorkerConnectionRequest, [port1]);
|
|
78
|
+
|
|
79
|
+
port2.start();
|
|
80
|
+
return {
|
|
81
|
+
endpoint: port2,
|
|
82
|
+
worker,
|
|
83
|
+
close() {
|
|
84
|
+
port2.close();
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
} else {
|
|
88
|
+
return {
|
|
89
|
+
endpoint: worker as Worker,
|
|
90
|
+
worker,
|
|
91
|
+
close() {
|
|
92
|
+
worker.terminate();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function isSharedWorker(worker: Worker | SharedWorker): worker is SharedWorker {
|
|
99
|
+
return 'port' in worker;
|
|
100
|
+
}
|
|
@@ -1,27 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LogLevels, PowerSyncLogger } 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';
|
|
8
4
|
import { getNavigatorLocks } from '../../shared/navigator.js';
|
|
9
|
-
import { RawSqliteConnection } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
|
|
5
|
+
import { RawSqliteConnection, RawWaSqliteDatabaseOptions } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
|
|
10
6
|
import { ConcurrentSqliteConnection } from '../../db/adapters/wa-sqlite/ConcurrentConnection.js';
|
|
11
7
|
|
|
12
8
|
const OPEN_DB_LOCK = 'open-wasqlite-db';
|
|
13
9
|
|
|
10
|
+
export interface ConnectToMultiDatabaseServerOptions {
|
|
11
|
+
logLevel: number;
|
|
12
|
+
database: RawWaSqliteDatabaseOptions;
|
|
13
|
+
lockName: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
14
16
|
/**
|
|
15
17
|
* Shared state to manage multiple database connections hosted by a worker.
|
|
16
18
|
*/
|
|
17
19
|
export class MultiDatabaseServer {
|
|
18
20
|
private activeDatabases = new Map<string, DatabaseServer>();
|
|
19
21
|
|
|
20
|
-
constructor(readonly logger:
|
|
22
|
+
constructor(readonly logger: PowerSyncLogger) {}
|
|
21
23
|
|
|
22
|
-
async handleConnection(
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
async handleConnection({
|
|
25
|
+
logLevel,
|
|
26
|
+
database,
|
|
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));
|
|
25
36
|
}
|
|
26
37
|
|
|
27
38
|
async connectToExisting(name: string, lockName: string): Promise<ClientConnectionView> {
|
|
@@ -35,7 +46,7 @@ export class MultiDatabaseServer {
|
|
|
35
46
|
});
|
|
36
47
|
}
|
|
37
48
|
|
|
38
|
-
async openConnectionLocally(options:
|
|
49
|
+
async openConnectionLocally(logger: PowerSyncLogger, options: RawWaSqliteDatabaseOptions, lockName?: string) {
|
|
39
50
|
// Especially on Firefox, we're sometimes seeing "NoModificationAllowedError"s when opening OPFS databases we can
|
|
40
51
|
// work around by retrying.
|
|
41
52
|
const maxAttempts = 3;
|
|
@@ -43,28 +54,35 @@ export class MultiDatabaseServer {
|
|
|
43
54
|
|
|
44
55
|
for (let count = 0; count < maxAttempts - 1; count++) {
|
|
45
56
|
try {
|
|
46
|
-
server = await this.databaseOpenAttempt(options);
|
|
47
|
-
} catch (
|
|
48
|
-
this.logger.
|
|
57
|
+
server = await this.databaseOpenAttempt(logger, options);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
this.logger.log({
|
|
60
|
+
level: LogLevels.warn,
|
|
61
|
+
message: `Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`,
|
|
62
|
+
error
|
|
63
|
+
});
|
|
49
64
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
50
65
|
}
|
|
51
66
|
}
|
|
52
67
|
|
|
53
68
|
// Final attempt if we haven't been able to open the server - rethrow errors if we still can't open.
|
|
54
|
-
server ??= await this.databaseOpenAttempt(options);
|
|
69
|
+
server ??= await this.databaseOpenAttempt(logger, options);
|
|
55
70
|
return server.connect(lockName);
|
|
56
71
|
}
|
|
57
72
|
|
|
58
|
-
private async databaseOpenAttempt(
|
|
73
|
+
private async databaseOpenAttempt(
|
|
74
|
+
logger: PowerSyncLogger,
|
|
75
|
+
options: RawWaSqliteDatabaseOptions
|
|
76
|
+
): Promise<DatabaseServer> {
|
|
59
77
|
return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
|
|
60
|
-
const {
|
|
78
|
+
const { filename } = options;
|
|
61
79
|
|
|
62
|
-
let server: DatabaseServer | undefined = this.activeDatabases.get(
|
|
80
|
+
let server: DatabaseServer | undefined = this.activeDatabases.get(filename);
|
|
63
81
|
if (server == null) {
|
|
64
82
|
// We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
|
|
65
83
|
// For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
|
|
66
84
|
// fine).
|
|
67
|
-
const needsNavigatorLocks = !(isSharedWorker || options.
|
|
85
|
+
const needsNavigatorLocks = !(isSharedWorker || options.readonly);
|
|
68
86
|
const connection = new RawSqliteConnection(options);
|
|
69
87
|
const withSafeConcurrency = new ConcurrentSqliteConnection(connection, needsNavigatorLocks);
|
|
70
88
|
|
|
@@ -81,13 +99,13 @@ export class MultiDatabaseServer {
|
|
|
81
99
|
}
|
|
82
100
|
returnLease();
|
|
83
101
|
|
|
84
|
-
const onClose = () => this.activeDatabases.delete(
|
|
102
|
+
const onClose = () => this.activeDatabases.delete(filename);
|
|
85
103
|
server = new DatabaseServer({
|
|
86
104
|
inner: withSafeConcurrency,
|
|
87
|
-
logger
|
|
105
|
+
logger,
|
|
88
106
|
onClose
|
|
89
107
|
});
|
|
90
|
-
this.activeDatabases.set(
|
|
108
|
+
this.activeDatabases.set(filename, server);
|
|
91
109
|
}
|
|
92
110
|
|
|
93
111
|
return server;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { LogRecord, PowerSyncCredentials } from '@powersync/common';
|
|
2
|
+
import { SyncStatusJson } from '@powersync/shared-internals';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* The client side port should provide these methods.
|
|
@@ -7,15 +8,8 @@ export abstract class AbstractSharedSyncClientProvider {
|
|
|
7
8
|
abstract fetchCredentials(): Promise<PowerSyncCredentials | null>;
|
|
8
9
|
abstract invalidateCredentials(): void;
|
|
9
10
|
abstract uploadCrud(): Promise<void>;
|
|
10
|
-
abstract statusChanged(status:
|
|
11
|
+
abstract statusChanged(status: SyncStatusJson): void;
|
|
11
12
|
abstract getDBWorkerPort(): Promise<MessagePort>;
|
|
12
13
|
|
|
13
|
-
abstract
|
|
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;
|
|
14
|
+
abstract log(record: LogRecord): void;
|
|
21
15
|
}
|
|
@@ -1,113 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PowerSyncLogger, LogLevels, CreateLoggerOptions, createConsoleLogger, LogRecord } from '@powersync/common';
|
|
2
2
|
import { type WrappedSyncPort } from './SharedSyncImplementation.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Broadcasts logs to all clients
|
|
6
6
|
*/
|
|
7
|
-
export class BroadcastLogger implements
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
INFO: ILogLevel;
|
|
11
|
-
TIME: ILogLevel;
|
|
12
|
-
WARN: ILogLevel;
|
|
13
|
-
ERROR: ILogLevel;
|
|
14
|
-
OFF: ILogLevel;
|
|
7
|
+
export class BroadcastLogger implements PowerSyncLogger {
|
|
8
|
+
private readonly inner: PowerSyncLogger & CreateLoggerOptions;
|
|
9
|
+
private currentLevel: number = LogLevels.info;
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
sendBroadcasts = true;
|
|
17
12
|
|
|
18
|
-
constructor(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
this.
|
|
23
|
-
this.WARN = LogLevel.WARN;
|
|
24
|
-
this.ERROR = LogLevel.ERROR;
|
|
25
|
-
this.OFF = LogLevel.OFF;
|
|
13
|
+
constructor(
|
|
14
|
+
prefix: string,
|
|
15
|
+
private clients: WrappedSyncPort[]
|
|
16
|
+
) {
|
|
17
|
+
this.inner = createConsoleLogger({ prefix: prefix });
|
|
26
18
|
}
|
|
27
19
|
|
|
28
|
-
|
|
29
|
-
|
|
20
|
+
log(record: LogRecord) {
|
|
21
|
+
this.inner.log(record);
|
|
30
22
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
debug(...x: any[]): void {
|
|
37
|
-
if (!this.enabledFor(this.DEBUG)) return;
|
|
38
|
-
|
|
39
|
-
console.debug(...x);
|
|
40
|
-
const sanitized = this.sanitizeArgs(x);
|
|
41
|
-
this.iterateClients((client) => client.clientProvider.debug(...sanitized));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
info(...x: any[]): void {
|
|
45
|
-
if (!this.enabledFor(this.INFO)) return;
|
|
46
|
-
|
|
47
|
-
console.info(...x);
|
|
48
|
-
const sanitized = this.sanitizeArgs(x);
|
|
49
|
-
this.iterateClients((client) => client.clientProvider.info(...sanitized));
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
log(...x: any[]): void {
|
|
53
|
-
if (!this.enabledFor(this.INFO)) return;
|
|
54
|
-
|
|
55
|
-
console.log(...x);
|
|
56
|
-
const sanitized = this.sanitizeArgs(x);
|
|
57
|
-
this.iterateClients((client) => client.clientProvider.log(...sanitized));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
warn(...x: any[]): void {
|
|
61
|
-
if (!this.enabledFor(this.WARN)) return;
|
|
62
|
-
|
|
63
|
-
console.warn(...x);
|
|
64
|
-
const sanitized = this.sanitizeArgs(x);
|
|
65
|
-
this.iterateClients((client) => client.clientProvider.warn(...sanitized));
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
error(...x: any[]): void {
|
|
69
|
-
if (!this.enabledFor(this.ERROR)) return;
|
|
70
|
-
|
|
71
|
-
console.error(...x);
|
|
72
|
-
const sanitized = this.sanitizeArgs(x);
|
|
73
|
-
this.iterateClients((client) => client.clientProvider.error(...sanitized));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
time(label: string): void {
|
|
77
|
-
if (!this.enabledFor(this.TIME)) return;
|
|
78
|
-
|
|
79
|
-
console.time(label);
|
|
80
|
-
this.iterateClients((client) => client.clientProvider.time(label));
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
timeEnd(label: string): void {
|
|
84
|
-
if (!this.enabledFor(this.TIME)) return;
|
|
85
|
-
|
|
86
|
-
console.timeEnd(label);
|
|
87
|
-
this.iterateClients((client) => client.clientProvider.timeEnd(label));
|
|
23
|
+
if (this.sendBroadcasts && record.level >= this.currentLevel) {
|
|
24
|
+
const sanitized = this.sanitizeRecord(record);
|
|
25
|
+
this.iterateClients((client) => client.clientProvider.log(sanitized));
|
|
26
|
+
}
|
|
88
27
|
}
|
|
89
28
|
|
|
90
29
|
/**
|
|
91
30
|
* Set the global log level.
|
|
92
31
|
*/
|
|
93
|
-
setLevel(level:
|
|
32
|
+
setLevel(level: number): void {
|
|
33
|
+
this.inner.minLevel = level;
|
|
94
34
|
this.currentLevel = level;
|
|
95
35
|
}
|
|
96
36
|
|
|
97
|
-
/**
|
|
98
|
-
* Get the current log level.
|
|
99
|
-
*/
|
|
100
|
-
getLevel(): ILogLevel {
|
|
101
|
-
return this.currentLevel;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Returns true if the given level is enabled.
|
|
106
|
-
*/
|
|
107
|
-
enabledFor(level: ILogLevel): boolean {
|
|
108
|
-
return level.value >= this.currentLevel.value;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
37
|
/**
|
|
112
38
|
* Iterates all clients, catches individual client exceptions
|
|
113
39
|
* and proceeds to execute for all clients.
|
|
@@ -126,17 +52,23 @@ export class BroadcastLogger implements ILogger {
|
|
|
126
52
|
* Guards against any logging errors.
|
|
127
53
|
* We don't want a logging exception to cause further issues upstream
|
|
128
54
|
*/
|
|
129
|
-
protected
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
})
|
|
55
|
+
protected sanitizeRecord(record: LogRecord): LogRecord {
|
|
56
|
+
if (!record.error) {
|
|
57
|
+
return record;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let error;
|
|
61
|
+
try {
|
|
62
|
+
// Try and clone here first. If it fails it won't be passable over a MessagePort
|
|
63
|
+
error = structuredClone(record.error);
|
|
64
|
+
} catch (ex) {
|
|
65
|
+
console.error(ex);
|
|
66
|
+
error = 'Could not serialize log params. Check shared worker logs for more details.';
|
|
67
|
+
}
|
|
139
68
|
|
|
140
|
-
return
|
|
69
|
+
return {
|
|
70
|
+
...record,
|
|
71
|
+
error
|
|
72
|
+
};
|
|
141
73
|
}
|
|
142
74
|
}
|