newline-async-iterator
Version:
Line-by-line async iterator for the browser and node
1 lines • 6.76 kB
Source Map (JSON)
{"version":3,"file":"newline-async-iterator.min.cjs","sources":["../../src/decodeUTF8.ts","../../src/index.ts"],"sourcesContent":["// https://developer.mozilla.org/en-US/docs/Glossary/Base64#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64\n/* c8 ignore start */\nlet decodeUTF8 = function decode(uint8Array: Uint8Array): string {\n let sView = '';\n\n for (let nPart: number, nLen = uint8Array.length, nIdx = 0; nIdx < nLen; nIdx++) {\n nPart = uint8Array[nIdx];\n sView += String.fromCharCode(\n nPart > 251 && nPart < 254 && nIdx + 5 < nLen /* six bytes */\n ? /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */\n (nPart - 252) * 1073741824 + ((uint8Array[++nIdx] - 128) << 24) + ((uint8Array[++nIdx] - 128) << 18) + ((uint8Array[++nIdx] - 128) << 12) + ((uint8Array[++nIdx] - 128) << 6) + uint8Array[++nIdx] - 128\n : nPart > 247 && nPart < 252 && nIdx + 4 < nLen /* five bytes */\n ? ((nPart - 248) << 24) + ((uint8Array[++nIdx] - 128) << 18) + ((uint8Array[++nIdx] - 128) << 12) + ((uint8Array[++nIdx] - 128) << 6) + uint8Array[++nIdx] - 128\n : nPart > 239 && nPart < 248 && nIdx + 3 < nLen /* four bytes */\n ? ((nPart - 240) << 18) + ((uint8Array[++nIdx] - 128) << 12) + ((uint8Array[++nIdx] - 128) << 6) + uint8Array[++nIdx] - 128\n : nPart > 223 && nPart < 240 && nIdx + 2 < nLen /* three bytes */\n ? ((nPart - 224) << 12) + ((uint8Array[++nIdx] - 128) << 6) + uint8Array[++nIdx] - 128\n : nPart > 191 && nPart < 224 && nIdx + 1 < nLen /* two bytes */\n ? ((nPart - 192) << 6) + uint8Array[++nIdx] - 128\n : /* nPart < 127 ? */ /* one byte */\n nPart\n );\n }\n\n return sView;\n};\n/* c8 ignore stop */\n\nif (typeof TextDecoder !== 'undefined') {\n const decoder = new TextDecoder('utf8');\n decodeUTF8 = function decodeTextDecoder(uint8Array: Uint8Array): string {\n return decoder.decode(uint8Array);\n };\n}\n\nexport default decodeUTF8;\n","import decodeUTF8 from './decodeUTF8.ts';\n\nconst REGEX_NEW_LINE = /\\r?\\n|\\r/g;\n\nconst root = typeof window === 'undefined' ? global : window;\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy\nconst Symbol: SymbolConstructor = typeof root.Symbol === 'undefined' ? ({ asyncIterator: undefined } as unknown as SymbolConstructor) : root.Symbol;\n\n/**\n * Create a newline iterator recognizing CR, LF, and CRLF using the Symbol.asyncIterator interface\n *\n * @param source The string to iterate through\n *\n * ```typescript\n * import newlineIterator from \"newline-async-iterator\";\n *\n * const iterator = newlineIterator(\"some\\r\\nstring\\ncombination\\r\");\n * const results = [];\n * for (const line of iterator) results.push(line);\n * console.log(results); // [\"some\", \"string\", \"combination\"];\n * ```\n */\n\nexport default function newlineIterator(source: AsyncIterable<Uint8Array> | AsyncIterator<Uint8Array>): AsyncIterableIterator<string> {\n const lines = [];\n let last = '';\n let done = false;\n\n const sourceIterator = Symbol.asyncIterator ? source[Symbol.asyncIterator]() : source;\n\n function generateNext(): Promise<IteratorResult<string, boolean>> {\n return new Promise((resolve, reject) => {\n sourceIterator.next().then((next) => {\n if (next.done) done = true;\n else last += decodeUTF8(next.value);\n\n const end = last.length > 0 ? last[last.length - 1] : '';\n if (done || (end !== '\\r' && end !== '\\n')) {\n const moreLines = last.split(REGEX_NEW_LINE);\n last = moreLines.pop();\n moreLines.forEach((line) => lines.unshift(line));\n if (done && last.length > 0) {\n lines.unshift(last);\n last = '';\n }\n }\n\n if (lines.length > 0) {\n const value = lines.pop();\n if (done && lines.length === 0 && value.length === 0) return resolve({ value: null, done: true });\n return resolve({ value, done: false });\n }\n if (done) return resolve({ value: null, done: true });\n generateNext().then(resolve).catch(reject); // get more\n });\n });\n }\n\n const iterator = {\n next(): Promise<IteratorResult<string, boolean>> {\n return generateNext();\n },\n [Symbol.asyncIterator](): AsyncIterator<string> {\n return this;\n },\n };\n\n return iterator as AsyncIterableIterator<string>;\n}\n"],"names":["decodeUTF8","uint8Array","nPart","sView","nLen","length","nIdx","String","fromCharCode","TextDecoder","decoder","decode","decodeUTF8$1","REGEX_NEW_LINE","root","window","global","Symbol","asyncIterator","undefined","source","lines","last","done","sourceIterator","generateNext","Promise","resolve","reject","next","then","value","end","moreLines","split","pop","forEach","line","unshift","catch","this"],"mappings":"oPAEA,IAAIA,EAAa,SAAgBC,GAG/B,IAFA,IAESC,EAFLC,EAAQ,GAEYC,EAAOH,EAAWI,OAAQC,EAAO,EAAGA,EAAOF,EAAME,IACvEJ,EAAQD,EAAWK,GACnBH,GAASI,OAAOC,aACdN,EAAQ,KAAOA,EAAQ,KAAOI,EAAO,EAAIF,EAErB,YAAfF,EAAQ,MAAqBD,IAAcK,GAAQ,KAAQ,KAAQL,IAAaK,GAAQ,KAAQ,KAAQL,IAAaK,GAAQ,KAAQ,KAAOL,IAAcK,GAAQ,KAAQ,GAAKL,IAAaK,GAAQ,IACrMJ,EAAQ,KAAOA,EAAQ,KAAOI,EAAO,EAAIF,GACrCF,EAAQ,KAAQ,KAAOD,IAAcK,GAAQ,KAAQ,KAAQL,IAAaK,GAAQ,KAAQ,KAAQL,IAAaK,GAAQ,KAAQ,GAAKL,IAAaK,GAAQ,IAC3JJ,EAAQ,KAAOA,EAAQ,KAAOI,EAAO,EAAIF,GACtCF,EAAS,KAAQ,KAAOD,IAAcK,GAAQ,KAAQ,KAAOL,IAAcK,GAAQ,KAAQ,GAAKL,IAAaK,GAAQ,IACtHJ,EAAQ,KAAOA,EAAQ,KAAOI,EAAO,EAAIF,GACtCF,EAAS,KAAQ,KAAOD,IAAcK,GAAQ,KAAQ,GAAKL,IAAaK,GAAQ,IACjFJ,EAAQ,KAAOA,EAAQ,KAAOI,EAAO,EAAIF,GACtCF,EAAS,KAAQ,GAAKD,IAAaK,GAAQ,IAE5CJ,GAIhB,OAAOC,CACT,EAGA,GAA2B,oBAAhBM,YAA6B,CACtC,IAAMC,EAAU,IAAID,YAAY,QAChCT,EAAa,SAA2BC,GACtC,OAAOS,EAAQC,OAAOV,EACxB,CACF,CAEA,IAAAW,EAAeZ,ECjCf,IAAMa,EAAiB,YAEjBC,EAAyB,oBAAXC,OAAyBC,OAASD,OAEhDE,OAAmD,IAAhBH,EAAKG,OAA0B,CAAEC,mBAAeC,GAA+CL,EAAKG,cAiB9H,SAAyBG,GACtC,UAAMC,EAAQ,GACVC,EAAO,GACPC,GAAO,EAELC,EAAiBP,EAAOC,cAAgBE,EAAOH,EAAOC,iBAAmBE,EAE/E,SAASK,IACP,OAAO,IAAIC,QAAQ,SAACC,EAASC,GAC3BJ,EAAeK,OAAOC,KAAK,SAACD,GACtBA,EAAKN,KAAMA,GAAO,EACjBD,GAAQtB,EAAW6B,EAAKE,OAE7B,IAAMC,EAAMV,EAAKjB,OAAS,EAAIiB,EAAKA,EAAKjB,OAAS,GAAK,GACtD,GAAIkB,GAAiB,OAARS,GAAwB,OAARA,EAAe,CAC1C,IAAMC,EAAYX,EAAKY,MAAMrB,GAC7BS,EAAOW,EAAUE,MACjBF,EAAUG,QAAQ,SAACC,GAAShB,OAAAA,EAAMiB,QAAQD,KACtCd,GAAQD,EAAKjB,OAAS,IACxBgB,EAAMiB,QAAQhB,GACdA,EAAO,GAEX,CAEA,GAAID,EAAMhB,OAAS,EAAG,CACpB,IAAM0B,EAAQV,EAAMc,MACpB,OAAIZ,GAAyB,IAAjBF,EAAMhB,QAAiC,IAAjB0B,EAAM1B,OAAqBsB,EAAQ,CAAEI,MAAO,KAAMR,MAAM,IACnFI,EAAQ,CAAEI,MAAAA,EAAOR,MAAM,GAChC,CACA,GAAIA,EAAM,OAAOI,EAAQ,CAAEI,MAAO,KAAMR,MAAM,IAC9CE,IAAeK,KAAKH,GAASY,MAAMX,EACrC,EACF,EACF,CAWA,SALE,CAHAC,KAAAA,WACE,OAAOJ,GACT,KACCR,EAAOC,gBAAR,WACE,OAAOsB,IACT,gGAIJ"}