@gjsify/web-streams 0.3.12 → 0.3.14
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/lib/esm/index.js +22 -87
- package/lib/esm/queuing-strategies.js +47 -55
- package/lib/esm/readable-stream.js +836 -989
- package/lib/esm/register/queuing.js +7 -3
- package/lib/esm/register/readable.js +12 -8
- package/lib/esm/register/text-streams.js +7 -3
- package/lib/esm/register/transform.js +12 -8
- package/lib/esm/register/writable.js +12 -8
- package/lib/esm/text-decoder-stream.js +133 -118
- package/lib/esm/text-encoder-stream.js +58 -44
- package/lib/esm/transform-stream.js +242 -298
- package/lib/esm/util.js +106 -129
- package/lib/esm/writable-stream.js +588 -588
- package/package.json +4 -4
|
@@ -1,1064 +1,911 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
nonOpPull,
|
|
14
|
-
nonOpStart,
|
|
15
|
-
getIterator,
|
|
16
|
-
iteratorNext,
|
|
17
|
-
AsyncIterator
|
|
18
|
-
} from "./util.js";
|
|
19
|
-
import {
|
|
20
|
-
WritableStreamDefaultWriter,
|
|
21
|
-
isWritableStream,
|
|
22
|
-
isWritableStreamLocked,
|
|
23
|
-
writableStreamAbort,
|
|
24
|
-
writableStreamCloseQueuedOrInFlight,
|
|
25
|
-
writableStreamDefaultWriterCloseWithErrorPropagation,
|
|
26
|
-
writableStreamDefaultWriterRelease,
|
|
27
|
-
writableStreamDefaultWriterWrite
|
|
28
|
-
} from "./writable-stream.js";
|
|
29
|
-
const kCancel = /* @__PURE__ */ Symbol("kCancel");
|
|
30
|
-
const kClose = /* @__PURE__ */ Symbol("kClose");
|
|
31
|
-
const kChunk = /* @__PURE__ */ Symbol("kChunk");
|
|
32
|
-
const kError = /* @__PURE__ */ Symbol("kError");
|
|
33
|
-
const kPull = /* @__PURE__ */ Symbol("kPull");
|
|
34
|
-
const kRelease = /* @__PURE__ */ Symbol("kRelease");
|
|
35
|
-
const kSkipThrow = /* @__PURE__ */ Symbol("kSkipThrow");
|
|
1
|
+
import { AsyncIterator, createPromiseCallback, dequeueValue, enqueueValueWithSize, extractHighWaterMark, extractSizeAlgorithm, getIterator, isBrandCheck, iteratorNext, kState, kType, nonOpCancel, nonOpPull, nonOpStart, resetQueue, setPromiseHandled } from "./util.js";
|
|
2
|
+
import { WritableStreamDefaultWriter, isWritableStream, isWritableStreamLocked, writableStreamAbort, writableStreamCloseQueuedOrInFlight, writableStreamDefaultWriterCloseWithErrorPropagation, writableStreamDefaultWriterRelease, writableStreamDefaultWriterWrite } from "./writable-stream.js";
|
|
3
|
+
import { queueMicrotask } from "@gjsify/utils";
|
|
4
|
+
|
|
5
|
+
//#region src/readable-stream.ts
|
|
6
|
+
const kCancel = Symbol("kCancel");
|
|
7
|
+
const kClose = Symbol("kClose");
|
|
8
|
+
const kChunk = Symbol("kChunk");
|
|
9
|
+
const kError = Symbol("kError");
|
|
10
|
+
const kPull = Symbol("kPull");
|
|
11
|
+
const kRelease = Symbol("kRelease");
|
|
12
|
+
const kSkipThrow = Symbol("kSkipThrow");
|
|
36
13
|
let releasedError;
|
|
37
14
|
let releasingError;
|
|
38
15
|
function lazyReadableReleasedError() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
16
|
+
if (releasedError) return releasedError;
|
|
17
|
+
releasedError = new TypeError("Reader released");
|
|
18
|
+
return releasedError;
|
|
42
19
|
}
|
|
43
20
|
function lazyReadableReleasingError() {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
21
|
+
if (releasingError) return releasingError;
|
|
22
|
+
releasingError = new TypeError("Releasing reader");
|
|
23
|
+
return releasingError;
|
|
47
24
|
}
|
|
48
25
|
function createAbortError() {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
26
|
+
if (typeof globalThis.DOMException === "function") {
|
|
27
|
+
return new DOMException("The operation was aborted", "AbortError");
|
|
28
|
+
}
|
|
29
|
+
const err = new Error("The operation was aborted");
|
|
30
|
+
err.name = "AbortError";
|
|
31
|
+
return err;
|
|
55
32
|
}
|
|
56
|
-
import { queueMicrotask as _queueMicrotask } from "@gjsify/utils";
|
|
57
33
|
function createReadableStreamState() {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
if (!readableStreamDefaultControllerCanCloseOrEnqueue(this))
|
|
380
|
-
throw new TypeError("Controller is already closed");
|
|
381
|
-
readableStreamDefaultControllerEnqueue(this, chunk);
|
|
382
|
-
}
|
|
383
|
-
error(error = void 0) {
|
|
384
|
-
readableStreamDefaultControllerError(this, error);
|
|
385
|
-
}
|
|
386
|
-
[kCancel](reason) {
|
|
387
|
-
return readableStreamDefaultControllerCancelSteps(this, reason);
|
|
388
|
-
}
|
|
389
|
-
[kPull](readRequest) {
|
|
390
|
-
readableStreamDefaultControllerPullSteps(this, readRequest);
|
|
391
|
-
}
|
|
392
|
-
[kRelease]() {
|
|
393
|
-
}
|
|
394
|
-
get [Symbol.toStringTag]() {
|
|
395
|
-
return "ReadableStreamDefaultController";
|
|
396
|
-
}
|
|
397
|
-
}
|
|
34
|
+
return {
|
|
35
|
+
disturbed: false,
|
|
36
|
+
reader: undefined,
|
|
37
|
+
state: "readable",
|
|
38
|
+
storedError: undefined,
|
|
39
|
+
controller: undefined,
|
|
40
|
+
closedPromise: Promise.withResolvers()
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
var ReadableStream = class {
|
|
44
|
+
[kType] = "ReadableStream";
|
|
45
|
+
[kState];
|
|
46
|
+
constructor(source = {}, strategy = {}) {
|
|
47
|
+
if (source != null && typeof source !== "object") {
|
|
48
|
+
throw new TypeError("source must be an object");
|
|
49
|
+
}
|
|
50
|
+
if (strategy != null && typeof strategy !== "object") {
|
|
51
|
+
throw new TypeError("strategy must be an object");
|
|
52
|
+
}
|
|
53
|
+
this[kState] = createReadableStreamState();
|
|
54
|
+
const size = strategy?.size;
|
|
55
|
+
const highWaterMark = strategy?.highWaterMark;
|
|
56
|
+
const type = source?.type;
|
|
57
|
+
if (type !== undefined) {
|
|
58
|
+
if (`${type}` === "bytes") {
|
|
59
|
+
throw new RangeError("Byte streams not yet supported (use default controller)");
|
|
60
|
+
}
|
|
61
|
+
throw new RangeError(`Invalid type: ${type}`);
|
|
62
|
+
}
|
|
63
|
+
setupReadableStreamDefaultControllerFromSource(this, source, extractHighWaterMark(highWaterMark, 1), extractSizeAlgorithm(size));
|
|
64
|
+
}
|
|
65
|
+
get locked() {
|
|
66
|
+
if (!isReadableStream(this)) throw new TypeError("Invalid this");
|
|
67
|
+
return isReadableStreamLocked(this);
|
|
68
|
+
}
|
|
69
|
+
static from(iterable) {
|
|
70
|
+
return readableStreamFromIterable(iterable);
|
|
71
|
+
}
|
|
72
|
+
cancel(reason = undefined) {
|
|
73
|
+
if (!isReadableStream(this)) return Promise.reject(new TypeError("Invalid this"));
|
|
74
|
+
if (isReadableStreamLocked(this)) return Promise.reject(new TypeError("ReadableStream is locked"));
|
|
75
|
+
return readableStreamCancel(this, reason);
|
|
76
|
+
}
|
|
77
|
+
getReader(options = {}) {
|
|
78
|
+
if (!isReadableStream(this)) throw new TypeError("Invalid this");
|
|
79
|
+
if (options != null && typeof options !== "object") {
|
|
80
|
+
throw new TypeError("options must be an object");
|
|
81
|
+
}
|
|
82
|
+
const mode = options?.mode;
|
|
83
|
+
if (mode === undefined) return new ReadableStreamDefaultReader(this);
|
|
84
|
+
if (`${mode}` === "byob") throw new RangeError("BYOB readers not yet supported");
|
|
85
|
+
throw new RangeError(`Invalid mode: ${mode}`);
|
|
86
|
+
}
|
|
87
|
+
pipeThrough(transform, options = {}) {
|
|
88
|
+
if (!isReadableStream(this)) throw new TypeError("Invalid this");
|
|
89
|
+
const readable = transform?.readable;
|
|
90
|
+
if (!isReadableStream(readable)) {
|
|
91
|
+
throw new TypeError("transform.readable must be a ReadableStream");
|
|
92
|
+
}
|
|
93
|
+
const writable = transform?.writable;
|
|
94
|
+
if (!isWritableStream(writable)) {
|
|
95
|
+
throw new TypeError("transform.writable must be a WritableStream");
|
|
96
|
+
}
|
|
97
|
+
if (options != null && typeof options !== "object") {
|
|
98
|
+
throw new TypeError("options must be an object");
|
|
99
|
+
}
|
|
100
|
+
const preventAbort = options?.preventAbort;
|
|
101
|
+
const preventCancel = options?.preventCancel;
|
|
102
|
+
const preventClose = options?.preventClose;
|
|
103
|
+
const signal = options?.signal;
|
|
104
|
+
if (signal !== undefined && !(signal instanceof Object && "aborted" in signal)) {
|
|
105
|
+
throw new TypeError("options.signal must be an AbortSignal");
|
|
106
|
+
}
|
|
107
|
+
if (isReadableStreamLocked(this)) throw new TypeError("The ReadableStream is locked");
|
|
108
|
+
if (isWritableStreamLocked(writable)) throw new TypeError("The WritableStream is locked");
|
|
109
|
+
const promise = readableStreamPipeTo(this, writable, !!preventClose, !!preventAbort, !!preventCancel, signal);
|
|
110
|
+
setPromiseHandled(promise);
|
|
111
|
+
return readable;
|
|
112
|
+
}
|
|
113
|
+
pipeTo(destination, options = {}) {
|
|
114
|
+
try {
|
|
115
|
+
if (!isReadableStream(this)) throw new TypeError("Invalid this");
|
|
116
|
+
if (!isWritableStream(destination)) {
|
|
117
|
+
throw new TypeError("destination must be a WritableStream");
|
|
118
|
+
}
|
|
119
|
+
if (options != null && typeof options !== "object") {
|
|
120
|
+
throw new TypeError("options must be an object");
|
|
121
|
+
}
|
|
122
|
+
const preventAbort = options?.preventAbort;
|
|
123
|
+
const preventCancel = options?.preventCancel;
|
|
124
|
+
const preventClose = options?.preventClose;
|
|
125
|
+
const signal = options?.signal;
|
|
126
|
+
if (signal !== undefined && !(signal instanceof Object && "aborted" in signal)) {
|
|
127
|
+
throw new TypeError("options.signal must be an AbortSignal");
|
|
128
|
+
}
|
|
129
|
+
if (isReadableStreamLocked(this)) throw new TypeError("The ReadableStream is locked");
|
|
130
|
+
if (isWritableStreamLocked(destination)) throw new TypeError("The WritableStream is locked");
|
|
131
|
+
return readableStreamPipeTo(this, destination, !!preventClose, !!preventAbort, !!preventCancel, signal);
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return Promise.reject(error);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
tee() {
|
|
137
|
+
if (!isReadableStream(this)) throw new TypeError("Invalid this");
|
|
138
|
+
return readableStreamDefaultTee(this, false);
|
|
139
|
+
}
|
|
140
|
+
values(options = {}) {
|
|
141
|
+
if (!isReadableStream(this)) throw new TypeError("Invalid this");
|
|
142
|
+
if (options != null && typeof options !== "object") {
|
|
143
|
+
throw new TypeError("options must be an object");
|
|
144
|
+
}
|
|
145
|
+
const preventCancel = !!options?.preventCancel;
|
|
146
|
+
const reader = new ReadableStreamDefaultReader(this);
|
|
147
|
+
const state = {
|
|
148
|
+
done: false,
|
|
149
|
+
current: undefined
|
|
150
|
+
};
|
|
151
|
+
let started = false;
|
|
152
|
+
function nextSteps() {
|
|
153
|
+
if (state.done) return Promise.resolve({
|
|
154
|
+
done: true,
|
|
155
|
+
value: undefined
|
|
156
|
+
});
|
|
157
|
+
if (reader[kState].stream === undefined) {
|
|
158
|
+
return Promise.reject(new TypeError("The reader is not bound to a ReadableStream"));
|
|
159
|
+
}
|
|
160
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
161
|
+
readableStreamDefaultReaderRead(reader, {
|
|
162
|
+
[kChunk](chunk) {
|
|
163
|
+
state.current = undefined;
|
|
164
|
+
resolve({
|
|
165
|
+
value: chunk,
|
|
166
|
+
done: false
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
[kClose]() {
|
|
170
|
+
state.current = undefined;
|
|
171
|
+
state.done = true;
|
|
172
|
+
readableStreamReaderGenericRelease(reader);
|
|
173
|
+
resolve({
|
|
174
|
+
done: true,
|
|
175
|
+
value: undefined
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
[kError](error) {
|
|
179
|
+
state.current = undefined;
|
|
180
|
+
state.done = true;
|
|
181
|
+
readableStreamReaderGenericRelease(reader);
|
|
182
|
+
reject(error);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return promise;
|
|
186
|
+
}
|
|
187
|
+
async function returnSteps(value) {
|
|
188
|
+
if (state.done) return {
|
|
189
|
+
done: true,
|
|
190
|
+
value
|
|
191
|
+
};
|
|
192
|
+
state.done = true;
|
|
193
|
+
if (reader[kState].stream === undefined) {
|
|
194
|
+
throw new TypeError("The reader is not bound to a ReadableStream");
|
|
195
|
+
}
|
|
196
|
+
if (!preventCancel) {
|
|
197
|
+
const result = readableStreamReaderGenericCancel(reader, value);
|
|
198
|
+
readableStreamReaderGenericRelease(reader);
|
|
199
|
+
await result;
|
|
200
|
+
return {
|
|
201
|
+
done: true,
|
|
202
|
+
value
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
readableStreamReaderGenericRelease(reader);
|
|
206
|
+
return {
|
|
207
|
+
done: true,
|
|
208
|
+
value
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return Object.setPrototypeOf({
|
|
212
|
+
next() {
|
|
213
|
+
if (!started) {
|
|
214
|
+
state.current = Promise.resolve();
|
|
215
|
+
started = true;
|
|
216
|
+
}
|
|
217
|
+
state.current = state.current !== undefined ? state.current.then(nextSteps, nextSteps) : nextSteps();
|
|
218
|
+
return state.current;
|
|
219
|
+
},
|
|
220
|
+
return(error) {
|
|
221
|
+
started = true;
|
|
222
|
+
state.current = state.current !== undefined ? state.current.then(() => returnSteps(error), () => returnSteps(error)) : returnSteps(error);
|
|
223
|
+
return state.current;
|
|
224
|
+
},
|
|
225
|
+
[Symbol.asyncIterator]() {
|
|
226
|
+
return this;
|
|
227
|
+
}
|
|
228
|
+
}, AsyncIterator);
|
|
229
|
+
}
|
|
230
|
+
[Symbol.asyncIterator]() {
|
|
231
|
+
return this.values();
|
|
232
|
+
}
|
|
233
|
+
get [Symbol.toStringTag]() {
|
|
234
|
+
return "ReadableStream";
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
var DefaultReadRequest = class {
|
|
238
|
+
[kState];
|
|
239
|
+
constructor() {
|
|
240
|
+
this[kState] = Promise.withResolvers();
|
|
241
|
+
}
|
|
242
|
+
[kChunk](value) {
|
|
243
|
+
this[kState].resolve?.({
|
|
244
|
+
value,
|
|
245
|
+
done: false
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
[kClose]() {
|
|
249
|
+
this[kState].resolve?.({
|
|
250
|
+
value: undefined,
|
|
251
|
+
done: true
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
[kError](error) {
|
|
255
|
+
this[kState].reject?.(error);
|
|
256
|
+
}
|
|
257
|
+
get promise() {
|
|
258
|
+
return this[kState].promise;
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
var ReadableStreamDefaultReader = class {
|
|
262
|
+
[kType] = "ReadableStreamDefaultReader";
|
|
263
|
+
[kState];
|
|
264
|
+
constructor(stream) {
|
|
265
|
+
if (!isReadableStream(stream)) throw new TypeError("Expected a ReadableStream");
|
|
266
|
+
this[kState] = {
|
|
267
|
+
readRequests: [],
|
|
268
|
+
stream: undefined,
|
|
269
|
+
close: {
|
|
270
|
+
promise: undefined,
|
|
271
|
+
resolve: undefined,
|
|
272
|
+
reject: undefined
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
setupReadableStreamDefaultReader(this, stream);
|
|
276
|
+
}
|
|
277
|
+
read() {
|
|
278
|
+
if (!isReadableStreamDefaultReader(this)) return Promise.reject(new TypeError("Invalid this"));
|
|
279
|
+
if (this[kState].stream === undefined) {
|
|
280
|
+
return Promise.reject(new TypeError("The reader is not attached to a stream"));
|
|
281
|
+
}
|
|
282
|
+
const stream = this[kState].stream;
|
|
283
|
+
const controller = stream[kState].controller;
|
|
284
|
+
if (stream[kState].state === "readable" && isReadableStreamDefaultController(controller) && controller[kState].queue.length > 0) {
|
|
285
|
+
stream[kState].disturbed = true;
|
|
286
|
+
const chunk = dequeueValue(controller);
|
|
287
|
+
if (controller[kState].closeRequested && !controller[kState].queue.length) {
|
|
288
|
+
readableStreamDefaultControllerClearAlgorithms(controller);
|
|
289
|
+
readableStreamClose(stream);
|
|
290
|
+
} else {
|
|
291
|
+
readableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
292
|
+
}
|
|
293
|
+
return Promise.resolve({
|
|
294
|
+
value: chunk,
|
|
295
|
+
done: false
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
const readRequest = new DefaultReadRequest();
|
|
299
|
+
readableStreamDefaultReaderRead(this, readRequest);
|
|
300
|
+
return readRequest.promise;
|
|
301
|
+
}
|
|
302
|
+
releaseLock() {
|
|
303
|
+
if (!isReadableStreamDefaultReader(this)) throw new TypeError("Invalid this");
|
|
304
|
+
if (this[kState].stream === undefined) return;
|
|
305
|
+
readableStreamDefaultReaderRelease(this);
|
|
306
|
+
}
|
|
307
|
+
get closed() {
|
|
308
|
+
if (!isReadableStreamDefaultReader(this)) return Promise.reject(new TypeError("Invalid this"));
|
|
309
|
+
return this[kState].close.promise;
|
|
310
|
+
}
|
|
311
|
+
cancel(reason = undefined) {
|
|
312
|
+
if (!isReadableStreamDefaultReader(this)) return Promise.reject(new TypeError("Invalid this"));
|
|
313
|
+
if (this[kState].stream === undefined) {
|
|
314
|
+
return Promise.reject(new TypeError("The reader is not attached to a stream"));
|
|
315
|
+
}
|
|
316
|
+
return readableStreamReaderGenericCancel(this, reason);
|
|
317
|
+
}
|
|
318
|
+
get [Symbol.toStringTag]() {
|
|
319
|
+
return "ReadableStreamDefaultReader";
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
var ReadableStreamDefaultController = class {
|
|
323
|
+
[kType] = "ReadableStreamDefaultController";
|
|
324
|
+
[kState] = {};
|
|
325
|
+
constructor(skipThrowSymbol) {
|
|
326
|
+
if (skipThrowSymbol !== kSkipThrow) {
|
|
327
|
+
throw new TypeError("Illegal constructor");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
get desiredSize() {
|
|
331
|
+
return readableStreamDefaultControllerGetDesiredSize(this);
|
|
332
|
+
}
|
|
333
|
+
close() {
|
|
334
|
+
if (!readableStreamDefaultControllerCanCloseOrEnqueue(this)) throw new TypeError("Controller is already closed");
|
|
335
|
+
readableStreamDefaultControllerClose(this);
|
|
336
|
+
}
|
|
337
|
+
enqueue(chunk = undefined) {
|
|
338
|
+
if (!readableStreamDefaultControllerCanCloseOrEnqueue(this)) throw new TypeError("Controller is already closed");
|
|
339
|
+
readableStreamDefaultControllerEnqueue(this, chunk);
|
|
340
|
+
}
|
|
341
|
+
error(error = undefined) {
|
|
342
|
+
readableStreamDefaultControllerError(this, error);
|
|
343
|
+
}
|
|
344
|
+
[kCancel](reason) {
|
|
345
|
+
return readableStreamDefaultControllerCancelSteps(this, reason);
|
|
346
|
+
}
|
|
347
|
+
[kPull](readRequest) {
|
|
348
|
+
readableStreamDefaultControllerPullSteps(this, readRequest);
|
|
349
|
+
}
|
|
350
|
+
[kRelease]() {}
|
|
351
|
+
get [Symbol.toStringTag]() {
|
|
352
|
+
return "ReadableStreamDefaultController";
|
|
353
|
+
}
|
|
354
|
+
};
|
|
398
355
|
const isReadableStream = isBrandCheck("ReadableStream");
|
|
399
356
|
const isReadableStreamDefaultController = isBrandCheck("ReadableStreamDefaultController");
|
|
400
357
|
const isReadableStreamDefaultReader = isBrandCheck("ReadableStreamDefaultReader");
|
|
401
358
|
function isReadableStreamLocked(stream) {
|
|
402
|
-
|
|
359
|
+
return stream[kState].reader !== undefined;
|
|
403
360
|
}
|
|
404
361
|
function readableStreamCancel(stream, reason) {
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
readableStreamClose(stream);
|
|
413
|
-
return stream[kState].controller[kCancel](reason).then(() => {
|
|
414
|
-
});
|
|
362
|
+
stream[kState].disturbed = true;
|
|
363
|
+
switch (stream[kState].state) {
|
|
364
|
+
case "closed": return Promise.resolve();
|
|
365
|
+
case "errored": return Promise.reject(stream[kState].storedError);
|
|
366
|
+
}
|
|
367
|
+
readableStreamClose(stream);
|
|
368
|
+
return stream[kState].controller[kCancel](reason).then(() => {});
|
|
415
369
|
}
|
|
416
370
|
function readableStreamClose(stream) {
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
}
|
|
371
|
+
stream[kState].state = "closed";
|
|
372
|
+
stream[kState].closedPromise.resolve();
|
|
373
|
+
const { reader } = stream[kState];
|
|
374
|
+
if (reader === undefined) return;
|
|
375
|
+
reader[kState].close.resolve?.();
|
|
376
|
+
if (readableStreamHasDefaultReader(stream)) {
|
|
377
|
+
for (let n = 0; n < reader[kState].readRequests.length; n++) reader[kState].readRequests[n][kClose]();
|
|
378
|
+
reader[kState].readRequests = [];
|
|
379
|
+
}
|
|
427
380
|
}
|
|
428
381
|
function readableStreamError(stream, error) {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
}
|
|
382
|
+
stream[kState].state = "errored";
|
|
383
|
+
stream[kState].storedError = error;
|
|
384
|
+
setPromiseHandled(stream[kState].closedPromise.promise);
|
|
385
|
+
stream[kState].closedPromise.reject(error);
|
|
386
|
+
const { reader } = stream[kState];
|
|
387
|
+
if (reader === undefined) return;
|
|
388
|
+
setPromiseHandled(reader[kState].close.promise);
|
|
389
|
+
reader[kState].close.reject?.(error);
|
|
390
|
+
if (readableStreamHasDefaultReader(stream)) {
|
|
391
|
+
for (let n = 0; n < reader[kState].readRequests.length; n++) reader[kState].readRequests[n][kError](error);
|
|
392
|
+
reader[kState].readRequests = [];
|
|
393
|
+
}
|
|
442
394
|
}
|
|
443
395
|
function readableStreamHasDefaultReader(stream) {
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
396
|
+
const { reader } = stream[kState];
|
|
397
|
+
if (reader === undefined) return false;
|
|
398
|
+
return reader[kState] !== undefined && reader[kType] === "ReadableStreamDefaultReader";
|
|
447
399
|
}
|
|
448
400
|
function readableStreamGetNumReadRequests(stream) {
|
|
449
|
-
|
|
401
|
+
return stream[kState].reader[kState].readRequests.length;
|
|
450
402
|
}
|
|
451
403
|
function readableStreamFulfillReadRequest(stream, chunk, done) {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
else
|
|
457
|
-
readRequest[kChunk](chunk);
|
|
404
|
+
const { reader } = stream[kState];
|
|
405
|
+
const readRequest = reader[kState].readRequests.shift();
|
|
406
|
+
if (done) readRequest[kClose]();
|
|
407
|
+
else readRequest[kChunk](chunk);
|
|
458
408
|
}
|
|
459
409
|
function readableStreamAddReadRequest(stream, readRequest) {
|
|
460
|
-
|
|
410
|
+
stream[kState].reader[kState].readRequests.push(readRequest);
|
|
461
411
|
}
|
|
462
412
|
function readableStreamReaderGenericCancel(reader, reason) {
|
|
463
|
-
|
|
464
|
-
|
|
413
|
+
const { stream } = reader[kState];
|
|
414
|
+
return readableStreamCancel(stream, reason);
|
|
465
415
|
}
|
|
466
416
|
function readableStreamReaderGenericInitialize(reader, stream) {
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
417
|
+
reader[kState].stream = stream;
|
|
418
|
+
stream[kState].reader = reader;
|
|
419
|
+
switch (stream[kState].state) {
|
|
420
|
+
case "readable":
|
|
421
|
+
reader[kState].close = Promise.withResolvers();
|
|
422
|
+
break;
|
|
423
|
+
case "closed":
|
|
424
|
+
reader[kState].close = {
|
|
425
|
+
promise: Promise.resolve(),
|
|
426
|
+
resolve: undefined,
|
|
427
|
+
reject: undefined
|
|
428
|
+
};
|
|
429
|
+
break;
|
|
430
|
+
case "errored":
|
|
431
|
+
reader[kState].close = {
|
|
432
|
+
promise: Promise.reject(stream[kState].storedError),
|
|
433
|
+
resolve: undefined,
|
|
434
|
+
reject: undefined
|
|
435
|
+
};
|
|
436
|
+
setPromiseHandled(reader[kState].close.promise);
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
489
439
|
}
|
|
490
440
|
function readableStreamReaderGenericRelease(reader) {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
441
|
+
const { stream } = reader[kState];
|
|
442
|
+
const releasedStateError = lazyReadableReleasedError();
|
|
443
|
+
if (stream[kState].state === "readable") {
|
|
444
|
+
reader[kState].close.reject?.(releasedStateError);
|
|
445
|
+
} else {
|
|
446
|
+
reader[kState].close = {
|
|
447
|
+
promise: Promise.reject(releasedStateError),
|
|
448
|
+
resolve: undefined,
|
|
449
|
+
reject: undefined
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
setPromiseHandled(reader[kState].close.promise);
|
|
453
|
+
stream[kState].controller[kRelease]();
|
|
454
|
+
stream[kState].reader = undefined;
|
|
455
|
+
reader[kState].stream = undefined;
|
|
506
456
|
}
|
|
507
457
|
function readableStreamDefaultReaderRelease(reader) {
|
|
508
|
-
|
|
509
|
-
|
|
458
|
+
readableStreamReaderGenericRelease(reader);
|
|
459
|
+
readableStreamDefaultReaderErrorReadRequests(reader, lazyReadableReleasingError());
|
|
510
460
|
}
|
|
511
461
|
function readableStreamDefaultReaderErrorReadRequests(reader, e) {
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
462
|
+
for (let n = 0; n < reader[kState].readRequests.length; ++n) {
|
|
463
|
+
reader[kState].readRequests[n][kError](e);
|
|
464
|
+
}
|
|
465
|
+
reader[kState].readRequests = [];
|
|
516
466
|
}
|
|
517
467
|
function readableStreamDefaultReaderRead(reader, readRequest) {
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
468
|
+
const { stream } = reader[kState];
|
|
469
|
+
stream[kState].disturbed = true;
|
|
470
|
+
switch (stream[kState].state) {
|
|
471
|
+
case "closed":
|
|
472
|
+
readRequest[kClose]();
|
|
473
|
+
break;
|
|
474
|
+
case "errored":
|
|
475
|
+
readRequest[kError](stream[kState].storedError);
|
|
476
|
+
break;
|
|
477
|
+
case "readable":
|
|
478
|
+
stream[kState].controller[kPull](readRequest);
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
531
481
|
}
|
|
532
482
|
function setupReadableStreamDefaultReader(reader, stream) {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
reader[kState].readRequests = [];
|
|
483
|
+
if (isReadableStreamLocked(stream)) throw new TypeError("ReadableStream is locked");
|
|
484
|
+
readableStreamReaderGenericInitialize(reader, stream);
|
|
485
|
+
reader[kState].readRequests = [];
|
|
537
486
|
}
|
|
538
487
|
function readableStreamDefaultControllerClose(controller) {
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
}
|
|
488
|
+
if (!readableStreamDefaultControllerCanCloseOrEnqueue(controller)) return;
|
|
489
|
+
controller[kState].closeRequested = true;
|
|
490
|
+
if (!controller[kState].queue.length) {
|
|
491
|
+
readableStreamDefaultControllerClearAlgorithms(controller);
|
|
492
|
+
readableStreamClose(controller[kState].stream);
|
|
493
|
+
}
|
|
546
494
|
}
|
|
547
495
|
function readableStreamDefaultControllerEnqueue(controller, chunk) {
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
readableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
496
|
+
if (!readableStreamDefaultControllerCanCloseOrEnqueue(controller)) return;
|
|
497
|
+
const { stream } = controller[kState];
|
|
498
|
+
if (isReadableStreamLocked(stream) && readableStreamGetNumReadRequests(stream)) {
|
|
499
|
+
readableStreamFulfillReadRequest(stream, chunk, false);
|
|
500
|
+
} else {
|
|
501
|
+
try {
|
|
502
|
+
const chunkSize = controller[kState].sizeAlgorithm(chunk);
|
|
503
|
+
enqueueValueWithSize(controller, chunk, chunkSize);
|
|
504
|
+
} catch (error) {
|
|
505
|
+
readableStreamDefaultControllerError(controller, error);
|
|
506
|
+
throw error;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
readableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
563
510
|
}
|
|
564
511
|
function readableStreamDefaultControllerCanCloseOrEnqueue(controller) {
|
|
565
|
-
|
|
566
|
-
|
|
512
|
+
const { stream } = controller[kState];
|
|
513
|
+
return !controller[kState].closeRequested && stream[kState].state === "readable";
|
|
567
514
|
}
|
|
568
515
|
function readableStreamDefaultControllerGetDesiredSize(controller) {
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
default:
|
|
576
|
-
return highWaterMark - queueTotalSize;
|
|
577
|
-
}
|
|
516
|
+
const { stream, highWaterMark, queueTotalSize } = controller[kState];
|
|
517
|
+
switch (stream[kState].state) {
|
|
518
|
+
case "errored": return null;
|
|
519
|
+
case "closed": return 0;
|
|
520
|
+
default: return highWaterMark - queueTotalSize;
|
|
521
|
+
}
|
|
578
522
|
}
|
|
579
523
|
function readableStreamDefaultControllerHasBackpressure(controller) {
|
|
580
|
-
|
|
524
|
+
return !readableStreamDefaultControllerShouldCallPull(controller);
|
|
581
525
|
}
|
|
582
526
|
function readableStreamDefaultControllerShouldCallPull(controller) {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
return desiredSize !== null && desiredSize > 0;
|
|
527
|
+
const { stream } = controller[kState];
|
|
528
|
+
if (!readableStreamDefaultControllerCanCloseOrEnqueue(controller) || !controller[kState].started) return false;
|
|
529
|
+
if (isReadableStreamLocked(stream) && readableStreamGetNumReadRequests(stream)) {
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
const desiredSize = readableStreamDefaultControllerGetDesiredSize(controller);
|
|
533
|
+
return desiredSize !== null && desiredSize > 0;
|
|
591
534
|
}
|
|
592
535
|
function readableStreamDefaultControllerCallPullIfNeeded(controller) {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
}
|
|
607
|
-
},
|
|
608
|
-
(error) => readableStreamDefaultControllerError(controller, error)
|
|
609
|
-
);
|
|
536
|
+
if (!readableStreamDefaultControllerShouldCallPull(controller)) return;
|
|
537
|
+
if (controller[kState].pulling) {
|
|
538
|
+
controller[kState].pullAgain = true;
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
controller[kState].pulling = true;
|
|
542
|
+
controller[kState].pullAlgorithm(controller).then(() => {
|
|
543
|
+
controller[kState].pulling = false;
|
|
544
|
+
if (controller[kState].pullAgain) {
|
|
545
|
+
controller[kState].pullAgain = false;
|
|
546
|
+
readableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
547
|
+
}
|
|
548
|
+
}, (error) => readableStreamDefaultControllerError(controller, error));
|
|
610
549
|
}
|
|
611
550
|
function readableStreamDefaultControllerClearAlgorithms(controller) {
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
551
|
+
controller[kState].pullAlgorithm = undefined;
|
|
552
|
+
controller[kState].cancelAlgorithm = undefined;
|
|
553
|
+
controller[kState].sizeAlgorithm = undefined;
|
|
615
554
|
}
|
|
616
555
|
function readableStreamDefaultControllerError(controller, error) {
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
556
|
+
const { stream } = controller[kState];
|
|
557
|
+
if (stream[kState].state === "readable") {
|
|
558
|
+
resetQueue(controller);
|
|
559
|
+
readableStreamDefaultControllerClearAlgorithms(controller);
|
|
560
|
+
readableStreamError(stream, error);
|
|
561
|
+
}
|
|
623
562
|
}
|
|
624
563
|
function readableStreamDefaultControllerCancelSteps(controller, reason) {
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
564
|
+
resetQueue(controller);
|
|
565
|
+
const result = controller[kState].cancelAlgorithm(reason);
|
|
566
|
+
readableStreamDefaultControllerClearAlgorithms(controller);
|
|
567
|
+
return result;
|
|
629
568
|
}
|
|
630
569
|
function readableStreamDefaultControllerPullSteps(controller, readRequest) {
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
570
|
+
const { stream, queue } = controller[kState];
|
|
571
|
+
if (queue.length) {
|
|
572
|
+
const chunk = dequeueValue(controller);
|
|
573
|
+
if (controller[kState].closeRequested && !queue.length) {
|
|
574
|
+
readableStreamDefaultControllerClearAlgorithms(controller);
|
|
575
|
+
readableStreamClose(stream);
|
|
576
|
+
} else {
|
|
577
|
+
readableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
578
|
+
}
|
|
579
|
+
readRequest[kChunk](chunk);
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
readableStreamAddReadRequest(stream, readRequest);
|
|
583
|
+
readableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
645
584
|
}
|
|
646
585
|
function setupReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) {
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
},
|
|
667
|
-
(error) => readableStreamDefaultControllerError(controller, error)
|
|
668
|
-
);
|
|
586
|
+
controller[kState] = {
|
|
587
|
+
cancelAlgorithm,
|
|
588
|
+
closeRequested: false,
|
|
589
|
+
highWaterMark,
|
|
590
|
+
pullAgain: false,
|
|
591
|
+
pullAlgorithm,
|
|
592
|
+
pulling: false,
|
|
593
|
+
queue: [],
|
|
594
|
+
queueTotalSize: 0,
|
|
595
|
+
started: false,
|
|
596
|
+
sizeAlgorithm,
|
|
597
|
+
stream
|
|
598
|
+
};
|
|
599
|
+
stream[kState].controller = controller;
|
|
600
|
+
const startResult = startAlgorithm();
|
|
601
|
+
new Promise((r) => r(startResult)).then(() => {
|
|
602
|
+
controller[kState].started = true;
|
|
603
|
+
readableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
604
|
+
}, (error) => readableStreamDefaultControllerError(controller, error));
|
|
669
605
|
}
|
|
670
606
|
function setupReadableStreamDefaultControllerFromSource(stream, source, highWaterMark, sizeAlgorithm) {
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
stream,
|
|
680
|
-
controller,
|
|
681
|
-
startAlgorithm,
|
|
682
|
-
pullAlgorithm,
|
|
683
|
-
cancelAlgorithm,
|
|
684
|
-
highWaterMark,
|
|
685
|
-
sizeAlgorithm
|
|
686
|
-
);
|
|
607
|
+
const controller = new ReadableStreamDefaultController(kSkipThrow);
|
|
608
|
+
const start = source?.start;
|
|
609
|
+
const pull = source?.pull;
|
|
610
|
+
const cancel = source?.cancel;
|
|
611
|
+
const startAlgorithm = start ? start.bind(source, controller) : nonOpStart;
|
|
612
|
+
const pullAlgorithm = pull ? createPromiseCallback("source.pull", pull, source) : nonOpPull;
|
|
613
|
+
const cancelAlgorithm = cancel ? createPromiseCallback("source.cancel", cancel, source) : nonOpCancel;
|
|
614
|
+
setupReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm);
|
|
687
615
|
}
|
|
688
616
|
function createReadableStream(start, pull, cancel, highWaterMark = 1, size = () => 1) {
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
controller,
|
|
696
|
-
start,
|
|
697
|
-
pull,
|
|
698
|
-
cancel,
|
|
699
|
-
highWaterMark,
|
|
700
|
-
size
|
|
701
|
-
);
|
|
702
|
-
return stream;
|
|
617
|
+
const stream = Object.create(ReadableStream.prototype);
|
|
618
|
+
stream[kType] = "ReadableStream";
|
|
619
|
+
stream[kState] = createReadableStreamState();
|
|
620
|
+
const controller = new ReadableStreamDefaultController(kSkipThrow);
|
|
621
|
+
setupReadableStreamDefaultController(stream, controller, start, pull, cancel, highWaterMark, size);
|
|
622
|
+
return stream;
|
|
703
623
|
}
|
|
704
624
|
function readableStreamFromIterable(iterable) {
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
});
|
|
740
|
-
}
|
|
741
|
-
stream = createReadableStream(
|
|
742
|
-
startAlgorithm,
|
|
743
|
-
pullAlgorithm,
|
|
744
|
-
cancelAlgorithm,
|
|
745
|
-
0
|
|
746
|
-
);
|
|
747
|
-
return stream;
|
|
625
|
+
let stream;
|
|
626
|
+
const iteratorRecord = getIterator(iterable, "async");
|
|
627
|
+
const startAlgorithm = nonOpStart;
|
|
628
|
+
async function pullAlgorithm() {
|
|
629
|
+
const nextResult = iteratorNext(iteratorRecord);
|
|
630
|
+
const nextPromise = Promise.resolve(nextResult);
|
|
631
|
+
return nextPromise.then((iterResult) => {
|
|
632
|
+
if (typeof iterResult !== "object" || iterResult === null) {
|
|
633
|
+
throw new TypeError("The promise returned by the iterator.next() method must fulfill with an object");
|
|
634
|
+
}
|
|
635
|
+
if (iterResult.done) {
|
|
636
|
+
readableStreamDefaultControllerClose(stream[kState].controller);
|
|
637
|
+
} else {
|
|
638
|
+
readableStreamDefaultControllerEnqueue(stream[kState].controller, iterResult.value);
|
|
639
|
+
}
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
async function cancelAlgorithm(reason) {
|
|
643
|
+
const iterator = iteratorRecord.iterator;
|
|
644
|
+
const returnMethod = iterator.return;
|
|
645
|
+
if (returnMethod === undefined) {
|
|
646
|
+
return Promise.resolve();
|
|
647
|
+
}
|
|
648
|
+
const returnResult = returnMethod.call(iterator, reason);
|
|
649
|
+
const returnPromise = Promise.resolve(returnResult);
|
|
650
|
+
return returnPromise.then((iterResult) => {
|
|
651
|
+
if (typeof iterResult !== "object" || iterResult === null) {
|
|
652
|
+
throw new TypeError("The promise returned by the iterator.return() method must fulfill with an object");
|
|
653
|
+
}
|
|
654
|
+
return undefined;
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
stream = createReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0);
|
|
658
|
+
return stream;
|
|
748
659
|
}
|
|
749
660
|
function readableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) {
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
shutdown(true, error);
|
|
925
|
-
});
|
|
926
|
-
watchErrored(dest, writer[kState].close.promise, (error) => {
|
|
927
|
-
if (!preventCancel) {
|
|
928
|
-
return shutdownWithAnAction(
|
|
929
|
-
() => readableStreamCancel(source, error),
|
|
930
|
-
true,
|
|
931
|
-
error
|
|
932
|
-
);
|
|
933
|
-
}
|
|
934
|
-
shutdown(true, error);
|
|
935
|
-
});
|
|
936
|
-
watchClosed(source, reader[kState].close.promise, () => {
|
|
937
|
-
if (!preventClose) {
|
|
938
|
-
return shutdownWithAnAction(
|
|
939
|
-
() => writableStreamDefaultWriterCloseWithErrorPropagation(writer)
|
|
940
|
-
);
|
|
941
|
-
}
|
|
942
|
-
shutdown();
|
|
943
|
-
});
|
|
944
|
-
if (writableStreamCloseQueuedOrInFlight(dest) || dest[kState].state === "closed") {
|
|
945
|
-
const error = new TypeError("Destination WritableStream is closed");
|
|
946
|
-
if (!preventCancel) {
|
|
947
|
-
shutdownWithAnAction(
|
|
948
|
-
() => readableStreamCancel(source, error),
|
|
949
|
-
true,
|
|
950
|
-
error
|
|
951
|
-
);
|
|
952
|
-
} else {
|
|
953
|
-
shutdown(true, error);
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
return promise;
|
|
661
|
+
let reader;
|
|
662
|
+
let writer;
|
|
663
|
+
try {
|
|
664
|
+
reader = new ReadableStreamDefaultReader(source);
|
|
665
|
+
writer = new WritableStreamDefaultWriter(dest);
|
|
666
|
+
} catch (error) {
|
|
667
|
+
return Promise.reject(error);
|
|
668
|
+
}
|
|
669
|
+
source[kState].disturbed = true;
|
|
670
|
+
let shuttingDown = false;
|
|
671
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
672
|
+
const state = { currentWrite: Promise.resolve() };
|
|
673
|
+
let abortListener;
|
|
674
|
+
function finalize(rejected, error) {
|
|
675
|
+
writableStreamDefaultWriterRelease(writer);
|
|
676
|
+
readableStreamReaderGenericRelease(reader);
|
|
677
|
+
if (signal !== undefined && abortListener) {
|
|
678
|
+
signal.removeEventListener("abort", abortListener);
|
|
679
|
+
abortListener = undefined;
|
|
680
|
+
}
|
|
681
|
+
if (rejected) reject(error);
|
|
682
|
+
else resolve();
|
|
683
|
+
}
|
|
684
|
+
async function waitForCurrentWrite() {
|
|
685
|
+
const write = state.currentWrite;
|
|
686
|
+
await write;
|
|
687
|
+
if (write !== state.currentWrite) await waitForCurrentWrite();
|
|
688
|
+
}
|
|
689
|
+
function shutdownWithAnAction(action, rejected, originalError) {
|
|
690
|
+
if (shuttingDown) return;
|
|
691
|
+
shuttingDown = true;
|
|
692
|
+
if (dest[kState].state === "writable" && !writableStreamCloseQueuedOrInFlight(dest)) {
|
|
693
|
+
waitForCurrentWrite().then(complete, (error) => finalize(true, error));
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
complete();
|
|
697
|
+
function complete() {
|
|
698
|
+
action().then(() => finalize(!!rejected, originalError), (error) => finalize(true, error));
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
function shutdown(rejected, error) {
|
|
702
|
+
if (shuttingDown) return;
|
|
703
|
+
shuttingDown = true;
|
|
704
|
+
if (dest[kState].state === "writable" && !writableStreamCloseQueuedOrInFlight(dest)) {
|
|
705
|
+
waitForCurrentWrite().then(() => finalize(!!rejected, error), (err) => finalize(true, err));
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
finalize(!!rejected, error);
|
|
709
|
+
}
|
|
710
|
+
function abortAlgorithm() {
|
|
711
|
+
let error;
|
|
712
|
+
if (signal.reason && signal.reason.name === "AbortError") {
|
|
713
|
+
error = createAbortError();
|
|
714
|
+
} else {
|
|
715
|
+
error = signal.reason;
|
|
716
|
+
}
|
|
717
|
+
const actions = [];
|
|
718
|
+
if (!preventAbort) {
|
|
719
|
+
actions.push(() => {
|
|
720
|
+
if (dest[kState].state === "writable") return writableStreamAbort(dest, error);
|
|
721
|
+
return Promise.resolve();
|
|
722
|
+
});
|
|
723
|
+
}
|
|
724
|
+
if (!preventCancel) {
|
|
725
|
+
actions.push(() => {
|
|
726
|
+
if (source[kState].state === "readable") return readableStreamCancel(source, error);
|
|
727
|
+
return Promise.resolve();
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
shutdownWithAnAction(() => Promise.all(actions.map((action) => action())).then(() => undefined), true, error);
|
|
731
|
+
}
|
|
732
|
+
function watchErrored(stream, watchPromise, action) {
|
|
733
|
+
if (stream[kState].state === "errored") action(stream[kState].storedError);
|
|
734
|
+
else watchPromise.then(undefined, action);
|
|
735
|
+
}
|
|
736
|
+
function watchClosed(stream, watchPromise, action) {
|
|
737
|
+
if (stream[kState].state === "closed") action();
|
|
738
|
+
else watchPromise.then(action, () => {});
|
|
739
|
+
}
|
|
740
|
+
class PipeToReadRequest {
|
|
741
|
+
[kChunk](chunk) {
|
|
742
|
+
queueMicrotask(() => {
|
|
743
|
+
state.currentWrite = writableStreamDefaultWriterWrite(writer, chunk);
|
|
744
|
+
setPromiseHandled(state.currentWrite);
|
|
745
|
+
stepPromise.resolve(false);
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
[kClose]() {
|
|
749
|
+
stepPromise.resolve(true);
|
|
750
|
+
}
|
|
751
|
+
[kError](error) {
|
|
752
|
+
stepPromise.reject(error);
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
let stepPromise = {
|
|
756
|
+
resolve: null,
|
|
757
|
+
reject: null
|
|
758
|
+
};
|
|
759
|
+
async function step() {
|
|
760
|
+
if (shuttingDown) return true;
|
|
761
|
+
if (dest[kState].backpressure) {
|
|
762
|
+
await writer[kState].ready.promise;
|
|
763
|
+
if (shuttingDown) return true;
|
|
764
|
+
}
|
|
765
|
+
const controller = source[kState].controller;
|
|
766
|
+
if (source[kState].state === "readable" && isReadableStreamDefaultController(controller) && controller[kState].queue.length > 0) {
|
|
767
|
+
while (controller[kState].queue.length > 0) {
|
|
768
|
+
if (shuttingDown) return true;
|
|
769
|
+
const chunk = dequeueValue(controller);
|
|
770
|
+
if (controller[kState].closeRequested && !controller[kState].queue.length) {
|
|
771
|
+
readableStreamDefaultControllerClearAlgorithms(controller);
|
|
772
|
+
readableStreamClose(source);
|
|
773
|
+
}
|
|
774
|
+
state.currentWrite = writableStreamDefaultWriterWrite(writer, chunk);
|
|
775
|
+
setPromiseHandled(state.currentWrite);
|
|
776
|
+
if (dest[kState].backpressure) {
|
|
777
|
+
break;
|
|
778
|
+
} else if (dest[kState].state !== "writable" || writableStreamCloseQueuedOrInFlight(dest)) {
|
|
779
|
+
break;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
readableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
783
|
+
if (source[kState].state === "closed") {
|
|
784
|
+
return true;
|
|
785
|
+
}
|
|
786
|
+
return false;
|
|
787
|
+
}
|
|
788
|
+
const { promise: readPromise, resolve: readResolve, reject: readReject } = Promise.withResolvers();
|
|
789
|
+
stepPromise = {
|
|
790
|
+
resolve: readResolve,
|
|
791
|
+
reject: readReject
|
|
792
|
+
};
|
|
793
|
+
readableStreamDefaultReaderRead(reader, new PipeToReadRequest());
|
|
794
|
+
return readPromise;
|
|
795
|
+
}
|
|
796
|
+
async function run() {
|
|
797
|
+
while (!await step());
|
|
798
|
+
}
|
|
799
|
+
if (signal !== undefined) {
|
|
800
|
+
if (signal.aborted) {
|
|
801
|
+
abortAlgorithm();
|
|
802
|
+
return promise;
|
|
803
|
+
}
|
|
804
|
+
abortListener = abortAlgorithm;
|
|
805
|
+
signal.addEventListener("abort", abortListener, { once: true });
|
|
806
|
+
}
|
|
807
|
+
setPromiseHandled(run());
|
|
808
|
+
watchErrored(source, reader[kState].close.promise, (error) => {
|
|
809
|
+
if (!preventAbort) {
|
|
810
|
+
return shutdownWithAnAction(() => writableStreamAbort(dest, error), true, error);
|
|
811
|
+
}
|
|
812
|
+
shutdown(true, error);
|
|
813
|
+
});
|
|
814
|
+
watchErrored(dest, writer[kState].close.promise, (error) => {
|
|
815
|
+
if (!preventCancel) {
|
|
816
|
+
return shutdownWithAnAction(() => readableStreamCancel(source, error), true, error);
|
|
817
|
+
}
|
|
818
|
+
shutdown(true, error);
|
|
819
|
+
});
|
|
820
|
+
watchClosed(source, reader[kState].close.promise, () => {
|
|
821
|
+
if (!preventClose) {
|
|
822
|
+
return shutdownWithAnAction(() => writableStreamDefaultWriterCloseWithErrorPropagation(writer));
|
|
823
|
+
}
|
|
824
|
+
shutdown();
|
|
825
|
+
});
|
|
826
|
+
if (writableStreamCloseQueuedOrInFlight(dest) || dest[kState].state === "closed") {
|
|
827
|
+
const error = new TypeError("Destination WritableStream is closed");
|
|
828
|
+
if (!preventCancel) {
|
|
829
|
+
shutdownWithAnAction(() => readableStreamCancel(source, error), true, error);
|
|
830
|
+
} else {
|
|
831
|
+
shutdown(true, error);
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
return promise;
|
|
957
835
|
}
|
|
958
836
|
function readableStreamDefaultTee(stream, cloneForBranch2) {
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
reader[kState].close.promise.then(
|
|
1035
|
-
void 0,
|
|
1036
|
-
(error) => {
|
|
1037
|
-
readableStreamDefaultControllerError(branch1[kState].controller, error);
|
|
1038
|
-
readableStreamDefaultControllerError(branch2[kState].controller, error);
|
|
1039
|
-
if (!canceled1 || !canceled2)
|
|
1040
|
-
cancelPromise.resolve(void 0);
|
|
1041
|
-
}
|
|
1042
|
-
);
|
|
1043
|
-
return [branch1, branch2];
|
|
1044
|
-
}
|
|
1045
|
-
export {
|
|
1046
|
-
ReadableStream,
|
|
1047
|
-
ReadableStreamDefaultController,
|
|
1048
|
-
ReadableStreamDefaultReader,
|
|
1049
|
-
createReadableStream,
|
|
1050
|
-
isReadableStream,
|
|
1051
|
-
isReadableStreamDefaultController,
|
|
1052
|
-
isReadableStreamDefaultReader,
|
|
1053
|
-
isReadableStreamLocked,
|
|
1054
|
-
readableStreamCancel,
|
|
1055
|
-
readableStreamClose,
|
|
1056
|
-
readableStreamDefaultControllerCanCloseOrEnqueue,
|
|
1057
|
-
readableStreamDefaultControllerClose,
|
|
1058
|
-
readableStreamDefaultControllerEnqueue,
|
|
1059
|
-
readableStreamDefaultControllerError,
|
|
1060
|
-
readableStreamDefaultControllerGetDesiredSize,
|
|
1061
|
-
readableStreamDefaultControllerHasBackpressure,
|
|
1062
|
-
readableStreamError,
|
|
1063
|
-
setupReadableStreamDefaultController
|
|
1064
|
-
};
|
|
837
|
+
const reader = new ReadableStreamDefaultReader(stream);
|
|
838
|
+
let reading = false;
|
|
839
|
+
let canceled1 = false;
|
|
840
|
+
let canceled2 = false;
|
|
841
|
+
let reason1;
|
|
842
|
+
let reason2;
|
|
843
|
+
let branch1;
|
|
844
|
+
let branch2;
|
|
845
|
+
const cancelPromise = Promise.withResolvers();
|
|
846
|
+
async function pullAlgorithm() {
|
|
847
|
+
if (reading) return;
|
|
848
|
+
reading = true;
|
|
849
|
+
const readRequest = {
|
|
850
|
+
[kChunk](value) {
|
|
851
|
+
queueMicrotask(() => {
|
|
852
|
+
reading = false;
|
|
853
|
+
const value1 = value;
|
|
854
|
+
let value2 = value;
|
|
855
|
+
if (!canceled2 && cloneForBranch2) {
|
|
856
|
+
try {
|
|
857
|
+
value2 = structuredClone(value2);
|
|
858
|
+
} catch {}
|
|
859
|
+
}
|
|
860
|
+
if (!canceled1) {
|
|
861
|
+
readableStreamDefaultControllerEnqueue(branch1[kState].controller, value1);
|
|
862
|
+
}
|
|
863
|
+
if (!canceled2) {
|
|
864
|
+
readableStreamDefaultControllerEnqueue(branch2[kState].controller, value2);
|
|
865
|
+
}
|
|
866
|
+
});
|
|
867
|
+
},
|
|
868
|
+
[kClose]() {
|
|
869
|
+
queueMicrotask(() => {
|
|
870
|
+
reading = false;
|
|
871
|
+
if (!canceled1) readableStreamDefaultControllerClose(branch1[kState].controller);
|
|
872
|
+
if (!canceled2) readableStreamDefaultControllerClose(branch2[kState].controller);
|
|
873
|
+
if (!canceled1 || !canceled2) cancelPromise.resolve(undefined);
|
|
874
|
+
});
|
|
875
|
+
},
|
|
876
|
+
[kError]() {
|
|
877
|
+
reading = false;
|
|
878
|
+
}
|
|
879
|
+
};
|
|
880
|
+
readableStreamDefaultReaderRead(reader, readRequest);
|
|
881
|
+
}
|
|
882
|
+
function cancel1Algorithm(reason) {
|
|
883
|
+
canceled1 = true;
|
|
884
|
+
reason1 = reason;
|
|
885
|
+
if (canceled2) {
|
|
886
|
+
const compositeReason = [reason1, reason2];
|
|
887
|
+
cancelPromise.resolve(readableStreamCancel(stream, compositeReason));
|
|
888
|
+
}
|
|
889
|
+
return cancelPromise.promise;
|
|
890
|
+
}
|
|
891
|
+
function cancel2Algorithm(reason) {
|
|
892
|
+
canceled2 = true;
|
|
893
|
+
reason2 = reason;
|
|
894
|
+
if (canceled1) {
|
|
895
|
+
const compositeReason = [reason1, reason2];
|
|
896
|
+
cancelPromise.resolve(readableStreamCancel(stream, compositeReason));
|
|
897
|
+
}
|
|
898
|
+
return cancelPromise.promise;
|
|
899
|
+
}
|
|
900
|
+
branch1 = createReadableStream(nonOpStart, pullAlgorithm, cancel1Algorithm);
|
|
901
|
+
branch2 = createReadableStream(nonOpStart, pullAlgorithm, cancel2Algorithm);
|
|
902
|
+
reader[kState].close.promise.then(undefined, (error) => {
|
|
903
|
+
readableStreamDefaultControllerError(branch1[kState].controller, error);
|
|
904
|
+
readableStreamDefaultControllerError(branch2[kState].controller, error);
|
|
905
|
+
if (!canceled1 || !canceled2) cancelPromise.resolve(undefined);
|
|
906
|
+
});
|
|
907
|
+
return [branch1, branch2];
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
//#endregion
|
|
911
|
+
export { ReadableStream, ReadableStreamDefaultController, ReadableStreamDefaultReader, createReadableStream, isReadableStream, isReadableStreamDefaultController, isReadableStreamDefaultReader, isReadableStreamLocked, readableStreamCancel, readableStreamClose, readableStreamDefaultControllerCanCloseOrEnqueue, readableStreamDefaultControllerClose, readableStreamDefaultControllerEnqueue, readableStreamDefaultControllerError, readableStreamDefaultControllerGetDesiredSize, readableStreamDefaultControllerHasBackpressure, readableStreamError, setupReadableStreamDefaultController };
|