@yume-chan/stream-extra 0.0.24 → 1.0.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/CHANGELOG.md +22 -1
- package/esm/buffered-transform.d.ts +3 -3
- package/esm/buffered-transform.d.ts.map +1 -1
- package/esm/buffered-transform.js.map +1 -1
- package/esm/buffered.d.ts +3 -6
- package/esm/buffered.d.ts.map +1 -1
- package/esm/buffered.js +87 -75
- package/esm/buffered.js.map +1 -1
- package/esm/concat.js +2 -2
- package/esm/concat.js.map +1 -1
- package/esm/consumable.d.ts +15 -10
- package/esm/consumable.d.ts.map +1 -1
- package/esm/consumable.js +82 -86
- package/esm/consumable.js.map +1 -1
- package/esm/duplex.d.ts +2 -2
- package/esm/duplex.d.ts.map +1 -1
- package/esm/duplex.js +2 -6
- package/esm/duplex.js.map +1 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/maybe-consumable-ns.d.ts +16 -0
- package/esm/maybe-consumable-ns.d.ts.map +1 -0
- package/esm/maybe-consumable-ns.js +44 -0
- package/esm/maybe-consumable-ns.js.map +1 -0
- package/esm/maybe-consumable.d.ts +2 -19
- package/esm/maybe-consumable.d.ts.map +1 -1
- package/esm/maybe-consumable.js +1 -61
- package/esm/maybe-consumable.js.map +1 -1
- package/esm/push-readable.d.ts +16 -2
- package/esm/push-readable.d.ts.map +1 -1
- package/esm/push-readable.js +176 -17
- package/esm/push-readable.js.map +1 -1
- package/esm/stream.d.ts +5 -5
- package/esm/stream.d.ts.map +1 -1
- package/esm/stream.js +54 -5
- package/esm/stream.js.map +1 -1
- package/esm/struct-deserialize.d.ts +3 -4
- package/esm/struct-deserialize.d.ts.map +1 -1
- package/esm/struct-deserialize.js.map +1 -1
- package/esm/struct-serialize.d.ts +2 -2
- package/esm/struct-serialize.d.ts.map +1 -1
- package/esm/struct-serialize.js.map +1 -1
- package/esm/task.d.ts.map +1 -1
- package/esm/task.js +2 -2
- package/esm/task.js.map +1 -1
- package/esm/try-close.d.ts +10 -0
- package/esm/try-close.d.ts.map +1 -0
- package/esm/try-close.js +19 -0
- package/esm/try-close.js.map +1 -0
- package/esm/types.d.ts +2 -3
- package/esm/types.d.ts.map +1 -1
- package/esm/wrap-readable.d.ts +5 -4
- package/esm/wrap-readable.d.ts.map +1 -1
- package/esm/wrap-readable.js +14 -9
- package/esm/wrap-readable.js.map +1 -1
- package/esm/wrap-writable.d.ts +2 -2
- package/esm/wrap-writable.d.ts.map +1 -1
- package/esm/wrap-writable.js +4 -6
- package/esm/wrap-writable.js.map +1 -1
- package/package.json +11 -13
- package/src/buffered-transform.ts +2 -2
- package/src/buffered.ts +107 -83
- package/src/concat.ts +2 -2
- package/src/consumable.ts +117 -112
- package/src/duplex.ts +4 -7
- package/src/index.ts +1 -0
- package/src/maybe-consumable-ns.ts +75 -0
- package/src/maybe-consumable.ts +2 -98
- package/src/push-readable.ts +213 -19
- package/src/stream.ts +68 -8
- package/src/struct-deserialize.ts +3 -6
- package/src/struct-serialize.ts +3 -3
- package/src/task.ts +2 -2
- package/src/try-close.ts +44 -0
- package/src/types.ts +2 -2
- package/src/wrap-readable.ts +20 -14
- package/src/wrap-writable.ts +6 -9
- package/tsconfig.build.tsbuildinfo +1 -1
- package/CHANGELOG.json +0 -104
package/esm/consumable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumable.js","sourceRoot":"","sources":["../src/consumable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"consumable.js","sourceRoot":"","sources":["../src/consumable.ts"],"names":[],"mappings":"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"}
|
package/esm/duplex.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MaybePromiseLike } from "@yume-chan/async";
|
|
2
2
|
import type { QueuingStrategy, ReadableStream } from "./stream.js";
|
|
3
3
|
import { WritableStream } from "./stream.js";
|
|
4
4
|
import { WrapReadableStream } from "./wrap-readable.js";
|
|
@@ -15,7 +15,7 @@ export interface DuplexStreamFactoryOptions {
|
|
|
15
15
|
* `DuplexStreamFactory#dispose` yourself, you can return `false`
|
|
16
16
|
* (or a `Promise` that resolves to `false`) to disable the automatic call.
|
|
17
17
|
*/
|
|
18
|
-
close?: (() =>
|
|
18
|
+
close?: (() => MaybePromiseLike<boolean | void>) | undefined;
|
|
19
19
|
/**
|
|
20
20
|
* Callback when any `ReadableStream` is closed (the other peer doesn't produce any more data),
|
|
21
21
|
* or `WritableStream` is aborted (the other peer can't receive any more data),
|
package/esm/duplex.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplex.d.ts","sourceRoot":"","sources":["../src/duplex.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"duplex.d.ts","sourceRoot":"","sources":["../src/duplex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,KAAK,EACR,eAAe,EACf,cAAc,EAGjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMxD,MAAM,WAAW,0BAA0B;IACvC;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IAE7D;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACtD;AAED;;;;;GAKG;AACH,qBAAa,mBAAmB,CAAC,CAAC,EAAE,CAAC;;IAKjC,IAAI,cAAc,YAEjB;IAGD,IAAI,MAAM,kBAET;gBAIW,OAAO,CAAC,EAAE,0BAA0B;IAIhD,YAAY,CACR,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAC9B,kBAAkB,CAAC,CAAC,CAAC;IAoBxB,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAsBtD,KAAK;IAkBL,OAAO;CAUhB"}
|
package/esm/duplex.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { PromiseResolver } from "@yume-chan/async";
|
|
2
2
|
import { WritableStream } from "./stream.js";
|
|
3
|
+
import { tryClose } from "./try-close.js";
|
|
3
4
|
import { WrapReadableStream } from "./wrap-readable.js";
|
|
4
5
|
const NOOP = () => {
|
|
5
6
|
// no-op
|
|
@@ -80,12 +81,7 @@ export class DuplexStreamFactory {
|
|
|
80
81
|
this.#writableClosed = true;
|
|
81
82
|
this.#closed.resolve();
|
|
82
83
|
for (const controller of this.#readableControllers) {
|
|
83
|
-
|
|
84
|
-
controller.close();
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
// ignore
|
|
88
|
-
}
|
|
84
|
+
tryClose(controller);
|
|
89
85
|
}
|
|
90
86
|
await this.#options.dispose?.();
|
|
91
87
|
}
|
package/esm/duplex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplex.js","sourceRoot":"","sources":["../src/duplex.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"duplex.js","sourceRoot":"","sources":["../src/duplex.ts"],"names":[],"mappings":"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"}
|
package/esm/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from "./stream.js";
|
|
|
14
14
|
export * from "./struct-deserialize.js";
|
|
15
15
|
export * from "./struct-serialize.js";
|
|
16
16
|
export * from "./task.js";
|
|
17
|
+
export * from "./try-close.js";
|
|
17
18
|
export * from "./wrap-readable.js";
|
|
18
19
|
export * from "./wrap-writable.js";
|
|
19
20
|
//# sourceMappingURL=index.d.ts.map
|
package/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
|
package/esm/index.js
CHANGED
|
@@ -14,6 +14,7 @@ export * from "./stream.js";
|
|
|
14
14
|
export * from "./struct-deserialize.js";
|
|
15
15
|
export * from "./struct-serialize.js";
|
|
16
16
|
export * from "./task.js";
|
|
17
|
+
export * from "./try-close.js";
|
|
17
18
|
export * from "./wrap-readable.js";
|
|
18
19
|
export * from "./wrap-writable.js";
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Consumable } from "./consumable.js";
|
|
2
|
+
import type { MaybeConsumable } from "./maybe-consumable.js";
|
|
3
|
+
import type { QueuingStrategy, WritableStreamDefaultController } from "./stream.js";
|
|
4
|
+
import { WritableStream as NativeWritableStream } from "./stream.js";
|
|
5
|
+
export declare function getValue<T>(value: MaybeConsumable<T>): T;
|
|
6
|
+
export declare function tryConsume<T, R>(value: T, callback: (value: T extends Consumable<infer U> ? U : T) => R): R;
|
|
7
|
+
export interface WritableStreamSink<in T> {
|
|
8
|
+
start?(controller: WritableStreamDefaultController): void | PromiseLike<void>;
|
|
9
|
+
write?(chunk: T, controller: WritableStreamDefaultController): void | PromiseLike<void>;
|
|
10
|
+
abort?(reason: unknown): void | PromiseLike<void>;
|
|
11
|
+
close?(): void | PromiseLike<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare class WritableStream<in T> extends NativeWritableStream<MaybeConsumable<T>> {
|
|
14
|
+
constructor(sink: WritableStreamSink<T>, strategy?: QueuingStrategy<T>);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=maybe-consumable-ns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybe-consumable-ns.d.ts","sourceRoot":"","sources":["../src/maybe-consumable-ns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACR,eAAe,EACf,+BAA+B,EAClC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAErE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAExD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAC9D,CAAC,CAMH;AAED,MAAM,WAAW,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACpC,KAAK,CAAC,CACF,UAAU,EAAE,+BAA+B,GAC5C,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,CAAC,CACF,KAAK,EAAE,CAAC,EACR,UAAU,EAAE,+BAA+B,GAC5C,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,qBAAa,cAAc,CAAC,EAAE,CAAC,CAAC,CAAE,SAAQ,oBAAoB,CAC1D,eAAe,CAAC,CAAC,CAAC,CACrB;gBACe,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;CAoCzE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Consumable } from "./consumable.js";
|
|
2
|
+
import { WritableStream as NativeWritableStream } from "./stream.js";
|
|
3
|
+
export function getValue(value) {
|
|
4
|
+
return value instanceof Consumable ? value.value : value;
|
|
5
|
+
}
|
|
6
|
+
export function tryConsume(value, callback) {
|
|
7
|
+
if (value instanceof Consumable) {
|
|
8
|
+
return value.tryConsume(callback);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
return callback(value);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class WritableStream extends NativeWritableStream {
|
|
15
|
+
constructor(sink, strategy) {
|
|
16
|
+
let wrappedStrategy;
|
|
17
|
+
if (strategy) {
|
|
18
|
+
wrappedStrategy = {};
|
|
19
|
+
if ("highWaterMark" in strategy) {
|
|
20
|
+
wrappedStrategy.highWaterMark = strategy.highWaterMark;
|
|
21
|
+
}
|
|
22
|
+
if ("size" in strategy) {
|
|
23
|
+
wrappedStrategy.size = (chunk) => {
|
|
24
|
+
return strategy.size(chunk instanceof Consumable ? chunk.value : chunk);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
super({
|
|
29
|
+
start(controller) {
|
|
30
|
+
return sink.start?.(controller);
|
|
31
|
+
},
|
|
32
|
+
async write(chunk, controller) {
|
|
33
|
+
await tryConsume(chunk, (chunk) => sink.write?.(chunk, controller));
|
|
34
|
+
},
|
|
35
|
+
abort(reason) {
|
|
36
|
+
return sink.abort?.(reason);
|
|
37
|
+
},
|
|
38
|
+
close() {
|
|
39
|
+
return sink.close?.();
|
|
40
|
+
},
|
|
41
|
+
}, wrappedStrategy);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=maybe-consumable-ns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybe-consumable-ns.js","sourceRoot":"","sources":["../src/maybe-consumable-ns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAM7C,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,UAAU,QAAQ,CAAI,KAAyB;IACjD,OAAO,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,UAAU,CACtB,KAAQ,EACR,QAA6D;IAE7D,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,OAAO,QAAQ,CAAC,KAAc,CAAC,CAAC;IACpC,CAAC;AACL,CAAC;AAcD,MAAM,OAAO,cAAqB,SAAQ,oBAEzC;IACG,YAAY,IAA2B,EAAE,QAA6B;QAClE,IAAI,eAAgE,CAAC;QACrE,IAAI,QAAQ,EAAE,CAAC;YACX,eAAe,GAAG,EAAE,CAAC;YACrB,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;gBAC9B,eAAe,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;YAC3D,CAAC;YACD,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;gBACrB,eAAe,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE;oBAC7B,OAAO,QAAQ,CAAC,IAAK,CACjB,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CACpD,CAAC;gBACN,CAAC,CAAC;YACN,CAAC;QACL,CAAC;QAED,KAAK,CACD;YACI,KAAK,CAAC,UAAU;gBACZ,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC;YACpC,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU;gBACzB,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAC9B,IAAI,CAAC,KAAK,EAAE,CAAC,KAAU,EAAE,UAAU,CAAC,CACvC,CAAC;YACN,CAAC;YACD,KAAK,CAAC,MAAM;gBACR,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YACD,KAAK;gBACD,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1B,CAAC;SACJ,EACD,eAAe,CAClB,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -1,21 +1,4 @@
|
|
|
1
|
-
import { Consumable } from "./consumable.js";
|
|
2
|
-
import type { QueuingStrategy, WritableStreamDefaultController } from "./stream.js";
|
|
3
|
-
import { WritableStream as NativeWritableStream, TransformStream } from "./stream.js";
|
|
1
|
+
import type { Consumable } from "./consumable.js";
|
|
4
2
|
export type MaybeConsumable<T> = T | Consumable<T>;
|
|
5
|
-
export
|
|
6
|
-
function getValue<T>(value: MaybeConsumable<T>): T;
|
|
7
|
-
function tryConsume<T, R>(value: T, callback: (value: T extends Consumable<infer U> ? U : T) => R): R;
|
|
8
|
-
class UnwrapStream<T> extends TransformStream<MaybeConsumable<T>, T> {
|
|
9
|
-
constructor();
|
|
10
|
-
}
|
|
11
|
-
interface WritableStreamSink<in T> {
|
|
12
|
-
start?(controller: WritableStreamDefaultController): void | PromiseLike<void>;
|
|
13
|
-
write?(chunk: T, controller: WritableStreamDefaultController): void | PromiseLike<void>;
|
|
14
|
-
abort?(reason: unknown): void | PromiseLike<void>;
|
|
15
|
-
close?(): void | PromiseLike<void>;
|
|
16
|
-
}
|
|
17
|
-
class WritableStream<in T> extends NativeWritableStream<MaybeConsumable<T>> {
|
|
18
|
-
constructor(sink: WritableStreamSink<T>, strategy?: QueuingStrategy<T>);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
3
|
+
export * as MaybeConsumable from "./maybe-consumable-ns.js";
|
|
21
4
|
//# sourceMappingURL=maybe-consumable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maybe-consumable.d.ts","sourceRoot":"","sources":["../src/maybe-consumable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"maybe-consumable.d.ts","sourceRoot":"","sources":["../src/maybe-consumable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAEnD,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAC"}
|
package/esm/maybe-consumable.js
CHANGED
|
@@ -1,62 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { WritableStream as NativeWritableStream, TransformStream, } from "./stream.js";
|
|
3
|
-
export var MaybeConsumable;
|
|
4
|
-
(function (MaybeConsumable) {
|
|
5
|
-
function getValue(value) {
|
|
6
|
-
return value instanceof Consumable ? value.value : value;
|
|
7
|
-
}
|
|
8
|
-
MaybeConsumable.getValue = getValue;
|
|
9
|
-
function tryConsume(value, callback) {
|
|
10
|
-
if (value instanceof Consumable) {
|
|
11
|
-
return value.tryConsume(callback);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
return callback(value);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
MaybeConsumable.tryConsume = tryConsume;
|
|
18
|
-
class UnwrapStream extends TransformStream {
|
|
19
|
-
constructor() {
|
|
20
|
-
super({
|
|
21
|
-
transform(chunk, controller) {
|
|
22
|
-
MaybeConsumable.tryConsume(chunk, (chunk) => {
|
|
23
|
-
controller.enqueue(chunk);
|
|
24
|
-
});
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
MaybeConsumable.UnwrapStream = UnwrapStream;
|
|
30
|
-
class WritableStream extends NativeWritableStream {
|
|
31
|
-
constructor(sink, strategy) {
|
|
32
|
-
let wrappedStrategy;
|
|
33
|
-
if (strategy) {
|
|
34
|
-
wrappedStrategy = {};
|
|
35
|
-
if ("highWaterMark" in strategy) {
|
|
36
|
-
wrappedStrategy.highWaterMark = strategy.highWaterMark;
|
|
37
|
-
}
|
|
38
|
-
if ("size" in strategy) {
|
|
39
|
-
wrappedStrategy.size = (chunk) => {
|
|
40
|
-
return strategy.size(chunk instanceof Consumable ? chunk.value : chunk);
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
super({
|
|
45
|
-
start(controller) {
|
|
46
|
-
return sink.start?.(controller);
|
|
47
|
-
},
|
|
48
|
-
async write(chunk, controller) {
|
|
49
|
-
await MaybeConsumable.tryConsume(chunk, (chunk) => sink.write?.(chunk, controller));
|
|
50
|
-
},
|
|
51
|
-
abort(reason) {
|
|
52
|
-
return sink.abort?.(reason);
|
|
53
|
-
},
|
|
54
|
-
close() {
|
|
55
|
-
return sink.close?.();
|
|
56
|
-
},
|
|
57
|
-
}, wrappedStrategy);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
MaybeConsumable.WritableStream = WritableStream;
|
|
61
|
-
})(MaybeConsumable || (MaybeConsumable = {}));
|
|
1
|
+
export * as MaybeConsumable from "./maybe-consumable-ns.js";
|
|
62
2
|
//# sourceMappingURL=maybe-consumable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maybe-consumable.js","sourceRoot":"","sources":["../src/maybe-consumable.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"maybe-consumable.js","sourceRoot":"","sources":["../src/maybe-consumable.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAC"}
|
package/esm/push-readable.d.ts
CHANGED
|
@@ -7,8 +7,22 @@ export interface PushReadableStreamController<T> {
|
|
|
7
7
|
error(e?: unknown): void;
|
|
8
8
|
}
|
|
9
9
|
export type PushReadableStreamSource<T> = (controller: PushReadableStreamController<T>) => void | Promise<void>;
|
|
10
|
+
export type PushReadableLogger<T> = (event: {
|
|
11
|
+
source: "producer";
|
|
12
|
+
operation: "enqueue";
|
|
13
|
+
value: T;
|
|
14
|
+
phase: "start" | "waiting" | "ignored" | "complete";
|
|
15
|
+
} | {
|
|
16
|
+
source: "producer";
|
|
17
|
+
operation: "close" | "error";
|
|
18
|
+
explicit: boolean;
|
|
19
|
+
phase: "start" | "ignored" | "complete";
|
|
20
|
+
} | {
|
|
21
|
+
source: "consumer";
|
|
22
|
+
operation: "pull" | "cancel";
|
|
23
|
+
phase: "start" | "complete";
|
|
24
|
+
}) => void;
|
|
10
25
|
export declare class PushReadableStream<T> extends ReadableStream<T> {
|
|
11
|
-
#private;
|
|
12
26
|
/**
|
|
13
27
|
* Create a new `PushReadableStream` from a source.
|
|
14
28
|
*
|
|
@@ -16,6 +30,6 @@ export declare class PushReadableStream<T> extends ReadableStream<T> {
|
|
|
16
30
|
* when the `Promise` is resolved, and be errored when the `Promise` is rejected.
|
|
17
31
|
* @param strategy
|
|
18
32
|
*/
|
|
19
|
-
constructor(source: PushReadableStreamSource<T>, strategy?: QueuingStrategy<T>);
|
|
33
|
+
constructor(source: PushReadableStreamSource<T>, strategy?: QueuingStrategy<T>, logger?: PushReadableLogger<T>);
|
|
20
34
|
}
|
|
21
35
|
//# sourceMappingURL=push-readable.d.ts.map
|
|
@@ -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
|
|
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,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAChC,KAAK,EACC;IACI,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;CACvD,GACD;IACI,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;CAC3C,GACD;IACI,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;CAC/B,KACN,IAAI,CAAC;AAEV,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,EAC7B,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;CA+PrC"}
|
package/esm/push-readable.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { PromiseResolver } from "@yume-chan/async";
|
|
2
2
|
import { AbortController, ReadableStream } from "./stream.js";
|
|
3
3
|
export class PushReadableStream extends ReadableStream {
|
|
4
|
-
#zeroHighWaterMarkAllowEnqueue = false;
|
|
5
4
|
/**
|
|
6
5
|
* Create a new `PushReadableStream` from a source.
|
|
7
6
|
*
|
|
@@ -9,71 +8,231 @@ export class PushReadableStream extends ReadableStream {
|
|
|
9
8
|
* when the `Promise` is resolved, and be errored when the `Promise` is rejected.
|
|
10
9
|
* @param strategy
|
|
11
10
|
*/
|
|
12
|
-
constructor(source, strategy) {
|
|
11
|
+
constructor(source, strategy, logger) {
|
|
13
12
|
let waterMarkLow;
|
|
13
|
+
let zeroHighWaterMarkAllowEnqueue = false;
|
|
14
14
|
const abortController = new AbortController();
|
|
15
15
|
super({
|
|
16
|
-
start:
|
|
17
|
-
await Promise.resolve();
|
|
16
|
+
start: (controller) => {
|
|
18
17
|
const result = source({
|
|
19
18
|
abortSignal: abortController.signal,
|
|
20
19
|
enqueue: async (chunk) => {
|
|
20
|
+
logger?.({
|
|
21
|
+
source: "producer",
|
|
22
|
+
operation: "enqueue",
|
|
23
|
+
value: chunk,
|
|
24
|
+
phase: "start",
|
|
25
|
+
});
|
|
21
26
|
if (abortController.signal.aborted) {
|
|
22
|
-
//
|
|
23
|
-
// throw
|
|
24
|
-
|
|
27
|
+
// In original `ReadableStream`, calling `enqueue` or `close`
|
|
28
|
+
// on an cancelled stream will throw an error,
|
|
29
|
+
//
|
|
30
|
+
// But in `PushReadableStream`, `enqueue` is an async function,
|
|
31
|
+
// the producer can't just check `abortSignal.aborted`
|
|
32
|
+
// before calling `enqueue`, as it might change when waiting
|
|
33
|
+
// for the backpressure to be reduced.
|
|
34
|
+
//
|
|
35
|
+
// So IMO it's better to handle this for the producer
|
|
36
|
+
// by simply ignoring the `enqueue` call.
|
|
37
|
+
//
|
|
38
|
+
// Note that we check `abortSignal.aborted` instead of `stopped`,
|
|
39
|
+
// as it's not allowed for the producer to call `enqueue` after
|
|
40
|
+
// they called `close` or `error`.
|
|
41
|
+
//
|
|
42
|
+
// Obviously, the producer should listen to the `abortSignal` and
|
|
43
|
+
// stop producing, but most pushing data sources don't support that.
|
|
44
|
+
logger?.({
|
|
45
|
+
source: "producer",
|
|
46
|
+
operation: "enqueue",
|
|
47
|
+
value: chunk,
|
|
48
|
+
phase: "ignored",
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
25
51
|
}
|
|
26
52
|
if (controller.desiredSize === null) {
|
|
27
53
|
// `desiredSize` being `null` means the stream is in error state,
|
|
28
54
|
// `controller.enqueue` will throw an error for us.
|
|
29
55
|
controller.enqueue(chunk);
|
|
56
|
+
// istanbul ignore next
|
|
30
57
|
return;
|
|
31
58
|
}
|
|
32
|
-
if (
|
|
33
|
-
|
|
59
|
+
if (zeroHighWaterMarkAllowEnqueue) {
|
|
60
|
+
// When `highWaterMark` is set to `0`,
|
|
61
|
+
// `controller.desiredSize` will always be `0`,
|
|
62
|
+
// even if the consumer has called `reader.read()`.
|
|
63
|
+
// (in this case, each `reader.read()`/`pull`
|
|
64
|
+
// should allow one `enqueue` of any size)
|
|
65
|
+
//
|
|
66
|
+
// If the consumer has already called `reader.read()`,
|
|
67
|
+
// before the producer tries to `enqueue`,
|
|
68
|
+
// `controller.desiredSize` is `0` and normal `waterMarkLow` signal
|
|
69
|
+
// will never trigger,
|
|
70
|
+
// (because `ReadableStream` prevents reentrance of `pull`)
|
|
71
|
+
// The stream will stuck.
|
|
72
|
+
//
|
|
73
|
+
// So we need a special signal for this case.
|
|
74
|
+
zeroHighWaterMarkAllowEnqueue = false;
|
|
34
75
|
controller.enqueue(chunk);
|
|
76
|
+
logger?.({
|
|
77
|
+
source: "producer",
|
|
78
|
+
operation: "enqueue",
|
|
79
|
+
value: chunk,
|
|
80
|
+
phase: "complete",
|
|
81
|
+
});
|
|
35
82
|
return;
|
|
36
83
|
}
|
|
37
84
|
if (controller.desiredSize <= 0) {
|
|
85
|
+
logger?.({
|
|
86
|
+
source: "producer",
|
|
87
|
+
operation: "enqueue",
|
|
88
|
+
value: chunk,
|
|
89
|
+
phase: "waiting",
|
|
90
|
+
});
|
|
38
91
|
waterMarkLow = new PromiseResolver();
|
|
39
92
|
await waterMarkLow.promise;
|
|
93
|
+
// Recheck consumer cancellation after async operations.
|
|
94
|
+
if (abortController.signal.aborted) {
|
|
95
|
+
logger?.({
|
|
96
|
+
source: "producer",
|
|
97
|
+
operation: "enqueue",
|
|
98
|
+
value: chunk,
|
|
99
|
+
phase: "ignored",
|
|
100
|
+
});
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
40
103
|
}
|
|
41
|
-
// `controller.enqueue` will throw error for us
|
|
42
|
-
// if the stream is already errored.
|
|
43
104
|
controller.enqueue(chunk);
|
|
105
|
+
logger?.({
|
|
106
|
+
source: "producer",
|
|
107
|
+
operation: "enqueue",
|
|
108
|
+
value: chunk,
|
|
109
|
+
phase: "complete",
|
|
110
|
+
});
|
|
44
111
|
},
|
|
45
112
|
close() {
|
|
113
|
+
logger?.({
|
|
114
|
+
source: "producer",
|
|
115
|
+
operation: "close",
|
|
116
|
+
explicit: true,
|
|
117
|
+
phase: "start",
|
|
118
|
+
});
|
|
119
|
+
// Since `enqueue` on an cancelled stream won't throw an error,
|
|
120
|
+
// so does `close`.
|
|
121
|
+
if (abortController.signal.aborted) {
|
|
122
|
+
logger?.({
|
|
123
|
+
source: "producer",
|
|
124
|
+
operation: "close",
|
|
125
|
+
explicit: true,
|
|
126
|
+
phase: "ignored",
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
46
130
|
controller.close();
|
|
131
|
+
logger?.({
|
|
132
|
+
source: "producer",
|
|
133
|
+
operation: "close",
|
|
134
|
+
explicit: true,
|
|
135
|
+
phase: "complete",
|
|
136
|
+
});
|
|
47
137
|
},
|
|
48
138
|
error(e) {
|
|
139
|
+
logger?.({
|
|
140
|
+
source: "producer",
|
|
141
|
+
operation: "error",
|
|
142
|
+
explicit: true,
|
|
143
|
+
phase: "start",
|
|
144
|
+
});
|
|
145
|
+
// Calling `error` on an already closed or errored stream is a no-op.
|
|
49
146
|
controller.error(e);
|
|
147
|
+
logger?.({
|
|
148
|
+
source: "producer",
|
|
149
|
+
operation: "error",
|
|
150
|
+
explicit: true,
|
|
151
|
+
phase: "complete",
|
|
152
|
+
});
|
|
50
153
|
},
|
|
51
154
|
});
|
|
52
155
|
if (result && "then" in result) {
|
|
156
|
+
// If `source` returns a `Promise`,
|
|
157
|
+
// close the stream when the `Promise` is resolved,
|
|
158
|
+
// and error the stream when the `Promise` is rejected.
|
|
159
|
+
// The producer can return a never-settling `Promise`
|
|
160
|
+
// to disable this behavior.
|
|
53
161
|
result.then(() => {
|
|
162
|
+
logger?.({
|
|
163
|
+
source: "producer",
|
|
164
|
+
operation: "close",
|
|
165
|
+
explicit: false,
|
|
166
|
+
phase: "start",
|
|
167
|
+
});
|
|
54
168
|
try {
|
|
55
169
|
controller.close();
|
|
170
|
+
logger?.({
|
|
171
|
+
source: "producer",
|
|
172
|
+
operation: "close",
|
|
173
|
+
explicit: false,
|
|
174
|
+
phase: "complete",
|
|
175
|
+
});
|
|
56
176
|
}
|
|
57
|
-
catch
|
|
58
|
-
|
|
177
|
+
catch {
|
|
178
|
+
logger?.({
|
|
179
|
+
source: "producer",
|
|
180
|
+
operation: "close",
|
|
181
|
+
explicit: false,
|
|
182
|
+
phase: "ignored",
|
|
183
|
+
});
|
|
184
|
+
// The stream is already closed by the producer,
|
|
185
|
+
// Or cancelled by the consumer.
|
|
59
186
|
}
|
|
60
187
|
}, (e) => {
|
|
188
|
+
logger?.({
|
|
189
|
+
source: "producer",
|
|
190
|
+
operation: "error",
|
|
191
|
+
explicit: false,
|
|
192
|
+
phase: "start",
|
|
193
|
+
});
|
|
61
194
|
controller.error(e);
|
|
195
|
+
logger?.({
|
|
196
|
+
source: "producer",
|
|
197
|
+
operation: "error",
|
|
198
|
+
explicit: false,
|
|
199
|
+
phase: "complete",
|
|
200
|
+
});
|
|
62
201
|
});
|
|
63
202
|
}
|
|
64
203
|
},
|
|
65
204
|
pull: () => {
|
|
205
|
+
logger?.({
|
|
206
|
+
source: "consumer",
|
|
207
|
+
operation: "pull",
|
|
208
|
+
phase: "start",
|
|
209
|
+
});
|
|
66
210
|
if (waterMarkLow) {
|
|
67
211
|
waterMarkLow.resolve();
|
|
68
|
-
return;
|
|
69
212
|
}
|
|
70
|
-
if (strategy?.highWaterMark === 0) {
|
|
71
|
-
|
|
213
|
+
else if (strategy?.highWaterMark === 0) {
|
|
214
|
+
zeroHighWaterMarkAllowEnqueue = true;
|
|
72
215
|
}
|
|
216
|
+
logger?.({
|
|
217
|
+
source: "consumer",
|
|
218
|
+
operation: "pull",
|
|
219
|
+
phase: "complete",
|
|
220
|
+
});
|
|
73
221
|
},
|
|
74
222
|
cancel: (reason) => {
|
|
223
|
+
logger?.({
|
|
224
|
+
source: "consumer",
|
|
225
|
+
operation: "cancel",
|
|
226
|
+
phase: "start",
|
|
227
|
+
});
|
|
75
228
|
abortController.abort(reason);
|
|
76
|
-
|
|
229
|
+
// Resolve it on cancellation. `pull` will check `abortSignal.aborted` again.
|
|
230
|
+
waterMarkLow?.resolve();
|
|
231
|
+
logger?.({
|
|
232
|
+
source: "consumer",
|
|
233
|
+
operation: "cancel",
|
|
234
|
+
phase: "complete",
|
|
235
|
+
});
|
|
77
236
|
},
|
|
78
237
|
}, strategy);
|
|
79
238
|
}
|
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;
|
|
1
|
+
{"version":3,"file":"push-readable.js","sourceRoot":"","sources":["../src/push-readable.ts"],"names":[],"mappings":"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"}
|