@powersync/service-core 0.0.0-dev-20260602073133 → 0.0.0-dev-20260909133214

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 (230) hide show
  1. package/CHANGELOG.md +152 -4
  2. package/dist/api/RouteAPI.d.ts +42 -14
  3. package/dist/api/diagnostics.d.ts +12 -1
  4. package/dist/api/diagnostics.js +36 -22
  5. package/dist/api/diagnostics.js.map +1 -1
  6. package/dist/entry/commands/compact-action.js +30 -22
  7. package/dist/entry/commands/compact-action.js.map +1 -1
  8. package/dist/metrics/metrics-interfaces.d.ts +5 -1
  9. package/dist/metrics/metrics-interfaces.js.map +1 -1
  10. package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.d.ts +36 -0
  11. package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.js +70 -0
  12. package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.js.map +1 -0
  13. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js +6 -1
  14. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js.map +1 -1
  15. package/dist/metrics/open-telemetry/util.js +7 -3
  16. package/dist/metrics/open-telemetry/util.js.map +1 -1
  17. package/dist/modules/AbstractModule.d.ts +6 -2
  18. package/dist/modules/AbstractModule.js.map +1 -1
  19. package/dist/replication/AbstractReplicator.d.ts +31 -7
  20. package/dist/replication/AbstractReplicator.js +168 -74
  21. package/dist/replication/AbstractReplicator.js.map +1 -1
  22. package/dist/replication/ReplicationModule.d.ts +3 -3
  23. package/dist/replication/ReplicationModule.js.map +1 -1
  24. package/dist/routes/RouterEngine.d.ts +1 -0
  25. package/dist/routes/RouterEngine.js +6 -1
  26. package/dist/routes/RouterEngine.js.map +1 -1
  27. package/dist/routes/configure-fastify.d.ts +104 -56
  28. package/dist/routes/configure-fastify.js +15 -2
  29. package/dist/routes/configure-fastify.js.map +1 -1
  30. package/dist/routes/endpoints/admin.d.ts +42 -24
  31. package/dist/routes/endpoints/admin.js +49 -36
  32. package/dist/routes/endpoints/admin.js.map +1 -1
  33. package/dist/routes/endpoints/checkpointing.d.ts +62 -0
  34. package/dist/routes/endpoints/checkpointing.js +65 -7
  35. package/dist/routes/endpoints/checkpointing.js.map +1 -1
  36. package/dist/routes/endpoints/socket-route.js +3 -2
  37. package/dist/routes/endpoints/socket-route.js.map +1 -1
  38. package/dist/routes/endpoints/sync-rules.js +25 -14
  39. package/dist/routes/endpoints/sync-rules.js.map +1 -1
  40. package/dist/routes/endpoints/sync-stream.js +1 -1
  41. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  42. package/dist/runner/teardown.js +8 -8
  43. package/dist/runner/teardown.js.map +1 -1
  44. package/dist/storage/BucketStorageBatch.d.ts +64 -17
  45. package/dist/storage/BucketStorageBatch.js.map +1 -1
  46. package/dist/storage/BucketStorageFactory.d.ts +50 -31
  47. package/dist/storage/BucketStorageFactory.js +10 -20
  48. package/dist/storage/BucketStorageFactory.js.map +1 -1
  49. package/dist/storage/CheckpointChecksumInvalidatedError.d.ts +12 -0
  50. package/dist/storage/CheckpointChecksumInvalidatedError.js +17 -0
  51. package/dist/storage/CheckpointChecksumInvalidatedError.js.map +1 -0
  52. package/dist/storage/ChecksumCache.d.ts +11 -6
  53. package/dist/storage/ChecksumCache.js +5 -4
  54. package/dist/storage/ChecksumCache.js.map +1 -1
  55. package/dist/storage/ParsedSyncConfigSet.d.ts +23 -0
  56. package/dist/storage/ParsedSyncConfigSet.js +2 -0
  57. package/dist/storage/ParsedSyncConfigSet.js.map +1 -0
  58. package/dist/storage/PersistedReplicationStream.d.ts +32 -0
  59. package/dist/storage/PersistedReplicationStream.js +26 -0
  60. package/dist/storage/PersistedReplicationStream.js.map +1 -0
  61. package/dist/storage/PersistedSyncConfigContent.d.ts +65 -0
  62. package/dist/storage/PersistedSyncConfigContent.js +138 -0
  63. package/dist/storage/PersistedSyncConfigContent.js.map +1 -0
  64. package/dist/storage/PersistedSyncConfigStatus.d.ts +13 -0
  65. package/dist/storage/PersistedSyncConfigStatus.js +2 -0
  66. package/dist/storage/PersistedSyncConfigStatus.js.map +1 -0
  67. package/dist/storage/ReplicationEventPayload.d.ts +6 -1
  68. package/dist/storage/SourceEntity.d.ts +13 -2
  69. package/dist/storage/SourceTable.d.ts +53 -4
  70. package/dist/storage/SourceTable.js +62 -7
  71. package/dist/storage/SourceTable.js.map +1 -1
  72. package/dist/storage/SourceTableReconciler.d.ts +83 -0
  73. package/dist/storage/SourceTableReconciler.js +95 -0
  74. package/dist/storage/SourceTableReconciler.js.map +1 -0
  75. package/dist/storage/StorageVersionConfig.d.ts +4 -0
  76. package/dist/storage/StorageVersionConfig.js +10 -1
  77. package/dist/storage/StorageVersionConfig.js.map +1 -1
  78. package/dist/storage/SyncRulesBucketStorage.d.ts +162 -26
  79. package/dist/storage/SyncRulesBucketStorage.js +3 -0
  80. package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
  81. package/dist/storage/WriteCheckpointAPI.d.ts +85 -6
  82. package/dist/storage/WriteCheckpointAPI.js +33 -0
  83. package/dist/storage/WriteCheckpointAPI.js.map +1 -1
  84. package/dist/storage/implementation/BucketDefinitionMapping.d.ts +133 -0
  85. package/dist/storage/implementation/BucketDefinitionMapping.js +351 -0
  86. package/dist/storage/implementation/BucketDefinitionMapping.js.map +1 -0
  87. package/dist/storage/implementation/IncrementalReprocessingCompatibility.d.ts +6 -0
  88. package/dist/storage/implementation/IncrementalReprocessingCompatibility.js +31 -0
  89. package/dist/storage/implementation/IncrementalReprocessingCompatibility.js.map +1 -0
  90. package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.d.ts +17 -0
  91. package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.js +70 -0
  92. package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.js.map +1 -0
  93. package/dist/storage/implementation/ReplicationStreamStorageIds.d.ts +15 -0
  94. package/dist/storage/implementation/ReplicationStreamStorageIds.js +20 -0
  95. package/dist/storage/implementation/ReplicationStreamStorageIds.js.map +1 -0
  96. package/dist/storage/storage-index.d.ts +10 -1
  97. package/dist/storage/storage-index.js +10 -1
  98. package/dist/storage/storage-index.js.map +1 -1
  99. package/dist/storage/storage-metrics.js +120 -4
  100. package/dist/storage/storage-metrics.js.map +1 -1
  101. package/dist/sync/BucketChecksumState.d.ts +12 -2
  102. package/dist/sync/BucketChecksumState.js +69 -21
  103. package/dist/sync/BucketChecksumState.js.map +1 -1
  104. package/dist/sync/RequestTracker.d.ts +7 -0
  105. package/dist/sync/RequestTracker.js +12 -0
  106. package/dist/sync/RequestTracker.js.map +1 -1
  107. package/dist/sync/sync.js +184 -43
  108. package/dist/sync/sync.js.map +1 -1
  109. package/dist/sync/util.d.ts +5 -0
  110. package/dist/sync/util.js +19 -1
  111. package/dist/sync/util.js.map +1 -1
  112. package/dist/system/ServiceContext.d.ts +2 -0
  113. package/dist/system/ServiceContext.js +2 -0
  114. package/dist/system/ServiceContext.js.map +1 -1
  115. package/dist/tracing/PerformanceTracer.d.ts +23 -1
  116. package/dist/tracing/PerformanceTracer.js +11 -0
  117. package/dist/tracing/PerformanceTracer.js.map +1 -1
  118. package/dist/util/checkpointing.d.ts +4 -8
  119. package/dist/util/checkpointing.js +1 -16
  120. package/dist/util/checkpointing.js.map +1 -1
  121. package/dist/util/config/compound-config-collector.js +23 -2
  122. package/dist/util/config/compound-config-collector.js.map +1 -1
  123. package/dist/util/config/defaults.d.ts +2 -0
  124. package/dist/util/config/defaults.js +2 -0
  125. package/dist/util/config/defaults.js.map +1 -1
  126. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js +1 -0
  127. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
  128. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js +1 -0
  129. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
  130. package/dist/util/config/sync-rules/sync-rules-provider.d.ts +2 -0
  131. package/dist/util/config/sync-rules/sync-rules-provider.js +3 -0
  132. package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -1
  133. package/dist/util/config/types.d.ts +4 -1
  134. package/dist/util/lsn.d.ts +4 -0
  135. package/dist/util/lsn.js +10 -0
  136. package/dist/util/lsn.js.map +1 -1
  137. package/dist/util/protocol-types.d.ts +4 -4
  138. package/dist/util/protocol-types.js +3 -2
  139. package/dist/util/protocol-types.js.map +1 -1
  140. package/dist/util/util-index.d.ts +1 -0
  141. package/dist/util/util-index.js +1 -0
  142. package/dist/util/util-index.js.map +1 -1
  143. package/dist/util/utils.d.ts +3 -2
  144. package/dist/util/utils.js +17 -2
  145. package/dist/util/utils.js.map +1 -1
  146. package/dist/util/write-checkpoint-batcher.d.ts +19 -0
  147. package/dist/util/write-checkpoint-batcher.js +100 -0
  148. package/dist/util/write-checkpoint-batcher.js.map +1 -0
  149. package/package.json +7 -7
  150. package/src/api/RouteAPI.ts +43 -14
  151. package/src/api/diagnostics.ts +45 -26
  152. package/src/entry/commands/compact-action.ts +37 -23
  153. package/src/metrics/metrics-interfaces.ts +6 -1
  154. package/src/metrics/open-telemetry/MetricAttributeFilteringExporter.ts +85 -0
  155. package/src/metrics/open-telemetry/OpenTelemetryMetricsFactory.ts +7 -2
  156. package/src/metrics/open-telemetry/util.ts +7 -3
  157. package/src/modules/AbstractModule.ts +6 -2
  158. package/src/replication/AbstractReplicator.ts +212 -78
  159. package/src/replication/ReplicationModule.ts +2 -3
  160. package/src/routes/RouterEngine.ts +7 -1
  161. package/src/routes/configure-fastify.ts +25 -2
  162. package/src/routes/endpoints/admin.ts +75 -51
  163. package/src/routes/endpoints/checkpointing.ts +79 -8
  164. package/src/routes/endpoints/socket-route.ts +3 -2
  165. package/src/routes/endpoints/sync-rules.ts +26 -14
  166. package/src/routes/endpoints/sync-stream.ts +1 -1
  167. package/src/runner/teardown.ts +8 -8
  168. package/src/storage/BucketStorageBatch.ts +65 -18
  169. package/src/storage/BucketStorageFactory.ts +73 -46
  170. package/src/storage/CheckpointChecksumInvalidatedError.ts +17 -0
  171. package/src/storage/ChecksumCache.ts +27 -14
  172. package/src/storage/ParsedSyncConfigSet.ts +25 -0
  173. package/src/storage/PersistedReplicationStream.ts +55 -0
  174. package/src/storage/PersistedSyncConfigContent.ts +207 -0
  175. package/src/storage/PersistedSyncConfigStatus.ts +14 -0
  176. package/src/storage/ReplicationEventPayload.ts +6 -1
  177. package/src/storage/SourceEntity.ts +12 -2
  178. package/src/storage/SourceTable.ts +96 -8
  179. package/src/storage/SourceTableReconciler.ts +188 -0
  180. package/src/storage/StorageVersionConfig.ts +11 -1
  181. package/src/storage/SyncRulesBucketStorage.ts +189 -27
  182. package/src/storage/WriteCheckpointAPI.ts +140 -6
  183. package/src/storage/implementation/BucketDefinitionMapping.ts +539 -0
  184. package/src/storage/implementation/IncrementalReprocessingCompatibility.ts +41 -0
  185. package/src/storage/implementation/IncrementalReprocessingSyncConfigLog.ts +126 -0
  186. package/src/storage/implementation/ReplicationStreamStorageIds.ts +21 -0
  187. package/src/storage/storage-index.ts +11 -1
  188. package/src/storage/storage-metrics.ts +154 -8
  189. package/src/sync/BucketChecksumState.ts +105 -21
  190. package/src/sync/RequestTracker.ts +20 -0
  191. package/src/sync/sync.ts +214 -50
  192. package/src/sync/util.ts +33 -8
  193. package/src/system/ServiceContext.ts +7 -0
  194. package/src/tracing/PerformanceTracer.ts +41 -1
  195. package/src/util/checkpointing.ts +4 -22
  196. package/src/util/config/compound-config-collector.ts +31 -1
  197. package/src/util/config/defaults.ts +2 -0
  198. package/src/util/config/sync-rules/impl/base64-sync-rules-collector.ts +1 -0
  199. package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +1 -0
  200. package/src/util/config/sync-rules/sync-rules-provider.ts +5 -0
  201. package/src/util/config/types.ts +4 -1
  202. package/src/util/lsn.ts +9 -0
  203. package/src/util/protocol-types.ts +3 -2
  204. package/src/util/util-index.ts +1 -0
  205. package/src/util/utils.ts +16 -2
  206. package/src/util/write-checkpoint-batcher.ts +142 -0
  207. package/test/src/AbstractReplicator.test.ts +177 -0
  208. package/test/src/MetricAttributeFilteringExporter.test.ts +96 -0
  209. package/test/src/PersistedSyncConfigContent.test.ts +152 -0
  210. package/test/src/checksum_cache.test.ts +22 -0
  211. package/test/src/config.test.ts +142 -0
  212. package/test/src/diagnostics.test.ts +87 -34
  213. package/test/src/module-loader.test.ts +33 -1
  214. package/test/src/routes/admin.test.ts +188 -18
  215. package/test/src/routes/checkpointing.test.ts +54 -0
  216. package/test/src/routes/mocks.ts +6 -2
  217. package/test/src/routes/stream.test.ts +123 -2
  218. package/test/src/source-table-reconciler.test.ts +244 -0
  219. package/test/src/storage/SourceTable.test.ts +92 -0
  220. package/test/src/storage-metrics.test.ts +148 -0
  221. package/test/src/sync/BucketChecksumState.test.ts +98 -12
  222. package/test/src/sync/util.test.ts +28 -1
  223. package/test/src/util/checkpointing.test.ts +249 -0
  224. package/test/src/util/utils.test.ts +23 -0
  225. package/tsconfig.json +1 -4
  226. package/tsconfig.tsbuildinfo +1 -1
  227. package/dist/storage/PersistedSyncRulesContent.d.ts +0 -59
  228. package/dist/storage/PersistedSyncRulesContent.js +0 -100
  229. package/dist/storage/PersistedSyncRulesContent.js.map +0 -1
  230. package/src/storage/PersistedSyncRulesContent.ts +0 -174
@@ -0,0 +1,133 @@
1
+ import { BucketDataSource, BucketDefinitionId, EventDefinitionId, ParameterIndexId, ParameterIndexLookupCreator, ParameterLookupDefinitionId, SerializedSyncPlan, SourceTableRef, SyncConfigWithErrors } from '@powersync/service-sync-rules';
2
+ /** Minimal shape required to resolve an event's assigned id: its name is the per-config key. */
3
+ export interface NamedEventDefinition {
4
+ readonly name: string;
5
+ }
6
+ export interface SerializedSyncConfigWithMapping {
7
+ plan: SerializedSyncPlan;
8
+ mapping: SingleSyncConfigBucketDefinitionMapping;
9
+ }
10
+ export type IncrementalMappingDefinitionType = 'bucket_data' | 'parameter_lookup' | 'event';
11
+ export interface IncrementalMappingDefinitionChange {
12
+ type: IncrementalMappingDefinitionType;
13
+ name: string;
14
+ id: BucketDefinitionId | ParameterIndexId | EventDefinitionId;
15
+ }
16
+ export interface IncrementalMappingChanges {
17
+ reusedDefinitions: IncrementalMappingDefinitionChange[];
18
+ addedDefinitions: IncrementalMappingDefinitionChange[];
19
+ }
20
+ export interface IncrementalMappingResult {
21
+ mapping: SingleSyncConfigBucketDefinitionMapping;
22
+ changes: IncrementalMappingChanges;
23
+ }
24
+ export interface SyncConfigWithMapping {
25
+ syncConfigId?: string;
26
+ syncConfig: SyncConfigWithErrors;
27
+ mapping: SingleSyncConfigBucketDefinitionMapping | null;
28
+ }
29
+ export interface SyncConfigWithRequiredMapping {
30
+ syncConfigId: string;
31
+ syncConfig: SyncConfigWithErrors;
32
+ mapping: SingleSyncConfigBucketDefinitionMapping;
33
+ }
34
+ export interface PersistedDefinitionMapping {
35
+ /**
36
+ * Map of uniqueName -> id, unique per replication stream.
37
+ */
38
+ definitions: Record<string, string>;
39
+ /**
40
+ * Map of (lookupName, queryId) -> id, unique per replication stream.
41
+ */
42
+ parameter_indexes: Record<string, string>;
43
+ /**
44
+ * Map of event name -> id, unique per replication stream. Absent for mappings persisted before events were tracked.
45
+ */
46
+ events?: Record<string, string>;
47
+ }
48
+ /**
49
+ * Represents a mapping from bucket data sources and parameter lookup sources to stable IDs used for bucket definition and parameter index persistence.
50
+ *
51
+ * Usage is deliberately restricted: writer/batch paths resolve through their own parsed
52
+ * sync config set's mapping, and read paths resolve through the persisted
53
+ * {@link SingleSyncConfigBucketDefinitionMapping} of the single sync config they serve.
54
+ * Do not construct ad-hoc resolution paths from parsed sources.
55
+ */
56
+ export interface BucketDefinitionMapping {
57
+ /**
58
+ * Given a BucketDataSource within the associated SyncConfig(s), return the BucketDefinitionId, or throw if not found.
59
+ */
60
+ bucketSourceId(source: BucketDataSource): BucketDefinitionId;
61
+ parameterLookupId(source: ParameterIndexLookupCreator): ParameterIndexId;
62
+ allBucketDefinitionIds(): BucketDefinitionId[];
63
+ allParameterIndexIds(): ParameterIndexId[];
64
+ allEventDefinitionIds(): EventDefinitionId[];
65
+ syncConfigIdsForSourceTable(selectedSyncConfigIds: string[], table: SourceTableRef, bucketDataSourceIds: BucketDefinitionId[], parameterLookupSourceIds: ParameterIndexId[], eventDefinitionIds: EventDefinitionId[]): string[];
66
+ snapshotBlockingSourceTablesFilter(syncConfigId: string): Record<string, unknown>;
67
+ }
68
+ /**
69
+ * A BucketDefinitionMapping associated with a single SyncConfig.
70
+ *
71
+ * Within a single SyncConfig, unique names are the persistence key for bucket definitions,
72
+ * so lookups here are name-based by design. MongoHydrationState and
73
+ * MultiSyncConfigBucketDefinitionMapping handle the mapping across multiple SyncConfigs in
74
+ * the same replication stream, where names are not unique.
75
+ */
76
+ export declare class SingleSyncConfigBucketDefinitionMapping implements BucketDefinitionMapping {
77
+ private definitions;
78
+ private parameterLookupMapping;
79
+ private events;
80
+ static fromPersistedMapping(mapping: PersistedDefinitionMapping): SingleSyncConfigBucketDefinitionMapping;
81
+ static fromParsedSyncConfig(syncConfig: SyncConfigWithErrors): SingleSyncConfigBucketDefinitionMapping;
82
+ /**
83
+ *
84
+ * @param compatibleConfigs SyncConfigs with definitions that may be re-used
85
+ * @param newPlan
86
+ * @param reservedMappings _all_ mappings used currently and historically for the replication stream; used to construct new ids
87
+ * @returns
88
+ */
89
+ static constructIncrementalMappingFromSerializedPlans(compatibleConfigs: SerializedSyncConfigWithMapping[], newPlan: SerializedSyncPlan, reservedMappings: SingleSyncConfigBucketDefinitionMapping[]): SingleSyncConfigBucketDefinitionMapping;
90
+ static constructIncrementalMappingWithChanges(compatibleConfigs: SerializedSyncConfigWithMapping[], newPlan: SerializedSyncPlan, reservedMappings: SingleSyncConfigBucketDefinitionMapping[]): IncrementalMappingResult;
91
+ constructor(definitions?: Record<string, BucketDefinitionId>, parameterLookupMapping?: Record<string, ParameterIndexId>, events?: Record<string, EventDefinitionId>);
92
+ bucketSourceId(source: BucketDataSource): BucketDefinitionId;
93
+ bucketSourceIdByName(uniqueName: string): BucketDefinitionId;
94
+ allBucketDefinitionIds(): BucketDefinitionId[];
95
+ bucketDefinitionEntries(): IncrementalMappingDefinitionChange[];
96
+ allParameterIndexIds(): ParameterIndexId[];
97
+ parameterIndexEntries(): IncrementalMappingDefinitionChange[];
98
+ allEventDefinitionIds(): EventDefinitionId[];
99
+ eventDefinitionEntries(): IncrementalMappingDefinitionChange[];
100
+ allDefinitionEntries(): IncrementalMappingDefinitionChange[];
101
+ parameterLookupId(source: ParameterIndexLookupCreator): ParameterIndexId;
102
+ parameterLookupIdByKey(key: string): ParameterIndexId;
103
+ eventId(event: NamedEventDefinition): EventDefinitionId;
104
+ eventDefinitionIdByName(name: string): EventDefinitionId;
105
+ serialize(): PersistedDefinitionMapping;
106
+ syncConfigIdsForSourceTable(selectedSyncConfigIds: string[], _table: SourceTableRef, bucketDataSourceIds: BucketDefinitionId[], parameterLookupSourceIds: ParameterIndexId[], eventDefinitionIds: EventDefinitionId[]): string[];
107
+ snapshotBlockingSourceTablesFilter(_syncConfigId: string): Record<string, unknown>;
108
+ }
109
+ /**
110
+ * A BucketDefinitionMapping across all SyncConfigs of one parse of a replication stream.
111
+ *
112
+ * Source lookups are strictly identity-based: a source that did not come from the parse
113
+ * this mapping was constructed with is an error. Unique names are not unique across sync
114
+ * configs in a replication stream, so there is deliberately no name-based fallback.
115
+ */
116
+ export declare class MultiSyncConfigBucketDefinitionMapping implements BucketDefinitionMapping {
117
+ private bucketDataSourceMappings;
118
+ private bucketDataSourceSyncConfigIdsById;
119
+ private parameterLookupMappings;
120
+ private parameterLookupSyncConfigIdsById;
121
+ private eventDefinitionSyncConfigIdsById;
122
+ private syncConfigsById;
123
+ private mappings;
124
+ constructor(syncConfigs: SyncConfigWithRequiredMapping[]);
125
+ bucketSourceId(source: BucketDataSource): BucketDefinitionId;
126
+ allBucketDefinitionIds(): BucketDefinitionId[];
127
+ parameterLookupId(source: ParameterIndexLookupCreator): ParameterIndexId;
128
+ allParameterIndexIds(): ParameterIndexId[];
129
+ allEventDefinitionIds(): EventDefinitionId[];
130
+ syncConfigIdsForSourceTable(_selectedSyncConfigIds: string[], _table: SourceTableRef, bucketDataSourceIds: BucketDefinitionId[], parameterLookupSourceIds: ParameterIndexId[], eventDefinitionIds: EventDefinitionId[]): string[];
131
+ snapshotBlockingSourceTablesFilter(syncConfigId: string): Record<string, unknown>;
132
+ }
133
+ export declare function parameterLookupKey(id: ParameterLookupDefinitionId): string;
@@ -0,0 +1,351 @@
1
+ import { ServiceAssertionError } from '@powersync/lib-services-framework';
2
+ import { HashMap, serializedEventDefinitionEquality, serializedStreamBucketDataSourceEquality, serializedStreamParameterIndexLookupCreatorEquality } from '@powersync/service-sync-rules';
3
+ /**
4
+ * A BucketDefinitionMapping associated with a single SyncConfig.
5
+ *
6
+ * Within a single SyncConfig, unique names are the persistence key for bucket definitions,
7
+ * so lookups here are name-based by design. MongoHydrationState and
8
+ * MultiSyncConfigBucketDefinitionMapping handle the mapping across multiple SyncConfigs in
9
+ * the same replication stream, where names are not unique.
10
+ */
11
+ export class SingleSyncConfigBucketDefinitionMapping {
12
+ definitions;
13
+ parameterLookupMapping;
14
+ events;
15
+ static fromPersistedMapping(mapping) {
16
+ return new SingleSyncConfigBucketDefinitionMapping(mapping.definitions ?? {}, mapping.parameter_indexes ?? {}, mapping.events ?? {});
17
+ }
18
+ static fromParsedSyncConfig(syncConfig) {
19
+ const definitionNames = syncConfig.config.bucketDataSources.map((source) => source.uniqueName).sort();
20
+ const parameterKeys = syncConfig.config.bucketParameterLookupSources
21
+ .map((source) => `${source.sourceId.lookupName}#${source.sourceId.queryId}`)
22
+ .sort();
23
+ const eventNames = syncConfig.config.eventDefinitions.map((event) => event.name).sort();
24
+ const definitions = {};
25
+ const parameterLookups = {};
26
+ const events = {};
27
+ for (const [index, uniqueName] of definitionNames.entries()) {
28
+ definitions[uniqueName] = (index + 1).toString(16);
29
+ }
30
+ for (const [index, key] of parameterKeys.entries()) {
31
+ parameterLookups[key] = (index + 1).toString(16);
32
+ }
33
+ for (const [index, name] of eventNames.entries()) {
34
+ events[name] = (index + 1).toString(16);
35
+ }
36
+ return new SingleSyncConfigBucketDefinitionMapping(definitions, parameterLookups, events);
37
+ }
38
+ /**
39
+ *
40
+ * @param compatibleConfigs SyncConfigs with definitions that may be re-used
41
+ * @param newPlan
42
+ * @param reservedMappings _all_ mappings used currently and historically for the replication stream; used to construct new ids
43
+ * @returns
44
+ */
45
+ static constructIncrementalMappingFromSerializedPlans(compatibleConfigs, newPlan, reservedMappings) {
46
+ return this.constructIncrementalMappingWithChanges(compatibleConfigs, newPlan, reservedMappings).mapping;
47
+ }
48
+ static constructIncrementalMappingWithChanges(compatibleConfigs, newPlan, reservedMappings) {
49
+ let nextBucketDefinitionId = reservedMappings
50
+ .map((mapping) => mapping.allBucketDefinitionIds())
51
+ .flat()
52
+ .reduce((maxId, id) => Math.max(maxId, parseInt(id, 16)), 0) + 1;
53
+ function generateNewBucketDefinitionId() {
54
+ const id = nextBucketDefinitionId.toString(16);
55
+ nextBucketDefinitionId++;
56
+ return id;
57
+ }
58
+ let nextParameterIndexId = reservedMappings
59
+ .map((mapping) => mapping.allParameterIndexIds())
60
+ .flat()
61
+ .reduce((maxId, id) => Math.max(maxId, parseInt(id, 16)), 0) + 1;
62
+ function generateNewParameterIndexId() {
63
+ const id = nextParameterIndexId.toString(16);
64
+ nextParameterIndexId++;
65
+ return id;
66
+ }
67
+ // Event ids are deliberately allocated per replication stream instead of being hashes or UUIDs derived from a
68
+ // compiled plan. Compatibility decides whether to reuse an existing id, keeping the storage identifier separate
69
+ // from event content and allowing the comparison to evolve independently. That comparison must remain
70
+ // conservative: a false negative only causes a new id and resnapshot, while a false positive could incorrectly
71
+ // reuse existing event state.
72
+ let nextEventDefinitionId = reservedMappings
73
+ .map((mapping) => mapping.allEventDefinitionIds())
74
+ .flat()
75
+ .reduce((maxId, id) => Math.max(maxId, parseInt(id, 16)), 0) + 1;
76
+ function generateNewEventDefinitionId() {
77
+ const id = nextEventDefinitionId.toString(16);
78
+ nextEventDefinitionId++;
79
+ return id;
80
+ }
81
+ const definitions = {};
82
+ const parameterLookups = {};
83
+ const events = {};
84
+ const changes = {
85
+ reusedDefinitions: [],
86
+ addedDefinitions: []
87
+ };
88
+ const compatibleBuckets = new HashMap(serializedStreamBucketDataSourceEquality);
89
+ const compatibleParameterLookups = new HashMap(serializedStreamParameterIndexLookupCreatorEquality);
90
+ const compatibleEvents = new HashMap(serializedEventDefinitionEquality);
91
+ for (const config of compatibleConfigs) {
92
+ for (const bucket of config.plan.buckets) {
93
+ compatibleBuckets.putIfAbsent({ bucket, dataSources: config.plan.dataSources }, () => config.mapping.bucketSourceIdByName(bucket.uniqueName));
94
+ }
95
+ for (const parameterLookup of config.plan.parameterIndexes) {
96
+ compatibleParameterLookups.putIfAbsent(parameterLookup, () => config.mapping.parameterLookupIdByKey(parameterLookupKey(parameterLookup.lookupScope)));
97
+ }
98
+ for (const event of config.plan.events ?? []) {
99
+ compatibleEvents.putIfAbsent(event, () => config.mapping.eventDefinitionIdByName(event.name));
100
+ }
101
+ }
102
+ for (const bucket of newPlan.buckets) {
103
+ const compatibleId = compatibleBuckets.get({ bucket, dataSources: newPlan.dataSources });
104
+ const id = compatibleId ?? generateNewBucketDefinitionId();
105
+ definitions[bucket.uniqueName] = id;
106
+ const change = {
107
+ type: 'bucket_data',
108
+ name: bucket.uniqueName,
109
+ id
110
+ };
111
+ if (compatibleId == null) {
112
+ changes.addedDefinitions.push(change);
113
+ }
114
+ else {
115
+ changes.reusedDefinitions.push(change);
116
+ }
117
+ }
118
+ for (const parameterLookup of newPlan.parameterIndexes) {
119
+ const compatibleId = compatibleParameterLookups.get(parameterLookup);
120
+ const id = compatibleId ?? generateNewParameterIndexId();
121
+ const key = parameterLookupKey(parameterLookup.lookupScope);
122
+ parameterLookups[key] = id;
123
+ const change = {
124
+ type: 'parameter_lookup',
125
+ name: key,
126
+ id
127
+ };
128
+ if (compatibleId == null) {
129
+ changes.addedDefinitions.push(change);
130
+ }
131
+ else {
132
+ changes.reusedDefinitions.push(change);
133
+ }
134
+ }
135
+ for (const event of newPlan.events ?? []) {
136
+ const compatibleId = compatibleEvents.get(event);
137
+ const id = compatibleId ?? generateNewEventDefinitionId();
138
+ events[event.name] = id;
139
+ const change = {
140
+ type: 'event',
141
+ name: event.name,
142
+ id
143
+ };
144
+ if (compatibleId == null) {
145
+ changes.addedDefinitions.push(change);
146
+ }
147
+ else {
148
+ changes.reusedDefinitions.push(change);
149
+ }
150
+ }
151
+ return {
152
+ mapping: new SingleSyncConfigBucketDefinitionMapping(definitions, parameterLookups, events),
153
+ changes
154
+ };
155
+ }
156
+ constructor(definitions = {}, parameterLookupMapping = {}, events = {}) {
157
+ this.definitions = definitions;
158
+ this.parameterLookupMapping = parameterLookupMapping;
159
+ this.events = events;
160
+ }
161
+ bucketSourceId(source) {
162
+ return this.bucketSourceIdByName(source.uniqueName);
163
+ }
164
+ bucketSourceIdByName(uniqueName) {
165
+ const defId = this.definitions[uniqueName];
166
+ if (defId == null) {
167
+ throw new ServiceAssertionError(`No mapping found for bucket source ${uniqueName}`);
168
+ }
169
+ return defId;
170
+ }
171
+ allBucketDefinitionIds() {
172
+ return Object.values(this.definitions);
173
+ }
174
+ bucketDefinitionEntries() {
175
+ return Object.entries(this.definitions).map(([name, id]) => ({
176
+ type: 'bucket_data',
177
+ name,
178
+ id
179
+ }));
180
+ }
181
+ allParameterIndexIds() {
182
+ return Object.values(this.parameterLookupMapping);
183
+ }
184
+ parameterIndexEntries() {
185
+ return Object.entries(this.parameterLookupMapping).map(([name, id]) => ({
186
+ type: 'parameter_lookup',
187
+ name,
188
+ id
189
+ }));
190
+ }
191
+ allEventDefinitionIds() {
192
+ return Object.values(this.events);
193
+ }
194
+ eventDefinitionEntries() {
195
+ return Object.entries(this.events).map(([name, id]) => ({
196
+ type: 'event',
197
+ name,
198
+ id
199
+ }));
200
+ }
201
+ allDefinitionEntries() {
202
+ return [...this.bucketDefinitionEntries(), ...this.parameterIndexEntries(), ...this.eventDefinitionEntries()];
203
+ }
204
+ parameterLookupId(source) {
205
+ return this.parameterLookupIdByKey(parameterLookupKey(source.sourceId));
206
+ }
207
+ parameterLookupIdByKey(key) {
208
+ const defId = this.parameterLookupMapping[key];
209
+ if (defId == null) {
210
+ throw new ServiceAssertionError(`No mapping found for parameter lookup source ${key}`);
211
+ }
212
+ return defId;
213
+ }
214
+ eventId(event) {
215
+ return this.eventDefinitionIdByName(event.name);
216
+ }
217
+ eventDefinitionIdByName(name) {
218
+ const id = this.events[name];
219
+ if (id == null) {
220
+ throw new ServiceAssertionError(`No mapping found for event definition ${name}`);
221
+ }
222
+ return id;
223
+ }
224
+ serialize() {
225
+ return {
226
+ definitions: { ...this.definitions },
227
+ parameter_indexes: { ...this.parameterLookupMapping },
228
+ events: { ...this.events }
229
+ };
230
+ }
231
+ syncConfigIdsForSourceTable(selectedSyncConfigIds, _table, bucketDataSourceIds, parameterLookupSourceIds, eventDefinitionIds) {
232
+ return bucketDataSourceIds.length > 0 || parameterLookupSourceIds.length > 0 || eventDefinitionIds.length > 0
233
+ ? selectedSyncConfigIds
234
+ : [];
235
+ }
236
+ snapshotBlockingSourceTablesFilter(_syncConfigId) {
237
+ const clauses = [];
238
+ const bucketDataSourceIds = this.allBucketDefinitionIds();
239
+ if (bucketDataSourceIds.length > 0) {
240
+ clauses.push({ bucket_data_source_ids: { $in: bucketDataSourceIds } });
241
+ }
242
+ const parameterLookupSourceIds = this.allParameterIndexIds();
243
+ if (parameterLookupSourceIds.length > 0) {
244
+ clauses.push({ parameter_lookup_source_ids: { $in: parameterLookupSourceIds } });
245
+ }
246
+ const eventDefinitionIds = this.allEventDefinitionIds();
247
+ if (eventDefinitionIds.length > 0) {
248
+ clauses.push({ event_definition_ids: { $in: eventDefinitionIds } });
249
+ }
250
+ if (clauses.length == 0) {
251
+ return {
252
+ snapshot_done: false,
253
+ _id: { $exists: false }
254
+ };
255
+ }
256
+ return {
257
+ snapshot_done: false,
258
+ $or: clauses
259
+ };
260
+ }
261
+ }
262
+ /**
263
+ * A BucketDefinitionMapping across all SyncConfigs of one parse of a replication stream.
264
+ *
265
+ * Source lookups are strictly identity-based: a source that did not come from the parse
266
+ * this mapping was constructed with is an error. Unique names are not unique across sync
267
+ * configs in a replication stream, so there is deliberately no name-based fallback.
268
+ */
269
+ export class MultiSyncConfigBucketDefinitionMapping {
270
+ bucketDataSourceMappings = new WeakMap();
271
+ bucketDataSourceSyncConfigIdsById = new Map();
272
+ parameterLookupMappings = new WeakMap();
273
+ parameterLookupSyncConfigIdsById = new Map();
274
+ eventDefinitionSyncConfigIdsById = new Map();
275
+ syncConfigsById = new Map();
276
+ mappings;
277
+ constructor(syncConfigs) {
278
+ this.mappings = syncConfigs.map((config) => config.mapping);
279
+ for (const config of syncConfigs) {
280
+ this.syncConfigsById.set(config.syncConfigId, config);
281
+ for (const source of config.syncConfig.config.bucketDataSources) {
282
+ this.bucketDataSourceMappings.set(source, config.mapping);
283
+ addSetEntry(this.bucketDataSourceSyncConfigIdsById, config.mapping.bucketSourceId(source), config.syncConfigId);
284
+ }
285
+ for (const source of config.syncConfig.config.bucketParameterLookupSources) {
286
+ this.parameterLookupMappings.set(source, config.mapping);
287
+ addSetEntry(this.parameterLookupSyncConfigIdsById, config.mapping.parameterLookupId(source), config.syncConfigId);
288
+ }
289
+ for (const event of config.syncConfig.config.eventDefinitions) {
290
+ addSetEntry(this.eventDefinitionSyncConfigIdsById, config.mapping.eventId(event), config.syncConfigId);
291
+ }
292
+ }
293
+ }
294
+ bucketSourceId(source) {
295
+ const mapping = this.bucketDataSourceMappings.get(source);
296
+ if (mapping == null) {
297
+ throw new ServiceAssertionError(`Bucket source ${source.uniqueName} is not associated with this parse of the sync configs`);
298
+ }
299
+ return mapping.bucketSourceId(source);
300
+ }
301
+ allBucketDefinitionIds() {
302
+ return [...new Set(this.mappings.flatMap((mapping) => mapping.allBucketDefinitionIds()))];
303
+ }
304
+ parameterLookupId(source) {
305
+ const mapping = this.parameterLookupMappings.get(source);
306
+ if (mapping == null) {
307
+ throw new ServiceAssertionError(`Parameter lookup source ${source.sourceId.lookupName}#${source.sourceId.queryId} is not associated with this parse of the sync configs`);
308
+ }
309
+ return mapping.parameterLookupId(source);
310
+ }
311
+ allParameterIndexIds() {
312
+ return [...new Set(this.mappings.flatMap((mapping) => mapping.allParameterIndexIds()))];
313
+ }
314
+ allEventDefinitionIds() {
315
+ return [...new Set(this.mappings.flatMap((mapping) => mapping.allEventDefinitionIds()))];
316
+ }
317
+ syncConfigIdsForSourceTable(_selectedSyncConfigIds, _table, bucketDataSourceIds, parameterLookupSourceIds, eventDefinitionIds) {
318
+ const ids = new Set();
319
+ for (const sourceId of bucketDataSourceIds) {
320
+ addAll(ids, this.bucketDataSourceSyncConfigIdsById.get(sourceId));
321
+ }
322
+ for (const sourceId of parameterLookupSourceIds) {
323
+ addAll(ids, this.parameterLookupSyncConfigIdsById.get(sourceId));
324
+ }
325
+ for (const eventDefinitionId of eventDefinitionIds) {
326
+ addAll(ids, this.eventDefinitionSyncConfigIdsById.get(eventDefinitionId));
327
+ }
328
+ return [...ids];
329
+ }
330
+ snapshotBlockingSourceTablesFilter(syncConfigId) {
331
+ const config = this.syncConfigsById.get(syncConfigId);
332
+ if (config == null) {
333
+ throw new ServiceAssertionError(`No mapping found for sync config ${syncConfigId}`);
334
+ }
335
+ return config.mapping.snapshotBlockingSourceTablesFilter(syncConfigId);
336
+ }
337
+ }
338
+ export function parameterLookupKey(id) {
339
+ return `${id.lookupName}#${id.queryId}`;
340
+ }
341
+ function addSetEntry(map, key, value) {
342
+ const existing = map.get(key) ?? new Set();
343
+ existing.add(value);
344
+ map.set(key, existing);
345
+ }
346
+ function addAll(target, values) {
347
+ for (const value of values ?? []) {
348
+ target.add(value);
349
+ }
350
+ }
351
+ //# sourceMappingURL=BucketDefinitionMapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BucketDefinitionMapping.js","sourceRoot":"","sources":["../../../src/storage/implementation/BucketDefinitionMapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Logger } from 'winston';
2
+ import { SerializedSyncPlan, UpdateSyncRulesOptions } from '../BucketStorageFactory.js';
3
+ /**
4
+ * Check if a sync config update can use incremental reprocessing.
5
+ */
6
+ export declare function isCompatible(existingPlans: (SerializedSyncPlan | null)[], updateConfig: UpdateSyncRulesOptions['config'], logger: Logger): boolean;
@@ -0,0 +1,31 @@
1
+ import { CompatibilityContext } from '@powersync/service-sync-rules';
2
+ /**
3
+ * Check if a sync config update can use incremental reprocessing.
4
+ */
5
+ export function isCompatible(existingPlans, updateConfig, logger) {
6
+ if (updateConfig.plan == null) {
7
+ // Only support sync streams with serialized plans
8
+ logger.info(`Not using current sync streams - incremental reprocessing not supported`);
9
+ return false;
10
+ }
11
+ // We don't check the storage version here - that is checked upstream.
12
+ if (existingPlans.length == 0) {
13
+ // Could technically be compatible, but there is no reason to re-use this stream.
14
+ return false;
15
+ }
16
+ if (existingPlans.some((plan) => plan == null)) {
17
+ // Only support sync streams with serialized plans
18
+ logger.info(`Existing replication stream not using current sync streams - incremental reprocessing not supported`);
19
+ return false;
20
+ }
21
+ // Technically we can compare the serialized compatibility versions? But this does not add much overhead.
22
+ const first = existingPlans[0];
23
+ const streamCompatibility = CompatibilityContext.deserialize(first.compatibility);
24
+ if (!streamCompatibility.equals(updateConfig.parsed.config.compatibility)) {
25
+ // Compatibility options must match
26
+ logger.info(`Compatibility options changed - incremental reprocessing not supported`);
27
+ return false;
28
+ }
29
+ return true;
30
+ }
31
+ //# sourceMappingURL=IncrementalReprocessingCompatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncrementalReprocessingCompatibility.js","sourceRoot":"","sources":["../../../src/storage/implementation/IncrementalReprocessingCompatibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIrE;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,aAA4C,EAC5C,YAA8C,EAC9C,MAAc;IAEd,IAAI,YAAY,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QAC9B,kDAAkD;QAClD,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sEAAsE;IACtE,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC9B,iFAAiF;QACjF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QAC/C,kDAAkD;QAClD,MAAM,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;QACnH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yGAAyG;IACzG,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,WAAW,CAAC,KAAM,CAAC,aAAa,CAAC,CAAC;IACnF,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1E,mCAAmC;QACnC,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QACtF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { SyncConfigWithErrors } from '@powersync/service-sync-rules';
2
+ import { IncrementalMappingChanges, IncrementalMappingDefinitionChange, SingleSyncConfigBucketDefinitionMapping } from './BucketDefinitionMapping.js';
3
+ export interface IncrementalDefinitionLogEntry extends IncrementalMappingDefinitionChange {
4
+ sourceTables?: string[];
5
+ }
6
+ export interface IncrementalSyncConfigUpdateLog {
7
+ reusedDefinitions: IncrementalDefinitionLogEntry[];
8
+ addedDefinitions: IncrementalDefinitionLogEntry[];
9
+ droppedDefinitions: IncrementalDefinitionLogEntry[];
10
+ }
11
+ export declare function formatIncrementalSyncConfigUpdateLog(log: IncrementalSyncConfigUpdateLog): string;
12
+ export declare function describeIncrementalSyncConfigUpdate(options: {
13
+ activeMappings: SingleSyncConfigBucketDefinitionMapping[];
14
+ newMapping: SingleSyncConfigBucketDefinitionMapping;
15
+ newSyncConfig: SyncConfigWithErrors;
16
+ mappingChanges: IncrementalMappingChanges;
17
+ }): IncrementalSyncConfigUpdateLog;
@@ -0,0 +1,70 @@
1
+ export function formatIncrementalSyncConfigUpdateLog(log) {
2
+ return [
3
+ formatDefinitionSection('Reused definitions', log.reusedDefinitions),
4
+ formatDefinitionSection('New definitions', log.addedDefinitions, { includeSnapshotTables: true }),
5
+ formatDefinitionSection('Definitions to drop after switching', log.droppedDefinitions)
6
+ ].join('\n');
7
+ }
8
+ export function describeIncrementalSyncConfigUpdate(options) {
9
+ const { activeMappings, newMapping, newSyncConfig, mappingChanges } = options;
10
+ // Buckets, parameter lookups and events all flow through the mapping's assigned ids, so their changes are
11
+ // already present in mappingChanges and allDefinitionEntries().
12
+ const newDefinitionKeys = new Set(newMapping.allDefinitionEntries().map(definitionKey));
13
+ const activeDefinitions = uniqueDefinitions(activeMappings.flatMap((mapping) => mapping.allDefinitionEntries()));
14
+ return {
15
+ reusedDefinitions: mappingChanges.reusedDefinitions,
16
+ addedDefinitions: mappingChanges.addedDefinitions.map((definition) => {
17
+ const sourceTables = sourceTablesForDefinition(newSyncConfig, newMapping, definition);
18
+ return {
19
+ ...definition,
20
+ sourceTables
21
+ };
22
+ }),
23
+ droppedDefinitions: activeDefinitions.filter((definition) => !newDefinitionKeys.has(definitionKey(definition)))
24
+ };
25
+ }
26
+ function sourceTablesForDefinition(syncConfig, mapping, definition) {
27
+ if (definition.type == 'bucket_data') {
28
+ return sourceTablesForSources(syncConfig.config.bucketDataSources.filter((source) => mapping.bucketSourceId(source) == definition.id));
29
+ }
30
+ if (definition.type == 'parameter_lookup') {
31
+ return sourceTablesForSources(syncConfig.config.bucketParameterLookupSources.filter((source) => mapping.parameterLookupId(source) == definition.id));
32
+ }
33
+ return sourceTablesForEvents(syncConfig.config.eventDefinitions.filter((event) => mapping.eventId(event) == definition.id));
34
+ }
35
+ function sourceTablesForSources(sources) {
36
+ return uniqueSorted(sources.flatMap((source) => [...source.getSourceTables()].map((table) => table.tablePattern)));
37
+ }
38
+ function sourceTablesForEvents(events) {
39
+ return uniqueSorted(events.flatMap((event) => [...event.getSourceTables()].map((table) => table.tablePattern)));
40
+ }
41
+ function definitionKey(definition) {
42
+ return `${definition.type}:${definition.id}`;
43
+ }
44
+ function uniqueSorted(values) {
45
+ return [...new Set(values)].sort();
46
+ }
47
+ function uniqueDefinitions(definitions) {
48
+ const byKey = new Map();
49
+ for (const definition of definitions) {
50
+ byKey.set(definitionKey(definition), definition);
51
+ }
52
+ return [...byKey.values()];
53
+ }
54
+ function formatDefinitionSection(title, definitions, options = {}) {
55
+ if (definitions.length == 0) {
56
+ return `${title}: none`;
57
+ }
58
+ return [`${title}:`, ...definitions.map((definition) => ` - ${formatDefinition(definition, options)}`)].join('\n');
59
+ }
60
+ function formatDefinition(definition, options) {
61
+ const details = [`type=${definition.type}`, `id=${definition.id}`, `name=${definition.name}`];
62
+ if (definition.sourceTables != null) {
63
+ details.push(`tables=${formatList(definition.sourceTables)}`);
64
+ }
65
+ return details.join(', ');
66
+ }
67
+ function formatList(values) {
68
+ return values.length == 0 ? 'none' : values.join(', ');
69
+ }
70
+ //# sourceMappingURL=IncrementalReprocessingSyncConfigLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncrementalReprocessingSyncConfigLog.js","sourceRoot":"","sources":["../../../src/storage/implementation/IncrementalReprocessingSyncConfigLog.ts"],"names":[],"mappings":"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"}