@yume-chan/stream-extra 0.0.0-20240714132542

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.
Files changed (106) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/LICENSE +21 -0
  3. package/README.md +43 -0
  4. package/esm/buffered-transform.d.ts +11 -0
  5. package/esm/buffered-transform.d.ts.map +1 -0
  6. package/esm/buffered-transform.js +57 -0
  7. package/esm/buffered-transform.js.map +1 -0
  8. package/esm/buffered.d.ts +23 -0
  9. package/esm/buffered.d.ts.map +1 -0
  10. package/esm/buffered.js +138 -0
  11. package/esm/buffered.js.map +1 -0
  12. package/esm/concat.d.ts +36 -0
  13. package/esm/concat.d.ts.map +1 -0
  14. package/esm/concat.js +130 -0
  15. package/esm/concat.js.map +1 -0
  16. package/esm/consumable.d.ts +40 -0
  17. package/esm/consumable.d.ts.map +1 -0
  18. package/esm/consumable.js +130 -0
  19. package/esm/consumable.js.map +1 -0
  20. package/esm/distribution.d.ts +22 -0
  21. package/esm/distribution.d.ts.map +1 -0
  22. package/esm/distribution.js +103 -0
  23. package/esm/distribution.js.map +1 -0
  24. package/esm/duplex.d.ts +45 -0
  25. package/esm/duplex.d.ts.map +1 -0
  26. package/esm/duplex.js +93 -0
  27. package/esm/duplex.js.map +1 -0
  28. package/esm/encoding.d.ts +21 -0
  29. package/esm/encoding.d.ts.map +1 -0
  30. package/esm/encoding.js +4 -0
  31. package/esm/encoding.js.map +1 -0
  32. package/esm/index.d.ts +19 -0
  33. package/esm/index.d.ts.map +1 -0
  34. package/esm/index.js +19 -0
  35. package/esm/index.js.map +1 -0
  36. package/esm/inspect.d.ts +5 -0
  37. package/esm/inspect.d.ts.map +1 -0
  38. package/esm/inspect.js +12 -0
  39. package/esm/inspect.js.map +1 -0
  40. package/esm/maybe-consumable.d.ts +21 -0
  41. package/esm/maybe-consumable.d.ts.map +1 -0
  42. package/esm/maybe-consumable.js +62 -0
  43. package/esm/maybe-consumable.js.map +1 -0
  44. package/esm/pipe-from.d.ts +13 -0
  45. package/esm/pipe-from.d.ts.map +1 -0
  46. package/esm/pipe-from.js +24 -0
  47. package/esm/pipe-from.js.map +1 -0
  48. package/esm/push-readable.d.ts +35 -0
  49. package/esm/push-readable.d.ts.map +1 -0
  50. package/esm/push-readable.js +240 -0
  51. package/esm/push-readable.js.map +1 -0
  52. package/esm/split-string.d.ts +5 -0
  53. package/esm/split-string.d.ts.map +1 -0
  54. package/esm/split-string.js +25 -0
  55. package/esm/split-string.js.map +1 -0
  56. package/esm/stream.d.ts +25 -0
  57. package/esm/stream.d.ts.map +1 -0
  58. package/esm/stream.js +7 -0
  59. package/esm/stream.js.map +1 -0
  60. package/esm/struct-deserialize.d.ts +7 -0
  61. package/esm/struct-deserialize.d.ts.map +1 -0
  62. package/esm/struct-deserialize.js +9 -0
  63. package/esm/struct-deserialize.js.map +1 -0
  64. package/esm/struct-serialize.d.ts +6 -0
  65. package/esm/struct-serialize.d.ts.map +1 -0
  66. package/esm/struct-serialize.js +11 -0
  67. package/esm/struct-serialize.js.map +1 -0
  68. package/esm/task.d.ts +5 -0
  69. package/esm/task.d.ts.map +1 -0
  70. package/esm/task.js +9 -0
  71. package/esm/task.js.map +1 -0
  72. package/esm/types.d.ts +777 -0
  73. package/esm/types.d.ts.map +1 -0
  74. package/esm/types.js +3 -0
  75. package/esm/types.js.map +1 -0
  76. package/esm/wrap-readable.d.ts +22 -0
  77. package/esm/wrap-readable.d.ts.map +1 -0
  78. package/esm/wrap-readable.js +57 -0
  79. package/esm/wrap-readable.js.map +1 -0
  80. package/esm/wrap-writable.d.ts +15 -0
  81. package/esm/wrap-writable.d.ts.map +1 -0
  82. package/esm/wrap-writable.js +63 -0
  83. package/esm/wrap-writable.js.map +1 -0
  84. package/package.json +48 -0
  85. package/src/buffered-transform.ts +71 -0
  86. package/src/buffered.ts +160 -0
  87. package/src/concat.ts +162 -0
  88. package/src/consumable.ts +205 -0
  89. package/src/distribution.ts +123 -0
  90. package/src/duplex.ts +146 -0
  91. package/src/encoding.ts +39 -0
  92. package/src/index.ts +18 -0
  93. package/src/inspect.ts +12 -0
  94. package/src/maybe-consumable.ts +101 -0
  95. package/src/pipe-from.ts +28 -0
  96. package/src/push-readable.ts +307 -0
  97. package/src/split-string.ts +32 -0
  98. package/src/stream.ts +46 -0
  99. package/src/struct-deserialize.ts +14 -0
  100. package/src/struct-serialize.ts +15 -0
  101. package/src/task.ts +21 -0
  102. package/src/types.ts +881 -0
  103. package/src/wrap-readable.ts +93 -0
  104. package/src/wrap-writable.ts +88 -0
  105. package/tsconfig.build.json +8 -0
  106. package/tsconfig.build.tsbuildinfo +1 -0
@@ -0,0 +1,130 @@
1
+ import { PromiseResolver } from "@yume-chan/async";
2
+ import { ReadableStream as NativeReadableStream, WritableStream as NativeWritableStream, } from "./stream.js";
3
+ import { createTask } from "./task.js";
4
+ function isPromiseLike(value) {
5
+ return typeof value === "object" && value !== null && "then" in value;
6
+ }
7
+ export class Consumable {
8
+ #task;
9
+ #resolver;
10
+ value;
11
+ consumed;
12
+ constructor(value) {
13
+ this.#task = createTask("Consumable");
14
+ this.value = value;
15
+ this.#resolver = new PromiseResolver();
16
+ this.consumed = this.#resolver.promise;
17
+ }
18
+ consume() {
19
+ this.#resolver.resolve();
20
+ }
21
+ error(error) {
22
+ this.#resolver.reject(error);
23
+ }
24
+ tryConsume(callback) {
25
+ try {
26
+ let result = this.#task.run(() => callback(this.value));
27
+ if (isPromiseLike(result)) {
28
+ result = result.then((value) => {
29
+ this.#resolver.resolve();
30
+ return value;
31
+ }, (e) => {
32
+ this.#resolver.reject(e);
33
+ throw e;
34
+ });
35
+ }
36
+ else {
37
+ this.#resolver.resolve();
38
+ }
39
+ return result;
40
+ }
41
+ catch (e) {
42
+ this.#resolver.reject(e);
43
+ throw e;
44
+ }
45
+ }
46
+ }
47
+ (function (Consumable) {
48
+ class WritableStream extends NativeWritableStream {
49
+ static async write(writer, value) {
50
+ const consumable = new Consumable(value);
51
+ await writer.write(consumable);
52
+ await consumable.consumed;
53
+ }
54
+ constructor(sink, strategy) {
55
+ let wrappedStrategy;
56
+ if (strategy) {
57
+ wrappedStrategy = {};
58
+ if ("highWaterMark" in strategy) {
59
+ wrappedStrategy.highWaterMark = strategy.highWaterMark;
60
+ }
61
+ if ("size" in strategy) {
62
+ wrappedStrategy.size = (chunk) => {
63
+ return strategy.size(chunk instanceof Consumable ? chunk.value : chunk);
64
+ };
65
+ }
66
+ }
67
+ super({
68
+ start(controller) {
69
+ return sink.start?.(controller);
70
+ },
71
+ async write(chunk, controller) {
72
+ await chunk.tryConsume((chunk) => sink.write?.(chunk, controller));
73
+ },
74
+ abort(reason) {
75
+ return sink.abort?.(reason);
76
+ },
77
+ close() {
78
+ return sink.close?.();
79
+ },
80
+ }, wrappedStrategy);
81
+ }
82
+ }
83
+ Consumable.WritableStream = WritableStream;
84
+ class ReadableStream extends NativeReadableStream {
85
+ static async enqueue(controller, chunk) {
86
+ const output = new Consumable(chunk);
87
+ controller.enqueue(output);
88
+ await output.consumed;
89
+ }
90
+ constructor(source, strategy) {
91
+ let wrappedController;
92
+ let wrappedStrategy;
93
+ if (strategy) {
94
+ wrappedStrategy = {};
95
+ if ("highWaterMark" in strategy) {
96
+ wrappedStrategy.highWaterMark = strategy.highWaterMark;
97
+ }
98
+ if ("size" in strategy) {
99
+ wrappedStrategy.size = (chunk) => {
100
+ return strategy.size(chunk.value);
101
+ };
102
+ }
103
+ }
104
+ super({
105
+ async start(controller) {
106
+ wrappedController = {
107
+ async enqueue(chunk) {
108
+ await ReadableStream.enqueue(controller, chunk);
109
+ },
110
+ close() {
111
+ controller.close();
112
+ },
113
+ error(reason) {
114
+ controller.error(reason);
115
+ },
116
+ };
117
+ await source.start?.(wrappedController);
118
+ },
119
+ async pull() {
120
+ await source.pull?.(wrappedController);
121
+ },
122
+ async cancel(reason) {
123
+ await source.cancel?.(reason);
124
+ },
125
+ }, wrappedStrategy);
126
+ }
127
+ }
128
+ Consumable.ReadableStream = ReadableStream;
129
+ })(Consumable || (Consumable = {}));
130
+ //# sourceMappingURL=consumable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumable.js","sourceRoot":"","sources":["../src/consumable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { MaybeConsumable } from "./maybe-consumable.js";
2
+ import { TransformStream } from "./stream.js";
3
+ /**
4
+ * Splits or combines buffers to specified size.
5
+ */
6
+ export declare class BufferCombiner {
7
+ #private;
8
+ constructor(size: number);
9
+ /**
10
+ * Pushes data to the combiner.
11
+ * @param data The input data to be split or combined.
12
+ * @returns
13
+ * A generator that yields buffers of specified size.
14
+ * It may yield the same buffer multiple times, consume the data before calling `next`.
15
+ */
16
+ push(data: Uint8Array): Generator<Uint8Array, void, void>;
17
+ flush(): Uint8Array | undefined;
18
+ }
19
+ export declare class DistributionStream extends TransformStream<MaybeConsumable<Uint8Array>, MaybeConsumable<Uint8Array>> {
20
+ constructor(size: number, combine?: boolean);
21
+ }
22
+ //# sourceMappingURL=distribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../src/distribution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,qBAAa,cAAc;;gBAMX,IAAI,EAAE,MAAM;IAOxB;;;;;;OAMG;IACF,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IA0C1D,KAAK,IAAI,UAAU,GAAG,SAAS;CAUlC;AAED,qBAAa,kBAAmB,SAAQ,eAAe,CACnD,eAAe,CAAC,UAAU,CAAC,EAC3B,eAAe,CAAC,UAAU,CAAC,CAC9B;gBACe,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ;CAqC5C"}
@@ -0,0 +1,103 @@
1
+ import { Consumable } from "./consumable.js";
2
+ import { MaybeConsumable } from "./maybe-consumable.js";
3
+ import { TransformStream } from "./stream.js";
4
+ /**
5
+ * Splits or combines buffers to specified size.
6
+ */
7
+ export class BufferCombiner {
8
+ #capacity;
9
+ #buffer;
10
+ #offset;
11
+ #available;
12
+ constructor(size) {
13
+ this.#capacity = size;
14
+ this.#buffer = new Uint8Array(size);
15
+ this.#offset = 0;
16
+ this.#available = size;
17
+ }
18
+ /**
19
+ * Pushes data to the combiner.
20
+ * @param data The input data to be split or combined.
21
+ * @returns
22
+ * A generator that yields buffers of specified size.
23
+ * It may yield the same buffer multiple times, consume the data before calling `next`.
24
+ */
25
+ *push(data) {
26
+ let offset = 0;
27
+ let available = data.length;
28
+ if (this.#offset !== 0) {
29
+ if (available >= this.#available) {
30
+ this.#buffer.set(data.subarray(0, this.#available), this.#offset);
31
+ offset += this.#available;
32
+ available -= this.#available;
33
+ yield this.#buffer;
34
+ this.#offset = 0;
35
+ this.#available = this.#capacity;
36
+ if (available === 0) {
37
+ return;
38
+ }
39
+ }
40
+ else {
41
+ this.#buffer.set(data, this.#offset);
42
+ this.#offset += available;
43
+ this.#available -= available;
44
+ return;
45
+ }
46
+ }
47
+ while (available >= this.#capacity) {
48
+ const end = offset + this.#capacity;
49
+ yield data.subarray(offset, end);
50
+ offset = end;
51
+ available -= this.#capacity;
52
+ }
53
+ if (available > 0) {
54
+ this.#buffer.set(data.subarray(offset), this.#offset);
55
+ this.#offset += available;
56
+ this.#available -= available;
57
+ }
58
+ }
59
+ flush() {
60
+ if (this.#offset === 0) {
61
+ return undefined;
62
+ }
63
+ const output = this.#buffer.subarray(0, this.#offset);
64
+ this.#offset = 0;
65
+ this.#available = this.#capacity;
66
+ return output;
67
+ }
68
+ }
69
+ export class DistributionStream extends TransformStream {
70
+ constructor(size, combine = false) {
71
+ const combiner = combine ? new BufferCombiner(size) : undefined;
72
+ super({
73
+ async transform(chunk, controller) {
74
+ await MaybeConsumable.tryConsume(chunk, async (chunk) => {
75
+ if (combiner) {
76
+ for (const buffer of combiner.push(chunk)) {
77
+ await Consumable.ReadableStream.enqueue(controller, buffer);
78
+ }
79
+ }
80
+ else {
81
+ let offset = 0;
82
+ let available = chunk.length;
83
+ while (available > 0) {
84
+ const end = offset + size;
85
+ await Consumable.ReadableStream.enqueue(controller, chunk.subarray(offset, end));
86
+ offset = end;
87
+ available -= size;
88
+ }
89
+ }
90
+ });
91
+ },
92
+ flush(controller) {
93
+ if (combiner) {
94
+ const data = combiner.flush();
95
+ if (data) {
96
+ controller.enqueue(data);
97
+ }
98
+ }
99
+ },
100
+ });
101
+ }
102
+ }
103
+ //# sourceMappingURL=distribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribution.js","sourceRoot":"","sources":["../src/distribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { ValueOrPromise } from "@yume-chan/struct";
2
+ import type { QueuingStrategy, ReadableStream } from "./stream.js";
3
+ import { WritableStream } from "./stream.js";
4
+ import { WrapReadableStream } from "./wrap-readable.js";
5
+ export interface DuplexStreamFactoryOptions {
6
+ /**
7
+ * Callback when any `ReadableStream` is cancelled (the user doesn't need any more data),
8
+ * or `WritableStream` is ended (the user won't produce any more data),
9
+ * or `DuplexStreamFactory#close` is called.
10
+ *
11
+ * Usually you want to let the other peer know that the duplex stream should be closed.
12
+ *
13
+ * `dispose` will automatically be called after `close` completes,
14
+ * but if you want to wait another peer for a close confirmation and call
15
+ * `DuplexStreamFactory#dispose` yourself, you can return `false`
16
+ * (or a `Promise` that resolves to `false`) to disable the automatic call.
17
+ */
18
+ close?: (() => ValueOrPromise<boolean | void>) | undefined;
19
+ /**
20
+ * Callback when any `ReadableStream` is closed (the other peer doesn't produce any more data),
21
+ * or `WritableStream` is aborted (the other peer can't receive any more data),
22
+ * or `DuplexStreamFactory#abort` is called.
23
+ *
24
+ * Usually indicates the other peer has closed the duplex stream. You can clean up
25
+ * any resources you have allocated now.
26
+ */
27
+ dispose?: (() => void | Promise<void>) | undefined;
28
+ }
29
+ /**
30
+ * A factory for creating a duplex stream.
31
+ *
32
+ * It can create multiple `ReadableStream`s and `WritableStream`s,
33
+ * when any of them is closed, all other streams will be closed as well.
34
+ */
35
+ export declare class DuplexStreamFactory<R, W> {
36
+ #private;
37
+ get writableClosed(): boolean;
38
+ get closed(): Promise<void>;
39
+ constructor(options?: DuplexStreamFactoryOptions);
40
+ wrapReadable(readable: ReadableStream<R>, strategy?: QueuingStrategy<R>): WrapReadableStream<R>;
41
+ createWritable(stream: WritableStream<W>): WritableStream<W>;
42
+ close(): Promise<void>;
43
+ dispose(): Promise<void>;
44
+ }
45
+ //# sourceMappingURL=duplex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplex.d.ts","sourceRoot":"","sources":["../src/duplex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EACR,eAAe,EACf,cAAc,EAGjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMxD,MAAM,WAAW,0BAA0B;IACvC;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IAE3D;;;;;;;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;CAchB"}
package/esm/duplex.js ADDED
@@ -0,0 +1,93 @@
1
+ import { PromiseResolver } from "@yume-chan/async";
2
+ import { WritableStream } from "./stream.js";
3
+ import { WrapReadableStream } from "./wrap-readable.js";
4
+ const NOOP = () => {
5
+ // no-op
6
+ };
7
+ /**
8
+ * A factory for creating a duplex stream.
9
+ *
10
+ * It can create multiple `ReadableStream`s and `WritableStream`s,
11
+ * when any of them is closed, all other streams will be closed as well.
12
+ */
13
+ export class DuplexStreamFactory {
14
+ #readableControllers = [];
15
+ #writers = [];
16
+ #writableClosed = false;
17
+ get writableClosed() {
18
+ return this.#writableClosed;
19
+ }
20
+ #closed = new PromiseResolver();
21
+ get closed() {
22
+ return this.#closed.promise;
23
+ }
24
+ #options;
25
+ constructor(options) {
26
+ this.#options = options ?? {};
27
+ }
28
+ wrapReadable(readable, strategy) {
29
+ return new WrapReadableStream({
30
+ start: (controller) => {
31
+ this.#readableControllers.push(controller);
32
+ return readable;
33
+ },
34
+ cancel: async () => {
35
+ // cancel means the local peer wants to close the connection.
36
+ await this.close();
37
+ },
38
+ close: async () => {
39
+ // stream end means the remote peer closed the connection first.
40
+ await this.dispose();
41
+ },
42
+ }, strategy);
43
+ }
44
+ createWritable(stream) {
45
+ const writer = stream.getWriter();
46
+ this.#writers.push(writer);
47
+ // `WritableStream` has no way to tell if the remote peer has closed the connection.
48
+ // So it only triggers `close`.
49
+ return new WritableStream({
50
+ write: async (chunk) => {
51
+ await writer.write(chunk);
52
+ },
53
+ abort: async (reason) => {
54
+ await writer.abort(reason);
55
+ await this.close();
56
+ },
57
+ close: async () => {
58
+ // NOOP: the writer is already closed
59
+ await writer.close().catch(NOOP);
60
+ await this.close();
61
+ },
62
+ });
63
+ }
64
+ async close() {
65
+ if (this.#writableClosed) {
66
+ return;
67
+ }
68
+ this.#writableClosed = true;
69
+ // Call `close` first, so it can still write data to `WritableStream`s.
70
+ if ((await this.#options.close?.()) !== false) {
71
+ // `close` can return `false` to disable automatic `dispose`.
72
+ await this.dispose();
73
+ }
74
+ for (const writer of this.#writers) {
75
+ // NOOP: the writer is already closed
76
+ writer.close().catch(NOOP);
77
+ }
78
+ }
79
+ async dispose() {
80
+ this.#writableClosed = true;
81
+ this.#closed.resolve();
82
+ for (const controller of this.#readableControllers) {
83
+ try {
84
+ controller.close();
85
+ }
86
+ catch {
87
+ // ignore
88
+ }
89
+ }
90
+ await this.#options.dispose?.();
91
+ }
92
+ }
93
+ //# sourceMappingURL=duplex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplex.js","sourceRoot":"","sources":["../src/duplex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { TransformStream } from "./stream.js";
2
+ export interface TextDecoderOptions {
3
+ fatal?: boolean;
4
+ ignoreBOM?: boolean;
5
+ }
6
+ declare class TextDecoderStreamType extends TransformStream<ArrayBufferView | ArrayBuffer, string> {
7
+ constructor(label?: string, options?: TextDecoderOptions);
8
+ readonly encoding: string;
9
+ readonly fatal: boolean;
10
+ readonly ignoreBOM: boolean;
11
+ }
12
+ declare class TextEncoderStreamType extends TransformStream<string, Uint8Array> {
13
+ constructor();
14
+ readonly encoding: string;
15
+ }
16
+ export declare const TextDecoderStream: typeof TextDecoderStreamType;
17
+ export type TextDecoderStream = TextDecoderStreamType;
18
+ export declare const TextEncoderStream: typeof TextEncoderStreamType;
19
+ export type TextEncoderStream = TextEncoderStreamType;
20
+ export {};
21
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../src/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,OAAO,OAAO,qBAAsB,SAAQ,eAAe,CACvD,eAAe,GAAG,WAAW,EAC7B,MAAM,CACT;gBACe,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;IAExD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B;AAED,OAAO,OAAO,qBAAsB,SAAQ,eAAe,CACvD,MAAM,EACN,UAAU,CACb;;IAGG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC7B;AASD,eAAO,MAAM,iBAAiB,8BAA2B,CAAC;AAC1D,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAEtD,eAAO,MAAM,iBAAiB,8BAA2B,CAAC;AAC1D,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ const Global = globalThis;
2
+ export const TextDecoderStream = Global.TextDecoderStream;
3
+ export const TextEncoderStream = Global.TextEncoderStream;
4
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../src/encoding.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,GAAG,UAAwC,CAAC;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAG1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC"}
package/esm/index.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ export * from "./buffered-transform.js";
2
+ export * from "./buffered.js";
3
+ export * from "./concat.js";
4
+ export * from "./consumable.js";
5
+ export * from "./distribution.js";
6
+ export * from "./duplex.js";
7
+ export * from "./encoding.js";
8
+ export * from "./inspect.js";
9
+ export * from "./maybe-consumable.js";
10
+ export * from "./pipe-from.js";
11
+ export * from "./push-readable.js";
12
+ export * from "./split-string.js";
13
+ export * from "./stream.js";
14
+ export * from "./struct-deserialize.js";
15
+ export * from "./struct-serialize.js";
16
+ export * from "./task.js";
17
+ export * from "./wrap-readable.js";
18
+ export * from "./wrap-writable.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
package/esm/index.js ADDED
@@ -0,0 +1,19 @@
1
+ export * from "./buffered-transform.js";
2
+ export * from "./buffered.js";
3
+ export * from "./concat.js";
4
+ export * from "./consumable.js";
5
+ export * from "./distribution.js";
6
+ export * from "./duplex.js";
7
+ export * from "./encoding.js";
8
+ export * from "./inspect.js";
9
+ export * from "./maybe-consumable.js";
10
+ export * from "./pipe-from.js";
11
+ export * from "./push-readable.js";
12
+ export * from "./split-string.js";
13
+ export * from "./stream.js";
14
+ export * from "./struct-deserialize.js";
15
+ export * from "./struct-serialize.js";
16
+ export * from "./task.js";
17
+ export * from "./wrap-readable.js";
18
+ export * from "./wrap-writable.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,5 @@
1
+ import { TransformStream } from "./stream.js";
2
+ export declare class InspectStream<T> extends TransformStream<T, T> {
3
+ constructor(callback: (value: T) => void);
4
+ }
5
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,aAAa,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3C,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI;CAQ3C"}
package/esm/inspect.js ADDED
@@ -0,0 +1,12 @@
1
+ import { TransformStream } from "./stream.js";
2
+ export class InspectStream extends TransformStream {
3
+ constructor(callback) {
4
+ super({
5
+ transform(chunk, controller) {
6
+ callback(chunk);
7
+ controller.enqueue(chunk);
8
+ },
9
+ });
10
+ }
11
+ }
12
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,OAAO,aAAiB,SAAQ,eAAqB;IACvD,YAAY,QAA4B;QACpC,KAAK,CAAC;YACF,SAAS,CAAC,KAAK,EAAE,UAAU;gBACvB,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ"}
@@ -0,0 +1,21 @@
1
+ import { Consumable } from "./consumable.js";
2
+ import type { QueuingStrategy, WritableStreamDefaultController } from "./stream.js";
3
+ import { WritableStream as NativeWritableStream, TransformStream } from "./stream.js";
4
+ export type MaybeConsumable<T> = T | Consumable<T>;
5
+ export declare namespace MaybeConsumable {
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
+ }
21
+ //# sourceMappingURL=maybe-consumable.d.ts.map
@@ -0,0 +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;AAC7C,OAAO,KAAK,EACR,eAAe,EACf,+BAA+B,EAClC,MAAM,aAAa,CAAC;AACrB,OAAO,EACH,cAAc,IAAI,oBAAoB,EACtC,eAAe,EAClB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAEnD,yBAAiB,eAAe,CAAC;IAC7B,SAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAExD;IAED,SAAgB,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;IAED,MAAa,YAAY,CAAC,CAAC,CAAE,SAAQ,eAAe,CAChD,eAAe,CAAC,CAAC,CAAC,EAClB,CAAC,CACJ;;KAUA;IAED,UAAiB,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,CACF,UAAU,EAAE,+BAA+B,GAC5C,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,CAAC,CACF,KAAK,EAAE,CAAC,EACR,UAAU,EAAE,+BAA+B,GAC5C,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;KACtC;IAED,MAAa,cAAc,CAAC,EAAE,CAAC,CAAC,CAAE,SAAQ,oBAAoB,CAC1D,eAAe,CAAC,CAAC,CAAC,CACrB;oBAEO,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;KAuCpC;CACJ"}
@@ -0,0 +1,62 @@
1
+ import { Consumable } from "./consumable.js";
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 = {}));
62
+ //# sourceMappingURL=maybe-consumable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maybe-consumable.js","sourceRoot":"","sources":["../src/maybe-consumable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,OAAO,EACH,cAAc,IAAI,oBAAoB,EACtC,eAAe,GAClB,MAAM,aAAa,CAAC;AAIrB,MAAM,KAAW,eAAe,CAwF/B;AAxFD,WAAiB,eAAe;IAC5B,SAAgB,QAAQ,CAAI,KAAyB;QACjD,OAAO,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,CAAC;IAFe,wBAAQ,WAEvB,CAAA;IAED,SAAgB,UAAU,CACtB,KAAQ,EACR,QAA6D;QAE7D,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACJ,OAAO,QAAQ,CAAC,KAAc,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;IATe,0BAAU,aASzB,CAAA;IAED,MAAa,YAAgB,SAAQ,eAGpC;QACG;YACI,KAAK,CAAC;gBACF,SAAS,CAAC,KAAK,EAAE,UAAU;oBACvB,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACxC,UAAU,CAAC,OAAO,CAAC,KAAU,CAAC,CAAC;oBACnC,CAAC,CAAC,CAAC;gBACP,CAAC;aACJ,CAAC,CAAC;QACP,CAAC;KACJ;IAbY,4BAAY,eAaxB,CAAA;IAcD,MAAa,cAAqB,SAAQ,oBAEzC;QACG,YACI,IAA2B,EAC3B,QAA6B;YAE7B,IAAI,eAEW,CAAC;YAChB,IAAI,QAAQ,EAAE,CAAC;gBACX,eAAe,GAAG,EAAE,CAAC;gBACrB,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;oBAC9B,eAAe,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;gBAC3D,CAAC;gBACD,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;oBACrB,eAAe,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE;wBAC7B,OAAO,QAAQ,CAAC,IAAK,CACjB,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CACpD,CAAC;oBACN,CAAC,CAAC;gBACN,CAAC;YACL,CAAC;YAED,KAAK,CACD;gBACI,KAAK,CAAC,UAAU;oBACZ,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC;gBACpC,CAAC;gBACD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU;oBACzB,MAAM,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAC9C,IAAI,CAAC,KAAK,EAAE,CAAC,KAAU,EAAE,UAAU,CAAC,CACvC,CAAC;gBACN,CAAC;gBACD,KAAK,CAAC,MAAM;oBACR,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;gBAChC,CAAC;gBACD,KAAK;oBACD,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC1B,CAAC;aACJ,EACD,eAAe,CAClB,CAAC;QACN,CAAC;KACJ;IA5CY,8BAAc,iBA4C1B,CAAA;AACL,CAAC,EAxFgB,eAAe,KAAf,eAAe,QAwF/B"}
@@ -0,0 +1,13 @@
1
+ import type { ReadableWritablePair } from "./stream.js";
2
+ import { WritableStream } from "./stream.js";
3
+ /**
4
+ * Pipe `pair.readable` to `writable`, then returns `pair.writable`.
5
+ *
6
+ * This is the opposite of `ReadableStream#pipeThrough()`.
7
+ *
8
+ * @param writable The `WritableStream` to write to.
9
+ * @param pair A `TransformStream` that converts chunks.
10
+ * @returns `pair`'s `writable` stream.
11
+ */
12
+ export declare function pipeFrom<W, T>(writable: WritableStream<W>, pair: ReadableWritablePair<W, T>): import("./types.js").WritableStream<T>;
13
+ //# sourceMappingURL=pipe-from.d.ts.map