@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.
- package/CHANGELOG.md +152 -4
- package/dist/api/RouteAPI.d.ts +42 -14
- package/dist/api/diagnostics.d.ts +12 -1
- package/dist/api/diagnostics.js +36 -22
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/entry/commands/compact-action.js +30 -22
- package/dist/entry/commands/compact-action.js.map +1 -1
- package/dist/metrics/metrics-interfaces.d.ts +5 -1
- package/dist/metrics/metrics-interfaces.js.map +1 -1
- package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.d.ts +36 -0
- package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.js +70 -0
- package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.js.map +1 -0
- package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js +6 -1
- package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js.map +1 -1
- package/dist/metrics/open-telemetry/util.js +7 -3
- package/dist/metrics/open-telemetry/util.js.map +1 -1
- package/dist/modules/AbstractModule.d.ts +6 -2
- package/dist/modules/AbstractModule.js.map +1 -1
- package/dist/replication/AbstractReplicator.d.ts +31 -7
- package/dist/replication/AbstractReplicator.js +168 -74
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/replication/ReplicationModule.d.ts +3 -3
- package/dist/replication/ReplicationModule.js.map +1 -1
- package/dist/routes/RouterEngine.d.ts +1 -0
- package/dist/routes/RouterEngine.js +6 -1
- package/dist/routes/RouterEngine.js.map +1 -1
- package/dist/routes/configure-fastify.d.ts +104 -56
- package/dist/routes/configure-fastify.js +15 -2
- package/dist/routes/configure-fastify.js.map +1 -1
- package/dist/routes/endpoints/admin.d.ts +42 -24
- package/dist/routes/endpoints/admin.js +49 -36
- package/dist/routes/endpoints/admin.js.map +1 -1
- package/dist/routes/endpoints/checkpointing.d.ts +62 -0
- package/dist/routes/endpoints/checkpointing.js +65 -7
- package/dist/routes/endpoints/checkpointing.js.map +1 -1
- package/dist/routes/endpoints/socket-route.js +3 -2
- package/dist/routes/endpoints/socket-route.js.map +1 -1
- package/dist/routes/endpoints/sync-rules.js +25 -14
- package/dist/routes/endpoints/sync-rules.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.js +1 -1
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/runner/teardown.js +8 -8
- package/dist/runner/teardown.js.map +1 -1
- package/dist/storage/BucketStorageBatch.d.ts +64 -17
- package/dist/storage/BucketStorageBatch.js.map +1 -1
- package/dist/storage/BucketStorageFactory.d.ts +50 -31
- package/dist/storage/BucketStorageFactory.js +10 -20
- package/dist/storage/BucketStorageFactory.js.map +1 -1
- package/dist/storage/CheckpointChecksumInvalidatedError.d.ts +12 -0
- package/dist/storage/CheckpointChecksumInvalidatedError.js +17 -0
- package/dist/storage/CheckpointChecksumInvalidatedError.js.map +1 -0
- package/dist/storage/ChecksumCache.d.ts +11 -6
- package/dist/storage/ChecksumCache.js +5 -4
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/ParsedSyncConfigSet.d.ts +23 -0
- package/dist/storage/ParsedSyncConfigSet.js +2 -0
- package/dist/storage/ParsedSyncConfigSet.js.map +1 -0
- package/dist/storage/PersistedReplicationStream.d.ts +32 -0
- package/dist/storage/PersistedReplicationStream.js +26 -0
- package/dist/storage/PersistedReplicationStream.js.map +1 -0
- package/dist/storage/PersistedSyncConfigContent.d.ts +65 -0
- package/dist/storage/PersistedSyncConfigContent.js +138 -0
- package/dist/storage/PersistedSyncConfigContent.js.map +1 -0
- package/dist/storage/PersistedSyncConfigStatus.d.ts +13 -0
- package/dist/storage/PersistedSyncConfigStatus.js +2 -0
- package/dist/storage/PersistedSyncConfigStatus.js.map +1 -0
- package/dist/storage/ReplicationEventPayload.d.ts +6 -1
- package/dist/storage/SourceEntity.d.ts +13 -2
- package/dist/storage/SourceTable.d.ts +53 -4
- package/dist/storage/SourceTable.js +62 -7
- package/dist/storage/SourceTable.js.map +1 -1
- package/dist/storage/SourceTableReconciler.d.ts +83 -0
- package/dist/storage/SourceTableReconciler.js +95 -0
- package/dist/storage/SourceTableReconciler.js.map +1 -0
- package/dist/storage/StorageVersionConfig.d.ts +4 -0
- package/dist/storage/StorageVersionConfig.js +10 -1
- package/dist/storage/StorageVersionConfig.js.map +1 -1
- package/dist/storage/SyncRulesBucketStorage.d.ts +162 -26
- package/dist/storage/SyncRulesBucketStorage.js +3 -0
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
- package/dist/storage/WriteCheckpointAPI.d.ts +85 -6
- package/dist/storage/WriteCheckpointAPI.js +33 -0
- package/dist/storage/WriteCheckpointAPI.js.map +1 -1
- package/dist/storage/implementation/BucketDefinitionMapping.d.ts +133 -0
- package/dist/storage/implementation/BucketDefinitionMapping.js +351 -0
- package/dist/storage/implementation/BucketDefinitionMapping.js.map +1 -0
- package/dist/storage/implementation/IncrementalReprocessingCompatibility.d.ts +6 -0
- package/dist/storage/implementation/IncrementalReprocessingCompatibility.js +31 -0
- package/dist/storage/implementation/IncrementalReprocessingCompatibility.js.map +1 -0
- package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.d.ts +17 -0
- package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.js +70 -0
- package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.js.map +1 -0
- package/dist/storage/implementation/ReplicationStreamStorageIds.d.ts +15 -0
- package/dist/storage/implementation/ReplicationStreamStorageIds.js +20 -0
- package/dist/storage/implementation/ReplicationStreamStorageIds.js.map +1 -0
- package/dist/storage/storage-index.d.ts +10 -1
- package/dist/storage/storage-index.js +10 -1
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/storage/storage-metrics.js +120 -4
- package/dist/storage/storage-metrics.js.map +1 -1
- package/dist/sync/BucketChecksumState.d.ts +12 -2
- package/dist/sync/BucketChecksumState.js +69 -21
- package/dist/sync/BucketChecksumState.js.map +1 -1
- package/dist/sync/RequestTracker.d.ts +7 -0
- package/dist/sync/RequestTracker.js +12 -0
- package/dist/sync/RequestTracker.js.map +1 -1
- package/dist/sync/sync.js +184 -43
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.d.ts +5 -0
- package/dist/sync/util.js +19 -1
- package/dist/sync/util.js.map +1 -1
- package/dist/system/ServiceContext.d.ts +2 -0
- package/dist/system/ServiceContext.js +2 -0
- package/dist/system/ServiceContext.js.map +1 -1
- package/dist/tracing/PerformanceTracer.d.ts +23 -1
- package/dist/tracing/PerformanceTracer.js +11 -0
- package/dist/tracing/PerformanceTracer.js.map +1 -1
- package/dist/util/checkpointing.d.ts +4 -8
- package/dist/util/checkpointing.js +1 -16
- package/dist/util/checkpointing.js.map +1 -1
- package/dist/util/config/compound-config-collector.js +23 -2
- package/dist/util/config/compound-config-collector.js.map +1 -1
- package/dist/util/config/defaults.d.ts +2 -0
- package/dist/util/config/defaults.js +2 -0
- package/dist/util/config/defaults.js.map +1 -1
- package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js +1 -0
- 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 +1 -0
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/sync-rules-provider.d.ts +2 -0
- package/dist/util/config/sync-rules/sync-rules-provider.js +3 -0
- package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -1
- package/dist/util/config/types.d.ts +4 -1
- package/dist/util/lsn.d.ts +4 -0
- package/dist/util/lsn.js +10 -0
- package/dist/util/lsn.js.map +1 -1
- package/dist/util/protocol-types.d.ts +4 -4
- package/dist/util/protocol-types.js +3 -2
- package/dist/util/protocol-types.js.map +1 -1
- package/dist/util/util-index.d.ts +1 -0
- package/dist/util/util-index.js +1 -0
- package/dist/util/util-index.js.map +1 -1
- package/dist/util/utils.d.ts +3 -2
- package/dist/util/utils.js +17 -2
- package/dist/util/utils.js.map +1 -1
- package/dist/util/write-checkpoint-batcher.d.ts +19 -0
- package/dist/util/write-checkpoint-batcher.js +100 -0
- package/dist/util/write-checkpoint-batcher.js.map +1 -0
- package/package.json +7 -7
- package/src/api/RouteAPI.ts +43 -14
- package/src/api/diagnostics.ts +45 -26
- package/src/entry/commands/compact-action.ts +37 -23
- package/src/metrics/metrics-interfaces.ts +6 -1
- package/src/metrics/open-telemetry/MetricAttributeFilteringExporter.ts +85 -0
- package/src/metrics/open-telemetry/OpenTelemetryMetricsFactory.ts +7 -2
- package/src/metrics/open-telemetry/util.ts +7 -3
- package/src/modules/AbstractModule.ts +6 -2
- package/src/replication/AbstractReplicator.ts +212 -78
- package/src/replication/ReplicationModule.ts +2 -3
- package/src/routes/RouterEngine.ts +7 -1
- package/src/routes/configure-fastify.ts +25 -2
- package/src/routes/endpoints/admin.ts +75 -51
- package/src/routes/endpoints/checkpointing.ts +79 -8
- package/src/routes/endpoints/socket-route.ts +3 -2
- package/src/routes/endpoints/sync-rules.ts +26 -14
- package/src/routes/endpoints/sync-stream.ts +1 -1
- package/src/runner/teardown.ts +8 -8
- package/src/storage/BucketStorageBatch.ts +65 -18
- package/src/storage/BucketStorageFactory.ts +73 -46
- package/src/storage/CheckpointChecksumInvalidatedError.ts +17 -0
- package/src/storage/ChecksumCache.ts +27 -14
- package/src/storage/ParsedSyncConfigSet.ts +25 -0
- package/src/storage/PersistedReplicationStream.ts +55 -0
- package/src/storage/PersistedSyncConfigContent.ts +207 -0
- package/src/storage/PersistedSyncConfigStatus.ts +14 -0
- package/src/storage/ReplicationEventPayload.ts +6 -1
- package/src/storage/SourceEntity.ts +12 -2
- package/src/storage/SourceTable.ts +96 -8
- package/src/storage/SourceTableReconciler.ts +188 -0
- package/src/storage/StorageVersionConfig.ts +11 -1
- package/src/storage/SyncRulesBucketStorage.ts +189 -27
- package/src/storage/WriteCheckpointAPI.ts +140 -6
- package/src/storage/implementation/BucketDefinitionMapping.ts +539 -0
- package/src/storage/implementation/IncrementalReprocessingCompatibility.ts +41 -0
- package/src/storage/implementation/IncrementalReprocessingSyncConfigLog.ts +126 -0
- package/src/storage/implementation/ReplicationStreamStorageIds.ts +21 -0
- package/src/storage/storage-index.ts +11 -1
- package/src/storage/storage-metrics.ts +154 -8
- package/src/sync/BucketChecksumState.ts +105 -21
- package/src/sync/RequestTracker.ts +20 -0
- package/src/sync/sync.ts +214 -50
- package/src/sync/util.ts +33 -8
- package/src/system/ServiceContext.ts +7 -0
- package/src/tracing/PerformanceTracer.ts +41 -1
- package/src/util/checkpointing.ts +4 -22
- package/src/util/config/compound-config-collector.ts +31 -1
- package/src/util/config/defaults.ts +2 -0
- package/src/util/config/sync-rules/impl/base64-sync-rules-collector.ts +1 -0
- package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +1 -0
- package/src/util/config/sync-rules/sync-rules-provider.ts +5 -0
- package/src/util/config/types.ts +4 -1
- package/src/util/lsn.ts +9 -0
- package/src/util/protocol-types.ts +3 -2
- package/src/util/util-index.ts +1 -0
- package/src/util/utils.ts +16 -2
- package/src/util/write-checkpoint-batcher.ts +142 -0
- package/test/src/AbstractReplicator.test.ts +177 -0
- package/test/src/MetricAttributeFilteringExporter.test.ts +96 -0
- package/test/src/PersistedSyncConfigContent.test.ts +152 -0
- package/test/src/checksum_cache.test.ts +22 -0
- package/test/src/config.test.ts +142 -0
- package/test/src/diagnostics.test.ts +87 -34
- package/test/src/module-loader.test.ts +33 -1
- package/test/src/routes/admin.test.ts +188 -18
- package/test/src/routes/checkpointing.test.ts +54 -0
- package/test/src/routes/mocks.ts +6 -2
- package/test/src/routes/stream.test.ts +123 -2
- package/test/src/source-table-reconciler.test.ts +244 -0
- package/test/src/storage/SourceTable.test.ts +92 -0
- package/test/src/storage-metrics.test.ts +148 -0
- package/test/src/sync/BucketChecksumState.test.ts +98 -12
- package/test/src/sync/util.test.ts +28 -1
- package/test/src/util/checkpointing.test.ts +249 -0
- package/test/src/util/utils.test.ts +23 -0
- package/tsconfig.json +1 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/storage/PersistedSyncRulesContent.d.ts +0 -59
- package/dist/storage/PersistedSyncRulesContent.js +0 -100
- package/dist/storage/PersistedSyncRulesContent.js.map +0 -1
- package/src/storage/PersistedSyncRulesContent.ts +0 -174
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { BaseObserver } from '@powersync/lib-services-framework';
|
|
2
|
-
import { SerializedCompatibilityContext, SyncConfigWithErrors } from '@powersync/service-sync-rules';
|
|
2
|
+
import { SerializedSyncPlan as RawSerializedSyncPlan, SerializedCompatibilityContext, SyncConfigWithErrors } from '@powersync/service-sync-rules';
|
|
3
3
|
import { ReplicationError } from '@powersync/service-types';
|
|
4
|
-
import {
|
|
4
|
+
import { PersistedReplicationStream } from './PersistedReplicationStream.js';
|
|
5
|
+
import { PersistedSyncConfigContent } from './PersistedSyncConfigContent.js';
|
|
5
6
|
import { ReplicationEventPayload } from './ReplicationEventPayload.js';
|
|
6
7
|
import { ReplicationLock } from './ReplicationLock.js';
|
|
7
8
|
import { ReportStorage } from './ReportStorage.js';
|
|
@@ -20,17 +21,17 @@ export declare abstract class BucketStorageFactory extends BaseObserver<BucketSt
|
|
|
20
21
|
*/
|
|
21
22
|
configureSyncRules(options: UpdateSyncRulesOptions): Promise<{
|
|
22
23
|
updated: boolean;
|
|
23
|
-
persisted_sync_rules?:
|
|
24
|
+
persisted_sync_rules?: PersistedReplicationStream;
|
|
24
25
|
lock?: ReplicationLock;
|
|
25
26
|
}>;
|
|
26
27
|
/**
|
|
27
28
|
* Get a storage instance to query sync data for specific sync config.
|
|
28
29
|
*/
|
|
29
|
-
abstract getInstance(
|
|
30
|
+
abstract getInstance(replicationStream: PersistedReplicationStream, options?: GetIntanceOptions): SyncRulesBucketStorage;
|
|
30
31
|
/**
|
|
31
32
|
* Deploy new sync config.
|
|
32
33
|
*/
|
|
33
|
-
abstract updateSyncRules(options: UpdateSyncRulesOptions): Promise<
|
|
34
|
+
abstract updateSyncRules(options: UpdateSyncRulesOptions): Promise<PersistedReplicationStream>;
|
|
34
35
|
/**
|
|
35
36
|
* Indicate that a slot was removed, and we should re-sync by creating
|
|
36
37
|
* a new replication stream.
|
|
@@ -41,35 +42,23 @@ export declare abstract class BucketStorageFactory extends BaseObserver<BucketSt
|
|
|
41
42
|
*
|
|
42
43
|
* Replication should be restarted after this.
|
|
43
44
|
*/
|
|
44
|
-
abstract restartReplication(
|
|
45
|
+
abstract restartReplication(replicationStreamId: number): Promise<void>;
|
|
45
46
|
/**
|
|
46
|
-
* Get the sync config used for querying.
|
|
47
|
+
* Get the sync config and storage used for querying.
|
|
47
48
|
*/
|
|
48
|
-
|
|
49
|
+
abstract getActiveSyncConfig(): Promise<ResolvedSyncConfig | null>;
|
|
49
50
|
/**
|
|
50
|
-
* Get the sync config
|
|
51
|
+
* Get the sync config and storage that is still deploying.
|
|
51
52
|
*/
|
|
52
|
-
abstract
|
|
53
|
+
abstract getDeployingSyncConfig(): Promise<ResolvedSyncConfig | null>;
|
|
53
54
|
/**
|
|
54
|
-
* Get
|
|
55
|
+
* Get all replication streams currently replicating.
|
|
55
56
|
*/
|
|
56
|
-
|
|
57
|
+
abstract getReplicatingReplicationStreams(): Promise<PersistedReplicationStream[]>;
|
|
57
58
|
/**
|
|
58
|
-
* Get
|
|
59
|
+
* Get all replication streams stopped but not terminated yet.
|
|
59
60
|
*/
|
|
60
|
-
abstract
|
|
61
|
-
/**
|
|
62
|
-
* Get all sync config currently replicating. Typically this is the "active" and "next" sync config.
|
|
63
|
-
*/
|
|
64
|
-
abstract getReplicatingSyncRules(): Promise<PersistedSyncRulesContent[]>;
|
|
65
|
-
/**
|
|
66
|
-
* Get all sync config stopped but not terminated yet.
|
|
67
|
-
*/
|
|
68
|
-
abstract getStoppedSyncRules(): Promise<PersistedSyncRulesContent[]>;
|
|
69
|
-
/**
|
|
70
|
-
* Get the active storage instance.
|
|
71
|
-
*/
|
|
72
|
-
abstract getActiveStorage(): Promise<SyncRulesBucketStorage | null>;
|
|
61
|
+
abstract getStoppedReplicationStreams(): Promise<PersistedReplicationStream[]>;
|
|
73
62
|
/**
|
|
74
63
|
* Get storage size of active replication stream.
|
|
75
64
|
*/
|
|
@@ -88,6 +77,11 @@ export interface BucketStorageFactoryListener {
|
|
|
88
77
|
syncStorageCreated: (storage: SyncRulesBucketStorage) => void;
|
|
89
78
|
replicationEvent: (event: ReplicationEventPayload) => void;
|
|
90
79
|
}
|
|
80
|
+
export interface ResolvedSyncConfig {
|
|
81
|
+
content: PersistedSyncConfigContent;
|
|
82
|
+
replicationStream: PersistedReplicationStream;
|
|
83
|
+
storage: SyncRulesBucketStorage;
|
|
84
|
+
}
|
|
91
85
|
export interface StorageMetrics {
|
|
92
86
|
/**
|
|
93
87
|
* Size of operations (bucket_data)
|
|
@@ -103,8 +97,28 @@ export interface StorageMetrics {
|
|
|
103
97
|
* Size of current_data.
|
|
104
98
|
*/
|
|
105
99
|
replication_size_bytes: number;
|
|
100
|
+
/**
|
|
101
|
+
* Size of active object-storage references, such as S3 bucket-data objects.
|
|
102
|
+
*/
|
|
103
|
+
object_storage_size_bytes?: number;
|
|
104
|
+
/**
|
|
105
|
+
* Per-sync-config storage sizes, when the storage backend can provide them.
|
|
106
|
+
*/
|
|
107
|
+
sync_config_metrics?: StorageSyncConfigMetrics[];
|
|
108
|
+
}
|
|
109
|
+
export interface StorageSyncConfigMetrics {
|
|
110
|
+
sync_config_id: string;
|
|
111
|
+
sync_config_state: string;
|
|
112
|
+
/** Optional operator-supplied label identifying this sync config version. */
|
|
113
|
+
version_label?: string;
|
|
114
|
+
attributed_bucket_data_bytes: number;
|
|
115
|
+
attributed_parameter_indexes_bytes: number;
|
|
116
|
+
attributed_source_records_bytes: number;
|
|
117
|
+
attributed_object_storage_bytes: number;
|
|
106
118
|
}
|
|
107
119
|
export interface UpdateSyncRulesOptions {
|
|
120
|
+
/** Optional operator-supplied label identifying this deployed sync config version. */
|
|
121
|
+
version_label?: string;
|
|
108
122
|
config: {
|
|
109
123
|
yaml: string;
|
|
110
124
|
/**
|
|
@@ -120,6 +134,11 @@ export interface UpdateSyncRulesOptions {
|
|
|
120
134
|
};
|
|
121
135
|
lock?: boolean;
|
|
122
136
|
storageVersion?: number;
|
|
137
|
+
/**
|
|
138
|
+
* Start a replacement replication stream instead of incrementally reprocessing a
|
|
139
|
+
* compatible active stream. Used when the current stream needs a full reprocess.
|
|
140
|
+
*/
|
|
141
|
+
forceNewReplicationStream?: boolean;
|
|
123
142
|
/**
|
|
124
143
|
* Only relevant if the result is used. This does not affect the persisted config.
|
|
125
144
|
*/
|
|
@@ -129,14 +148,13 @@ export interface SerializedSyncPlan {
|
|
|
129
148
|
/**
|
|
130
149
|
* The serialized plan, from {@link serializeSyncPlan}.
|
|
131
150
|
*/
|
|
132
|
-
plan:
|
|
151
|
+
plan: RawSerializedSyncPlan;
|
|
133
152
|
compatibility: SerializedCompatibilityContext;
|
|
134
153
|
/**
|
|
135
|
-
*
|
|
136
|
-
* yet.
|
|
154
|
+
* Raw event SQL persisted as a compatibility mirror for compiled {@link plan} events.
|
|
137
155
|
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
156
|
+
* Compiled events are an additive plan field. Older services ignore that field and restore these descriptors through
|
|
157
|
+
* the legacy evaluator. Keep dual-writing this field until a future plan version explicitly removes that support.
|
|
140
158
|
*/
|
|
141
159
|
eventDescriptors: Record<string, string[]>;
|
|
142
160
|
errors?: ReplicationError[];
|
|
@@ -188,4 +206,5 @@ export interface TestStorageConfig {
|
|
|
188
206
|
factory: TestStorageFactory;
|
|
189
207
|
tableIdStrings: boolean;
|
|
190
208
|
storageVersion?: number;
|
|
209
|
+
compressedBucketStorage?: boolean;
|
|
191
210
|
}
|
|
@@ -14,13 +14,16 @@ export class BucketStorageFactory extends BaseObserver {
|
|
|
14
14
|
* Update sync config from configuration, if changed.
|
|
15
15
|
*/
|
|
16
16
|
async configureSyncRules(options) {
|
|
17
|
-
const
|
|
18
|
-
const active = await this.
|
|
19
|
-
if (
|
|
17
|
+
const deploying = await this.getDeployingSyncConfig();
|
|
18
|
+
const active = await this.getActiveSyncConfig();
|
|
19
|
+
if (deploying?.content.sync_rules_content == options.config.yaml &&
|
|
20
|
+
deploying.content.version_label == options.version_label) {
|
|
20
21
|
logger.info('Sync config unchanged');
|
|
21
22
|
return { updated: false };
|
|
22
23
|
}
|
|
23
|
-
else if (
|
|
24
|
+
else if (deploying == null &&
|
|
25
|
+
active?.content.sync_rules_content == options.config.yaml &&
|
|
26
|
+
active.content.version_label == options.version_label) {
|
|
24
27
|
logger.info('Sync config unchanged');
|
|
25
28
|
return { updated: false };
|
|
26
29
|
}
|
|
@@ -30,20 +33,6 @@ export class BucketStorageFactory extends BaseObserver {
|
|
|
30
33
|
return { updated: true, persisted_sync_rules, lock: persisted_sync_rules.current_lock ?? undefined };
|
|
31
34
|
}
|
|
32
35
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Get the sync config used for querying.
|
|
35
|
-
*/
|
|
36
|
-
async getActiveSyncRules(options) {
|
|
37
|
-
const content = await this.getActiveSyncRulesContent();
|
|
38
|
-
return content?.parsed(options) ?? null;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Get the sync config that will be active next once done with initial replicatino.
|
|
42
|
-
*/
|
|
43
|
-
async getNextSyncRules(options) {
|
|
44
|
-
const content = await this.getNextSyncRulesContent();
|
|
45
|
-
return content?.parsed(options) ?? null;
|
|
46
|
-
}
|
|
47
36
|
}
|
|
48
37
|
export function updateSyncRulesFromYaml(content, options) {
|
|
49
38
|
const config = SqlSyncRules.fromYaml(content, {
|
|
@@ -59,12 +48,13 @@ export function updateSyncRulesFromConfig(parsed, options) {
|
|
|
59
48
|
const { config, errors } = parsed;
|
|
60
49
|
if (config instanceof PrecompiledSyncConfig) {
|
|
61
50
|
const eventDescriptors = {};
|
|
62
|
-
for (const event of config.
|
|
63
|
-
eventDescriptors[event.name] = event.sourceQueries.map((
|
|
51
|
+
for (const event of config.plan.events) {
|
|
52
|
+
eventDescriptors[event.name] = event.sourceQueries.map((query) => query.sql);
|
|
64
53
|
}
|
|
65
54
|
plan = {
|
|
66
55
|
compatibility: config.compatibility.serialize(),
|
|
67
56
|
plan: serializeSyncPlan(config.plan),
|
|
57
|
+
// Dual-write raw SQL so older services can ignore additive compiled plan events without losing event behavior.
|
|
68
58
|
eventDescriptors,
|
|
69
59
|
errors: errors.map((e) => syncConfigYamlErrorToReplicationError(e))
|
|
70
60
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/BucketStorageFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EACL,qBAAqB,
|
|
1
|
+
{"version":3,"file":"BucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/BucketStorageFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InternalOpId } from '../util/util-index.js';
|
|
2
|
+
/**
|
|
3
|
+
* A checkpoint cannot be served because compaction rewrote a bucket-data
|
|
4
|
+
* document across its end boundary.
|
|
5
|
+
*
|
|
6
|
+
* The sync loop must skip this checkpoint before it sends its checkpoint line.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CheckpointChecksumInvalidatedError extends Error {
|
|
9
|
+
readonly checkpoint: InternalOpId;
|
|
10
|
+
readonly bucket: string;
|
|
11
|
+
constructor(checkpoint: InternalOpId, bucket: string);
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A checkpoint cannot be served because compaction rewrote a bucket-data
|
|
3
|
+
* document across its end boundary.
|
|
4
|
+
*
|
|
5
|
+
* The sync loop must skip this checkpoint before it sends its checkpoint line.
|
|
6
|
+
*/
|
|
7
|
+
export class CheckpointChecksumInvalidatedError extends Error {
|
|
8
|
+
checkpoint;
|
|
9
|
+
bucket;
|
|
10
|
+
constructor(checkpoint, bucket) {
|
|
11
|
+
super(`Checkpoint ${checkpoint} was invalidated by compaction in bucket ${bucket}`);
|
|
12
|
+
this.checkpoint = checkpoint;
|
|
13
|
+
this.bucket = bucket;
|
|
14
|
+
this.name = 'CheckpointChecksumInvalidatedError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=CheckpointChecksumInvalidatedError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckpointChecksumInvalidatedError.js","sourceRoot":"","sources":["../../src/storage/CheckpointChecksumInvalidatedError.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,kCAAmC,SAAQ,KAAK;IAEzC;IACA;IAFlB,YACkB,UAAwB,EACxB,MAAc;QAE9B,KAAK,CAAC,cAAc,UAAU,4CAA4C,MAAM,EAAE,CAAC,CAAC;QAHpE,eAAU,GAAV,UAAU,CAAc;QACxB,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,oCAAoC,CAAC;IACnD,CAAC;CACF"}
|
|
@@ -10,19 +10,24 @@ export interface FetchPartialBucketChecksum {
|
|
|
10
10
|
}
|
|
11
11
|
export type PartialOrFullChecksum = PartialChecksum | BucketChecksum;
|
|
12
12
|
export type PartialChecksumMap = Map<string, PartialOrFullChecksum>;
|
|
13
|
-
export type FetchChecksums = (batch: FetchPartialBucketChecksum[]) => Promise<PartialChecksumMap>;
|
|
14
|
-
export interface ChecksumCacheOptions {
|
|
13
|
+
export type FetchChecksums<TContext = undefined> = (batch: FetchPartialBucketChecksum[], context: TContext) => Promise<PartialChecksumMap>;
|
|
14
|
+
export interface ChecksumCacheOptions<TContext = undefined> {
|
|
15
15
|
/**
|
|
16
16
|
* Upstream checksum implementation.
|
|
17
17
|
*
|
|
18
18
|
* This fetches a batch of either entire bucket checksums, or a partial range.
|
|
19
19
|
*/
|
|
20
|
-
fetchChecksums: FetchChecksums
|
|
20
|
+
fetchChecksums: FetchChecksums<TContext>;
|
|
21
21
|
/**
|
|
22
22
|
* Maximum number of cached checksums.
|
|
23
23
|
*/
|
|
24
24
|
maxSize?: number;
|
|
25
|
+
/**
|
|
26
|
+
* How long to keep cached checksums before refreshing them.
|
|
27
|
+
*/
|
|
28
|
+
ttlMs?: number;
|
|
25
29
|
}
|
|
30
|
+
export declare const DEFAULT_CHECKSUM_CACHE_TTL_MS: number;
|
|
26
31
|
/**
|
|
27
32
|
* Implement a LRU cache for checksum requests. Each (bucket, checkpoint) request is cached separately,
|
|
28
33
|
* while the lookups occur in batches.
|
|
@@ -32,7 +37,7 @@ export interface ChecksumCacheOptions {
|
|
|
32
37
|
*
|
|
33
38
|
* We use the LRUCache fetchMethod to deduplicate in-progress requests.
|
|
34
39
|
*/
|
|
35
|
-
export declare class ChecksumCache {
|
|
40
|
+
export declare class ChecksumCache<TContext = undefined> {
|
|
36
41
|
/**
|
|
37
42
|
* The primary checksum cache, with key of `${checkpoint}/${bucket}`.
|
|
38
43
|
*/
|
|
@@ -42,7 +47,7 @@ export declare class ChecksumCache {
|
|
|
42
47
|
*/
|
|
43
48
|
private bucketCheckpoints;
|
|
44
49
|
private fetchChecksums;
|
|
45
|
-
constructor(options: ChecksumCacheOptions);
|
|
50
|
+
constructor(options: ChecksumCacheOptions<TContext>);
|
|
46
51
|
clear(): void;
|
|
47
52
|
getChecksums(checkpoint: InternalOpId, buckets: BucketChecksumRequest[]): Promise<BucketChecksum[]>;
|
|
48
53
|
/**
|
|
@@ -52,5 +57,5 @@ export declare class ChecksumCache {
|
|
|
52
57
|
*
|
|
53
58
|
* @returns a Map with exactly one entry for each bucket requested
|
|
54
59
|
*/
|
|
55
|
-
getChecksumMap(checkpoint: InternalOpId, buckets: BucketChecksumRequest[]): Promise<ChecksumMap>;
|
|
60
|
+
getChecksumMap(checkpoint: InternalOpId, buckets: BucketChecksumRequest[], fetchContext?: TContext): Promise<ChecksumMap>;
|
|
56
61
|
}
|
|
@@ -3,7 +3,8 @@ import { LRUCache } from 'lru-cache/min';
|
|
|
3
3
|
import { addBucketChecksums } from '../util/utils.js';
|
|
4
4
|
// Approximately 5MB of memory, if we assume 50 bytes per entry
|
|
5
5
|
const DEFAULT_MAX_SIZE = 100_000;
|
|
6
|
-
|
|
6
|
+
// Default to 1h
|
|
7
|
+
export const DEFAULT_CHECKSUM_CACHE_TTL_MS = 1 * 3_600_000;
|
|
7
8
|
/**
|
|
8
9
|
* Implement a LRU cache for checksum requests. Each (bucket, checkpoint) request is cached separately,
|
|
9
10
|
* while the lookups occur in batches.
|
|
@@ -60,7 +61,7 @@ export class ChecksumCache {
|
|
|
60
61
|
// We use a TTL so that counts can eventually be refreshed
|
|
61
62
|
// after a compact. This only has effect if the bucket has
|
|
62
63
|
// not been checked in the meantime.
|
|
63
|
-
ttl:
|
|
64
|
+
ttl: options.ttlMs ?? DEFAULT_CHECKSUM_CACHE_TTL_MS,
|
|
64
65
|
ttlResolution: 1_000,
|
|
65
66
|
allowStale: false
|
|
66
67
|
});
|
|
@@ -81,7 +82,7 @@ export class ChecksumCache {
|
|
|
81
82
|
*
|
|
82
83
|
* @returns a Map with exactly one entry for each bucket requested
|
|
83
84
|
*/
|
|
84
|
-
async getChecksumMap(checkpoint, buckets) {
|
|
85
|
+
async getChecksumMap(checkpoint, buckets, fetchContext) {
|
|
85
86
|
// Buckets that don't have a cached checksum for this checkpoint yet
|
|
86
87
|
let toFetch = new Set();
|
|
87
88
|
// Newly fetched results
|
|
@@ -201,7 +202,7 @@ export class ChecksumCache {
|
|
|
201
202
|
bucketRequests.push(bucketRequest);
|
|
202
203
|
}
|
|
203
204
|
// Fetch partial checksums from upstream
|
|
204
|
-
const results = await this.fetchChecksums(bucketRequests);
|
|
205
|
+
const results = await this.fetchChecksums(bucketRequests, fetchContext);
|
|
205
206
|
for (let bucket of toFetch) {
|
|
206
207
|
const result = results.get(bucket);
|
|
207
208
|
const toAdd = add.get(bucket);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChecksumCache.js","sourceRoot":"","sources":["../../src/storage/ChecksumCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAA8C,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ChecksumCache.js","sourceRoot":"","sources":["../../src/storage/ChecksumCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { HydratedSyncConfig, HydrationState, SyncConfigWithErrors } from '@powersync/service-sync-rules';
|
|
2
|
+
/**
|
|
3
|
+
* A parsed sync config set is the identity boundary for parsed sync config state.
|
|
4
|
+
*
|
|
5
|
+
* All values on a single instance - the parsed configs, hydration state and hydrated
|
|
6
|
+
* sync config - are derived from the same parse, and may be associated with each other
|
|
7
|
+
* by object identity. Values from two different instances must never be mixed, even if
|
|
8
|
+
* they were parsed from the same persisted content.
|
|
9
|
+
*/
|
|
10
|
+
export interface ParsedSyncConfigSet {
|
|
11
|
+
readonly replicationStreamId: number;
|
|
12
|
+
readonly replicationStreamName: string;
|
|
13
|
+
readonly syncConfigs: SyncConfigWithErrors[];
|
|
14
|
+
/**
|
|
15
|
+
* For testing only.
|
|
16
|
+
*/
|
|
17
|
+
readonly hydrationState: HydrationState;
|
|
18
|
+
/**
|
|
19
|
+
* The hydrated sync config for this parse. This is a stable property: repeated reads
|
|
20
|
+
* return the same instance.
|
|
21
|
+
*/
|
|
22
|
+
readonly hydratedSyncConfig: HydratedSyncConfig;
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParsedSyncConfigSet.js","sourceRoot":"","sources":["../../src/storage/ParsedSyncConfigSet.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Logger } from 'winston';
|
|
2
|
+
import { SyncRuleState } from './BucketStorage.js';
|
|
3
|
+
import type { ParsedSyncConfigSet } from './ParsedSyncConfigSet.js';
|
|
4
|
+
import type { ParseSyncConfigOptions, PersistedSyncConfigContent } from './PersistedSyncConfigContent.js';
|
|
5
|
+
import { ReplicationLock } from './ReplicationLock.js';
|
|
6
|
+
import { StorageVersionConfig } from './StorageVersionConfig.js';
|
|
7
|
+
export declare abstract class PersistedReplicationStream implements PersistedReplicationStreamData {
|
|
8
|
+
readonly replicationStreamId: number;
|
|
9
|
+
readonly replicationJobId: string;
|
|
10
|
+
readonly replicationStreamName: string;
|
|
11
|
+
readonly state: SyncRuleState;
|
|
12
|
+
readonly storageVersion: number;
|
|
13
|
+
readonly logger: Logger;
|
|
14
|
+
abstract readonly syncConfigContent: readonly PersistedSyncConfigContent[];
|
|
15
|
+
abstract readonly current_lock: ReplicationLock | null;
|
|
16
|
+
constructor(data: PersistedReplicationStreamData);
|
|
17
|
+
getStorageConfig(): StorageVersionConfig;
|
|
18
|
+
abstract lock(): Promise<ReplicationLock>;
|
|
19
|
+
abstract parsed(options: ParseSyncConfigOptions): ParsedSyncConfigSet;
|
|
20
|
+
}
|
|
21
|
+
export interface PersistedReplicationStreamData {
|
|
22
|
+
readonly replicationStreamId: number;
|
|
23
|
+
readonly replicationStreamName: string;
|
|
24
|
+
readonly state: SyncRuleState;
|
|
25
|
+
readonly storageVersion: number;
|
|
26
|
+
/**
|
|
27
|
+
* Uniquely identifies a job, as a combination of replication stream and processing sync configs.
|
|
28
|
+
*
|
|
29
|
+
* Used in-memory only.
|
|
30
|
+
*/
|
|
31
|
+
readonly replicationJobId?: string;
|
|
32
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { logger as defaultLogger, ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
2
|
+
import { STORAGE_VERSION_CONFIG } from './StorageVersionConfig.js';
|
|
3
|
+
export class PersistedReplicationStream {
|
|
4
|
+
replicationStreamId;
|
|
5
|
+
replicationJobId;
|
|
6
|
+
replicationStreamName;
|
|
7
|
+
state;
|
|
8
|
+
storageVersion;
|
|
9
|
+
logger;
|
|
10
|
+
constructor(data) {
|
|
11
|
+
this.replicationStreamId = data.replicationStreamId;
|
|
12
|
+
this.replicationJobId = data.replicationJobId ?? String(data.replicationStreamId);
|
|
13
|
+
this.replicationStreamName = data.replicationStreamName;
|
|
14
|
+
this.state = data.state;
|
|
15
|
+
this.storageVersion = data.storageVersion;
|
|
16
|
+
this.logger = defaultLogger.child({ prefix: `[${this.replicationStreamName}] ` });
|
|
17
|
+
}
|
|
18
|
+
getStorageConfig() {
|
|
19
|
+
const storageConfig = STORAGE_VERSION_CONFIG[this.storageVersion];
|
|
20
|
+
if (storageConfig == null) {
|
|
21
|
+
throw new ServiceError(ErrorCode.PSYNC_S1005, `Unsupported storage version ${this.storageVersion} for replication stream ${this.replicationStreamId}`);
|
|
22
|
+
}
|
|
23
|
+
return storageConfig;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=PersistedReplicationStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersistedReplicationStream.js","sourceRoot":"","sources":["../../src/storage/PersistedReplicationStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAMrG,OAAO,EAAE,sBAAsB,EAAwB,MAAM,2BAA2B,CAAC;AAEzF,MAAM,OAAgB,0BAA0B;IACrC,mBAAmB,CAAS;IAC5B,gBAAgB,CAAS;IACzB,qBAAqB,CAAS;IAC9B,KAAK,CAAgB;IACrB,cAAc,CAAS;IACvB,MAAM,CAAS;IAKxB,YAAY,IAAoC;QAC9C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QACxD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,gBAAgB;QACd,MAAM,aAAa,GAAG,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClE,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,YAAY,CACpB,SAAS,CAAC,WAAW,EACrB,+BAA+B,IAAI,CAAC,cAAc,2BAA2B,IAAI,CAAC,mBAAmB,EAAE,CACxG,CAAC;QACJ,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;CAKF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SyncConfigWithErrors } from '@powersync/service-sync-rules';
|
|
2
|
+
import { Logger } from 'winston';
|
|
3
|
+
import { SyncRuleState } from './BucketStorage.js';
|
|
4
|
+
import { SerializedSyncPlan, UpdateSyncRulesOptions } from './BucketStorageFactory.js';
|
|
5
|
+
import { ParsedSyncConfigSet } from './ParsedSyncConfigSet.js';
|
|
6
|
+
import { PersistedSyncConfigStatus } from './PersistedSyncConfigStatus.js';
|
|
7
|
+
import { StorageVersionConfig } from './StorageVersionConfig.js';
|
|
8
|
+
export interface ParsePersistedSyncConfigContentOptions {
|
|
9
|
+
content: string;
|
|
10
|
+
compiledPlan: SerializedSyncPlan | null;
|
|
11
|
+
storageVersion: number;
|
|
12
|
+
parseOptions: ParseSyncConfigOptions;
|
|
13
|
+
}
|
|
14
|
+
export declare function parsePersistedSyncConfigContent(options: ParsePersistedSyncConfigContentOptions): SyncConfigWithErrors;
|
|
15
|
+
/**
|
|
16
|
+
* Immutable sync config content for one sync config inside a replication stream.
|
|
17
|
+
*
|
|
18
|
+
* This represents the persisted config content. Fetch per-config status with
|
|
19
|
+
* {@link getSyncConfigStatus}. Use {@link PersistedReplicationStream} for stream
|
|
20
|
+
* lifecycle concerns such as locking and termination.
|
|
21
|
+
*/
|
|
22
|
+
export declare abstract class PersistedSyncConfigContent implements PersistedSyncConfigContentData {
|
|
23
|
+
readonly replicationStreamId: number;
|
|
24
|
+
readonly sync_rules_content: string;
|
|
25
|
+
readonly compiled_plan: SerializedSyncPlan | null;
|
|
26
|
+
readonly replicationStreamName: string;
|
|
27
|
+
readonly storageVersion: number;
|
|
28
|
+
readonly logger: Logger;
|
|
29
|
+
readonly syncConfigId: PersistedSyncConfigId | null;
|
|
30
|
+
readonly syncConfigState: SyncRuleState;
|
|
31
|
+
readonly version_label: string | undefined;
|
|
32
|
+
constructor(data: PersistedSyncConfigContentData);
|
|
33
|
+
/**
|
|
34
|
+
* Load the storage config.
|
|
35
|
+
*
|
|
36
|
+
* This may throw if the persisted storage version is not supported.
|
|
37
|
+
*/
|
|
38
|
+
getStorageConfig(): StorageVersionConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Parse only this config's content into a single {@link SyncConfigWithErrors}.
|
|
41
|
+
*
|
|
42
|
+
* This does not depend on any other configs in the same replication stream.
|
|
43
|
+
*/
|
|
44
|
+
protected parseSingleConfig(options: ParseSyncConfigOptions): SyncConfigWithErrors;
|
|
45
|
+
parsed(options: ParseSyncConfigOptions): ParsedSyncConfigSet;
|
|
46
|
+
asUpdateOptions(options?: Omit<UpdateSyncRulesOptions, 'config'>): UpdateSyncRulesOptions;
|
|
47
|
+
/**
|
|
48
|
+
* Fetch the current persisted state for this exact sync config.
|
|
49
|
+
*/
|
|
50
|
+
abstract getSyncConfigStatus(): Promise<PersistedSyncConfigStatus | null>;
|
|
51
|
+
}
|
|
52
|
+
export interface PersistedSyncConfigContentData {
|
|
53
|
+
readonly replicationStreamId: number;
|
|
54
|
+
readonly sync_rules_content: string;
|
|
55
|
+
readonly compiled_plan: SerializedSyncPlan | null;
|
|
56
|
+
readonly replicationStreamName: string;
|
|
57
|
+
readonly storageVersion: number;
|
|
58
|
+
readonly syncConfigId?: PersistedSyncConfigId | null;
|
|
59
|
+
readonly syncConfigState: SyncRuleState;
|
|
60
|
+
readonly version_label?: string;
|
|
61
|
+
}
|
|
62
|
+
export type PersistedSyncConfigId = string;
|
|
63
|
+
export interface ParseSyncConfigOptions {
|
|
64
|
+
defaultSchema: string;
|
|
65
|
+
}
|