Есть ли способ заставить `readline` правильно реагировать на события` pause`? - PullRequest
1 голос
/ 26 октября 2019

Я пытаюсь написать препроцессор уценки, который может включать в вывод другие файлы.

К сожалению, я обнаружил, что "метод паузы не останавливает события очереди в очереди".

Решение, которое я написал, закончило чтение и запись исходного файла, а затем добавило другие файлы в конце:

import { createInterface } from "readline";
import * as fs from "fs";
import * as path from "path";
import minimist from "minimist";

const argv = minimist(process.argv.slice(2));

const inputFile = path.resolve(argv._[0]);
const outputFile = path.resolve(argv._[1]);

const inputFileReadStream = createInterface({
    "input": fs.createReadStream(inputFile)
});

const writeStream = fs.createWriteStream(outputFile);

readStream.on("line", function readLine(line) {
    if (line.startsWith("@import") === true) {
        inputFileReadStream.pause();

        console.log(line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\"")));

        const readStream = createInterface({
            "input": fs.createReadStream(path.resolve(path.dirname(inputFile), line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\""))))
        });

        readStream.on("line", function(line) {
            readLine(line);
        });

        readStream.on("end", function() {
            inputFileReadStream.resume();
        });
    } else {
        writeStream.write(line + "\n");
    }
});

Поэтому я попытался изменить его наиспользуйте библиотеку line-by-line, упомянутую в посте, на который я ссылался, чтобы посмотреть, сработает ли это:

let readStream = new (require("line-by-line"))(fs.createReadStream(inputFile));

const writeStream = fs.createWriteStream(outputFile);

readStream.on("line", function readLine(line) {
    if (line.startsWith("@import") === true) {
        const tempStream = readStream;

        tempStream.pause();

        console.log(line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\"")));

        readStream = new (require("line-by-line"))(fs.createReadStream(path.resolve(path.dirname(inputFile), line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\"")))));

        readStream.on("line", function(line) {
            readLine(line);
        });

        readStream.on("end", function() {
            tempStream.resume();
        });
    } else {
        writeStream.write(line + "\n");
    }
});

Но это привело к созданию файла, который постепенно чередовал строки из импортированных файлов восновной файл.

У меня вопрос: есть ли способ заставить readline правильно реагировать на pause события?

Можно ли это исправить с помощью Transform?

Вот ссылка на репозиторий, если это поможет: https://github.com/brianjenkins94/Rosettas-Node

1 Ответ

0 голосов
/ 27 октября 2019

Возможно, это отрицательно сказывается на производительности, но я получил то, что хотел, установив для highWaterMark значение 1.

import { createInterface } from "readline";
import * as fs from "fs";
import * as path from "path";
import minimist from "minimist";

const argv = minimist(process.argv.slice(2));

const inputFile = path.resolve(argv._[0]);
const outputFile = path.resolve(argv._[1]);

const inputFileReadStream = createInterface({
    "input": fs.createReadStream(inputFile, { "highWaterMark": 1 })
});

const writeStream = fs.createWriteStream(outputFile);

inputFileReadStream.on("line", function readLine(line, readStream = inputFileReadStream) {
    if (line.startsWith("@import") === true) {
        readStream.pause();

        const childReadStream = createInterface({
            "input": fs.createReadStream(path.resolve(path.dirname(inputFile), line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\""))), { "highWaterMark": 1 })
        });

        childReadStream.on("line", function(line) {
            readLine(line, childReadStream);
        });

        childReadStream.on("close", function() {
            readStream.resume();
        });
    } else {
        writeStream.write(line + "\n");
    }
});
...