@yume-chan/stream-extra 0.0.19 → 0.0.20
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/CHANGELOG.json +48 -33
- package/CHANGELOG.md +10 -1
- package/esm/buffered-transform.d.ts +1 -2
- package/esm/buffered-transform.d.ts.map +1 -1
- package/esm/buffered-transform.js +10 -9
- package/esm/buffered-transform.js.map +1 -1
- package/esm/buffered.d.ts +4 -9
- package/esm/buffered.d.ts.map +1 -1
- package/esm/buffered.js +34 -30
- package/esm/buffered.js.map +1 -1
- package/esm/consumable.d.ts +1 -2
- package/esm/consumable.d.ts.map +1 -1
- package/esm/consumable.js +9 -9
- package/esm/consumable.js.map +1 -1
- package/esm/distribution.d.ts +1 -4
- package/esm/distribution.d.ts.map +1 -1
- package/esm/distribution.js +29 -29
- package/esm/distribution.js.map +1 -1
- package/esm/duplex.d.ts +1 -5
- package/esm/duplex.d.ts.map +1 -1
- package/esm/duplex.js +21 -19
- package/esm/duplex.js.map +1 -1
- package/esm/gather-string.d.ts +1 -1
- package/esm/gather-string.d.ts.map +1 -1
- package/esm/gather-string.js +3 -3
- package/esm/gather-string.js.map +1 -1
- package/esm/push-readable.d.ts.map +1 -1
- package/esm/push-readable.js +11 -6
- package/esm/push-readable.js.map +1 -1
- package/esm/wrap-readable.d.ts +1 -1
- package/esm/wrap-readable.d.ts.map +1 -1
- package/esm/wrap-readable.js +4 -4
- package/esm/wrap-readable.js.map +1 -1
- package/esm/wrap-writable.d.ts +1 -1
- package/esm/wrap-writable.d.ts.map +1 -1
- package/esm/wrap-writable.js +5 -5
- package/esm/wrap-writable.js.map +1 -1
- package/package.json +6 -6
- package/src/buffered-transform.ts +10 -12
- package/src/buffered.ts +38 -32
- package/src/consumable.ts +11 -11
- package/src/distribution.ts +31 -31
- package/src/duplex.ts +21 -19
- package/src/gather-string.ts +3 -3
- package/src/push-readable.ts +10 -6
- package/src/wrap-readable.ts +4 -4
- package/src/wrap-writable.ts +5 -5
- package/tsconfig.build.json +6 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/esm/chunk.d.ts +0 -8
- package/esm/chunk.d.ts.map +0 -1
- package/esm/chunk.js +0 -56
- package/esm/chunk.js.map +0 -1
- package/esm/trace.d.ts +0 -16
- package/esm/trace.d.ts.map +0 -1
- package/esm/trace.js +0 -131
- package/esm/trace.js.map +0 -1
package/esm/duplex.js
CHANGED
|
@@ -11,24 +11,24 @@ const NOOP = () => {
|
|
|
11
11
|
* when any of them is closed, all other streams will be closed as well.
|
|
12
12
|
*/
|
|
13
13
|
export class DuplexStreamFactory {
|
|
14
|
-
readableControllers = [];
|
|
15
|
-
writers = [];
|
|
16
|
-
|
|
14
|
+
#readableControllers = [];
|
|
15
|
+
#writers = [];
|
|
16
|
+
#writableClosed = false;
|
|
17
17
|
get writableClosed() {
|
|
18
|
-
return this
|
|
18
|
+
return this.#writableClosed;
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
#closed = new PromiseResolver();
|
|
21
21
|
get closed() {
|
|
22
|
-
return this.
|
|
22
|
+
return this.#closed.promise;
|
|
23
23
|
}
|
|
24
|
-
options;
|
|
24
|
+
#options;
|
|
25
25
|
constructor(options) {
|
|
26
|
-
this
|
|
26
|
+
this.#options = options ?? {};
|
|
27
27
|
}
|
|
28
28
|
wrapReadable(readable) {
|
|
29
29
|
return new WrapReadableStream({
|
|
30
30
|
start: (controller) => {
|
|
31
|
-
this
|
|
31
|
+
this.#readableControllers.push(controller);
|
|
32
32
|
return readable;
|
|
33
33
|
},
|
|
34
34
|
cancel: async () => {
|
|
@@ -43,7 +43,7 @@ export class DuplexStreamFactory {
|
|
|
43
43
|
}
|
|
44
44
|
createWritable(stream) {
|
|
45
45
|
const writer = stream.getWriter();
|
|
46
|
-
this
|
|
46
|
+
this.#writers.push(writer);
|
|
47
47
|
// `WritableStream` has no way to tell if the remote peer has closed the connection.
|
|
48
48
|
// So it only triggers `close`.
|
|
49
49
|
return new WritableStream({
|
|
@@ -55,29 +55,31 @@ export class DuplexStreamFactory {
|
|
|
55
55
|
await this.close();
|
|
56
56
|
},
|
|
57
57
|
close: async () => {
|
|
58
|
+
// NOOP: the writer is already closed
|
|
58
59
|
await writer.close().catch(NOOP);
|
|
59
60
|
await this.close();
|
|
60
61
|
},
|
|
61
62
|
});
|
|
62
63
|
}
|
|
63
64
|
async close() {
|
|
64
|
-
if (this
|
|
65
|
+
if (this.#writableClosed) {
|
|
65
66
|
return;
|
|
66
67
|
}
|
|
67
|
-
this
|
|
68
|
+
this.#writableClosed = true;
|
|
68
69
|
// Call `close` first, so it can still write data to `WritableStream`s.
|
|
69
|
-
if ((await this
|
|
70
|
+
if ((await this.#options.close?.()) !== false) {
|
|
70
71
|
// `close` can return `false` to disable automatic `dispose`.
|
|
71
72
|
await this.dispose();
|
|
72
73
|
}
|
|
73
|
-
for (const writer of this
|
|
74
|
-
|
|
74
|
+
for (const writer of this.#writers) {
|
|
75
|
+
// NOOP: the writer is already closed
|
|
76
|
+
writer.close().catch(NOOP);
|
|
75
77
|
}
|
|
76
78
|
}
|
|
77
79
|
async dispose() {
|
|
78
|
-
this
|
|
79
|
-
this.
|
|
80
|
-
for (const controller of this
|
|
80
|
+
this.#writableClosed = true;
|
|
81
|
+
this.#closed.resolve();
|
|
82
|
+
for (const controller of this.#readableControllers) {
|
|
81
83
|
try {
|
|
82
84
|
controller.close();
|
|
83
85
|
}
|
|
@@ -85,7 +87,7 @@ export class DuplexStreamFactory {
|
|
|
85
87
|
// ignore
|
|
86
88
|
}
|
|
87
89
|
}
|
|
88
|
-
await this
|
|
90
|
+
await this.#options.dispose?.();
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
//# sourceMappingURL=duplex.js.map
|
package/esm/duplex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplex.js","sourceRoot":"","sources":["../src/duplex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,IAAI,GAAG,GAAG,EAAE;IACd,QAAQ;AACZ,CAAC,CAAC;AA4BF;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"duplex.js","sourceRoot":"","sources":["../src/duplex.ts"],"names":[],"mappings":"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"}
|
package/esm/gather-string.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gather-string.d.ts","sourceRoot":"","sources":["../src/gather-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,qBAAa,kBAAmB,SAAQ,cAAc,CAAC,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"gather-string.d.ts","sourceRoot":"","sources":["../src/gather-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,qBAAa,kBAAmB,SAAQ,cAAc,CAAC,MAAM,CAAC;;IAG1D,IAAW,MAAM,WAEhB;;CASJ"}
|
package/esm/gather-string.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { WritableStream } from "./stream.js";
|
|
2
2
|
export class GatherStringStream extends WritableStream {
|
|
3
3
|
// PERF: rope (concat strings) is faster than `[].join('')`
|
|
4
|
-
|
|
4
|
+
#result = "";
|
|
5
5
|
get result() {
|
|
6
|
-
return this
|
|
6
|
+
return this.#result;
|
|
7
7
|
}
|
|
8
8
|
constructor() {
|
|
9
9
|
super({
|
|
10
10
|
write: (chunk) => {
|
|
11
|
-
this
|
|
11
|
+
this.#result += chunk;
|
|
12
12
|
},
|
|
13
13
|
});
|
|
14
14
|
}
|
package/esm/gather-string.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gather-string.js","sourceRoot":"","sources":["../src/gather-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,OAAO,kBAAmB,SAAQ,cAAsB;IAC1D,2DAA2D;
|
|
1
|
+
{"version":3,"file":"gather-string.js","sourceRoot":"","sources":["../src/gather-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,OAAO,kBAAmB,SAAQ,cAAsB;IAC1D,2DAA2D;IAC3D,OAAO,GAAG,EAAE,CAAC;IACb,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;QACI,KAAK,CAAC;YACF,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACb,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;YAC1B,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-readable.d.ts","sourceRoot":"","sources":["../src/push-readable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAmB,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,4BAA4B,CAAC,CAAC;IAC3C,WAAW,EAAE,WAAW,CAAC;IAEzB,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC,KAAK,IAAI,IAAI,CAAC;IAEd,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,CACtC,UAAU,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAC1C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACxD;;;;;;OAMG;gBAEC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,EACnC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"push-readable.d.ts","sourceRoot":"","sources":["../src/push-readable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAmB,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,4BAA4B,CAAC,CAAC;IAC3C,WAAW,EAAE,WAAW,CAAC;IAEzB,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC,KAAK,IAAI,IAAI,CAAC;IAEd,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,CACtC,UAAU,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAC1C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACxD;;;;;;OAMG;gBAEC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,EACnC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;CAmEpC"}
|
package/esm/push-readable.js
CHANGED
|
@@ -10,16 +10,16 @@ export class PushReadableStream extends ReadableStream {
|
|
|
10
10
|
*/
|
|
11
11
|
constructor(source, strategy) {
|
|
12
12
|
let waterMarkLow;
|
|
13
|
-
const
|
|
13
|
+
const abortController = new AbortController();
|
|
14
14
|
super({
|
|
15
15
|
start: (controller) => {
|
|
16
16
|
const result = source({
|
|
17
|
-
abortSignal:
|
|
17
|
+
abortSignal: abortController.signal,
|
|
18
18
|
async enqueue(chunk) {
|
|
19
|
-
if (
|
|
19
|
+
if (abortController.signal.aborted) {
|
|
20
20
|
// If the stream is already cancelled,
|
|
21
21
|
// throw immediately.
|
|
22
|
-
throw (
|
|
22
|
+
throw (abortController.signal.reason ??
|
|
23
23
|
new Error("Aborted"));
|
|
24
24
|
}
|
|
25
25
|
// Only when the stream is errored, `desiredSize` will be `null`.
|
|
@@ -43,7 +43,12 @@ export class PushReadableStream extends ReadableStream {
|
|
|
43
43
|
});
|
|
44
44
|
if (result && "then" in result) {
|
|
45
45
|
result.then(() => {
|
|
46
|
-
|
|
46
|
+
try {
|
|
47
|
+
controller.close();
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
// controller already closed
|
|
51
|
+
}
|
|
47
52
|
}, (e) => {
|
|
48
53
|
controller.error(e);
|
|
49
54
|
});
|
|
@@ -53,7 +58,7 @@ export class PushReadableStream extends ReadableStream {
|
|
|
53
58
|
waterMarkLow?.resolve();
|
|
54
59
|
},
|
|
55
60
|
cancel: (reason) => {
|
|
56
|
-
|
|
61
|
+
abortController.abort(reason);
|
|
57
62
|
waterMarkLow?.reject(reason);
|
|
58
63
|
},
|
|
59
64
|
}, strategy);
|
package/esm/push-readable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-readable.js","sourceRoot":"","sources":["../src/push-readable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgB9D,MAAM,OAAO,kBAAsB,SAAQ,cAAiB;IACxD;;;;;;OAMG;IACH,YACI,MAAmC,EACnC,QAA6B;QAE7B,IAAI,YAA+C,CAAC;QACpD,MAAM,
|
|
1
|
+
{"version":3,"file":"push-readable.js","sourceRoot":"","sources":["../src/push-readable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgB9D,MAAM,OAAO,kBAAsB,SAAQ,cAAiB;IACxD;;;;;;OAMG;IACH,YACI,MAAmC,EACnC,QAA6B;QAE7B,IAAI,YAA+C,CAAC;QACpD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE9C,KAAK,CACD;YACI,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;gBAClB,MAAM,MAAM,GAAG,MAAM,CAAC;oBAClB,WAAW,EAAE,eAAe,CAAC,MAAM;oBACnC,KAAK,CAAC,OAAO,CAAC,KAAK;wBACf,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;4BAChC,sCAAsC;4BACtC,qBAAqB;4BACrB,MAAM,CACF,eAAe,CAAC,MAAM,CAAC,MAAM;gCAC7B,IAAI,KAAK,CAAC,SAAS,CAAC,CACvB,CAAC;yBACL;wBAED,iEAAiE;wBACjE,kCAAkC;wBAClC,qEAAqE;wBACrE,yCAAyC;wBACzC,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;4BACpC,YAAY,GAAG,IAAI,eAAe,EAAQ,CAAC;4BAC3C,MAAM,YAAY,CAAC,OAAO,CAAC;yBAC9B;wBAED,+CAA+C;wBAC/C,oCAAoC;wBACpC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC9B,CAAC;oBACD,KAAK;wBACD,UAAU,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;oBACD,KAAK,CAAC,CAAC;wBACH,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACxB,CAAC;iBACJ,CAAC,CAAC;gBAEH,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE;oBAC5B,MAAM,CAAC,IAAI,CACP,GAAG,EAAE;wBACD,IAAI;4BACA,UAAU,CAAC,KAAK,EAAE,CAAC;yBACtB;wBAAC,OAAO,CAAC,EAAE;4BACR,4BAA4B;yBAC/B;oBACL,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;wBACF,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACxB,CAAC,CACJ,CAAC;iBACL;YACL,CAAC;YACD,IAAI,EAAE,GAAG,EAAE;gBACP,YAAY,EAAE,OAAO,EAAE,CAAC;YAC5B,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;gBACf,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;SACJ,EACD,QAAQ,CACX,CAAC;IACN,CAAC;CACJ"}
|
package/esm/wrap-readable.d.ts
CHANGED
|
@@ -15,8 +15,8 @@ export interface ReadableStreamWrapper<T> {
|
|
|
15
15
|
* 3. Convert native `ReadableStream`s to polyfilled ones so they can `pipe` between.
|
|
16
16
|
*/
|
|
17
17
|
export declare class WrapReadableStream<T> extends ReadableStream<T> {
|
|
18
|
+
#private;
|
|
18
19
|
readable: ReadableStream<T>;
|
|
19
|
-
private reader;
|
|
20
20
|
constructor(wrapper: ReadableStream<T> | WrapReadableStreamStart<T> | ReadableStreamWrapper<T>);
|
|
21
21
|
}
|
|
22
22
|
//# sourceMappingURL=wrap-readable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-readable.d.ts","sourceRoot":"","sources":["../src/wrap-readable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EACR,+BAA+B,EAElC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,CACrC,UAAU,EAAE,+BAA+B,CAAC,CAAC,CAAC,KAC7C,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvC,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;CAClC;AAoBD;;;;;;GAMG;AACH,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"wrap-readable.d.ts","sourceRoot":"","sources":["../src/wrap-readable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EACR,+BAA+B,EAElC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,CACrC,UAAU,EAAE,+BAA+B,CAAC,CAAC,CAAC,KAC7C,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvC,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;CAClC;AAoBD;;;;;;GAMG;AACH,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;;IACjD,QAAQ,EAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAKhC,OAAO,EACD,cAAc,CAAC,CAAC,CAAC,GACjB,uBAAuB,CAAC,CAAC,CAAC,GAC1B,qBAAqB,CAAC,CAAC,CAAC;CAmCrC"}
|
package/esm/wrap-readable.js
CHANGED
|
@@ -21,7 +21,7 @@ function getWrappedReadableStream(wrapper, controller) {
|
|
|
21
21
|
*/
|
|
22
22
|
export class WrapReadableStream extends ReadableStream {
|
|
23
23
|
readable;
|
|
24
|
-
reader;
|
|
24
|
+
#reader;
|
|
25
25
|
constructor(wrapper) {
|
|
26
26
|
super({
|
|
27
27
|
start: async (controller) => {
|
|
@@ -31,16 +31,16 @@ export class WrapReadableStream extends ReadableStream {
|
|
|
31
31
|
// Queue a microtask to avoid this.
|
|
32
32
|
await Promise.resolve();
|
|
33
33
|
this.readable = await getWrappedReadableStream(wrapper, controller);
|
|
34
|
-
this
|
|
34
|
+
this.#reader = this.readable.getReader();
|
|
35
35
|
},
|
|
36
36
|
cancel: async (reason) => {
|
|
37
|
-
await this
|
|
37
|
+
await this.#reader.cancel(reason);
|
|
38
38
|
if ("cancel" in wrapper) {
|
|
39
39
|
await wrapper.cancel?.(reason);
|
|
40
40
|
}
|
|
41
41
|
},
|
|
42
42
|
pull: async (controller) => {
|
|
43
|
-
const result = await this
|
|
43
|
+
const result = await this.#reader.read();
|
|
44
44
|
if (result.done) {
|
|
45
45
|
controller.close();
|
|
46
46
|
if ("close" in wrapper) {
|
package/esm/wrap-readable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-readable.js","sourceRoot":"","sources":["../src/wrap-readable.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAY7C,SAAS,wBAAwB,CAC7B,OAG8B,EAC9B,UAA8C;IAE9C,IAAI,OAAO,IAAI,OAAO,EAAE;QACpB,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;KACpC;SAAM,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;QACtC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;KAC9B;SAAM;QACH,gDAAgD;QAChD,wEAAwE;QACxE,OAAO,OAAO,CAAC;KAClB;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,kBAAsB,SAAQ,cAAiB;IACjD,QAAQ,CAAqB;
|
|
1
|
+
{"version":3,"file":"wrap-readable.js","sourceRoot":"","sources":["../src/wrap-readable.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAY7C,SAAS,wBAAwB,CAC7B,OAG8B,EAC9B,UAA8C;IAE9C,IAAI,OAAO,IAAI,OAAO,EAAE;QACpB,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;KACpC;SAAM,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;QACtC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;KAC9B;SAAM;QACH,gDAAgD;QAChD,wEAAwE;QACxE,OAAO,OAAO,CAAC;KAClB;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,kBAAsB,SAAQ,cAAiB;IACjD,QAAQ,CAAqB;IAEpC,OAAO,CAAkC;IAEzC,YACI,OAG8B;QAE9B,KAAK,CAAC;YACF,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBACxB,mEAAmE;gBACnE,uCAAuC;gBACvC,gHAAgH;gBAChH,mCAAmC;gBACnC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAExB,IAAI,CAAC,QAAQ,GAAG,MAAM,wBAAwB,CAC1C,OAAO,EACP,UAAU,CACb,CAAC;gBACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC7C,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACrB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,QAAQ,IAAI,OAAO,EAAE;oBACrB,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;iBAClC;YACL,CAAC;YACD,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACzC,IAAI,MAAM,CAAC,IAAI,EAAE;oBACb,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,IAAI,OAAO,IAAI,OAAO,EAAE;wBACpB,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;qBAC3B;iBACJ;qBAAM;oBACH,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBACpC;YACL,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ"}
|
package/esm/wrap-writable.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export interface WritableStreamWrapper<T> {
|
|
|
7
7
|
close?(): void | Promise<void>;
|
|
8
8
|
}
|
|
9
9
|
export declare class WrapWritableStream<T> extends WritableStream<T> {
|
|
10
|
+
#private;
|
|
10
11
|
writable: WritableStream<T>;
|
|
11
|
-
private writer;
|
|
12
12
|
constructor(wrapper: WritableStream<T> | WrapWritableStreamStart<T> | WritableStreamWrapper<T>);
|
|
13
13
|
bePipedThroughFrom<U>(transformer: TransformStream<U, T>): WrapWritableStream<U>;
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-writable.d.ts","sourceRoot":"","sources":["../src/wrap-writable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,eAAe,EAA+B,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,MAAM,cAAc,CACzD,cAAc,CAAC,CAAC,CAAC,CACpB,CAAC;AAEF,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAmBD,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"wrap-writable.d.ts","sourceRoot":"","sources":["../src/wrap-writable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,eAAe,EAA+B,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,MAAM,cAAc,CACzD,cAAc,CAAC,CAAC,CAAC,CACpB,CAAC;AAEF,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAmBD,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;;IACjD,QAAQ,EAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAKhC,OAAO,EACD,cAAc,CAAC,CAAC,CAAC,GACjB,uBAAuB,CAAC,CAAC,CAAC,GAC1B,qBAAqB,CAAC,CAAC,CAAC;IAmC3B,kBAAkB,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;CAYlE"}
|
package/esm/wrap-writable.js
CHANGED
|
@@ -14,7 +14,7 @@ async function getWrappedWritableStream(wrapper) {
|
|
|
14
14
|
}
|
|
15
15
|
export class WrapWritableStream extends WritableStream {
|
|
16
16
|
writable;
|
|
17
|
-
writer;
|
|
17
|
+
#writer;
|
|
18
18
|
constructor(wrapper) {
|
|
19
19
|
super({
|
|
20
20
|
start: async () => {
|
|
@@ -24,13 +24,13 @@ export class WrapWritableStream extends WritableStream {
|
|
|
24
24
|
// Queue a microtask to avoid this.
|
|
25
25
|
await Promise.resolve();
|
|
26
26
|
this.writable = await getWrappedWritableStream(wrapper);
|
|
27
|
-
this
|
|
27
|
+
this.#writer = this.writable.getWriter();
|
|
28
28
|
},
|
|
29
29
|
write: async (chunk) => {
|
|
30
|
-
await this
|
|
30
|
+
await this.#writer.write(chunk);
|
|
31
31
|
},
|
|
32
32
|
abort: async (reason) => {
|
|
33
|
-
await this
|
|
33
|
+
await this.#writer.abort(reason);
|
|
34
34
|
if ("close" in wrapper) {
|
|
35
35
|
await wrapper.close?.();
|
|
36
36
|
}
|
|
@@ -40,7 +40,7 @@ export class WrapWritableStream extends WritableStream {
|
|
|
40
40
|
// Usually the inner stream is a logical sub-stream over the outer stream,
|
|
41
41
|
// closing the outer stream first will make the inner stream incapable of
|
|
42
42
|
// sending data in its `close` handler.
|
|
43
|
-
await this
|
|
43
|
+
await this.#writer.close();
|
|
44
44
|
if ("close" in wrapper) {
|
|
45
45
|
await wrapper.close?.();
|
|
46
46
|
}
|
package/esm/wrap-writable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-writable.js","sourceRoot":"","sources":["../src/wrap-writable.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAW7C,KAAK,UAAU,wBAAwB,CACnC,OAG8B;IAE9B,IAAI,OAAO,IAAI,OAAO,EAAE;QACpB,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;KAChC;SAAM,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;QACtC,OAAO,MAAM,OAAO,EAAE,CAAC;KAC1B;SAAM;QACH,gDAAgD;QAChD,wEAAwE;QACxE,OAAO,OAAO,CAAC;KAClB;AACL,CAAC;AAED,MAAM,OAAO,kBAAsB,SAAQ,cAAiB;IACjD,QAAQ,CAAqB;
|
|
1
|
+
{"version":3,"file":"wrap-writable.js","sourceRoot":"","sources":["../src/wrap-writable.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAW7C,KAAK,UAAU,wBAAwB,CACnC,OAG8B;IAE9B,IAAI,OAAO,IAAI,OAAO,EAAE;QACpB,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;KAChC;SAAM,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;QACtC,OAAO,MAAM,OAAO,EAAE,CAAC;KAC1B;SAAM;QACH,gDAAgD;QAChD,wEAAwE;QACxE,OAAO,OAAO,CAAC;KAClB;AACL,CAAC;AAED,MAAM,OAAO,kBAAsB,SAAQ,cAAiB;IACjD,QAAQ,CAAqB;IAEpC,OAAO,CAAkC;IAEzC,YACI,OAG8B;QAE9B,KAAK,CAAC;YACF,KAAK,EAAE,KAAK,IAAI,EAAE;gBACd,mEAAmE;gBACnE,uCAAuC;gBACvC,gHAAgH;gBAChH,mCAAmC;gBACnC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAExB,IAAI,CAAC,QAAQ,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACxD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC7C,CAAC;YACD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACnB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACpB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,OAAO,IAAI,OAAO,EAAE;oBACpB,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;iBAC3B;YACL,CAAC;YACD,KAAK,EAAE,KAAK,IAAI,EAAE;gBACd,gCAAgC;gBAChC,0EAA0E;gBAC1E,yEAAyE;gBACzE,uCAAuC;gBACvC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC3B,IAAI,OAAO,IAAI,OAAO,EAAE;oBACpB,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;iBAC3B;YACL,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAEM,kBAAkB,CAAI,WAAkC;QAC3D,IAAI,OAAsB,CAAC;QAC3B,OAAO,IAAI,kBAAkB,CAAI;YAC7B,KAAK,EAAE,GAAG,EAAE;gBACR,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5C,OAAO,WAAW,CAAC,QAAQ,CAAC;YAChC,CAAC;YACD,KAAK,CAAC,KAAK;gBACP,MAAM,OAAO,CAAC;YAClB,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yume-chan/stream-extra",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.20",
|
|
4
4
|
"description": "Extensions to Web Streams API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"stream",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"types": "esm/index.d.ts",
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@yume-chan/async": "^2.2.0",
|
|
29
|
-
"@yume-chan/struct": "^0.0.
|
|
30
|
-
"tslib": "^2.
|
|
29
|
+
"@yume-chan/struct": "^0.0.20",
|
|
30
|
+
"tslib": "^2.5.2",
|
|
31
31
|
"web-streams-polyfill": "^4.0.0-beta.3"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
@@ -35,11 +35,11 @@
|
|
|
35
35
|
"@yume-chan/eslint-config": "^1.0.0",
|
|
36
36
|
"@yume-chan/tsconfig": "^1.0.0",
|
|
37
37
|
"cross-env": "^7.0.3",
|
|
38
|
-
"eslint": "^8.
|
|
38
|
+
"eslint": "^8.41.0",
|
|
39
39
|
"jest": "^29.5.0",
|
|
40
|
-
"prettier": "^2.8.
|
|
40
|
+
"prettier": "^2.8.8",
|
|
41
41
|
"ts-jest": "^29.0.4",
|
|
42
|
-
"typescript": "^
|
|
42
|
+
"typescript": "^5.0.3"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|
|
45
45
|
"build": "tsc -b tsconfig.build.json",
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import type { ValueOrPromise } from "@yume-chan/struct";
|
|
2
|
+
import { StructEmptyError } from "@yume-chan/struct";
|
|
2
3
|
|
|
3
|
-
import {
|
|
4
|
-
BufferedReadableStream,
|
|
5
|
-
BufferedReadableStreamEndedError,
|
|
6
|
-
} from "./buffered.js";
|
|
4
|
+
import { BufferedReadableStream } from "./buffered.js";
|
|
7
5
|
import type { PushReadableStreamController } from "./push-readable.js";
|
|
8
6
|
import { PushReadableStream } from "./push-readable.js";
|
|
9
7
|
import type { ReadableWritablePair } from "./stream.js";
|
|
@@ -13,14 +11,14 @@ import { ReadableStream, WritableStream } from "./stream.js";
|
|
|
13
11
|
export class BufferedTransformStream<T>
|
|
14
12
|
implements ReadableWritablePair<T, Uint8Array>
|
|
15
13
|
{
|
|
16
|
-
|
|
14
|
+
#readable: ReadableStream<T>;
|
|
17
15
|
public get readable() {
|
|
18
|
-
return this
|
|
16
|
+
return this.#readable;
|
|
19
17
|
}
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
#writable: WritableStream<Uint8Array>;
|
|
22
20
|
public get writable() {
|
|
23
|
-
return this
|
|
21
|
+
return this.#writable;
|
|
24
22
|
}
|
|
25
23
|
|
|
26
24
|
constructor(
|
|
@@ -35,16 +33,16 @@ export class BufferedTransformStream<T>
|
|
|
35
33
|
})
|
|
36
34
|
);
|
|
37
35
|
|
|
38
|
-
this
|
|
36
|
+
this.#readable = new ReadableStream<T>({
|
|
39
37
|
async pull(controller) {
|
|
40
38
|
try {
|
|
41
39
|
const value = await transform(buffered);
|
|
42
40
|
controller.enqueue(value);
|
|
43
41
|
} catch (e) {
|
|
44
|
-
// Treat `
|
|
42
|
+
// Treat `StructEmptyError` as a normal end.
|
|
45
43
|
// If the `transform` method doesn't have enough data to return a value,
|
|
46
44
|
// it should throw another error to indicate that.
|
|
47
|
-
if (e instanceof
|
|
45
|
+
if (e instanceof StructEmptyError) {
|
|
48
46
|
controller.close();
|
|
49
47
|
return;
|
|
50
48
|
}
|
|
@@ -58,7 +56,7 @@ export class BufferedTransformStream<T>
|
|
|
58
56
|
},
|
|
59
57
|
});
|
|
60
58
|
|
|
61
|
-
this
|
|
59
|
+
this.#writable = new WritableStream({
|
|
62
60
|
async write(chunk) {
|
|
63
61
|
await sourceStreamController.enqueue(chunk);
|
|
64
62
|
},
|
package/src/buffered.ts
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
|
+
import type { AsyncExactReadable } from "@yume-chan/struct";
|
|
2
|
+
import { ExactReadableEndedError } from "@yume-chan/struct";
|
|
3
|
+
|
|
1
4
|
import { PushReadableStream } from "./push-readable.js";
|
|
2
5
|
import type { ReadableStream, ReadableStreamDefaultReader } from "./stream.js";
|
|
3
6
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
const NOOP = () => {
|
|
8
|
+
// no-op
|
|
9
|
+
};
|
|
7
10
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
export class BufferedReadableStream implements AsyncExactReadable {
|
|
12
|
+
#buffered: Uint8Array | undefined;
|
|
13
|
+
#bufferedOffset = 0;
|
|
14
|
+
#bufferedLength = 0;
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
private buffered: Uint8Array | undefined;
|
|
15
|
-
private bufferedOffset = 0;
|
|
16
|
-
private bufferedLength = 0;
|
|
17
|
-
|
|
18
|
-
private _position = 0;
|
|
16
|
+
#position = 0;
|
|
19
17
|
public get position() {
|
|
20
|
-
return this
|
|
18
|
+
return this.#position;
|
|
21
19
|
}
|
|
22
20
|
|
|
23
21
|
protected readonly stream: ReadableStream<Uint8Array>;
|
|
@@ -31,9 +29,9 @@ export class BufferedReadableStream {
|
|
|
31
29
|
private async readSource() {
|
|
32
30
|
const { done, value } = await this.reader.read();
|
|
33
31
|
if (done) {
|
|
34
|
-
throw new
|
|
32
|
+
throw new ExactReadableEndedError();
|
|
35
33
|
}
|
|
36
|
-
this
|
|
34
|
+
this.#position += value.byteLength;
|
|
37
35
|
return value;
|
|
38
36
|
}
|
|
39
37
|
|
|
@@ -53,9 +51,9 @@ export class BufferedReadableStream {
|
|
|
53
51
|
}
|
|
54
52
|
|
|
55
53
|
if (array.byteLength > length) {
|
|
56
|
-
this
|
|
57
|
-
this
|
|
58
|
-
this
|
|
54
|
+
this.#buffered = array;
|
|
55
|
+
this.#bufferedOffset = length;
|
|
56
|
+
this.#bufferedLength = array.byteLength - length;
|
|
59
57
|
return array.subarray(0, length);
|
|
60
58
|
}
|
|
61
59
|
|
|
@@ -73,9 +71,9 @@ export class BufferedReadableStream {
|
|
|
73
71
|
}
|
|
74
72
|
|
|
75
73
|
if (array.byteLength > length) {
|
|
76
|
-
this
|
|
77
|
-
this
|
|
78
|
-
this
|
|
74
|
+
this.#buffered = array;
|
|
75
|
+
this.#bufferedOffset = length;
|
|
76
|
+
this.#bufferedLength = array.byteLength - length;
|
|
79
77
|
result.set(array.subarray(0, length), index);
|
|
80
78
|
return result;
|
|
81
79
|
}
|
|
@@ -93,20 +91,22 @@ export class BufferedReadableStream {
|
|
|
93
91
|
* @param length
|
|
94
92
|
* @returns
|
|
95
93
|
*/
|
|
96
|
-
public
|
|
94
|
+
public readExactly(length: number): Uint8Array | Promise<Uint8Array> {
|
|
97
95
|
// PERF: Add a synchronous path for reading from internal buffer
|
|
98
|
-
if (this
|
|
99
|
-
const array = this
|
|
100
|
-
const offset = this
|
|
101
|
-
if (this
|
|
96
|
+
if (this.#buffered) {
|
|
97
|
+
const array = this.#buffered;
|
|
98
|
+
const offset = this.#bufferedOffset;
|
|
99
|
+
if (this.#bufferedLength > length) {
|
|
102
100
|
// PERF: `subarray` is slow
|
|
103
101
|
// don't use it until absolutely necessary
|
|
104
|
-
this
|
|
105
|
-
this
|
|
102
|
+
this.#bufferedOffset += length;
|
|
103
|
+
this.#bufferedLength -= length;
|
|
106
104
|
return array.subarray(offset, offset + length);
|
|
107
105
|
}
|
|
108
106
|
|
|
109
|
-
this
|
|
107
|
+
this.#buffered = undefined;
|
|
108
|
+
this.#bufferedLength = 0;
|
|
109
|
+
this.#bufferedOffset = 0;
|
|
110
110
|
return this.readAsync(length, array.subarray(offset));
|
|
111
111
|
}
|
|
112
112
|
|
|
@@ -119,10 +119,16 @@ export class BufferedReadableStream {
|
|
|
119
119
|
* @returns A `ReadableStream`
|
|
120
120
|
*/
|
|
121
121
|
public release(): ReadableStream<Uint8Array> {
|
|
122
|
-
if (this
|
|
122
|
+
if (this.#bufferedLength > 0) {
|
|
123
123
|
return new PushReadableStream<Uint8Array>(async (controller) => {
|
|
124
124
|
// Put the remaining data back to the stream
|
|
125
|
-
|
|
125
|
+
const buffered = this.#buffered!.subarray(this.#bufferedOffset);
|
|
126
|
+
await controller.enqueue(buffered);
|
|
127
|
+
|
|
128
|
+
controller.abortSignal.addEventListener("abort", () => {
|
|
129
|
+
// NOOP: the reader might already be released
|
|
130
|
+
this.reader.cancel().catch(NOOP);
|
|
131
|
+
});
|
|
126
132
|
|
|
127
133
|
// Manually pipe the stream
|
|
128
134
|
while (true) {
|
package/src/consumable.ts
CHANGED
|
@@ -11,12 +11,12 @@ interface Console {
|
|
|
11
11
|
createTask(name: string): Task;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
interface
|
|
14
|
+
interface GlobalExtension {
|
|
15
15
|
console: Console;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
// `createTask` allows browser DevTools to track the call stack across async boundaries.
|
|
19
|
-
const { console } = globalThis as unknown as
|
|
19
|
+
const { console } = globalThis as unknown as GlobalExtension;
|
|
20
20
|
const createTask: Console["createTask"] =
|
|
21
21
|
console.createTask?.bind(console) ??
|
|
22
22
|
(() => ({
|
|
@@ -26,35 +26,35 @@ const createTask: Console["createTask"] =
|
|
|
26
26
|
}));
|
|
27
27
|
|
|
28
28
|
export class Consumable<T> {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
readonly #task: Task;
|
|
30
|
+
readonly #resolver: PromiseResolver<void>;
|
|
31
31
|
|
|
32
32
|
public readonly value: T;
|
|
33
33
|
public readonly consumed: Promise<void>;
|
|
34
34
|
|
|
35
35
|
public constructor(value: T) {
|
|
36
|
-
this
|
|
36
|
+
this.#task = createTask("Consumable");
|
|
37
37
|
this.value = value;
|
|
38
|
-
this
|
|
39
|
-
this.consumed = this
|
|
38
|
+
this.#resolver = new PromiseResolver<void>();
|
|
39
|
+
this.consumed = this.#resolver.promise;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
public consume() {
|
|
43
|
-
this
|
|
43
|
+
this.#resolver.resolve();
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
public error(error: any) {
|
|
47
|
-
this
|
|
47
|
+
this.#resolver.reject(error);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
public async tryConsume<U>(callback: (value: T) => U) {
|
|
51
51
|
try {
|
|
52
52
|
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
53
|
-
const result = await this
|
|
53
|
+
const result = await this.#task.run(() => callback(this.value));
|
|
54
54
|
this.consume();
|
|
55
55
|
return result;
|
|
56
56
|
} catch (e) {
|
|
57
|
-
this
|
|
57
|
+
this.#resolver.reject(e);
|
|
58
58
|
throw e;
|
|
59
59
|
}
|
|
60
60
|
}
|