@powersync/service-core 0.0.0-dev-20250507151436 → 0.0.0-dev-20250611110033

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 (126) hide show
  1. package/CHANGELOG.md +47 -7
  2. package/dist/api/RouteAPI.d.ts +1 -5
  3. package/dist/api/diagnostics.js +1 -1
  4. package/dist/api/diagnostics.js.map +1 -1
  5. package/dist/auth/CachedKeyCollector.js +2 -7
  6. package/dist/auth/CachedKeyCollector.js.map +1 -1
  7. package/dist/auth/CompoundKeyCollector.js.map +1 -1
  8. package/dist/auth/KeyCollector.d.ts +2 -2
  9. package/dist/auth/KeyStore.js +32 -14
  10. package/dist/auth/KeyStore.js.map +1 -1
  11. package/dist/auth/RemoteJWKSCollector.d.ts +1 -0
  12. package/dist/auth/RemoteJWKSCollector.js +39 -16
  13. package/dist/auth/RemoteJWKSCollector.js.map +1 -1
  14. package/dist/auth/auth-index.d.ts +1 -0
  15. package/dist/auth/auth-index.js +1 -0
  16. package/dist/auth/auth-index.js.map +1 -1
  17. package/dist/auth/utils.d.ts +6 -0
  18. package/dist/auth/utils.js +97 -0
  19. package/dist/auth/utils.js.map +1 -0
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.js +1 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.d.ts +1 -1
  24. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js.map +1 -1
  25. package/dist/replication/AbstractReplicationJob.d.ts +4 -0
  26. package/dist/replication/AbstractReplicationJob.js.map +1 -1
  27. package/dist/replication/AbstractReplicator.d.ts +23 -0
  28. package/dist/replication/AbstractReplicator.js +45 -0
  29. package/dist/replication/AbstractReplicator.js.map +1 -1
  30. package/dist/replication/RelationCache.d.ts +9 -0
  31. package/dist/replication/RelationCache.js +20 -0
  32. package/dist/replication/RelationCache.js.map +1 -0
  33. package/dist/replication/replication-index.d.ts +1 -0
  34. package/dist/replication/replication-index.js +1 -0
  35. package/dist/replication/replication-index.js.map +1 -1
  36. package/dist/replication/replication-metrics.js +6 -0
  37. package/dist/replication/replication-metrics.js.map +1 -1
  38. package/dist/routes/RouterEngine.js +1 -1
  39. package/dist/routes/RouterEngine.js.map +1 -1
  40. package/dist/routes/auth.d.ts +5 -16
  41. package/dist/routes/auth.js +6 -4
  42. package/dist/routes/auth.js.map +1 -1
  43. package/dist/routes/configure-fastify.d.ts +3 -21
  44. package/dist/routes/configure-fastify.js +3 -2
  45. package/dist/routes/configure-fastify.js.map +1 -1
  46. package/dist/routes/configure-rsocket.js +28 -11
  47. package/dist/routes/configure-rsocket.js.map +1 -1
  48. package/dist/routes/endpoints/admin.js +2 -0
  49. package/dist/routes/endpoints/admin.js.map +1 -1
  50. package/dist/routes/endpoints/checkpointing.d.ts +4 -28
  51. package/dist/routes/endpoints/socket-route.js +22 -8
  52. package/dist/routes/endpoints/socket-route.js.map +1 -1
  53. package/dist/routes/endpoints/sync-rules.js +6 -6
  54. package/dist/routes/endpoints/sync-rules.js.map +1 -1
  55. package/dist/routes/endpoints/sync-stream.d.ts +2 -14
  56. package/dist/routes/endpoints/sync-stream.js +28 -9
  57. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  58. package/dist/routes/route-register.js +10 -6
  59. package/dist/routes/route-register.js.map +1 -1
  60. package/dist/routes/router.d.ts +7 -3
  61. package/dist/routes/router.js.map +1 -1
  62. package/dist/storage/BucketStorageBatch.d.ts +17 -1
  63. package/dist/storage/BucketStorageBatch.js +2 -1
  64. package/dist/storage/BucketStorageBatch.js.map +1 -1
  65. package/dist/storage/PersistedSyncRulesContent.d.ts +5 -0
  66. package/dist/storage/SourceTable.d.ts +17 -1
  67. package/dist/storage/SourceTable.js +28 -0
  68. package/dist/storage/SourceTable.js.map +1 -1
  69. package/dist/storage/SyncRulesBucketStorage.d.ts +11 -2
  70. package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
  71. package/dist/storage/bson.js +4 -1
  72. package/dist/storage/bson.js.map +1 -1
  73. package/dist/sync/BucketChecksumState.d.ts +40 -18
  74. package/dist/sync/BucketChecksumState.js +122 -74
  75. package/dist/sync/BucketChecksumState.js.map +1 -1
  76. package/dist/sync/RequestTracker.d.ts +22 -1
  77. package/dist/sync/RequestTracker.js +51 -2
  78. package/dist/sync/RequestTracker.js.map +1 -1
  79. package/dist/sync/sync.d.ts +3 -5
  80. package/dist/sync/sync.js +49 -34
  81. package/dist/sync/sync.js.map +1 -1
  82. package/dist/util/config/collectors/config-collector.js +2 -5
  83. package/dist/util/config/collectors/config-collector.js.map +1 -1
  84. package/dist/util/protocol-types.d.ts +9 -9
  85. package/dist/util/protocol-types.js.map +1 -1
  86. package/dist/util/utils.d.ts +1 -1
  87. package/package.json +6 -7
  88. package/src/api/RouteAPI.ts +1 -6
  89. package/src/api/diagnostics.ts +1 -1
  90. package/src/auth/CachedKeyCollector.ts +4 -6
  91. package/src/auth/CompoundKeyCollector.ts +2 -1
  92. package/src/auth/KeyCollector.ts +2 -2
  93. package/src/auth/KeyStore.ts +45 -20
  94. package/src/auth/RemoteJWKSCollector.ts +39 -16
  95. package/src/auth/auth-index.ts +1 -0
  96. package/src/auth/utils.ts +102 -0
  97. package/src/index.ts +2 -0
  98. package/src/metrics/open-telemetry/OpenTelemetryMetricsFactory.ts +3 -3
  99. package/src/replication/AbstractReplicationJob.ts +5 -0
  100. package/src/replication/AbstractReplicator.ts +47 -0
  101. package/src/replication/RelationCache.ts +25 -0
  102. package/src/replication/replication-index.ts +1 -0
  103. package/src/replication/replication-metrics.ts +7 -0
  104. package/src/routes/RouterEngine.ts +1 -1
  105. package/src/routes/auth.ts +7 -6
  106. package/src/routes/configure-fastify.ts +6 -3
  107. package/src/routes/configure-rsocket.ts +33 -14
  108. package/src/routes/endpoints/admin.ts +2 -0
  109. package/src/routes/endpoints/socket-route.ts +24 -8
  110. package/src/routes/endpoints/sync-rules.ts +6 -6
  111. package/src/routes/endpoints/sync-stream.ts +31 -8
  112. package/src/routes/route-register.ts +10 -7
  113. package/src/routes/router.ts +9 -3
  114. package/src/storage/BucketStorageBatch.ts +22 -2
  115. package/src/storage/PersistedSyncRulesContent.ts +6 -0
  116. package/src/storage/SourceTable.ts +44 -1
  117. package/src/storage/SyncRulesBucketStorage.ts +14 -2
  118. package/src/storage/bson.ts +4 -1
  119. package/src/sync/BucketChecksumState.ts +162 -77
  120. package/src/sync/RequestTracker.ts +70 -3
  121. package/src/sync/sync.ts +72 -49
  122. package/src/util/config/collectors/config-collector.ts +3 -7
  123. package/src/util/protocol-types.ts +15 -10
  124. package/test/src/auth.test.ts +29 -11
  125. package/test/src/sync/BucketChecksumState.test.ts +32 -18
  126. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RequestTracker.js","sourceRoot":"","sources":["../../src/sync/RequestTracker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,cAAc;IAIL;IAHpB,gBAAgB,GAAG,CAAC,CAAC;IACrB,eAAe,GAAG,CAAC,CAAC;IAEpB,YAAoB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,mBAAmB,CAAC,UAAkB;QACpC,IAAI,CAAC,gBAAgB,IAAI,UAAU,CAAC;QAEpC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC;QAE9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;CACF"}
1
+ {"version":3,"file":"RequestTracker.js","sourceRoot":"","sources":["../../src/sync/RequestTracker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD;;GAEG;AACH,MAAM,OAAO,cAAc;IAML;IALpB,gBAAgB,GAAG,CAAC,CAAC;IACrB,eAAe,GAAG,CAAC,CAAC;IACpB,eAAe,GAAoB,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC5E,YAAY,GAA2B,EAAE,CAAC;IAE1C,YAAoB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,mBAAmB,CAAC,UAA+B;QACjD,IAAI,CAAC,gBAAgB,IAAI,UAAU,CAAC,KAAK,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;QAC5D,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC;QAC1D,IAAI,UAAU,CAAC,KAAK,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QACxG,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7E,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC;QAE9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,UAAU;QACR,OAAO;YACL,iBAAiB,EAAE,IAAI,CAAC,gBAAgB;YACxC,iBAAiB,EAAE,IAAI,CAAC,eAAe;YACvC,gBAAgB,EAAE,IAAI,CAAC,eAAe;YACtC,aAAa,EAAE,IAAI,CAAC,YAAY;SACjC,CAAC;IACJ,CAAC;CACF;AAeD,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;YACjB,KAAK,KAAK;gBACR,GAAG,EAAE,CAAC;gBACN,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,EAAE,CAAC;gBACT,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,EAAE,CAAC;gBACP,MAAM;YACR,KAAK,OAAO;gBACV,KAAK,EAAE,CAAC;gBACR,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE;YACV,GAAG;YACH,MAAM;YACN,IAAI;YACJ,KAAK;SACN;QACD,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK;KACnC,CAAC;AACJ,CAAC"}
@@ -1,7 +1,8 @@
1
- import { BucketDescription, RequestParameters, SqlSyncRules } from '@powersync/service-sync-rules';
1
+ import { RequestParameters, SqlSyncRules } from '@powersync/service-sync-rules';
2
2
  import * as auth from '../auth/auth-index.js';
3
3
  import * as storage from '../storage/storage-index.js';
4
4
  import * as util from '../util/util-index.js';
5
+ import { Logger } from '@powersync/lib-services-framework';
5
6
  import { TokenStreamOptions } from './util.js';
6
7
  import { SyncContext } from './SyncContext.js';
7
8
  import { RequestTracker } from './RequestTracker.js';
@@ -12,6 +13,7 @@ export interface SyncStreamParameters {
12
13
  params: util.StreamingSyncRequest;
13
14
  syncParams: RequestParameters;
14
15
  token: auth.JwtPayload;
16
+ logger?: Logger;
15
17
  /**
16
18
  * If this signal is aborted, the stream response ends as soon as possible, without error.
17
19
  */
@@ -20,7 +22,3 @@ export interface SyncStreamParameters {
20
22
  tracker: RequestTracker;
21
23
  }
22
24
  export declare function streamResponse(options: SyncStreamParameters): AsyncIterable<util.StreamingSyncLine | string | null>;
23
- export type BucketSyncState = {
24
- description?: BucketDescription;
25
- start_op_id: util.InternalOpId;
26
- };
package/dist/sync/sync.js CHANGED
@@ -1,12 +1,14 @@
1
1
  import { JSONBig, JsonContainer } from '@powersync/service-jsonbig';
2
2
  import { AbortError } from 'ix/aborterror.js';
3
3
  import * as util from '../util/util-index.js';
4
- import { logger } from '@powersync/lib-services-framework';
4
+ import { logger as defaultLogger } from '@powersync/lib-services-framework';
5
5
  import { BucketChecksumState } from './BucketChecksumState.js';
6
6
  import { mergeAsyncIterables } from '../streams/streams-index.js';
7
7
  import { acquireSemaphoreAbortable, settledPromise, tokenStream } from './util.js';
8
+ import { statsForBatch } from './RequestTracker.js';
8
9
  export async function* streamResponse(options) {
9
10
  const { syncContext, bucketStorage, syncRules, params, syncParams, token, tokenStreamOptions, tracker, signal } = options;
11
+ const logger = options.logger ?? defaultLogger;
10
12
  // We also need to be able to abort, so we create our own controller.
11
13
  const controller = new AbortController();
12
14
  if (signal) {
@@ -18,7 +20,7 @@ export async function* streamResponse(options) {
18
20
  }
19
21
  }
20
22
  const ki = tokenStream(token, controller.signal, tokenStreamOptions);
21
- const stream = streamResponseInner(syncContext, bucketStorage, syncRules, params, syncParams, tracker, controller.signal);
23
+ const stream = streamResponseInner(syncContext, bucketStorage, syncRules, params, syncParams, tracker, controller.signal, logger);
22
24
  // Merge the two streams, and abort as soon as one of the streams end.
23
25
  const merged = mergeAsyncIterables([stream, ki], controller.signal);
24
26
  try {
@@ -38,9 +40,9 @@ export async function* streamResponse(options) {
38
40
  controller.abort();
39
41
  }
40
42
  }
41
- async function* streamResponseInner(syncContext, bucketStorage, syncRules, params, syncParams, tracker, signal) {
43
+ async function* streamResponseInner(syncContext, bucketStorage, syncRules, params, syncParams, tracker, signal, logger) {
42
44
  const { raw_data, binary_data } = params;
43
- const checkpointUserId = util.checkpointUserId(syncParams.token_parameters.user_id, params.client_id);
45
+ const checkpointUserId = util.checkpointUserId(syncParams.tokenParameters.user_id, params.client_id);
44
46
  const checksumState = new BucketChecksumState({
45
47
  syncContext,
46
48
  bucketStorage,
@@ -49,20 +51,29 @@ async function* streamResponseInner(syncContext, bucketStorage, syncRules, param
49
51
  initialBucketPositions: params.buckets?.map((bucket) => ({
50
52
  name: bucket.name,
51
53
  after: BigInt(bucket.after)
52
- }))
54
+ })),
55
+ logger: logger
53
56
  });
54
57
  const stream = bucketStorage.watchCheckpointChanges({
55
58
  user_id: checkpointUserId,
56
59
  signal
57
60
  });
58
61
  const newCheckpoints = stream[Symbol.asyncIterator]();
62
+ async function waitForNewCheckpointLine() {
63
+ const next = await newCheckpoints.next();
64
+ if (next.done) {
65
+ return { done: true, value: undefined };
66
+ }
67
+ const line = await checksumState.buildNextCheckpointLine(next.value);
68
+ return { done: false, value: { checkpoint: next.value.base.checkpoint, line } };
69
+ }
59
70
  try {
60
71
  let nextCheckpointPromise;
61
72
  do {
62
73
  if (!nextCheckpointPromise) {
63
74
  // Wrap in a settledPromise, so that abort errors after the parent stopped iterating
64
75
  // does not result in uncaught errors.
65
- nextCheckpointPromise = settledPromise(newCheckpoints.next());
76
+ nextCheckpointPromise = settledPromise(waitForNewCheckpointLine());
66
77
  }
67
78
  const next = await nextCheckpointPromise;
68
79
  nextCheckpointPromise = undefined;
@@ -72,12 +83,14 @@ async function* streamResponseInner(syncContext, bucketStorage, syncRules, param
72
83
  if (next.value.done) {
73
84
  break;
74
85
  }
75
- const line = await checksumState.buildNextCheckpointLine(next.value.value);
86
+ const line = next.value.value.line;
76
87
  if (line == null) {
77
88
  // No update to sync
78
89
  continue;
79
90
  }
80
91
  const { checkpointLine, bucketsToFetch } = line;
92
+ // Since yielding can block, we update the state just before yielding the line.
93
+ line.advance();
81
94
  yield checkpointLine;
82
95
  // Start syncing data for buckets up to the checkpoint. As soon as we have completed at least one priority and
83
96
  // at least 1000 operations, we also start listening for new checkpoints concurrently. When a new checkpoint comes
@@ -100,29 +113,30 @@ async function* streamResponseInner(syncContext, bucketStorage, syncRules, param
100
113
  function maybeRaceForNewCheckpoint() {
101
114
  if (syncedOperations >= 1000 && nextCheckpointPromise === undefined) {
102
115
  nextCheckpointPromise = (async () => {
103
- const next = await settledPromise(newCheckpoints.next());
104
- if (next.status == 'rejected') {
105
- abortCheckpointController.abort();
106
- }
107
- else if (!next.value.done) {
108
- // Stop the running bucketDataInBatches() iterations, making the main flow reach the new checkpoint.
109
- abortCheckpointController.abort();
116
+ while (true) {
117
+ const next = await settledPromise(waitForNewCheckpointLine());
118
+ if (next.status == 'rejected') {
119
+ abortCheckpointController.abort();
120
+ }
121
+ else if (!next.value.done) {
122
+ if (next.value.value.line == null) {
123
+ // There's a new checkpoint that doesn't affect this sync stream. Keep listening, but don't
124
+ // interrupt this batch.
125
+ continue;
126
+ }
127
+ // A new sync line can be emitted. Stop running the bucketDataInBatches() iterations, making the
128
+ // main flow reach the new checkpoint.
129
+ abortCheckpointController.abort();
130
+ }
131
+ return next;
110
132
  }
111
- return next;
112
133
  })();
113
134
  }
114
135
  }
115
- function markOperationsSent(operations) {
116
- syncedOperations += operations;
117
- tracker.addOperationsSynced(operations);
118
- // Disable interrupting checkpoints for now.
119
- // There is a bug with interrupting checkpoints where:
120
- // 1. User is in the middle of syncing a large batch of data (for example initial sync).
121
- // 2. A new checkpoint comes in, which interrupts the batch.
122
- // 3. However, the new checkpoint does not contain any new data for this connection, so nothing further is synced.
123
- // This then causes the client to wait indefinitely for the remaining data or checkpoint_complete message. That is
124
- // only resolved when a new checkpoint comes in that does have data for this connection, or the connection is restarted.
125
- // maybeRaceForNewCheckpoint();
136
+ function markOperationsSent(stats) {
137
+ syncedOperations += stats.total;
138
+ tracker.addOperationsSynced(stats);
139
+ maybeRaceForNewCheckpoint();
126
140
  }
127
141
  // This incrementally updates dataBuckets with each individual bucket position.
128
142
  // At the end of this, we can be sure that all buckets have data up to the checkpoint.
@@ -134,18 +148,19 @@ async function* streamResponseInner(syncContext, bucketStorage, syncRules, param
134
148
  yield* bucketDataInBatches({
135
149
  syncContext: syncContext,
136
150
  bucketStorage: bucketStorage,
137
- checkpoint: next.value.value.base.checkpoint,
151
+ checkpoint: next.value.value.checkpoint,
138
152
  bucketsToFetch: buckets,
139
- checksumState,
153
+ checkpointLine: line,
140
154
  raw_data,
141
155
  binary_data,
142
156
  onRowsSent: markOperationsSent,
143
157
  abort_connection: signal,
144
158
  abort_batch: abortCheckpointSignal,
145
- user_id: syncParams.user_id,
159
+ user_id: syncParams.userId,
146
160
  // Passing null here will emit a full sync complete message at the end. If we pass a priority, we'll emit a partial
147
161
  // sync complete message instead.
148
- forPriority: !isLast ? priority : null
162
+ forPriority: !isLast ? priority : null,
163
+ logger
149
164
  });
150
165
  }
151
166
  if (!abortCheckpointSignal.aborted) {
@@ -194,7 +209,7 @@ async function* bucketDataInBatches(request) {
194
209
  * Extracted as a separate internal function just to avoid memory leaks.
195
210
  */
196
211
  async function* bucketDataBatch(request) {
197
- const { syncContext, bucketStorage: storage, checkpoint, bucketsToFetch, checksumState, raw_data, binary_data, abort_connection, abort_batch, onRowsSent } = request;
212
+ const { syncContext, bucketStorage: storage, checkpoint, bucketsToFetch, checkpointLine, raw_data, binary_data, abort_connection, abort_batch, onRowsSent, logger } = request;
198
213
  let checkpointInvalidated = false;
199
214
  if (syncContext.syncSemaphore.isLocked()) {
200
215
  logger.info('Sync concurrency limit reached, waiting for lock', { user_id: request.user_id });
@@ -215,7 +230,7 @@ async function* bucketDataBatch(request) {
215
230
  }
216
231
  // Optimization: Only fetch buckets for which the checksums have changed since the last checkpoint
217
232
  // For the first batch, this will be all buckets.
218
- const filteredBuckets = checksumState.getFilteredBucketPositions(bucketsToFetch);
233
+ const filteredBuckets = checkpointLine.getFilteredBucketPositions(bucketsToFetch);
219
234
  const dataBatches = storage.getBucketDataBatch(checkpoint, filteredBuckets);
220
235
  let has_more = false;
221
236
  for await (let { chunkData: r, targetOp } of dataBatches) {
@@ -261,8 +276,8 @@ async function* bucketDataBatch(request) {
261
276
  // iterator memory in case if large data sent.
262
277
  yield { data: null, done: false };
263
278
  }
264
- onRowsSent(r.data.length);
265
- checksumState.updateBucketPosition({ bucket: r.bucket, nextAfter: BigInt(r.next_after), hasMore: r.has_more });
279
+ onRowsSent(statsForBatch(r));
280
+ checkpointLine.updateBucketPosition({ bucket: r.bucket, nextAfter: BigInt(r.next_after), hasMore: r.has_more });
266
281
  // Check if syncing bucket data is supposed to stop before fetching more data
267
282
  // from storage.
268
283
  if (abort_batch.aborted) {
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,WAAW,EAAsB,MAAM,WAAW,CAAC;AAoBvG,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACnC,OAA6B;IAE7B,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,GAC7G,OAAO,CAAC;IACV,qEAAqE;IACrE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,GAAG,EAAE;YACH,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;QACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,mBAAmB,CAChC,WAAW,EACX,aAAa,EACb,SAAS,EACT,MAAM,EACN,UAAU,EACV,OAAO,EACP,UAAU,CAAC,MAAM,CAClB,CAAC;IACF,sEAAsE;IACtE,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,KAAK,CAAC,CAAC,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;YAAS,CAAC;QACT,iFAAiF;QACjF,qBAAqB;QACrB,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAOD,KAAK,SAAS,CAAC,CAAC,mBAAmB,CACjC,WAAwB,EACxB,aAA6C,EAC7C,SAAuB,EACvB,MAAiC,EACjC,UAA6B,EAC7B,OAAuB,EACvB,MAAmB;IAEnB,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAiB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAEhH,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC;QAC5C,WAAW;QACX,aAAa;QACb,SAAS;QACT,UAAU;QACV,sBAAsB,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,aAAa,CAAC,sBAAsB,CAAC;QAClD,OAAO,EAAE,gBAAgB;QACzB,MAAM;KACP,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,IAAI,qBAES,CAAC;QAEd,GAAG,CAAC;YACF,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC3B,oFAAoF;gBACpF,sCAAsC;gBACtC,qBAAqB,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC;YACzC,qBAAqB,GAAG,SAAS,CAAC;YAClC,IAAI,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,IAAI,CAAC,MAAM,CAAC;YACpB,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3E,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,oBAAoB;gBACpB,SAAS;YACX,CAAC;YAED,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;YAEhD,MAAM,cAAc,CAAC;YACrB,8GAA8G;YAC9G,kHAAkH;YAClH,iHAAiH;YACjH,sBAAsB;YACtB,MAAM,yBAAyB,GAAG,IAAI,eAAe,EAAE,CAAC;YACxD,IAAI,gBAAgB,GAAG,CAAC,CAAC;YAEzB,MAAM,qBAAqB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAE1F,MAAM,iBAAiB,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAClG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qCAAqC;YACpF,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAErD,wGAAwG;YACxG,+FAA+F;YAC/F,8GAA8G;YAC9G,iBAAiB;YACjB,MAAM,eAAe,GAAmD,iBAAiB,CAAC;YAC1F,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YACnC,CAAC;YAED,SAAS,yBAAyB;gBAChC,IAAI,gBAAgB,IAAI,IAAI,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;oBACpE,qBAAqB,GAAG,CAAC,KAAK,IAAI,EAAE;wBAClC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;wBACzD,IAAI,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;4BAC9B,yBAAyB,CAAC,KAAK,EAAE,CAAC;wBACpC,CAAC;6BAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;4BAC5B,oGAAoG;4BACpG,yBAAyB,CAAC,KAAK,EAAE,CAAC;wBACpC,CAAC;wBAED,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC,EAAE,CAAC;gBACP,CAAC;YACH,CAAC;YAED,SAAS,kBAAkB,CAAC,UAAkB;gBAC5C,gBAAgB,IAAI,UAAU,CAAC;gBAC/B,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBACxC,4CAA4C;gBAC5C,sDAAsD;gBACtD,wFAAwF;gBACxF,4DAA4D;gBAC5D,kHAAkH;gBAClH,kHAAkH;gBAClH,wHAAwH;gBACxH,+BAA+B;YACjC,CAAC;YAED,+EAA+E;YAC/E,sFAAsF;YACtF,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,eAAe,EAAE,CAAC;gBAClD,MAAM,MAAM,GAAG,QAAQ,KAAK,cAAc,CAAC;gBAC3C,IAAI,qBAAqB,CAAC,OAAO,EAAE,CAAC;oBAClC,MAAM;gBACR,CAAC;gBAED,KAAK,CAAC,CAAC,mBAAmB,CAAC;oBACzB,WAAW,EAAE,WAAW;oBACxB,aAAa,EAAE,aAAa;oBAC5B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU;oBAC5C,cAAc,EAAE,OAAO;oBACvB,aAAa;oBACb,QAAQ;oBACR,WAAW;oBACX,UAAU,EAAE,kBAAkB;oBAC9B,gBAAgB,EAAE,MAAM;oBACxB,WAAW,EAAE,qBAAqB;oBAClC,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,mHAAmH;oBACnH,iCAAiC;oBACjC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;iBACvC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE;IAC5B,CAAC;YAAS,CAAC;QACT,MAAM,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAuBD,KAAK,SAAS,CAAC,CAAC,mBAAmB,CAAC,OAA0B;IAC5D,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/C,wEAAwE;QACxE,6EAA6E;QAC7E,4GAA4G;QAC5G,gBAAgB;QAChB,gBAAgB;QAChB,qBAAqB;QACrB,MAAM;QACN,WAAW;QACX,IAAI;QACJ,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBACpD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM;gBACR,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;oBAC7B,MAAM,IAAI,CAAC;oBACX,IAAI,IAAI,EAAE,CAAC;wBACT,MAAM,GAAG,IAAI,CAAC;oBAChB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC;AAOD;;GAEG;AACH,KAAK,SAAS,CAAC,CAAC,eAAe,CAAC,OAA0B;IACxD,MAAM,EACJ,WAAW,EACX,aAAa,EAAE,OAAO,EACtB,UAAU,EACV,cAAc,EACd,aAAa,EACb,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,UAAU,EACX,GAAG,OAAO,CAAC;IAEZ,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAElC,IAAI,WAAW,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5G,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,6DAA6D;YAC7D,qBAAqB;YACrB,MAAM,CAAC,IAAI,CAAC,mCAAmC,KAAK,GAAG,CAAC,EAAE,EAAE;gBAC1D,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,eAAe,EAAE,KAAK,GAAG,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,kGAAkG;QAClG,iDAAiD;QACjD,MAAM,eAAe,GAAG,aAAa,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAE5E,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,IAAI,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC;YACzD,qDAAqD;YACrD,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACf,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;YACD,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;gBAC9C,qBAAqB,GAAG,IAAI,CAAC;YAC/B,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAE7C,IAAI,SAAc,CAAC;YACnB,IAAI,WAAW,EAAE,CAAC;gBAChB,wEAAwE;gBACxE,SAAS,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1B,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB;;mBAEG;gBACH,MAAM,QAAQ,GAA2B;oBACvC,IAAI,EAAE,CAAC;iBACR,CAAC;gBACF,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,8EAA8E;gBAC9E,4BAA4B;gBAC5B,MAAM,QAAQ,GAA2B;oBACvC,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC;iBACjC,CAAC;gBACF,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACvC,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;gBAC9B,0EAA0E;gBAC1E,8CAA8C;gBAC9C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACpC,CAAC;YACD,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1B,aAAa,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE/G,6EAA6E;YAC7E,gBAAgB;YAChB,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,gDAAgD;gBAChD,wDAAwD;gBACxD,kEAAkE;gBAClE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;oBAChC,MAAM,IAAI,GAAkD;wBAC1D,2BAA2B,EAAE;4BAC3B,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC;4BACnD,QAAQ,EAAE,OAAO,CAAC,WAAW;yBAC9B;qBACF,CAAC;oBACF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAyC;wBACjD,mBAAmB,EAAE;4BACnB,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC;yBACpD;qBACF,CAAC;oBACF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,6DAA6D;YAC7D,qBAAqB;YACrB,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBACjC,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,UAA+B;IAC9D,OAAO;QACL,GAAG,UAAU;QACb,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAClC,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,IAAc,CAAC;gBACzE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;aACjC,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- import { configFile } from '@powersync/service-types';
2
- import * as t from 'ts-codec';
3
1
  import * as yaml from 'yaml';
4
2
  import { schema } from '@powersync/lib-services-framework';
3
+ import { configFile } from '@powersync/service-types';
5
4
  import { YamlEnvTag } from './impl/yaml-env.js';
6
5
  export var ConfigFileFormat;
7
6
  (function (ConfigFileFormat) {
@@ -9,9 +8,7 @@ export var ConfigFileFormat;
9
8
  ConfigFileFormat["JSON"] = "json";
10
9
  })(ConfigFileFormat || (ConfigFileFormat = {}));
11
10
  // ts-codec itself doesn't give great validation errors, so we use json schema for that
12
- const configSchemaValidator = schema
13
- .parseJSONSchema(t.generateJSONSchema(configFile.powerSyncConfig, { allowAdditional: true, parsers: [configFile.portParser] }))
14
- .validator();
11
+ const configSchemaValidator = schema.parseJSONSchema(configFile.PowerSyncConfigJSONSchema).validator();
15
12
  export class ConfigCollector {
16
13
  /**
17
14
  * Collects the PowerSyncConfig settings.
@@ -1 +1 @@
1
- {"version":3,"file":"config-collector.js","sourceRoot":"","sources":["../../../../src/util/config/collectors/config-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-collector.js","sourceRoot":"","sources":["../../../../src/util/config/collectors/config-collector.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import * as t from 'ts-codec';
2
- import { BucketDescription, BucketPriority, SqliteJsonValue } from '@powersync/service-sync-rules';
2
+ import { BucketDescription, BucketPriority, SqliteJsonRow } from '@powersync/service-sync-rules';
3
+ import { JsonContainer } from '@powersync/service-jsonbig';
3
4
  export declare const BucketRequest: t.ObjectCodec<{
4
5
  name: t.IdentityCodec<t.CodecType.String>;
5
6
  /**
@@ -57,7 +58,7 @@ export interface StreamingSyncCheckpointDiff {
57
58
  };
58
59
  }
59
60
  export interface StreamingSyncData {
60
- data: SyncBucketData;
61
+ data: SyncBucketData<ProtocolOplogData>;
61
62
  }
62
63
  export interface StreamingSyncCheckpointComplete {
63
64
  checkpoint_complete: {
@@ -87,12 +88,9 @@ export interface BucketState {
87
88
  bucket: string;
88
89
  op_id: string;
89
90
  }
90
- export interface SyncDataBatch {
91
- buckets: SyncBucketData[];
92
- }
93
- export interface SyncBucketData {
91
+ export interface SyncBucketData<Data extends ProtocolOplogData = StoredOplogData> {
94
92
  bucket: string;
95
- data: OplogEntry[];
93
+ data: OplogEntry<Data>[];
96
94
  /**
97
95
  * True if there _could_ be more data for this bucket, and another request must be made.
98
96
  */
@@ -106,12 +104,14 @@ export interface SyncBucketData {
106
104
  */
107
105
  next_after: ProtocolOpId;
108
106
  }
109
- export interface OplogEntry {
107
+ export type StoredOplogData = string | null;
108
+ export type ProtocolOplogData = SqliteJsonRow | JsonContainer | StoredOplogData;
109
+ export interface OplogEntry<Data extends ProtocolOplogData = StoredOplogData> {
110
110
  op_id: ProtocolOpId;
111
111
  op: 'PUT' | 'REMOVE' | 'MOVE' | 'CLEAR';
112
112
  object_type?: string;
113
113
  object_id?: string;
114
- data?: Record<string, SqliteJsonValue> | string | null;
114
+ data?: Data;
115
115
  checksum: number | bigint;
116
116
  subkey?: string;
117
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-types.js","sourceRoot":"","sources":["../../src/util/protocol-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAG9B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM;IAEd;;OAEG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM;CAChB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;IAE1C;;OAEG;IACH,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAElC;;OAEG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAE9B;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEjC;;OAEG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"protocol-types.js","sourceRoot":"","sources":["../../src/util/protocol-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAI9B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM;IAEd;;OAEG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM;CAChB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;IAE1C;;OAEG;IACH,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAElC;;OAEG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAE9B;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEjC;;OAEG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC"}
@@ -46,7 +46,7 @@ export declare function isCompleteRow(storeData: boolean, row: sync_rules.Toasta
46
46
  *
47
47
  * Used for tests.
48
48
  */
49
- export declare function reduceBucket(operations: OplogEntry[]): OplogEntry[];
49
+ export declare function reduceBucket(operations: OplogEntry[]): OplogEntry<import("./protocol-types.js").StoredOplogData>[];
50
50
  /**
51
51
  * Flattens string to reduce memory usage (around 320 bytes -> 120 bytes),
52
52
  * at the cost of some upfront CPU usage.
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
8
- "version": "0.0.0-dev-20250507151436",
8
+ "version": "0.0.0-dev-20250611110033",
9
9
  "main": "dist/index.js",
10
10
  "license": "FSL-1.1-Apache-2.0",
11
11
  "type": "module",
@@ -29,19 +29,18 @@
29
29
  "node-fetch": "^3.3.2",
30
30
  "ts-codec": "^1.3.0",
31
31
  "uri-js": "^4.4.1",
32
- "uuid": "^9.0.1",
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-20250507151436",
35
+ "@powersync/lib-services-framework": "0.0.0-dev-20250611110033",
36
36
  "@powersync/service-jsonbig": "0.17.10",
37
- "@powersync/service-rsocket-router": "0.0.0-dev-20250507151436",
38
- "@powersync/service-sync-rules": "0.26.0",
39
- "@powersync/service-types": "0.10.0"
37
+ "@powersync/service-rsocket-router": "0.0.0-dev-20250611110033",
38
+ "@powersync/service-sync-rules": "0.27.0",
39
+ "@powersync/service-types": "0.0.0-dev-20250611110033"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/async": "^3.2.24",
43
43
  "@types/lodash": "^4.17.5",
44
- "@types/uuid": "^9.0.4",
45
44
  "fastify": "4.23.2",
46
45
  "fastify-plugin": "^4.5.1"
47
46
  },
@@ -47,12 +47,7 @@ export interface RouteAPI {
47
47
  * @returns The replication lag: that is the amount of data which has not been
48
48
  * replicated yet, in bytes.
49
49
  */
50
- getReplicationLag(options: ReplicationLagOptions): Promise<number | undefined>;
51
-
52
- /**
53
- * Get the current LSN or equivalent replication HEAD position identifier
54
- */
55
- getReplicationHead(): Promise<string>;
50
+ getReplicationLagBytes(options: ReplicationLagOptions): Promise<number | undefined>;
56
51
 
57
52
  /**
58
53
  * Get the current LSN or equivalent replication HEAD position identifier.
@@ -78,7 +78,7 @@ export async function getSyncRulesStatus(
78
78
 
79
79
  if (systemStorage) {
80
80
  try {
81
- replication_lag_bytes = await apiHandler.getReplicationLag({
81
+ replication_lag_bytes = await apiHandler.getReplicationLagBytes({
82
82
  bucketStorage: systemStorage
83
83
  });
84
84
  } catch (e) {
@@ -3,6 +3,8 @@ import timers from 'timers/promises';
3
3
  import { KeySpec } from './KeySpec.js';
4
4
  import { LeakyBucket } from './LeakyBucket.js';
5
5
  import { KeyCollector, KeyResult } from './KeyCollector.js';
6
+ import { AuthorizationError } from '@powersync/lib-services-framework';
7
+ import { mapAuthConfigError } from './utils.js';
6
8
 
7
9
  /**
8
10
  * Manages caching and refreshing for a key collector.
@@ -39,7 +41,7 @@ export class CachedKeyCollector implements KeyCollector {
39
41
  */
40
42
  private keyExpiry = 3600000;
41
43
 
42
- private currentErrors: jose.errors.JOSEError[] = [];
44
+ private currentErrors: AuthorizationError[] = [];
43
45
  /**
44
46
  * Indicates a "fatal" error that should be retried.
45
47
  */
@@ -103,11 +105,7 @@ export class CachedKeyCollector implements KeyCollector {
103
105
  } catch (e) {
104
106
  this.error = true;
105
107
  // No result - keep previous keys
106
- if (e instanceof jose.errors.JOSEError) {
107
- this.currentErrors = [e];
108
- } else {
109
- this.currentErrors = [new jose.errors.JOSEError(e.message ?? 'Failed to fetch keys')];
110
- }
108
+ this.currentErrors = [mapAuthConfigError(e)];
111
109
  }
112
110
  }
113
111
 
@@ -1,6 +1,7 @@
1
1
  import * as jose from 'jose';
2
2
  import { KeySpec } from './KeySpec.js';
3
3
  import { KeyCollector, KeyResult } from './KeyCollector.js';
4
+ import { AuthorizationError } from '@powersync/lib-services-framework';
4
5
 
5
6
  export class CompoundKeyCollector implements KeyCollector {
6
7
  private collectors: KeyCollector[];
@@ -15,7 +16,7 @@ export class CompoundKeyCollector implements KeyCollector {
15
16
 
16
17
  async getKeys(): Promise<KeyResult> {
17
18
  let keys: KeySpec[] = [];
18
- let errors: jose.errors.JOSEError[] = [];
19
+ let errors: AuthorizationError[] = [];
19
20
  const promises = this.collectors.map((collector) =>
20
21
  collector.getKeys().then((result) => {
21
22
  keys.push(...result.keys);
@@ -1,4 +1,4 @@
1
- import * as jose from 'jose';
1
+ import { AuthorizationError } from '@powersync/lib-services-framework';
2
2
  import { KeySpec } from './KeySpec.js';
3
3
 
4
4
  export interface KeyCollector {
@@ -22,6 +22,6 @@ export interface KeyCollector {
22
22
  }
23
23
 
24
24
  export interface KeyResult {
25
- errors: jose.errors.JOSEError[];
25
+ errors: AuthorizationError[];
26
26
  keys: KeySpec[];
27
27
  }
@@ -1,9 +1,10 @@
1
- import { logger } from '@powersync/lib-services-framework';
1
+ import { logger, errors, AuthorizationError, ErrorCode } from '@powersync/lib-services-framework';
2
2
  import * as jose from 'jose';
3
3
  import secs from '../util/secs.js';
4
4
  import { JwtPayload } from './JwtPayload.js';
5
5
  import { KeyCollector } from './KeyCollector.js';
6
6
  import { KeyOptions, KeySpec, SUPPORTED_ALGORITHMS } from './KeySpec.js';
7
+ import { mapAuthError } from './utils.js';
7
8
 
8
9
  /**
9
10
  * KeyStore to get keys and verify tokens.
@@ -49,7 +50,8 @@ export class KeyStore<Collector extends KeyCollector = KeyCollector> {
49
50
  clockTolerance: 60,
50
51
  // More specific algorithm checking is done when selecting the key to use.
51
52
  algorithms: SUPPORTED_ALGORITHMS,
52
- requiredClaims: ['aud', 'sub', 'iat', 'exp']
53
+ // 'aud' presence is checked below, so we can add more details to the error message.
54
+ requiredClaims: ['sub', 'iat', 'exp']
53
55
  });
54
56
 
55
57
  let audiences = options.defaultAudiences;
@@ -60,8 +62,12 @@ export class KeyStore<Collector extends KeyCollector = KeyCollector> {
60
62
 
61
63
  const tokenPayload = result.payload;
62
64
 
63
- let aud = tokenPayload.aud!;
64
- if (!Array.isArray(aud)) {
65
+ let aud = tokenPayload.aud;
66
+ if (aud == null) {
67
+ throw new AuthorizationError(ErrorCode.PSYNC_S2105, `JWT payload is missing a required claim "aud"`, {
68
+ configurationDetails: `Current configuration allows these audience values: ${JSON.stringify(audiences)}`
69
+ });
70
+ } else if (!Array.isArray(aud)) {
65
71
  aud = [aud];
66
72
  }
67
73
  if (
@@ -69,7 +75,11 @@ export class KeyStore<Collector extends KeyCollector = KeyCollector> {
69
75
  return audiences.includes(a);
70
76
  })
71
77
  ) {
72
- throw new jose.errors.JWTClaimValidationFailed('unexpected "aud" claim value', 'aud', 'check_failed');
78
+ throw new AuthorizationError(
79
+ ErrorCode.PSYNC_S2105,
80
+ `Unexpected "aud" claim value: ${JSON.stringify(tokenPayload.aud)}`,
81
+ { configurationDetails: `Current configuration allows these audience values: ${JSON.stringify(audiences)}` }
82
+ );
73
83
  }
74
84
 
75
85
  const tokenDuration = tokenPayload.exp! - tokenPayload.iat!;
@@ -78,12 +88,15 @@ export class KeyStore<Collector extends KeyCollector = KeyCollector> {
78
88
  // is too far into the future.
79
89
  const maxAge = keyOptions.maxLifetimeSeconds ?? secs(options.maxAge);
80
90
  if (tokenDuration > maxAge) {
81
- throw new jose.errors.JWTInvalid(`Token must expire in a maximum of ${maxAge} seconds, got ${tokenDuration}`);
91
+ throw new AuthorizationError(
92
+ ErrorCode.PSYNC_S2104,
93
+ `Token must expire in a maximum of ${maxAge} seconds, got ${tokenDuration}s`
94
+ );
82
95
  }
83
96
 
84
97
  const parameters = tokenPayload.parameters;
85
98
  if (parameters != null && (Array.isArray(parameters) || typeof parameters != 'object')) {
86
- throw new jose.errors.JWTInvalid('parameters must be an object');
99
+ throw new AuthorizationError(ErrorCode.PSYNC_S2101, `Payload parameters must be an object`);
87
100
  }
88
101
 
89
102
  return tokenPayload as JwtPayload;
@@ -91,16 +104,20 @@ export class KeyStore<Collector extends KeyCollector = KeyCollector> {
91
104
 
92
105
  private async verifyInternal(token: string, options: jose.JWTVerifyOptions) {
93
106
  let keyOptions: KeyOptions | undefined = undefined;
94
- const result = await jose.jwtVerify(
95
- token,
96
- async (header) => {
97
- let key = await this.getCachedKey(token, header);
98
- keyOptions = key.options;
99
- return key.key;
100
- },
101
- options
102
- );
103
- return { result, keyOptions: keyOptions! };
107
+ try {
108
+ const result = await jose.jwtVerify(
109
+ token,
110
+ async (header) => {
111
+ let key = await this.getCachedKey(token, header);
112
+ keyOptions = key.options;
113
+ return key.key;
114
+ },
115
+ options
116
+ );
117
+ return { result, keyOptions: keyOptions! };
118
+ } catch (e) {
119
+ throw mapAuthError(e, token);
120
+ }
104
121
  }
105
122
 
106
123
  private async getCachedKey(token: string, header: jose.JWTHeaderParameters): Promise<KeySpec> {
@@ -112,7 +129,10 @@ export class KeyStore<Collector extends KeyCollector = KeyCollector> {
112
129
  for (let key of keys) {
113
130
  if (key.kid == kid) {
114
131
  if (!key.matchesAlgorithm(header.alg)) {
115
- throw new jose.errors.JOSEAlgNotAllowed(`Unexpected token algorithm ${header.alg}`);
132
+ throw new AuthorizationError(ErrorCode.PSYNC_S2101, `Unexpected token algorithm ${header.alg}`, {
133
+ configurationDetails: `Key kid: ${key.source.kid}, alg: ${key.source.alg}, kty: ${key.source.kty}`
134
+ // Token details automatically populated elsewhere
135
+ });
116
136
  }
117
137
  return key;
118
138
  }
@@ -145,8 +165,13 @@ export class KeyStore<Collector extends KeyCollector = KeyCollector> {
145
165
  logger.error(`Failed to refresh keys`, e);
146
166
  });
147
167
 
148
- throw new jose.errors.JOSEError(
149
- 'Could not find an appropriate key in the keystore. The key is missing or no key matched the token KID'
168
+ throw new AuthorizationError(
169
+ ErrorCode.PSYNC_S2101,
170
+ 'Could not find an appropriate key in the keystore. The key is missing or no key matched the token KID',
171
+ {
172
+ configurationDetails: `Known kid values: ${keys.map((key) => key.kid ?? '*').join(', ')}`
173
+ // tokenDetails automatically populated later
174
+ }
150
175
  );
151
176
  }
152
177
  }