@powersync/service-core 0.0.0-dev-20250611110033 → 0.0.0-dev-20250618131818
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 +11 -6
- package/dist/entry/cli-entry.js +2 -2
- package/dist/entry/cli-entry.js.map +1 -1
- package/dist/replication/AbstractReplicator.d.ts +2 -1
- package/dist/replication/AbstractReplicator.js +8 -3
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/storage/BucketStorageBatch.d.ts +9 -7
- package/dist/storage/StorageEngine.d.ts +3 -2
- package/dist/storage/StorageEngine.js +3 -0
- package/dist/storage/StorageEngine.js.map +1 -1
- package/dist/storage/StorageProvider.d.ts +2 -0
- package/dist/storage/SyncRulesBucketStorage.d.ts +7 -4
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
- package/dist/storage/WriteCheckpointAPI.d.ts +0 -26
- package/dist/storage/WriteCheckpointAPI.js.map +1 -1
- package/dist/streams/BroadcastIterable.d.ts +1 -1
- package/dist/streams/streams-index.d.ts +0 -1
- package/dist/streams/streams-index.js +0 -1
- package/dist/streams/streams-index.js.map +1 -1
- package/dist/system/ServiceContext.js +6 -0
- package/dist/system/ServiceContext.js.map +1 -1
- package/package.json +4 -4
- package/src/entry/cli-entry.ts +2 -2
- package/src/replication/AbstractReplicator.ts +10 -4
- package/src/storage/BucketStorageBatch.ts +10 -8
- package/src/storage/StorageEngine.ts +6 -2
- package/src/storage/StorageProvider.ts +3 -0
- package/src/storage/SyncRulesBucketStorage.ts +8 -4
- package/src/storage/WriteCheckpointAPI.ts +0 -30
- package/src/streams/BroadcastIterable.ts +1 -1
- package/src/streams/streams-index.ts +0 -1
- package/src/system/ServiceContext.ts +6 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/streams/Demultiplexer.d.ts +0 -52
- package/dist/streams/Demultiplexer.js +0 -128
- package/dist/streams/Demultiplexer.js.map +0 -1
- package/src/streams/Demultiplexer.ts +0 -165
- package/test/src/demultiplexer.test.ts +0 -205
package/CHANGELOG.md
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
# @powersync/service-core
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
3
|
+
## 0.0.0-dev-20250618131818
|
|
4
4
|
|
|
5
5
|
### Minor Changes
|
|
6
6
|
|
|
7
7
|
- 0ccd470: Add powersync_replication_lag_seconds metric
|
|
8
|
-
-
|
|
8
|
+
- 951b010: Implement resuming of initial replication snapshots.
|
|
9
|
+
- d235f7b: [MongoDB Storage] Remove change streams on bucket storage database due to performance overhead.
|
|
9
10
|
|
|
10
11
|
### Patch Changes
|
|
11
12
|
|
|
13
|
+
- 08b7aa9: Add checks for RLS affecting replication.
|
|
14
|
+
- 1907356: Cleanly interrupt clearing of storage when the process is stopped/restarted.
|
|
15
|
+
- f9e8673: [MongoDB Storage] Handle connection errors on startup
|
|
12
16
|
- Updated dependencies [0ccd470]
|
|
13
|
-
- Updated dependencies [
|
|
14
|
-
|
|
15
|
-
- @powersync/
|
|
16
|
-
- @powersync/
|
|
17
|
+
- Updated dependencies [951b010]
|
|
18
|
+
- Updated dependencies [f9e8673]
|
|
19
|
+
- @powersync/service-types@0.0.0-dev-20250618131818
|
|
20
|
+
- @powersync/lib-services-framework@0.0.0-dev-20250618131818
|
|
21
|
+
- @powersync/service-rsocket-router@0.0.0-dev-20250618131818
|
|
17
22
|
|
|
18
23
|
## 1.12.1
|
|
19
24
|
|
package/dist/entry/cli-entry.js
CHANGED
|
@@ -31,8 +31,8 @@ export function generateEntryProgram(startHandlers) {
|
|
|
31
31
|
await entryProgram.parseAsync();
|
|
32
32
|
}
|
|
33
33
|
catch (e) {
|
|
34
|
-
logger.error('Fatal error', e);
|
|
35
|
-
process.exit(
|
|
34
|
+
logger.error('Fatal startup error - exiting with code 150.', e);
|
|
35
|
+
process.exit(150);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../../src/entry/cli-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAEpF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAyD;IAC5F,MAAM,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;IACnC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC;IAEhG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACrC,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACtC,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACpC,4BAA4B,CAAC,YAAY,CAAC,CAAC;IAE3C,IAAI,aAAa,EAAE,CAAC;QAClB,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY;QACrB;;WAEG;QACH,OAAO,EAAE,KAAK,UAAU,UAAU;YAChC,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAClC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../../src/entry/cli-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAEpF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAyD;IAC5F,MAAM,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;IACnC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC;IAEhG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACrC,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACtC,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACpC,4BAA4B,CAAC,YAAY,CAAC,CAAC;IAE3C,IAAI,aAAa,EAAE,CAAC;QAClB,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY;QACrB;;WAEG;QACH,OAAO,EAAE,KAAK,UAAU,UAAU;YAChC,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAClC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -38,8 +38,8 @@ export declare abstract class AbstractReplicator<T extends AbstractReplicationJo
|
|
|
38
38
|
* Used for replication lag computation.
|
|
39
39
|
*/
|
|
40
40
|
private activeReplicationJob;
|
|
41
|
-
private stopped;
|
|
42
41
|
private lastPing;
|
|
42
|
+
private abortController;
|
|
43
43
|
protected constructor(options: AbstractReplicatorOptions);
|
|
44
44
|
abstract createJob(options: CreateJobOptions): T;
|
|
45
45
|
/**
|
|
@@ -52,6 +52,7 @@ export declare abstract class AbstractReplicator<T extends AbstractReplicationJo
|
|
|
52
52
|
protected get syncRuleProvider(): SyncRulesProvider;
|
|
53
53
|
protected get rateLimiter(): ErrorRateLimiter;
|
|
54
54
|
protected get metrics(): MetricsEngine;
|
|
55
|
+
protected get stopped(): boolean | undefined;
|
|
55
56
|
start(): Promise<void>;
|
|
56
57
|
stop(): Promise<void>;
|
|
57
58
|
private runLoop;
|
|
@@ -21,9 +21,9 @@ export class AbstractReplicator {
|
|
|
21
21
|
* Used for replication lag computation.
|
|
22
22
|
*/
|
|
23
23
|
activeReplicationJob = undefined;
|
|
24
|
-
stopped = false;
|
|
25
24
|
// First ping is only after 5 minutes, not when starting
|
|
26
25
|
lastPing = hrtime.bigint();
|
|
26
|
+
abortController;
|
|
27
27
|
constructor(options) {
|
|
28
28
|
this.options = options;
|
|
29
29
|
this.logger = logger.child({ name: `Replicator:${options.id}` });
|
|
@@ -43,7 +43,11 @@ export class AbstractReplicator {
|
|
|
43
43
|
get metrics() {
|
|
44
44
|
return this.options.metricsEngine;
|
|
45
45
|
}
|
|
46
|
+
get stopped() {
|
|
47
|
+
return this.abortController?.signal.aborted;
|
|
48
|
+
}
|
|
46
49
|
async start() {
|
|
50
|
+
this.abortController = new AbortController();
|
|
47
51
|
this.runLoop().catch((e) => {
|
|
48
52
|
this.logger.error('Data source fatal replication error', e);
|
|
49
53
|
container.reporter.captureException(e);
|
|
@@ -64,7 +68,7 @@ export class AbstractReplicator {
|
|
|
64
68
|
});
|
|
65
69
|
}
|
|
66
70
|
async stop() {
|
|
67
|
-
this.
|
|
71
|
+
this.abortController?.abort();
|
|
68
72
|
let promises = [];
|
|
69
73
|
for (const job of this.replicationJobs.values()) {
|
|
70
74
|
promises.push(job.stop());
|
|
@@ -194,6 +198,7 @@ export class AbstractReplicator {
|
|
|
194
198
|
const stopped = await this.storage.getStoppedSyncRules();
|
|
195
199
|
for (let syncRules of stopped) {
|
|
196
200
|
try {
|
|
201
|
+
// TODO: Do this in the "background", allowing the periodic refresh to continue
|
|
197
202
|
const syncRuleStorage = this.storage.getInstance(syncRules, { skipLifecycleHooks: true });
|
|
198
203
|
await this.terminateSyncRules(syncRuleStorage);
|
|
199
204
|
}
|
|
@@ -208,7 +213,7 @@ export class AbstractReplicator {
|
|
|
208
213
|
async terminateSyncRules(syncRuleStorage) {
|
|
209
214
|
this.logger.info(`Terminating sync rules: ${syncRuleStorage.group_id}...`);
|
|
210
215
|
await this.cleanUp(syncRuleStorage);
|
|
211
|
-
await syncRuleStorage.terminate();
|
|
216
|
+
await syncRuleStorage.terminate({ signal: this.abortController?.signal, clearStorage: true });
|
|
212
217
|
this.logger.info(`Successfully terminated sync rules: ${syncRuleStorage.group_id}`);
|
|
213
218
|
}
|
|
214
219
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractReplicator.js","sourceRoot":"","sources":["../../src/replication/AbstractReplicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAStC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,YAAY;AACZ,MAAM,aAAa,GAAG,WAAc,GAAG,IAAI,CAAC;AAkB5C;;;;GAIG;AACH,MAAM,OAAgB,kBAAkB;IAmBR;IAlBpB,MAAM,CAAiB;IAEjC;;;;OAIG;IACK,eAAe,GAAG,IAAI,GAAG,EAAa,CAAC;IAC/C;;OAEG;IACK,oBAAoB,GAAkB,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"AbstractReplicator.js","sourceRoot":"","sources":["../../src/replication/AbstractReplicator.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,7 @@ export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageLis
|
|
|
31
31
|
*
|
|
32
32
|
* @returns null if there are no changes to flush.
|
|
33
33
|
*/
|
|
34
|
-
flush(): Promise<FlushedResult | null>;
|
|
34
|
+
flush(options?: BatchBucketFlushOptions): Promise<FlushedResult | null>;
|
|
35
35
|
/**
|
|
36
36
|
* Flush and commit any saved ops. This creates a new checkpoint by default.
|
|
37
37
|
*
|
|
@@ -131,12 +131,7 @@ export interface BucketBatchStorageListener {
|
|
|
131
131
|
export interface FlushedResult {
|
|
132
132
|
flushed_op: InternalOpId;
|
|
133
133
|
}
|
|
134
|
-
export interface
|
|
135
|
-
/**
|
|
136
|
-
* Creates a new checkpoint even if there were no persisted operations.
|
|
137
|
-
* Defaults to true.
|
|
138
|
-
*/
|
|
139
|
-
createEmptyCheckpoints?: boolean;
|
|
134
|
+
export interface BatchBucketFlushOptions {
|
|
140
135
|
/**
|
|
141
136
|
* The timestamp of the first change in this batch, according to the source database.
|
|
142
137
|
*
|
|
@@ -144,4 +139,11 @@ export interface BucketBatchCommitOptions {
|
|
|
144
139
|
*/
|
|
145
140
|
oldestUncommittedChange?: Date | null;
|
|
146
141
|
}
|
|
142
|
+
export interface BucketBatchCommitOptions extends BatchBucketFlushOptions {
|
|
143
|
+
/**
|
|
144
|
+
* Creates a new checkpoint even if there were no persisted operations.
|
|
145
|
+
* Defaults to true.
|
|
146
|
+
*/
|
|
147
|
+
createEmptyCheckpoints?: boolean;
|
|
148
|
+
}
|
|
147
149
|
export type ResolvedBucketBatchCommitOptions = Required<BucketBatchCommitOptions>;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { BaseObserver } from '@powersync/lib-services-framework';
|
|
1
|
+
import { BaseObserver, ServiceError } from '@powersync/lib-services-framework';
|
|
2
2
|
import { ResolvedPowerSyncConfig } from '../util/util-index.js';
|
|
3
|
-
import { ActiveStorage, BucketStorageProvider } from './StorageProvider.js';
|
|
4
3
|
import { BucketStorageFactory } from './BucketStorageFactory.js';
|
|
4
|
+
import { ActiveStorage, BucketStorageProvider } from './StorageProvider.js';
|
|
5
5
|
export type StorageEngineOptions = {
|
|
6
6
|
configuration: ResolvedPowerSyncConfig;
|
|
7
7
|
};
|
|
8
8
|
export interface StorageEngineListener {
|
|
9
9
|
storageActivated: (storage: BucketStorageFactory) => void;
|
|
10
|
+
storageFatalError: (error: ServiceError) => void;
|
|
10
11
|
}
|
|
11
12
|
export declare class StorageEngine extends BaseObserver<StorageEngineListener> {
|
|
12
13
|
private options;
|
|
@@ -31,6 +31,9 @@ export class StorageEngine extends BaseObserver {
|
|
|
31
31
|
resolvedConfig: configuration
|
|
32
32
|
});
|
|
33
33
|
this.iterateListeners((cb) => cb.storageActivated?.(this.activeBucketStorage));
|
|
34
|
+
this.currentActiveStorage.onFatalError?.((error) => {
|
|
35
|
+
this.iterateListeners((cb) => cb.storageFatalError?.(error));
|
|
36
|
+
});
|
|
34
37
|
logger.info(`Successfully activated storage: ${configuration.storage.type}.`);
|
|
35
38
|
logger.info('Successfully started Storage Engine.');
|
|
36
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageEngine.js","sourceRoot":"","sources":["../../src/storage/StorageEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"StorageEngine.js","sourceRoot":"","sources":["../../src/storage/StorageEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAgB,MAAM,mCAAmC,CAAC;AAcvF,MAAM,OAAO,aAAc,SAAQ,YAAmC;IAKhD;IAJpB,yFAAyF;IACjF,gBAAgB,GAAuC,IAAI,GAAG,EAAE,CAAC;IACjE,oBAAoB,GAAyB,IAAI,CAAC;IAE1D,YAAoB,OAA6B;QAC/C,KAAK,EAAE,CAAC;QADU,YAAO,GAAP,OAAO,CAAsB;IAEjD,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;IACpC,CAAC;IAED,IAAI,aAAa;QACf,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,QAA+B;QAC9C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,oBAAoB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC,UAAU,CAAC;YAClG,cAAc,EAAE,aAAa;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;YACjD,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,mCAAmC,aAAa,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ;QACnB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,oBAAoB,EAAE,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ServiceError } from '@powersync/lib-services-framework';
|
|
1
2
|
import * as util from '../util/util-index.js';
|
|
2
3
|
import { BucketStorageFactory } from './BucketStorageFactory.js';
|
|
3
4
|
export interface ActiveStorage {
|
|
@@ -7,6 +8,7 @@ export interface ActiveStorage {
|
|
|
7
8
|
* Tear down / drop the storage permanently
|
|
8
9
|
*/
|
|
9
10
|
tearDown(): Promise<boolean>;
|
|
11
|
+
onFatalError?(callback: (error: ServiceError) => void): void;
|
|
10
12
|
}
|
|
11
13
|
export interface GetStorageOptions {
|
|
12
14
|
resolvedConfig: util.ResolvedPowerSyncConfig;
|
|
@@ -35,7 +35,7 @@ export interface SyncRulesBucketStorage extends ObserverClient<SyncRulesBucketSt
|
|
|
35
35
|
/**
|
|
36
36
|
* Clear the storage, without changing state.
|
|
37
37
|
*/
|
|
38
|
-
clear(): Promise<void>;
|
|
38
|
+
clear(options?: ClearStorageOptions): Promise<void>;
|
|
39
39
|
autoActivate(): Promise<void>;
|
|
40
40
|
/**
|
|
41
41
|
* Record a replication error.
|
|
@@ -167,7 +167,10 @@ export interface CompactOptions {
|
|
|
167
167
|
/** Minimum of 1 */
|
|
168
168
|
moveBatchQueryLimit?: number;
|
|
169
169
|
}
|
|
170
|
-
export interface
|
|
170
|
+
export interface ClearStorageOptions {
|
|
171
|
+
signal?: AbortSignal;
|
|
172
|
+
}
|
|
173
|
+
export interface TerminateOptions extends ClearStorageOptions {
|
|
171
174
|
/**
|
|
172
175
|
* If true, also clear the storage before terminating.
|
|
173
176
|
*/
|
|
@@ -213,8 +216,8 @@ export interface StorageCheckpointUpdate extends WriteCheckpoint {
|
|
|
213
216
|
update: CheckpointChanges;
|
|
214
217
|
}
|
|
215
218
|
export interface GetCheckpointChangesOptions {
|
|
216
|
-
lastCheckpoint:
|
|
217
|
-
nextCheckpoint:
|
|
219
|
+
lastCheckpoint: ReplicationCheckpoint;
|
|
220
|
+
nextCheckpoint: ReplicationCheckpoint;
|
|
218
221
|
}
|
|
219
222
|
export interface CheckpointChanges {
|
|
220
223
|
updatedDataBuckets: Set<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncRulesBucketStorage.js","sourceRoot":"","sources":["../../src/storage/SyncRulesBucketStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SyncRulesBucketStorage.js","sourceRoot":"","sources":["../../src/storage/SyncRulesBucketStorage.ts"],"names":[],"mappings":"AA4RA,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,kBAAkB,EAAE,IAAI,GAAG,EAAU;IACrC,qBAAqB,EAAE,IAAI;IAC3B,uBAAuB,EAAE,IAAI,GAAG,EAAU;IAC1C,0BAA0B,EAAE,IAAI;CACjC,CAAC"}
|
|
@@ -44,32 +44,9 @@ export interface ManagedWriteCheckpointFilters extends BaseWriteCheckpointIdenti
|
|
|
44
44
|
*/
|
|
45
45
|
heads: Record<string, string>;
|
|
46
46
|
}
|
|
47
|
-
export interface WriteCheckpointResult {
|
|
48
|
-
/**
|
|
49
|
-
* Write checkpoint id (also referred to as client_id).
|
|
50
|
-
*
|
|
51
|
-
* If null, there is no write checkpoint for the client.
|
|
52
|
-
*/
|
|
53
|
-
id: bigint | null;
|
|
54
|
-
/**
|
|
55
|
-
* LSN for the checkpoint.
|
|
56
|
-
*
|
|
57
|
-
* This will change when we support multiple connections.
|
|
58
|
-
*
|
|
59
|
-
* For managed write checkpoints, this LSN must be exceeded by the checkpoint / replication head to be valid.
|
|
60
|
-
*
|
|
61
|
-
* For custom write checkpoints, this will be null, and the write checkpoint is valid for all LSNs.
|
|
62
|
-
*/
|
|
63
|
-
lsn: string | null;
|
|
64
|
-
}
|
|
65
47
|
export type ManagedWriteCheckpointOptions = ManagedWriteCheckpointFilters;
|
|
66
48
|
export type SyncStorageLastWriteCheckpointFilters = BaseWriteCheckpointIdentifier | ManagedWriteCheckpointFilters;
|
|
67
49
|
export type LastWriteCheckpointFilters = CustomWriteCheckpointFilters | ManagedWriteCheckpointFilters;
|
|
68
|
-
export interface WatchUserWriteCheckpointOptions {
|
|
69
|
-
user_id: string;
|
|
70
|
-
sync_rules_id: number;
|
|
71
|
-
signal: AbortSignal;
|
|
72
|
-
}
|
|
73
50
|
export interface BaseWriteCheckpointAPI {
|
|
74
51
|
readonly writeCheckpointMode: WriteCheckpointMode;
|
|
75
52
|
setWriteCheckpointMode(mode: WriteCheckpointMode): void;
|
|
@@ -81,7 +58,6 @@ export interface BaseWriteCheckpointAPI {
|
|
|
81
58
|
* sync rules id.
|
|
82
59
|
*/
|
|
83
60
|
export interface SyncStorageWriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
84
|
-
batchCreateCustomWriteCheckpoints(checkpoints: BatchedCustomWriteCheckpointOptions[]): Promise<void>;
|
|
85
61
|
lastWriteCheckpoint(filters: SyncStorageLastWriteCheckpointFilters): Promise<bigint | null>;
|
|
86
62
|
}
|
|
87
63
|
/**
|
|
@@ -89,8 +65,6 @@ export interface SyncStorageWriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
|
89
65
|
* sync rules identifiers for custom write checkpoints.
|
|
90
66
|
*/
|
|
91
67
|
export interface WriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
92
|
-
batchCreateCustomWriteCheckpoints(checkpoints: CustomWriteCheckpointOptions[]): Promise<void>;
|
|
93
68
|
lastWriteCheckpoint(filters: LastWriteCheckpointFilters): Promise<bigint | null>;
|
|
94
|
-
watchUserWriteCheckpoint(options: WatchUserWriteCheckpointOptions): AsyncIterable<WriteCheckpointResult>;
|
|
95
69
|
}
|
|
96
70
|
export declare const DEFAULT_WRITE_CHECKPOINT_MODE = WriteCheckpointMode.MANAGED;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteCheckpointAPI.js","sourceRoot":"","sources":["../../src/storage/WriteCheckpointAPI.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAYX;AAZD,WAAY,mBAAmB;IAC7B;;;OAGG;IACH,wCAAiB,CAAA;IACjB;;;;OAIG;IACH,0CAAmB,CAAA;AACrB,CAAC,EAZW,mBAAmB,KAAnB,mBAAmB,QAY9B;
|
|
1
|
+
{"version":3,"file":"WriteCheckpointAPI.js","sourceRoot":"","sources":["../../src/storage/WriteCheckpointAPI.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAYX;AAZD,WAAY,mBAAmB;IAC7B;;;OAGG;IACH,wCAAiB,CAAA;IACjB;;;;OAIG;IACH,0CAAmB,CAAA;AACrB,CAAC,EAZW,mBAAmB,KAAnB,mBAAmB,QAY9B;AAoED,MAAM,CAAC,MAAM,6BAA6B,GAAG,mBAAmB,CAAC,OAAO,CAAC"}
|
|
@@ -32,6 +32,6 @@ export declare class BroadcastIterable<T> implements AsyncIterable<T> {
|
|
|
32
32
|
private loop;
|
|
33
33
|
private removeSink;
|
|
34
34
|
private addSink;
|
|
35
|
-
[Symbol.asyncIterator](signal?: AbortSignal):
|
|
35
|
+
[Symbol.asyncIterator](signal?: AbortSignal): AsyncIterableIterator<T>;
|
|
36
36
|
get active(): boolean;
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streams-index.js","sourceRoot":"","sources":["../../src/streams/streams-index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,
|
|
1
|
+
{"version":3,"file":"streams-index.js","sourceRoot":"","sources":["../../src/streams/streams-index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC"}
|
|
@@ -36,6 +36,12 @@ export class ServiceContextContainer {
|
|
|
36
36
|
this.storageEngine = new storage.StorageEngine({
|
|
37
37
|
configuration
|
|
38
38
|
});
|
|
39
|
+
this.storageEngine.registerListener({
|
|
40
|
+
storageFatalError: (error) => {
|
|
41
|
+
// Propagate the error to the lifecycle engine
|
|
42
|
+
this.lifeCycleEngine.stopWithError(error);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
39
45
|
this.lifeCycleEngine.withLifecycle(this.storageEngine, {
|
|
40
46
|
start: (storageEngine) => storageEngine.start(),
|
|
41
47
|
stop: (storageEngine) => storageEngine.shutDown()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceContext.js","sourceRoot":"","sources":["../../src/system/ServiceContext.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ServiceContext.js","sourceRoot":"","sources":["../../src/system/ServiceContext.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.0.0-dev-
|
|
8
|
+
"version": "0.0.0-dev-20250618131818",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-Apache-2.0",
|
|
11
11
|
"type": "module",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"uuid": "^11.1.0",
|
|
33
33
|
"winston": "^3.13.0",
|
|
34
34
|
"yaml": "^2.3.2",
|
|
35
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
35
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20250618131818",
|
|
36
36
|
"@powersync/service-jsonbig": "0.17.10",
|
|
37
|
-
"@powersync/service-rsocket-router": "0.0.0-dev-
|
|
37
|
+
"@powersync/service-rsocket-router": "0.0.0-dev-20250618131818",
|
|
38
38
|
"@powersync/service-sync-rules": "0.27.0",
|
|
39
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
39
|
+
"@powersync/service-types": "0.0.0-dev-20250618131818"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/async": "^3.2.24",
|
package/src/entry/cli-entry.ts
CHANGED
|
@@ -36,8 +36,8 @@ export function generateEntryProgram(startHandlers?: Record<utils.ServiceRunner,
|
|
|
36
36
|
try {
|
|
37
37
|
await entryProgram.parseAsync();
|
|
38
38
|
} catch (e) {
|
|
39
|
-
logger.error('Fatal error', e);
|
|
40
|
-
process.exit(
|
|
39
|
+
logger.error('Fatal startup error - exiting with code 150.', e);
|
|
40
|
+
process.exit(150);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
};
|
|
@@ -48,11 +48,11 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
|
|
|
48
48
|
*/
|
|
49
49
|
private activeReplicationJob: T | undefined = undefined;
|
|
50
50
|
|
|
51
|
-
private stopped = false;
|
|
52
|
-
|
|
53
51
|
// First ping is only after 5 minutes, not when starting
|
|
54
52
|
private lastPing = hrtime.bigint();
|
|
55
53
|
|
|
54
|
+
private abortController: AbortController | undefined;
|
|
55
|
+
|
|
56
56
|
protected constructor(private options: AbstractReplicatorOptions) {
|
|
57
57
|
this.logger = logger.child({ name: `Replicator:${options.id}` });
|
|
58
58
|
}
|
|
@@ -85,7 +85,12 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
|
|
|
85
85
|
return this.options.metricsEngine;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
protected get stopped() {
|
|
89
|
+
return this.abortController?.signal.aborted;
|
|
90
|
+
}
|
|
91
|
+
|
|
88
92
|
public async start(): Promise<void> {
|
|
93
|
+
this.abortController = new AbortController();
|
|
89
94
|
this.runLoop().catch((e) => {
|
|
90
95
|
this.logger.error('Data source fatal replication error', e);
|
|
91
96
|
container.reporter.captureException(e);
|
|
@@ -107,7 +112,7 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
|
|
|
107
112
|
}
|
|
108
113
|
|
|
109
114
|
public async stop(): Promise<void> {
|
|
110
|
-
this.
|
|
115
|
+
this.abortController?.abort();
|
|
111
116
|
let promises: Promise<void>[] = [];
|
|
112
117
|
for (const job of this.replicationJobs.values()) {
|
|
113
118
|
promises.push(job.stop());
|
|
@@ -241,6 +246,7 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
|
|
|
241
246
|
const stopped = await this.storage.getStoppedSyncRules();
|
|
242
247
|
for (let syncRules of stopped) {
|
|
243
248
|
try {
|
|
249
|
+
// TODO: Do this in the "background", allowing the periodic refresh to continue
|
|
244
250
|
const syncRuleStorage = this.storage.getInstance(syncRules, { skipLifecycleHooks: true });
|
|
245
251
|
await this.terminateSyncRules(syncRuleStorage);
|
|
246
252
|
} catch (e) {
|
|
@@ -256,7 +262,7 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
|
|
|
256
262
|
protected async terminateSyncRules(syncRuleStorage: storage.SyncRulesBucketStorage) {
|
|
257
263
|
this.logger.info(`Terminating sync rules: ${syncRuleStorage.group_id}...`);
|
|
258
264
|
await this.cleanUp(syncRuleStorage);
|
|
259
|
-
await syncRuleStorage.terminate();
|
|
265
|
+
await syncRuleStorage.terminate({ signal: this.abortController?.signal, clearStorage: true });
|
|
260
266
|
this.logger.info(`Successfully terminated sync rules: ${syncRuleStorage.group_id}`);
|
|
261
267
|
}
|
|
262
268
|
|
|
@@ -39,7 +39,7 @@ export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageLis
|
|
|
39
39
|
*
|
|
40
40
|
* @returns null if there are no changes to flush.
|
|
41
41
|
*/
|
|
42
|
-
flush(): Promise<FlushedResult | null>;
|
|
42
|
+
flush(options?: BatchBucketFlushOptions): Promise<FlushedResult | null>;
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Flush and commit any saved ops. This creates a new checkpoint by default.
|
|
@@ -161,13 +161,7 @@ export interface FlushedResult {
|
|
|
161
161
|
flushed_op: InternalOpId;
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
export interface
|
|
165
|
-
/**
|
|
166
|
-
* Creates a new checkpoint even if there were no persisted operations.
|
|
167
|
-
* Defaults to true.
|
|
168
|
-
*/
|
|
169
|
-
createEmptyCheckpoints?: boolean;
|
|
170
|
-
|
|
164
|
+
export interface BatchBucketFlushOptions {
|
|
171
165
|
/**
|
|
172
166
|
* The timestamp of the first change in this batch, according to the source database.
|
|
173
167
|
*
|
|
@@ -176,4 +170,12 @@ export interface BucketBatchCommitOptions {
|
|
|
176
170
|
oldestUncommittedChange?: Date | null;
|
|
177
171
|
}
|
|
178
172
|
|
|
173
|
+
export interface BucketBatchCommitOptions extends BatchBucketFlushOptions {
|
|
174
|
+
/**
|
|
175
|
+
* Creates a new checkpoint even if there were no persisted operations.
|
|
176
|
+
* Defaults to true.
|
|
177
|
+
*/
|
|
178
|
+
createEmptyCheckpoints?: boolean;
|
|
179
|
+
}
|
|
180
|
+
|
|
179
181
|
export type ResolvedBucketBatchCommitOptions = Required<BucketBatchCommitOptions>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { BaseObserver, logger } from '@powersync/lib-services-framework';
|
|
1
|
+
import { BaseObserver, logger, ServiceError } from '@powersync/lib-services-framework';
|
|
2
2
|
import { ResolvedPowerSyncConfig } from '../util/util-index.js';
|
|
3
|
-
import { ActiveStorage, BucketStorageProvider } from './StorageProvider.js';
|
|
4
3
|
import { BucketStorageFactory } from './BucketStorageFactory.js';
|
|
4
|
+
import { ActiveStorage, BucketStorageProvider } from './StorageProvider.js';
|
|
5
5
|
|
|
6
6
|
export type StorageEngineOptions = {
|
|
7
7
|
configuration: ResolvedPowerSyncConfig;
|
|
@@ -9,6 +9,7 @@ export type StorageEngineOptions = {
|
|
|
9
9
|
|
|
10
10
|
export interface StorageEngineListener {
|
|
11
11
|
storageActivated: (storage: BucketStorageFactory) => void;
|
|
12
|
+
storageFatalError: (error: ServiceError) => void;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
export class StorageEngine extends BaseObserver<StorageEngineListener> {
|
|
@@ -47,6 +48,9 @@ export class StorageEngine extends BaseObserver<StorageEngineListener> {
|
|
|
47
48
|
resolvedConfig: configuration
|
|
48
49
|
});
|
|
49
50
|
this.iterateListeners((cb) => cb.storageActivated?.(this.activeBucketStorage));
|
|
51
|
+
this.currentActiveStorage.onFatalError?.((error) => {
|
|
52
|
+
this.iterateListeners((cb) => cb.storageFatalError?.(error));
|
|
53
|
+
});
|
|
50
54
|
logger.info(`Successfully activated storage: ${configuration.storage.type}.`);
|
|
51
55
|
logger.info('Successfully started Storage Engine.');
|
|
52
56
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ServiceError } from '@powersync/lib-services-framework';
|
|
1
2
|
import * as util from '../util/util-index.js';
|
|
2
3
|
import { BucketStorageFactory } from './BucketStorageFactory.js';
|
|
3
4
|
|
|
@@ -9,6 +10,8 @@ export interface ActiveStorage {
|
|
|
9
10
|
* Tear down / drop the storage permanently
|
|
10
11
|
*/
|
|
11
12
|
tearDown(): Promise<boolean>;
|
|
13
|
+
|
|
14
|
+
onFatalError?(callback: (error: ServiceError) => void): void;
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
export interface GetStorageOptions {
|
|
@@ -48,7 +48,7 @@ export interface SyncRulesBucketStorage
|
|
|
48
48
|
/**
|
|
49
49
|
* Clear the storage, without changing state.
|
|
50
50
|
*/
|
|
51
|
-
clear(): Promise<void>;
|
|
51
|
+
clear(options?: ClearStorageOptions): Promise<void>;
|
|
52
52
|
|
|
53
53
|
autoActivate(): Promise<void>;
|
|
54
54
|
|
|
@@ -210,7 +210,11 @@ export interface CompactOptions {
|
|
|
210
210
|
moveBatchQueryLimit?: number;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
export interface
|
|
213
|
+
export interface ClearStorageOptions {
|
|
214
|
+
signal?: AbortSignal;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface TerminateOptions extends ClearStorageOptions {
|
|
214
218
|
/**
|
|
215
219
|
* If true, also clear the storage before terminating.
|
|
216
220
|
*/
|
|
@@ -266,8 +270,8 @@ export interface StorageCheckpointUpdate extends WriteCheckpoint {
|
|
|
266
270
|
}
|
|
267
271
|
|
|
268
272
|
export interface GetCheckpointChangesOptions {
|
|
269
|
-
lastCheckpoint:
|
|
270
|
-
nextCheckpoint:
|
|
273
|
+
lastCheckpoint: ReplicationCheckpoint;
|
|
274
|
+
nextCheckpoint: ReplicationCheckpoint;
|
|
271
275
|
}
|
|
272
276
|
|
|
273
277
|
export interface CheckpointChanges {
|