{"version":3,"file":"readFileLineByLineAsync.cjs","sources":["../../src/fs/readFileLineByLineAsync.js"],"sourcesContent":["import { createReadStream } from 'node:fs';\nimport readline from 'node:readline';\n\n// http://stackoverflow.com/questions/16010915/parsing-huge-logfiles-in-node-js-read-in-line-by-line/23695940#23695940\n\nexport const readFileLineByLineAsync = function ({\n    filePath,\n    onBegin,\n    onLine,\n    filterWhenOnLineReturnsTruthy = false,\n    abortWhenOnLineReturnsFalsy = false,\n    onProgress,\n    onError,\n    onEnd\n}) {\n    return new Promise((resolve) => {\n        try {\n            if (onBegin) {\n                onBegin();\n            }\n\n            let lineNumber = 1; // The file line number starts at 1\n            let countOfOnLineReturnedTruthy = 0;\n\n            const filteredResults = [];\n\n            const getStatus = ({ errored = false, aborted = false, completed = false } = {}) => {\n                const status = {\n                    lastLineNumberRead: (lineNumber - 1) || null,\n                    countOfOnLineReturnedTruthy\n                };\n\n                if (filterWhenOnLineReturnsTruthy) {\n                    status.filteredResults = filteredResults;\n                }\n                if (errored) {\n                    status.errored = true;\n                }\n                if (aborted) {\n                    status.aborted = true;\n                }\n                if (completed) {\n                    status.completed = true;\n                }\n\n                return status;\n            };\n\n            try {\n                const fileStream = createReadStream(filePath);\n                const rl = readline.createInterface({\n                    input: fileStream,\n                    crlfDelay: Infinity\n                });\n\n                // Handle errors on the file stream\n                fileStream.on('error', (err) => {\n                    if (onError) {\n                        onError(err);\n                    }\n                    resolve([err, getStatus({ errored: true })]);\n                });\n\n                // Process the file line by line\n                (async () => {\n                    try {\n                        for await (const line of rl) {\n                            const result = onLine(line, lineNumber);\n\n                            if (result) {\n                                if (filterWhenOnLineReturnsTruthy) {\n                                    filteredResults.push({\n                                        lineNumber,\n                                        line\n                                    });\n                                }\n                                countOfOnLineReturnedTruthy++;\n                            }\n                            lineNumber++;\n\n                            if (onProgress) {\n                                onProgress(getStatus());\n                            }\n\n                            if (!result && abortWhenOnLineReturnsFalsy) {\n                                // Clean up resources\n                                rl.close();\n                                fileStream.destroy();\n\n                                if (onEnd) {\n                                    onEnd();\n                                }\n                                resolve([null, getStatus({ aborted: true })]);\n                                return;\n                            }\n                        }\n\n                        if (onEnd) {\n                            onEnd();\n                        }\n                        resolve([null, getStatus({ completed: true })]);\n                        return;\n                    } catch (readError) {\n                        if (onError) {\n                            onError(readError);\n                        }\n                        resolve([readError, getStatus({ errored: true })]);\n                        return;\n                    }\n                })();\n            } catch (setupError) {\n                if (onError) {\n                    onError(setupError);\n                }\n                resolve([setupError, getStatus({ errored: true })]);\n                return;\n            }\n        } catch (err) {\n            if (onError) {\n                onError(err);\n            }\n            resolve([err, { errored: true }]);\n            return;\n        }\n    });\n};\n"],"names":["filePath","onBegin","onLine","filterWhenOnLineReturnsTruthy","abortWhenOnLineReturnsFalsy","onProgress","onError","onEnd","Promise","resolve","lineNumber","countOfOnLineReturnedTruthy","filteredResults","getStatus","errored","aborted","completed","status","lastLineNumberRead","fileStream","createReadStream","rl","readline","createInterface","input","crlfDelay","Infinity","on","err","line","result","push","close","destroy","readError","setupError"],"mappings":";;gCAKuC,UAAUA,SAC7CA,SAAQC,QACRA,QAAOC,OACPA,OAAMC,8BACNA,+BAAgC,EAAKC,4BACrCA,6BAA8B,EAAKC,WACnCA,WAAUC,QACVA,QAAOC,MACPA,QAEA,OAAO,IAAIC,QAASC,UAChB,IACQR,SACAA;AAGJ,IAAIS,WAAa,EACbC,4BAA8B;AAElC,MAAMC,gBAAkB,GAElBC,UAAY,EAAGC,iBAAU,EAAOC,iBAAU,EAAOC,qBAAY,GAAU,MACzE,MAAMC,OAAS,CACXC,mBAAqBR,WAAa,GAAM,KACxCC;AAGAR,gCACAc,OAAOL,gBAAkBA;AAEzBE,UACAG,OAAOH,SAAU;AAEjBC,UACAE,OAAOF,SAAU;AAEjBC,YACAC,OAAOD,WAAY;AAGvB,OAAOC;AAGX,IACI,MAAME,WAAaC,QAAAA,iBAAiBpB,UAC9BqB,GAAKC,SAASC,gBAAgB,CAChCC,MAAOL,WACPM,UAAWC;AAIfP,WAAWQ,GAAG,QAAUC,MAChBtB,SACAA,QAAQsB;AAEZnB,QAAQ,CAACmB,IAAKf,UAAU,CAAEC,SAAS,QAIvC,WACI,IACI,UAAW,MAAMe,QAAQR,GAAI,CACzB,MAAMS,OAAS5B,OAAO2B,KAAMnB;AAE5B,GAAIoB,OAAQ,CACJ3B,+BACAS,gBAAgBmB,KAAK,CACjBrB,sBACAmB;AAGRlB,6BACJ,CACAD;AAEIL,YACAA,WAAWQ;AAGf,IAAKiB,QAAU1B,4BAA6B,CAExCiB,GAAGW;AACHb,WAAWc;AAEP1B,OACAA;AAEJE,QAAQ,CAAC,KAAMI,UAAU,CAAEE,SAAS;AACpC,MACJ,CACJ,CAEIR,OACAA;AAEJE,QAAQ,CAAC,KAAMI,UAAU,CAAEG,WAAW;AACtC,MACJ,CAAE,MAAOkB,WACD5B,SACAA,QAAQ4B;AAEZzB,QAAQ,CAACyB,UAAWrB,UAAU,CAAEC,SAAS;AACzC,MACJ,CACH,EA7CD,EA8CJ,CAAE,MAAOqB,YACD7B,SACAA,QAAQ6B;AAEZ1B,QAAQ,CAAC0B,WAAYtB,UAAU,CAAEC,SAAS;AAC1C,MACJ,CACJ,CAAE,MAAOc,KACDtB,SACAA,QAAQsB;AAEZnB,QAAQ,CAACmB,IAAK,CAAEd,SAAS;AACzB,MACJ,GAER"}