@powersync/service-core 0.0.0-dev-20241001150444 → 0.0.0-dev-20241002180742
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/RouteAPI.d.ts +1 -4
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/api/schema.js +6 -2
- 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.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 +21 -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 +42 -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 -1
- 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.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/config.js.map +1 -1
- package/dist/storage/mongo/util.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 -8
- package/src/api/RouteAPI.ts +1 -4
- package/src/api/schema.ts +6 -2
- package/src/auth/RemoteJWKSCollector.ts +4 -1
- package/src/storage/ChecksumCache.ts +32 -2
- 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/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
|
@@ -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-20241002180742",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-Apache-2.0",
|
|
11
11
|
"type": "module",
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
"uuid": "^9.0.1",
|
|
34
34
|
"winston": "^3.13.0",
|
|
35
35
|
"yaml": "^2.3.2",
|
|
36
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
36
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20241002180742",
|
|
37
37
|
"@powersync/service-jsonbig": "0.17.10",
|
|
38
|
-
"@powersync/service-rsocket-router": "0.0.0-dev-
|
|
39
|
-
"@powersync/service-sync-rules": "0.0.0-dev-
|
|
40
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
38
|
+
"@powersync/service-rsocket-router": "0.0.0-dev-20241002180742",
|
|
39
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20241002180742",
|
|
40
|
+
"@powersync/service-types": "0.0.0-dev-20241002180742"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/async": "^3.2.24",
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
"@types/uuid": "^9.0.4",
|
|
46
46
|
"fastify": "4.23.2",
|
|
47
47
|
"fastify-plugin": "^4.5.1",
|
|
48
|
-
"typescript": "^5.
|
|
48
|
+
"typescript": "^5.6.2",
|
|
49
49
|
"vite-tsconfig-paths": "^4.3.2",
|
|
50
|
-
"vitest": "^
|
|
50
|
+
"vitest": "^2.1.1"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
53
|
"build": "tsc -b",
|
|
54
54
|
"build:tests": "tsc -b test/tsconfig.json",
|
|
55
|
-
"test": "vitest
|
|
55
|
+
"test": "vitest",
|
|
56
56
|
"clean": "rm -rf ./lib && tsc -b --clean"
|
|
57
57
|
}
|
|
58
58
|
}
|
package/src/api/RouteAPI.ts
CHANGED
|
@@ -44,7 +44,7 @@ export interface RouteAPI {
|
|
|
44
44
|
* replicated yet, in bytes.
|
|
45
45
|
* @param {string} syncRulesId An identifier representing which set of sync rules the lag is required for.
|
|
46
46
|
*/
|
|
47
|
-
getReplicationLag(syncRulesId: string): Promise<number>;
|
|
47
|
+
getReplicationLag(syncRulesId: string): Promise<number | undefined>;
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
50
|
* Get the current LSN or equivalent replication HEAD position identifier
|
|
@@ -54,9 +54,6 @@ export interface RouteAPI {
|
|
|
54
54
|
/**
|
|
55
55
|
* @returns The schema for tables inside the connected database. This is typically
|
|
56
56
|
* used to validate sync rules.
|
|
57
|
-
* Side Note: https://github.com/powersync-ja/powersync-service/blob/33bbb8c0ab1c48555956593f427fc674a8f15768/packages/types/src/definitions.ts#L100
|
|
58
|
-
* contains `pg_type` which we might need to deprecate and add another generic
|
|
59
|
-
* type field - or just use this field as the connection specific type.
|
|
60
57
|
*/
|
|
61
58
|
getConnectionSchema(): Promise<types.DatabaseSchema[]>;
|
|
62
59
|
|
package/src/api/schema.ts
CHANGED
|
@@ -5,7 +5,9 @@ import * as api from '../api/api-index.js';
|
|
|
5
5
|
export async function getConnectionsSchema(api: api.RouteAPI): Promise<internal_routes.GetSchemaResponse> {
|
|
6
6
|
if (!api) {
|
|
7
7
|
return {
|
|
8
|
-
connections: []
|
|
8
|
+
connections: [],
|
|
9
|
+
defaultConnectionTag: 'default',
|
|
10
|
+
defaultSchema: ''
|
|
9
11
|
};
|
|
10
12
|
}
|
|
11
13
|
|
|
@@ -18,6 +20,8 @@ export async function getConnectionsSchema(api: api.RouteAPI): Promise<internal_
|
|
|
18
20
|
tag: baseConfig.tag!,
|
|
19
21
|
id: baseConfig.id
|
|
20
22
|
}
|
|
21
|
-
]
|
|
23
|
+
],
|
|
24
|
+
defaultConnectionTag: baseConfig.tag!,
|
|
25
|
+
defaultSchema: api.getParseSyncRulesOptions().defaultSchema
|
|
22
26
|
};
|
|
23
27
|
}
|
|
@@ -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) {
|
|
@@ -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
|
|
|
@@ -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
|
}
|
|
@@ -56,7 +56,7 @@ exports[`sync - mongodb > compacting data - invalidate checkpoint 2`] = `
|
|
|
56
56
|
"data": [
|
|
57
57
|
{
|
|
58
58
|
"checksum": 1859363232n,
|
|
59
|
-
"data": "{
|
|
59
|
+
"data": "{"id":"t1","description":"Test 1b"}",
|
|
60
60
|
"object_id": "t1",
|
|
61
61
|
"object_type": "test",
|
|
62
62
|
"op": "PUT",
|
|
@@ -65,7 +65,7 @@ exports[`sync - mongodb > compacting data - invalidate checkpoint 2`] = `
|
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
"checksum": 3028503153n,
|
|
68
|
-
"data": "{
|
|
68
|
+
"data": "{"id":"t2","description":"Test 2b"}",
|
|
69
69
|
"object_id": "t2",
|
|
70
70
|
"object_type": "test",
|
|
71
71
|
"op": "PUT",
|
|
@@ -146,7 +146,7 @@ exports[`sync - mongodb > sync global data 1`] = `
|
|
|
146
146
|
"data": [
|
|
147
147
|
{
|
|
148
148
|
"checksum": 920318466n,
|
|
149
|
-
"data": "{
|
|
149
|
+
"data": "{"id":"t1","description":"Test 1"}",
|
|
150
150
|
"object_id": "t1",
|
|
151
151
|
"object_type": "test",
|
|
152
152
|
"op": "PUT",
|
|
@@ -155,7 +155,7 @@ exports[`sync - mongodb > sync global data 1`] = `
|
|
|
155
155
|
},
|
|
156
156
|
{
|
|
157
157
|
"checksum": 3280762209n,
|
|
158
|
-
"data": "{
|
|
158
|
+
"data": "{"id":"t2","description":"Test 2"}",
|
|
159
159
|
"object_id": "t2",
|
|
160
160
|
"object_type": "test",
|
|
161
161
|
"op": "PUT",
|
|
@@ -199,7 +199,7 @@ exports[`sync - mongodb > sync legacy non-raw data 1`] = `
|
|
|
199
199
|
"checksum": 3442149460n,
|
|
200
200
|
"data": {
|
|
201
201
|
"description": "Test
|
|
202
|
-
|
|
202
|
+
"string"",
|
|
203
203
|
"id": "t1",
|
|
204
204
|
"large_num": 12345678901234567890n,
|
|
205
205
|
},
|
|
@@ -268,7 +268,7 @@ exports[`sync - mongodb > sync updates to global data 2`] = `
|
|
|
268
268
|
"data": [
|
|
269
269
|
{
|
|
270
270
|
"checksum": 920318466n,
|
|
271
|
-
"data": "{
|
|
271
|
+
"data": "{"id":"t1","description":"Test 1"}",
|
|
272
272
|
"object_id": "t1",
|
|
273
273
|
"object_type": "test",
|
|
274
274
|
"op": "PUT",
|
|
@@ -311,7 +311,7 @@ exports[`sync - mongodb > sync updates to global data 3`] = `
|
|
|
311
311
|
"data": [
|
|
312
312
|
{
|
|
313
313
|
"checksum": 3280762209n,
|
|
314
|
-
"data": "{
|
|
314
|
+
"data": "{"id":"t2","description":"Test 2"}",
|
|
315
315
|
"object_id": "t2",
|
|
316
316
|
"object_type": "test",
|
|
317
317
|
"op": "PUT",
|