@powersync/common 1.50.0 → 1.52.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/dist/bundle.cjs +558 -481
- package/dist/bundle.cjs.map +1 -1
- package/dist/bundle.mjs +558 -480
- package/dist/bundle.mjs.map +1 -1
- package/dist/bundle.node.cjs +556 -481
- package/dist/bundle.node.cjs.map +1 -1
- package/dist/bundle.node.mjs +556 -480
- package/dist/bundle.node.mjs.map +1 -1
- package/dist/index.d.cts +73 -73
- package/lib/client/AbstractPowerSyncDatabase.js +3 -3
- package/lib/client/AbstractPowerSyncDatabase.js.map +1 -1
- package/lib/client/sync/stream/AbstractRemote.d.ts +29 -8
- package/lib/client/sync/stream/AbstractRemote.js +154 -177
- package/lib/client/sync/stream/AbstractRemote.js.map +1 -1
- package/lib/client/sync/stream/AbstractStreamingSyncImplementation.d.ts +1 -0
- package/lib/client/sync/stream/AbstractStreamingSyncImplementation.js +69 -88
- package/lib/client/sync/stream/AbstractStreamingSyncImplementation.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/async.d.ts +0 -9
- package/lib/utils/async.js +0 -9
- package/lib/utils/async.js.map +1 -1
- package/lib/utils/mutex.d.ts +32 -3
- package/lib/utils/mutex.js +85 -36
- package/lib/utils/mutex.js.map +1 -1
- package/lib/utils/queue.d.ts +16 -0
- package/lib/utils/queue.js +42 -0
- package/lib/utils/queue.js.map +1 -0
- package/lib/utils/stream_transform.d.ts +39 -0
- package/lib/utils/stream_transform.js +206 -0
- package/lib/utils/stream_transform.js.map +1 -0
- package/package.json +9 -7
- package/src/client/AbstractPowerSyncDatabase.ts +3 -3
- package/src/client/sync/stream/AbstractRemote.ts +182 -206
- package/src/client/sync/stream/AbstractStreamingSyncImplementation.ts +82 -83
- package/src/index.ts +1 -1
- package/src/utils/async.ts +0 -11
- package/src/utils/mutex.ts +111 -48
- package/src/utils/queue.ts +48 -0
- package/src/utils/stream_transform.ts +252 -0
- package/lib/utils/DataStream.d.ts +0 -62
- package/lib/utils/DataStream.js +0 -169
- package/lib/utils/DataStream.js.map +0 -1
- package/src/utils/DataStream.ts +0 -222
package/lib/utils/mutex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/utils/mutex.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/utils/mutex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAInC;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACpB,+DAA+D;IAC9C,SAAS,CAAW;IAE5B,IAAI,CAAS;IACtB,+GAA+G;IAC/G,2DAA2D;IACnD,WAAW,CAAwB;IACnC,UAAU,CAAwB;IAE1C,YAAY,QAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IACpC,CAAC;IAEO,SAAS,CAAC,cAAsB,EAAE,SAAqB;QAC7D,MAAM,IAAI,GAAyB;YACjC,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,EAAE;YACjB,cAAc,EAAE,cAAc;YAC9B,SAAS;YACT,IAAI,EAAE,IAAI,CAAC,UAAU;SACtB,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,eAAe;YACf,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,gBAAgB,CAAC,MAA4B;QACnD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAC9B,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;QAExB,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC3B,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC3B,IAAI,MAAM,IAAI,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxD,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACxD,CAAC;IAEO,cAAc,CAAC,MAAc,EAAE,KAAmB;QACxD,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvG,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,SAAS,aAAa;gBACpB,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;gBACnB,OAAO,aAAa,EAAE,CAAC;YACzB,CAAC;YAED,IAAI,MAA4B,CAAC;YAEjC,MAAM,aAAa,GAAG,GAAG,EAAE;gBACzB,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;gBACnC,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,+BAA+B;gBAE1D,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;oBAC5B,oCAAoC;oBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;oBACpC,IAAI,UAAU,EAAE,CAAC;wBACf,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACvC,UAAU,CAAC,cAAc,EAAE,CAAC;wBAC5B,IAAI,UAAU,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;4BACnC,UAAU,CAAC,SAAS,EAAE,CAAC;wBACzB,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,6CAA6C;wBAC7C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,KAAK,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAE7C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACpB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;oBAC9B,aAAa,EAAE,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,cAAc,GAAG,GAAG,EAAE;gBAC1B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9B,KAAK,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAE7C,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;gBACnC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAC;YAEF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAEhD,kHAAkH;YAClH,4GAA4G;YAC5G,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;gBACxD,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,CAAC;YAED,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO,cAAc,EAAE,CAAC;YAC1B,CAAC;YAED,KAAK,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,KAAmB;QAClC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,KAAmB;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;CACF;AAcD;;;;GAIG;AACH,MAAM,OAAO,KAAK;IACR,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtC,KAAK,CAAC,OAAO,CAAC,KAAmB;QAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,YAAY,CAAI,EAA4B,EAAE,KAAmB;QACrE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;CACF;AAQD,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO;IAC5B,IAAI,SAAS,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAElE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnF,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple fixed-capacity queue implementation.
|
|
3
|
+
*
|
|
4
|
+
* Unlike a naive queue implemented by `array.push()` and `array.shift()`, this avoids moving array elements around
|
|
5
|
+
* and is `O(1)` for {@link addLast} and {@link removeFirst}.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Queue<T> {
|
|
8
|
+
private table;
|
|
9
|
+
private head;
|
|
10
|
+
private _length;
|
|
11
|
+
constructor(initialItems: Iterable<T>);
|
|
12
|
+
get isEmpty(): boolean;
|
|
13
|
+
get length(): number;
|
|
14
|
+
removeFirst(): T;
|
|
15
|
+
addLast(element: T): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple fixed-capacity queue implementation.
|
|
3
|
+
*
|
|
4
|
+
* Unlike a naive queue implemented by `array.push()` and `array.shift()`, this avoids moving array elements around
|
|
5
|
+
* and is `O(1)` for {@link addLast} and {@link removeFirst}.
|
|
6
|
+
*/
|
|
7
|
+
export class Queue {
|
|
8
|
+
table;
|
|
9
|
+
// Index of the first element in the table.
|
|
10
|
+
head;
|
|
11
|
+
// Amount of items currently in the queue.
|
|
12
|
+
_length;
|
|
13
|
+
constructor(initialItems) {
|
|
14
|
+
this.table = [...initialItems];
|
|
15
|
+
this.head = 0;
|
|
16
|
+
this._length = this.table.length;
|
|
17
|
+
}
|
|
18
|
+
get isEmpty() {
|
|
19
|
+
return this.length == 0;
|
|
20
|
+
}
|
|
21
|
+
get length() {
|
|
22
|
+
return this._length;
|
|
23
|
+
}
|
|
24
|
+
removeFirst() {
|
|
25
|
+
if (this.isEmpty) {
|
|
26
|
+
throw new Error('Queue is empty');
|
|
27
|
+
}
|
|
28
|
+
const result = this.table[this.head];
|
|
29
|
+
this._length--;
|
|
30
|
+
this.table[this.head] = undefined;
|
|
31
|
+
this.head = (this.head + 1) % this.table.length;
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
addLast(element) {
|
|
35
|
+
if (this.length == this.table.length) {
|
|
36
|
+
throw new Error('Queue is full');
|
|
37
|
+
}
|
|
38
|
+
this.table[(this.head + this._length) % this.table.length] = element;
|
|
39
|
+
this._length++;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/utils/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,KAAK;IACR,KAAK,CAAoB;IACjC,2CAA2C;IACnC,IAAI,CAAS;IACrB,0CAA0C;IAClC,OAAO,CAAS;IAExB,YAAY,YAAyB;QACnC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACnC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAM,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,OAAU;QAChB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;QACrE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An async iterator that can't be cancelled.
|
|
3
|
+
*
|
|
4
|
+
* To keep data flow simple, we always pass an explicit cancellation token when subscribing to async streams. Once the
|
|
5
|
+
* {@link AbortSignal} aborts, iterators are supposed to clean up and then emit a final `{done: true}` event. This means
|
|
6
|
+
* that there's no way to distinguish between streams that have completed normally and streams that have been cancelled,
|
|
7
|
+
* but that is acceptable for our uses of this.
|
|
8
|
+
*/
|
|
9
|
+
export type SimpleAsyncIterator<T> = Pick<AsyncIterator<T>, 'next'>;
|
|
10
|
+
export declare const doneResult: IteratorReturnResult<any>;
|
|
11
|
+
export declare function valueResult<T>(value: T): {
|
|
12
|
+
done: boolean;
|
|
13
|
+
value: T;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* A variant of {@link Array.map} for async iterators.
|
|
17
|
+
*/
|
|
18
|
+
export declare function map<T1, T2>(source: SimpleAsyncIterator<T1>, map: (source: T1) => T2): SimpleAsyncIterator<T2>;
|
|
19
|
+
export interface InjectableIterator<T> extends SimpleAsyncIterator<T> {
|
|
20
|
+
inject(event: T): void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Expands a source async iterator by allowing to inject events asynchronously.
|
|
24
|
+
*
|
|
25
|
+
* The resulting iterator will emit all events from its source. Additionally though, events can be injected. These
|
|
26
|
+
* events are dropped once the main iterator completes, but are otherwise forwarded.
|
|
27
|
+
*
|
|
28
|
+
* The iterator completes when its source completes, and it supports backpressure by only calling `next()` on the source
|
|
29
|
+
* in response to a `next()` call from downstream if no pending injected events can be dispatched.
|
|
30
|
+
*/
|
|
31
|
+
export declare function injectable<T>(source: SimpleAsyncIterator<T>): InjectableIterator<T>;
|
|
32
|
+
/**
|
|
33
|
+
* Splits a byte stream at line endings, emitting each line as a string.
|
|
34
|
+
*/
|
|
35
|
+
export declare function extractJsonLines(source: SimpleAsyncIterator<Uint8Array>, decoder: TextDecoder): SimpleAsyncIterator<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Splits a concatenated stream of BSON objects by emitting individual objects.
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractBsonObjects(source: SimpleAsyncIterator<Uint8Array>): SimpleAsyncIterator<Uint8Array>;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
export const doneResult = { done: true, value: undefined };
|
|
2
|
+
export function valueResult(value) {
|
|
3
|
+
return { done: false, value };
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* A variant of {@link Array.map} for async iterators.
|
|
7
|
+
*/
|
|
8
|
+
export function map(source, map) {
|
|
9
|
+
return {
|
|
10
|
+
next: async () => {
|
|
11
|
+
const value = await source.next();
|
|
12
|
+
if (value.done) {
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
return { value: map(value.value) };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Expands a source async iterator by allowing to inject events asynchronously.
|
|
23
|
+
*
|
|
24
|
+
* The resulting iterator will emit all events from its source. Additionally though, events can be injected. These
|
|
25
|
+
* events are dropped once the main iterator completes, but are otherwise forwarded.
|
|
26
|
+
*
|
|
27
|
+
* The iterator completes when its source completes, and it supports backpressure by only calling `next()` on the source
|
|
28
|
+
* in response to a `next()` call from downstream if no pending injected events can be dispatched.
|
|
29
|
+
*/
|
|
30
|
+
export function injectable(source) {
|
|
31
|
+
let sourceIsDone = false;
|
|
32
|
+
let waiter = undefined; // An active, waiting next() call.
|
|
33
|
+
// A pending upstream event that couldn't be dispatched because inject() has been called before it was resolved.
|
|
34
|
+
let pendingSourceEvent = null;
|
|
35
|
+
let pendingInjectedEvents = [];
|
|
36
|
+
const consumeWaiter = () => {
|
|
37
|
+
const pending = waiter;
|
|
38
|
+
waiter = undefined;
|
|
39
|
+
return pending;
|
|
40
|
+
};
|
|
41
|
+
const fetchFromSource = () => {
|
|
42
|
+
const resolveWaiter = (propagate) => {
|
|
43
|
+
const active = consumeWaiter();
|
|
44
|
+
if (active) {
|
|
45
|
+
propagate(active);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
pendingSourceEvent = propagate;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const nextFromSource = source.next();
|
|
52
|
+
nextFromSource.then((value) => {
|
|
53
|
+
sourceIsDone = value.done == true;
|
|
54
|
+
resolveWaiter((w) => w.resolve(value));
|
|
55
|
+
}, (error) => {
|
|
56
|
+
resolveWaiter((w) => w.reject(error));
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
next: () => {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
// First priority: Dispatch ready upstream events.
|
|
63
|
+
if (sourceIsDone) {
|
|
64
|
+
return resolve(doneResult);
|
|
65
|
+
}
|
|
66
|
+
if (pendingSourceEvent) {
|
|
67
|
+
pendingSourceEvent({ resolve, reject });
|
|
68
|
+
pendingSourceEvent = null;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Second priority: Dispatch injected events
|
|
72
|
+
if (pendingInjectedEvents.length) {
|
|
73
|
+
return resolve(valueResult(pendingInjectedEvents.shift()));
|
|
74
|
+
}
|
|
75
|
+
// Nothing pending? Fetch from source
|
|
76
|
+
waiter = { resolve, reject };
|
|
77
|
+
return fetchFromSource();
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
inject: (event) => {
|
|
81
|
+
const pending = consumeWaiter();
|
|
82
|
+
if (pending != null) {
|
|
83
|
+
pending.resolve(valueResult(event));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
pendingInjectedEvents.push(event);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Splits a byte stream at line endings, emitting each line as a string.
|
|
93
|
+
*/
|
|
94
|
+
export function extractJsonLines(source, decoder) {
|
|
95
|
+
let buffer = '';
|
|
96
|
+
const pendingLines = [];
|
|
97
|
+
let isFinalEvent = false;
|
|
98
|
+
return {
|
|
99
|
+
next: async () => {
|
|
100
|
+
while (true) {
|
|
101
|
+
if (isFinalEvent) {
|
|
102
|
+
return doneResult;
|
|
103
|
+
}
|
|
104
|
+
{
|
|
105
|
+
const first = pendingLines.shift();
|
|
106
|
+
if (first) {
|
|
107
|
+
return { done: false, value: first };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const { done, value } = await source.next();
|
|
111
|
+
if (done) {
|
|
112
|
+
const remaining = buffer.trim();
|
|
113
|
+
if (remaining.length != 0) {
|
|
114
|
+
isFinalEvent = true;
|
|
115
|
+
return { done: false, value: remaining };
|
|
116
|
+
}
|
|
117
|
+
return doneResult;
|
|
118
|
+
}
|
|
119
|
+
const data = decoder.decode(value, { stream: true });
|
|
120
|
+
buffer += data;
|
|
121
|
+
const lines = buffer.split('\n');
|
|
122
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
123
|
+
const l = lines[i].trim();
|
|
124
|
+
if (l.length > 0) {
|
|
125
|
+
pendingLines.push(l);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
buffer = lines[lines.length - 1];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Splits a concatenated stream of BSON objects by emitting individual objects.
|
|
135
|
+
*/
|
|
136
|
+
export function extractBsonObjects(source) {
|
|
137
|
+
// Fully read but not emitted yet.
|
|
138
|
+
const completedObjects = [];
|
|
139
|
+
// Whether source has returned { done: true }. We do the same once completed objects have been emitted.
|
|
140
|
+
let isDone = false;
|
|
141
|
+
const lengthBuffer = new DataView(new ArrayBuffer(4));
|
|
142
|
+
let objectBody = null;
|
|
143
|
+
// If we're parsing the length field, a number between 1 and 4 (inclusive) describing remaining bytes in the header.
|
|
144
|
+
// If we're consuming a document, the bytes remaining.
|
|
145
|
+
let remainingLength = 4;
|
|
146
|
+
return {
|
|
147
|
+
async next() {
|
|
148
|
+
while (true) {
|
|
149
|
+
// Before fetching new data from upstream, return completed objects.
|
|
150
|
+
if (completedObjects.length) {
|
|
151
|
+
return valueResult(completedObjects.shift());
|
|
152
|
+
}
|
|
153
|
+
if (isDone) {
|
|
154
|
+
return doneResult;
|
|
155
|
+
}
|
|
156
|
+
const upstreamEvent = await source.next();
|
|
157
|
+
if (upstreamEvent.done) {
|
|
158
|
+
isDone = true;
|
|
159
|
+
if (objectBody || remainingLength != 4) {
|
|
160
|
+
throw new Error('illegal end of stream in BSON object');
|
|
161
|
+
}
|
|
162
|
+
return doneResult;
|
|
163
|
+
}
|
|
164
|
+
const chunk = upstreamEvent.value;
|
|
165
|
+
for (let i = 0; i < chunk.length;) {
|
|
166
|
+
const availableInData = chunk.length - i;
|
|
167
|
+
if (objectBody) {
|
|
168
|
+
// We're in the middle of reading a BSON document.
|
|
169
|
+
const bytesToRead = Math.min(availableInData, remainingLength);
|
|
170
|
+
const copySource = new Uint8Array(chunk.buffer, chunk.byteOffset + i, bytesToRead);
|
|
171
|
+
objectBody.set(copySource, objectBody.length - remainingLength);
|
|
172
|
+
i += bytesToRead;
|
|
173
|
+
remainingLength -= bytesToRead;
|
|
174
|
+
if (remainingLength == 0) {
|
|
175
|
+
completedObjects.push(objectBody);
|
|
176
|
+
// Prepare to read another document, starting with its length
|
|
177
|
+
objectBody = null;
|
|
178
|
+
remainingLength = 4;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// Copy up to 4 bytes into lengthBuffer, depending on how many we still need.
|
|
183
|
+
const bytesToRead = Math.min(availableInData, remainingLength);
|
|
184
|
+
for (let j = 0; j < bytesToRead; j++) {
|
|
185
|
+
lengthBuffer.setUint8(4 - remainingLength + j, chunk[i + j]);
|
|
186
|
+
}
|
|
187
|
+
i += bytesToRead;
|
|
188
|
+
remainingLength -= bytesToRead;
|
|
189
|
+
if (remainingLength == 0) {
|
|
190
|
+
// Transition from reading length header to reading document. Subtracting 4 because the length of the
|
|
191
|
+
// header is included in length.
|
|
192
|
+
const length = lengthBuffer.getInt32(0, true /* little endian */);
|
|
193
|
+
remainingLength = length - 4;
|
|
194
|
+
if (remainingLength < 1) {
|
|
195
|
+
throw new Error(`invalid length for bson: ${length}`);
|
|
196
|
+
}
|
|
197
|
+
objectBody = new Uint8Array(length);
|
|
198
|
+
new DataView(objectBody.buffer).setInt32(0, length, true);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=stream_transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream_transform.js","sourceRoot":"","sources":["../../src/utils/stream_transform.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/common",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.52.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org/",
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"description": "API definitions for
|
|
8
|
+
"description": "API definitions for PowerSync",
|
|
9
9
|
"type": "module",
|
|
10
10
|
"main": "dist/bundle.mjs",
|
|
11
11
|
"module": "dist/bundle.mjs",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
},
|
|
35
|
-
"author": "
|
|
35
|
+
"author": "PowerSync",
|
|
36
36
|
"license": "Apache-2.0",
|
|
37
37
|
"files": [
|
|
38
38
|
"lib",
|
|
@@ -57,14 +57,16 @@
|
|
|
57
57
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
58
58
|
"@types/node": "^24.0.0",
|
|
59
59
|
"@types/uuid": "^9.0.6",
|
|
60
|
+
"bson": "^6.10.4",
|
|
60
61
|
"buffer": "^6.0.3",
|
|
61
|
-
"rollup": "^4.52.5",
|
|
62
|
-
"rollup-plugin-dts": "^6.2.1",
|
|
63
62
|
"cross-fetch": "^4.1.0",
|
|
63
|
+
"estree-walker": "^3.0.3",
|
|
64
64
|
"js-logger": "^1.6.1",
|
|
65
|
+
"magic-string": "^0.30.21",
|
|
66
|
+
"rollup": "^4.52.5",
|
|
67
|
+
"rollup-plugin-dts": "^6.2.1",
|
|
65
68
|
"rsocket-core": "1.0.0-alpha.3",
|
|
66
|
-
"rsocket-websocket-client": "1.0.0-alpha.3"
|
|
67
|
-
"bson": "^6.10.4"
|
|
69
|
+
"rsocket-websocket-client": "1.0.0-alpha.3"
|
|
68
70
|
},
|
|
69
71
|
"scripts": {
|
|
70
72
|
"build": "tsc -b && rollup -c rollup.config.mjs",
|
|
@@ -13,7 +13,7 @@ import { UploadQueueStats } from '../db/crud/UploadQueueStatus.js';
|
|
|
13
13
|
import { Schema } from '../db/schema/Schema.js';
|
|
14
14
|
import { BaseObserver } from '../utils/BaseObserver.js';
|
|
15
15
|
import { ControlledExecutor } from '../utils/ControlledExecutor.js';
|
|
16
|
-
import {
|
|
16
|
+
import { throttleTrailing } from '../utils/async.js';
|
|
17
17
|
import {
|
|
18
18
|
ConnectionManager,
|
|
19
19
|
CreateSyncImplementationOptions,
|
|
@@ -704,7 +704,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
|
|
|
704
704
|
* @returns A transaction of CRUD operations to upload, or null if there are none
|
|
705
705
|
*/
|
|
706
706
|
async getNextCrudTransaction(): Promise<CrudTransaction | null> {
|
|
707
|
-
const iterator = this.getCrudTransactions()[
|
|
707
|
+
const iterator = this.getCrudTransactions()[Symbol.asyncIterator]();
|
|
708
708
|
return (await iterator.next()).value;
|
|
709
709
|
}
|
|
710
710
|
|
|
@@ -741,7 +741,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
|
|
|
741
741
|
*/
|
|
742
742
|
getCrudTransactions(): AsyncIterable<CrudTransaction, null> {
|
|
743
743
|
return {
|
|
744
|
-
[
|
|
744
|
+
[Symbol.asyncIterator]: () => {
|
|
745
745
|
let lastCrudItemId = -1;
|
|
746
746
|
const sql = `
|
|
747
747
|
WITH RECURSIVE crud_entries AS (
|