@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.
- package/CHANGELOG.md +10 -5
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/api/schema.js.map +1 -1
- package/dist/auth/CachedKeyCollector.js.map +1 -1
- package/dist/auth/KeySpec.js.map +1 -1
- package/dist/auth/KeyStore.js.map +1 -1
- package/dist/auth/LeakyBucket.js.map +1 -1
- package/dist/auth/RemoteJWKSCollector.d.ts +0 -2
- package/dist/auth/RemoteJWKSCollector.js.map +1 -1
- package/dist/db/mongo.js +3 -5
- package/dist/db/mongo.js.map +1 -1
- package/dist/entry/cli-entry.js.map +1 -1
- package/dist/entry/commands/compact-action.js.map +1 -1
- package/dist/entry/commands/migrate-action.js.map +1 -1
- package/dist/entry/commands/teardown-action.js.map +1 -1
- package/dist/locks/MongoLocks.js.map +1 -1
- package/dist/metrics/Metrics.js.map +1 -1
- package/dist/migrations/db/migrations/1684951997326-init.js.map +1 -1
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -1
- package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js.map +1 -1
- package/dist/migrations/executor.js.map +1 -1
- package/dist/migrations/migrations.js.map +1 -1
- package/dist/migrations/store/migration-store.js.map +1 -1
- package/dist/modules/ModuleManager.js.map +1 -1
- package/dist/replication/AbstractReplicationJob.d.ts +0 -1
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/replication/ErrorRateLimiter.d.ts +0 -1
- package/dist/replication/ReplicationEngine.js.map +1 -1
- package/dist/replication/ReplicationModule.js.map +1 -1
- package/dist/routes/RouterEngine.js.map +1 -1
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/configure-fastify.d.ts +15 -7
- package/dist/routes/configure-rsocket.d.ts +0 -1
- package/dist/routes/configure-rsocket.js.map +1 -1
- package/dist/routes/endpoints/admin.d.ts +30 -12
- package/dist/routes/endpoints/admin.js.map +1 -1
- package/dist/routes/endpoints/checkpointing.js.map +1 -1
- package/dist/routes/endpoints/socket-route.js.map +1 -1
- package/dist/routes/endpoints/sync-rules.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.d.ts +0 -1
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/routes/hooks.js.map +1 -1
- package/dist/routes/route-register.js.map +1 -1
- package/dist/runner/teardown.js.map +1 -1
- package/dist/storage/BucketStorage.d.ts +0 -5
- package/dist/storage/BucketStorage.js.map +1 -1
- package/dist/storage/ChecksumCache.d.ts +19 -1
- package/dist/storage/ChecksumCache.js +8 -1
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/MongoBucketStorage.d.ts +0 -1
- package/dist/storage/MongoBucketStorage.js +1 -1
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/StorageEngine.js.map +1 -1
- package/dist/storage/mongo/MongoBucketBatch.d.ts +0 -1
- package/dist/storage/mongo/MongoBucketBatch.js +1 -4
- package/dist/storage/mongo/MongoBucketBatch.js.map +1 -1
- package/dist/storage/mongo/MongoCompactor.js.map +1 -1
- package/dist/storage/mongo/MongoIdSequence.js.map +1 -1
- package/dist/storage/mongo/MongoPersistedSyncRulesContent.js.map +1 -1
- package/dist/storage/mongo/MongoSyncBucketStorage.js +14 -4
- package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/mongo/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/mongo/OperationBatch.js.map +1 -1
- package/dist/storage/mongo/PersistedBatch.js.map +1 -1
- package/dist/storage/mongo/util.js.map +1 -1
- package/dist/storage/storage-index.d.ts +0 -1
- package/dist/storage/storage-index.js +0 -1
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/sync/BroadcastIterable.d.ts +0 -1
- package/dist/sync/BroadcastIterable.js.map +1 -1
- package/dist/sync/LastValueSink.d.ts +0 -1
- package/dist/sync/LastValueSink.js.map +1 -1
- package/dist/sync/merge.d.ts +0 -1
- package/dist/sync/merge.js.map +1 -1
- package/dist/sync/safeRace.js.map +1 -1
- package/dist/sync/sync.d.ts +0 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.d.ts +0 -2
- package/dist/sync/util.js.map +1 -1
- package/dist/util/Mutex.js.map +1 -1
- package/dist/util/config/collectors/config-collector.js.map +1 -1
- package/dist/util/config/collectors/impl/base64-config-collector.js.map +1 -1
- package/dist/util/config/collectors/impl/filesystem-config-collector.js.map +1 -1
- package/dist/util/config/compound-config-collector.js +1 -1
- package/dist/util/config/compound-config-collector.js.map +1 -1
- package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -1
- package/dist/util/config.js.map +1 -1
- package/dist/util/memory-tracking.js.map +1 -1
- package/dist/util/protocol-types.d.ts +0 -65
- package/dist/util/protocol-types.js +0 -7
- package/dist/util/protocol-types.js.map +1 -1
- package/dist/util/secs.js.map +1 -1
- package/dist/util/utils.d.ts +2 -1
- package/dist/util/utils.js +9 -2
- package/dist/util/utils.js.map +1 -1
- package/package.json +8 -9
- package/src/auth/RemoteJWKSCollector.ts +4 -1
- package/src/db/mongo.ts +3 -5
- package/src/storage/BucketStorage.ts +0 -5
- package/src/storage/ChecksumCache.ts +32 -2
- package/src/storage/mongo/MongoBucketBatch.ts +2 -6
- package/src/storage/mongo/MongoCompactor.ts +5 -1
- package/src/storage/mongo/MongoPersistedSyncRulesContent.ts +4 -1
- package/src/storage/mongo/MongoSyncBucketStorage.ts +18 -8
- package/src/storage/mongo/MongoSyncRulesLock.ts +6 -2
- package/src/storage/mongo/PersistedBatch.ts +4 -1
- package/src/storage/storage-index.ts +0 -1
- package/src/util/protocol-types.ts +0 -89
- package/src/util/utils.ts +11 -3
- package/test/src/__snapshots__/sync.test.ts.snap +7 -7
- package/test/src/checksum_cache.test.ts +26 -19
- package/test/src/compacting.test.ts +81 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +7 -1
- package/dist/storage/mongo/config.d.ts +0 -19
- package/dist/storage/mongo/config.js +0 -26
- package/dist/storage/mongo/config.js.map +0 -1
- 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;
|
|
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;
|
|
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"}
|
package/dist/util/secs.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/util/utils.d.ts
CHANGED
|
@@ -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:
|
|
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;
|
package/dist/util/utils.js
CHANGED
|
@@ -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.
|
|
65
|
-
checksum: addChecksums(a.checksum, b.
|
|
71
|
+
count: a.count + b.partialCount,
|
|
72
|
+
checksum: addChecksums(a.checksum, b.partialChecksum)
|
|
66
73
|
};
|
|
67
74
|
}
|
|
68
75
|
}
|
package/dist/util/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/util/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
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-
|
|
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-
|
|
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-
|
|
39
|
-
"@powersync/service-
|
|
40
|
-
"@powersync/service-
|
|
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.
|
|
47
|
+
"typescript": "^5.6.2",
|
|
49
48
|
"vite-tsconfig-paths": "^4.3.2",
|
|
50
|
-
"vitest": "^
|
|
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
|
|
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(
|
|
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
|
-
|
|
28
|
-
return new mongo.MongoClient(normalized.uri, {
|
|
26
|
+
return new mongo.MongoClient(config.uri, {
|
|
29
27
|
auth: {
|
|
30
|
-
username:
|
|
31
|
-
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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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<
|
|
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: {
|
|
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,
|
|
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
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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.
|
|
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(
|
|
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();
|
|
@@ -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:
|
|
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.
|
|
79
|
-
checksum: addChecksums(a.checksum, b.
|
|
86
|
+
count: a.count + b.partialCount,
|
|
87
|
+
checksum: addChecksums(a.checksum, b.partialChecksum)
|
|
80
88
|
};
|
|
81
89
|
}
|
|
82
90
|
}
|