@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.
Files changed (38) hide show
  1. package/CHANGELOG.md +11 -6
  2. package/dist/entry/cli-entry.js +2 -2
  3. package/dist/entry/cli-entry.js.map +1 -1
  4. package/dist/replication/AbstractReplicator.d.ts +2 -1
  5. package/dist/replication/AbstractReplicator.js +8 -3
  6. package/dist/replication/AbstractReplicator.js.map +1 -1
  7. package/dist/storage/BucketStorageBatch.d.ts +9 -7
  8. package/dist/storage/StorageEngine.d.ts +3 -2
  9. package/dist/storage/StorageEngine.js +3 -0
  10. package/dist/storage/StorageEngine.js.map +1 -1
  11. package/dist/storage/StorageProvider.d.ts +2 -0
  12. package/dist/storage/SyncRulesBucketStorage.d.ts +7 -4
  13. package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
  14. package/dist/storage/WriteCheckpointAPI.d.ts +0 -26
  15. package/dist/storage/WriteCheckpointAPI.js.map +1 -1
  16. package/dist/streams/BroadcastIterable.d.ts +1 -1
  17. package/dist/streams/streams-index.d.ts +0 -1
  18. package/dist/streams/streams-index.js +0 -1
  19. package/dist/streams/streams-index.js.map +1 -1
  20. package/dist/system/ServiceContext.js +6 -0
  21. package/dist/system/ServiceContext.js.map +1 -1
  22. package/package.json +4 -4
  23. package/src/entry/cli-entry.ts +2 -2
  24. package/src/replication/AbstractReplicator.ts +10 -4
  25. package/src/storage/BucketStorageBatch.ts +10 -8
  26. package/src/storage/StorageEngine.ts +6 -2
  27. package/src/storage/StorageProvider.ts +3 -0
  28. package/src/storage/SyncRulesBucketStorage.ts +8 -4
  29. package/src/storage/WriteCheckpointAPI.ts +0 -30
  30. package/src/streams/BroadcastIterable.ts +1 -1
  31. package/src/streams/streams-index.ts +0 -1
  32. package/src/system/ServiceContext.ts +6 -0
  33. package/tsconfig.tsbuildinfo +1 -1
  34. package/dist/streams/Demultiplexer.d.ts +0 -52
  35. package/dist/streams/Demultiplexer.js +0 -128
  36. package/dist/streams/Demultiplexer.js.map +0 -1
  37. package/src/streams/Demultiplexer.ts +0 -165
  38. 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-20250611110033
3
+ ## 0.0.0-dev-20250618131818
4
4
 
5
5
  ### Minor Changes
6
6
 
7
7
  - 0ccd470: Add powersync_replication_lag_seconds metric
8
- - ff396c2: Implement resuming of initial replication snapshots.
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 [ff396c2]
14
- - @powersync/service-types@0.0.0-dev-20250611110033
15
- - @powersync/lib-services-framework@0.0.0-dev-20250611110033
16
- - @powersync/service-rsocket-router@0.0.0-dev-20250611110033
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
 
@@ -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(1);
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,aAAa,EAAE,CAAC,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,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.stopped = true;
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":"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"}
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 BucketBatchCommitOptions {
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,EAAE,MAAM,mCAAmC,CAAC;AAazE,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,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
+ {"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 TerminateOptions {
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: util.InternalOpId;
217
- nextCheckpoint: util.InternalOpId;
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":"AAwRA,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"}
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;AAkGD,MAAM,CAAC,MAAM,6BAA6B,GAAG,mBAAmB,CAAC,OAAO,CAAC"}
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): AsyncIterator<T>;
35
+ [Symbol.asyncIterator](signal?: AbortSignal): AsyncIterableIterator<T>;
36
36
  get active(): boolean;
37
37
  }
@@ -1,4 +1,3 @@
1
1
  export * from './merge.js';
2
- export * from './Demultiplexer.js';
3
2
  export * from './LastValueSink.js';
4
3
  export * from './BroadcastIterable.js';
@@ -1,5 +1,4 @@
1
1
  export * from './merge.js';
2
- export * from './Demultiplexer.js';
3
2
  export * from './LastValueSink.js';
4
3
  export * from './BroadcastIterable.js';
5
4
  //# sourceMappingURL=streams-index.js.map
@@ -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,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,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-20250611110033",
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-20250611110033",
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-20250611110033",
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-20250611110033"
39
+ "@powersync/service-types": "0.0.0-dev-20250618131818"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/async": "^3.2.24",
@@ -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(1);
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.stopped = true;
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 BucketBatchCommitOptions {
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 TerminateOptions {
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: util.InternalOpId;
270
- nextCheckpoint: util.InternalOpId;
273
+ lastCheckpoint: ReplicationCheckpoint;
274
+ nextCheckpoint: ReplicationCheckpoint;
271
275
  }
272
276
 
273
277
  export interface CheckpointChanges {