@powersync/service-core 1.8.1 → 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.
Files changed (68) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/routes/configure-fastify.d.ts +1 -1
  6. package/dist/routes/endpoints/probes.d.ts +2 -2
  7. package/dist/routes/endpoints/probes.js +16 -2
  8. package/dist/routes/endpoints/probes.js.map +1 -1
  9. package/dist/storage/SyncRulesBucketStorage.d.ts +16 -5
  10. package/dist/storage/SyncRulesBucketStorage.js +2 -2
  11. package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
  12. package/dist/storage/WriteCheckpointAPI.d.ts +24 -2
  13. package/dist/storage/WriteCheckpointAPI.js.map +1 -1
  14. package/dist/storage/bson.d.ts +4 -3
  15. package/dist/storage/bson.js +6 -10
  16. package/dist/storage/bson.js.map +1 -1
  17. package/dist/{sync → streams}/BroadcastIterable.js +2 -2
  18. package/dist/streams/BroadcastIterable.js.map +1 -0
  19. package/dist/streams/Demultiplexer.d.ts +52 -0
  20. package/dist/streams/Demultiplexer.js +128 -0
  21. package/dist/streams/Demultiplexer.js.map +1 -0
  22. package/dist/{sync → streams}/LastValueSink.d.ts +2 -2
  23. package/dist/{sync → streams}/LastValueSink.js +2 -2
  24. package/dist/streams/LastValueSink.js.map +1 -0
  25. package/dist/{sync → streams}/merge.js +1 -1
  26. package/dist/streams/merge.js.map +1 -0
  27. package/dist/streams/streams-index.d.ts +4 -0
  28. package/dist/streams/streams-index.js +5 -0
  29. package/dist/streams/streams-index.js.map +1 -0
  30. package/dist/sync/BucketChecksumState.d.ts +7 -2
  31. package/dist/sync/BucketChecksumState.js +61 -40
  32. package/dist/sync/BucketChecksumState.js.map +1 -1
  33. package/dist/sync/sync-index.d.ts +0 -3
  34. package/dist/sync/sync-index.js +0 -3
  35. package/dist/sync/sync-index.js.map +1 -1
  36. package/dist/sync/sync.js +2 -2
  37. package/dist/sync/sync.js.map +1 -1
  38. package/dist/sync/util.d.ts +10 -1
  39. package/dist/sync/util.js +30 -0
  40. package/dist/sync/util.js.map +1 -1
  41. package/package.json +2 -2
  42. package/src/index.ts +3 -0
  43. package/src/routes/endpoints/probes.ts +18 -2
  44. package/src/storage/SyncRulesBucketStorage.ts +18 -7
  45. package/src/storage/WriteCheckpointAPI.ts +28 -2
  46. package/src/storage/bson.ts +10 -12
  47. package/src/{sync → streams}/BroadcastIterable.ts +2 -2
  48. package/src/streams/Demultiplexer.ts +165 -0
  49. package/src/{sync → streams}/LastValueSink.ts +2 -2
  50. package/src/{sync → streams}/merge.ts +1 -1
  51. package/src/streams/streams-index.ts +4 -0
  52. package/src/sync/BucketChecksumState.ts +71 -55
  53. package/src/sync/sync-index.ts +0 -3
  54. package/src/sync/sync.ts +2 -2
  55. package/src/sync/util.ts +34 -1
  56. package/test/src/broadcast_iterable.test.ts +8 -8
  57. package/test/src/demultiplexer.test.ts +205 -0
  58. package/test/src/merge_iterable.test.ts +1 -1
  59. package/test/src/routes/probes.integration.test.ts +5 -5
  60. package/test/src/routes/probes.test.ts +5 -4
  61. package/test/src/sync/BucketChecksumState.test.ts +14 -13
  62. package/test/src/util.test.ts +48 -0
  63. package/tsconfig.tsbuildinfo +1 -1
  64. package/dist/sync/BroadcastIterable.js.map +0 -1
  65. package/dist/sync/LastValueSink.js.map +0 -1
  66. package/dist/sync/merge.js.map +0 -1
  67. /package/dist/{sync → streams}/BroadcastIterable.d.ts +0 -0
  68. /package/dist/{sync → streams}/merge.d.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
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
+
17
+ ## 1.9.0
18
+
19
+ ### Minor Changes
20
+
21
+ - f049f68: [Postgres] Only flush once per replicated chunk, increasing transaction replication throughput.
22
+
23
+ ### Patch Changes
24
+
25
+ - 8601d6c: [MySQL] Fix errors being hidden by ROLLBACK failure
26
+
3
27
  ## 1.8.1
4
28
 
5
29
  ### Patch 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,IAAI,EAAE;QAClB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEvC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAElD,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
+ {"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, SqliteJsonValue } from '@powersync/service-sync-rules';
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: SqliteJsonValue[][]): Promise<SqliteJsonRow[]>;
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
- watchWriteCheckpoint(options: WatchWriteCheckpointOptions): AsyncIterable<StorageCheckpointUpdate>;
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
- updatedParameterBucketDefinitions: string[];
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
- updatedParameterBucketDefinitions: [],
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":"AAmQA,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,kBAAkB,EAAE,EAAE;IACtB,qBAAqB,EAAE,IAAI;IAC3B,iCAAiC,EAAE,EAAE;IACrC,0BAA0B,EAAE,IAAI;CACjC,CAAC"}
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;AAwED,MAAM,CAAC,MAAM,6BAA6B,GAAG,mBAAmB,CAAC,OAAO,CAAC"}
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"}
@@ -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: SqliteJsonValue[]) => NodeBuffer;
18
- export declare const serializeLookup: (lookup: SqliteJsonValue[]) => bson.Binary;
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.
@@ -17,21 +17,17 @@ export const BSON_DESERIALIZE_DATA_OPTIONS = {
17
17
  * @param lookup
18
18
  */
19
19
  export const serializeLookupBuffer = (lookup) => {
20
- const normalized = lookup.map((value) => {
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 getLookupBucketDefinitionName = (lookup) => {
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bson.js","sourceRoot":"","sources":["../../src/storage/bson.ts"],"names":[],"mappings":"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"}
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.next(doc);
50
+ sink.write(doc);
51
51
  }
52
52
  }
53
53
  // End of stream
54
54
  for (let sink of sinks) {
55
- sink.complete();
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
- next(value: T): void;
13
- complete(): void;
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
- next(value) {
17
+ write(value) {
18
18
  this.push({
19
19
  value,
20
20
  done: false,
21
21
  error: undefined
22
22
  });
23
23
  }
24
- complete() {
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 './safeRace.js';
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,4 @@
1
+ export * from './merge.js';
2
+ export * from './Demultiplexer.js';
3
+ export * from './LastValueSink.js';
4
+ export * from './BroadcastIterable.js';
@@ -0,0 +1,5 @@
1
+ export * from './merge.js';
2
+ export * from './Demultiplexer.js';
3
+ export * from './LastValueSink.js';
4
+ export * from './BroadcastIterable.js';
5
+ //# sourceMappingURL=streams-index.js.map
@@ -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> | null;
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 | null>;
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 {};