@powersync/service-core 0.0.0-dev-20250611110033 → 0.0.0-dev-20250617143654
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -6
- package/dist/entry/cli-entry.js +2 -2
- package/dist/entry/cli-entry.js.map +1 -1
- 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 +2 -2
- 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/storage/StorageEngine.ts +6 -2
- package/src/storage/StorageProvider.ts +3 -0
- package/src/storage/SyncRulesBucketStorage.ts +2 -2
- 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,23 @@
|
|
|
1
1
|
# @powersync/service-core
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
3
|
+
## 0.0.0-dev-20250617143654
|
|
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
|
+
- f9e8673: [MongoDB Storage] Handle connection errors on startup
|
|
12
15
|
- Updated dependencies [0ccd470]
|
|
13
|
-
- Updated dependencies [
|
|
14
|
-
|
|
15
|
-
- @powersync/
|
|
16
|
-
- @powersync/
|
|
16
|
+
- Updated dependencies [951b010]
|
|
17
|
+
- Updated dependencies [f9e8673]
|
|
18
|
+
- @powersync/service-types@0.0.0-dev-20250617143654
|
|
19
|
+
- @powersync/lib-services-framework@0.0.0-dev-20250617143654
|
|
20
|
+
- @powersync/service-rsocket-router@0.0.0-dev-20250617143654
|
|
17
21
|
|
|
18
22
|
## 1.12.1
|
|
19
23
|
|
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"}
|
|
@@ -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;
|
|
@@ -213,8 +213,8 @@ export interface StorageCheckpointUpdate extends WriteCheckpoint {
|
|
|
213
213
|
update: CheckpointChanges;
|
|
214
214
|
}
|
|
215
215
|
export interface GetCheckpointChangesOptions {
|
|
216
|
-
lastCheckpoint:
|
|
217
|
-
nextCheckpoint:
|
|
216
|
+
lastCheckpoint: ReplicationCheckpoint;
|
|
217
|
+
nextCheckpoint: ReplicationCheckpoint;
|
|
218
218
|
}
|
|
219
219
|
export interface CheckpointChanges {
|
|
220
220
|
updatedDataBuckets: Set<string>;
|
|
@@ -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-20250617143654",
|
|
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-20250617143654",
|
|
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-20250617143654",
|
|
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-20250617143654"
|
|
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
|
};
|
|
@@ -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 {
|
|
@@ -266,8 +266,8 @@ export interface StorageCheckpointUpdate extends WriteCheckpoint {
|
|
|
266
266
|
}
|
|
267
267
|
|
|
268
268
|
export interface GetCheckpointChangesOptions {
|
|
269
|
-
lastCheckpoint:
|
|
270
|
-
nextCheckpoint:
|
|
269
|
+
lastCheckpoint: ReplicationCheckpoint;
|
|
270
|
+
nextCheckpoint: ReplicationCheckpoint;
|
|
271
271
|
}
|
|
272
272
|
|
|
273
273
|
export interface CheckpointChanges {
|
|
@@ -50,37 +50,11 @@ export interface ManagedWriteCheckpointFilters extends BaseWriteCheckpointIdenti
|
|
|
50
50
|
heads: Record<string, string>;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
export interface WriteCheckpointResult {
|
|
54
|
-
/**
|
|
55
|
-
* Write checkpoint id (also referred to as client_id).
|
|
56
|
-
*
|
|
57
|
-
* If null, there is no write checkpoint for the client.
|
|
58
|
-
*/
|
|
59
|
-
id: bigint | null;
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* LSN for the checkpoint.
|
|
63
|
-
*
|
|
64
|
-
* This will change when we support multiple connections.
|
|
65
|
-
*
|
|
66
|
-
* For managed write checkpoints, this LSN must be exceeded by the checkpoint / replication head to be valid.
|
|
67
|
-
*
|
|
68
|
-
* For custom write checkpoints, this will be null, and the write checkpoint is valid for all LSNs.
|
|
69
|
-
*/
|
|
70
|
-
lsn: string | null;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
53
|
export type ManagedWriteCheckpointOptions = ManagedWriteCheckpointFilters;
|
|
74
54
|
|
|
75
55
|
export type SyncStorageLastWriteCheckpointFilters = BaseWriteCheckpointIdentifier | ManagedWriteCheckpointFilters;
|
|
76
56
|
export type LastWriteCheckpointFilters = CustomWriteCheckpointFilters | ManagedWriteCheckpointFilters;
|
|
77
57
|
|
|
78
|
-
export interface WatchUserWriteCheckpointOptions {
|
|
79
|
-
user_id: string;
|
|
80
|
-
sync_rules_id: number;
|
|
81
|
-
signal: AbortSignal;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
58
|
export interface BaseWriteCheckpointAPI {
|
|
85
59
|
readonly writeCheckpointMode: WriteCheckpointMode;
|
|
86
60
|
setWriteCheckpointMode(mode: WriteCheckpointMode): void;
|
|
@@ -93,7 +67,6 @@ export interface BaseWriteCheckpointAPI {
|
|
|
93
67
|
* sync rules id.
|
|
94
68
|
*/
|
|
95
69
|
export interface SyncStorageWriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
96
|
-
batchCreateCustomWriteCheckpoints(checkpoints: BatchedCustomWriteCheckpointOptions[]): Promise<void>;
|
|
97
70
|
lastWriteCheckpoint(filters: SyncStorageLastWriteCheckpointFilters): Promise<bigint | null>;
|
|
98
71
|
}
|
|
99
72
|
|
|
@@ -102,10 +75,7 @@ export interface SyncStorageWriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
|
102
75
|
* sync rules identifiers for custom write checkpoints.
|
|
103
76
|
*/
|
|
104
77
|
export interface WriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
105
|
-
batchCreateCustomWriteCheckpoints(checkpoints: CustomWriteCheckpointOptions[]): Promise<void>;
|
|
106
78
|
lastWriteCheckpoint(filters: LastWriteCheckpointFilters): Promise<bigint | null>;
|
|
107
|
-
|
|
108
|
-
watchUserWriteCheckpoint(options: WatchUserWriteCheckpointOptions): AsyncIterable<WriteCheckpointResult>;
|
|
109
79
|
}
|
|
110
80
|
|
|
111
81
|
export const DEFAULT_WRITE_CHECKPOINT_MODE = WriteCheckpointMode.MANAGED;
|
|
@@ -97,7 +97,7 @@ export class BroadcastIterable<T> implements AsyncIterable<T> {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
async *[Symbol.asyncIterator](signal?: AbortSignal):
|
|
100
|
+
async *[Symbol.asyncIterator](signal?: AbortSignal): AsyncIterableIterator<T> {
|
|
101
101
|
const sink = new LastValueSink(this.last);
|
|
102
102
|
this.addSink(sink);
|
|
103
103
|
try {
|
|
@@ -59,6 +59,12 @@ export class ServiceContextContainer implements ServiceContext {
|
|
|
59
59
|
this.storageEngine = new storage.StorageEngine({
|
|
60
60
|
configuration
|
|
61
61
|
});
|
|
62
|
+
this.storageEngine.registerListener({
|
|
63
|
+
storageFatalError: (error) => {
|
|
64
|
+
// Propagate the error to the lifecycle engine
|
|
65
|
+
this.lifeCycleEngine.stopWithError(error);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
62
68
|
|
|
63
69
|
this.lifeCycleEngine.withLifecycle(this.storageEngine, {
|
|
64
70
|
start: (storageEngine) => storageEngine.start(),
|