'use strict'; // Refs: https://github.com/nodejs/node/issues/33940 const common = require('../common'); const tmpdir = require('../common/tmpdir'); const fs = require('fs'); const assert = require('assert'); const path = require('path'); tmpdir.refresh(); const file = path.join(tmpdir.path, '/read_stream_pos_test.txt'); fs.writeFileSync(file, ''); let counter = 0; const writeInterval = setInterval(() => { counter = counter + 1; const line = `hello at ${counter}\n`; fs.writeFileSync(file, line, { flag: 'a' }); }, 1); const hwm = 10; let bufs = []; let isLow = false; let cur = 0; let stream; const readInterval = setInterval(() => { if (stream) return; stream = fs.createReadStream(file, { highWaterMark: hwm, start: cur }); stream.on('data', common.mustCallAtLeast((chunk) => { cur += chunk.length; bufs.push(chunk); if (isLow) { const brokenLines = Buffer.concat(bufs).toString() .split('\n') .filter((line) => { const s = 'hello at'.slice(0, line.length); if (line && !line.startsWith(s)) { return true; } return false; }); assert.strictEqual(brokenLines.length, 0); exitTest(); return; } if (chunk.length !== hwm) { isLow = true; } })); stream.on('end', () => { stream = null; isLow = false; bufs = []; }); }, 10); // Time longer than 90 seconds to exit safely const endTimer = setTimeout(() => { exitTest(); }, 90000); const exitTest = () => { clearInterval(readInterval); clearInterval(writeInterval); clearTimeout(endTimer); if (stream && !stream.destroyed) { stream.on('close', () => { process.exit(); }); stream.destroy(); } else { process.exit(); } };