1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const readline_1 = require("readline");
|
4 | const NOW = () => new Date().getTime();
|
5 | function compileStats(stats) {
|
6 | const timeSum = stats.times.reduce((accum, time) => accum + time, 0);
|
7 | stats.timeAverage = timeSum / stats.times.length;
|
8 | return stats;
|
9 | }
|
10 | function getSuccessCallback(state, startTime, callback) {
|
11 | const { buffer, isOpen, stats, reader, resolve } = state;
|
12 | return () => {
|
13 | stats.times.push(NOW() - startTime);
|
14 | if (!isOpen && !buffer.length) {
|
15 | resolve(compileStats(stats));
|
16 | return;
|
17 | }
|
18 | if (!buffer.length) {
|
19 | reader.resume();
|
20 | }
|
21 | setImmediate(callback);
|
22 | };
|
23 | }
|
24 | function getErrorCallback(reader, reject) {
|
25 | return (error) => {
|
26 | reader.close();
|
27 | reject(error);
|
28 | };
|
29 | }
|
30 | function processNextLine(state) {
|
31 | const { buffer, reader, reject, lineHandler } = state;
|
32 | const line = buffer.shift();
|
33 | if (typeof line !== 'string') {
|
34 | setImmediate(() => processNextLine(state));
|
35 | return;
|
36 | }
|
37 | const onSuccess = getSuccessCallback(state, NOW(), () => processNextLine(state));
|
38 | const onError = getErrorCallback(reader, reject);
|
39 | lineHandler(line, state.index++)
|
40 | .then(onSuccess)
|
41 | .catch(onError);
|
42 | }
|
43 | exports.default = (lineHandler, input = process.stdin) => new Promise((resolve, reject) => {
|
44 | const reader = readline_1.createInterface({ input });
|
45 | const state = {
|
46 | buffer: [],
|
47 | index: 0,
|
48 | isOpen: true,
|
49 | lineHandler,
|
50 | reader,
|
51 | reject,
|
52 | resolve,
|
53 | stats: { length: 0, times: [], timeAverage: 0 },
|
54 | };
|
55 | reader.on('close', () => {
|
56 | state.isOpen = false;
|
57 | });
|
58 | reader.on('line', (line) => {
|
59 | state.stats.length++;
|
60 | reader.pause();
|
61 | state.buffer.push(line);
|
62 | });
|
63 | setImmediate(() => processNextLine(state));
|
64 | });
|