@powersync/web 2.1.1 → 2.3.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 +1 -1
- package/dist/index.react_native_web.js +224 -121
- package/dist/index.react_native_web.js.map +1 -1
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +1 -1
- package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -1
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +1 -1
- package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -1
- package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +1 -1
- package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js +2 -0
- package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-DDFgWP93.js.map +1 -1
- package/dist/worker/mc-wa-sqlite-async-lGclTjKJ.js.map +1 -1
- package/dist/worker/wa-sqlite-B0tZMM0j.js.map +1 -1
- package/dist/worker/wa-sqlite-async-CM6BmfRh.js.map +1 -1
- package/dist/worker/worker.js +1 -1
- package/dist/worker/worker.js.map +1 -1
- package/lib/db/PowerSyncDatabase.d.ts +1 -2
- package/lib/db/PowerSyncDatabase.js +19 -24
- package/lib/db/PowerSyncDatabase.js.map +1 -1
- package/lib/db/adapters/AsyncWebAdapter.js +4 -55
- package/lib/db/adapters/AsyncWebAdapter.js.map +1 -1
- package/lib/db/adapters/acquireFromPool.d.ts +7 -0
- package/lib/db/adapters/acquireFromPool.js +60 -0
- package/lib/db/adapters/acquireFromPool.js.map +1 -0
- package/lib/db/adapters/memory-pool/client.d.ts +70 -0
- package/lib/db/adapters/memory-pool/client.js +269 -0
- package/lib/db/adapters/memory-pool/client.js.map +1 -0
- package/lib/db/adapters/memory-pool/shared.d.ts +51 -0
- package/lib/db/adapters/memory-pool/shared.js +16 -0
- package/lib/db/adapters/memory-pool/shared.js.map +1 -0
- package/lib/db/adapters/memory-pool/vfs.d.ts +19 -0
- package/lib/db/adapters/memory-pool/vfs.js +247 -0
- package/lib/db/adapters/memory-pool/vfs.js.map +1 -0
- package/lib/db/adapters/memory-pool/worker.d.ts +1 -0
- package/lib/db/adapters/memory-pool/worker.js +45 -0
- package/lib/db/adapters/memory-pool/worker.js.map +1 -0
- package/lib/db/adapters/options.d.ts +7 -0
- package/lib/db/adapters/options.js.map +1 -1
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.d.ts +8 -0
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js +56 -5
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -1
- package/lib/db/adapters/wa-sqlite/StatementCache.d.ts +16 -0
- package/lib/db/adapters/wa-sqlite/StatementCache.js +44 -0
- package/lib/db/adapters/wa-sqlite/StatementCache.js.map +1 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +7 -4
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -1
- package/lib/db/sync/SSRWebStreamingSyncImplementation.d.ts +1 -8
- package/lib/db/sync/SSRWebStreamingSyncImplementation.js +3 -12
- package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -1
- package/lib/db/sync/SharedWebStreamingSyncImplementation.d.ts +2 -1
- package/lib/db/sync/SharedWebStreamingSyncImplementation.js +6 -4
- package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -1
- package/lib/worker/db/MultiDatabaseServer.d.ts +1 -2
- package/lib/worker/db/MultiDatabaseServer.js +28 -17
- package/lib/worker/db/MultiDatabaseServer.js.map +1 -1
- package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +1 -0
- package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -1
- package/lib/worker/sync/SharedSyncImplementation.d.ts +3 -11
- package/lib/worker/sync/SharedSyncImplementation.js +32 -64
- package/lib/worker/sync/SharedSyncImplementation.js.map +1 -1
- package/lib/worker/sync/WorkerClient.d.ts +1 -1
- package/lib/worker/sync/WorkerClient.js +3 -3
- package/lib/worker/sync/WorkerClient.js.map +1 -1
- package/package.json +15 -8
- package/src/db/PowerSyncDatabase.ts +20 -24
- package/src/db/adapters/AsyncWebAdapter.ts +13 -61
- package/src/db/adapters/acquireFromPool.ts +73 -0
- package/src/db/adapters/memory-pool/client.ts +367 -0
- package/src/db/adapters/memory-pool/shared.ts +79 -0
- package/src/db/adapters/memory-pool/vfs.ts +293 -0
- package/src/db/adapters/memory-pool/worker.ts +53 -0
- package/src/db/adapters/options.ts +8 -0
- package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +71 -6
- package/src/db/adapters/wa-sqlite/StatementCache.ts +50 -0
- package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +17 -5
- package/src/db/sync/SSRWebStreamingSyncImplementation.ts +4 -14
- package/src/db/sync/SharedWebStreamingSyncImplementation.ts +8 -5
- package/src/worker/db/MultiDatabaseServer.ts +29 -21
- package/src/worker/sync/AbstractSharedSyncClientProvider.ts +1 -0
- package/src/worker/sync/SharedSyncImplementation.ts +41 -76
- package/src/worker/sync/WorkerClient.ts +4 -4
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +0 -2
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +0 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export class PreparedStatementCache {
|
|
2
|
+
#size;
|
|
3
|
+
// Note that Map preserves insertion order, which allows using it as an LRU
|
|
4
|
+
// cache (with the first element being the first element to evict).
|
|
5
|
+
#statements = new Map();
|
|
6
|
+
constructor(size) {
|
|
7
|
+
this.#size = size;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Attempts to look up the cached sql statement, if it's currently cached.
|
|
11
|
+
*/
|
|
12
|
+
lookup(sql) {
|
|
13
|
+
const foundStatement = this.#statements.get(sql);
|
|
14
|
+
if (foundStatement != null) {
|
|
15
|
+
// Delete and re-insert to move to the end (most-recently-used position).
|
|
16
|
+
this.#statements.delete(sql);
|
|
17
|
+
this.#statements.set(sql, foundStatement);
|
|
18
|
+
return foundStatement;
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Adds a new statement into the cache.
|
|
24
|
+
*
|
|
25
|
+
* If that exceeds the target size of the statement cache, returns an old statement to evict.
|
|
26
|
+
* The caller is responsible for freeing that statement.
|
|
27
|
+
*/
|
|
28
|
+
addStatement(sql, statement) {
|
|
29
|
+
this.#statements.set(sql, statement);
|
|
30
|
+
if (this.#statements.size > this.#size) {
|
|
31
|
+
for (const [k, v] of this.#statements.entries()) {
|
|
32
|
+
this.#statements.delete(k);
|
|
33
|
+
return v;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
drain() {
|
|
39
|
+
const values = [...this.#statements.values()];
|
|
40
|
+
this.#statements.clear();
|
|
41
|
+
return values;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=StatementCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatementCache.js","sourceRoot":"","sources":["../../../../src/db/adapters/wa-sqlite/StatementCache.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,sBAAsB;IACxB,KAAK,CAAS;IACvB,2EAA2E;IAC3E,mEAAmE;IAC1D,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,YAAY,IAAY;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,yEAAyE;YACzE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAC1C,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAW,EAAE,SAAiB;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -49,7 +49,7 @@ export class WASQLiteOpenFactory {
|
|
|
49
49
|
return this.openAdapter();
|
|
50
50
|
}
|
|
51
51
|
async openConnection() {
|
|
52
|
-
const { enableMultiTabs, useWebWorker, vfs, dbFilename, encryptionKey, temporaryStorage, cacheSizeKb } = this.options;
|
|
52
|
+
const { enableMultiTabs, useWebWorker, vfs, dbFilename, encryptionKey, temporaryStorage, cacheSizeKb, preparedStatementsCache } = this.options;
|
|
53
53
|
if (!enableMultiTabs) {
|
|
54
54
|
this.logger.log({ level: LogLevels.warn, message: 'Multiple tabs are not enabled in this browser' });
|
|
55
55
|
}
|
|
@@ -63,7 +63,9 @@ export class WASQLiteOpenFactory {
|
|
|
63
63
|
vfs,
|
|
64
64
|
encryptionKey,
|
|
65
65
|
temporaryStorage,
|
|
66
|
-
cacheSizeKb
|
|
66
|
+
cacheSizeKb,
|
|
67
|
+
// TODO: Enable prepared statement cache by default?
|
|
68
|
+
preparedStatementsCache: preparedStatementsCache ?? 0
|
|
67
69
|
};
|
|
68
70
|
}
|
|
69
71
|
if (useWebWorker) {
|
|
@@ -112,10 +114,11 @@ export class WASQLiteOpenFactory {
|
|
|
112
114
|
// This VFS supports concurrent reads, so we can open additional workers to host read-only connections for
|
|
113
115
|
// concurrent reads / writes.
|
|
114
116
|
const additionalReadersCount = this.options.additionalReaders ?? 1;
|
|
117
|
+
const additionalReaderPromises = [];
|
|
115
118
|
for (let i = 0; i < additionalReadersCount; i++) {
|
|
116
|
-
|
|
117
|
-
additionalReaders.push(reader);
|
|
119
|
+
additionalReaderPromises.push(openDatabaseWorker(true));
|
|
118
120
|
}
|
|
121
|
+
additionalReaders.push(...(await Promise.all(additionalReaderPromises)));
|
|
119
122
|
}
|
|
120
123
|
}
|
|
121
124
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WASQLiteOpenFactory.js","sourceRoot":"","sources":["../../../../src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAmC,MAAM,mBAAmB,CAAC;AAC1F,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,cAAc,EAAwB,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAkB,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAoB,MAAM,2BAA2B,CAAC;AAOvG;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACtB,OAAO,CAA4B;IACnC,MAAM,CAAkB;IAEhC,YAAY,OAAmC;QAC7C,IAAI,CAAC,OAAO,GAAG,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEvD,kEAAkE;QAClE,MAAM,SAAS,GAAG,iBAAiB,GAAG,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,GAAG,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAES,WAAW;QACnB,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM;QACJ,MAAM,EAAE,iBAAiB,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAErE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oBACd,KAAK,EAAE,SAAS,CAAC,IAAI;oBACrB,OAAO,EAAE;;;4EAGyD;iBACnE,CAAC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBACd,KAAK,EAAE,SAAS,CAAC,IAAI;gBACrB,OAAO,EAAE,uGAAuG;aACjH,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"WASQLiteOpenFactory.js","sourceRoot":"","sources":["../../../../src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,14 +24,6 @@ export declare class SSRStreamingSyncImplementation extends BaseObserver impleme
|
|
|
24
24
|
* This will never resolve in SSR Mode.
|
|
25
25
|
*/
|
|
26
26
|
waitUntilStatusMatches(_predicate: (status: SyncStatus) => boolean): Promise<void>;
|
|
27
|
-
/**
|
|
28
|
-
* Returns a placeholder checkpoint. This should not be used.
|
|
29
|
-
*/
|
|
30
|
-
getWriteCheckpoint(): Promise<string>;
|
|
31
|
-
/**
|
|
32
|
-
* The SSR mode adapter will never complete syncing.
|
|
33
|
-
*/
|
|
34
|
-
hasCompletedSync(): Promise<boolean>;
|
|
35
27
|
/**
|
|
36
28
|
* This is a no-op in SSR mode.
|
|
37
29
|
*/
|
|
@@ -44,4 +36,5 @@ export declare class SSRStreamingSyncImplementation extends BaseObserver impleme
|
|
|
44
36
|
* No-op in SSR mode.
|
|
45
37
|
*/
|
|
46
38
|
markConnectionMayHaveChanged(): void;
|
|
39
|
+
requestCheckpoint(): Promise<bigint>;
|
|
47
40
|
}
|
|
@@ -34,18 +34,6 @@ export class SSRStreamingSyncImplementation extends BaseObserver {
|
|
|
34
34
|
waitUntilStatusMatches(_predicate) {
|
|
35
35
|
return new Promise(() => { });
|
|
36
36
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Returns a placeholder checkpoint. This should not be used.
|
|
39
|
-
*/
|
|
40
|
-
async getWriteCheckpoint() {
|
|
41
|
-
return '1';
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* The SSR mode adapter will never complete syncing.
|
|
45
|
-
*/
|
|
46
|
-
async hasCompletedSync() {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
37
|
/**
|
|
50
38
|
* This is a no-op in SSR mode.
|
|
51
39
|
*/
|
|
@@ -58,5 +46,8 @@ export class SSRStreamingSyncImplementation extends BaseObserver {
|
|
|
58
46
|
* No-op in SSR mode.
|
|
59
47
|
*/
|
|
60
48
|
markConnectionMayHaveChanged() { }
|
|
49
|
+
requestCheckpoint() {
|
|
50
|
+
throw new Error('Sub sync implementation does not support request checkpoints');
|
|
51
|
+
}
|
|
61
52
|
}
|
|
62
53
|
//# sourceMappingURL=SSRWebStreamingSyncImplementation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SSRWebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/SSRWebStreamingSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAc,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAA4C,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAExG,MAAM,OAAO,8BAA+B,SAAQ,YAAY;IAC9D,SAAS,CAAQ;IACjB,SAAS,CAAQ;IAEjB,WAAW,CAAU;IACrB,YAAY,CAAoB;IAEhC;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,UAAU,CAAI,WAA2B;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAClF,OAAO,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,KAAK,CAAC,OAAO,KAAI,CAAC;IAElB;;OAEG;IACH,KAAK,CAAC,UAAU,KAAmB,CAAC;IAEpC;;OAEG;IACH,KAAK,CAAC,YAAY,KAAI,CAAC;IAEvB;;OAEG;IACH,sBAAsB,CAAC,UAA2C;QAChE,OAAO,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,
|
|
1
|
+
{"version":3,"file":"SSRWebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/SSRWebStreamingSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAc,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAA4C,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAExG,MAAM,OAAO,8BAA+B,SAAQ,YAAY;IAC9D,SAAS,CAAQ;IACjB,SAAS,CAAQ;IAEjB,WAAW,CAAU;IACrB,YAAY,CAAoB;IAEhC;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,UAAU,CAAI,WAA2B;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAClF,OAAO,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,KAAK,CAAC,OAAO,KAAI,CAAC;IAElB;;OAEG;IACH,KAAK,CAAC,UAAU,KAAmB,CAAC;IAEpC;;OAEG;IACH,KAAK,CAAC,YAAY,KAAI,CAAC;IAEvB;;OAEG;IACH,sBAAsB,CAAC,UAA2C;QAChE,OAAO,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,iBAAiB,KAAI,CAAC;IAEtB;;OAEG;IACH,mBAAmB,KAAU,CAAC;IAE9B;;OAEG;IACH,4BAA4B,KAAU,CAAC;IAEvC,iBAAiB;QACf,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;CACF"}
|
|
@@ -19,6 +19,7 @@ declare class SharedSyncClientProvider extends AbstractSharedSyncClientProvider
|
|
|
19
19
|
invalidateCredentials(): void;
|
|
20
20
|
fetchCredentials(): Promise<PowerSyncCredentials | null>;
|
|
21
21
|
uploadCrud(): Promise<void>;
|
|
22
|
+
postCheckpointRequest(clientId: string, requestId: string): Promise<string | null>;
|
|
22
23
|
get logger(): import("@powersync/common").PowerSyncLogger;
|
|
23
24
|
log(record: LogRecord): void;
|
|
24
25
|
}
|
|
@@ -47,9 +48,9 @@ export declare class SharedWebStreamingSyncImplementation extends WebStreamingSy
|
|
|
47
48
|
*/
|
|
48
49
|
connect(options: ResolvedSyncOptions): Promise<void>;
|
|
49
50
|
disconnect(): Promise<void>;
|
|
50
|
-
getWriteCheckpoint(): Promise<string>;
|
|
51
51
|
dispose(): Promise<void>;
|
|
52
52
|
waitForReady(): Promise<void>;
|
|
53
|
+
requestCheckpoint(): Promise<bigint>;
|
|
53
54
|
updateSubscriptions(subscriptions: SubscribedStream[]): void;
|
|
54
55
|
}
|
|
55
56
|
export {};
|
|
@@ -48,6 +48,9 @@ class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
|
|
|
48
48
|
*/
|
|
49
49
|
await this.options.uploadCrud();
|
|
50
50
|
}
|
|
51
|
+
async postCheckpointRequest(clientId, requestId) {
|
|
52
|
+
return await this.options.postCheckpointRequest(clientId, requestId);
|
|
53
|
+
}
|
|
51
54
|
get logger() {
|
|
52
55
|
return this.options.logger;
|
|
53
56
|
}
|
|
@@ -147,10 +150,6 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem
|
|
|
147
150
|
await this.waitForReady();
|
|
148
151
|
return this.syncManager.disconnect();
|
|
149
152
|
}
|
|
150
|
-
async getWriteCheckpoint() {
|
|
151
|
-
await this.waitForReady();
|
|
152
|
-
return this.syncManager.getWriteCheckpoint();
|
|
153
|
-
}
|
|
154
153
|
async dispose() {
|
|
155
154
|
await this.waitForReady();
|
|
156
155
|
await new Promise((resolve) => {
|
|
@@ -179,6 +178,9 @@ export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplem
|
|
|
179
178
|
async waitForReady() {
|
|
180
179
|
return this.isInitialized;
|
|
181
180
|
}
|
|
181
|
+
requestCheckpoint() {
|
|
182
|
+
return this.syncManager.requestCheckpoint();
|
|
183
|
+
}
|
|
182
184
|
updateSubscriptions(subscriptions) {
|
|
183
185
|
this.syncManager.updateSubscriptions(subscriptions);
|
|
184
186
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharedWebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/SharedWebStreamingSyncImplementation.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SharedWebStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/db/sync/SharedWebStreamingSyncImplementation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,OAAO,EAA2B,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAG/G,OAAO,EACL,8BAA8B,EAE/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAoB,MAAM,wBAAwB,CAAC;AAEpG;;;GAGG;AACH,MAAM,wBAAyB,SAAQ,gCAAgC;IAEzD;IACH;IACG;IAHZ,YACY,OAA8C,EACjD,aAA+C,EAC5C,KAAmB;QAE7B,KAAK,EAAE,CAAC;QAJE,YAAO,GAAP,OAAO,CAAuC;QACjD,kBAAa,GAAb,aAAa,CAAkC;QAC5C,UAAK,GAAL,KAAK,CAAc;IAG/B,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC/D,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD;;;;;WAKG;QACH,OAAO;YACL,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,KAAK,EAAE,WAAW,CAAC,KAAK;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd;;;WAGG;QACH,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAEQ,KAAK,CAAC,qBAAqB,CAAC,QAAgB,EAAE,SAAiB;QACtE,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,MAAiB;QACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;CACF;AAQD;;GAEG;AACH,MAAM,OAAO,oCAAqC,SAAQ,8BAA8B;IAC5E,WAAW,CAA+B;IAC1C,cAAc,CAA2B;IACzC,MAAM,CAAmB;IAEzB,aAAa,CAAgB;IAC7B,SAAS,CAAe;IAC1B,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,QAAQ,CAAS;IACjB,mBAAmB,CAAU;IAErC,YAAY,OAAoD;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;QAEvD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;QACxC,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,GAAG,uBAAuB,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC;gBAC5B,OAAO,EAAE,MAAM;gBACf,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,UAAW;gBAC/C,MAAM,EAAE,IAAI;gBACZ,YAAY,EAAE,UAAU;gBACxB,eAAe,EAAE,OAAO,CAAC,MAAM;aAChC,CAAC,CAAC;QACL,CAAC;QAED;;WAEG;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,wBAAwB,CAChD,IAAI,CAAC,UAAU,EACf,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YACrB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC,EACD,OAAO,CAAC,EAAE,CACX,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpE;;;;WAIG;QACH,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE1D,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC;QAE5D;;;;;WAKG;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAES,KAAK,CAAC,KAAK;QACnB;;;;;;;;;;;;WAYG;QACH,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3E,2DAA2D;QAC3D,MAAM,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAE5D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAEpC,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAC9B;YACE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE;YAC3C,aAAa,EAAE;gBACb,UAAU;gBACV,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB;aAChD;YACD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,EACD,IAAI,CAAC,OAAO,CAAC,aAAa,CAC3B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE1B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,kEAAkE;YAClE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAuB,CAAC;YAExD,sDAAsD;YACtD,WAAW,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAA+B,CAAC;gBACtD,IAAI,OAAO,EAAE,KAAK,KAAK,qBAAqB,CAAC,SAAS,EAAE,CAAC;oBACvD,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,oFAAoF;YACpF,MAAM,mBAAmB,GAA4B;gBACnD,KAAK,EAAE,qBAAqB,CAAC,YAAY;gBACzC,IAAI,EAAE,EAAE;aACT,CAAC;YACF,WAAW,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAE1B,oBAAoB;QACpB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;IAC9C,CAAC;IAED,mBAAmB,CAAC,aAAiC;QACnD,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -10,13 +10,12 @@ export interface ConnectToMultiDatabaseServerOptions {
|
|
|
10
10
|
* Shared state to manage multiple database connections hosted by a worker.
|
|
11
11
|
*/
|
|
12
12
|
export declare class MultiDatabaseServer {
|
|
13
|
+
#private;
|
|
13
14
|
readonly logger: PowerSyncLogger;
|
|
14
|
-
private activeDatabases;
|
|
15
15
|
constructor(logger: PowerSyncLogger);
|
|
16
16
|
handleConnection({ logLevel, database, lockName }: ConnectToMultiDatabaseServerOptions): Promise<ClientConnectionView>;
|
|
17
17
|
connectToExisting(name: string, lockName: string): Promise<ClientConnectionView>;
|
|
18
18
|
openConnectionLocally(logger: PowerSyncLogger, options: RawWaSqliteDatabaseOptions, lockName?: string): Promise<ClientConnectionView>;
|
|
19
|
-
private databaseOpenAttempt;
|
|
20
19
|
closeAll(): Promise<void[]>;
|
|
21
20
|
}
|
|
22
21
|
export declare const isSharedWorker: boolean;
|
|
@@ -5,13 +5,15 @@ import { getNavigatorLocks } from '../../shared/navigator.js';
|
|
|
5
5
|
import { RawSqliteConnection } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
|
|
6
6
|
import { ConcurrentSqliteConnection } from '../../db/adapters/wa-sqlite/ConcurrentConnection.js';
|
|
7
7
|
import { WASQLiteVFS } from '../../db/adapters/wa-sqlite/vfs.js';
|
|
8
|
+
import { Mutex } from '@powersync/shared-internals';
|
|
8
9
|
const OPEN_DB_LOCK = 'open-wasqlite-db';
|
|
9
10
|
/**
|
|
10
11
|
* Shared state to manage multiple database connections hosted by a worker.
|
|
11
12
|
*/
|
|
12
13
|
export class MultiDatabaseServer {
|
|
13
14
|
logger;
|
|
14
|
-
activeDatabases = new Map();
|
|
15
|
+
#activeDatabases = new Map();
|
|
16
|
+
#localOpenLock = new Mutex();
|
|
15
17
|
constructor(logger) {
|
|
16
18
|
this.logger = logger;
|
|
17
19
|
}
|
|
@@ -26,7 +28,7 @@ export class MultiDatabaseServer {
|
|
|
26
28
|
}
|
|
27
29
|
async connectToExisting(name, lockName) {
|
|
28
30
|
return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
|
|
29
|
-
const server = this
|
|
31
|
+
const server = this.#activeDatabases.get(name);
|
|
30
32
|
if (server == null) {
|
|
31
33
|
throw new Error(`connectToExisting(${name}) failed because the worker doesn't own a database with that name.`);
|
|
32
34
|
}
|
|
@@ -40,7 +42,7 @@ export class MultiDatabaseServer {
|
|
|
40
42
|
let server;
|
|
41
43
|
for (let count = 0; count < maxAttempts - 1; count++) {
|
|
42
44
|
try {
|
|
43
|
-
server = await this
|
|
45
|
+
server = await this.#databaseOpenAttempt(logger, options);
|
|
44
46
|
}
|
|
45
47
|
catch (error) {
|
|
46
48
|
this.logger.log({
|
|
@@ -52,19 +54,20 @@ export class MultiDatabaseServer {
|
|
|
52
54
|
}
|
|
53
55
|
}
|
|
54
56
|
// Final attempt if we haven't been able to open the server - rethrow errors if we still can't open.
|
|
55
|
-
server ??= await this
|
|
57
|
+
server ??= await this.#databaseOpenAttempt(logger, options);
|
|
56
58
|
return server.connect(lockName);
|
|
57
59
|
}
|
|
58
|
-
async databaseOpenAttempt(logger, options) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
async #databaseOpenAttempt(logger, options) {
|
|
61
|
+
const { filename, readonly, vfs } = options;
|
|
62
|
+
// We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
|
|
63
|
+
// For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
|
|
64
|
+
// fine). In-memory databases either run in a shared worker or aren't shared across tabs at all, so the internal
|
|
65
|
+
// lock is enough.
|
|
66
|
+
const needsNavigatorLocks = !(isSharedWorker || readonly || vfs == WASQLiteVFS.InMemoryVfs);
|
|
67
|
+
const activeDatabases = this.#activeDatabases;
|
|
68
|
+
async function openDatabase() {
|
|
69
|
+
let server = activeDatabases.get(filename);
|
|
62
70
|
if (server == null) {
|
|
63
|
-
// We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
|
|
64
|
-
// For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
|
|
65
|
-
// fine). In-memory databases either run in a shared worker or aren't shared across tabs at all, so the internal
|
|
66
|
-
// lock is enough.
|
|
67
|
-
const needsNavigatorLocks = !(isSharedWorker || readonly || vfs == WASQLiteVFS.InMemoryVfs);
|
|
68
71
|
const connection = new RawSqliteConnection(options);
|
|
69
72
|
const withSafeConcurrency = new ConcurrentSqliteConnection(connection, needsNavigatorLocks);
|
|
70
73
|
// Initializing the RawSqliteConnection will run some pragmas that might write to the database file, so we want
|
|
@@ -80,19 +83,27 @@ export class MultiDatabaseServer {
|
|
|
80
83
|
throw e;
|
|
81
84
|
}
|
|
82
85
|
returnLease();
|
|
83
|
-
const onClose = () =>
|
|
86
|
+
const onClose = () => activeDatabases.delete(filename);
|
|
84
87
|
server = new DatabaseServer({
|
|
85
88
|
inner: withSafeConcurrency,
|
|
86
89
|
logger,
|
|
87
90
|
onClose
|
|
88
91
|
});
|
|
89
|
-
|
|
92
|
+
activeDatabases.set(filename, server);
|
|
90
93
|
}
|
|
91
94
|
return server;
|
|
92
|
-
}
|
|
95
|
+
}
|
|
96
|
+
if (needsNavigatorLocks) {
|
|
97
|
+
return getNavigatorLocks().request(OPEN_DB_LOCK, openDatabase);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Even if we don't need navigator locks, this avoids a race between the activeDatabases.get() call, the async
|
|
101
|
+
// open logic and the final activeDatabases.set() step.
|
|
102
|
+
return this.#localOpenLock.runExclusive(openDatabase);
|
|
103
|
+
}
|
|
93
104
|
}
|
|
94
105
|
closeAll() {
|
|
95
|
-
const existingDatabases = [...this
|
|
106
|
+
const existingDatabases = [...this.#activeDatabases.values()];
|
|
96
107
|
return Promise.all(existingDatabases.map((db) => {
|
|
97
108
|
db.forceClose();
|
|
98
109
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiDatabaseServer.js","sourceRoot":"","sources":["../../../src/worker/db/MultiDatabaseServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAwB,cAAc,EAAE,MAAM,+CAA+C,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAA8B,MAAM,oDAAoD,CAAC;AACrH,OAAO,EAAE,0BAA0B,EAAE,MAAM,qDAAqD,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"MultiDatabaseServer.js","sourceRoot":"","sources":["../../../src/worker/db/MultiDatabaseServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export declare abstract class AbstractSharedSyncClientProvider {
|
|
|
7
7
|
abstract fetchCredentials(): Promise<PowerSyncCredentials | null>;
|
|
8
8
|
abstract invalidateCredentials(): void;
|
|
9
9
|
abstract uploadCrud(): Promise<void>;
|
|
10
|
+
abstract postCheckpointRequest(clientId: string, requestId: string): Promise<string | null>;
|
|
10
11
|
abstract statusChanged(status: SyncStatusJson): void;
|
|
11
12
|
abstract getDBWorkerPort(): Promise<MessagePort>;
|
|
12
13
|
abstract log(record: LogRecord): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractSharedSyncClientProvider.js","sourceRoot":"","sources":["../../../src/worker/sync/AbstractSharedSyncClientProvider.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAgB,gCAAgC;
|
|
1
|
+
{"version":3,"file":"AbstractSharedSyncClientProvider.js","sourceRoot":"","sources":["../../../src/worker/sync/AbstractSharedSyncClientProvider.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAgB,gCAAgC;CASrD"}
|
|
@@ -28,7 +28,7 @@ export type ManualSharedSyncPayload = {
|
|
|
28
28
|
* @internal
|
|
29
29
|
*/
|
|
30
30
|
export type SharedSyncInitOptions = {
|
|
31
|
-
streamOptions: Omit<WebStreamingSyncImplementationOptions, 'adapter' | 'uploadCrud' | 'remote' | 'subscriptions' | 'logger'>;
|
|
31
|
+
streamOptions: Omit<WebStreamingSyncImplementationOptions, 'adapter' | 'uploadCrud' | 'postCheckpointRequest' | 'remote' | 'subscriptions' | 'logger'>;
|
|
32
32
|
dbParams: ResolvedWebSQLOpenOptions;
|
|
33
33
|
enableBroadcastLogs: boolean;
|
|
34
34
|
};
|
|
@@ -49,23 +49,15 @@ export type WrappedSyncPort = {
|
|
|
49
49
|
closeListeners: (() => void | Promise<void>)[];
|
|
50
50
|
isClosing: boolean;
|
|
51
51
|
};
|
|
52
|
-
/**
|
|
53
|
-
* @internal
|
|
54
|
-
*/
|
|
55
|
-
export type RemoteOperationAbortController = {
|
|
56
|
-
controller: AbortController;
|
|
57
|
-
activePort: WrappedSyncPort;
|
|
58
|
-
};
|
|
59
52
|
/**
|
|
60
53
|
* @internal
|
|
61
54
|
* Shared sync implementation which runs inside a shared webworker
|
|
62
55
|
*/
|
|
63
56
|
export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImplementationListener> {
|
|
57
|
+
#private;
|
|
64
58
|
protected ports: WrappedSyncPort[];
|
|
65
59
|
protected isInitialized: Promise<void>;
|
|
66
60
|
protected statusListener?: () => void;
|
|
67
|
-
protected fetchCredentialsController?: RemoteOperationAbortController;
|
|
68
|
-
protected uploadDataController?: RemoteOperationAbortController;
|
|
69
61
|
protected syncParams: SharedSyncInitOptions | null;
|
|
70
62
|
protected lastConnectOptions: ResolvedSyncOptions | undefined;
|
|
71
63
|
protected portMutex: Mutex;
|
|
@@ -120,7 +112,7 @@ export declare class SharedSyncImplementation extends BaseObserver<SharedSyncImp
|
|
|
120
112
|
*/
|
|
121
113
|
removePort(port: WrappedSyncPort): Promise<() => void>;
|
|
122
114
|
triggerCrudUpload(): void;
|
|
123
|
-
|
|
115
|
+
requestCheckpoint(): Promise<bigint>;
|
|
124
116
|
protected withSyncImplementation<T>(callback: (sync: StreamingSyncImplementation) => Promise<T>): Promise<T>;
|
|
125
117
|
protected generateStreamingImplementation(): WebStreamingSyncImplementation;
|
|
126
118
|
/**
|
|
@@ -33,8 +33,6 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
33
33
|
ports;
|
|
34
34
|
isInitialized;
|
|
35
35
|
statusListener;
|
|
36
|
-
fetchCredentialsController;
|
|
37
|
-
uploadDataController;
|
|
38
36
|
syncParams;
|
|
39
37
|
lastConnectOptions;
|
|
40
38
|
portMutex;
|
|
@@ -224,15 +222,6 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
224
222
|
const trackedPort = this.ports[index];
|
|
225
223
|
// Remove from the list of active ports
|
|
226
224
|
this.ports.splice(index, 1);
|
|
227
|
-
/**
|
|
228
|
-
* The port might currently be in use. Any active functions might
|
|
229
|
-
* not resolve. Abort them here.
|
|
230
|
-
*/
|
|
231
|
-
[this.fetchCredentialsController, this.uploadDataController].forEach((abortController) => {
|
|
232
|
-
if (abortController?.activePort == port) {
|
|
233
|
-
abortController.controller.abort(new AbortOperation('Closing pending requests after client port is removed'));
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
225
|
// Close the worker wrapped database connection, we can't accurately rely on this connection
|
|
237
226
|
for (const closeListener of trackedPort.closeListeners) {
|
|
238
227
|
await closeListener();
|
|
@@ -246,10 +235,8 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
246
235
|
sync.triggerCrudUpload();
|
|
247
236
|
});
|
|
248
237
|
}
|
|
249
|
-
|
|
250
|
-
return this.withSyncImplementation(
|
|
251
|
-
return sync.getWriteCheckpoint();
|
|
252
|
-
});
|
|
238
|
+
requestCheckpoint() {
|
|
239
|
+
return this.withSyncImplementation((sync) => sync.requestCheckpoint());
|
|
253
240
|
}
|
|
254
241
|
async withSyncImplementation(callback) {
|
|
255
242
|
await this.waitForReady();
|
|
@@ -289,57 +276,21 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
289
276
|
this.logger.log({ level: LogLevels.error, message: 'error invalidating credentials', error });
|
|
290
277
|
}
|
|
291
278
|
},
|
|
292
|
-
fetchCredentials:
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
controller: abortController,
|
|
301
|
-
activePort: lastPort
|
|
302
|
-
};
|
|
303
|
-
abortController.signal.onabort = reject;
|
|
304
|
-
try {
|
|
305
|
-
this.logger.log({
|
|
306
|
-
level: LogLevels.info,
|
|
307
|
-
message: 'calling the last port client provider for credentials'
|
|
308
|
-
});
|
|
309
|
-
resolve(await lastPort.clientProvider.fetchCredentials());
|
|
310
|
-
}
|
|
311
|
-
catch (ex) {
|
|
312
|
-
reject(ex);
|
|
313
|
-
}
|
|
314
|
-
finally {
|
|
315
|
-
this.fetchCredentialsController = undefined;
|
|
316
|
-
}
|
|
317
|
-
});
|
|
279
|
+
fetchCredentials: () => {
|
|
280
|
+
return this.#useConnector((port) => {
|
|
281
|
+
this.logger.log({
|
|
282
|
+
level: LogLevels.info,
|
|
283
|
+
message: 'calling the last port client provider for credentials'
|
|
284
|
+
});
|
|
285
|
+
return port.clientProvider.fetchCredentials();
|
|
286
|
+
}, 'fetchCredentials');
|
|
318
287
|
}
|
|
319
288
|
}, this.logger),
|
|
320
|
-
uploadCrud:
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
return new Promise(async (resolve, reject) => {
|
|
326
|
-
const abortController = new AbortController();
|
|
327
|
-
this.uploadDataController = {
|
|
328
|
-
controller: abortController,
|
|
329
|
-
activePort: lastPort
|
|
330
|
-
};
|
|
331
|
-
// Resolving will make it retry
|
|
332
|
-
abortController.signal.onabort = () => resolve();
|
|
333
|
-
try {
|
|
334
|
-
resolve(await lastPort.clientProvider.uploadCrud());
|
|
335
|
-
}
|
|
336
|
-
catch (ex) {
|
|
337
|
-
reject(ex);
|
|
338
|
-
}
|
|
339
|
-
finally {
|
|
340
|
-
this.uploadDataController = undefined;
|
|
341
|
-
}
|
|
342
|
-
});
|
|
289
|
+
uploadCrud: () => {
|
|
290
|
+
return this.#useConnector((port) => port.clientProvider.uploadCrud(), 'uploadCrud');
|
|
291
|
+
},
|
|
292
|
+
postCheckpointRequest: (clientId, requestId) => {
|
|
293
|
+
return this.#useConnector((port) => port.clientProvider.postCheckpointRequest(clientId, requestId), 'postCheckpointRequest');
|
|
343
294
|
},
|
|
344
295
|
...syncParams.streamOptions,
|
|
345
296
|
subscriptions: this.subscriptions,
|
|
@@ -347,6 +298,23 @@ export class SharedSyncImplementation extends BaseObserver {
|
|
|
347
298
|
logger: this.logger
|
|
348
299
|
});
|
|
349
300
|
}
|
|
301
|
+
async #useConnector(inner, debugContext) {
|
|
302
|
+
const lastPort = await this.getLastWrappedPort();
|
|
303
|
+
if (!lastPort) {
|
|
304
|
+
throw new Error(`No client port found for ${debugContext}`);
|
|
305
|
+
}
|
|
306
|
+
return new Promise((resolve, reject) => {
|
|
307
|
+
function portClosed() {
|
|
308
|
+
reject(new Error(`Tab closed while handling ${debugContext}`));
|
|
309
|
+
}
|
|
310
|
+
lastPort.closeListeners.push(portClosed);
|
|
311
|
+
inner(lastPort)
|
|
312
|
+
.then(resolve, reject)
|
|
313
|
+
.finally(() => {
|
|
314
|
+
lastPort.closeListeners.splice(lastPort.closeListeners.indexOf(portClosed), 1);
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
}
|
|
350
318
|
/**
|
|
351
319
|
* Requests a random client to share its database connection with us.
|
|
352
320
|
*/
|