response-iterator
Version:
Creates an async iterator for a variety of inputs in the browser and node. Supports fetch, node-fetch, and cross-fetch
1 lines • 11 kB
Source Map (JSON)
{"version":3,"file":"response-iterator.cjs","sources":["../../src/iterators/async.ts","../../src/iterators/nodeStream.ts","../../src/iterators/promise.ts","../../src/iterators/reader.ts","../../src/index.ts"],"sourcesContent":["export default function asyncIterator<T>(source): AsyncIterableIterator<T> {\n const iterator = source[Symbol.asyncIterator]();\n return {\n next(): Promise<IteratorResult<T, boolean>> {\n return iterator.next();\n },\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this;\n },\n } as AsyncIterableIterator<T>;\n}\n","import type { Readable as NodeReadableStream } from 'stream';\n\nconst hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator;\n\n/* c8 ignore start */\nexport default function nodeStreamIterator<T>(stream: NodeReadableStream): AsyncIterableIterator<T> {\n let cleanup = null;\n let error = null;\n let done = false;\n const data = [];\n const waiting = [];\n\n function onData(chunk) {\n if (error) return;\n if (waiting.length) return waiting.shift()[0]({ value: chunk, done: false });\n data.push(chunk);\n }\n function onError(err) {\n error = err;\n const all = waiting.slice();\n all.forEach((pair) => {\n pair[1](err);\n });\n !cleanup || cleanup();\n }\n function onEnd() {\n done = true;\n const all = waiting.slice();\n all.forEach((pair) => {\n pair[0]({ value: undefined, done: true });\n });\n !cleanup || cleanup();\n }\n\n cleanup = () => {\n cleanup = null;\n stream.removeListener('data', onData);\n stream.removeListener('error', onError);\n stream.removeListener('end', onEnd);\n stream.removeListener('finish', onEnd);\n stream.removeListener('close', onEnd);\n };\n stream.on('data', onData);\n stream.on('error', onError);\n stream.on('end', onEnd);\n stream.on('finish', onEnd);\n stream.on('close', onEnd);\n\n function getNext(): Promise<IteratorResult<T, boolean>> {\n return new Promise((resolve, reject) => {\n if (error) return reject(error);\n if (data.length) return resolve({ value: data.shift(), done: false });\n if (done) return resolve({ value: undefined, done: true });\n waiting.push([resolve, reject]);\n });\n }\n\n const iterator = {\n next(): Promise<IteratorResult<T, boolean>> {\n return getNext();\n },\n };\n\n if (hasIterator) {\n iterator[Symbol.asyncIterator] = function (): AsyncIterator<T> {\n return this;\n };\n }\n\n return iterator as AsyncIterableIterator<T>;\n}\n/* c8 ignore stop */\n","const hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator;\n\n/* c8 ignore start */\nexport default function promiseIterator<T>(promise): AsyncIterableIterator<T> {\n let resolved = false;\n\n const iterator = {\n next(): Promise<IteratorResult<T, boolean>> {\n if (resolved) return Promise.resolve({ value: undefined, done: true });\n resolved = true;\n return new Promise((resolve, reject) => {\n promise\n .then((value) => {\n resolve({ value, done: false });\n })\n .catch(reject);\n });\n },\n };\n\n if (hasIterator) {\n iterator[Symbol.asyncIterator] = function (): AsyncIterator<T> {\n return this;\n };\n }\n\n return iterator as AsyncIterableIterator<T>;\n}\n/* c8 ignore stop */\n","const hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator;\n\n/* c8 ignore start */\nexport default function readerIterator<T>(reader): AsyncIterableIterator<T> {\n const iterator = {\n next(): Promise<IteratorResult<T, boolean>> {\n return reader.read();\n },\n };\n\n if (hasIterator) {\n iterator[Symbol.asyncIterator] = function (): AsyncIterator<T> {\n return this;\n };\n }\n\n return iterator as AsyncIterableIterator<T>;\n}\n/* c8 ignore stop */\n","import type { Readable as NodeReadableStream } from 'stream';\nimport type { AxiosResponse } from 'axios';\nimport type { Response as NodeResponse } from 'node-fetch';\n\nimport asyncIterator from './iterators/async';\nimport nodeStreamIterator from './iterators/nodeStream';\nimport promiseIterator from './iterators/promise';\nimport readerIterator from './iterators/reader';\n\ninterface CrossFetchResponse {\n _bodyBlob: Blob;\n}\n\nconst hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator;\n\n/**\n * @param response A response. Supports fetch, node-fetch, and cross-fetch\n */\nexport default function responseIterator<T>(response: unknown): AsyncIterableIterator<T> {\n if (response === undefined) throw new Error('Missing response for responseIterator');\n\n // determine the body\n let body: unknown = response;\n if ((response as NodeResponse).body) body = (response as NodeResponse).body;\n // node-fetch, browser fetch, undici\n else if ((response as AxiosResponse).data) body = (response as AxiosResponse).data;\n // axios\n /* c8 ignore start */ else if ((response as CrossFetchResponse)._bodyBlob) body = (response as CrossFetchResponse)._bodyBlob; // cross-fetch\n /* c8 ignore stop */\n\n // adapt the body\n if (hasIterator && body[Symbol.asyncIterator]) return asyncIterator<T>(body as AsyncIterableIterator<T>);\n /* c8 ignore start */\n if ((body as ReadableStream<T>).getReader) return readerIterator<T>((body as ReadableStream<T>).getReader());\n if ((body as Blob).stream) return readerIterator<T>(((body as Blob).stream() as unknown as ReadableStream<T>).getReader());\n if ((body as Blob).arrayBuffer) return promiseIterator<T>((body as Blob).arrayBuffer());\n if ((body as NodeReadableStream).pipe) return nodeStreamIterator<T>(body as NodeReadableStream);\n /* c8 ignore stop */\n\n throw new Error('Unknown body type for responseIterator. Maybe you are not passing a streamable response');\n}\n"],"names":["asyncIterator","source","iterator","Symbol","next","hasIterator","nodeStreamIterator","stream","cleanup","error","done","data","waiting","onData","chunk","length","shift","value","push","onError","err","all","slice","forEach","pair","onEnd","undefined","removeListener","on","getNext","Promise","resolve","reject","promiseIterator","promise","resolved","then","catch","readerIterator","reader","read","responseIterator","response","Error","body","_bodyBlob","getReader","arrayBuffer","pipe"],"mappings":";;;;;;;;;;;;;;;;;;;EAAe,SAASA,cAAiBC,MAAM,EAAA;EAC7C,IAAA,IAAMC,QAAWD,GAAAA,MAAM,CAACE,MAAAA,CAAOH,aAAa,CAAC,EAAA;MAC7C,OAIE,gBAAA,CAAA;EAHAI,QAAAA,IAAAA,EAAAA,SAAAA,IAAAA,GAAAA;EACE,YAAA,OAAOF,SAASE,IAAI,EAAA;EACtB;EACCD,KAAAA,EAAAA,MAAAA,CAAOH,aAAa,EAArB,WAAA;EACE,QAAA,OAAO,IAAI;EACb,KAAA,CAAA;EAEJ;;ECRA,IAAMK,aAAc,GAAA,OAAOF,MAAW,KAAA,WAAA,IAAeA,OAAOH,aAAa;EAEzE,sBACe,SAASM,kBAAAA,CAAsBC,MAA0B,EAAA;EACtE,IAAA,IAAIC,OAAU,GAAA,IAAA;EACd,IAAA,IAAIC,KAAQ,GAAA,IAAA;EACZ,IAAA,IAAIC,IAAO,GAAA,KAAA;EACX,IAAA,IAAMC,OAAO,EAAE;EACf,IAAA,IAAMC,UAAU,EAAE;EAElB,IAAA,SAASC,OAAOC,KAAK,EAAA;EACnB,QAAA,IAAIL,KAAO,EAAA;UACX,IAAIG,OAAAA,CAAQG,MAAM,EAAE,OAAOH,QAAQI,KAAK,EAAE,CAAC,CAAA,CAAE,CAAC;cAAEC,KAAOH,EAAAA,KAAAA;cAAOJ,IAAM,EAAA;EAAM,SAAA,CAAA;EAC1EC,QAAAA,IAAAA,CAAKO,IAAI,CAACJ,KAAAA,CAAAA;EACZ;EACA,IAAA,SAASK,QAAQC,GAAG,EAAA;UAClBX,KAAQW,GAAAA,GAAAA;UACR,IAAMC,GAAAA,GAAMT,QAAQU,KAAK,EAAA;UACzBD,GAAIE,CAAAA,OAAO,CAAC,SAACC,IAAAA,EAAAA;cACXA,IAAI,CAAC,EAAE,CAACJ,GAAAA,CAAAA;EACV,SAAA,CAAA;EACA,QAAA,CAACZ,OAAWA,IAAAA,OAAAA,EAAAA;EACd;MACA,SAASiB,KAAAA,GAAAA;UACPf,IAAO,GAAA,IAAA;UACP,IAAMW,GAAAA,GAAMT,QAAQU,KAAK,EAAA;UACzBD,GAAIE,CAAAA,OAAO,CAAC,SAACC,IAAAA,EAAAA;cACXA,IAAI,CAAC,EAAE,CAAC;kBAAEP,KAAOS,EAAAA,SAAAA;kBAAWhB,IAAM,EAAA;EAAK,aAAA,CAAA;EACzC,SAAA,CAAA;EACA,QAAA,CAACF,OAAWA,IAAAA,OAAAA,EAAAA;EACd;MAEAA,OAAU,GAAA,WAAA;UACRA,OAAU,GAAA,IAAA;UACVD,MAAOoB,CAAAA,cAAc,CAAC,MAAQd,EAAAA,MAAAA,CAAAA;UAC9BN,MAAOoB,CAAAA,cAAc,CAAC,OAASR,EAAAA,OAAAA,CAAAA;UAC/BZ,MAAOoB,CAAAA,cAAc,CAAC,KAAOF,EAAAA,KAAAA,CAAAA;UAC7BlB,MAAOoB,CAAAA,cAAc,CAAC,QAAUF,EAAAA,KAAAA,CAAAA;UAChClB,MAAOoB,CAAAA,cAAc,CAAC,OAASF,EAAAA,KAAAA,CAAAA;EACjC,KAAA;MACAlB,MAAOqB,CAAAA,EAAE,CAAC,MAAQf,EAAAA,MAAAA,CAAAA;MAClBN,MAAOqB,CAAAA,EAAE,CAAC,OAAST,EAAAA,OAAAA,CAAAA;MACnBZ,MAAOqB,CAAAA,EAAE,CAAC,KAAOH,EAAAA,KAAAA,CAAAA;MACjBlB,MAAOqB,CAAAA,EAAE,CAAC,QAAUH,EAAAA,KAAAA,CAAAA;MACpBlB,MAAOqB,CAAAA,EAAE,CAAC,OAASH,EAAAA,KAAAA,CAAAA;MAEnB,SAASI,OAAAA,GAAAA;UACP,OAAO,IAAIC,OAAQ,CAAA,SAACC,OAASC,EAAAA,MAAAA,EAAAA;cAC3B,IAAIvB,KAAAA,EAAO,OAAOuB,MAAOvB,CAAAA,KAAAA,CAAAA;EACzB,YAAA,IAAIE,IAAKI,CAAAA,MAAM,EAAE,OAAOgB,OAAQ,CAAA;EAAEd,gBAAAA,KAAAA,EAAON,KAAKK,KAAK,EAAA;kBAAIN,IAAM,EAAA;EAAM,aAAA,CAAA;cACnE,IAAIA,IAAAA,EAAM,OAAOqB,OAAQ,CAAA;kBAAEd,KAAOS,EAAAA,SAAAA;kBAAWhB,IAAM,EAAA;EAAK,aAAA,CAAA;EACxDE,YAAAA,OAAAA,CAAQM,IAAI,CAAC;EAACa,gBAAAA,OAAAA;EAASC,gBAAAA;EAAO,aAAA,CAAA;EAChC,SAAA,CAAA;EACF;EAEA,IAAA,IAAM9B,QAAW,GAAA;EACfE,QAAAA,IAAAA,EAAAA,SAAAA,IAAAA,GAAAA;cACE,OAAOyB,OAAAA,EAAAA;EACT;EACF,KAAA;EAEA,IAAA,IAAIxB,aAAa,EAAA;EACfH,QAAAA,QAAQ,CAACC,MAAAA,CAAOH,aAAa,CAAC,GAAG,WAAA;EAC/B,YAAA,OAAO,IAAI;EACb,SAAA;EACF;MAEA,OAAOE,QAAAA;EACT,CAAA;;ECtEA,IAAMG,aAAc,GAAA,OAAOF,MAAW,KAAA,WAAA,IAAeA,OAAOH,aAAa;EAEzE,sBACe,SAASiC,eAAAA,CAAmBC,OAAO,EAAA;EAChD,IAAA,IAAIC,QAAW,GAAA,KAAA;EAEf,IAAA,IAAMjC,QAAW,GAAA;EACfE,QAAAA,IAAAA,EAAAA,SAAAA,IAAAA,GAAAA;EACE,YAAA,IAAI+B,QAAU,EAAA,OAAOL,OAAQC,CAAAA,OAAO,CAAC;kBAAEd,KAAOS,EAAAA,SAAAA;kBAAWhB,IAAM,EAAA;EAAK,aAAA,CAAA;cACpEyB,QAAW,GAAA,IAAA;cACX,OAAO,IAAIL,OAAQ,CAAA,SAACC,OAASC,EAAAA,MAAAA,EAAAA;kBAC3BE,OACGE,CAAAA,IAAI,CAAC,SAACnB,KAAAA,EAAAA;sBACLc,OAAQ,CAAA;0BAAEd,KAAAA,EAAAA,KAAAA;0BAAOP,IAAM,EAAA;EAAM,qBAAA,CAAA;EAC/B,iBAAA,CAAA,CACC2B,KAAK,CAACL,MAAAA,CAAAA;EACX,aAAA,CAAA;EACF;EACF,KAAA;EAEA,IAAA,IAAI3B,aAAa,EAAA;EACfH,QAAAA,QAAQ,CAACC,MAAAA,CAAOH,aAAa,CAAC,GAAG,WAAA;EAC/B,YAAA,OAAO,IAAI;EACb,SAAA;EACF;MAEA,OAAOE,QAAAA;EACT,CAAA;;EC3BA,IAAMG,aAAc,GAAA,OAAOF,MAAW,KAAA,WAAA,IAAeA,OAAOH,aAAa;EAEzE,sBACe,SAASsC,cAAAA,CAAkBC,MAAM,EAAA;EAC9C,IAAA,IAAMrC,QAAW,GAAA;EACfE,QAAAA,IAAAA,EAAAA,SAAAA,IAAAA,GAAAA;EACE,YAAA,OAAOmC,OAAOC,IAAI,EAAA;EACpB;EACF,KAAA;EAEA,IAAA,IAAInC,aAAa,EAAA;EACfH,QAAAA,QAAQ,CAACC,MAAAA,CAAOH,aAAa,CAAC,GAAG,WAAA;EAC/B,YAAA,OAAO,IAAI;EACb,SAAA;EACF;MAEA,OAAOE,QAAAA;EACT,CAAA;;ECJA,IAAMG,WAAc,GAAA,OAAOF,MAAW,KAAA,WAAA,IAAeA,OAAOH,aAAa;EAEzE;;MAGe,SAASyC,gBAAAA,CAAoBC,QAAiB,EAAA;EAC3D,IAAA,IAAIA,QAAahB,KAAAA,SAAAA,EAAW,MAAM,IAAIiB,KAAM,CAAA,uCAAA,CAAA;;EAG5C,IAAA,IAAIC,IAAgBF,GAAAA,QAAAA;EACpB,IAAA,IAAI,QAA2BE,CAAAA,IAAI,EAAEA,IAAO,GAACF,SAA0BE,IAAI;EAEtE,SAAA,IAAI,QAA4BjC,CAAAA,IAAI,EAAEiC,IAAO,GAACF,SAA2B/B,IAAI;WAEvD,IAAK+B,SAAgCG,SAAS,EAAED,OAAO,QAACF,CAAgCG,SAAS,CAAA;EAC5H;MAGA,IAAIxC,WAAAA,IAAeuC,IAAI,CAACzC,MAAAA,CAAOH,aAAa,CAAC,EAAE,OAAOA,aAAiB4C,CAAAA,IAAAA,CAAAA;4BAEvE,IAAKA,IAA2BE,CAAAA,SAAS,EAAE,OAAOR,cAAAA,CAAkB,IAACM,CAA2BE,SAAS,EAAA,CAAA;MACzG,IAAKF,IAAcrC,CAAAA,MAAM,EAAE,OAAO+B,cAAkB,CAAC,IAACM,CAAcrC,MAAM,EAAA,CAAoCuC,SAAS,EAAA,CAAA;MACvH,IAAKF,KAAcG,WAAW,EAAE,OAAOd,eAAmB,CAACW,KAAcG,WAAW,EAAA,CAAA;EACpF,IAAA,IAAI,IAACH,CAA4BI,IAAI,EAAE,OAAO1C,kBAAsBsC,CAAAA,IAAAA,CAAAA;2BAGpE,MAAM,IAAID,KAAM,CAAA,yFAAA,CAAA;EAClB;;;;;;;;"}