@powersync/service-core 0.0.0-dev-20241001150040 → 0.0.0-dev-20241002111637

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 (121) hide show
  1. package/CHANGELOG.md +10 -5
  2. package/dist/api/diagnostics.js.map +1 -1
  3. package/dist/api/schema.js.map +1 -1
  4. package/dist/auth/CachedKeyCollector.js.map +1 -1
  5. package/dist/auth/KeySpec.js.map +1 -1
  6. package/dist/auth/KeyStore.js.map +1 -1
  7. package/dist/auth/LeakyBucket.js.map +1 -1
  8. package/dist/auth/RemoteJWKSCollector.d.ts +0 -2
  9. package/dist/auth/RemoteJWKSCollector.js.map +1 -1
  10. package/dist/db/mongo.js +3 -5
  11. package/dist/db/mongo.js.map +1 -1
  12. package/dist/entry/cli-entry.js.map +1 -1
  13. package/dist/entry/commands/compact-action.js.map +1 -1
  14. package/dist/entry/commands/migrate-action.js.map +1 -1
  15. package/dist/entry/commands/teardown-action.js.map +1 -1
  16. package/dist/locks/MongoLocks.js.map +1 -1
  17. package/dist/metrics/Metrics.js.map +1 -1
  18. package/dist/migrations/db/migrations/1684951997326-init.js.map +1 -1
  19. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -1
  20. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js.map +1 -1
  21. package/dist/migrations/executor.js.map +1 -1
  22. package/dist/migrations/migrations.js.map +1 -1
  23. package/dist/migrations/store/migration-store.js.map +1 -1
  24. package/dist/modules/ModuleManager.js.map +1 -1
  25. package/dist/replication/AbstractReplicationJob.d.ts +0 -1
  26. package/dist/replication/AbstractReplicator.js.map +1 -1
  27. package/dist/replication/ErrorRateLimiter.d.ts +0 -1
  28. package/dist/replication/ReplicationEngine.js.map +1 -1
  29. package/dist/replication/ReplicationModule.js.map +1 -1
  30. package/dist/routes/RouterEngine.js.map +1 -1
  31. package/dist/routes/auth.js.map +1 -1
  32. package/dist/routes/configure-fastify.d.ts +15 -7
  33. package/dist/routes/configure-rsocket.d.ts +0 -1
  34. package/dist/routes/configure-rsocket.js.map +1 -1
  35. package/dist/routes/endpoints/admin.d.ts +30 -12
  36. package/dist/routes/endpoints/admin.js.map +1 -1
  37. package/dist/routes/endpoints/checkpointing.js.map +1 -1
  38. package/dist/routes/endpoints/socket-route.js.map +1 -1
  39. package/dist/routes/endpoints/sync-rules.js.map +1 -1
  40. package/dist/routes/endpoints/sync-stream.d.ts +0 -1
  41. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  42. package/dist/routes/hooks.js.map +1 -1
  43. package/dist/routes/route-register.js.map +1 -1
  44. package/dist/runner/teardown.js.map +1 -1
  45. package/dist/storage/BucketStorage.d.ts +0 -5
  46. package/dist/storage/BucketStorage.js.map +1 -1
  47. package/dist/storage/ChecksumCache.d.ts +19 -1
  48. package/dist/storage/ChecksumCache.js +8 -1
  49. package/dist/storage/ChecksumCache.js.map +1 -1
  50. package/dist/storage/MongoBucketStorage.d.ts +0 -1
  51. package/dist/storage/MongoBucketStorage.js +1 -1
  52. package/dist/storage/MongoBucketStorage.js.map +1 -1
  53. package/dist/storage/StorageEngine.js.map +1 -1
  54. package/dist/storage/mongo/MongoBucketBatch.d.ts +0 -1
  55. package/dist/storage/mongo/MongoBucketBatch.js +1 -4
  56. package/dist/storage/mongo/MongoBucketBatch.js.map +1 -1
  57. package/dist/storage/mongo/MongoCompactor.js.map +1 -1
  58. package/dist/storage/mongo/MongoIdSequence.js.map +1 -1
  59. package/dist/storage/mongo/MongoPersistedSyncRulesContent.js.map +1 -1
  60. package/dist/storage/mongo/MongoSyncBucketStorage.js +14 -4
  61. package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -1
  62. package/dist/storage/mongo/MongoSyncRulesLock.js.map +1 -1
  63. package/dist/storage/mongo/OperationBatch.js.map +1 -1
  64. package/dist/storage/mongo/PersistedBatch.js.map +1 -1
  65. package/dist/storage/mongo/util.js.map +1 -1
  66. package/dist/storage/storage-index.d.ts +0 -1
  67. package/dist/storage/storage-index.js +0 -1
  68. package/dist/storage/storage-index.js.map +1 -1
  69. package/dist/sync/BroadcastIterable.d.ts +0 -1
  70. package/dist/sync/BroadcastIterable.js.map +1 -1
  71. package/dist/sync/LastValueSink.d.ts +0 -1
  72. package/dist/sync/LastValueSink.js.map +1 -1
  73. package/dist/sync/merge.d.ts +0 -1
  74. package/dist/sync/merge.js.map +1 -1
  75. package/dist/sync/safeRace.js.map +1 -1
  76. package/dist/sync/sync.d.ts +0 -1
  77. package/dist/sync/sync.js.map +1 -1
  78. package/dist/sync/util.d.ts +0 -2
  79. package/dist/sync/util.js.map +1 -1
  80. package/dist/util/Mutex.js.map +1 -1
  81. package/dist/util/config/collectors/config-collector.js.map +1 -1
  82. package/dist/util/config/collectors/impl/base64-config-collector.js.map +1 -1
  83. package/dist/util/config/collectors/impl/filesystem-config-collector.js.map +1 -1
  84. package/dist/util/config/compound-config-collector.js +1 -1
  85. package/dist/util/config/compound-config-collector.js.map +1 -1
  86. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
  87. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
  88. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js.map +1 -1
  89. package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -1
  90. package/dist/util/config.js.map +1 -1
  91. package/dist/util/memory-tracking.js.map +1 -1
  92. package/dist/util/protocol-types.d.ts +0 -65
  93. package/dist/util/protocol-types.js +0 -7
  94. package/dist/util/protocol-types.js.map +1 -1
  95. package/dist/util/secs.js.map +1 -1
  96. package/dist/util/utils.d.ts +2 -1
  97. package/dist/util/utils.js +9 -2
  98. package/dist/util/utils.js.map +1 -1
  99. package/package.json +8 -9
  100. package/src/auth/RemoteJWKSCollector.ts +4 -1
  101. package/src/db/mongo.ts +3 -5
  102. package/src/storage/BucketStorage.ts +0 -5
  103. package/src/storage/ChecksumCache.ts +32 -2
  104. package/src/storage/mongo/MongoBucketBatch.ts +2 -6
  105. package/src/storage/mongo/MongoCompactor.ts +5 -1
  106. package/src/storage/mongo/MongoPersistedSyncRulesContent.ts +4 -1
  107. package/src/storage/mongo/MongoSyncBucketStorage.ts +18 -8
  108. package/src/storage/mongo/MongoSyncRulesLock.ts +6 -2
  109. package/src/storage/mongo/PersistedBatch.ts +4 -1
  110. package/src/storage/storage-index.ts +0 -1
  111. package/src/util/protocol-types.ts +0 -89
  112. package/src/util/utils.ts +11 -3
  113. package/test/src/__snapshots__/sync.test.ts.snap +7 -7
  114. package/test/src/checksum_cache.test.ts +26 -19
  115. package/test/src/compacting.test.ts +81 -0
  116. package/tsconfig.tsbuildinfo +1 -1
  117. package/vitest.config.ts +7 -1
  118. package/dist/storage/mongo/config.d.ts +0 -19
  119. package/dist/storage/mongo/config.js +0 -26
  120. package/dist/storage/mongo/config.js.map +0 -1
  121. package/src/storage/mongo/config.ts +0 -40
@@ -1 +1 @@
1
- {"version":3,"file":"memory-tracking.js","sourceRoot":"","sources":["../../src/util/memory-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,IAAI,YAAY,GAAG;QACjB,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;QAClB,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAsC,CAAC,CAAC,EAAE,EAAE;QACzF,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,YAAY,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;QACzC,MAAM,QAAQ,GAAG,GAAgC,CAAC;QAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAA+B,CAAC;QACxE,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,GAAG,IAAW;YACzC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClD,YAAY,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC;YAC5C,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;KACH;IAED,WAAW,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAElC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;YACrB,IAAI,IAAI,CAAC,GAAG,CAAE,GAAW,CAAC,GAAG,CAAC,GAAI,OAAe,CAAC,GAAG,CAAC,CAAC,GAAG,OAAS,EAAE;gBACnE,WAAW,GAAG,IAAI,CAAC;aACpB;SACF;QAED,IAAI,WAAW,EAAE;YACf,OAAO,GAAG,GAAG,CAAC;YAEd,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;cACzB,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;eAChB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;;kBAEb,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;kBACpB,EAAE,CAAC,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,eAAe,CAAC;iBACjF,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;mBACnB,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;;QAElC,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAE3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACrB;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,EAAE,CAAC,CAAS;IACnB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"memory-tracking.js","sourceRoot":"","sources":["../../src/util/memory-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,IAAI,YAAY,GAAG;QACjB,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;QAClB,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAsC,CAAC,CAAC,EAAE,EAAE;QACzF,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,YAAY,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,GAAgC,CAAC;QAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAA+B,CAAC;QACxE,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,GAAG,IAAW;YACzC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClD,YAAY,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC;YAC5C,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAElC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,GAAG,CAAE,GAAW,CAAC,GAAG,CAAC,GAAI,OAAe,CAAC,GAAG,CAAC,CAAC,GAAG,OAAS,EAAE,CAAC;gBACpE,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,GAAG,GAAG,CAAC;YAEd,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;cACzB,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;eAChB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;;kBAEb,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;kBACpB,EAAE,CAAC,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,eAAe,CAAC;iBACjF,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;mBACnB,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;;QAElC,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAE3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,EAAE,CAAC,CAAS;IACnB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAC5C,CAAC"}
@@ -1,46 +1,5 @@
1
1
  import * as t from 'ts-codec';
2
2
  import { SqliteJsonValue } from '@powersync/service-sync-rules';
3
- /**
4
- * For sync2.json
5
- */
6
- export interface ContinueCheckpointRequest {
7
- /**
8
- * Existing bucket states. Only these buckets are synchronized.
9
- */
10
- buckets: BucketRequest[];
11
- checkpoint_token: string;
12
- limit?: number;
13
- }
14
- export interface SyncNewCheckpointRequest {
15
- /**
16
- * Existing bucket states. Used if include_data is specified.
17
- */
18
- buckets?: BucketRequest[];
19
- request_checkpoint: {
20
- /**
21
- * Whether or not to include an initial data request.
22
- */
23
- include_data: boolean;
24
- /**
25
- * Whether or not to compute a checksum.
26
- */
27
- include_checksum: boolean;
28
- };
29
- limit?: number;
30
- }
31
- export type SyncRequest = ContinueCheckpointRequest | SyncNewCheckpointRequest;
32
- export interface SyncResponse {
33
- /**
34
- * Data for the buckets returned. May not have an an entry for each bucket in the request.
35
- */
36
- data?: SyncBucketData[];
37
- /**
38
- * True if the response limit has been reached, and another request must be made.
39
- */
40
- has_more: boolean;
41
- checkpoint_token?: string;
42
- checkpoint?: Checkpoint;
43
- }
44
3
  export declare const BucketRequest: t.ObjectCodec<{
45
4
  name: t.IdentityCodec<t.CodecType.String>;
46
5
  /**
@@ -160,27 +119,3 @@ export interface BucketChecksum {
160
119
  */
161
120
  count: number;
162
121
  }
163
- export declare function isContinueCheckpointRequest(request: SyncRequest): request is ContinueCheckpointRequest;
164
- export declare function isSyncNewCheckpointRequest(request: SyncRequest): request is SyncNewCheckpointRequest;
165
- /**
166
- * For crud.json
167
- */
168
- export interface CrudRequest {
169
- data: CrudEntry[];
170
- }
171
- export interface CrudEntry {
172
- op: 'PUT' | 'PATCH' | 'DELETE';
173
- type: string;
174
- id: string;
175
- data: string;
176
- }
177
- export interface CrudResponse {
178
- /**
179
- * A sync response with a checkpoint >= this checkpoint would contain all the changes in this request.
180
- *
181
- * Any earlier checkpoint may or may not contain these changes.
182
- *
183
- * May be empty when the request contains no ops.
184
- */
185
- checkpoint?: OpId;
186
- }
@@ -36,11 +36,4 @@ export const StreamingSyncRequest = t.object({
36
36
  */
37
37
  client_id: t.string.optional()
38
38
  });
39
- export function isContinueCheckpointRequest(request) {
40
- return (Array.isArray(request.buckets) &&
41
- typeof request.checkpoint_token == 'string');
42
- }
43
- export function isSyncNewCheckpointRequest(request) {
44
- return typeof request.request_checkpoint == 'object';
45
- }
46
39
  //# sourceMappingURL=protocol-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-types.js","sourceRoot":"","sources":["../../src/util/protocol-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAwD9B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM;IAEd;;OAEG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM;CAChB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;IAE1C;;OAEG;IACH,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAElC;;OAEG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAE9B;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEjC;;OAEG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAgGH,MAAM,UAAU,2BAA2B,CAAC,OAAoB;IAC9D,OAAO,CACL,KAAK,CAAC,OAAO,CAAE,OAAqC,CAAC,OAAO,CAAC;QAC7D,OAAQ,OAAqC,CAAC,gBAAgB,IAAI,QAAQ,CAC3E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAoB;IAC7D,OAAO,OAAQ,OAAoC,CAAC,kBAAkB,IAAI,QAAQ,CAAC;AACrF,CAAC"}
1
+ {"version":3,"file":"protocol-types.js","sourceRoot":"","sources":["../../src/util/protocol-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAG9B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM;IAEd;;OAEG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM;CAChB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;IAE1C;;OAEG;IACH,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAElC;;OAEG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAE9B;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEjC;;OAEG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"secs.js","sourceRoot":"","sources":["../../src/util/secs.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,eAAe;AACf,+CAA+C;AAE/C,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC;AACzB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACtB,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;AACrB,MAAM,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC;AAE1B,MAAM,KAAK,GAAG,qGAAqG,CAAC;AAEpH,eAAe,CAAC,GAAW,EAAU,EAAE;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;KACnD;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEtC,QAAQ,IAAI,EAAE;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,IAAI,CAAC;QACV,KAAK,KAAK,CAAC;QACX,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAClC,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAClC,gBAAgB;QAChB;YACE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;KACnC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"secs.js","sourceRoot":"","sources":["../../src/util/secs.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,eAAe;AACf,+CAA+C;AAE/C,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC;AACzB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACtB,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;AACrB,MAAM,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC;AAE1B,MAAM,KAAK,GAAG,qGAAqG,CAAC;AAEpH,eAAe,CAAC,GAAW,EAAU,EAAE;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEtC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,IAAI,CAAC;QACV,KAAK,KAAK,CAAC;QACX,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAClC,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,GAAG;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAClC,gBAAgB;QAChB;YACE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC,CAAC"}
@@ -2,6 +2,7 @@ import * as sync_rules from '@powersync/service-sync-rules';
2
2
  import * as bson from 'bson';
3
3
  import { BucketChecksum, OpId } from './protocol-types.js';
4
4
  import * as storage from '../storage/storage-index.js';
5
+ import { PartialChecksum } from '../storage/ChecksumCache.js';
5
6
  export type ChecksumMap = Map<string, BucketChecksum>;
6
7
  export declare const ID_NAMESPACE = "a396dd91-09fc-4017-a28d-3df722f651e9";
7
8
  export declare function escapeIdentifier(identifier: string): string;
@@ -13,7 +14,7 @@ export declare function checksumsDiff(previous: ChecksumMap, current: ChecksumMa
13
14
  removedBuckets: string[];
14
15
  };
15
16
  export declare function addChecksums(a: number, b: number): number;
16
- export declare function addBucketChecksums(a: BucketChecksum, b: BucketChecksum | null): BucketChecksum;
17
+ export declare function addBucketChecksums(a: BucketChecksum, b: PartialChecksum | null): BucketChecksum;
17
18
  export declare function getUuidReplicaIdentityBson(tuple: sync_rules.ToastableSqliteRow, columns: storage.ColumnDescriptor[]): bson.UUID;
18
19
  export declare function uuidForRowBson(row: sync_rules.SqliteRow): bson.UUID;
19
20
  export declare function hasToastedValues(row: sync_rules.ToastableSqliteRow): boolean;
@@ -58,11 +58,18 @@ export function addBucketChecksums(a, b) {
58
58
  if (b == null) {
59
59
  return a;
60
60
  }
61
+ else if (b.isFullChecksum) {
62
+ return {
63
+ bucket: b.bucket,
64
+ count: b.partialCount,
65
+ checksum: b.partialChecksum
66
+ };
67
+ }
61
68
  else {
62
69
  return {
63
70
  bucket: a.bucket,
64
- count: a.count + b.count,
65
- checksum: addChecksums(a.checksum, b.checksum)
71
+ count: a.count + b.partialCount,
72
+ checksum: addChecksums(a.checksum, b.partialChecksum)
66
73
  };
67
74
  }
68
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/util/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/util/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
8
- "version": "0.0.0-dev-20241001150040",
8
+ "version": "0.0.0-dev-20241002111637",
9
9
  "main": "dist/index.js",
10
10
  "license": "FSL-1.1-Apache-2.0",
11
11
  "type": "module",
@@ -29,15 +29,14 @@
29
29
  "mongodb": "^6.7.0",
30
30
  "node-fetch": "^3.3.2",
31
31
  "ts-codec": "^1.2.2",
32
- "uri-js": "^4.4.1",
33
32
  "uuid": "^9.0.1",
34
33
  "winston": "^3.13.0",
35
34
  "yaml": "^2.3.2",
36
- "@powersync/lib-services-framework": "0.0.0-dev-20241001150040",
35
+ "@powersync/lib-services-framework": "0.0.0-dev-20241002111637",
37
36
  "@powersync/service-jsonbig": "0.17.10",
38
- "@powersync/service-rsocket-router": "0.0.0-dev-20241001150040",
39
- "@powersync/service-types": "0.0.0-dev-20241001150040",
40
- "@powersync/service-sync-rules": "0.0.0-dev-20241001150040"
37
+ "@powersync/service-rsocket-router": "0.0.0-dev-20241002111637",
38
+ "@powersync/service-sync-rules": "0.0.0-dev-20241002111637",
39
+ "@powersync/service-types": "0.0.0-dev-20241002111637"
41
40
  },
42
41
  "devDependencies": {
43
42
  "@types/async": "^3.2.24",
@@ -45,14 +44,14 @@
45
44
  "@types/uuid": "^9.0.4",
46
45
  "fastify": "4.23.2",
47
46
  "fastify-plugin": "^4.5.1",
48
- "typescript": "^5.2.2",
47
+ "typescript": "^5.6.2",
49
48
  "vite-tsconfig-paths": "^4.3.2",
50
- "vitest": "^0.34.6"
49
+ "vitest": "^2.1.1"
51
50
  },
52
51
  "scripts": {
53
52
  "build": "tsc -b",
54
53
  "build:tests": "tsc -b test/tsconfig.json",
55
- "test": "vitest --no-threads",
54
+ "test": "vitest",
56
55
  "clean": "rm -rf ./lib && tsc -b --clean"
57
56
  }
58
57
  }
@@ -22,7 +22,10 @@ export type RemoteJWKSCollectorOptions = {
22
22
  export class RemoteJWKSCollector implements KeyCollector {
23
23
  private url: URL;
24
24
 
25
- constructor(url: string, protected options?: RemoteJWKSCollectorOptions) {
25
+ constructor(
26
+ url: string,
27
+ protected options?: RemoteJWKSCollectorOptions
28
+ ) {
26
29
  try {
27
30
  this.url = new URL(url);
28
31
  } catch (e) {
package/src/db/mongo.ts CHANGED
@@ -2,7 +2,6 @@ import * as mongo from 'mongodb';
2
2
  import * as timers from 'timers/promises';
3
3
 
4
4
  import { configFile } from '@powersync/service-types';
5
- import { normalizeMongoConfig } from '../storage/storage-index.js';
6
5
 
7
6
  /**
8
7
  * Time for new connection to timeout.
@@ -24,11 +23,10 @@ export const MONGO_SOCKET_TIMEOUT_MS = 60_000;
24
23
  export const MONGO_OPERATION_TIMEOUT_MS = 30_000;
25
24
 
26
25
  export function createMongoClient(config: configFile.PowerSyncConfig['storage']) {
27
- const normalized = normalizeMongoConfig(config);
28
- return new mongo.MongoClient(normalized.uri, {
26
+ return new mongo.MongoClient(config.uri, {
29
27
  auth: {
30
- username: normalized.username,
31
- password: normalized.password
28
+ username: config.username,
29
+ password: config.password
32
30
  },
33
31
  // Time for connection to timeout
34
32
  connectTimeoutMS: MONGO_CONNECT_TIMEOUT_MS,
@@ -339,11 +339,6 @@ export interface BucketStorageBatch {
339
339
  */
340
340
  keepalive(lsn: string): Promise<boolean>;
341
341
 
342
- /**
343
- * Get the last checkpoint LSN, from either commit or keepalive.
344
- */
345
- lastCheckpointLsn: string | null;
346
-
347
342
  markSnapshotDone(tables: SourceTable[], no_checkpoint_before_lsn: string): Promise<SourceTable[]>;
348
343
  }
349
344
 
@@ -8,13 +8,34 @@ interface ChecksumFetchContext {
8
8
  checkpoint: bigint;
9
9
  }
10
10
 
11
+ export interface PartialChecksum {
12
+ bucket: string;
13
+ /**
14
+ * 32-bit unsigned hash.
15
+ */
16
+ partialChecksum: number;
17
+
18
+ /**
19
+ * Count of operations - informational only.
20
+ */
21
+ partialCount: number;
22
+
23
+ /**
24
+ * True if the queried operations contains (starts with) a CLEAR
25
+ * operation, indicating that the partial checksum is the full
26
+ * checksum, and must not be added to a previously-cached checksum.
27
+ */
28
+ isFullChecksum: boolean;
29
+ }
11
30
  export interface FetchPartialBucketChecksum {
12
31
  bucket: string;
13
32
  start?: OpId;
14
33
  end: OpId;
15
34
  }
16
35
 
17
- export type FetchChecksums = (batch: FetchPartialBucketChecksum[]) => Promise<ChecksumMap>;
36
+ export type PartialChecksumMap = Map<string, PartialChecksum>;
37
+
38
+ export type FetchChecksums = (batch: FetchPartialBucketChecksum[]) => Promise<PartialChecksumMap>;
18
39
 
19
40
  export interface ChecksumCacheOptions {
20
41
  /**
@@ -33,6 +54,8 @@ export interface ChecksumCacheOptions {
33
54
  // Approximately 5MB of memory, if we assume 50 bytes per entry
34
55
  const DEFAULT_MAX_SIZE = 100_000;
35
56
 
57
+ const TTL_MS = 3_600_000;
58
+
36
59
  /**
37
60
  * Implement a LRU cache for checksum requests. Each (bucket, checkpoint) request is cached separately,
38
61
  * while the lookups occur in batches.
@@ -93,7 +116,14 @@ export class ChecksumCache {
93
116
 
94
117
  // When we have more fetches than the cache size, complete the fetches instead
95
118
  // of failing with Error('evicted').
96
- ignoreFetchAbort: true
119
+ ignoreFetchAbort: true,
120
+
121
+ // We use a TTL so that counts can eventually be refreshed
122
+ // after a compact. This only has effect if the bucket has
123
+ // not been checked in the meantime.
124
+ ttl: TTL_MS,
125
+ ttlResolution: 1_000,
126
+ allowStale: false
97
127
  });
98
128
  }
99
129
 
@@ -7,7 +7,7 @@ import * as util from '../../util/util-index.js';
7
7
  import { BucketStorageBatch, FlushedResult, mergeToast, SaveOptions } from '../BucketStorage.js';
8
8
  import { SourceTable } from '../SourceTable.js';
9
9
  import { PowerSyncMongo } from './db.js';
10
- import { CurrentBucket, CurrentDataDocument, SourceKey, SyncRuleDocument } from './models.js';
10
+ import { CurrentBucket, CurrentDataDocument, SourceKey } from './models.js';
11
11
  import { MongoIdSequence } from './MongoIdSequence.js';
12
12
  import { cacheKey, OperationBatch, RecordOperation } from './OperationBatch.js';
13
13
  import { PersistedBatch } from './PersistedBatch.js';
@@ -73,10 +73,6 @@ export class MongoBucketBatch implements BucketStorageBatch {
73
73
  this.no_checkpoint_before_lsn = no_checkpoint_before_lsn;
74
74
  }
75
75
 
76
- get lastCheckpointLsn() {
77
- return this.last_checkpoint_lsn;
78
- }
79
-
80
76
  async flush(): Promise<FlushedResult | null> {
81
77
  let result: FlushedResult | null = null;
82
78
  // One flush may be split over multiple transactions.
@@ -539,7 +535,7 @@ export class MongoBucketBatch implements BucketStorageBatch {
539
535
  async commit(lsn: string): Promise<boolean> {
540
536
  await this.flush();
541
537
 
542
- if (this.last_checkpoint_lsn != null && lsn < this.last_checkpoint_lsn) {
538
+ if (this.last_checkpoint_lsn != null && lsn <= this.last_checkpoint_lsn) {
543
539
  // When re-applying transactions, don't create a new checkpoint until
544
540
  // we are past the last transaction.
545
541
  logger.info(`Re-applied transaction ${lsn} - skipping checkpoint`);
@@ -58,7 +58,11 @@ export class MongoCompactor {
58
58
  private maxOpId: bigint | undefined;
59
59
  private buckets: string[] | undefined;
60
60
 
61
- constructor(private db: PowerSyncMongo, private group_id: number, options?: MongoCompactOptions) {
61
+ constructor(
62
+ private db: PowerSyncMongo,
63
+ private group_id: number,
64
+ options?: MongoCompactOptions
65
+ ) {
62
66
  this.idLimitBytes = (options?.memoryLimitMB ?? DEFAULT_MEMORY_LIMIT_MB) * 1024 * 1024;
63
67
  this.moveBatchLimit = options?.moveBatchLimit ?? DEFAULT_MOVE_BATCH_LIMIT;
64
68
  this.moveBatchQueryLimit = options?.moveBatchQueryLimit ?? DEFAULT_MOVE_BATCH_QUERY_LIMIT;
@@ -19,7 +19,10 @@ export class MongoPersistedSyncRulesContent implements PersistedSyncRulesContent
19
19
 
20
20
  public current_lock: MongoSyncRulesLock | null = null;
21
21
 
22
- constructor(private db: PowerSyncMongo, doc: mongo.WithId<SyncRuleDocument>) {
22
+ constructor(
23
+ private db: PowerSyncMongo,
24
+ doc: mongo.WithId<SyncRuleDocument>
25
+ ) {
23
26
  this.id = doc._id;
24
27
  this.sync_rules_content = doc.content;
25
28
  this.last_checkpoint_lsn = doc.last_checkpoint_lsn;
@@ -22,7 +22,7 @@ import {
22
22
  SyncRuleStatus,
23
23
  TerminateOptions
24
24
  } from '../BucketStorage.js';
25
- import { ChecksumCache, FetchPartialBucketChecksum } from '../ChecksumCache.js';
25
+ import { ChecksumCache, FetchPartialBucketChecksum, PartialChecksum, PartialChecksumMap } from '../ChecksumCache.js';
26
26
  import { MongoBucketStorage } from '../MongoBucketStorage.js';
27
27
  import { SourceTable } from '../SourceTable.js';
28
28
  import { PowerSyncMongo } from './db.js';
@@ -350,7 +350,7 @@ export class MongoSyncBucketStorage implements SyncRulesBucketStorage {
350
350
  return this.checksumCache.getChecksumMap(checkpoint, buckets);
351
351
  }
352
352
 
353
- private async getChecksumsInternal(batch: FetchPartialBucketChecksum[]): Promise<util.ChecksumMap> {
353
+ private async getChecksumsInternal(batch: FetchPartialBucketChecksum[]): Promise<PartialChecksumMap> {
354
354
  if (batch.length == 0) {
355
355
  return new Map();
356
356
  }
@@ -382,22 +382,32 @@ export class MongoSyncBucketStorage implements SyncRulesBucketStorage {
382
382
  }
383
383
  },
384
384
  {
385
- $group: { _id: '$_id.b', checksum_total: { $sum: '$checksum' }, count: { $sum: 1 } }
385
+ $group: {
386
+ _id: '$_id.b',
387
+ checksum_total: { $sum: '$checksum' },
388
+ count: { $sum: 1 },
389
+ has_clear_op: {
390
+ $max: {
391
+ $cond: [{ $eq: ['$op', 'CLEAR'] }, 1, 0]
392
+ }
393
+ }
394
+ }
386
395
  }
387
396
  ],
388
- { session: undefined }
397
+ { session: undefined, readConcern: 'snapshot' }
389
398
  )
390
399
  .toArray();
391
400
 
392
- return new Map<string, util.BucketChecksum>(
401
+ return new Map<string, PartialChecksum>(
393
402
  aggregate.map((doc) => {
394
403
  return [
395
404
  doc._id,
396
405
  {
397
406
  bucket: doc._id,
398
- count: doc.count,
399
- checksum: Number(BigInt(doc.checksum_total) & 0xffffffffn) & 0xffffffff
400
- } satisfies util.BucketChecksum
407
+ partialCount: doc.count,
408
+ partialChecksum: Number(BigInt(doc.checksum_total) & 0xffffffffn) & 0xffffffff,
409
+ isFullChecksum: doc.has_clear_op == 1
410
+ } satisfies PartialChecksum
401
411
  ];
402
412
  })
403
413
  );
@@ -9,7 +9,7 @@ import { logger } from '@powersync/lib-services-framework';
9
9
  * replicates those sync rules at a time.
10
10
  */
11
11
  export class MongoSyncRulesLock implements ReplicationLock {
12
- private readonly refreshInterval: NodeJS.Timer;
12
+ private readonly refreshInterval: NodeJS.Timeout;
13
13
 
14
14
  static async createLock(db: PowerSyncMongo, sync_rules: PersistedSyncRulesContent): Promise<MongoSyncRulesLock> {
15
15
  const lockId = crypto.randomBytes(8).toString('hex');
@@ -35,7 +35,11 @@ export class MongoSyncRulesLock implements ReplicationLock {
35
35
  return new MongoSyncRulesLock(db, sync_rules.id, lockId);
36
36
  }
37
37
 
38
- constructor(private db: PowerSyncMongo, public sync_rules_id: number, private lock_id: string) {
38
+ constructor(
39
+ private db: PowerSyncMongo,
40
+ public sync_rules_id: number,
41
+ private lock_id: string
42
+ ) {
39
43
  this.refreshInterval = setInterval(async () => {
40
44
  try {
41
45
  await this.refresh();
@@ -54,7 +54,10 @@ export class PersistedBatch {
54
54
  */
55
55
  currentSize = 0;
56
56
 
57
- constructor(private group_id: number, writtenSize: number) {
57
+ constructor(
58
+ private group_id: number,
59
+ writtenSize: number
60
+ ) {
58
61
  this.currentSize = writtenSize;
59
62
  }
60
63
 
@@ -16,4 +16,3 @@ export * from './mongo/MongoSyncRulesLock.js';
16
16
  export * from './mongo/OperationBatch.js';
17
17
  export * from './mongo/PersistedBatch.js';
18
18
  export * from './mongo/util.js';
19
- export * from './mongo/config.js';
@@ -1,59 +1,6 @@
1
1
  import * as t from 'ts-codec';
2
2
  import { SqliteJsonValue } from '@powersync/service-sync-rules';
3
3
 
4
- /**
5
- * For sync2.json
6
- */
7
- export interface ContinueCheckpointRequest {
8
- /**
9
- * Existing bucket states. Only these buckets are synchronized.
10
- */
11
- buckets: BucketRequest[];
12
-
13
- checkpoint_token: string;
14
-
15
- limit?: number;
16
- }
17
-
18
- export interface SyncNewCheckpointRequest {
19
- /**
20
- * Existing bucket states. Used if include_data is specified.
21
- */
22
- buckets?: BucketRequest[];
23
-
24
- request_checkpoint: {
25
- /**
26
- * Whether or not to include an initial data request.
27
- */
28
- include_data: boolean;
29
-
30
- /**
31
- * Whether or not to compute a checksum.
32
- */
33
- include_checksum: boolean;
34
- };
35
-
36
- limit?: number;
37
- }
38
-
39
- export type SyncRequest = ContinueCheckpointRequest | SyncNewCheckpointRequest;
40
-
41
- export interface SyncResponse {
42
- /**
43
- * Data for the buckets returned. May not have an an entry for each bucket in the request.
44
- */
45
- data?: SyncBucketData[];
46
-
47
- /**
48
- * True if the response limit has been reached, and another request must be made.
49
- */
50
- has_more: boolean;
51
-
52
- checkpoint_token?: string;
53
-
54
- checkpoint?: Checkpoint;
55
- }
56
-
57
4
  export const BucketRequest = t.object({
58
5
  name: t.string,
59
6
 
@@ -195,39 +142,3 @@ export interface BucketChecksum {
195
142
  */
196
143
  count: number;
197
144
  }
198
-
199
- export function isContinueCheckpointRequest(request: SyncRequest): request is ContinueCheckpointRequest {
200
- return (
201
- Array.isArray((request as ContinueCheckpointRequest).buckets) &&
202
- typeof (request as ContinueCheckpointRequest).checkpoint_token == 'string'
203
- );
204
- }
205
-
206
- export function isSyncNewCheckpointRequest(request: SyncRequest): request is SyncNewCheckpointRequest {
207
- return typeof (request as SyncNewCheckpointRequest).request_checkpoint == 'object';
208
- }
209
-
210
- /**
211
- * For crud.json
212
- */
213
- export interface CrudRequest {
214
- data: CrudEntry[];
215
- }
216
-
217
- export interface CrudEntry {
218
- op: 'PUT' | 'PATCH' | 'DELETE';
219
- type: string;
220
- id: string;
221
- data: string;
222
- }
223
-
224
- export interface CrudResponse {
225
- /**
226
- * A sync response with a checkpoint >= this checkpoint would contain all the changes in this request.
227
- *
228
- * Any earlier checkpoint may or may not contain these changes.
229
- *
230
- * May be empty when the request contains no ops.
231
- */
232
- checkpoint?: OpId;
233
- }
package/src/util/utils.ts CHANGED
@@ -6,6 +6,8 @@ import { BucketChecksum, OpId } from './protocol-types.js';
6
6
 
7
7
  import * as storage from '../storage/storage-index.js';
8
8
 
9
+ import { PartialChecksum } from '../storage/ChecksumCache.js';
10
+
9
11
  export type ChecksumMap = Map<string, BucketChecksum>;
10
12
 
11
13
  export const ID_NAMESPACE = 'a396dd91-09fc-4017-a28d-3df722f651e9';
@@ -69,14 +71,20 @@ export function addChecksums(a: number, b: number) {
69
71
  return (a + b) & 0xffffffff;
70
72
  }
71
73
 
72
- export function addBucketChecksums(a: BucketChecksum, b: BucketChecksum | null): BucketChecksum {
74
+ export function addBucketChecksums(a: BucketChecksum, b: PartialChecksum | null): BucketChecksum {
73
75
  if (b == null) {
74
76
  return a;
77
+ } else if (b.isFullChecksum) {
78
+ return {
79
+ bucket: b.bucket,
80
+ count: b.partialCount,
81
+ checksum: b.partialChecksum
82
+ };
75
83
  } else {
76
84
  return {
77
85
  bucket: a.bucket,
78
- count: a.count + b.count,
79
- checksum: addChecksums(a.checksum, b.checksum)
86
+ count: a.count + b.partialCount,
87
+ checksum: addChecksums(a.checksum, b.partialChecksum)
80
88
  };
81
89
  }
82
90
  }