UNPKG

response-iterator

Version:

Creates an async iterator for a variety of inputs in the browser and node. Supports fetch, node-fetch, and cross-fetch

87 lines 2.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, /* c8 ignore start */ "default" /* c8 ignore stop */ , { enumerable: true, get: function() { return nodeStreamIterator; } }); var hasIterator = typeof Symbol !== 'undefined' && Symbol.asyncIterator; function nodeStreamIterator(stream) { var cleanup = null; var error = null; var done = false; var data = []; var waiting = []; function onData(chunk) { if (error) return; if (waiting.length) return waiting.shift()[0]({ value: chunk, done: false }); data.push(chunk); } function onError(err) { error = err; var all = waiting.slice(); all.forEach(function(pair) { pair[1](err); }); !cleanup || cleanup(); } function onEnd() { done = true; var all = waiting.slice(); all.forEach(function(pair) { pair[0]({ value: undefined, done: true }); }); !cleanup || cleanup(); } cleanup = function() { cleanup = null; stream.removeListener('data', onData); stream.removeListener('error', onError); stream.removeListener('end', onEnd); stream.removeListener('finish', onEnd); stream.removeListener('close', onEnd); }; stream.on('data', onData); stream.on('error', onError); stream.on('end', onEnd); stream.on('finish', onEnd); stream.on('close', onEnd); function getNext() { return new Promise(function(resolve, reject) { if (error) return reject(error); if (data.length) return resolve({ value: data.shift(), done: false }); if (done) return resolve({ value: undefined, done: true }); waiting.push([ resolve, reject ]); }); } var iterator = { next: function next() { return getNext(); } }; if (hasIterator) { iterator[Symbol.asyncIterator] = function() { return this; }; } return iterator; } /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }