response-iterator
Version:
Creates an async iterator for a variety of inputs in the browser and node. Supports fetch, node-fetch, and cross-fetch
23 lines (22 loc) • 1.27 kB
JavaScript
import asyncIterator from './iterators/async.js';
import nodeStreamIterator from './iterators/nodeStream.js';
import promiseIterator from './iterators/promise.js';
import readerIterator from './iterators/reader.js';
const hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator;
/**
* @param response A response. Supports fetch, node-fetch, and cross-fetch
*/ export default function responseIterator(response) {
if (response === undefined) throw new Error('Missing response for responseIterator');
// determine the body
let body = response;
if (response.body) body = response.body;
else if (response.data) body = response.data;
else if (response._bodyBlob) body = response._bodyBlob; // cross-fetch
/* c8 ignore stop */ // adapt the body
if (hasIterator && body[Symbol.asyncIterator]) return asyncIterator(body);
/* c8 ignore start */ if (body.getReader) return readerIterator(body.getReader());
if (body.stream) return readerIterator(body.stream().getReader());
if (body.arrayBuffer) return promiseIterator(body.arrayBuffer());
if (body.pipe) return nodeStreamIterator(body);
/* c8 ignore stop */ throw new Error('Unknown body type for responseIterator. Maybe you are not passing a streamable response');
}