@powersync/service-core-tests 0.15.5 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/test-utils/AbstractStreamTestContext.d.ts +52 -0
  3. package/dist/test-utils/AbstractStreamTestContext.js +147 -0
  4. package/dist/test-utils/AbstractStreamTestContext.js.map +1 -0
  5. package/dist/test-utils/StorageDataHelpers.d.ts +3 -3
  6. package/dist/test-utils/StorageDataHelpers.js.map +1 -1
  7. package/dist/test-utils/general-utils.d.ts +13 -8
  8. package/dist/test-utils/general-utils.js +39 -25
  9. package/dist/test-utils/general-utils.js.map +1 -1
  10. package/dist/test-utils/test-utils-index.d.ts +1 -0
  11. package/dist/test-utils/test-utils-index.js +1 -0
  12. package/dist/test-utils/test-utils-index.js.map +1 -1
  13. package/dist/tests/register-compacting-tests.js +15 -8
  14. package/dist/tests/register-compacting-tests.js.map +1 -1
  15. package/dist/tests/register-data-storage-data-tests.js +104 -75
  16. package/dist/tests/register-data-storage-data-tests.js.map +1 -1
  17. package/dist/tests/register-data-storage-parameter-tests.js +48 -47
  18. package/dist/tests/register-data-storage-parameter-tests.js.map +1 -1
  19. package/dist/tests/register-sync-tests.js +6 -3
  20. package/dist/tests/register-sync-tests.js.map +1 -1
  21. package/dist/tests/util.d.ts +3 -4
  22. package/dist/tests/util.js +8 -5
  23. package/dist/tests/util.js.map +1 -1
  24. package/package.json +5 -5
  25. package/src/test-utils/AbstractStreamTestContext.ts +183 -0
  26. package/src/test-utils/StorageDataHelpers.ts +4 -4
  27. package/src/test-utils/general-utils.ts +52 -34
  28. package/src/test-utils/test-utils-index.ts +1 -0
  29. package/src/tests/register-compacting-tests.ts +15 -8
  30. package/src/tests/register-data-storage-data-tests.ts +130 -77
  31. package/src/tests/register-data-storage-parameter-tests.ts +62 -47
  32. package/src/tests/register-sync-tests.ts +6 -3
  33. package/src/tests/util.ts +14 -11
  34. package/tsconfig.json +4 -4
  35. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,49 @@
1
1
  # @powersync/service-core-tests
2
2
 
3
+ ## 0.17.0
4
+
5
+ ### Minor Changes
6
+
7
+ - a91a08f: [Experimental] Enable incremental reprocessing for MongoDB source + MongoDB storage. This includes significant changes to the v3 storage format.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [a91a08f]
12
+ - Updated dependencies [184c39f]
13
+ - Updated dependencies [c3f75df]
14
+ - Updated dependencies [4bd35ea]
15
+ - @powersync/service-core@1.23.0
16
+ - @powersync/service-sync-rules@0.38.0
17
+ - @powersync/lib-services-framework@0.9.6
18
+
19
+ ## 0.16.0
20
+
21
+ ### Minor Changes
22
+
23
+ - e2bf1ad: [Internal] rework resolveTables to handle multiple SourceTables.
24
+
25
+ ### Patch Changes
26
+
27
+ - Updated dependencies [17fd96b]
28
+ - Updated dependencies [6e2a57e]
29
+ - Updated dependencies [ec6df9f]
30
+ - Updated dependencies [99d33d5]
31
+ - Updated dependencies [cae92ce]
32
+ - Updated dependencies [5ac5345]
33
+ - Updated dependencies [15cb880]
34
+ - Updated dependencies [f2f5086]
35
+ - Updated dependencies [5b1b215]
36
+ - Updated dependencies [e2bf1ad]
37
+ - Updated dependencies [92cc83b]
38
+ - Updated dependencies [0aab0f9]
39
+ - Updated dependencies [15e2466]
40
+ - Updated dependencies [ebeaa3b]
41
+ - Updated dependencies [b116857]
42
+ - Updated dependencies [a94b6c3]
43
+ - @powersync/service-core@1.22.0
44
+ - @powersync/service-sync-rules@0.37.0
45
+ - @powersync/lib-services-framework@0.9.5
46
+
3
47
  ## 0.15.5
4
48
 
5
49
  ### Patch Changes
@@ -0,0 +1,52 @@
1
+ import { BucketStorageFactory, InternalOpId, storage, SyncRulesBucketStorage } from '@powersync/service-core';
2
+ export declare abstract class AbstractStreamTestContext implements AsyncDisposable {
3
+ protected abortController: AbortController;
4
+ protected syncRulesContent?: storage.PersistedSyncConfigContent;
5
+ protected replicationStream?: storage.PersistedReplicationStream;
6
+ storage?: SyncRulesBucketStorage;
7
+ protected settledReplicationPromise?: Promise<PromiseSettledResult<void>>;
8
+ abstract get factory(): BucketStorageFactory;
9
+ protected abstract get storageVersion(): number;
10
+ [Symbol.asyncDispose](): Promise<void>;
11
+ protected abstract _dispose(): Promise<void>;
12
+ dispose(): Promise<void>;
13
+ updateSyncRules(content: string): Promise<storage.SyncRulesBucketStorage>;
14
+ loadNextSyncRules(): Promise<storage.SyncRulesBucketStorage>;
15
+ loadActiveSyncRules(): Promise<storage.SyncRulesBucketStorage>;
16
+ private getSyncConfigContent;
17
+ /**
18
+ * Replicate a snapshot, start streaming, and wait for a consistent checkpoint.
19
+ */
20
+ initializeReplication(): Promise<void>;
21
+ protected abstract triggerReplication(): Promise<void>;
22
+ protected abstract waitForInitialSnapshot(): Promise<void>;
23
+ /**
24
+ * Replicate the initial snapshot, and start streaming.
25
+ */
26
+ replicateSnapshot(): Promise<void>;
27
+ abstract getClientCheckpoint(options?: {
28
+ timeout?: number;
29
+ }): Promise<bigint>;
30
+ getCheckpoint(options?: {
31
+ timeout?: number;
32
+ }): Promise<bigint>;
33
+ getBucketsDataBatch(buckets: Record<string, InternalOpId>, options?: {
34
+ timeout?: number;
35
+ }): Promise<storage.SyncBucketDataChunk[]>;
36
+ /**
37
+ * This waits for a client checkpoint.
38
+ */
39
+ getBucketData(bucket: string, start?: InternalOpId | string | undefined, options?: {
40
+ timeout?: number;
41
+ }): Promise<import("@powersync/service-core").OplogEntry<import("@powersync/service-core").StoredOplogData>[]>;
42
+ getChecksums(buckets: string[], options?: {
43
+ timeout?: number;
44
+ }): Promise<Map<any, any>>;
45
+ getChecksum(bucket: string, options?: {
46
+ timeout?: number;
47
+ }): Promise<any>;
48
+ /**
49
+ * This does not wait for a client checkpoint.
50
+ */
51
+ getCurrentBucketData(bucket: string, start?: InternalOpId | string | undefined): Promise<import("@powersync/service-core").OplogEntry<import("@powersync/service-core").StoredOplogData>[]>;
52
+ }
@@ -0,0 +1,147 @@
1
+ import { ReplicationAbortedError } from '@powersync/lib-services-framework';
2
+ import { settledPromise, unsettledPromise, updateSyncRulesFromYaml } from '@powersync/service-core';
3
+ import { StorageDataHelpers } from './StorageDataHelpers.js';
4
+ import { bucketRequest } from './general-utils.js';
5
+ import { fromAsync } from './stream_utils.js';
6
+ export class AbstractStreamTestContext {
7
+ abortController = new AbortController();
8
+ syncRulesContent;
9
+ replicationStream;
10
+ storage;
11
+ settledReplicationPromise;
12
+ async [Symbol.asyncDispose]() {
13
+ await this.dispose();
14
+ }
15
+ async dispose() {
16
+ this.abortController.abort();
17
+ try {
18
+ await this.settledReplicationPromise;
19
+ await this._dispose();
20
+ await this.factory?.[Symbol.asyncDispose]();
21
+ }
22
+ catch (e) {
23
+ // Throwing here may result in SuppressedError. The underlying errors often don't show up
24
+ // in the test output, so we log it here.
25
+ // If we could get vitest to log SuppressedError.error and SuppressedError.suppressed, we
26
+ // could remove this.
27
+ console.error('Error during ConvexStreamTestContext dispose', e);
28
+ throw e;
29
+ }
30
+ }
31
+ async updateSyncRules(content) {
32
+ const stream = await this.factory.updateSyncRules(updateSyncRulesFromYaml(content, { validate: true, storageVersion: this.storageVersion }));
33
+ this.replicationStream = stream;
34
+ this.syncRulesContent = stream.syncConfigContent[0];
35
+ this.storage = this.factory.getInstance(stream);
36
+ return this.storage;
37
+ }
38
+ async loadNextSyncRules() {
39
+ const syncConfig = await this.factory.getDeployingSyncConfig();
40
+ if (syncConfig == null) {
41
+ throw new Error(`Next sync config not available`);
42
+ }
43
+ this.syncRulesContent = syncConfig.content;
44
+ this.replicationStream = syncConfig.replicationStream;
45
+ this.storage = syncConfig.storage;
46
+ return this.storage;
47
+ }
48
+ async loadActiveSyncRules() {
49
+ const syncConfig = await this.factory.getActiveSyncConfig();
50
+ if (syncConfig == null) {
51
+ throw new Error(`Active sync config not available`);
52
+ }
53
+ this.syncRulesContent = syncConfig.content;
54
+ this.replicationStream = syncConfig.replicationStream;
55
+ this.storage = syncConfig.storage;
56
+ return this.storage;
57
+ }
58
+ getSyncConfigContent() {
59
+ if (this.syncRulesContent == null) {
60
+ throw new Error('Sync config not configured - call updateSyncRules() first');
61
+ }
62
+ return this.syncRulesContent;
63
+ }
64
+ /**
65
+ * Replicate a snapshot, start streaming, and wait for a consistent checkpoint.
66
+ */
67
+ async initializeReplication() {
68
+ await this.replicateSnapshot();
69
+ // Make sure we're up to date
70
+ await this.getCheckpoint();
71
+ }
72
+ /**
73
+ * Replicate the initial snapshot, and start streaming.
74
+ */
75
+ async replicateSnapshot() {
76
+ // Use a settledPromise to avoid unhandled rejections
77
+ this.settledReplicationPromise = settledPromise(this.triggerReplication());
78
+ try {
79
+ await Promise.race([unsettledPromise(this.settledReplicationPromise), this.waitForInitialSnapshot()]);
80
+ }
81
+ catch (e) {
82
+ if (e instanceof ReplicationAbortedError && e.cause != null) {
83
+ // Edge case for tests: replicate() can throw an error, but we'd receive the ReplicationAbortedError from
84
+ // waitForInitialSnapshot() first. In that case, prioritize the cause, e.g. MissingReplicationSlotError.
85
+ // This is not a concern for production use, since we only use waitForInitialSnapshot() in tests.
86
+ throw e.cause;
87
+ }
88
+ throw e;
89
+ }
90
+ }
91
+ async getCheckpoint(options) {
92
+ let checkpoint = await Promise.race([
93
+ this.getClientCheckpoint(options),
94
+ unsettledPromise(this.settledReplicationPromise)
95
+ ]);
96
+ if (checkpoint == null) {
97
+ // This indicates an issue with the test setup - replicationPromise completed instead
98
+ // of getClientCheckpoint()
99
+ throw new Error('Test failure - replicationPromise completed');
100
+ }
101
+ return checkpoint;
102
+ }
103
+ async getBucketsDataBatch(buckets, options) {
104
+ const helpers = new StorageDataHelpers(this.storage, this.getSyncConfigContent());
105
+ const checkpoint = await this.getCheckpoint(options);
106
+ return helpers.getBucketsDataBatch(buckets, checkpoint);
107
+ }
108
+ /**
109
+ * This waits for a client checkpoint.
110
+ */
111
+ async getBucketData(bucket, start, options) {
112
+ const helpers = new StorageDataHelpers(this.storage, this.getSyncConfigContent());
113
+ const checkpoint = await this.getCheckpoint(options);
114
+ return helpers.getBucketData(bucket, checkpoint, start);
115
+ }
116
+ async getChecksums(buckets, options) {
117
+ const checkpoint = await this.getCheckpoint(options);
118
+ const syncConfigContent = this.getSyncConfigContent();
119
+ const versionedBuckets = buckets.map((bucket) => bucketRequest(syncConfigContent, bucket, 0n));
120
+ const checksums = await this.storage.getChecksums(checkpoint, versionedBuckets);
121
+ const unversioned = new Map();
122
+ for (let i = 0; i < buckets.length; i++) {
123
+ unversioned.set(buckets[i], checksums.get(versionedBuckets[i].bucket));
124
+ }
125
+ return unversioned;
126
+ }
127
+ async getChecksum(bucket, options) {
128
+ const checksums = await this.getChecksums([bucket], options);
129
+ return checksums.get(bucket);
130
+ }
131
+ /**
132
+ * This does not wait for a client checkpoint.
133
+ */
134
+ async getCurrentBucketData(bucket, start) {
135
+ start ??= 0n;
136
+ if (typeof start == 'string') {
137
+ start = BigInt(start);
138
+ }
139
+ const syncConfigContent = this.getSyncConfigContent();
140
+ const { checkpoint } = await this.storage.getCheckpoint();
141
+ const map = [bucketRequest(syncConfigContent, bucket, start)];
142
+ const batch = this.storage.getBucketDataBatch(checkpoint, map);
143
+ const batches = await fromAsync(batch);
144
+ return batches[0]?.chunkData.data ?? [];
145
+ }
146
+ }
147
+ //# sourceMappingURL=AbstractStreamTestContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractStreamTestContext.js","sourceRoot":"","sources":["../../src/test-utils/AbstractStreamTestContext.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { InternalOpId, OplogEntry, PersistedSyncRules, PersistedSyncRulesContent, SyncRulesBucketStorage } from '@powersync/service-core';
1
+ import { InternalOpId, OplogEntry, ParsedSyncConfigSet, PersistedSyncConfigContent, SyncRulesBucketStorage } from '@powersync/service-core';
2
2
  export declare class StorageDataHelpers {
3
3
  storage: SyncRulesBucketStorage;
4
- syncRules: PersistedSyncRulesContent | PersistedSyncRules;
5
- constructor(storage: SyncRulesBucketStorage, syncRules: PersistedSyncRulesContent | PersistedSyncRules);
4
+ syncRules: PersistedSyncConfigContent | ParsedSyncConfigSet;
5
+ constructor(storage: SyncRulesBucketStorage, syncRules: PersistedSyncConfigContent | ParsedSyncConfigSet);
6
6
  getBucketData(bucket: string, checkpoint: InternalOpId, start?: InternalOpId | string | undefined): Promise<OplogEntry<import("@powersync/service-core").StoredOplogData>[]>;
7
7
  getBucketsDataBatch(buckets: Record<string, InternalOpId>, checkpoint: InternalOpId): Promise<import("@powersync/service-core").SyncBucketDataChunk[]>;
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StorageDataHelpers.js","sourceRoot":"","sources":["../../src/test-utils/StorageDataHelpers.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,OAAO,kBAAkB;IAC7B,OAAO,CAAyB;IAChC,SAAS,CAAiD;IAE1D,YAAY,OAA+B,EAAE,SAAyD;QACpG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,UAAwB,EAAE,KAAyC;QACrG,KAAK,KAAK,EAAE,CAAC;QACb,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,GAAiB,EAAE,CAAC;QAC5B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAEhE,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC3D,MAAM;YACR,CAAC;YACD,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAqC,EAAE,UAAwB;QACvF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3G,OAAO,SAAS,CAAC,IAAI,CAAC,OAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
1
+ {"version":3,"file":"StorageDataHelpers.js","sourceRoot":"","sources":["../../src/test-utils/StorageDataHelpers.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,OAAO,kBAAkB;IAC7B,OAAO,CAAyB;IAChC,SAAS,CAAmD;IAE5D,YAAY,OAA+B,EAAE,SAA2D;QACtG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,UAAwB,EAAE,KAAyC;QACrG,KAAK,KAAK,EAAE,CAAC;QACb,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,GAAiB,EAAE,CAAC;QAC5B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAEhE,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC3D,MAAM;YACR,CAAC;YACD,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAqC,EAAE,UAAwB;QACvF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3G,OAAO,SAAS,CAAC,IAAI,CAAC,OAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
@@ -2,17 +2,22 @@ import { BucketDataRequest, InternalOpId, storage, utils } from '@powersync/serv
2
2
  import { GetQuerierOptions, RequestParameters } from '@powersync/service-sync-rules';
3
3
  import * as bson from 'bson';
4
4
  export declare const ZERO_LSN = "0/0";
5
- export declare const PARSE_OPTIONS: storage.ParseSyncRulesOptions;
5
+ export declare const PARSE_OPTIONS: storage.ParseSyncConfigOptions;
6
6
  export declare const BATCH_OPTIONS: storage.CreateWriterOptions;
7
- export declare function makeTestTable(name: string, replicaIdColumns?: string[] | undefined, options?: {
8
- tableIdStrings: boolean;
9
- }): storage.SourceTable;
10
7
  /**
11
- * With incremental reprocessing, we need actual test tables, resolved via the writer.
8
+ * Deploy a sync config and return both the replication stream (for {@link storage.BucketStorageFactory.getInstance})
9
+ * and the deployed config content (for parsing / bucket requests).
12
10
  *
13
- * This prepares for it.
11
+ * Replication streams and sync config content are separate concerns since one stream can hold multiple configs.
12
+ */
13
+ export declare function deploySyncRules(factory: storage.BucketStorageFactory, options: storage.UpdateSyncRulesOptions): Promise<{
14
+ stream: storage.PersistedReplicationStream;
15
+ content: storage.PersistedSyncConfigContent;
16
+ }>;
17
+ /**
18
+ * With newer storage versions, we need actual test tables, resolved via the writer.
14
19
  */
15
- export declare function resolveTestTable(_writer: storage.BucketStorageBatch, name: string, replicaIdColumns: string[] | undefined, options: {
20
+ export declare function resolveTestTable(writer: storage.BucketStorageBatch, name: string, replicaIdColumns: string[] | undefined, options: {
16
21
  tableIdStrings: boolean;
17
22
  }, idIndex?: number): Promise<storage.SourceTable>;
18
23
  export declare function getBatchData(batch: utils.SyncBucketData[] | storage.SyncBucketDataChunk[] | storage.SyncBucketDataChunk): {
@@ -25,7 +30,7 @@ export declare function getBatchData(batch: utils.SyncBucketData[] | storage.Syn
25
30
  * Bucket names no longer purely depend on the sync config.
26
31
  * This converts a bucket name like "global[]" into the actual bucket name, for use in tests.
27
32
  */
28
- export declare function bucketRequest(syncRules: storage.PersistedSyncRulesContent | storage.PersistedSyncRules, bucket: string, start?: InternalOpId | string | number): BucketDataRequest;
33
+ export declare function bucketRequest(syncRules: storage.PersistedSyncConfigContent | storage.ParsedSyncConfigSet, bucket: string, start?: InternalOpId | string | number): BucketDataRequest;
29
34
  export declare function getBatchMeta(batch: utils.SyncBucketData[] | storage.SyncBucketDataChunk[] | storage.SyncBucketDataChunk): {
30
35
  has_more: boolean;
31
36
  after: string;
@@ -10,39 +10,52 @@ export const BATCH_OPTIONS = {
10
10
  zeroLSN: ZERO_LSN,
11
11
  storeCurrentData: true
12
12
  };
13
- export function makeTestTable(name, replicaIdColumns, options) {
14
- const relId = utils.hashData('table', name, (replicaIdColumns ?? ['id']).join(','));
15
- const id = options?.tableIdStrings == false ? new bson.ObjectId('6544e3899293153fa7b38331') : '6544e3899293153fa7b38331';
16
- return new storage.SourceTable({
17
- id: id,
18
- connectionTag: storage.SourceTable.DEFAULT_TAG,
19
- objectId: relId,
20
- schema: 'public',
21
- name: name,
22
- replicaIdColumns: (replicaIdColumns ?? ['id']).map((column) => ({ name: column, type: 'VARCHAR', typeId: 25 })),
23
- snapshotComplete: true
24
- });
25
- }
26
13
  /**
27
- * With incremental reprocessing, we need actual test tables, resolved via the writer.
14
+ * Deploy a sync config and return both the replication stream (for {@link storage.BucketStorageFactory.getInstance})
15
+ * and the deployed config content (for parsing / bucket requests).
28
16
  *
29
- * This prepares for it.
17
+ * Replication streams and sync config content are separate concerns since one stream can hold multiple configs.
18
+ */
19
+ export async function deploySyncRules(factory, options) {
20
+ const stream = await factory.updateSyncRules(options);
21
+ const content = stream.syncConfigContent[0];
22
+ return { stream, content };
23
+ }
24
+ /**
25
+ * With newer storage versions, we need actual test tables, resolved via the writer.
30
26
  */
31
- export async function resolveTestTable(_writer, name, replicaIdColumns, options, idIndex = 1) {
27
+ export async function resolveTestTable(writer, name, replicaIdColumns, options, idIndex = 1) {
28
+ void idIndex;
29
+ void options;
32
30
  const relId = utils.hashData('table', name, (replicaIdColumns ?? ['id']).join(','));
33
- // Generate unique ids per test table (if idIndex is specified), without completely
34
- // breaking all the existing tests.
31
+ // Semi-hardcoded id for tests, to get consistent output.
32
+ // If the same test uses multiple tables, pass idIndex to get different ids.
35
33
  const idString = '6544e3899293153fa7b383' + (30 + idIndex).toString().padStart(2, '0');
36
34
  const id = options.tableIdStrings == false ? new bson.ObjectId(idString) : idString;
37
- return new storage.SourceTable({
38
- id: id,
35
+ let didGenerateId = false;
36
+ const source = {
39
37
  connectionTag: storage.SourceTable.DEFAULT_TAG,
40
38
  objectId: relId,
41
39
  schema: 'public',
42
40
  name: name,
43
- replicaIdColumns: (replicaIdColumns ?? ['id']).map((column) => ({ name: column, type: 'VARCHAR', typeId: 25 })),
44
- snapshotComplete: true
41
+ replicaIdColumns: (replicaIdColumns ?? ['id']).map((column) => ({ name: column, type: 'VARCHAR', typeId: 25 }))
42
+ };
43
+ const resolved = await writer.resolveTables({
44
+ connection_id: 1,
45
+ source,
46
+ idGenerator: () => {
47
+ if (didGenerateId) {
48
+ throw new Error('idGenerator called multiple times - not supported in tests');
49
+ }
50
+ didGenerateId = true;
51
+ return id;
52
+ }
45
53
  });
54
+ const table = resolved.tables[0];
55
+ if (table == null) {
56
+ throw new Error(`Failed to resolve test table ${source.schema}.${source.name}`);
57
+ }
58
+ return table;
46
59
  }
47
60
  export function getBatchData(batch) {
48
61
  const first = getFirst(batch);
@@ -59,7 +72,7 @@ export function getBatchData(batch) {
59
72
  });
60
73
  }
61
74
  function isParsedSyncRules(syncRules) {
62
- return syncRules.sync_rules !== undefined;
75
+ return syncRules.syncConfigs !== undefined;
63
76
  }
64
77
  /**
65
78
  * Bucket names no longer purely depend on the sync config.
@@ -71,9 +84,10 @@ export function bucketRequest(syncRules, bucket, start) {
71
84
  const parameterStart = bucket.indexOf('[');
72
85
  const definitionName = bucket.substring(0, parameterStart);
73
86
  const parameters = bucket.substring(parameterStart);
74
- const source = parsed.sync_rules.config.bucketDataSources.find((b) => b.uniqueName === definitionName);
87
+ const availableSources = parsed.syncConfigs.flatMap((config) => config.config.bucketDataSources);
88
+ const source = availableSources.find((b) => b.uniqueName === definitionName);
75
89
  if (source == null) {
76
- throw new Error(`Failed to find global bucket ${bucket}`);
90
+ throw new Error(`Failed to find global bucket ${bucket}. Available: ${availableSources.map((s) => s.uniqueName).join(',')}`);
77
91
  }
78
92
  const bucketName = hydrationState.getBucketSourceScope(source).bucketPrefix + parameters;
79
93
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"general-utils.js","sourceRoot":"","sources":["../../src/test-utils/general-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"general-utils.js","sourceRoot":"","sources":["../../src/test-utils/general-utils.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ export * from './AbstractStreamTestContext.js';
1
2
  export * from './bucket-validation.js';
2
3
  export * from './general-utils.js';
3
4
  export * from './MetricsHelper.js';
@@ -1,3 +1,4 @@
1
+ export * from './AbstractStreamTestContext.js';
1
2
  export * from './bucket-validation.js';
2
3
  export * from './general-utils.js';
3
4
  export * from './MetricsHelper.js';
@@ -1 +1 @@
1
- {"version":3,"file":"test-utils-index.js","sourceRoot":"","sources":["../../src/test-utils/test-utils-index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"test-utils-index.js","sourceRoot":"","sources":["../../src/test-utils/test-utils-index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
@@ -13,6 +13,7 @@ bucket_definitions:
13
13
  data: [select * from test]
14
14
  `));
15
15
  const bucketStorage = factory.getInstance(syncRules);
16
+ const syncRulesContent = syncRules.syncConfigContent[0];
16
17
  await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
17
18
  const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
18
19
  await writer.markAllSnapshotDone('1/1');
@@ -43,7 +44,7 @@ bucket_definitions:
43
44
  await writer.commit('1/1');
44
45
  await writer.flush();
45
46
  const checkpoint = writer.last_flushed_op;
46
- const request = bucketRequest(syncRules, 'global[]');
47
+ const request = bucketRequest(syncRulesContent, 'global[]');
47
48
  const batchBefore = await test_utils.oneFromAsync(bucketStorage.getBucketDataBatch(checkpoint, [request]));
48
49
  const dataBefore = batchBefore.chunkData.data;
49
50
  const checksumBefore = await bucketStorage.getChecksums(checkpoint, [request]);
@@ -104,6 +105,7 @@ bucket_definitions:
104
105
  data: [select * from test]
105
106
  `));
106
107
  const bucketStorage = factory.getInstance(syncRules);
108
+ const syncRulesContent = syncRules.syncConfigContent[0];
107
109
  await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
108
110
  const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
109
111
  await writer.markAllSnapshotDone('1/1');
@@ -142,7 +144,7 @@ bucket_definitions:
142
144
  await writer.commit('1/1');
143
145
  await writer.flush();
144
146
  const checkpoint = writer.last_flushed_op;
145
- const request = bucketRequest(syncRules, 'global[]');
147
+ const request = bucketRequest(syncRulesContent, 'global[]');
146
148
  const batchBefore = await test_utils.oneFromAsync(bucketStorage.getBucketDataBatch(checkpoint, [request]));
147
149
  const dataBefore = batchBefore.chunkData.data;
148
150
  const checksumBefore = await bucketStorage.getChecksums(checkpoint, [request]);
@@ -202,6 +204,7 @@ bucket_definitions:
202
204
  data: [select * from test]
203
205
  `));
204
206
  const bucketStorage = factory.getInstance(syncRules);
207
+ const syncRulesContent = syncRules.syncConfigContent[0];
205
208
  await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
206
209
  const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
207
210
  await writer.markAllSnapshotDone('1/1');
@@ -232,7 +235,7 @@ bucket_definitions:
232
235
  await writer.commit('1/1');
233
236
  await writer.flush();
234
237
  const checkpoint1 = writer.last_flushed_op;
235
- const request = bucketRequest(syncRules, 'global[]');
238
+ const request = bucketRequest(syncRulesContent, 'global[]');
236
239
  await using writer2 = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
237
240
  const testTable2 = await test_utils.resolveTestTable(writer2, 'test', ['id'], config);
238
241
  await writer2.save({
@@ -279,6 +282,7 @@ bucket_definitions:
279
282
  data:
280
283
  - select * from test where b = bucket.b`));
281
284
  const bucketStorage = factory.getInstance(syncRules);
285
+ const syncRulesContent = syncRules.syncConfigContent[0];
282
286
  await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
283
287
  const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
284
288
  await writer.markAllSnapshotDone('1/1');
@@ -351,7 +355,7 @@ bucket_definitions:
351
355
  minBucketChanges: 1,
352
356
  minChangeRatio: 0
353
357
  });
354
- const batchAfter = await test_utils.fromAsync(bucketStorage.getBucketDataBatch(checkpoint, bucketRequestMap(syncRules, [
358
+ const batchAfter = await test_utils.fromAsync(bucketStorage.getBucketDataBatch(checkpoint, bucketRequestMap(syncRulesContent, [
355
359
  ['grouped["b1"]', 0n],
356
360
  ['grouped["b2"]', 0n]
357
361
  ])));
@@ -388,6 +392,7 @@ bucket_definitions:
388
392
  data: [select * from test]
389
393
  `));
390
394
  const bucketStorage = factory.getInstance(syncRules);
395
+ const syncRulesContent = syncRules.syncConfigContent[0];
391
396
  await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
392
397
  const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
393
398
  await writer.markAllSnapshotDone('1/1');
@@ -437,7 +442,7 @@ bucket_definitions:
437
442
  await writer2.commit('2/1');
438
443
  await writer2.flush();
439
444
  const checkpoint2 = writer2.last_flushed_op;
440
- const request = bucketRequest(syncRules, 'global[]');
445
+ const request = bucketRequest(syncRulesContent, 'global[]');
441
446
  await bucketStorage.clearChecksumCache();
442
447
  const checksumAfter = await bucketStorage.getChecksums(checkpoint2, [request]);
443
448
  const globalChecksum = checksumAfter.get(request.bucket);
@@ -456,6 +461,7 @@ bucket_definitions:
456
461
  data: [select * from test]
457
462
  `));
458
463
  const bucketStorage = factory.getInstance(syncRules);
464
+ const syncRulesContent = syncRules.syncConfigContent[0];
459
465
  await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
460
466
  const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
461
467
  await writer.markAllSnapshotDone('1/1');
@@ -478,7 +484,7 @@ bucket_definitions:
478
484
  await writer.commit('1/1');
479
485
  await writer.flush();
480
486
  // Get checksums here just to populate the cache
481
- await bucketStorage.getChecksums(writer.last_flushed_op, bucketRequests(syncRules, ['global[]']));
487
+ await bucketStorage.getChecksums(writer.last_flushed_op, bucketRequests(syncRulesContent, ['global[]']));
482
488
  await using writer2 = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
483
489
  const testTable2 = await test_utils.resolveTestTable(writer2, 'test', ['id'], config);
484
490
  await writer2.save({
@@ -499,7 +505,7 @@ bucket_definitions:
499
505
  minChangeRatio: 0
500
506
  });
501
507
  const checkpoint2 = writer2.last_flushed_op;
502
- const request = bucketRequest(syncRules, 'global[]');
508
+ const request = bucketRequest(syncRulesContent, 'global[]');
503
509
  // Check that the checksum was correctly updated with the clear operation after having a cached checksum
504
510
  const checksumAfter = await bucketStorage.getChecksums(checkpoint2, [request]);
505
511
  const globalChecksum = checksumAfter.get(request.bucket);
@@ -518,6 +524,7 @@ bucket_definitions:
518
524
  data: [select * from test]
519
525
  `));
520
526
  const bucketStorage = factory.getInstance(syncRules);
527
+ const syncRulesContent = syncRules.syncConfigContent[0];
521
528
  await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
522
529
  const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
523
530
  await writer.markAllSnapshotDone('1/1');
@@ -550,7 +557,7 @@ bucket_definitions:
550
557
  minBucketChanges: 1,
551
558
  minChangeRatio: 0
552
559
  });
553
- const batchAfterDefaultCompact = await test_utils.oneFromAsync(bucketStorage.getBucketDataBatch(checkpoint2, bucketRequestMap(syncRules, [['global[]', 0n]])));
560
+ const batchAfterDefaultCompact = await test_utils.oneFromAsync(bucketStorage.getBucketDataBatch(checkpoint2, bucketRequestMap(syncRulesContent, [['global[]', 0n]])));
554
561
  // Operation 1 should remain a PUT because op_id=2 is above the default maxOpId checkpoint.
555
562
  expect(batchAfterDefaultCompact.chunkData.data).toMatchObject([
556
563
  { op_id: '1', op: 'PUT', object_id: 't1' },