@powersync/web 1.39.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -10
- package/bin/powersync.cjs +1 -1
- package/dist/index.react_native_web.js +1992 -0
- package/dist/index.react_native_web.js.map +1 -0
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js +2 -0
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +1 -0
- package/dist/worker/FacadeVFS-d1ZDvud7.js +2 -0
- package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -0
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js +2 -0
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +1 -0
- package/dist/worker/MemoryVFS-DVJL5F8j.js +2 -0
- package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -0
- package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js +2 -0
- package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +1 -0
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +2 -0
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +1 -0
- package/dist/worker/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 +67 -0
- package/lib/{src/db → db}/PowerSyncDatabase.js +49 -63
- 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 -15
- package/lib/db/adapters/AsyncWebAdapter.js.map +1 -0
- package/lib/db/adapters/SSRDBAdapter.d.ts +17 -0
- package/lib/db/adapters/SSRDBAdapter.js +37 -0
- package/lib/db/adapters/SSRDBAdapter.js.map +1 -0
- package/lib/{src/db → db}/adapters/WebDBAdapter.d.ts +1 -1
- package/lib/db/adapters/WebDBAdapter.js.map +1 -0
- package/lib/db/adapters/options.d.ts +87 -0
- package/lib/db/adapters/options.js +6 -0
- package/lib/db/adapters/options.js.map +1 -0
- package/lib/db/adapters/resolveAndValidateOptions.d.ts +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 +22 -12
- package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.js +12 -9
- 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 +137 -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 +4 -8
- package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.js +4 -11
- package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
- package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.d.ts +13 -14
- package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.js +32 -66
- 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 +22 -0
- package/lib/{src/worker → worker}/db/MultiDatabaseServer.js +25 -15
- package/lib/worker/db/MultiDatabaseServer.js.map +1 -0
- package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +13 -0
- package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -0
- package/lib/worker/sync/BroadcastLogger.d.ts +27 -0
- package/lib/worker/sync/BroadcastLogger.js +65 -0
- package/lib/worker/sync/BroadcastLogger.js.map +1 -0
- package/lib/{src/worker → worker}/sync/SharedSyncImplementation.d.ts +12 -15
- package/lib/{src/worker → worker}/sync/SharedSyncImplementation.js +44 -44
- package/lib/worker/sync/SharedSyncImplementation.js.map +1 -0
- package/lib/{src/worker → worker}/sync/WorkerClient.d.ts +3 -3
- package/lib/{src/worker → worker}/sync/WorkerClient.js +2 -2
- package/lib/worker/sync/WorkerClient.js.map +1 -0
- package/lib/worker/worker.js +34 -0
- package/lib/worker/worker.js.map +1 -0
- package/package.json +23 -31
- package/src/db/NavigatorTriggerClaimManager.ts +1 -1
- package/src/db/PowerSyncDatabase.ts +83 -127
- package/src/db/adapters/AsyncWebAdapter.ts +18 -27
- 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 +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 +36 -23
- package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +70 -125
- package/src/db/adapters/wa-sqlite/vfs.ts +13 -8
- package/src/db/sync/SSRWebStreamingSyncImplementation.ts +4 -22
- package/src/db/sync/SharedWebStreamingSyncImplementation.ts +39 -77
- 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 +40 -22
- package/src/worker/sync/AbstractSharedSyncClientProvider.ts +4 -10
- package/src/worker/sync/BroadcastLogger.ts +35 -103
- package/src/worker/sync/SharedSyncImplementation.ts +65 -64
- package/src/worker/sync/WorkerClient.ts +4 -4
- 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 -16142
- package/dist/worker/SharedSyncImplementation.umd.js.map +0 -1
- package/dist/worker/WASQLiteDB.umd.js +0 -17437
- 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/db → db}/sync/userAgent.d.ts +0 -0
- /package/lib/{src/db → db}/sync/userAgent.js +0 -0
- /package/lib/{src/shared → shared}/navigator.d.ts +0 -0
- /package/lib/{src/shared → shared}/navigator.js +0 -0
- /package/lib/{src/shared → shared}/tab_close_signal.d.ts +0 -0
- /package/lib/{src/shared → shared}/tab_close_signal.js +0 -0
- /package/lib/{src/worker → worker}/sync/AbstractSharedSyncClientProvider.js +0 -0
- /package/lib/{src/worker/sync/SharedSyncImplementation.worker.d.ts → worker/worker.d.ts} +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PowerSyncLogger } from '@powersync/common';
|
|
2
|
+
import { WorkerService } from './SharedWorkerConnectionRequest.js';
|
|
3
|
+
export interface OpenWorkerOptions {
|
|
4
|
+
service: WorkerService;
|
|
5
|
+
databaseIdentifier: string;
|
|
6
|
+
customWorker?: string | URL;
|
|
7
|
+
shared: boolean;
|
|
8
|
+
loggerForErrors: PowerSyncLogger;
|
|
9
|
+
}
|
|
10
|
+
export interface WorkerConnection {
|
|
11
|
+
endpoint: MessagePort | Worker;
|
|
12
|
+
worker: Worker | SharedWorker;
|
|
13
|
+
close: () => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function connectToWorker({ service, databaseIdentifier, customWorker, shared, loggerForErrors }: OpenWorkerOptions): WorkerConnection;
|
|
16
|
+
export declare function connectToExistingWorker(worker: Worker | SharedWorker, logger: PowerSyncLogger, service: WorkerService): WorkerConnection;
|
|
17
|
+
export declare function isSharedWorker(worker: Worker | SharedWorker): worker is SharedWorker;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { LogLevels } from '@powersync/common';
|
|
2
|
+
export function connectToWorker({ service, databaseIdentifier, customWorker, shared, loggerForErrors }) {
|
|
3
|
+
const name = `${shared ? 'shared-' : ''}powersync-${databaseIdentifier}`;
|
|
4
|
+
let worker;
|
|
5
|
+
if (customWorker) {
|
|
6
|
+
worker = shared
|
|
7
|
+
? new SharedWorker(customWorker, {
|
|
8
|
+
/* @vite-ignore */
|
|
9
|
+
name,
|
|
10
|
+
type: 'module'
|
|
11
|
+
})
|
|
12
|
+
: new Worker(customWorker, {
|
|
13
|
+
/* @vite-ignore */
|
|
14
|
+
name,
|
|
15
|
+
type: 'module'
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
worker = spawnDefaultPowerSyncWorker(shared, name);
|
|
20
|
+
}
|
|
21
|
+
return connectToExistingWorker(worker, loggerForErrors, service);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Opens the default PowerSync worker.
|
|
25
|
+
*
|
|
26
|
+
* When users depend on the web SDK, we assume they use their own bundler (either vite or webpack). Both recognize the
|
|
27
|
+
* syntax of worker constructors with a string literal and will rewrite the URL as part of their bundling processes.
|
|
28
|
+
*
|
|
29
|
+
* React Native / Metro users can't rely on this on the web, as their app is not a JavaScript module and import.meta.url
|
|
30
|
+
* is not rewritten by Metro. For those users, we include a pre-bundled worker they can copy into a static assets
|
|
31
|
+
* directory and load with a custom URI. This also means that defaultWorker cannot work with Metro for React Native Web.
|
|
32
|
+
* We have a custom rollup plugin and conditional exports that replaces this function with a throwing stub for that
|
|
33
|
+
* platform. This allows a helpful error message.
|
|
34
|
+
*/
|
|
35
|
+
// Note: When changing this function, also update disableDefaultWorkers in rollup.config.ts.
|
|
36
|
+
function spawnDefaultPowerSyncWorker(shared, name) {
|
|
37
|
+
return shared
|
|
38
|
+
? new SharedWorker(new URL('./worker.js', import.meta.url), {
|
|
39
|
+
/* @vite-ignore */
|
|
40
|
+
name,
|
|
41
|
+
type: 'module'
|
|
42
|
+
})
|
|
43
|
+
: new Worker(new URL('./worker.js', import.meta.url), {
|
|
44
|
+
/* @vite-ignore */
|
|
45
|
+
name,
|
|
46
|
+
type: 'module'
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function connectToExistingWorker(worker, logger, service) {
|
|
50
|
+
function logError(event) {
|
|
51
|
+
// TODO: Ideally, we should be able to handle worker errors by forwarding them to async Comlink callers.
|
|
52
|
+
// Currently, comlink calls on errored workers would just be stuck forever.
|
|
53
|
+
logger.log({
|
|
54
|
+
level: LogLevels.error,
|
|
55
|
+
error: event.error,
|
|
56
|
+
message: 'Error in database or sync worker, this likely disrupts PowerSync.'
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
worker.addEventListener('error', logError);
|
|
60
|
+
const isShared = isSharedWorker(worker);
|
|
61
|
+
if (isShared) {
|
|
62
|
+
const { port1, port2 } = new MessageChannel();
|
|
63
|
+
const mainPort = worker.port;
|
|
64
|
+
mainPort.start();
|
|
65
|
+
mainPort.postMessage({ port: port1, service }, [port1]);
|
|
66
|
+
port2.start();
|
|
67
|
+
return {
|
|
68
|
+
endpoint: port2,
|
|
69
|
+
worker,
|
|
70
|
+
close() {
|
|
71
|
+
worker.removeEventListener('error', logError);
|
|
72
|
+
port2.close();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return {
|
|
78
|
+
endpoint: worker,
|
|
79
|
+
worker,
|
|
80
|
+
close() {
|
|
81
|
+
worker.removeEventListener('error', logError);
|
|
82
|
+
worker.terminate();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export function isSharedWorker(worker) {
|
|
88
|
+
return 'port' in worker;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PowerSyncLogger } from '@powersync/common';
|
|
2
|
+
import { ClientConnectionView } from '../../db/adapters/wa-sqlite/DatabaseServer.js';
|
|
3
|
+
import { RawWaSqliteDatabaseOptions } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
|
|
4
|
+
export interface ConnectToMultiDatabaseServerOptions {
|
|
5
|
+
logLevel: number;
|
|
6
|
+
database: RawWaSqliteDatabaseOptions;
|
|
7
|
+
lockName: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Shared state to manage multiple database connections hosted by a worker.
|
|
11
|
+
*/
|
|
12
|
+
export declare class MultiDatabaseServer {
|
|
13
|
+
readonly logger: PowerSyncLogger;
|
|
14
|
+
private activeDatabases;
|
|
15
|
+
constructor(logger: PowerSyncLogger);
|
|
16
|
+
handleConnection({ logLevel, database, lockName }: ConnectToMultiDatabaseServerOptions): Promise<ClientConnectionView>;
|
|
17
|
+
connectToExisting(name: string, lockName: string): Promise<ClientConnectionView>;
|
|
18
|
+
openConnectionLocally(logger: PowerSyncLogger, options: RawWaSqliteDatabaseOptions, lockName?: string): Promise<ClientConnectionView>;
|
|
19
|
+
private databaseOpenAttempt;
|
|
20
|
+
closeAll(): Promise<void[]>;
|
|
21
|
+
}
|
|
22
|
+
export declare const isSharedWorker: boolean;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { LogLevels } from '@powersync/common';
|
|
1
2
|
import * as Comlink from 'comlink';
|
|
2
3
|
import { DatabaseServer } from '../../db/adapters/wa-sqlite/DatabaseServer.js';
|
|
3
4
|
import { getNavigatorLocks } from '../../shared/navigator.js';
|
|
@@ -14,9 +15,14 @@ export class MultiDatabaseServer {
|
|
|
14
15
|
constructor(logger) {
|
|
15
16
|
this.logger = logger;
|
|
16
17
|
}
|
|
17
|
-
async handleConnection(
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
async handleConnection({ logLevel, database, lockName }) {
|
|
19
|
+
const logger = {
|
|
20
|
+
log: (record) => {
|
|
21
|
+
if (record.level >= logLevel)
|
|
22
|
+
this.logger.log(record);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return Comlink.proxy(await this.openConnectionLocally(logger, database, lockName));
|
|
20
26
|
}
|
|
21
27
|
async connectToExisting(name, lockName) {
|
|
22
28
|
return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
|
|
@@ -27,34 +33,38 @@ export class MultiDatabaseServer {
|
|
|
27
33
|
return Comlink.proxy(await server.connect(lockName));
|
|
28
34
|
});
|
|
29
35
|
}
|
|
30
|
-
async openConnectionLocally(options, lockName) {
|
|
36
|
+
async openConnectionLocally(logger, options, lockName) {
|
|
31
37
|
// Especially on Firefox, we're sometimes seeing "NoModificationAllowedError"s when opening OPFS databases we can
|
|
32
38
|
// work around by retrying.
|
|
33
39
|
const maxAttempts = 3;
|
|
34
40
|
let server;
|
|
35
41
|
for (let count = 0; count < maxAttempts - 1; count++) {
|
|
36
42
|
try {
|
|
37
|
-
server = await this.databaseOpenAttempt(options);
|
|
43
|
+
server = await this.databaseOpenAttempt(logger, options);
|
|
38
44
|
}
|
|
39
|
-
catch (
|
|
40
|
-
this.logger.
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.logger.log({
|
|
47
|
+
level: LogLevels.warn,
|
|
48
|
+
message: `Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`,
|
|
49
|
+
error
|
|
50
|
+
});
|
|
41
51
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
42
52
|
}
|
|
43
53
|
}
|
|
44
54
|
// Final attempt if we haven't been able to open the server - rethrow errors if we still can't open.
|
|
45
|
-
server ??= await this.databaseOpenAttempt(options);
|
|
55
|
+
server ??= await this.databaseOpenAttempt(logger, options);
|
|
46
56
|
return server.connect(lockName);
|
|
47
57
|
}
|
|
48
|
-
async databaseOpenAttempt(options) {
|
|
58
|
+
async databaseOpenAttempt(logger, options) {
|
|
49
59
|
return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
|
|
50
|
-
const {
|
|
51
|
-
let server = this.activeDatabases.get(
|
|
60
|
+
const { filename, readonly, vfs } = options;
|
|
61
|
+
let server = this.activeDatabases.get(filename);
|
|
52
62
|
if (server == null) {
|
|
53
63
|
// We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
|
|
54
64
|
// For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
|
|
55
65
|
// fine). In-memory databases either run in a shared worker or aren't shared across tabs at all, so the internal
|
|
56
66
|
// lock is enough.
|
|
57
|
-
const needsNavigatorLocks = !(isSharedWorker ||
|
|
67
|
+
const needsNavigatorLocks = !(isSharedWorker || readonly || vfs == WASQLiteVFS.InMemoryVfs);
|
|
58
68
|
const connection = new RawSqliteConnection(options);
|
|
59
69
|
const withSafeConcurrency = new ConcurrentSqliteConnection(connection, needsNavigatorLocks);
|
|
60
70
|
// Initializing the RawSqliteConnection will run some pragmas that might write to the database file, so we want
|
|
@@ -70,13 +80,13 @@ export class MultiDatabaseServer {
|
|
|
70
80
|
throw e;
|
|
71
81
|
}
|
|
72
82
|
returnLease();
|
|
73
|
-
const onClose = () => this.activeDatabases.delete(
|
|
83
|
+
const onClose = () => this.activeDatabases.delete(filename);
|
|
74
84
|
server = new DatabaseServer({
|
|
75
85
|
inner: withSafeConcurrency,
|
|
76
|
-
logger
|
|
86
|
+
logger,
|
|
77
87
|
onClose
|
|
78
88
|
});
|
|
79
|
-
this.activeDatabases.set(
|
|
89
|
+
this.activeDatabases.set(filename, server);
|
|
80
90
|
}
|
|
81
91
|
return server;
|
|
82
92
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiDatabaseServer.js","sourceRoot":"","sources":["../../../src/worker/db/MultiDatabaseServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LogRecord, PowerSyncCredentials } from '@powersync/common';
|
|
2
|
+
import { SyncStatusJson } from '@powersync/shared-internals';
|
|
3
|
+
/**
|
|
4
|
+
* The client side port should provide these methods.
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class AbstractSharedSyncClientProvider {
|
|
7
|
+
abstract fetchCredentials(): Promise<PowerSyncCredentials | null>;
|
|
8
|
+
abstract invalidateCredentials(): void;
|
|
9
|
+
abstract uploadCrud(): Promise<void>;
|
|
10
|
+
abstract statusChanged(status: SyncStatusJson): void;
|
|
11
|
+
abstract getDBWorkerPort(): Promise<MessagePort>;
|
|
12
|
+
abstract log(record: LogRecord): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractSharedSyncClientProvider.js","sourceRoot":"","sources":["../../../src/worker/sync/AbstractSharedSyncClientProvider.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAgB,gCAAgC;CAQrD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { PowerSyncLogger, LogRecord } from '@powersync/common';
|
|
2
|
+
import { type WrappedSyncPort } from './SharedSyncImplementation.js';
|
|
3
|
+
/**
|
|
4
|
+
* Broadcasts logs to all clients
|
|
5
|
+
*/
|
|
6
|
+
export declare class BroadcastLogger implements PowerSyncLogger {
|
|
7
|
+
private clients;
|
|
8
|
+
private readonly inner;
|
|
9
|
+
private currentLevel;
|
|
10
|
+
sendBroadcasts: boolean;
|
|
11
|
+
constructor(prefix: string, clients: WrappedSyncPort[]);
|
|
12
|
+
log(record: LogRecord): void;
|
|
13
|
+
/**
|
|
14
|
+
* Set the global log level.
|
|
15
|
+
*/
|
|
16
|
+
setLevel(level: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Iterates all clients, catches individual client exceptions
|
|
19
|
+
* and proceeds to execute for all clients.
|
|
20
|
+
*/
|
|
21
|
+
protected iterateClients(callback: (client: WrappedSyncPort) => Promise<void>): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Guards against any logging errors.
|
|
24
|
+
* We don't want a logging exception to cause further issues upstream
|
|
25
|
+
*/
|
|
26
|
+
protected sanitizeRecord(record: LogRecord): LogRecord;
|
|
27
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { LogLevels, createConsoleLogger } from '@powersync/common';
|
|
2
|
+
/**
|
|
3
|
+
* Broadcasts logs to all clients
|
|
4
|
+
*/
|
|
5
|
+
export class BroadcastLogger {
|
|
6
|
+
clients;
|
|
7
|
+
inner;
|
|
8
|
+
currentLevel = LogLevels.info;
|
|
9
|
+
sendBroadcasts = true;
|
|
10
|
+
constructor(prefix, clients) {
|
|
11
|
+
this.clients = clients;
|
|
12
|
+
this.inner = createConsoleLogger({ prefix: prefix });
|
|
13
|
+
}
|
|
14
|
+
log(record) {
|
|
15
|
+
this.inner.log(record);
|
|
16
|
+
if (this.sendBroadcasts && record.level >= this.currentLevel) {
|
|
17
|
+
const sanitized = this.sanitizeRecord(record);
|
|
18
|
+
this.iterateClients((client) => client.clientProvider.log(sanitized));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set the global log level.
|
|
23
|
+
*/
|
|
24
|
+
setLevel(level) {
|
|
25
|
+
this.inner.minLevel = level;
|
|
26
|
+
this.currentLevel = level;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Iterates all clients, catches individual client exceptions
|
|
30
|
+
* and proceeds to execute for all clients.
|
|
31
|
+
*/
|
|
32
|
+
async iterateClients(callback) {
|
|
33
|
+
for (const client of this.clients) {
|
|
34
|
+
try {
|
|
35
|
+
await callback(client);
|
|
36
|
+
}
|
|
37
|
+
catch (ex) {
|
|
38
|
+
console.error('Caught exception when iterating client', ex);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Guards against any logging errors.
|
|
44
|
+
* We don't want a logging exception to cause further issues upstream
|
|
45
|
+
*/
|
|
46
|
+
sanitizeRecord(record) {
|
|
47
|
+
if (!record.error) {
|
|
48
|
+
return record;
|
|
49
|
+
}
|
|
50
|
+
let error;
|
|
51
|
+
try {
|
|
52
|
+
// Try and clone here first. If it fails it won't be passable over a MessagePort
|
|
53
|
+
error = structuredClone(record.error);
|
|
54
|
+
}
|
|
55
|
+
catch (ex) {
|
|
56
|
+
console.error(ex);
|
|
57
|
+
error = 'Could not serialize log params. Check shared worker logs for more details.';
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
...record,
|
|
61
|
+
error
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=BroadcastLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BroadcastLogger.js","sourceRoot":"","sources":["../../../src/worker/sync/BroadcastLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAuB,mBAAmB,EAAa,MAAM,mBAAmB,CAAC;AAGpH;;GAEG;AACH,MAAM,OAAO,eAAe;IAQhB;IAPO,KAAK,CAAwC;IACtD,YAAY,GAAW,SAAS,CAAC,IAAI,CAAC;IAE9C,cAAc,GAAG,IAAI,CAAC;IAEtB,YACE,MAAc,EACN,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;QAElC,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,GAAG,CAAC,MAAiB;QACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEvB,IAAI,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,cAAc,CAAC,QAAoD;QACjF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,cAAc,CAAC,MAAiB;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,gFAAgF;YAChF,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,KAAK,GAAG,4EAA4E,CAAC;QACvF,CAAC;QAED,OAAO;YACL,GAAG,MAAM;YACT,KAAK;SACN,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { BaseObserver,
|
|
1
|
+
import { BaseObserver, DBAdapter, SyncStatus } from '@powersync/common';
|
|
2
|
+
import { ConnectionManager, SubscribedStream, type StreamingSyncImplementation, type StreamingSyncImplementationListener, Mutex, ResolvedSyncOptions } from '@powersync/shared-internals';
|
|
2
3
|
import * as Comlink from 'comlink';
|
|
3
4
|
import { WebStreamingSyncImplementation, WebStreamingSyncImplementationOptions } from '../../db/sync/WebStreamingSyncImplementation.js';
|
|
4
|
-
import { ResolvedWebSQLOpenOptions } from '../../db/adapters/web-sql-flags.js';
|
|
5
5
|
import { AbstractSharedSyncClientProvider } from './AbstractSharedSyncClientProvider.js';
|
|
6
|
+
import { BroadcastLogger } from './BroadcastLogger.js';
|
|
7
|
+
import { ResolvedWebSQLOpenOptions } from '../../db/adapters/options.js';
|
|
6
8
|
/**
|
|
7
9
|
* @internal
|
|
8
10
|
* Manual message events for shared sync clients
|
|
@@ -26,8 +28,9 @@ export type ManualSharedSyncPayload = {
|
|
|
26
28
|
* @internal
|
|
27
29
|
*/
|
|
28
30
|
export type SharedSyncInitOptions = {
|
|
29
|
-
streamOptions: Omit<WebStreamingSyncImplementationOptions, 'adapter' | 'uploadCrud' | 'remote' | 'subscriptions'>;
|
|
31
|
+
streamOptions: Omit<WebStreamingSyncImplementationOptions, 'adapter' | 'uploadCrud' | 'remote' | 'subscriptions' | 'logger'>;
|
|
30
32
|
dbParams: ResolvedWebSQLOpenOptions;
|
|
33
|
+
enableBroadcastLogs: boolean;
|
|
31
34
|
};
|
|
32
35
|
/**
|
|
33
36
|
* @internal
|
|
@@ -64,14 +67,14 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
64
67
|
protected fetchCredentialsController?: RemoteOperationAbortController;
|
|
65
68
|
protected uploadDataController?: RemoteOperationAbortController;
|
|
66
69
|
protected syncParams: SharedSyncInitOptions | null;
|
|
67
|
-
protected
|
|
68
|
-
protected lastConnectOptions: PowerSyncConnectionOptions | undefined;
|
|
70
|
+
protected lastConnectOptions: ResolvedSyncOptions | undefined;
|
|
69
71
|
protected portMutex: Mutex;
|
|
70
72
|
private subscriptions;
|
|
71
73
|
protected connectionManager: ConnectionManager;
|
|
72
|
-
syncStatus
|
|
73
|
-
|
|
74
|
+
private syncStatus?;
|
|
75
|
+
logger: BroadcastLogger;
|
|
74
76
|
protected readonly database: DBAdapter;
|
|
77
|
+
private sharedCloseSignal;
|
|
75
78
|
constructor();
|
|
76
79
|
get isConnected(): boolean;
|
|
77
80
|
/**
|
|
@@ -83,12 +86,11 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
83
86
|
* This returns a random port which is not closing.
|
|
84
87
|
*/
|
|
85
88
|
protected getRandomWrappedPort(): Promise<WrappedSyncPort | undefined>;
|
|
86
|
-
waitForStatus(status: SyncStatusOptions): Promise<void>;
|
|
87
89
|
waitUntilStatusMatches(predicate: (status: SyncStatus) => boolean): Promise<void>;
|
|
88
90
|
waitForReady(): Promise<void>;
|
|
89
91
|
private collectActiveSubscriptions;
|
|
90
92
|
updateSubscriptions(port: WrappedSyncPort, subscriptions: SubscribedStream[]): void;
|
|
91
|
-
setLogLevel(level:
|
|
93
|
+
setLogLevel(level: number): void;
|
|
92
94
|
/**
|
|
93
95
|
* Configures the DBAdapter connection and a streaming sync client.
|
|
94
96
|
*/
|
|
@@ -100,7 +102,7 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
100
102
|
* The connection will simply be reconnected whenever a new tab
|
|
101
103
|
* connects.
|
|
102
104
|
*/
|
|
103
|
-
connect(options
|
|
105
|
+
connect(options: ResolvedSyncOptions, serializedSchema: any): Promise<void>;
|
|
104
106
|
disconnect(): Promise<void>;
|
|
105
107
|
/**
|
|
106
108
|
* Adds a new client tab's message port to the list of connected ports
|
|
@@ -126,9 +128,4 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
126
128
|
*/
|
|
127
129
|
private openInternalDB;
|
|
128
130
|
private generateReconnectableDatabase;
|
|
129
|
-
/**
|
|
130
|
-
* A method to update the all shared statuses for each
|
|
131
|
-
* client.
|
|
132
|
-
*/
|
|
133
|
-
private updateAllStatuses;
|
|
134
131
|
}
|