@powersync/service-core 1.9.0 → 1.10.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/CHANGELOG.md +14 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/routes/configure-fastify.d.ts +1 -1
- package/dist/routes/endpoints/probes.d.ts +2 -2
- package/dist/routes/endpoints/probes.js +16 -2
- package/dist/routes/endpoints/probes.js.map +1 -1
- package/dist/storage/SyncRulesBucketStorage.d.ts +16 -5
- package/dist/storage/SyncRulesBucketStorage.js +2 -2
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
- package/dist/storage/WriteCheckpointAPI.d.ts +24 -2
- package/dist/storage/WriteCheckpointAPI.js.map +1 -1
- package/dist/storage/bson.d.ts +4 -3
- package/dist/storage/bson.js +6 -10
- package/dist/storage/bson.js.map +1 -1
- package/dist/{sync → streams}/BroadcastIterable.js +2 -2
- package/dist/streams/BroadcastIterable.js.map +1 -0
- package/dist/streams/Demultiplexer.d.ts +52 -0
- package/dist/streams/Demultiplexer.js +128 -0
- package/dist/streams/Demultiplexer.js.map +1 -0
- package/dist/{sync → streams}/LastValueSink.d.ts +2 -2
- package/dist/{sync → streams}/LastValueSink.js +2 -2
- package/dist/streams/LastValueSink.js.map +1 -0
- package/dist/{sync → streams}/merge.js +1 -1
- package/dist/streams/merge.js.map +1 -0
- package/dist/streams/streams-index.d.ts +4 -0
- package/dist/streams/streams-index.js +5 -0
- package/dist/streams/streams-index.js.map +1 -0
- package/dist/sync/BucketChecksumState.d.ts +7 -2
- package/dist/sync/BucketChecksumState.js +61 -40
- package/dist/sync/BucketChecksumState.js.map +1 -1
- package/dist/sync/sync-index.d.ts +0 -3
- package/dist/sync/sync-index.js +0 -3
- package/dist/sync/sync-index.js.map +1 -1
- package/dist/sync/sync.js +2 -2
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.d.ts +10 -1
- package/dist/sync/util.js +30 -0
- package/dist/sync/util.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +3 -0
- package/src/routes/endpoints/probes.ts +18 -2
- package/src/storage/SyncRulesBucketStorage.ts +18 -7
- package/src/storage/WriteCheckpointAPI.ts +28 -2
- package/src/storage/bson.ts +10 -12
- package/src/{sync → streams}/BroadcastIterable.ts +2 -2
- package/src/streams/Demultiplexer.ts +165 -0
- package/src/{sync → streams}/LastValueSink.ts +2 -2
- package/src/{sync → streams}/merge.ts +1 -1
- package/src/streams/streams-index.ts +4 -0
- package/src/sync/BucketChecksumState.ts +71 -55
- package/src/sync/sync-index.ts +0 -3
- package/src/sync/sync.ts +2 -2
- package/src/sync/util.ts +34 -1
- package/test/src/broadcast_iterable.test.ts +8 -8
- package/test/src/demultiplexer.test.ts +205 -0
- package/test/src/merge_iterable.test.ts +1 -1
- package/test/src/routes/probes.integration.test.ts +5 -5
- package/test/src/routes/probes.test.ts +5 -4
- package/test/src/sync/BucketChecksumState.test.ts +14 -13
- package/test/src/util.test.ts +48 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/sync/BroadcastIterable.js.map +0 -1
- package/dist/sync/LastValueSink.js.map +0 -1
- package/dist/sync/merge.js.map +0 -1
- /package/dist/{sync → streams}/BroadcastIterable.d.ts +0 -0
- /package/dist/{sync → streams}/merge.d.ts +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @powersync/service-core
|
|
2
2
|
|
|
3
|
+
## 1.10.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 833e8f2: [MongoDB Storage] Stream write checkpoint changes instead of polling, reducing overhead for large numbers of concurrent connections
|
|
8
|
+
- bfece49: Cache parameter queries and buckets to reduce incremental sync overhead
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- 833e8f2: [Postgres Storage] Fix issue when creating custom write checkpoints
|
|
13
|
+
- 2cb5252: Minor improvement to the HTTP liveness probe. The liveness probe will return an HTTP `200` response code when running in the `API` mode. Any HTTP response in the `API` mode indicates the service is running. When running in the `UNIFIED` mode the HTTP response code is `200` if the last `touched_at` timestamp value is less than 10 seconds ago - this indicates the replication worker is running.
|
|
14
|
+
- Updated dependencies [bfece49]
|
|
15
|
+
- @powersync/service-sync-rules@0.25.0
|
|
16
|
+
|
|
3
17
|
## 1.9.0
|
|
4
18
|
|
|
5
19
|
### Minor Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -23,3 +23,5 @@ export * from './system/system-index.js';
|
|
|
23
23
|
export * as system from './system/system-index.js';
|
|
24
24
|
export * from './util/util-index.js';
|
|
25
25
|
export * as utils from './util/util-index.js';
|
|
26
|
+
export * from './streams/streams-index.js';
|
|
27
|
+
export * as streams from './streams/streams-index.js';
|
package/dist/index.js
CHANGED
|
@@ -25,4 +25,6 @@ export * from './system/system-index.js';
|
|
|
25
25
|
export * as system from './system/system-index.js';
|
|
26
26
|
export * from './util/util-index.js';
|
|
27
27
|
export * as utils from './util/util-index.js';
|
|
28
|
+
export * from './streams/streams-index.js';
|
|
29
|
+
export * as streams from './streams/streams-index.js';
|
|
28
30
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAEzC,cAAc,oBAAoB,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C,cAAc,wBAAwB,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAEhD,oDAAoD;AACpD,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAC;AAE/D,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,cAAc,kCAAkC,CAAC;AACjD,OAAO,KAAK,UAAU,MAAM,kCAAkC,CAAC;AAE/D,cAAc,4BAA4B,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAEtD,cAAc,oCAAoC,CAAC;AACnD,OAAO,KAAK,WAAW,MAAM,oCAAoC,CAAC;AAElE,cAAc,0BAA0B,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AAEnD,cAAc,4BAA4B,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAEtD,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C,cAAc,0BAA0B,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AAEnD,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAEzC,cAAc,oBAAoB,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C,cAAc,wBAAwB,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAEhD,oDAAoD;AACpD,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAC;AAE/D,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,cAAc,kCAAkC,CAAC;AACjD,OAAO,KAAK,UAAU,MAAM,kCAAkC,CAAC;AAE/D,cAAc,4BAA4B,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAEtD,cAAc,oCAAoC,CAAC;AACnD,OAAO,KAAK,WAAW,MAAM,oCAAoC,CAAC;AAElE,cAAc,0BAA0B,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AAEnD,cAAc,4BAA4B,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAEtD,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C,cAAc,0BAA0B,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AAEnD,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAE9C,cAAc,4BAA4B,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC"}
|
|
@@ -591,7 +591,7 @@ export declare const DEFAULT_ROUTE_OPTIONS: {
|
|
|
591
591
|
}>>> & {
|
|
592
592
|
path: import("./endpoints/probes.js").ProbeRoutes;
|
|
593
593
|
method: import("@powersync/lib-services-framework").HTTPMethod.GET;
|
|
594
|
-
handler: () => Promise<import("@powersync/lib-services-framework").RouterResponse<{
|
|
594
|
+
handler: (params: import("./router.js").RequestEndpointHandlerPayload<unknown, import("./router.js").Context, import("./router.js").BasicRouterRequest>) => Promise<import("@powersync/lib-services-framework").RouterResponse<{
|
|
595
595
|
ready: boolean;
|
|
596
596
|
started: boolean;
|
|
597
597
|
touched_at: Date;
|
|
@@ -32,7 +32,7 @@ export declare const livenessCheck: router.Endpoint<unknown, router.RouterRespon
|
|
|
32
32
|
}>>> & {
|
|
33
33
|
path: ProbeRoutes;
|
|
34
34
|
method: router.HTTPMethod.GET;
|
|
35
|
-
handler: () => Promise<router.RouterResponse<{
|
|
35
|
+
handler: (params: import("../router.js").RequestEndpointHandlerPayload<unknown, import("../router.js").Context, import("../router.js").BasicRouterRequest>) => Promise<router.RouterResponse<{
|
|
36
36
|
ready: boolean;
|
|
37
37
|
started: boolean;
|
|
38
38
|
touched_at: Date;
|
|
@@ -66,7 +66,7 @@ export declare const PROBES_ROUTES: (router.Endpoint<unknown, router.RouterRespo
|
|
|
66
66
|
}>>> & {
|
|
67
67
|
path: ProbeRoutes;
|
|
68
68
|
method: router.HTTPMethod.GET;
|
|
69
|
-
handler: () => Promise<router.RouterResponse<{
|
|
69
|
+
handler: (params: import("../router.js").RequestEndpointHandlerPayload<unknown, import("../router.js").Context, import("../router.js").BasicRouterRequest>) => Promise<router.RouterResponse<{
|
|
70
70
|
ready: boolean;
|
|
71
71
|
started: boolean;
|
|
72
72
|
touched_at: Date;
|
|
@@ -22,10 +22,24 @@ export const startupCheck = routeDefinition({
|
|
|
22
22
|
export const livenessCheck = routeDefinition({
|
|
23
23
|
path: ProbeRoutes.LIVENESS,
|
|
24
24
|
method: router.HTTPMethod.GET,
|
|
25
|
-
handler: async () => {
|
|
25
|
+
handler: async (params) => {
|
|
26
26
|
const state = container.probes.state();
|
|
27
|
+
/**
|
|
28
|
+
* The HTTP probes currently only function in the API and UNIFIED
|
|
29
|
+
* modes.
|
|
30
|
+
*
|
|
31
|
+
* For the API mode, we don't really touch the state, but any response from
|
|
32
|
+
* the request indicates the service is alive.
|
|
33
|
+
*
|
|
34
|
+
* For the UNIFIED mode we update the touched_at time while the Replicator engine is running.
|
|
35
|
+
* If the replication engine is present and the timeDifference from the last
|
|
36
|
+
* touched_at is large, we report that the service is not live.
|
|
37
|
+
*
|
|
38
|
+
* This is only an incremental improvement. In future these values should be configurable.
|
|
39
|
+
*/
|
|
40
|
+
const isAPIOnly = !params.context.service_context.replicationEngine;
|
|
27
41
|
const timeDifference = Date.now() - state.touched_at.getTime();
|
|
28
|
-
const status = timeDifference < 10000 ? 200 : 400;
|
|
42
|
+
const status = isAPIOnly ? 200 : timeDifference < 10000 ? 200 : 400;
|
|
29
43
|
return new router.RouterResponse({
|
|
30
44
|
status,
|
|
31
45
|
data: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probes.js","sourceRoot":"","sources":["../../../src/routes/endpoints/probes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,0CAA2B,CAAA;IAC3B,4CAA6B,CAAA;IAC7B,8CAA+B,CAAA;AACjC,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;IAC1C,IAAI,EAAE,WAAW,CAAC,OAAO;IACzB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG;IAC7B,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEvC,OAAO,IAAI,MAAM,CAAC,cAAc,CAAC;YAC/B,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACjC,IAAI,EAAE;gBACJ,GAAG,KAAK;aACT;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;IAC3C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG;IAC7B,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"probes.js","sourceRoot":"","sources":["../../../src/routes/endpoints/probes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,0CAA2B,CAAA;IAC3B,4CAA6B,CAAA;IAC7B,8CAA+B,CAAA;AACjC,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;IAC1C,IAAI,EAAE,WAAW,CAAC,OAAO;IACzB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG;IAC7B,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEvC,OAAO,IAAI,MAAM,CAAC,cAAc,CAAC;YAC/B,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACjC,IAAI,EAAE;gBACJ,GAAG,KAAK;aACT;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;IAC3C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG;IAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEvC;;;;;;;;;;;;WAYG;QAEH,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC;QACpE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAE/D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAEpE,OAAO,IAAI,MAAM,CAAC,cAAc,CAAC;YAC/B,MAAM;YACN,IAAI,EAAE;gBACJ,GAAG,KAAK;aACT;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;IAC5C,IAAI,EAAE,WAAW,CAAC,SAAS;IAC3B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG;IAC7B,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEvC,OAAO,IAAI,MAAM,CAAC,cAAc,CAAC;YAC/B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YAC/B,IAAI,EAAE;gBACJ,GAAG,KAAK;aACT;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ObserverClient } from '@powersync/lib-services-framework';
|
|
2
|
-
import { SqlSyncRules, SqliteJsonRow
|
|
2
|
+
import { ParameterLookup, SqlSyncRules, SqliteJsonRow } from '@powersync/service-sync-rules';
|
|
3
3
|
import * as util from '../util/util-index.js';
|
|
4
4
|
import { BucketStorageBatch, FlushedResult } from './BucketStorageBatch.js';
|
|
5
5
|
import { BucketStorageFactory } from './BucketStorageFactory.js';
|
|
@@ -51,14 +51,24 @@ export interface SyncRulesBucketStorage extends ObserverClient<SyncRulesBucketSt
|
|
|
51
51
|
/**
|
|
52
52
|
* Used to resolve "dynamic" parameter queries.
|
|
53
53
|
*/
|
|
54
|
-
getParameterSets(checkpoint: util.InternalOpId, lookups:
|
|
54
|
+
getParameterSets(checkpoint: util.InternalOpId, lookups: ParameterLookup[]): Promise<SqliteJsonRow[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Given two checkpoints, return the changes in bucket data and parameters that may have occurred
|
|
57
|
+
* in that period.
|
|
58
|
+
*
|
|
59
|
+
* This is a best-effort optimization:
|
|
60
|
+
* 1. This may include more changes than what actually occurred.
|
|
61
|
+
* 2. This may return invalidateDataBuckets or invalidateParameterBuckets instead of of returning
|
|
62
|
+
* specific changes.
|
|
63
|
+
* @param options
|
|
64
|
+
*/
|
|
55
65
|
getCheckpointChanges(options: GetCheckpointChangesOptions): Promise<CheckpointChanges>;
|
|
56
66
|
/**
|
|
57
67
|
* Yields the latest user write checkpoint whenever the sync checkpoint updates.
|
|
58
68
|
*
|
|
59
69
|
* The stream stops or errors if this is not the active sync rules (anymore).
|
|
60
70
|
*/
|
|
61
|
-
|
|
71
|
+
watchCheckpointChanges(options: WatchWriteCheckpointOptions): AsyncIterable<StorageCheckpointUpdate>;
|
|
62
72
|
/**
|
|
63
73
|
* Get a "batch" of data for a checkpoint.
|
|
64
74
|
*
|
|
@@ -199,9 +209,10 @@ export interface GetCheckpointChangesOptions {
|
|
|
199
209
|
nextCheckpoint: util.InternalOpId;
|
|
200
210
|
}
|
|
201
211
|
export interface CheckpointChanges {
|
|
202
|
-
updatedDataBuckets: string
|
|
212
|
+
updatedDataBuckets: Set<string>;
|
|
203
213
|
invalidateDataBuckets: boolean;
|
|
204
|
-
|
|
214
|
+
/** Serialized using JSONBig */
|
|
215
|
+
updatedParameterLookups: Set<string>;
|
|
205
216
|
invalidateParameterBuckets: boolean;
|
|
206
217
|
}
|
|
207
218
|
export declare const CHECKPOINT_INVALIDATE_ALL: CheckpointChanges;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const CHECKPOINT_INVALIDATE_ALL = {
|
|
2
|
-
updatedDataBuckets:
|
|
2
|
+
updatedDataBuckets: new Set(),
|
|
3
3
|
invalidateDataBuckets: true,
|
|
4
|
-
|
|
4
|
+
updatedParameterLookups: new Set(),
|
|
5
5
|
invalidateParameterBuckets: true
|
|
6
6
|
};
|
|
7
7
|
//# sourceMappingURL=SyncRulesBucketStorage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncRulesBucketStorage.js","sourceRoot":"","sources":["../../src/storage/SyncRulesBucketStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SyncRulesBucketStorage.js","sourceRoot":"","sources":["../../src/storage/SyncRulesBucketStorage.ts"],"names":[],"mappings":"AA8QA,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,kBAAkB,EAAE,IAAI,GAAG,EAAU;IACrC,qBAAqB,EAAE,IAAI;IAC3B,uBAAuB,EAAE,IAAI,GAAG,EAAU;IAC1C,0BAA0B,EAAE,IAAI;CACjC,CAAC"}
|
|
@@ -44,9 +44,32 @@ export interface ManagedWriteCheckpointFilters extends BaseWriteCheckpointIdenti
|
|
|
44
44
|
*/
|
|
45
45
|
heads: Record<string, string>;
|
|
46
46
|
}
|
|
47
|
+
export interface WriteCheckpointResult {
|
|
48
|
+
/**
|
|
49
|
+
* Write checkpoint id (also referred to as client_id).
|
|
50
|
+
*
|
|
51
|
+
* If null, there is no write checkpoint for the client.
|
|
52
|
+
*/
|
|
53
|
+
id: bigint | null;
|
|
54
|
+
/**
|
|
55
|
+
* LSN for the checkpoint.
|
|
56
|
+
*
|
|
57
|
+
* This will change when we support multiple connections.
|
|
58
|
+
*
|
|
59
|
+
* For managed write checkpoints, this LSN must be exceeded by the checkpoint / replication head to be valid.
|
|
60
|
+
*
|
|
61
|
+
* For custom write checkpoints, this will be null, and the write checkpoint is valid for all LSNs.
|
|
62
|
+
*/
|
|
63
|
+
lsn: string | null;
|
|
64
|
+
}
|
|
47
65
|
export type ManagedWriteCheckpointOptions = ManagedWriteCheckpointFilters;
|
|
48
66
|
export type SyncStorageLastWriteCheckpointFilters = BaseWriteCheckpointIdentifier | ManagedWriteCheckpointFilters;
|
|
49
67
|
export type LastWriteCheckpointFilters = CustomWriteCheckpointFilters | ManagedWriteCheckpointFilters;
|
|
68
|
+
export interface WatchUserWriteCheckpointOptions {
|
|
69
|
+
user_id: string;
|
|
70
|
+
sync_rules_id: number;
|
|
71
|
+
signal: AbortSignal;
|
|
72
|
+
}
|
|
50
73
|
export interface BaseWriteCheckpointAPI {
|
|
51
74
|
readonly writeCheckpointMode: WriteCheckpointMode;
|
|
52
75
|
setWriteCheckpointMode(mode: WriteCheckpointMode): void;
|
|
@@ -59,7 +82,6 @@ export interface BaseWriteCheckpointAPI {
|
|
|
59
82
|
*/
|
|
60
83
|
export interface SyncStorageWriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
61
84
|
batchCreateCustomWriteCheckpoints(checkpoints: BatchedCustomWriteCheckpointOptions[]): Promise<void>;
|
|
62
|
-
createCustomWriteCheckpoint(checkpoint: BatchedCustomWriteCheckpointOptions): Promise<bigint>;
|
|
63
85
|
lastWriteCheckpoint(filters: SyncStorageLastWriteCheckpointFilters): Promise<bigint | null>;
|
|
64
86
|
}
|
|
65
87
|
/**
|
|
@@ -68,7 +90,7 @@ export interface SyncStorageWriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
|
68
90
|
*/
|
|
69
91
|
export interface WriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
70
92
|
batchCreateCustomWriteCheckpoints(checkpoints: CustomWriteCheckpointOptions[]): Promise<void>;
|
|
71
|
-
createCustomWriteCheckpoint(checkpoint: CustomWriteCheckpointOptions): Promise<bigint>;
|
|
72
93
|
lastWriteCheckpoint(filters: LastWriteCheckpointFilters): Promise<bigint | null>;
|
|
94
|
+
watchUserWriteCheckpoint(options: WatchUserWriteCheckpointOptions): AsyncIterable<WriteCheckpointResult>;
|
|
73
95
|
}
|
|
74
96
|
export declare const DEFAULT_WRITE_CHECKPOINT_MODE = WriteCheckpointMode.MANAGED;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteCheckpointAPI.js","sourceRoot":"","sources":["../../src/storage/WriteCheckpointAPI.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAYX;AAZD,WAAY,mBAAmB;IAC7B;;;OAGG;IACH,wCAAiB,CAAA;IACjB;;;;OAIG;IACH,0CAAmB,CAAA;AACrB,CAAC,EAZW,mBAAmB,KAAnB,mBAAmB,QAY9B;
|
|
1
|
+
{"version":3,"file":"WriteCheckpointAPI.js","sourceRoot":"","sources":["../../src/storage/WriteCheckpointAPI.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAYX;AAZD,WAAY,mBAAmB;IAC7B;;;OAGG;IACH,wCAAiB,CAAA;IACjB;;;;OAIG;IACH,0CAAmB,CAAA;AACrB,CAAC,EAZW,mBAAmB,KAAnB,mBAAmB,QAY9B;AAkGD,MAAM,CAAC,MAAM,6BAA6B,GAAG,mBAAmB,CAAC,OAAO,CAAC"}
|
package/dist/storage/bson.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as bson from 'bson';
|
|
2
|
-
import { SqliteJsonValue } from '@powersync/service-sync-rules';
|
|
2
|
+
import { ParameterLookup, SqliteJsonValue } from '@powersync/service-sync-rules';
|
|
3
3
|
import { ReplicaId } from './BucketStorageBatch.js';
|
|
4
4
|
type NodeBuffer = Buffer<ArrayBuffer>;
|
|
5
5
|
/**
|
|
@@ -14,8 +14,9 @@ export declare const BSON_DESERIALIZE_DATA_OPTIONS: bson.DeserializeOptions;
|
|
|
14
14
|
* Lookup serialization must be number-agnostic. I.e. normalize numbers, instead of preserving numbers.
|
|
15
15
|
* @param lookup
|
|
16
16
|
*/
|
|
17
|
-
export declare const serializeLookupBuffer: (lookup:
|
|
18
|
-
export declare const serializeLookup: (lookup:
|
|
17
|
+
export declare const serializeLookupBuffer: (lookup: ParameterLookup) => NodeBuffer;
|
|
18
|
+
export declare const serializeLookup: (lookup: ParameterLookup) => bson.Binary;
|
|
19
|
+
export declare const deserializeParameterLookup: (lookup: bson.Binary) => SqliteJsonValue[];
|
|
19
20
|
export declare const getLookupBucketDefinitionName: (lookup: bson.Binary) => string;
|
|
20
21
|
/**
|
|
21
22
|
* True if this is a bson.UUID.
|
package/dist/storage/bson.js
CHANGED
|
@@ -17,21 +17,17 @@ export const BSON_DESERIALIZE_DATA_OPTIONS = {
|
|
|
17
17
|
* @param lookup
|
|
18
18
|
*/
|
|
19
19
|
export const serializeLookupBuffer = (lookup) => {
|
|
20
|
-
|
|
21
|
-
if (typeof value == 'number' && Number.isInteger(value)) {
|
|
22
|
-
return BigInt(value);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
return bson.serialize({ l: normalized });
|
|
20
|
+
return bson.serialize({ l: lookup.values });
|
|
29
21
|
};
|
|
30
22
|
export const serializeLookup = (lookup) => {
|
|
31
23
|
return new bson.Binary(serializeLookupBuffer(lookup));
|
|
32
24
|
};
|
|
33
|
-
export const
|
|
25
|
+
export const deserializeParameterLookup = (lookup) => {
|
|
34
26
|
const parsed = bson.deserialize(lookup.buffer, BSON_DESERIALIZE_INTERNAL_OPTIONS).l;
|
|
27
|
+
return parsed;
|
|
28
|
+
};
|
|
29
|
+
export const getLookupBucketDefinitionName = (lookup) => {
|
|
30
|
+
const parsed = deserializeParameterLookup(lookup);
|
|
35
31
|
return parsed[0];
|
|
36
32
|
};
|
|
37
33
|
/**
|
package/dist/storage/bson.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bson.js","sourceRoot":"","sources":["../../src/storage/bson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAA4B;IACxE,6BAA6B;IAC7B,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAA4B;IACpE,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"bson.js","sourceRoot":"","sources":["../../src/storage/bson.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,12 +47,12 @@ export class BroadcastIterable {
|
|
|
47
47
|
}
|
|
48
48
|
this.last = doc;
|
|
49
49
|
for (let sink of sinks) {
|
|
50
|
-
sink.
|
|
50
|
+
sink.write(doc);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
// End of stream
|
|
54
54
|
for (let sink of sinks) {
|
|
55
|
-
sink.
|
|
55
|
+
sink.end();
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
catch (e) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BroadcastIterable.js","sourceRoot":"","sources":["../../src/streams/BroadcastIterable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface DemultiplexerValue<T> {
|
|
2
|
+
/**
|
|
3
|
+
* The key used for demultiplexing, for example the user id.
|
|
4
|
+
*/
|
|
5
|
+
key: string;
|
|
6
|
+
/**
|
|
7
|
+
* The stream value.
|
|
8
|
+
*/
|
|
9
|
+
value: T;
|
|
10
|
+
}
|
|
11
|
+
export interface DemultiplexerSource<T> {
|
|
12
|
+
/**
|
|
13
|
+
* The async iterator providing a stream of values.
|
|
14
|
+
*/
|
|
15
|
+
iterator: AsyncIterable<DemultiplexerValue<T>>;
|
|
16
|
+
/**
|
|
17
|
+
* Fetches the first value for a given key.
|
|
18
|
+
*
|
|
19
|
+
* This is used to get an initial value for each subscription.
|
|
20
|
+
*/
|
|
21
|
+
getFirstValue(key: string): Promise<T>;
|
|
22
|
+
}
|
|
23
|
+
export type DemultiplexerSourceFactory<T> = (signal: AbortSignal) => DemultiplexerSource<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Takes a multiplexed stream (e.g. a changestream covering many individual users),
|
|
26
|
+
* and allows subscribing to individual streams.
|
|
27
|
+
*
|
|
28
|
+
* The source subscription is lazy:
|
|
29
|
+
* 1. We only start subscribing when there is a downstream subscriber.
|
|
30
|
+
* 2. When all downstream subscriptions have ended, we end the source subscription.
|
|
31
|
+
*
|
|
32
|
+
* For each subscriber, if backpressure builds up, we only keep the _last_ value.
|
|
33
|
+
*/
|
|
34
|
+
export declare class Demultiplexer<T> {
|
|
35
|
+
private source;
|
|
36
|
+
private subscribers;
|
|
37
|
+
private abortController;
|
|
38
|
+
private currentSource;
|
|
39
|
+
constructor(source: DemultiplexerSourceFactory<T>);
|
|
40
|
+
private start;
|
|
41
|
+
private loop;
|
|
42
|
+
private removeSink;
|
|
43
|
+
private addSink;
|
|
44
|
+
/**
|
|
45
|
+
* Subscribe to a specific stream.
|
|
46
|
+
*
|
|
47
|
+
* @param key The key used for demultiplexing, e.g. user id.
|
|
48
|
+
* @param signal
|
|
49
|
+
*/
|
|
50
|
+
subscribe(key: string, signal: AbortSignal): AsyncIterable<T>;
|
|
51
|
+
get active(): boolean;
|
|
52
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { AbortError } from 'ix/aborterror.js';
|
|
2
|
+
import { LastValueSink } from './LastValueSink.js';
|
|
3
|
+
/**
|
|
4
|
+
* Takes a multiplexed stream (e.g. a changestream covering many individual users),
|
|
5
|
+
* and allows subscribing to individual streams.
|
|
6
|
+
*
|
|
7
|
+
* The source subscription is lazy:
|
|
8
|
+
* 1. We only start subscribing when there is a downstream subscriber.
|
|
9
|
+
* 2. When all downstream subscriptions have ended, we end the source subscription.
|
|
10
|
+
*
|
|
11
|
+
* For each subscriber, if backpressure builds up, we only keep the _last_ value.
|
|
12
|
+
*/
|
|
13
|
+
export class Demultiplexer {
|
|
14
|
+
source;
|
|
15
|
+
subscribers = undefined;
|
|
16
|
+
abortController = undefined;
|
|
17
|
+
currentSource = undefined;
|
|
18
|
+
constructor(source) {
|
|
19
|
+
this.source = source;
|
|
20
|
+
}
|
|
21
|
+
start(filter, sink) {
|
|
22
|
+
const abortController = new AbortController();
|
|
23
|
+
const listeners = new Map();
|
|
24
|
+
listeners.set(filter, new Set([sink]));
|
|
25
|
+
this.abortController = abortController;
|
|
26
|
+
this.subscribers = listeners;
|
|
27
|
+
const source = this.source(abortController.signal);
|
|
28
|
+
this.currentSource = source;
|
|
29
|
+
this.loop(source, abortController, listeners);
|
|
30
|
+
return source;
|
|
31
|
+
}
|
|
32
|
+
async loop(source, abortController, sinks) {
|
|
33
|
+
try {
|
|
34
|
+
for await (let doc of source.iterator) {
|
|
35
|
+
if (abortController.signal.aborted || sinks.size == 0) {
|
|
36
|
+
throw new AbortError();
|
|
37
|
+
}
|
|
38
|
+
const key = doc.key;
|
|
39
|
+
const keySinks = sinks.get(key);
|
|
40
|
+
if (keySinks == null) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
for (let sink of keySinks) {
|
|
44
|
+
sink.write(doc.value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// End of stream
|
|
48
|
+
for (let keySinks of sinks.values()) {
|
|
49
|
+
for (let sink of keySinks) {
|
|
50
|
+
sink.end();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
// Just in case the error is not from the source
|
|
56
|
+
abortController.abort();
|
|
57
|
+
for (let keySinks of sinks.values()) {
|
|
58
|
+
for (let sink of keySinks) {
|
|
59
|
+
sink.error(e);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
// Clear state, so that a new subscription may be started
|
|
65
|
+
if (this.subscribers === sinks) {
|
|
66
|
+
this.subscribers = undefined;
|
|
67
|
+
this.abortController = undefined;
|
|
68
|
+
this.currentSource = undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
removeSink(key, sink) {
|
|
73
|
+
const existing = this.subscribers?.get(key);
|
|
74
|
+
if (existing == null) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
existing.delete(sink);
|
|
78
|
+
if (existing.size == 0) {
|
|
79
|
+
this.subscribers.delete(key);
|
|
80
|
+
}
|
|
81
|
+
if (this.subscribers?.size == 0) {
|
|
82
|
+
// This is not immediate - there may be a delay until it is fully stopped,
|
|
83
|
+
// depending on the underlying source.
|
|
84
|
+
this.abortController?.abort();
|
|
85
|
+
this.subscribers = undefined;
|
|
86
|
+
this.abortController = undefined;
|
|
87
|
+
this.currentSource = undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
addSink(key, sink) {
|
|
91
|
+
if (this.currentSource == null) {
|
|
92
|
+
return this.start(key, sink);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const existing = this.subscribers.get(key);
|
|
96
|
+
if (existing != null) {
|
|
97
|
+
existing.add(sink);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.subscribers.set(key, new Set([sink]));
|
|
101
|
+
}
|
|
102
|
+
return this.currentSource;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Subscribe to a specific stream.
|
|
107
|
+
*
|
|
108
|
+
* @param key The key used for demultiplexing, e.g. user id.
|
|
109
|
+
* @param signal
|
|
110
|
+
*/
|
|
111
|
+
async *subscribe(key, signal) {
|
|
112
|
+
const sink = new LastValueSink(undefined);
|
|
113
|
+
// Important that we register the sink before calling getFirstValue().
|
|
114
|
+
const source = this.addSink(key, sink);
|
|
115
|
+
try {
|
|
116
|
+
const firstValue = await source.getFirstValue(key);
|
|
117
|
+
yield firstValue;
|
|
118
|
+
yield* sink.withSignal(signal);
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
this.removeSink(key, sink);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
get active() {
|
|
125
|
+
return this.subscribers != null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=Demultiplexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Demultiplexer.js","sourceRoot":"","sources":["../../src/streams/Demultiplexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,8 @@ export declare class LastValueSink<T> implements AsyncIterable<T> {
|
|
|
9
9
|
buffer: NextResult<T> | undefined;
|
|
10
10
|
nextResolve: undefined | (() => void);
|
|
11
11
|
constructor(initial: T | undefined);
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
write(value: T): void;
|
|
13
|
+
end(): void;
|
|
14
14
|
error(e: any): void;
|
|
15
15
|
private push;
|
|
16
16
|
withSignal(signal?: AbortSignal): AsyncIterable<T>;
|
|
@@ -14,14 +14,14 @@ export class LastValueSink {
|
|
|
14
14
|
this.buffer = { value: initial, done: false, error: undefined };
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
write(value) {
|
|
18
18
|
this.push({
|
|
19
19
|
value,
|
|
20
20
|
done: false,
|
|
21
21
|
error: undefined
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
|
|
24
|
+
end() {
|
|
25
25
|
this.push({
|
|
26
26
|
value: undefined,
|
|
27
27
|
done: true,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LastValueSink.js","sourceRoot":"","sources":["../../src/streams/LastValueSink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACxB,MAAM,CAA4B;IAClC,WAAW,CAA2B;IAEtC,YAAY,OAAsB;QAChC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAQ;QACZ,IAAI,CAAC,IAAI,CAAC;YACR,KAAK;YACL,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,GAAG;QACD,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,CAAM;QACV,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,CAAgB;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CAAC,MAAoB;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,CAAC,IAAI,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,UAAU,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,IAAI,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAC5C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;gBAC7B,CAAC,CAAC,CAAC;gBACH,MAAM,OAAO,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAO,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YAExB,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACZ,MAAM,CAAC,CAAC,KAAK,CAAC;YAChB,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC,KAAM,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { throwIfAborted } from 'ix/aborterror.js';
|
|
2
2
|
import { AsyncIterableX } from 'ix/asynciterable/index.js';
|
|
3
3
|
import { wrapWithAbort } from 'ix/asynciterable/operators/withabort.js';
|
|
4
|
-
import { safeRace } from '
|
|
4
|
+
import { safeRace } from '../sync/safeRace.js';
|
|
5
5
|
/**
|
|
6
6
|
* Merge multiple source AsyncIterables into one output AsyncIterable.
|
|
7
7
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/streams/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streams-index.js","sourceRoot":"","sources":["../../src/streams/streams-index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC"}
|
|
@@ -58,6 +58,7 @@ export declare class BucketChecksumState {
|
|
|
58
58
|
hasMore: boolean;
|
|
59
59
|
}): void;
|
|
60
60
|
}
|
|
61
|
+
declare const INVALIDATE_ALL_BUCKETS: unique symbol;
|
|
61
62
|
export interface CheckpointUpdate {
|
|
62
63
|
/**
|
|
63
64
|
* All buckets forming part of the checkpoint.
|
|
@@ -68,7 +69,7 @@ export interface CheckpointUpdate {
|
|
|
68
69
|
*
|
|
69
70
|
* If null, assume that any bucket in `buckets` may have been updated.
|
|
70
71
|
*/
|
|
71
|
-
updatedBuckets: Set<string> |
|
|
72
|
+
updatedBuckets: Set<string> | typeof INVALIDATE_ALL_BUCKETS;
|
|
72
73
|
}
|
|
73
74
|
export declare class BucketParameterState {
|
|
74
75
|
private readonly context;
|
|
@@ -77,8 +78,11 @@ export declare class BucketParameterState {
|
|
|
77
78
|
readonly syncParams: RequestParameters;
|
|
78
79
|
private readonly querier;
|
|
79
80
|
private readonly staticBuckets;
|
|
81
|
+
private cachedDynamicBuckets;
|
|
82
|
+
private cachedDynamicBucketSet;
|
|
83
|
+
private readonly lookups;
|
|
80
84
|
constructor(context: SyncContext, bucketStorage: BucketChecksumStateStorage, syncRules: SqlSyncRules, syncParams: RequestParameters);
|
|
81
|
-
getCheckpointUpdate(checkpoint: storage.StorageCheckpointUpdate): Promise<CheckpointUpdate
|
|
85
|
+
getCheckpointUpdate(checkpoint: storage.StorageCheckpointUpdate): Promise<CheckpointUpdate>;
|
|
82
86
|
/**
|
|
83
87
|
* For static buckets, we can keep track of which buckets have been updated.
|
|
84
88
|
*/
|
|
@@ -93,3 +97,4 @@ export interface CheckpointLine {
|
|
|
93
97
|
bucketsToFetch: BucketDescription[];
|
|
94
98
|
}
|
|
95
99
|
export type BucketChecksumStateStorage = Pick<storage.SyncRulesBucketStorage, 'getChecksums' | 'getParameterSets'>;
|
|
100
|
+
export {};
|