@peerbit/stream 4.4.0 → 4.4.1-94a82ff
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/src/index.d.ts +10 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +79 -9
- package/dist/src/index.js.map +1 -1
- package/dist/src/pushable-lanes.d.ts +48 -27
- package/dist/src/pushable-lanes.d.ts.map +1 -1
- package/dist/src/pushable-lanes.js +180 -66
- package/dist/src/pushable-lanes.js.map +1 -1
- package/package.json +94 -94
- package/src/index.ts +108 -11
- package/src/pushable-lanes.ts +281 -127
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export declare class AbortError extends Error {
|
|
2
|
-
type: string;
|
|
3
|
-
code: string;
|
|
4
|
-
constructor(message?: string, code?: string);
|
|
5
|
-
}
|
|
6
1
|
export interface AbortOptions {
|
|
7
2
|
signal?: AbortSignal;
|
|
8
3
|
}
|
|
@@ -11,53 +6,79 @@ export interface AbortOptions {
|
|
|
11
6
|
*/
|
|
12
7
|
export interface PushableLanes<T, R = void, N = unknown> extends AsyncGenerator<T, R, N> {
|
|
13
8
|
/**
|
|
14
|
-
* End the iterable after all values in the buffer (if any) have been yielded.
|
|
15
|
-
* error is passed the buffer is cleared immediately and the next
|
|
16
|
-
* throw the passed error
|
|
9
|
+
* End the iterable after all values in the buffer (if any) have been yielded.
|
|
10
|
+
* If an error is passed, the buffer is cleared immediately and the next
|
|
11
|
+
* iteration will throw the passed error.
|
|
17
12
|
*/
|
|
18
13
|
end(err?: Error): this;
|
|
19
14
|
/**
|
|
20
|
-
* Push a value into the iterable. Values are yielded
|
|
21
|
-
*
|
|
15
|
+
* Push a value into the iterable. Values are yielded in a lane-aware order.
|
|
16
|
+
* Values not yet consumed are buffered. Optional `lane` is 0-based (default 0).
|
|
22
17
|
*/
|
|
23
18
|
push(value: T, lane?: number): this;
|
|
24
19
|
/**
|
|
25
|
-
*
|
|
26
|
-
* this
|
|
27
|
-
*
|
|
28
|
-
* If an AbortSignal is passed as an option and that signal aborts, it only
|
|
29
|
-
* causes the returned promise to reject - it does not end the pushable.
|
|
20
|
+
* Resolves when the underlying buffer becomes empty (no queued data).
|
|
21
|
+
* If an AbortSignal is given and it aborts, only this promise rejects;
|
|
22
|
+
* the pushable itself is not ended.
|
|
30
23
|
*/
|
|
31
24
|
onEmpty(options?: AbortOptions): Promise<void>;
|
|
32
|
-
/**
|
|
33
|
-
* This property contains the total number of bytes in the queue ready to be read.
|
|
34
|
-
*
|
|
35
|
-
*/
|
|
25
|
+
/** Total number of bytes buffered (across all lanes). */
|
|
36
26
|
get readableLength(): number;
|
|
37
27
|
/**
|
|
38
|
-
* Get readable length for specific lane
|
|
39
|
-
* @param lane
|
|
40
|
-
* @returns readable length for the lane
|
|
28
|
+
* Get readable length for a specific lane (bytes) or total when `lane` is undefined.
|
|
41
29
|
*/
|
|
42
30
|
getReadableLength(lane?: number): number;
|
|
43
31
|
}
|
|
32
|
+
/** How to distribute turns between lanes. */
|
|
33
|
+
export type FairnessMode = "priority" | "wrr";
|
|
34
|
+
/** What to do when buffer would exceed `maxBufferedBytes`. */
|
|
35
|
+
export type OverflowPolicy = "throw" | "drop-newest";
|
|
44
36
|
export interface Options {
|
|
45
37
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* passed the error as a parameter.
|
|
38
|
+
* Called after *all* values have been yielded from the iterator (including buffered values).
|
|
39
|
+
* If the iterator is ended with an error it will receive the error.
|
|
49
40
|
*/
|
|
50
41
|
onEnd?(err?: Error): void;
|
|
51
42
|
/**
|
|
52
|
-
*
|
|
43
|
+
* Number of lanes. Lane 0 is the "fastest"/most preferred lane.
|
|
44
|
+
* Default: 1
|
|
53
45
|
*/
|
|
54
46
|
lanes?: number;
|
|
55
47
|
/**
|
|
56
|
-
* Optional hook invoked on every successful push with the value and lane
|
|
48
|
+
* Optional hook invoked on every successful push with the value and lane.
|
|
49
|
+
* Useful for metrics/telemetry.
|
|
57
50
|
*/
|
|
58
51
|
onPush?(value: {
|
|
59
52
|
byteLength: number;
|
|
60
53
|
}, lane: number): void;
|
|
54
|
+
/**
|
|
55
|
+
* Fairness mode:
|
|
56
|
+
* - 'priority': strict priority (original behavior).
|
|
57
|
+
* - 'wrr': weighted round-robin (starvation-free).
|
|
58
|
+
* Default: 'wrr'
|
|
59
|
+
*/
|
|
60
|
+
fairness?: FairnessMode;
|
|
61
|
+
/**
|
|
62
|
+
* Weights per lane if fairness === 'wrr'. Larger weight = more service.
|
|
63
|
+
* Must have length === lanes and each weight >= 1.
|
|
64
|
+
* If omitted, weights are auto-generated from `bias`.
|
|
65
|
+
*/
|
|
66
|
+
weights?: number[];
|
|
67
|
+
/**
|
|
68
|
+
* Bias factor for auto-generated weights when fairness === 'wrr'.
|
|
69
|
+
* For lanes L, weight[i] = floor(bias^(L-1-i)) with a minimum of 1.
|
|
70
|
+
* Default: 2 (e.g., lanes=4 -> [8,4,2,1])
|
|
71
|
+
*/
|
|
72
|
+
bias?: number;
|
|
73
|
+
/**
|
|
74
|
+
* Optional high-water mark in **bytes** across all lanes.
|
|
75
|
+
* If a `push` would exceed this many buffered bytes:
|
|
76
|
+
* - overflow: 'throw' -> throw an Error (default policy)
|
|
77
|
+
* - overflow: 'drop-newest' -> silently drop this pushed item
|
|
78
|
+
*/
|
|
79
|
+
maxBufferedBytes?: number;
|
|
80
|
+
/** Overflow policy when `maxBufferedBytes` would be exceeded. Default: 'throw' */
|
|
81
|
+
overflow?: OverflowPolicy;
|
|
61
82
|
}
|
|
62
83
|
export interface DoneResult {
|
|
63
84
|
done: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pushable-lanes.d.ts","sourceRoot":"","sources":["../../src/pushable-lanes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pushable-lanes.d.ts","sourceRoot":"","sources":["../../src/pushable-lanes.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,YAAY;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,CACtD,SAAQ,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/B;;;;OAIG;IACH,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAEvB;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC;;;;OAIG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C,yDAAyD;IACzD,IAAI,cAAc,IAAI,MAAM,CAAC;IAE7B;;OAEG;IACH,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzC;AAED,6CAA6C;AAC7C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,aAAa,CAAC;AAErD,MAAM,WAAW,OAAO;IACvB;;;OAGG;IACH,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAE1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,MAAM,CAAC,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3D;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IAExB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC1B;AAMD,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,IAAI,CAAC;CACX;AACD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC;CACT;AACD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;AAExD,MAAM,WAAW,IAAI,CAAC,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,CAAC,CAAC;CACV;AA8ID,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,EAC1E,OAAO,GAAE,OAAY,GACnB,aAAa,CAAC,CAAC,CAAC,CAElB"}
|
|
@@ -1,89 +1,182 @@
|
|
|
1
|
+
// A multi-lane async pushable with starvation-free scheduling.
|
|
2
|
+
// Inspired by it-pushable (MIT) and extended for multi-lane fairness.
|
|
3
|
+
//
|
|
4
|
+
// Features:
|
|
5
|
+
// - Async iterator you can .push() into
|
|
6
|
+
// - N lanes (priorities) with starvation-free scheduling (Weighted Round-Robin)
|
|
7
|
+
// - Optional strict priority mode for legacy behavior
|
|
8
|
+
// - Optional high-water mark (bytes) with overflow policy
|
|
9
|
+
//
|
|
10
|
+
// Usage:
|
|
11
|
+
// const p = pushableLanes<Uint8Array>({ lanes: 2 }); // default fairness = 'wrr'
|
|
12
|
+
// p.push(new Uint8Array([1]), 1); // slower lane
|
|
13
|
+
// p.push(new Uint8Array([0]), 0); // faster lane
|
|
14
|
+
// for await (const chunk of p) { ... }
|
|
15
|
+
//
|
|
16
|
+
// // Backpressure example (throw if > 8MB buffered):
|
|
17
|
+
// const q = pushableLanes<Uint8Array>({ lanes: 3, maxBufferedBytes: 8 * 1024 * 1024, overflow: 'throw' });
|
|
18
|
+
//
|
|
19
|
+
// Notes:
|
|
20
|
+
// - T must have a .byteLength number property (e.g. Uint8Array).
|
|
21
|
+
// - Lane indices are 0..(lanes-1). Defaults to lane 0.
|
|
22
|
+
import { AbortError } from "@peerbit/time";
|
|
1
23
|
import GenericFIFO from "fast-fifo";
|
|
2
24
|
import defer from "p-defer";
|
|
3
|
-
export class AbortError extends Error {
|
|
4
|
-
type;
|
|
5
|
-
code;
|
|
6
|
-
constructor(message, code) {
|
|
7
|
-
super(message ?? "The operation was aborted");
|
|
8
|
-
this.type = "aborted";
|
|
9
|
-
this.code = code ?? "ABORT_ERR";
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
25
|
/**
|
|
13
|
-
*
|
|
26
|
+
* FIFO that tracks the total readable bytes (`.size`) of queued values.
|
|
14
27
|
*/
|
|
15
|
-
class
|
|
28
|
+
class ByteFifo extends GenericFIFO {
|
|
16
29
|
size = 0;
|
|
17
30
|
push(val) {
|
|
18
|
-
if (val.value)
|
|
31
|
+
if (val.value)
|
|
19
32
|
this.size += val.value.byteLength;
|
|
20
|
-
}
|
|
21
33
|
return super.push(val);
|
|
22
34
|
}
|
|
23
35
|
shift() {
|
|
24
36
|
const shifted = super.shift();
|
|
25
|
-
if (shifted?.value)
|
|
37
|
+
if (shifted?.value)
|
|
26
38
|
this.size -= shifted.value.byteLength;
|
|
27
|
-
}
|
|
28
39
|
return shifted;
|
|
29
40
|
}
|
|
30
41
|
}
|
|
31
42
|
/**
|
|
32
|
-
* A queue
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* so no lane get really "stuck"
|
|
43
|
+
* A multi-lane queue with configurable fairness.
|
|
44
|
+
* - 'priority': probe lanes in order 0..L-1 each shift.
|
|
45
|
+
* - 'wrr': service lanes according to weights in a repeating schedule.
|
|
36
46
|
*/
|
|
37
|
-
class
|
|
47
|
+
class LaneQueue {
|
|
38
48
|
lanes;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
mode;
|
|
50
|
+
schedule; // WRR: repeated lane indices per weight
|
|
51
|
+
cursor = 0;
|
|
52
|
+
constructor(init) {
|
|
53
|
+
const L = Math.max(1, init.lanes | 0);
|
|
54
|
+
this.mode = init.fairness ?? "wrr";
|
|
55
|
+
this.lanes = Array.from({ length: L }, () => new ByteFifo());
|
|
56
|
+
if (this.mode === "wrr") {
|
|
57
|
+
const bias = init.bias ?? 2;
|
|
58
|
+
const auto = Array.from({ length: L }, (_, i) => Math.max(1, Math.floor(Math.pow(bias, L - 1 - i))));
|
|
59
|
+
const w = normalizeWeights(init.weights ?? auto, L);
|
|
60
|
+
// Build a simple round-robin schedule by repeating lanes according to weight.
|
|
61
|
+
this.schedule = [];
|
|
62
|
+
for (let i = 0; i < L; i++) {
|
|
63
|
+
for (let k = 0; k < w[i]; k++)
|
|
64
|
+
this.schedule.push(i);
|
|
65
|
+
}
|
|
66
|
+
// Edge case: if all weights collapsed to zero (shouldn't), fall back to priority.
|
|
67
|
+
if (this.schedule.length === 0) {
|
|
68
|
+
this.schedule = Array.from({ length: L }, (_, i) => i);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// strict priority
|
|
73
|
+
this.schedule = Array.from({ length: L }, (_, i) => i);
|
|
43
74
|
}
|
|
44
75
|
}
|
|
45
76
|
get size() {
|
|
46
77
|
let sum = 0;
|
|
47
|
-
for (const lane of this.lanes)
|
|
78
|
+
for (const lane of this.lanes)
|
|
48
79
|
sum += lane.size;
|
|
49
|
-
}
|
|
50
80
|
return sum;
|
|
51
81
|
}
|
|
82
|
+
/** Enqueue a value into a specific lane. */
|
|
52
83
|
push(val, lane) {
|
|
53
|
-
|
|
84
|
+
const idx = clampLane(lane, this.lanes.length);
|
|
85
|
+
this.lanes[idx].push(val);
|
|
54
86
|
}
|
|
87
|
+
/** True if all lanes are empty. */
|
|
88
|
+
isEmpty() {
|
|
89
|
+
for (const lane of this.lanes)
|
|
90
|
+
if (!lane.isEmpty())
|
|
91
|
+
return false;
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Dequeue the next value by fairness rules.
|
|
96
|
+
* Ensures progress even if some schedule slots map to empty lanes.
|
|
97
|
+
*/
|
|
55
98
|
shift() {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
99
|
+
if (this.isEmpty())
|
|
100
|
+
return undefined;
|
|
101
|
+
if (this.mode === "priority") {
|
|
102
|
+
// strict priority: always scan from lane 0
|
|
103
|
+
for (let i = 0; i < this.lanes.length; i++) {
|
|
104
|
+
const item = this.lanes[i].shift();
|
|
105
|
+
if (item)
|
|
106
|
+
return item;
|
|
62
107
|
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
// WRR mode: use rotating schedule
|
|
111
|
+
const L = this.schedule.length;
|
|
112
|
+
for (let probes = 0; probes < L; probes++) {
|
|
113
|
+
const laneIdx = this.schedule[this.cursor];
|
|
114
|
+
this.cursor = (this.cursor + 1) % L;
|
|
115
|
+
const item = this.lanes[laneIdx].shift();
|
|
116
|
+
if (item)
|
|
117
|
+
return item;
|
|
118
|
+
}
|
|
119
|
+
// (very unlikely) nothing was found despite size>0 – linear scan fallback
|
|
120
|
+
for (let i = 0; i < this.lanes.length; i++) {
|
|
121
|
+
const item = this.lanes[i].shift();
|
|
122
|
+
if (item)
|
|
123
|
+
return item;
|
|
63
124
|
}
|
|
64
125
|
return undefined;
|
|
65
126
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return true;
|
|
127
|
+
}
|
|
128
|
+
function normalizeWeights(weights, lanes) {
|
|
129
|
+
if (weights.length !== lanes) {
|
|
130
|
+
throw new Error(`weights length (${weights.length}) must equal lanes (${lanes})`);
|
|
73
131
|
}
|
|
132
|
+
const w = weights.map((x) => (x && x > 0 ? Math.floor(x) : 0));
|
|
133
|
+
if (w.every((x) => x === 0)) {
|
|
134
|
+
// ensure at least 1 for all lanes to retain progress guarantees
|
|
135
|
+
return Array.from({ length: lanes }, () => 1);
|
|
136
|
+
}
|
|
137
|
+
return w;
|
|
138
|
+
}
|
|
139
|
+
function clampLane(lane, lanes) {
|
|
140
|
+
if (!Number.isFinite(lane))
|
|
141
|
+
return 0;
|
|
142
|
+
lane = lane | 0;
|
|
143
|
+
if (lane < 0)
|
|
144
|
+
return 0;
|
|
145
|
+
if (lane >= lanes)
|
|
146
|
+
return lanes - 1;
|
|
147
|
+
return lane;
|
|
74
148
|
}
|
|
149
|
+
// -----------------------------
|
|
150
|
+
// Factory
|
|
151
|
+
// -----------------------------
|
|
75
152
|
export function pushableLanes(options = {}) {
|
|
76
153
|
return _pushable(options);
|
|
77
154
|
}
|
|
78
|
-
//
|
|
155
|
+
// -----------------------------
|
|
156
|
+
// Core implementation
|
|
157
|
+
// -----------------------------
|
|
158
|
+
// Based on it-pushable, adapted to multi-lane buffered queues with fairness.
|
|
159
|
+
// Important invariants:
|
|
160
|
+
// - We resolve the internal "drain" promise whenever the buffer *becomes empty*.
|
|
161
|
+
// - After end(err), the iterator finishes; push() becomes a no-op.
|
|
79
162
|
function _pushable(options) {
|
|
80
163
|
options = options ?? {};
|
|
81
164
|
let onEnd = options.onEnd;
|
|
82
|
-
|
|
165
|
+
// Main buffer: multi-lane with fairness
|
|
166
|
+
let buffer = new LaneQueue({
|
|
167
|
+
lanes: options.lanes ?? 1,
|
|
168
|
+
fairness: options.fairness ?? "wrr",
|
|
169
|
+
weights: options.weights,
|
|
170
|
+
bias: options.bias ?? 2,
|
|
171
|
+
});
|
|
172
|
+
// After end(err) we may swap buffer to a simple ByteFifo to deliver the terminal signal/error.
|
|
173
|
+
const isLaneQueue = (buffer) => buffer instanceof LaneQueue;
|
|
83
174
|
let pushable;
|
|
84
175
|
let onNext;
|
|
85
|
-
let ended;
|
|
176
|
+
let ended = false;
|
|
86
177
|
let drain = defer();
|
|
178
|
+
const maxBytes = options.maxBufferedBytes;
|
|
179
|
+
const overflow = options.overflow ?? "throw";
|
|
87
180
|
const getNext = () => {
|
|
88
181
|
const next = buffer.shift();
|
|
89
182
|
if (next == null) {
|
|
@@ -121,9 +214,8 @@ function _pushable(options) {
|
|
|
121
214
|
});
|
|
122
215
|
}
|
|
123
216
|
finally {
|
|
217
|
+
// If buffer is empty after this turn, resolve the drain promise (in a microtask)
|
|
124
218
|
if (buffer.isEmpty()) {
|
|
125
|
-
// settle promise in the microtask queue to give consumers a chance to
|
|
126
|
-
// await after calling .push
|
|
127
219
|
queueMicrotask(() => {
|
|
128
220
|
drain.resolve();
|
|
129
221
|
drain = defer();
|
|
@@ -139,19 +231,38 @@ function _pushable(options) {
|
|
|
139
231
|
return pushable;
|
|
140
232
|
};
|
|
141
233
|
const bufferError = (err) => {
|
|
142
|
-
|
|
234
|
+
// swap to ByteFifo to deliver a single terminal error
|
|
235
|
+
buffer = new ByteFifo();
|
|
143
236
|
if (onNext != null) {
|
|
144
237
|
return onNext({ error: err }, 0);
|
|
145
238
|
}
|
|
146
239
|
buffer.push({ error: err });
|
|
147
240
|
return pushable;
|
|
148
241
|
};
|
|
242
|
+
const totalBufferedBytes = () => {
|
|
243
|
+
if (isLaneQueue(buffer))
|
|
244
|
+
return buffer.size;
|
|
245
|
+
return buffer.size;
|
|
246
|
+
};
|
|
149
247
|
const push = (value, lane = 0) => {
|
|
150
248
|
if (ended) {
|
|
249
|
+
// Ignore pushes after end() for safety (consistent with it-pushable).
|
|
151
250
|
return pushable;
|
|
152
251
|
}
|
|
252
|
+
// Simple backpressure: enforce HWM if configured
|
|
253
|
+
if (maxBytes != null && maxBytes > 0) {
|
|
254
|
+
const wouldBe = totalBufferedBytes() + value.byteLength;
|
|
255
|
+
if (wouldBe > maxBytes) {
|
|
256
|
+
if (overflow === "drop-newest") {
|
|
257
|
+
// silently drop this item
|
|
258
|
+
return pushable;
|
|
259
|
+
}
|
|
260
|
+
// default 'throw'
|
|
261
|
+
throw new Error(`pushableLanes buffer overflow: ${wouldBe} bytes > maxBufferedBytes=${maxBytes}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
153
264
|
const out = bufferNext({ done: false, value }, lane);
|
|
154
|
-
options?.onPush?.(value, lane);
|
|
265
|
+
options?.onPush?.(value, clampLane(lane, isLaneQueue(buffer) ? buffer.lanes.length : 1));
|
|
155
266
|
return out;
|
|
156
267
|
};
|
|
157
268
|
const end = (err) => {
|
|
@@ -161,7 +272,8 @@ function _pushable(options) {
|
|
|
161
272
|
return err != null ? bufferError(err) : bufferNext({ done: true }, 0);
|
|
162
273
|
};
|
|
163
274
|
const _return = () => {
|
|
164
|
-
|
|
275
|
+
// Ensure prompt termination
|
|
276
|
+
buffer = new ByteFifo();
|
|
165
277
|
end();
|
|
166
278
|
return { done: true };
|
|
167
279
|
};
|
|
@@ -179,30 +291,28 @@ function _pushable(options) {
|
|
|
179
291
|
push,
|
|
180
292
|
end,
|
|
181
293
|
get readableLength() {
|
|
182
|
-
return
|
|
294
|
+
return totalBufferedBytes();
|
|
183
295
|
},
|
|
184
296
|
getReadableLength(lane) {
|
|
185
|
-
if (lane == null)
|
|
186
|
-
return
|
|
297
|
+
if (lane == null)
|
|
298
|
+
return totalBufferedBytes();
|
|
299
|
+
if (isLaneQueue(buffer)) {
|
|
300
|
+
const idx = clampLane(lane, buffer.lanes.length);
|
|
301
|
+
return buffer.lanes[idx].size;
|
|
187
302
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
return buffer.size; // we can only arrive here if we are "done" or "err" or "end" where we reasign the buffer to a simple one and put 1 message into it
|
|
303
|
+
// After end/error we swap to a ByteFifo: only "total" makes sense.
|
|
304
|
+
return buffer.size;
|
|
192
305
|
},
|
|
193
|
-
onEmpty: async (
|
|
194
|
-
const signal =
|
|
195
|
-
signal?.throwIfAborted();
|
|
196
|
-
if (buffer.isEmpty())
|
|
306
|
+
onEmpty: async (opts) => {
|
|
307
|
+
const signal = opts?.signal;
|
|
308
|
+
signal?.throwIfAborted?.();
|
|
309
|
+
if (buffer.isEmpty())
|
|
197
310
|
return;
|
|
198
|
-
}
|
|
199
311
|
let cancel;
|
|
200
312
|
let listener;
|
|
201
313
|
if (signal != null) {
|
|
202
|
-
cancel = new Promise((
|
|
203
|
-
listener = () =>
|
|
204
|
-
reject(new AbortError());
|
|
205
|
-
};
|
|
314
|
+
cancel = new Promise((_resolve, reject) => {
|
|
315
|
+
listener = () => reject(new AbortError());
|
|
206
316
|
signal.addEventListener("abort", listener);
|
|
207
317
|
});
|
|
208
318
|
}
|
|
@@ -210,7 +320,7 @@ function _pushable(options) {
|
|
|
210
320
|
await Promise.race([drain.promise, cancel]);
|
|
211
321
|
}
|
|
212
322
|
finally {
|
|
213
|
-
if (listener != null
|
|
323
|
+
if (listener != null) {
|
|
214
324
|
signal?.removeEventListener("abort", listener);
|
|
215
325
|
}
|
|
216
326
|
}
|
|
@@ -219,6 +329,7 @@ function _pushable(options) {
|
|
|
219
329
|
if (onEnd == null) {
|
|
220
330
|
return pushable;
|
|
221
331
|
}
|
|
332
|
+
// Wrap with onEnd notifier
|
|
222
333
|
const _pushable = pushable;
|
|
223
334
|
pushable = {
|
|
224
335
|
[Symbol.asyncIterator]() {
|
|
@@ -255,7 +366,10 @@ function _pushable(options) {
|
|
|
255
366
|
get readableLength() {
|
|
256
367
|
return _pushable.readableLength;
|
|
257
368
|
},
|
|
258
|
-
|
|
369
|
+
getReadableLength(lane) {
|
|
370
|
+
return _pushable.getReadableLength(lane);
|
|
371
|
+
},
|
|
372
|
+
onEmpty(opts) {
|
|
259
373
|
return _pushable.onEmpty(opts);
|
|
260
374
|
},
|
|
261
375
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pushable-lanes.js","sourceRoot":"","sources":["../../src/pushable-lanes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pushable-lanes.js","sourceRoot":"","sources":["../../src/pushable-lanes.ts"],"names":[],"mappings":"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"}
|