{"version":3,"file":"response-iterator.min.js","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(source): AsyncIterableIterator {\n const iterator = source[Symbol.asyncIterator]();\n return {\n next(): Promise> {\n return iterator.next();\n },\n [Symbol.asyncIterator](): AsyncIterator {\n return this;\n },\n } as AsyncIterableIterator;\n}\n","import { Readable as NodeReadableStream } from 'stream';\n\nconst hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator;\n\n/* c8 ignore start */\nexport default function nodeStreamIterator(stream: NodeReadableStream): AsyncIterableIterator {\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(function (pair) {\n pair[1](err);\n });\n !cleanup || cleanup();\n }\n function onEnd() {\n done = true;\n const all = waiting.slice();\n all.forEach(function (pair) {\n pair[0]({ value: undefined, done: true });\n });\n !cleanup || cleanup();\n }\n\n cleanup = function () {\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> {\n return new Promise(function (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> {\n return getNext();\n },\n };\n\n if (hasIterator) {\n iterator[Symbol.asyncIterator] = function (): AsyncIterator {\n return this;\n };\n }\n\n return iterator as AsyncIterableIterator;\n}\n/* c8 ignore stop */\n","const hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator;\n\n/* c8 ignore start */\nexport default function promiseIterator(promise): AsyncIterableIterator {\n let resolved = false;\n\n const iterator = {\n next(): Promise> {\n if (resolved) return Promise.resolve({ value: undefined, done: true });\n resolved = true;\n return new Promise(function (resolve, reject) {\n promise\n .then(function (value) {\n resolve({ value, done: false });\n })\n .catch(reject);\n });\n },\n };\n\n if (hasIterator) {\n iterator[Symbol.asyncIterator] = function (): AsyncIterator {\n return this;\n };\n }\n\n return iterator as AsyncIterableIterator;\n}\n/* c8 ignore stop */\n","const hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator;\n\n/* c8 ignore start */\nexport default function readerIterator(reader): AsyncIterableIterator {\n const iterator = {\n next(): Promise> {\n return reader.read();\n },\n };\n\n if (hasIterator) {\n iterator[Symbol.asyncIterator] = function (): AsyncIterator {\n return this;\n };\n }\n\n return iterator as AsyncIterableIterator;\n}\n/* c8 ignore stop */\n","import { AxiosResponse } from 'axios';\nimport { Response as NodeResponse } from 'node-fetch';\nimport { Readable as NodeReadableStream } from 'stream';\n\n// @ts-ignore\nimport asyncIterator from './iterators/async.ts';\n// @ts-ignore\nimport nodeStreamIterator from './iterators/nodeStream.ts';\n// @ts-ignore\nimport promiseIterator from './iterators/promise.ts';\n// @ts-ignore\nimport readerIterator from './iterators/reader.ts';\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(response: unknown): AsyncIterableIterator {\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(body as AsyncIterableIterator);\n /* c8 ignore start */\n if ((body as ReadableStream).getReader) return readerIterator((body as ReadableStream).getReader());\n if ((body as Blob).stream) return readerIterator(((body as Blob).stream() as unknown as ReadableStream).getReader());\n if ((body as Blob).arrayBuffer) return promiseIterator((body as Blob).arrayBuffer());\n if ((body as NodeReadableStream).pipe) return nodeStreamIterator(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","obj","key","value","iterator","Symbol","next","this","hasIterator","nodeStreamIterator","stream","onData","chunk","error","waiting","length","shift","done","data","push","onError","err","slice","forEach","pair","cleanup","onEnd","undefined","removeListener","on","Promise","resolve","reject","readerIterator","reader","read","response","Error","promise","resolved","body","_bodyBlob","getReader","arrayBuffer","then","catch","pipe"],"mappings":"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"}