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