from-node-stream
Version:
convert nodejs-stream into webstream
1 lines • 9.9 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","names":[],"sources":["../ts/fromReadable.ts","../ts/fromWritable.ts","../ts/fromDuplex.ts","../ts/index.ts"],"sourcesContent":["import type { Readable } from \"stream\";\n\n/**\n * Converts a Node.js Readable stream to a Web API ReadableStream\n * @template T - The type of data being read (string or Uint8Array)\n * @param i - The Node.js readable stream to convert\n * @returns A Web API ReadableStream that wraps the Node.js stream\n */\nexport function fromReadable<T extends string | Uint8Array>(\n i: Readable | NodeJS.ReadableStream | ReadableStream\n): ReadableStream<T> {\n if (i instanceof ReadableStream) return i\n const stream = i as Readable;\n return new ReadableStream({\n start: (c) => {\n stream.on(\"data\", (data: T) => c.enqueue(data));\n stream.on(\"close\", () => c.close());\n stream.on(\"error\", (err: Error) => c.error(err));\n },\n cancel: (reason) => (\n (stream as Partial<Readable> & Partial<NodeJS.ReadableStream>).destroy?.(\n reason\n ),\n undefined\n ),\n });\n}\n","import type { Writable } from \"stream\";\n\n/**\n * Converts a Node.js Writable stream to a Web API WritableStream\n * @template T - The type of data being written (string or Uint8Array)\n * @param i - The Node.js writable stream to convert\n * @returns A Web API WritableStream that wraps the Node.js stream\n */\nexport function fromWritable<T extends string | Uint8Array>(\n i: Writable | NodeJS.WritableStream | WritableStream\n): WritableStream<T> {\n if(i instanceof WritableStream) return i\n const stream = i as Writable;\n return new WritableStream({\n start: (c) => (stream.on(\"error\", (err: Error) => c.error(err)), undefined),\n abort: (reason) => (\n (stream as Partial<Writable> & Partial<NodeJS.WritableStream>).destroy?.(\n reason\n ),\n undefined\n ),\n write: (data: string | Uint8Array, c) => (stream.write(data), undefined),\n close: () => (stream.end(), undefined),\n });\n}\n","import type { Duplex } from \"stream\";\nimport { fromReadable } from \"./fromReadable.ts\";\nimport { fromWritable } from \"./fromWritable.ts\";\n\n/**\n * Converts a Node.js Duplex stream to a Web API TransformStream\n * @template IN - The type of data being written (string or Uint8Array)\n * @template OUT - The type of data being read (string or Uint8Array)\n * @param duplex - The Node.js duplex stream to convert\n * @returns A Web API TransformStream that wraps the Node.js duplex stream\n */\nexport function fromDuplex<IN extends string | Uint8Array, OUT extends string | Uint8Array>(\n duplex: Duplex | TransformStream\n): TransformStream<IN, OUT> {\n if (duplex instanceof TransformStream) return duplex;\n \n return {\n readable: fromReadable<OUT>(duplex),\n writable: fromWritable<IN>(duplex),\n };\n}","import type { Readable, Writable } from \"stream\";\nimport { fromReadable } from \"./fromReadable.ts\";\nimport { fromWritable } from \"./fromWritable.ts\";\nimport { fromDuplex } from \"./fromDuplex.ts\";\n\n// Native implementation to replace sflow mergeStream\nfunction mergeStream<T>(...streams: ReadableStream<T>[]): ReadableStream<T> {\n return new ReadableStream<T>({\n start(controller) {\n let activeStreams = streams.length;\n\n streams.forEach(async (stream) => {\n try {\n const reader = stream.getReader();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n controller.enqueue(value);\n }\n\n reader.releaseLock();\n } catch (error) {\n controller.error(error);\n return;\n } finally {\n activeStreams--;\n if (activeStreams === 0) {\n controller.close();\n }\n }\n });\n }\n });\n}\n\n/**\n * Creates a TransformStream from a process's stdio, dropping stderr output\n * @template IN - Input data type (string or Uint8Array)\n * @template OUT - Output data type (string or Uint8Array)\n * @param p - A process object with stdin, stdout, and stderr streams\n * @returns A TransformStream that connects stdin to stdout, ignoring stderr\n */\nexport function fromStdioDropErr<IN extends string | Uint8Array, OUT extends string | Uint8Array>(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | WritableStream | null;\n stdout?: Readable | ReadableStream | null;\n stderr?: Readable | ReadableStream | null;\n }\n): TransformStream<IN, OUT> {\n return {\n writable: fromWritable<IN>(p.stdin!),\n readable: fromReadable<OUT>(p.stdout!),\n };\n}\n\n/**\n * Creates a TransformStream from a process's stdio, merging stdout and stderr\n * @template IN - Input data type (string or Uint8Array)\n * @template OUT - Output data type (string or Uint8Array)\n * @param p - A process object with stdin, stdout, and stderr streams\n * @returns A TransformStream that connects stdin to a merged stdout+stderr stream\n */\nexport function fromStdioMergeError<IN extends string | Uint8Array, OUT extends string | Uint8Array>(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | WritableStream | null;\n stdout?: Readable | ReadableStream | null;\n stderr?: Readable | ReadableStream | null;\n }\n): TransformStream<IN, OUT> {\n const stdin = fromWritable<IN>(p.stdin!);\n const stdout = fromReadable<OUT>(p.stdout!);\n const stderr = fromReadable<OUT>(p.stderr!);\n return {\n writable: stdin,\n readable: mergeStream(stdout, stderr),\n };\n}\n\n/**\n * Creates a TransformStream from a process's stdio, forwarding stderr to a specified stream\n * @template IN - Input data type (string or Uint8Array)\n * @template OUT - Output data type (string or Uint8Array)\n * @param p - A process object with stdin, stdout, and stderr streams\n * @param options - Configuration object\n * @param options.stderr - The writable stream to forward stderr to\n * @returns A TransformStream that connects stdin to stdout, forwarding stderr separately\n */\nexport function fromStdioAndForwardError<IN extends string | Uint8Array, OUT extends string | Uint8Array>(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | WritableStream | null;\n stdout?: Readable | ReadableStream | null;\n stderr?: Readable | ReadableStream | null;\n },\n { stderr }: {\n stderr: Writable | WritableStream\n }\n): TransformStream<IN, OUT> {\n const stdin = fromWritable<IN>(p.stdin!);\n const stdout = fromReadable<OUT>(p.stdout!);\n if (p.stderr)\n fromReadable(p.stderr).pipeTo(fromWritable(stderr));\n return {\n writable: stdin, readable: stdout,\n };\n}\n\n/**\n * Creates a TransformStream from a process's stdio with configurable stderr handling\n * @template IN - Input data type (string or Uint8Array)\n * @template OUT - Output data type (string or Uint8Array)\n * @param p - A process object with stdin, stdout, and stderr streams\n * @param options - Configuration object for stderr handling\n * @param options.stderr - Writable stream to forward stderr to, or null to drop stderr, or undefined to merge with stdout\n * @returns A TransformStream that connects stdin to stdout with the specified stderr behavior\n */\nexport function fromStdio<IN extends string | Uint8Array, OUT extends string | Uint8Array>(\n /** a process, which has stdin, stdout, stderr */\n p: {\n stdin?: Writable | WritableStream | null;\n stdout?: Readable | ReadableStream | null;\n stderr?: Readable | ReadableStream | null;\n },\n {\n stderr,\n }: {\n /** specify stderr to forward, or set to null to drop. */\n stderr?: Writable | WritableStream | null;\n } = {}\n): TransformStream<IN, OUT> {\n if (stderr === undefined) {\n return fromStdioMergeError(p);\n\n } else if (stderr === null) {\n return fromStdioDropErr(p);\n } else {\n // forward stderr if stderr is specified\n if (p.stderr)\n fromReadable(p.stderr).pipeTo(fromWritable(stderr));\n return fromStdioDropErr(p);\n }\n\n}\n\nexport { fromReadable, fromWritable, fromDuplex };\n"],"mappings":";;;;;;;AAQA,SAAgB,aACd,GACmB;AACnB,KAAI,aAAa,eAAgB,QAAO;CACxC,MAAM,SAAS;AACf,QAAO,IAAI,eAAe;EACxB,QAAQ,MAAM;AACZ,UAAO,GAAG,SAAS,SAAY,EAAE,QAAQ,KAAK,CAAC;AAC/C,UAAO,GAAG,eAAe,EAAE,OAAO,CAAC;AACnC,UAAO,GAAG,UAAU,QAAe,EAAE,MAAM,IAAI,CAAC;;EAElD,SAAS,YACN,OAA8D,UAC7D,OACD,EACD,KAAA;EAEH,CAAC;;;;;;;;;;ACjBJ,SAAgB,aACd,GACmB;AACnB,KAAG,aAAa,eAAgB,QAAO;CACvC,MAAM,SAAS;AACf,QAAO,IAAI,eAAe;EACxB,QAAQ,OAAO,OAAO,GAAG,UAAU,QAAe,EAAE,MAAM,IAAI,CAAC,EAAE,KAAA;EACjE,QAAQ,YACL,OAA8D,UAC7D,OACD,EACD,KAAA;EAEF,QAAQ,MAA2B,OAAO,OAAO,MAAM,KAAK,EAAE,KAAA;EAC9D,cAAc,OAAO,KAAK,EAAE,KAAA;EAC7B,CAAC;;;;;;;;;;;ACZJ,SAAgB,WACd,QAC0B;AAC1B,KAAI,kBAAkB,gBAAiB,QAAO;AAE9C,QAAO;EACL,UAAU,aAAkB,OAAO;EACnC,UAAU,aAAiB,OAAO;EACnC;;;;ACbH,SAAS,YAAe,GAAG,SAAiD;AAC1E,QAAO,IAAI,eAAkB,EAC3B,MAAM,YAAY;EAChB,IAAI,gBAAgB,QAAQ;AAE5B,UAAQ,QAAQ,OAAO,WAAW;AAChC,OAAI;IACF,MAAM,SAAS,OAAO,WAAW;AAEjC,WAAO,MAAM;KACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,SAAI,KAAM;AACV,gBAAW,QAAQ,MAAM;;AAG3B,WAAO,aAAa;YACb,OAAO;AACd,eAAW,MAAM,MAAM;AACvB;aACQ;AACR;AACA,QAAI,kBAAkB,EACpB,YAAW,OAAO;;IAGtB;IAEL,CAAC;;;;;;;;;AAUJ,SAAgB,iBAEd,GAK0B;AAC1B,QAAO;EACL,UAAU,aAAiB,EAAE,MAAO;EACpC,UAAU,aAAkB,EAAE,OAAQ;EACvC;;;;;;;;;AAUH,SAAgB,oBAEd,GAK0B;AAI1B,QAAO;EACL,UAJY,aAAiB,EAAE,MAAO;EAKtC,UAAU,YAJG,aAAkB,EAAE,OAAQ,EAC5B,aAAkB,EAAE,OAAQ,CAGJ;EACtC;;;;;;;;;;;AAYH,SAAgB,yBAEd,GAKA,EAAE,UAGwB;CAC1B,MAAM,QAAQ,aAAiB,EAAE,MAAO;CACxC,MAAM,SAAS,aAAkB,EAAE,OAAQ;AAC3C,KAAI,EAAE,OACJ,cAAa,EAAE,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC;AACrD,QAAO;EACL,UAAU;EAAO,UAAU;EAC5B;;;;;;;;;;;AAYH,SAAgB,UAEd,GAKA,EACE,WAIE,EAAE,EACoB;AAC1B,KAAI,WAAW,KAAA,EACb,QAAO,oBAAoB,EAAE;UAEpB,WAAW,KACpB,QAAO,iBAAiB,EAAE;MACrB;AAEL,MAAI,EAAE,OACJ,cAAa,EAAE,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC;AACrD,SAAO,iBAAiB,EAAE"}