from-node-stream
Advanced tools
| export {}; |
+3
-0
@@ -19,2 +19,5 @@ import { Readable, Writable } from "stream"; | ||
| }): TransformStream<string | Uint8Array, string | Uint8Array>; | ||
| /** | ||
| * Make TransformStream from stdio | ||
| */ | ||
| export declare function fromStdio( | ||
@@ -21,0 +24,0 @@ /** a process, which has stdin, stdout, stderr */ |
@@ -5,9 +5,9 @@ { | ||
| "sourcesContent": [ | ||
| "import { mergeStream } from \"sflow\"; // TODO: tree shake sflow\nimport { Readable, Writable } from \"stream\";\nimport { fromReadable } from \"./fromReadable\";\nimport { fromWritable } from \"./fromWritable\";\n\nexport function fromStdioDropErr(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | null;\n stdout?: Readable | null;\n stderr?: Readable | null;\n }\n): TransformStream<string | Uint8Array, string | Uint8Array> {\n return {\n writable: fromWritable(p.stdin!),\n readable: fromReadable(p.stdout!),\n };\n}\n\n/** Make TransformStream from stdio*/\nexport function fromStdioMergeError(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | null;\n stdout?: Readable | null;\n stderr?: Readable | null;\n }\n): TransformStream<string | Uint8Array, string | Uint8Array> {\n const stdin = fromWritable(p.stdin!);\n const stdout = fromReadable(p.stdout!);\n const stderr = fromReadable(p.stderr!);\n return {\n writable: stdin,\n readable: mergeStream(stdout, stderr),\n };\n}\n\nexport function fromStdio(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | null;\n stdout?: Readable | null;\n stderr?: Readable | null;\n },\n {\n stderr,\n }: {\n /** specify stderr to forward, or set to null to drop. */\n stderr?: Writable | null;\n } = {}\n): TransformStream<string | Uint8Array, string | Uint8Array> {\n if (p.stderr?.pipe && stderr?.pipe)\n fromReadable(p.stderr).pipeTo(fromWritable(stderr), {\n preventClose: true,\n });\n if (stderr === undefined) {\n return fromStdioMergeError(p);\n } else {\n return fromStdioDropErr(p);\n }\n}\nexport { fromReadable, fromWritable };\n", | ||
| "import { mergeStream } from \"sflow\"; // TODO: tree shake sflow\nimport { Readable, Writable } from \"stream\";\nimport { fromReadable } from \"./fromReadable\";\nimport { fromWritable } from \"./fromWritable\";\n\nexport function fromStdioDropErr(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | null;\n stdout?: Readable | null;\n stderr?: Readable | null;\n }\n): TransformStream<string | Uint8Array, string | Uint8Array> {\n return {\n writable: fromWritable(p.stdin!),\n readable: fromReadable(p.stdout!),\n };\n}\n\n/** Make TransformStream from stdio*/\nexport function fromStdioMergeError(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | null;\n stdout?: Readable | null;\n stderr?: Readable | null;\n }\n): TransformStream<string | Uint8Array, string | Uint8Array> {\n const stdin = fromWritable(p.stdin!);\n const stdout = fromReadable(p.stdout!);\n const stderr = fromReadable(p.stderr!);\n return {\n writable: stdin,\n readable: mergeStream(stdout, stderr),\n };\n}\n/**\n * Make TransformStream from stdio\n */\nexport function fromStdio(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | null;\n stdout?: Readable | null;\n stderr?: Readable | null;\n },\n {\n stderr,\n }: {\n /** specify stderr to forward, or set to null to drop. */\n stderr?: Writable | null;\n } = {}\n): TransformStream<string | Uint8Array, string | Uint8Array> {\n if (p.stderr?.pipe && stderr?.pipe)\n fromReadable(p.stderr).pipeTo(fromWritable(stderr), {\n preventClose: true,\n });\n if (stderr === undefined) {\n return fromStdioMergeError(p);\n } else {\n return fromStdioDropErr(p);\n }\n}\nexport { fromReadable, fromWritable };\n", | ||
| "import type { Readable } from \"stream\";\n\nexport function fromReadable<T extends string | Uint8Array>(\n i: Readable | NodeJS.ReadableStream\n): ReadableStream<T> {\n return new ReadableStream({\n start: (c) => {\n i.on(\"data\", (data) => c.enqueue(data));\n i.on(\"close\", () => c.close());\n i.on(\"error\", (err) => c.error(err));\n },\n cancel: (reason) => (\n (i as Partial<Readable> & Partial<NodeJS.ReadableStream>).destroy?.(\n reason\n ),\n undefined\n ),\n });\n}\n", | ||
| "import type { Writable } from \"stream\";\n\nexport function fromWritable<T extends string | Uint8Array>(\n i: Writable | NodeJS.WritableStream\n): WritableStream<T> {\n return new WritableStream({\n start: (c) => (i.on(\"error\", (err) => c.error(err)), undefined),\n abort: (reason) => (\n (i as Partial<Writable> & Partial<NodeJS.WritableStream>).destroy?.(\n reason\n ),\n undefined\n ),\n write: (data: string | Uint8Array, c) => (i.write(data), undefined),\n close: () => (i.end(), undefined),\n });\n}\n" | ||
| ], | ||
| "mappings": ";AAAA;;;ACEO,SAAS,YAA2C,CACzD,GACmB;AACnB,SAAO,IAAI,eAAe;AAAA,IACxB,OAAO,CAAC,MAAM;AACZ,QAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAQ,IAAI,CAAC;AACtC,QAAE,GAAG,SAAS,MAAM,EAAE,MAAM,CAAC;AAC7B,QAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC;AAAA;AAAA,IAErC,QAAQ,CAAC,YACN,EAAyD,UACxD,MACF,GACA;AAAA,EAEJ,CAAC;AAAA;;;ACfI,SAAS,YAA2C,CACzD,GACmB;AACnB,SAAO,IAAI,eAAe;AAAA,IACxB,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG;AAAA,IACrD,OAAO,CAAC,YACL,EAAyD,UACxD,MACF,GACA;AAAA,IAEF,OAAO,CAAC,MAA2B,OAAO,EAAE,MAAM,IAAI,GAAG;AAAA,IACzD,OAAO,OAAO,EAAE,IAAI,GAAG;AAAA,EACzB,CAAC;AAAA;;;AFVI,SAAS,gBAAgB,CAE9B,GAK2D;AAC3D,SAAO;AAAA,IACL,UAAU,aAAa,EAAE,KAAM;AAAA,IAC/B,UAAU,aAAa,EAAE,MAAO;AAAA,EAClC;AAAA;AAIK,SAAS,mBAAmB,CAEjC,GAK2D;AAC3D,QAAM,QAAQ,aAAa,EAAE,KAAM;AACnC,QAAM,SAAS,aAAa,EAAE,MAAO;AACrC,QAAM,SAAS,aAAa,EAAE,MAAO;AACrC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAU,YAAY,QAAQ,MAAM;AAAA,EACtC;AAAA;AAGK,SAAS,SAAS,CAEvB;AAAA,EAME;AAAA,IAIE,CAAC,GACsD;AAC3D,MAAI,EAAE,QAAQ,QAAQ,QAAQ;AAC5B,iBAAa,EAAE,MAAM,EAAE,OAAO,aAAa,MAAM,GAAG;AAAA,MAClD,cAAc;AAAA,IAChB,CAAC;AACH,MAAI,WAAW,WAAW;AACxB,WAAO,oBAAoB,CAAC;AAAA,EAC9B,OAAO;AACL,WAAO,iBAAiB,CAAC;AAAA;AAAA;", | ||
| "mappings": ";AAAA;;;ACEO,SAAS,YAA2C,CACzD,GACmB;AAAA,EACnB,OAAO,IAAI,eAAe;AAAA,IACxB,OAAO,CAAC,MAAM;AAAA,MACZ,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,MACtC,EAAE,GAAG,SAAS,MAAM,EAAE,MAAM,CAAC;AAAA,MAC7B,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC;AAAA;AAAA,IAErC,QAAQ,CAAC,YACN,EAAyD,UACxD,MACF,GACA;AAAA,EAEJ,CAAC;AAAA;;;ACfI,SAAS,YAA2C,CACzD,GACmB;AAAA,EACnB,OAAO,IAAI,eAAe;AAAA,IACxB,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG;AAAA,IACrD,OAAO,CAAC,YACL,EAAyD,UACxD,MACF,GACA;AAAA,IAEF,OAAO,CAAC,MAA2B,OAAO,EAAE,MAAM,IAAI,GAAG;AAAA,IACzD,OAAO,OAAO,EAAE,IAAI,GAAG;AAAA,EACzB,CAAC;AAAA;;;AFVI,SAAS,gBAAgB,CAE9B,GAK2D;AAAA,EAC3D,OAAO;AAAA,IACL,UAAU,aAAa,EAAE,KAAM;AAAA,IAC/B,UAAU,aAAa,EAAE,MAAO;AAAA,EAClC;AAAA;AAIK,SAAS,mBAAmB,CAEjC,GAK2D;AAAA,EAC3D,MAAM,QAAQ,aAAa,EAAE,KAAM;AAAA,EACnC,MAAM,SAAS,aAAa,EAAE,MAAO;AAAA,EACrC,MAAM,SAAS,aAAa,EAAE,MAAO;AAAA,EACrC,OAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAU,YAAY,QAAQ,MAAM;AAAA,EACtC;AAAA;AAKK,SAAS,SAAS,CAEvB;AAAA,EAME;AAAA,IAIE,CAAC,GACsD;AAAA,EAC3D,IAAI,EAAE,QAAQ,QAAQ,QAAQ;AAAA,IAC5B,aAAa,EAAE,MAAM,EAAE,OAAO,aAAa,MAAM,GAAG;AAAA,MAClD,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,IAAI,WAAW,WAAW;AAAA,IACxB,OAAO,oBAAoB,CAAC;AAAA,EAC9B,EAAO;AAAA,IACL,OAAO,iBAAiB,CAAC;AAAA;AAAA;", | ||
| "debugId": "14BF211E607D71C964756E2164756E21", | ||
| "names": [] | ||
| } |
+3
-1
@@ -37,3 +37,5 @@ import { mergeStream } from "sflow"; // TODO: tree shake sflow | ||
| } | ||
| /** | ||
| * Make TransformStream from stdio | ||
| */ | ||
| export function fromStdio( | ||
@@ -40,0 +42,0 @@ /** a process, which has stdin, stdout, stderr */ |
+2
-4
| { | ||
| "name": "from-node-stream", | ||
| "version": "0.0.10", | ||
| "version": "0.0.11", | ||
| "description": "convert nodejs-stream into webstream", | ||
@@ -54,7 +54,5 @@ "keywords": [ | ||
| "semantic-release": "^24.2.1", | ||
| "sflow": "^1.19.1" | ||
| }, | ||
| "peerDependencies": { | ||
| "sflow": "^1.19.1", | ||
| "typescript": "^5.6.3" | ||
| } | ||
| } |
+106
-0
| # from-node-stream | ||
| ## Usage Examples | ||
| ### Basic: Read and Write from Node Streams | ||
| ```ts | ||
| import { exec } from "child_process"; | ||
| import { fromWritable, fromReadable } from "from-node-stream"; | ||
| const p = exec("sh"); | ||
| // Write to stdin | ||
| const writer = fromWritable(p.stdin!).getWriter(); | ||
| await writer.write("echo hello, world\n"); | ||
| await writer.close(); | ||
| // Read from stdout | ||
| const reader = fromReadable(p.stdout!).getReader(); | ||
| let output = ""; | ||
| while (true) { | ||
| const { value, done } = await reader.read(); | ||
| if (done) break; | ||
| output += typeof value === "string" ? value : new TextDecoder().decode(value); | ||
| } | ||
| console.log(output); // "hello, world\n" | ||
| ``` | ||
| ### Using `fromStdioDropErr` | ||
| ```ts | ||
| import { exec } from "child_process"; | ||
| import { fromStdioDropErr } from "from-node-stream"; | ||
| const p = exec("sh"); | ||
| // Write to stdin | ||
| const writer = fromStdioDropErr(p).writable.getWriter(); | ||
| await writer.write("echo hello, world\n"); | ||
| await writer.close(); | ||
| // Read from stdout | ||
| const reader = fromStdioDropErr(p).readable.getReader(); | ||
| let output = ""; | ||
| while (true) { | ||
| const { value, done } = await reader.read(); | ||
| if (done) break; | ||
| output += typeof value === "string" ? value : new TextDecoder().decode(value); | ||
| } | ||
| console.log(output); // "hello, world\n" | ||
| ``` | ||
| ### Using `fromStdioMergeError` | ||
| ```ts | ||
| import { exec } from "child_process"; | ||
| import { fromStdioMergeError } from "from-node-stream"; | ||
| const p = exec("sh"); | ||
| // Write to stdin | ||
| const writer = fromStdioMergeError(p).writable.getWriter(); | ||
| await writer.write("echo oops, error>&2 && echo hell, word\n"); | ||
| await writer.close(); | ||
| // Read merged stdout and stderr | ||
| const reader = fromStdioMergeError(p).readable.getReader(); | ||
| let output = ""; | ||
| while (true) { | ||
| const { value, done } = await reader.read(); | ||
| if (done) break; | ||
| output += typeof value === "string" ? value : new TextDecoder().decode(value); | ||
| } | ||
| console.log(output); // "oops, error\nhell, word\n" | ||
| ``` | ||
| ### Drop stderr with `fromStdioDropErr` | ||
| ```ts | ||
| import { exec } from "child_process"; | ||
| import { fromStdioDropErr } from "from-node-stream"; | ||
| const p = exec("sh"); | ||
| // Write to stdin | ||
| const writer = fromStdioDropErr(p).writable.getWriter(); | ||
| await writer.write("echo oops, error>&2 && echo hell, word\n"); | ||
| await writer.close(); | ||
| // Read from stdout only (stderr dropped) | ||
| const reader = fromStdioDropErr(p).readable.getReader(); | ||
| let output = ""; | ||
| while (true) { | ||
| const { value, done } = await reader.read(); | ||
| if (done) break; | ||
| output += typeof value === "string" ? value : new TextDecoder().decode(value); | ||
| } | ||
| ``` | ||
| ### Stdio Passthrough Example | ||
| Create a script that pipes process stdin through a bash process and then to stdout: | ||
| ```ts | ||
| import { exec } from "child_process"; | ||
| import { fromStdio } from "from-node-stream"; | ||
| import { fromReadable } from "from-node-stream/fromReadable"; | ||
| import { fromWritable } from "from-node-stream/fromWritable"; | ||
| // Execute everything from stdin in bash and then output to stdout | ||
| await fromReadable(process.stdin) | ||
| .pipeThrough(fromStdio(exec("bash"))) | ||
| .pipeTo(fromWritable(process.stdout)); | ||
| ``` | ||
| ## Development | ||
| To install dependencies: | ||
@@ -4,0 +110,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
16972
23.22%1
-50%14
7.69%226
3.2%122
662.5%1
-50%7
16.67%