@powersync/service-core 0.18.1 → 1.7.0
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 +16 -0
- package/dist/api/RouteAPI.d.ts +1 -1
- package/dist/api/diagnostics.js +107 -169
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/entry/commands/compact-action.js +10 -73
- package/dist/entry/commands/compact-action.js.map +1 -1
- package/dist/modules/AbstractModule.d.ts +1 -1
- package/dist/replication/AbstractReplicator.js +2 -65
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/routes/endpoints/checkpointing.js +3 -2
- package/dist/routes/endpoints/checkpointing.js.map +1 -1
- package/dist/routes/endpoints/socket-route.js +5 -5
- package/dist/routes/endpoints/socket-route.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.js +5 -5
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/runner/teardown.js +3 -65
- package/dist/runner/teardown.js.map +1 -1
- package/dist/storage/BucketStorage.d.ts +1 -442
- package/dist/storage/BucketStorage.js +0 -9
- package/dist/storage/BucketStorage.js.map +1 -1
- package/dist/storage/BucketStorageBatch.d.ts +130 -0
- package/dist/storage/BucketStorageBatch.js +10 -0
- package/dist/storage/BucketStorageBatch.js.map +1 -0
- package/dist/storage/BucketStorageFactory.d.ts +136 -0
- package/dist/storage/BucketStorageFactory.js +2 -0
- package/dist/storage/BucketStorageFactory.js.map +1 -0
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/PersistedSyncRulesContent.d.ts +20 -0
- package/dist/storage/PersistedSyncRulesContent.js +2 -0
- package/dist/storage/PersistedSyncRulesContent.js.map +1 -0
- package/dist/storage/ReplicationEventPayload.d.ts +1 -1
- package/dist/storage/ReplicationLock.d.ts +4 -0
- package/dist/storage/ReplicationLock.js +2 -0
- package/dist/storage/ReplicationLock.js.map +1 -0
- package/dist/storage/StorageEngine.d.ts +4 -4
- package/dist/storage/StorageEngine.js +2 -2
- package/dist/storage/StorageEngine.js.map +1 -1
- package/dist/storage/StorageProvider.d.ts +4 -1
- package/dist/storage/SyncRulesBucketStorage.d.ts +201 -0
- package/dist/storage/SyncRulesBucketStorage.js +7 -0
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -0
- package/dist/storage/bson.d.ts +11 -3
- package/dist/storage/bson.js +24 -2
- package/dist/storage/bson.js.map +1 -1
- package/dist/storage/storage-index.d.ts +5 -0
- package/dist/storage/storage-index.js +5 -0
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/sync/BucketChecksumState.d.ts +91 -0
- package/dist/sync/BucketChecksumState.js +313 -0
- package/dist/sync/BucketChecksumState.js.map +1 -0
- package/dist/sync/sync-index.d.ts +1 -0
- package/dist/sync/sync-index.js +1 -0
- package/dist/sync/sync-index.js.map +1 -1
- package/dist/sync/sync.d.ts +7 -3
- package/dist/sync/sync.js +131 -135
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.d.ts +9 -0
- package/dist/sync/util.js +44 -0
- package/dist/sync/util.js.map +1 -1
- package/dist/util/checkpointing.d.ts +1 -1
- package/dist/util/checkpointing.js +15 -78
- package/dist/util/checkpointing.js.map +1 -1
- package/dist/util/protocol-types.d.ts +13 -4
- package/package.json +4 -4
- package/src/api/RouteAPI.ts +1 -1
- package/src/api/diagnostics.ts +1 -1
- package/src/entry/commands/compact-action.ts +2 -3
- package/src/modules/AbstractModule.ts +1 -1
- package/src/replication/AbstractReplicator.ts +1 -2
- package/src/routes/endpoints/checkpointing.ts +3 -3
- package/src/routes/endpoints/socket-route.ts +7 -5
- package/src/routes/endpoints/sync-stream.ts +8 -5
- package/src/runner/teardown.ts +1 -1
- package/src/storage/BucketStorage.ts +1 -552
- package/src/storage/BucketStorageBatch.ts +158 -0
- package/src/storage/BucketStorageFactory.ts +156 -0
- package/src/storage/ChecksumCache.ts +1 -0
- package/src/storage/PersistedSyncRulesContent.ts +26 -0
- package/src/storage/ReplicationEventPayload.ts +1 -1
- package/src/storage/ReplicationLock.ts +5 -0
- package/src/storage/StorageEngine.ts +4 -4
- package/src/storage/StorageProvider.ts +4 -1
- package/src/storage/SyncRulesBucketStorage.ts +256 -0
- package/src/storage/bson.ts +28 -4
- package/src/storage/storage-index.ts +5 -0
- package/src/sync/BucketChecksumState.ts +392 -0
- package/src/sync/sync-index.ts +1 -0
- package/src/sync/sync.ts +173 -157
- package/src/sync/util.ts +54 -0
- package/src/util/checkpointing.ts +4 -6
- package/src/util/protocol-types.ts +16 -4
- package/test/src/auth.test.ts +5 -5
- package/test/src/sync/BucketChecksumState.test.ts +565 -0
- package/test/src/sync/util.test.ts +34 -0
- package/tsconfig.tsbuildinfo +1 -1
package/dist/sync/sync.js
CHANGED
|
@@ -3,8 +3,9 @@ import { Semaphore, withTimeout } from 'async-mutex';
|
|
|
3
3
|
import { AbortError } from 'ix/aborterror.js';
|
|
4
4
|
import * as util from '../util/util-index.js';
|
|
5
5
|
import { logger } from '@powersync/lib-services-framework';
|
|
6
|
+
import { BucketChecksumState } from './BucketChecksumState.js';
|
|
6
7
|
import { mergeAsyncIterables } from './merge.js';
|
|
7
|
-
import { tokenStream } from './util.js';
|
|
8
|
+
import { acquireSemaphoreAbortable, settledPromise, tokenStream } from './util.js';
|
|
8
9
|
/**
|
|
9
10
|
* Maximum number of connections actively fetching data.
|
|
10
11
|
*/
|
|
@@ -17,7 +18,7 @@ const MAX_ACTIVE_CONNECTIONS = 10;
|
|
|
17
18
|
const MUTEX_ACQUIRE_TIMEOUT = 30_000;
|
|
18
19
|
const syncSemaphore = withTimeout(new Semaphore(MAX_ACTIVE_CONNECTIONS), MUTEX_ACQUIRE_TIMEOUT, new Error(`Timeout while waiting for data`));
|
|
19
20
|
export async function* streamResponse(options) {
|
|
20
|
-
const {
|
|
21
|
+
const { bucketStorage, syncRules, params, syncParams, token, tokenStreamOptions, tracker, signal } = options;
|
|
21
22
|
// We also need to be able to abort, so we create our own controller.
|
|
22
23
|
const controller = new AbortController();
|
|
23
24
|
if (signal) {
|
|
@@ -29,7 +30,7 @@ export async function* streamResponse(options) {
|
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
const ki = tokenStream(token, controller.signal, tokenStreamOptions);
|
|
32
|
-
const stream = streamResponseInner(
|
|
33
|
+
const stream = streamResponseInner(bucketStorage, syncRules, params, syncParams, tracker, controller.signal);
|
|
33
34
|
// Merge the two streams, and abort as soon as one of the streams end.
|
|
34
35
|
const merged = mergeAsyncIterables([stream, ki], controller.signal);
|
|
35
36
|
try {
|
|
@@ -49,119 +50,108 @@ export async function* streamResponse(options) {
|
|
|
49
50
|
controller.abort();
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
|
-
async function* streamResponseInner(
|
|
53
|
-
// Bucket state of bucket id -> op_id.
|
|
54
|
-
// This starts with the state from the client. May contain buckets that the user do not have access to (anymore).
|
|
55
|
-
let dataBuckets = new Map();
|
|
56
|
-
let lastChecksums = null;
|
|
57
|
-
let lastWriteCheckpoint = null;
|
|
53
|
+
async function* streamResponseInner(bucketStorage, syncRules, params, syncParams, tracker, signal) {
|
|
58
54
|
const { raw_data, binary_data } = params;
|
|
59
|
-
if (params.buckets) {
|
|
60
|
-
for (let { name, after: start } of params.buckets) {
|
|
61
|
-
dataBuckets.set(name, start);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
55
|
const checkpointUserId = util.checkpointUserId(syncParams.token_parameters.user_id, params.client_id);
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const bucketList = [...dataBuckets.keys()];
|
|
96
|
-
const checksumMap = await storage.getChecksums(checkpoint, bucketList);
|
|
97
|
-
// Subset of buckets for which there may be new data in this batch.
|
|
98
|
-
let bucketsToFetch;
|
|
99
|
-
if (lastChecksums) {
|
|
100
|
-
const diff = util.checksumsDiff(lastChecksums, checksumMap);
|
|
101
|
-
if (lastWriteCheckpoint == writeCheckpoint &&
|
|
102
|
-
diff.removedBuckets.length == 0 &&
|
|
103
|
-
diff.updatedBuckets.length == 0) {
|
|
104
|
-
// No changes - don't send anything to the client
|
|
56
|
+
const checksumState = new BucketChecksumState({
|
|
57
|
+
bucketStorage,
|
|
58
|
+
syncRules,
|
|
59
|
+
syncParams,
|
|
60
|
+
initialBucketPositions: params.buckets
|
|
61
|
+
});
|
|
62
|
+
const stream = bucketStorage.watchWriteCheckpoint({
|
|
63
|
+
user_id: checkpointUserId,
|
|
64
|
+
signal
|
|
65
|
+
});
|
|
66
|
+
const newCheckpoints = stream[Symbol.asyncIterator]();
|
|
67
|
+
try {
|
|
68
|
+
let nextCheckpointPromise;
|
|
69
|
+
do {
|
|
70
|
+
if (!nextCheckpointPromise) {
|
|
71
|
+
// Wrap in a settledPromise, so that abort errors after the parent stopped iterating
|
|
72
|
+
// does not result in uncaught errors.
|
|
73
|
+
nextCheckpointPromise = settledPromise(newCheckpoints.next());
|
|
74
|
+
}
|
|
75
|
+
const next = await nextCheckpointPromise;
|
|
76
|
+
nextCheckpointPromise = undefined;
|
|
77
|
+
if (next.status == 'rejected') {
|
|
78
|
+
throw next.reason;
|
|
79
|
+
}
|
|
80
|
+
if (next.value.done) {
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
const line = await checksumState.buildNextCheckpointLine(next.value.value);
|
|
84
|
+
if (line == null) {
|
|
85
|
+
// No update to sync
|
|
105
86
|
continue;
|
|
106
87
|
}
|
|
107
|
-
bucketsToFetch =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
88
|
+
const { checkpointLine, bucketsToFetch } = line;
|
|
89
|
+
yield checkpointLine;
|
|
90
|
+
// Start syncing data for buckets up to the checkpoint. As soon as we have completed at least one priority and
|
|
91
|
+
// at least 1000 operations, we also start listening for new checkpoints concurrently. When a new checkpoint comes
|
|
92
|
+
// in while we're still busy syncing data for lower priorities, interrupt the current operation and start syncing
|
|
93
|
+
// the new checkpoint.
|
|
94
|
+
const abortCheckpointController = new AbortController();
|
|
95
|
+
let syncedOperations = 0;
|
|
96
|
+
const abortCheckpointSignal = AbortSignal.any([abortCheckpointController.signal, signal]);
|
|
97
|
+
const bucketsByPriority = [...Map.groupBy(bucketsToFetch, (bucket) => bucket.priority).entries()];
|
|
98
|
+
bucketsByPriority.sort((a, b) => a[0] - b[0]); // Sort from high to lower priorities
|
|
99
|
+
const lowestPriority = bucketsByPriority.at(-1)?.[0];
|
|
100
|
+
function maybeRaceForNewCheckpoint() {
|
|
101
|
+
if (syncedOperations >= 1000 && nextCheckpointPromise === undefined) {
|
|
102
|
+
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();
|
|
110
|
+
}
|
|
111
|
+
return next;
|
|
112
|
+
})();
|
|
126
113
|
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
buckets: [...checksumMap.values()]
|
|
114
|
+
}
|
|
115
|
+
function markOperationsSent(operations) {
|
|
116
|
+
syncedOperations += operations;
|
|
117
|
+
tracker.addOperationsSynced(operations);
|
|
118
|
+
maybeRaceForNewCheckpoint();
|
|
119
|
+
}
|
|
120
|
+
// This incrementally updates dataBuckets with each individual bucket position.
|
|
121
|
+
// At the end of this, we can be sure that all buckets have data up to the checkpoint.
|
|
122
|
+
for (const [priority, buckets] of bucketsByPriority) {
|
|
123
|
+
const isLast = priority === lowestPriority;
|
|
124
|
+
if (abortCheckpointSignal.aborted) {
|
|
125
|
+
break;
|
|
140
126
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
127
|
+
yield* bucketDataInBatches({
|
|
128
|
+
bucketStorage: bucketStorage,
|
|
129
|
+
checkpoint: next.value.value.base.checkpoint,
|
|
130
|
+
bucketsToFetch: buckets,
|
|
131
|
+
checksumState,
|
|
132
|
+
raw_data,
|
|
133
|
+
binary_data,
|
|
134
|
+
onRowsSent: markOperationsSent,
|
|
135
|
+
abort_connection: signal,
|
|
136
|
+
abort_batch: abortCheckpointSignal,
|
|
137
|
+
user_id: syncParams.user_id,
|
|
138
|
+
// Passing undefined will emit a full sync complete message at the end. If we pass a priority, we'll emit a partial
|
|
139
|
+
// sync complete message.
|
|
140
|
+
forPriority: !isLast ? priority : undefined
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (!abortCheckpointSignal.aborted) {
|
|
144
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
145
|
+
}
|
|
146
|
+
} while (!signal.aborted);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
await newCheckpoints.return?.();
|
|
160
150
|
}
|
|
161
151
|
}
|
|
162
152
|
async function* bucketDataInBatches(request) {
|
|
163
153
|
let isDone = false;
|
|
164
|
-
while (!request.
|
|
154
|
+
while (!request.abort_batch.aborted && !isDone) {
|
|
165
155
|
// The code below is functionally the same as this for-await loop below.
|
|
166
156
|
// However, the for-await loop appears to have a memory leak, so we avoid it.
|
|
167
157
|
// for await (const { done, data } of bucketDataBatch(storage, checkpoint, dataBuckets, raw_data, signal)) {
|
|
@@ -196,13 +186,17 @@ async function* bucketDataInBatches(request) {
|
|
|
196
186
|
* Extracted as a separate internal function just to avoid memory leaks.
|
|
197
187
|
*/
|
|
198
188
|
async function* bucketDataBatch(request) {
|
|
199
|
-
const { storage, checkpoint, bucketsToFetch,
|
|
189
|
+
const { bucketStorage: storage, checkpoint, bucketsToFetch, checksumState, raw_data, binary_data, abort_connection, abort_batch, onRowsSent } = request;
|
|
200
190
|
const checkpointOp = BigInt(checkpoint);
|
|
201
191
|
let checkpointInvalidated = false;
|
|
202
192
|
if (syncSemaphore.isLocked()) {
|
|
203
193
|
logger.info('Sync concurrency limit reached, waiting for lock', { user_id: request.user_id });
|
|
204
194
|
}
|
|
205
|
-
const
|
|
195
|
+
const acquired = await acquireSemaphoreAbortable(syncSemaphore, AbortSignal.any([abort_batch]));
|
|
196
|
+
if (acquired === 'aborted') {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const [value, release] = acquired;
|
|
206
200
|
try {
|
|
207
201
|
if (value <= 3) {
|
|
208
202
|
// This can be noisy, so we only log when we get close to the
|
|
@@ -214,11 +208,12 @@ async function* bucketDataBatch(request) {
|
|
|
214
208
|
}
|
|
215
209
|
// Optimization: Only fetch buckets for which the checksums have changed since the last checkpoint
|
|
216
210
|
// For the first batch, this will be all buckets.
|
|
217
|
-
const filteredBuckets =
|
|
218
|
-
const
|
|
211
|
+
const filteredBuckets = checksumState.getFilteredBucketPositions(bucketsToFetch);
|
|
212
|
+
const dataBatches = storage.getBucketDataBatch(checkpoint, filteredBuckets);
|
|
219
213
|
let has_more = false;
|
|
220
|
-
for await (let { batch: r, targetOp } of
|
|
221
|
-
if
|
|
214
|
+
for await (let { batch: r, targetOp } of dataBatches) {
|
|
215
|
+
// Abort in current batch if the connection is closed
|
|
216
|
+
if (abort_connection.aborted) {
|
|
222
217
|
return;
|
|
223
218
|
}
|
|
224
219
|
if (r.has_more) {
|
|
@@ -259,8 +254,13 @@ async function* bucketDataBatch(request) {
|
|
|
259
254
|
// iterator memory in case if large data sent.
|
|
260
255
|
yield { data: null, done: false };
|
|
261
256
|
}
|
|
262
|
-
|
|
263
|
-
|
|
257
|
+
onRowsSent(r.data.length);
|
|
258
|
+
checksumState.updateBucketPosition({ bucket: r.bucket, nextAfter: r.next_after, hasMore: r.has_more });
|
|
259
|
+
// Check if syncing bucket data is supposed to stop before fetching more data
|
|
260
|
+
// from storage.
|
|
261
|
+
if (abort_batch.aborted) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
264
|
}
|
|
265
265
|
if (!has_more) {
|
|
266
266
|
if (checkpointInvalidated) {
|
|
@@ -270,12 +270,23 @@ async function* bucketDataBatch(request) {
|
|
|
270
270
|
yield { data: null, done: true };
|
|
271
271
|
}
|
|
272
272
|
else {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
273
|
+
if (request.forPriority !== undefined) {
|
|
274
|
+
const line = {
|
|
275
|
+
partial_checkpoint_complete: {
|
|
276
|
+
last_op_id: checkpoint,
|
|
277
|
+
priority: request.forPriority
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
yield { data: line, done: true };
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
const line = {
|
|
284
|
+
checkpoint_complete: {
|
|
285
|
+
last_op_id: checkpoint
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
yield { data: line, done: true };
|
|
289
|
+
}
|
|
279
290
|
}
|
|
280
291
|
}
|
|
281
292
|
}
|
|
@@ -302,19 +313,4 @@ function transformLegacyResponse(bucketData) {
|
|
|
302
313
|
})
|
|
303
314
|
};
|
|
304
315
|
}
|
|
305
|
-
function limitedBuckets(buckets, limit) {
|
|
306
|
-
buckets = buckets.map((b) => {
|
|
307
|
-
if (typeof b != 'string') {
|
|
308
|
-
return b.bucket;
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
return b;
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
if (buckets.length <= limit) {
|
|
315
|
-
return JSON.stringify(buckets);
|
|
316
|
-
}
|
|
317
|
-
const limited = buckets.slice(0, limit);
|
|
318
|
-
return `${JSON.stringify(limited)}...`;
|
|
319
|
-
}
|
|
320
316
|
//# sourceMappingURL=sync.js.map
|
package/dist/sync/sync.js.map
CHANGED
|
@@ -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;AAEpE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErD,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,YAAY,CAAC;AAEjD,OAAO,
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/util.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as util from '../util/util-index.js';
|
|
2
2
|
import { RequestTracker } from './RequestTracker.js';
|
|
3
|
+
import { SemaphoreInterface } from 'async-mutex';
|
|
3
4
|
export type TokenStreamOptions = {
|
|
4
5
|
/**
|
|
5
6
|
* Adds periodic keepalive events
|
|
@@ -23,3 +24,11 @@ export declare function tokenStream(token: {
|
|
|
23
24
|
}, signal: AbortSignal, options?: Partial<TokenStreamOptions>): AsyncGenerator<util.StreamingSyncKeepalive>;
|
|
24
25
|
export declare function ndjson(iterator: AsyncIterable<string | null | Record<string, any>>): AsyncGenerator<string>;
|
|
25
26
|
export declare function transformToBytesTracked(iterator: AsyncIterable<string>, tracker: RequestTracker): AsyncGenerator<Buffer>;
|
|
27
|
+
export declare function acquireSemaphoreAbortable(semaphone: SemaphoreInterface, abort: AbortSignal): Promise<[number, SemaphoreInterface.Releaser] | 'aborted'>;
|
|
28
|
+
/**
|
|
29
|
+
* Wrap a promise in the style of Promise.allSettled.
|
|
30
|
+
*
|
|
31
|
+
* This is specifically useful if rejections should not be treated as uncaught rejections
|
|
32
|
+
* if it is not specifically handled.
|
|
33
|
+
*/
|
|
34
|
+
export declare function settledPromise<T>(promise: Promise<T>): Promise<PromiseSettledResult<T>>;
|
package/dist/sync/util.js
CHANGED
|
@@ -69,4 +69,48 @@ export async function* transformToBytesTracked(iterator, tracker) {
|
|
|
69
69
|
yield encoded;
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
|
+
export function acquireSemaphoreAbortable(semaphone, abort) {
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
let aborted = false;
|
|
75
|
+
let hasSemaphore = false;
|
|
76
|
+
const listener = () => {
|
|
77
|
+
if (!hasSemaphore) {
|
|
78
|
+
aborted = true;
|
|
79
|
+
abort.removeEventListener('abort', listener);
|
|
80
|
+
resolve('aborted');
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
abort.addEventListener('abort', listener);
|
|
84
|
+
semaphone.acquire().then((acquired) => {
|
|
85
|
+
hasSemaphore = true;
|
|
86
|
+
if (aborted) {
|
|
87
|
+
// Release semaphore, already aborted
|
|
88
|
+
acquired[1]();
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
abort.removeEventListener('abort', listener);
|
|
92
|
+
resolve(acquired);
|
|
93
|
+
}
|
|
94
|
+
}, reject);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Wrap a promise in the style of Promise.allSettled.
|
|
99
|
+
*
|
|
100
|
+
* This is specifically useful if rejections should not be treated as uncaught rejections
|
|
101
|
+
* if it is not specifically handled.
|
|
102
|
+
*/
|
|
103
|
+
export function settledPromise(promise) {
|
|
104
|
+
return promise.then((result) => {
|
|
105
|
+
return {
|
|
106
|
+
status: 'fulfilled',
|
|
107
|
+
value: result
|
|
108
|
+
};
|
|
109
|
+
}, (error) => {
|
|
110
|
+
return {
|
|
111
|
+
status: 'rejected',
|
|
112
|
+
reason: error
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
}
|
|
72
116
|
//# sourceMappingURL=util.js.map
|
package/dist/sync/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/sync/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/sync/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RouteAPI } from '../api/RouteAPI.js';
|
|
2
|
-
import { BucketStorageFactory } from '../storage/
|
|
2
|
+
import { BucketStorageFactory } from '../storage/storage-index.js';
|
|
3
3
|
export interface CreateWriteCheckpointOptions {
|
|
4
4
|
userId: string | undefined;
|
|
5
5
|
clientId: string | undefined;
|
|
@@ -1,84 +1,21 @@
|
|
|
1
|
-
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
-
if (value !== null && value !== void 0) {
|
|
3
|
-
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
-
var dispose, inner;
|
|
5
|
-
if (async) {
|
|
6
|
-
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
-
dispose = value[Symbol.asyncDispose];
|
|
8
|
-
}
|
|
9
|
-
if (dispose === void 0) {
|
|
10
|
-
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
-
dispose = value[Symbol.dispose];
|
|
12
|
-
if (async) inner = dispose;
|
|
13
|
-
}
|
|
14
|
-
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
-
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
-
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
-
}
|
|
18
|
-
else if (async) {
|
|
19
|
-
env.stack.push({ async: true });
|
|
20
|
-
}
|
|
21
|
-
return value;
|
|
22
|
-
};
|
|
23
|
-
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
-
return function (env) {
|
|
25
|
-
function fail(e) {
|
|
26
|
-
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
-
env.hasError = true;
|
|
28
|
-
}
|
|
29
|
-
var r, s = 0;
|
|
30
|
-
function next() {
|
|
31
|
-
while (r = env.stack.pop()) {
|
|
32
|
-
try {
|
|
33
|
-
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
-
if (r.dispose) {
|
|
35
|
-
var result = r.dispose.call(r.value);
|
|
36
|
-
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
-
}
|
|
38
|
-
else s |= 1;
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
fail(e);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
-
if (env.hasError) throw env.error;
|
|
46
|
-
}
|
|
47
|
-
return next();
|
|
48
|
-
};
|
|
49
|
-
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
-
var e = new Error(message);
|
|
51
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
-
});
|
|
53
1
|
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
54
2
|
export async function createWriteCheckpoint(options) {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (!activeSyncRules) {
|
|
60
|
-
throw new ServiceError(ErrorCode.PSYNC_S2302, `Cannot create Write Checkpoint since no sync rules are active.`);
|
|
61
|
-
}
|
|
62
|
-
const syncBucketStorage = __addDisposableResource(env_1, options.storage.getInstance(activeSyncRules), false);
|
|
63
|
-
const { writeCheckpoint, currentCheckpoint } = await options.api.createReplicationHead(async (currentCheckpoint) => {
|
|
64
|
-
const writeCheckpoint = await syncBucketStorage.createManagedWriteCheckpoint({
|
|
65
|
-
user_id: full_user_id,
|
|
66
|
-
heads: { '1': currentCheckpoint }
|
|
67
|
-
});
|
|
68
|
-
return { writeCheckpoint, currentCheckpoint };
|
|
69
|
-
});
|
|
70
|
-
return {
|
|
71
|
-
writeCheckpoint: String(writeCheckpoint),
|
|
72
|
-
replicationHead: currentCheckpoint
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
catch (e_1) {
|
|
76
|
-
env_1.error = e_1;
|
|
77
|
-
env_1.hasError = true;
|
|
78
|
-
}
|
|
79
|
-
finally {
|
|
80
|
-
__disposeResources(env_1);
|
|
3
|
+
const full_user_id = checkpointUserId(options.userId, options.clientId);
|
|
4
|
+
const syncBucketStorage = await options.storage.getActiveStorage();
|
|
5
|
+
if (!syncBucketStorage) {
|
|
6
|
+
throw new ServiceError(ErrorCode.PSYNC_S2302, `Cannot create Write Checkpoint since no sync rules are active.`);
|
|
81
7
|
}
|
|
8
|
+
const { writeCheckpoint, currentCheckpoint } = await options.api.createReplicationHead(async (currentCheckpoint) => {
|
|
9
|
+
const writeCheckpoint = await syncBucketStorage.createManagedWriteCheckpoint({
|
|
10
|
+
user_id: full_user_id,
|
|
11
|
+
heads: { '1': currentCheckpoint }
|
|
12
|
+
});
|
|
13
|
+
return { writeCheckpoint, currentCheckpoint };
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
writeCheckpoint: String(writeCheckpoint),
|
|
17
|
+
replicationHead: currentCheckpoint
|
|
18
|
+
};
|
|
82
19
|
}
|
|
83
20
|
export function checkpointUserId(user_id, client_id) {
|
|
84
21
|
if (user_id == null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpointing.js","sourceRoot":"","sources":["../../src/util/checkpointing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checkpointing.js","sourceRoot":"","sources":["../../src/util/checkpointing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAU5E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAqC;IAC/E,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExE,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IACnE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,gEAAgE,CAAC,CAAC;IAClH,CAAC;IAED,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE;QACjH,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,4BAA4B,CAAC;YAC3E,OAAO,EAAE,YAAY;YACrB,KAAK,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE;SAClC,CAAC,CAAC;QACH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC;QACxC,eAAe,EAAE,iBAAiB;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA2B,EAAE,SAA6B;IACzF,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;AACnC,CAAC"}
|