newline-async-iterator
Version:
Line-by-line async iterator for the browser and node
111 lines (106 loc) • 5.14 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.newlineAsyncIterator = factory());
})(this, (function () { 'use strict';
// https://developer.mozilla.org/en-US/docs/Glossary/Base64#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
/* c8 ignore start */ var decodeUTF8 = function decode(uint8Array) {
var sView = '';
for(var nPart, nLen = uint8Array.length, nIdx = 0; nIdx < nLen; nIdx++){
nPart = uint8Array[nIdx];
sView += String.fromCharCode(nPart > 251 && nPart < 254 && nIdx + 5 < nLen /* six bytes */ ? /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */ (nPart - 252) * 1073741824 + (uint8Array[++nIdx] - 128 << 24) + (uint8Array[++nIdx] - 128 << 18) + (uint8Array[++nIdx] - 128 << 12) + (uint8Array[++nIdx] - 128 << 6) + uint8Array[++nIdx] - 128 : nPart > 247 && nPart < 252 && nIdx + 4 < nLen /* five bytes */ ? (nPart - 248 << 24) + (uint8Array[++nIdx] - 128 << 18) + (uint8Array[++nIdx] - 128 << 12) + (uint8Array[++nIdx] - 128 << 6) + uint8Array[++nIdx] - 128 : nPart > 239 && nPart < 248 && nIdx + 3 < nLen /* four bytes */ ? (nPart - 240 << 18) + (uint8Array[++nIdx] - 128 << 12) + (uint8Array[++nIdx] - 128 << 6) + uint8Array[++nIdx] - 128 : nPart > 223 && nPart < 240 && nIdx + 2 < nLen /* three bytes */ ? (nPart - 224 << 12) + (uint8Array[++nIdx] - 128 << 6) + uint8Array[++nIdx] - 128 : nPart > 191 && nPart < 224 && nIdx + 1 < nLen /* two bytes */ ? (nPart - 192 << 6) + uint8Array[++nIdx] - 128 : /* nPart < 127 ? */ /* one byte */ nPart);
}
return sView;
};
/* c8 ignore stop */ if (typeof TextDecoder !== 'undefined') {
var decoder = new TextDecoder('utf8');
decodeUTF8 = function decodeTextDecoder(uint8Array) {
return decoder.decode(uint8Array);
};
}
var decodeUTF8$1 = decodeUTF8;
function _define_property(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
var REGEX_NEW_LINE = /\r?\n|\r/g;
var root = typeof window === 'undefined' ? global : window;
// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy
var Symbol = typeof root.Symbol === 'undefined' ? {
asyncIterator: undefined
} : root.Symbol;
/**
* Create a newline iterator recognizing CR, LF, and CRLF using the Symbol.asyncIterator interface
*
* @param source The string to iterate through
*
* ```typescript
* import newlineIterator from "newline-async-iterator";
*
* const iterator = newlineIterator("some\r\nstring\ncombination\r");
* const results = [];
* for (const line of iterator) results.push(line);
* console.log(results); // ["some", "string", "combination"];
* ```
*/ function newlineIterator(source) {
var lines = [];
var last = '';
var done = false;
var sourceIterator = Symbol.asyncIterator ? source[Symbol.asyncIterator]() : source;
function generateNext() {
return new Promise(function(resolve, reject) {
sourceIterator.next().then(function(next) {
if (next.done) done = true;
else last += decodeUTF8$1(next.value);
var end = last.length > 0 ? last[last.length - 1] : '';
if (done || end !== '\r' && end !== '\n') {
var moreLines = last.split(REGEX_NEW_LINE);
last = moreLines.pop();
moreLines.forEach(function(line) {
return lines.unshift(line);
});
if (done && last.length > 0) {
lines.unshift(last);
last = '';
}
}
if (lines.length > 0) {
var value = lines.pop();
if (done && lines.length === 0 && value.length === 0) return resolve({
value: null,
done: true
});
return resolve({
value: value,
done: false
});
}
if (done) return resolve({
value: null,
done: true
});
generateNext().then(resolve).catch(reject); // get more
});
});
}
var iterator = _define_property({
next: function next() {
return generateNext();
}
}, Symbol.asyncIterator, function() {
return this;
});
return iterator;
}
return newlineIterator;
}));
//# sourceMappingURL=newline-async-iterator.cjs.map