@gjsify/web-streams 0.3.15 → 0.3.17

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.
@@ -1,676 +1 @@
1
- import { createPromiseCallback, dequeueValue, enqueueValueWithSize, extractHighWaterMark, extractSizeAlgorithm, isBrandCheck, kState, kType, nonOpCancel, nonOpStart, nonOpWrite, peekQueueValue, resetQueue, setPromiseHandled } from "./util.js";
2
-
3
- //#region src/writable-stream.ts
4
- const _AbortController = typeof globalThis.AbortController === "function" ? globalThis.AbortController : class AbortControllerShim {
5
- signal = {
6
- aborted: false,
7
- reason: undefined,
8
- addEventListener() {},
9
- removeEventListener() {}
10
- };
11
- abort(reason) {
12
- this.signal.aborted = true;
13
- this.signal.reason = reason;
14
- }
15
- };
16
- const kAbort = Symbol("kAbort");
17
- const kCloseSentinel = Symbol("kCloseSentinel");
18
- const kError = Symbol("kError");
19
- const kSkipThrow = Symbol("kSkipThrow");
20
- var WritableStream = class {
21
- [kType] = "WritableStream";
22
- [kState];
23
- constructor(sink = {}, strategy = {}) {
24
- if (sink != null && typeof sink !== "object") {
25
- throw new TypeError("sink must be an object");
26
- }
27
- if (strategy != null && typeof strategy !== "object") {
28
- throw new TypeError("strategy must be an object");
29
- }
30
- const type = sink?.type;
31
- if (type !== undefined) {
32
- throw new RangeError(`Invalid type: ${type}`);
33
- }
34
- this[kState] = createWritableStreamState();
35
- const size = extractSizeAlgorithm(strategy?.size);
36
- const highWaterMark = extractHighWaterMark(strategy?.highWaterMark, 1);
37
- setupWritableStreamDefaultControllerFromSink(this, sink, highWaterMark, size);
38
- }
39
- get locked() {
40
- if (!isWritableStream(this)) throw new TypeError("Invalid this");
41
- return isWritableStreamLocked(this);
42
- }
43
- abort(reason) {
44
- if (!isWritableStream(this)) return Promise.reject(new TypeError("Invalid this"));
45
- if (isWritableStreamLocked(this)) {
46
- return Promise.reject(new TypeError("WritableStream is locked"));
47
- }
48
- return writableStreamAbort(this, reason);
49
- }
50
- close() {
51
- if (!isWritableStream(this)) return Promise.reject(new TypeError("Invalid this"));
52
- if (isWritableStreamLocked(this)) {
53
- return Promise.reject(new TypeError("WritableStream is locked"));
54
- }
55
- if (writableStreamCloseQueuedOrInFlight(this)) {
56
- return Promise.reject(new TypeError("Failure closing WritableStream"));
57
- }
58
- return writableStreamClose(this);
59
- }
60
- getWriter() {
61
- if (!isWritableStream(this)) throw new TypeError("Invalid this");
62
- return new WritableStreamDefaultWriter(this);
63
- }
64
- get [Symbol.toStringTag]() {
65
- return "WritableStream";
66
- }
67
- };
68
- var WritableStreamDefaultWriter = class {
69
- [kType] = "WritableStreamDefaultWriter";
70
- [kState];
71
- constructor(stream) {
72
- if (!isWritableStream(stream)) {
73
- throw new TypeError("Expected a WritableStream");
74
- }
75
- this[kState] = {
76
- stream: undefined,
77
- close: {
78
- promise: undefined,
79
- resolve: undefined,
80
- reject: undefined
81
- },
82
- ready: {
83
- promise: undefined,
84
- resolve: undefined,
85
- reject: undefined
86
- }
87
- };
88
- setupWritableStreamDefaultWriter(this, stream);
89
- }
90
- get closed() {
91
- if (!isWritableStreamDefaultWriter(this)) return Promise.reject(new TypeError("Invalid this"));
92
- return this[kState].close.promise;
93
- }
94
- get desiredSize() {
95
- if (!isWritableStreamDefaultWriter(this)) throw new TypeError("Invalid this");
96
- if (this[kState].stream === undefined) {
97
- throw new TypeError("Writer is not bound to a WritableStream");
98
- }
99
- return writableStreamDefaultWriterGetDesiredSize(this);
100
- }
101
- get ready() {
102
- if (!isWritableStreamDefaultWriter(this)) return Promise.reject(new TypeError("Invalid this"));
103
- return this[kState].ready.promise;
104
- }
105
- abort(reason) {
106
- if (!isWritableStreamDefaultWriter(this)) return Promise.reject(new TypeError("Invalid this"));
107
- if (this[kState].stream === undefined) {
108
- return Promise.reject(new TypeError("Writer is not bound to a WritableStream"));
109
- }
110
- return writableStreamDefaultWriterAbort(this, reason);
111
- }
112
- close() {
113
- if (!isWritableStreamDefaultWriter(this)) return Promise.reject(new TypeError("Invalid this"));
114
- const { stream } = this[kState];
115
- if (stream === undefined) {
116
- return Promise.reject(new TypeError("Writer is not bound to a WritableStream"));
117
- }
118
- if (writableStreamCloseQueuedOrInFlight(stream)) {
119
- return Promise.reject(new TypeError("Failure to close WritableStream"));
120
- }
121
- return writableStreamDefaultWriterClose(this);
122
- }
123
- releaseLock() {
124
- if (!isWritableStreamDefaultWriter(this)) throw new TypeError("Invalid this");
125
- const { stream } = this[kState];
126
- if (stream === undefined) return;
127
- writableStreamDefaultWriterRelease(this);
128
- }
129
- write(chunk) {
130
- if (!isWritableStreamDefaultWriter(this)) return Promise.reject(new TypeError("Invalid this"));
131
- if (this[kState].stream === undefined) {
132
- return Promise.reject(new TypeError("Writer is not bound to a WritableStream"));
133
- }
134
- return writableStreamDefaultWriterWrite(this, chunk);
135
- }
136
- get [Symbol.toStringTag]() {
137
- return "WritableStreamDefaultWriter";
138
- }
139
- };
140
- var WritableStreamDefaultController = class {
141
- [kType] = "WritableStreamDefaultController";
142
- [kState];
143
- constructor(skipThrowSymbol) {
144
- if (skipThrowSymbol !== kSkipThrow) {
145
- throw new TypeError("Illegal constructor");
146
- }
147
- }
148
- [kAbort](reason) {
149
- const result = this[kState].abortAlgorithm(reason);
150
- writableStreamDefaultControllerClearAlgorithms(this);
151
- return result;
152
- }
153
- [kError]() {
154
- resetQueue(this);
155
- }
156
- get signal() {
157
- if (!isWritableStreamDefaultController(this)) throw new TypeError("Invalid this");
158
- return this[kState].abortController.signal;
159
- }
160
- error(error) {
161
- if (!isWritableStreamDefaultController(this)) throw new TypeError("Invalid this");
162
- if (this[kState].stream[kState].state !== "writable") return;
163
- writableStreamDefaultControllerError(this, error);
164
- }
165
- get [Symbol.toStringTag]() {
166
- return "WritableStreamDefaultController";
167
- }
168
- };
169
- const isWritableStream = isBrandCheck("WritableStream");
170
- const isWritableStreamDefaultWriter = isBrandCheck("WritableStreamDefaultWriter");
171
- const isWritableStreamDefaultController = isBrandCheck("WritableStreamDefaultController");
172
- function createEmptyPromiseRecord() {
173
- return {
174
- promise: undefined,
175
- resolve: undefined,
176
- reject: undefined
177
- };
178
- }
179
- function createWritableStreamState() {
180
- return {
181
- close: Promise.withResolvers(),
182
- closeRequest: createEmptyPromiseRecord(),
183
- inFlightWriteRequest: createEmptyPromiseRecord(),
184
- inFlightCloseRequest: createEmptyPromiseRecord(),
185
- pendingAbortRequest: {
186
- abort: createEmptyPromiseRecord(),
187
- reason: undefined,
188
- wasAlreadyErroring: false
189
- },
190
- backpressure: false,
191
- controller: undefined,
192
- state: "writable",
193
- storedError: undefined,
194
- writeRequests: [],
195
- writer: undefined
196
- };
197
- }
198
- function isWritableStreamLocked(stream) {
199
- return stream[kState].writer !== undefined;
200
- }
201
- function setupWritableStreamDefaultWriter(writer, stream) {
202
- if (isWritableStreamLocked(stream)) {
203
- throw new TypeError("WritableStream is locked");
204
- }
205
- writer[kState].stream = stream;
206
- stream[kState].writer = writer;
207
- switch (stream[kState].state) {
208
- case "writable":
209
- if (!writableStreamCloseQueuedOrInFlight(stream) && stream[kState].backpressure) {
210
- writer[kState].ready = Promise.withResolvers();
211
- } else {
212
- writer[kState].ready = {
213
- promise: Promise.resolve(),
214
- resolve: undefined,
215
- reject: undefined
216
- };
217
- }
218
- writer[kState].close = Promise.withResolvers();
219
- break;
220
- case "erroring":
221
- writer[kState].ready = {
222
- promise: Promise.reject(stream[kState].storedError),
223
- resolve: undefined,
224
- reject: undefined
225
- };
226
- setPromiseHandled(writer[kState].ready.promise);
227
- writer[kState].close = Promise.withResolvers();
228
- break;
229
- case "closed":
230
- writer[kState].ready = {
231
- promise: Promise.resolve(),
232
- resolve: undefined,
233
- reject: undefined
234
- };
235
- writer[kState].close = {
236
- promise: Promise.resolve(),
237
- resolve: undefined,
238
- reject: undefined
239
- };
240
- break;
241
- default:
242
- writer[kState].ready = {
243
- promise: Promise.reject(stream[kState].storedError),
244
- resolve: undefined,
245
- reject: undefined
246
- };
247
- writer[kState].close = {
248
- promise: Promise.reject(stream[kState].storedError),
249
- resolve: undefined,
250
- reject: undefined
251
- };
252
- setPromiseHandled(writer[kState].ready.promise);
253
- setPromiseHandled(writer[kState].close.promise);
254
- }
255
- }
256
- function writableStreamAbort(stream, reason) {
257
- const { state, controller } = stream[kState];
258
- if (state === "closed" || state === "errored") return Promise.resolve();
259
- controller[kState].abortController.abort(reason);
260
- if (stream[kState].pendingAbortRequest.abort.promise !== undefined) {
261
- return stream[kState].pendingAbortRequest.abort.promise;
262
- }
263
- let wasAlreadyErroring = false;
264
- if (state === "erroring") {
265
- wasAlreadyErroring = true;
266
- reason = undefined;
267
- }
268
- const abort = Promise.withResolvers();
269
- stream[kState].pendingAbortRequest = {
270
- abort,
271
- reason,
272
- wasAlreadyErroring
273
- };
274
- if (!wasAlreadyErroring) writableStreamStartErroring(stream, reason);
275
- return abort.promise;
276
- }
277
- function writableStreamClose(stream) {
278
- const { state, writer, backpressure, controller } = stream[kState];
279
- if (state === "closed" || state === "errored") {
280
- return Promise.reject(new TypeError("WritableStream is closed"));
281
- }
282
- stream[kState].closeRequest = Promise.withResolvers();
283
- const { promise } = stream[kState].closeRequest;
284
- if (writer !== undefined && backpressure && state === "writable") {
285
- writer[kState].ready.resolve?.();
286
- }
287
- writableStreamDefaultControllerClose(controller);
288
- return promise;
289
- }
290
- function writableStreamUpdateBackpressure(stream, backpressure) {
291
- const { writer } = stream[kState];
292
- if (writer !== undefined && stream[kState].backpressure !== backpressure) {
293
- if (backpressure) {
294
- writer[kState].ready = Promise.withResolvers();
295
- } else {
296
- writer[kState].ready.resolve?.();
297
- }
298
- }
299
- stream[kState].backpressure = backpressure;
300
- }
301
- function writableStreamStartErroring(stream, reason) {
302
- const { controller, writer } = stream[kState];
303
- stream[kState].state = "erroring";
304
- stream[kState].storedError = reason;
305
- if (writer !== undefined) {
306
- writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);
307
- }
308
- if (!writableStreamHasOperationMarkedInFlight(stream) && controller[kState].started) {
309
- writableStreamFinishErroring(stream);
310
- }
311
- }
312
- function writableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {
313
- if (stream[kState].closeRequest.promise !== undefined) {
314
- stream[kState].closeRequest.reject?.(stream[kState].storedError);
315
- stream[kState].closeRequest = {
316
- promise: undefined,
317
- resolve: undefined,
318
- reject: undefined
319
- };
320
- }
321
- setPromiseHandled(stream[kState].close.promise);
322
- stream[kState].close.reject?.(stream[kState].storedError);
323
- const { writer } = stream[kState];
324
- if (writer !== undefined) {
325
- setPromiseHandled(writer[kState].close.promise);
326
- writer[kState].close.reject?.(stream[kState].storedError);
327
- }
328
- }
329
- function writableStreamMarkFirstWriteRequestInFlight(stream) {
330
- const writeRequest = stream[kState].writeRequests.shift();
331
- stream[kState].inFlightWriteRequest = writeRequest;
332
- }
333
- function writableStreamMarkCloseRequestInFlight(stream) {
334
- stream[kState].inFlightCloseRequest = stream[kState].closeRequest;
335
- stream[kState].closeRequest = {
336
- promise: undefined,
337
- resolve: undefined,
338
- reject: undefined
339
- };
340
- }
341
- function writableStreamHasOperationMarkedInFlight(stream) {
342
- return stream[kState].inFlightWriteRequest.promise !== undefined || stream[kState].inFlightCloseRequest.promise !== undefined;
343
- }
344
- function writableStreamFinishInFlightWriteWithError(stream, error) {
345
- stream[kState].inFlightWriteRequest.reject?.(error);
346
- stream[kState].inFlightWriteRequest = {
347
- promise: undefined,
348
- resolve: undefined,
349
- reject: undefined
350
- };
351
- writableStreamDealWithRejection(stream, error);
352
- }
353
- function writableStreamFinishInFlightWrite(stream) {
354
- stream[kState].inFlightWriteRequest.resolve?.();
355
- stream[kState].inFlightWriteRequest = {
356
- promise: undefined,
357
- resolve: undefined,
358
- reject: undefined
359
- };
360
- }
361
- function writableStreamFinishInFlightCloseWithError(stream, error) {
362
- stream[kState].inFlightCloseRequest.reject?.(error);
363
- stream[kState].inFlightCloseRequest = {
364
- promise: undefined,
365
- resolve: undefined,
366
- reject: undefined
367
- };
368
- if (stream[kState].pendingAbortRequest.abort.promise !== undefined) {
369
- stream[kState].pendingAbortRequest.abort.reject?.(error);
370
- stream[kState].pendingAbortRequest = {
371
- abort: {
372
- promise: undefined,
373
- resolve: undefined,
374
- reject: undefined
375
- },
376
- reason: undefined,
377
- wasAlreadyErroring: false
378
- };
379
- }
380
- writableStreamDealWithRejection(stream, error);
381
- }
382
- function writableStreamFinishInFlightClose(stream) {
383
- stream[kState].inFlightCloseRequest.resolve?.();
384
- stream[kState].inFlightCloseRequest = {
385
- promise: undefined,
386
- resolve: undefined,
387
- reject: undefined
388
- };
389
- if (stream[kState].state === "erroring") {
390
- stream[kState].storedError = undefined;
391
- if (stream[kState].pendingAbortRequest.abort.promise !== undefined) {
392
- stream[kState].pendingAbortRequest.abort.resolve?.();
393
- stream[kState].pendingAbortRequest = {
394
- abort: {
395
- promise: undefined,
396
- resolve: undefined,
397
- reject: undefined
398
- },
399
- reason: undefined,
400
- wasAlreadyErroring: false
401
- };
402
- }
403
- }
404
- stream[kState].state = "closed";
405
- if (stream[kState].writer !== undefined) {
406
- stream[kState].writer[kState].close.resolve?.();
407
- }
408
- stream[kState].close.resolve?.();
409
- }
410
- function writableStreamFinishErroring(stream) {
411
- stream[kState].state = "errored";
412
- stream[kState].controller[kError]();
413
- const storedError = stream[kState].storedError;
414
- for (const req of stream[kState].writeRequests) {
415
- req.reject?.(storedError);
416
- }
417
- stream[kState].writeRequests = [];
418
- if (stream[kState].pendingAbortRequest.abort.promise === undefined) {
419
- writableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
420
- return;
421
- }
422
- const abortRequest = stream[kState].pendingAbortRequest;
423
- stream[kState].pendingAbortRequest = {
424
- abort: {
425
- promise: undefined,
426
- resolve: undefined,
427
- reject: undefined
428
- },
429
- reason: undefined,
430
- wasAlreadyErroring: false
431
- };
432
- if (abortRequest.wasAlreadyErroring) {
433
- abortRequest.abort.reject?.(storedError);
434
- writableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
435
- return;
436
- }
437
- stream[kState].controller[kAbort](abortRequest.reason).then(() => {
438
- abortRequest.abort.resolve?.();
439
- writableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
440
- }, (error) => {
441
- abortRequest.abort.reject?.(error);
442
- writableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
443
- });
444
- }
445
- function writableStreamDealWithRejection(stream, error) {
446
- if (stream[kState].state === "writable") {
447
- writableStreamStartErroring(stream, error);
448
- return;
449
- }
450
- writableStreamFinishErroring(stream);
451
- }
452
- function writableStreamCloseQueuedOrInFlight(stream) {
453
- return stream[kState].closeRequest.promise !== undefined || stream[kState].inFlightCloseRequest.promise !== undefined;
454
- }
455
- function writableStreamAddWriteRequest(stream) {
456
- const { promise, resolve, reject } = Promise.withResolvers();
457
- stream[kState].writeRequests.push({
458
- promise,
459
- resolve,
460
- reject
461
- });
462
- return promise;
463
- }
464
- function writableStreamDefaultWriterWrite(writer, chunk) {
465
- const { stream } = writer[kState];
466
- const { controller } = stream[kState];
467
- const chunkSize = writableStreamDefaultControllerGetChunkSize(controller, chunk);
468
- if (stream !== writer[kState].stream) {
469
- return Promise.reject(new TypeError("Mismatched WritableStreams"));
470
- }
471
- const { state } = stream[kState];
472
- if (state === "errored") return Promise.reject(stream[kState].storedError);
473
- if (writableStreamCloseQueuedOrInFlight(stream) || state === "closed") {
474
- return Promise.reject(new TypeError("WritableStream is closed"));
475
- }
476
- if (state === "erroring") return Promise.reject(stream[kState].storedError);
477
- const promise = writableStreamAddWriteRequest(stream);
478
- writableStreamDefaultControllerWrite(controller, chunk, chunkSize);
479
- return promise;
480
- }
481
- function writableStreamDefaultWriterRelease(writer) {
482
- const { stream } = writer[kState];
483
- const releasedError = new TypeError("Writer has been released");
484
- writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
485
- writableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
486
- stream[kState].writer = undefined;
487
- writer[kState].stream = undefined;
488
- }
489
- function writableStreamDefaultWriterGetDesiredSize(writer) {
490
- const { stream } = writer[kState];
491
- switch (stream[kState].state) {
492
- case "errored":
493
- case "erroring": return null;
494
- case "closed": return 0;
495
- }
496
- return writableStreamDefaultControllerGetDesiredSize(stream[kState].controller);
497
- }
498
- function writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {
499
- if (writer[kState].ready.reject) {
500
- writer[kState].ready.reject(error);
501
- writer[kState].ready.resolve = undefined;
502
- writer[kState].ready.reject = undefined;
503
- } else {
504
- writer[kState].ready = {
505
- promise: Promise.reject(error),
506
- resolve: undefined,
507
- reject: undefined
508
- };
509
- }
510
- setPromiseHandled(writer[kState].ready.promise);
511
- }
512
- function writableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {
513
- if (writer[kState].close.reject) {
514
- writer[kState].close.reject(error);
515
- writer[kState].close.resolve = undefined;
516
- writer[kState].close.reject = undefined;
517
- } else {
518
- writer[kState].close = {
519
- promise: Promise.reject(error),
520
- resolve: undefined,
521
- reject: undefined
522
- };
523
- }
524
- setPromiseHandled(writer[kState].close.promise);
525
- }
526
- function writableStreamDefaultWriterCloseWithErrorPropagation(writer) {
527
- const { stream } = writer[kState];
528
- const { state } = stream[kState];
529
- if (writableStreamCloseQueuedOrInFlight(stream) || state === "closed") {
530
- return Promise.resolve();
531
- }
532
- if (state === "errored") return Promise.reject(stream[kState].storedError);
533
- return writableStreamDefaultWriterClose(writer);
534
- }
535
- function writableStreamDefaultWriterClose(writer) {
536
- return writableStreamClose(writer[kState].stream);
537
- }
538
- function writableStreamDefaultWriterAbort(writer, reason) {
539
- return writableStreamAbort(writer[kState].stream, reason);
540
- }
541
- function writableStreamDefaultControllerWrite(controller, chunk, chunkSize) {
542
- try {
543
- enqueueValueWithSize(controller, chunk, chunkSize);
544
- } catch (error) {
545
- writableStreamDefaultControllerErrorIfNeeded(controller, error);
546
- return;
547
- }
548
- const { stream } = controller[kState];
549
- if (!writableStreamCloseQueuedOrInFlight(stream) && stream[kState].state === "writable") {
550
- writableStreamUpdateBackpressure(stream, writableStreamDefaultControllerGetBackpressure(controller));
551
- }
552
- writableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
553
- }
554
- function writableStreamDefaultControllerProcessWrite(controller, chunk) {
555
- const { stream, writeAlgorithm } = controller[kState];
556
- writableStreamMarkFirstWriteRequestInFlight(stream);
557
- writeAlgorithm(chunk, controller).then(() => {
558
- writableStreamFinishInFlightWrite(stream);
559
- const { state } = stream[kState];
560
- dequeueValue(controller);
561
- if (!writableStreamCloseQueuedOrInFlight(stream) && state === "writable") {
562
- writableStreamUpdateBackpressure(stream, writableStreamDefaultControllerGetBackpressure(controller));
563
- }
564
- writableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
565
- }, (error) => {
566
- if (stream[kState].state === "writable") {
567
- writableStreamDefaultControllerClearAlgorithms(controller);
568
- }
569
- writableStreamFinishInFlightWriteWithError(stream, error);
570
- });
571
- }
572
- function writableStreamDefaultControllerProcessClose(controller) {
573
- const { closeAlgorithm, queue, stream } = controller[kState];
574
- writableStreamMarkCloseRequestInFlight(stream);
575
- dequeueValue(controller);
576
- const sinkClosePromise = closeAlgorithm();
577
- writableStreamDefaultControllerClearAlgorithms(controller);
578
- sinkClosePromise.then(() => writableStreamFinishInFlightClose(stream), (error) => writableStreamFinishInFlightCloseWithError(stream, error));
579
- }
580
- function writableStreamDefaultControllerGetDesiredSize(controller) {
581
- return controller[kState].highWaterMark - controller[kState].queueTotalSize;
582
- }
583
- function writableStreamDefaultControllerGetChunkSize(controller, chunk) {
584
- const { stream, sizeAlgorithm } = controller[kState];
585
- if (sizeAlgorithm === undefined) return 1;
586
- try {
587
- return sizeAlgorithm(chunk);
588
- } catch (error) {
589
- writableStreamDefaultControllerErrorIfNeeded(controller, error);
590
- return 1;
591
- }
592
- }
593
- function writableStreamDefaultControllerErrorIfNeeded(controller, error) {
594
- if (controller[kState].stream[kState].state === "writable") {
595
- writableStreamDefaultControllerError(controller, error);
596
- }
597
- }
598
- function writableStreamDefaultControllerError(controller, error) {
599
- writableStreamDefaultControllerClearAlgorithms(controller);
600
- writableStreamStartErroring(controller[kState].stream, error);
601
- }
602
- function writableStreamDefaultControllerClose(controller) {
603
- enqueueValueWithSize(controller, kCloseSentinel, 0);
604
- writableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
605
- }
606
- function writableStreamDefaultControllerClearAlgorithms(controller) {
607
- controller[kState].writeAlgorithm = undefined;
608
- controller[kState].closeAlgorithm = undefined;
609
- controller[kState].abortAlgorithm = undefined;
610
- controller[kState].sizeAlgorithm = undefined;
611
- }
612
- function writableStreamDefaultControllerGetBackpressure(controller) {
613
- return writableStreamDefaultControllerGetDesiredSize(controller) <= 0;
614
- }
615
- function writableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {
616
- const { queue, started, stream } = controller[kState];
617
- if (!started || stream[kState].inFlightWriteRequest.promise !== undefined) return;
618
- if (stream[kState].state === "erroring") {
619
- writableStreamFinishErroring(stream);
620
- return;
621
- }
622
- if (!queue.length) return;
623
- const value = peekQueueValue(controller);
624
- if (value === kCloseSentinel) {
625
- writableStreamDefaultControllerProcessClose(controller);
626
- } else {
627
- writableStreamDefaultControllerProcessWrite(controller, value);
628
- }
629
- }
630
- function setupWritableStreamDefaultControllerFromSink(stream, sink, highWaterMark, sizeAlgorithm) {
631
- const controller = new WritableStreamDefaultController(kSkipThrow);
632
- const start = sink?.start;
633
- const write = sink?.write;
634
- const close = sink?.close;
635
- const abort = sink?.abort;
636
- const startAlgorithm = start ? start.bind(sink, controller) : nonOpStart;
637
- const writeAlgorithm = write ? createPromiseCallback("sink.write", write, sink) : nonOpWrite;
638
- const closeAlgorithm = close ? createPromiseCallback("sink.close", close, sink) : nonOpCancel;
639
- const abortAlgorithm = abort ? createPromiseCallback("sink.abort", abort, sink) : nonOpCancel;
640
- setupWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm);
641
- }
642
- function setupWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) {
643
- controller[kState] = {
644
- abortAlgorithm,
645
- closeAlgorithm,
646
- highWaterMark,
647
- queue: [],
648
- queueTotalSize: 0,
649
- abortController: new _AbortController(),
650
- sizeAlgorithm,
651
- started: false,
652
- stream,
653
- writeAlgorithm
654
- };
655
- stream[kState].controller = controller;
656
- writableStreamUpdateBackpressure(stream, writableStreamDefaultControllerGetBackpressure(controller));
657
- const startResult = startAlgorithm();
658
- new Promise((r) => r(startResult)).then(() => {
659
- controller[kState].started = true;
660
- writableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
661
- }, (error) => {
662
- controller[kState].started = true;
663
- writableStreamDealWithRejection(stream, error);
664
- });
665
- }
666
- function createWritableStream(start, write, close, abort, highWaterMark = 1, size = () => 1) {
667
- const stream = Object.create(WritableStream.prototype);
668
- stream[kType] = "WritableStream";
669
- stream[kState] = createWritableStreamState();
670
- const controller = new WritableStreamDefaultController(kSkipThrow);
671
- setupWritableStreamDefaultController(stream, controller, start, write, close, abort, highWaterMark, size);
672
- return stream;
673
- }
674
-
675
- //#endregion
676
- export { WritableStream, WritableStreamDefaultController, WritableStreamDefaultWriter, createWritableStream, isWritableStream, isWritableStreamDefaultController, isWritableStreamDefaultWriter, isWritableStreamLocked, writableStreamAbort, writableStreamClose, writableStreamCloseQueuedOrInFlight, writableStreamDefaultControllerErrorIfNeeded, writableStreamDefaultWriterCloseWithErrorPropagation, writableStreamDefaultWriterRelease, writableStreamDefaultWriterWrite };
1
+ import{createPromiseCallback as e,dequeueValue as t,enqueueValueWithSize as n,extractHighWaterMark as r,extractSizeAlgorithm as i,isBrandCheck as a,kState as o,kType as s,nonOpCancel as c,nonOpStart as l,nonOpWrite as ee,peekQueueValue as u,resetQueue as d,setPromiseHandled as f}from"./util.js";const te=typeof globalThis.AbortController==`function`?globalThis.AbortController:class{signal={aborted:!1,reason:void 0,addEventListener(){},removeEventListener(){}};abort(e){this.signal.aborted=!0,this.signal.reason=e}},p=Symbol(`kAbort`),m=Symbol(`kCloseSentinel`),h=Symbol(`kError`),g=Symbol(`kSkipThrow`);var _=class{[s]=`WritableStream`;[o];constructor(e={},t={}){if(e!=null&&typeof e!=`object`)throw TypeError(`sink must be an object`);if(t!=null&&typeof t!=`object`)throw TypeError(`strategy must be an object`);let n=e?.type;if(n!==void 0)throw RangeError(`Invalid type: ${n}`);this[o]=w();let a=i(t?.size),s=r(t?.highWaterMark,1);de(this,e,s,a)}get locked(){if(!b(this))throw TypeError(`Invalid this`);return T(this)}abort(e){return b(this)?T(this)?Promise.reject(TypeError(`WritableStream is locked`)):E(this,e):Promise.reject(TypeError(`Invalid this`))}close(){return b(this)?T(this)?Promise.reject(TypeError(`WritableStream is locked`)):I(this)?Promise.reject(TypeError(`Failure closing WritableStream`)):D(this):Promise.reject(TypeError(`Invalid this`))}getWriter(){if(!b(this))throw TypeError(`Invalid this`);return new v(this)}get[Symbol.toStringTag](){return`WritableStream`}},v=class{[s]=`WritableStreamDefaultWriter`;[o];constructor(e){if(!b(e))throw TypeError(`Expected a WritableStream`);this[o]={stream:void 0,close:{promise:void 0,resolve:void 0,reject:void 0},ready:{promise:void 0,resolve:void 0,reject:void 0}},ne(this,e)}get closed(){return x(this)?this[o].close.promise:Promise.reject(TypeError(`Invalid this`))}get desiredSize(){if(!x(this))throw TypeError(`Invalid this`);if(this[o].stream===void 0)throw TypeError(`Writer is not bound to a WritableStream`);return z(this)}get ready(){return x(this)?this[o].ready.promise:Promise.reject(TypeError(`Invalid this`))}abort(e){return x(this)?this[o].stream===void 0?Promise.reject(TypeError(`Writer is not bound to a WritableStream`)):W(this,e):Promise.reject(TypeError(`Invalid this`))}close(){if(!x(this))return Promise.reject(TypeError(`Invalid this`));let{stream:e}=this[o];return e===void 0?Promise.reject(TypeError(`Writer is not bound to a WritableStream`)):I(e)?Promise.reject(TypeError(`Failure to close WritableStream`)):U(this)}releaseLock(){if(!x(this))throw TypeError(`Invalid this`);let{stream:e}=this[o];e!==void 0&&R(this)}write(e){return x(this)?this[o].stream===void 0?Promise.reject(TypeError(`Writer is not bound to a WritableStream`)):L(this,e):Promise.reject(TypeError(`Invalid this`))}get[Symbol.toStringTag](){return`WritableStreamDefaultWriter`}},y=class{[s]=`WritableStreamDefaultController`;[o];constructor(e){if(e!==g)throw TypeError(`Illegal constructor`)}[p](e){let t=this[o].abortAlgorithm(e);return X(this),t}[h](){d(this)}get signal(){if(!S(this))throw TypeError(`Invalid this`);return this[o].abortController.signal}error(e){if(!S(this))throw TypeError(`Invalid this`);this[o].stream[o].state===`writable`&&J(this,e)}get[Symbol.toStringTag](){return`WritableStreamDefaultController`}};const b=a(`WritableStream`),x=a(`WritableStreamDefaultWriter`),S=a(`WritableStreamDefaultController`);function C(){return{promise:void 0,resolve:void 0,reject:void 0}}function w(){return{close:Promise.withResolvers(),closeRequest:C(),inFlightWriteRequest:C(),inFlightCloseRequest:C(),pendingAbortRequest:{abort:C(),reason:void 0,wasAlreadyErroring:!1},backpressure:!1,controller:void 0,state:`writable`,storedError:void 0,writeRequests:[],writer:void 0}}function T(e){return e[o].writer!==void 0}function ne(e,t){if(T(t))throw TypeError(`WritableStream is locked`);switch(e[o].stream=t,t[o].writer=e,t[o].state){case`writable`:!I(t)&&t[o].backpressure?e[o].ready=Promise.withResolvers():e[o].ready={promise:Promise.resolve(),resolve:void 0,reject:void 0},e[o].close=Promise.withResolvers();break;case`erroring`:e[o].ready={promise:Promise.reject(t[o].storedError),resolve:void 0,reject:void 0},f(e[o].ready.promise),e[o].close=Promise.withResolvers();break;case`closed`:e[o].ready={promise:Promise.resolve(),resolve:void 0,reject:void 0},e[o].close={promise:Promise.resolve(),resolve:void 0,reject:void 0};break;default:e[o].ready={promise:Promise.reject(t[o].storedError),resolve:void 0,reject:void 0},e[o].close={promise:Promise.reject(t[o].storedError),resolve:void 0,reject:void 0},f(e[o].ready.promise),f(e[o].close.promise)}}function E(e,t){let{state:n,controller:r}=e[o];if(n===`closed`||n===`errored`)return Promise.resolve();if(r[o].abortController.abort(t),e[o].pendingAbortRequest.abort.promise!==void 0)return e[o].pendingAbortRequest.abort.promise;let i=!1;n===`erroring`&&(i=!0,t=void 0);let a=Promise.withResolvers();return e[o].pendingAbortRequest={abort:a,reason:t,wasAlreadyErroring:i},i||k(e,t),a.promise}function D(e){let{state:t,writer:n,backpressure:r,controller:i}=e[o];if(t===`closed`||t===`errored`)return Promise.reject(TypeError(`WritableStream is closed`));e[o].closeRequest=Promise.withResolvers();let{promise:a}=e[o].closeRequest;return n!==void 0&&r&&t===`writable`&&n[o].ready.resolve?.(),Y(i),a}function O(e,t){let{writer:n}=e[o];n!==void 0&&e[o].backpressure!==t&&(t?n[o].ready=Promise.withResolvers():n[o].ready.resolve?.()),e[o].backpressure=t}function k(e,t){let{controller:n,writer:r}=e[o];e[o].state=`erroring`,e[o].storedError=t,r!==void 0&&B(r,t),!ae(e)&&n[o].started&&P(e)}function A(e){e[o].closeRequest.promise!==void 0&&(e[o].closeRequest.reject?.(e[o].storedError),e[o].closeRequest={promise:void 0,resolve:void 0,reject:void 0}),f(e[o].close.promise),e[o].close.reject?.(e[o].storedError);let{writer:t}=e[o];t!==void 0&&(f(t[o].close.promise),t[o].close.reject?.(e[o].storedError))}function re(e){let t=e[o].writeRequests.shift();e[o].inFlightWriteRequest=t}function ie(e){e[o].inFlightCloseRequest=e[o].closeRequest,e[o].closeRequest={promise:void 0,resolve:void 0,reject:void 0}}function ae(e){return e[o].inFlightWriteRequest.promise!==void 0||e[o].inFlightCloseRequest.promise!==void 0}function oe(e,t){e[o].inFlightWriteRequest.reject?.(t),e[o].inFlightWriteRequest={promise:void 0,resolve:void 0,reject:void 0},F(e,t)}function j(e){e[o].inFlightWriteRequest.resolve?.(),e[o].inFlightWriteRequest={promise:void 0,resolve:void 0,reject:void 0}}function M(e,t){e[o].inFlightCloseRequest.reject?.(t),e[o].inFlightCloseRequest={promise:void 0,resolve:void 0,reject:void 0},e[o].pendingAbortRequest.abort.promise!==void 0&&(e[o].pendingAbortRequest.abort.reject?.(t),e[o].pendingAbortRequest={abort:{promise:void 0,resolve:void 0,reject:void 0},reason:void 0,wasAlreadyErroring:!1}),F(e,t)}function N(e){e[o].inFlightCloseRequest.resolve?.(),e[o].inFlightCloseRequest={promise:void 0,resolve:void 0,reject:void 0},e[o].state===`erroring`&&(e[o].storedError=void 0,e[o].pendingAbortRequest.abort.promise!==void 0&&(e[o].pendingAbortRequest.abort.resolve?.(),e[o].pendingAbortRequest={abort:{promise:void 0,resolve:void 0,reject:void 0},reason:void 0,wasAlreadyErroring:!1})),e[o].state=`closed`,e[o].writer!==void 0&&e[o].writer[o].close.resolve?.(),e[o].close.resolve?.()}function P(e){e[o].state=`errored`,e[o].controller[h]();let t=e[o].storedError;for(let n of e[o].writeRequests)n.reject?.(t);if(e[o].writeRequests=[],e[o].pendingAbortRequest.abort.promise===void 0){A(e);return}let n=e[o].pendingAbortRequest;if(e[o].pendingAbortRequest={abort:{promise:void 0,resolve:void 0,reject:void 0},reason:void 0,wasAlreadyErroring:!1},n.wasAlreadyErroring){n.abort.reject?.(t),A(e);return}e[o].controller[p](n.reason).then(()=>{n.abort.resolve?.(),A(e)},t=>{n.abort.reject?.(t),A(e)})}function F(e,t){if(e[o].state===`writable`){k(e,t);return}P(e)}function I(e){return e[o].closeRequest.promise!==void 0||e[o].inFlightCloseRequest.promise!==void 0}function se(e){let{promise:t,resolve:n,reject:r}=Promise.withResolvers();return e[o].writeRequests.push({promise:t,resolve:n,reject:r}),t}function L(e,t){let{stream:n}=e[o],{controller:r}=n[o],i=ue(r,t);if(n!==e[o].stream)return Promise.reject(TypeError(`Mismatched WritableStreams`));let{state:a}=n[o];if(a===`errored`)return Promise.reject(n[o].storedError);if(I(n)||a===`closed`)return Promise.reject(TypeError(`WritableStream is closed`));if(a===`erroring`)return Promise.reject(n[o].storedError);let s=se(n);return G(r,t,i),s}function R(e){let{stream:t}=e[o],n=TypeError(`Writer has been released`);B(e,n),V(e,n),t[o].writer=void 0,e[o].stream=void 0}function z(e){let{stream:t}=e[o];switch(t[o].state){case`errored`:case`erroring`:return null;case`closed`:return 0}return K(t[o].controller)}function B(e,t){e[o].ready.reject?(e[o].ready.reject(t),e[o].ready.resolve=void 0,e[o].ready.reject=void 0):e[o].ready={promise:Promise.reject(t),resolve:void 0,reject:void 0},f(e[o].ready.promise)}function V(e,t){e[o].close.reject?(e[o].close.reject(t),e[o].close.resolve=void 0,e[o].close.reject=void 0):e[o].close={promise:Promise.reject(t),resolve:void 0,reject:void 0},f(e[o].close.promise)}function H(e){let{stream:t}=e[o],{state:n}=t[o];return I(t)||n===`closed`?Promise.resolve():n===`errored`?Promise.reject(t[o].storedError):U(e)}function U(e){return D(e[o].stream)}function W(e,t){return E(e[o].stream,t)}function G(e,t,r){try{n(e,t,r)}catch(t){q(e,t);return}let{stream:i}=e[o];!I(i)&&i[o].state===`writable`&&O(i,Z(e)),Q(e)}function ce(e,n){let{stream:r,writeAlgorithm:i}=e[o];re(r),i(n,e).then(()=>{j(r);let{state:n}=r[o];t(e),!I(r)&&n===`writable`&&O(r,Z(e)),Q(e)},t=>{r[o].state===`writable`&&X(e),oe(r,t)})}function le(e){let{closeAlgorithm:n,queue:r,stream:i}=e[o];ie(i),t(e);let a=n();X(e),a.then(()=>N(i),e=>M(i,e))}function K(e){return e[o].highWaterMark-e[o].queueTotalSize}function ue(e,t){let{stream:n,sizeAlgorithm:r}=e[o];if(r===void 0)return 1;try{return r(t)}catch(t){return q(e,t),1}}function q(e,t){e[o].stream[o].state===`writable`&&J(e,t)}function J(e,t){X(e),k(e[o].stream,t)}function Y(e){n(e,m,0),Q(e)}function X(e){e[o].writeAlgorithm=void 0,e[o].closeAlgorithm=void 0,e[o].abortAlgorithm=void 0,e[o].sizeAlgorithm=void 0}function Z(e){return K(e)<=0}function Q(e){let{queue:t,started:n,stream:r}=e[o];if(!n||r[o].inFlightWriteRequest.promise!==void 0)return;if(r[o].state===`erroring`){P(r);return}if(!t.length)return;let i=u(e);i===m?le(e):ce(e,i)}function de(t,n,r,i){let a=new y(g),o=n?.start,s=n?.write,u=n?.close,d=n?.abort;$(t,a,o?o.bind(n,a):l,s?e(`sink.write`,s,n):ee,u?e(`sink.close`,u,n):c,d?e(`sink.abort`,d,n):c,r,i)}function $(e,t,n,r,i,a,s,c){t[o]={abortAlgorithm:a,closeAlgorithm:i,highWaterMark:s,queue:[],queueTotalSize:0,abortController:new te,sizeAlgorithm:c,started:!1,stream:e,writeAlgorithm:r},e[o].controller=t,O(e,Z(t));let l=n();new Promise(e=>e(l)).then(()=>{t[o].started=!0,Q(t)},n=>{t[o].started=!0,F(e,n)})}function fe(e,t,n,r,i=1,a=()=>1){let c=Object.create(_.prototype);return c[s]=`WritableStream`,c[o]=w(),$(c,new y(g),e,t,n,r,i,a),c}export{_ as WritableStream,y as WritableStreamDefaultController,v as WritableStreamDefaultWriter,fe as createWritableStream,b as isWritableStream,S as isWritableStreamDefaultController,x as isWritableStreamDefaultWriter,T as isWritableStreamLocked,E as writableStreamAbort,D as writableStreamClose,I as writableStreamCloseQueuedOrInFlight,q as writableStreamDefaultControllerErrorIfNeeded,H as writableStreamDefaultWriterCloseWithErrorPropagation,R as writableStreamDefaultWriterRelease,L as writableStreamDefaultWriterWrite};