UNPKG

1.95 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const readline_1 = require("readline");
4const NOW = () => new Date().getTime();
5function compileStats(stats) {
6 const timeSum = stats.times.reduce((accum, time) => accum + time, 0);
7 stats.timeAverage = timeSum / stats.times.length;
8 return stats;
9}
10function 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}
24function getErrorCallback(reader, reject) {
25 return (error) => {
26 reader.close();
27 reject(error);
28 };
29}
30function 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}
43exports.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});