|
4046 | 4046 | resume: function() { return rl; }, |
4047 | 4047 | write: function() {}, |
4048 | 4048 | [Symbol.asyncIterator]: function() { |
4049 | | - var lines = []; |
4050 | | - var resolve = null; |
4051 | | - var done = false; |
4052 | | - if (input) { |
4053 | | - input.on('data', function(chunk) { |
4054 | | - var text = typeof chunk === 'string' ? chunk : new TextDecoder().decode(chunk); |
4055 | | - var parts = text.split('\n'); |
4056 | | - for (var i = 0; i < parts.length - 1; i++) { |
4057 | | - lines.push(parts[i]); |
4058 | | - if (resolve) { resolve(); resolve = null; } |
4059 | | - } |
4060 | | - }); |
4061 | | - input.on('end', function() { done = true; if (resolve) { resolve(); resolve = null; } }); |
4062 | | - } |
4063 | | - return { |
4064 | | - next: function() { |
4065 | | - if (lines.length > 0) return Promise.resolve({ value: lines.shift(), done: false }); |
4066 | | - if (done) return Promise.resolve({ value: undefined, done: true }); |
4067 | | - return new Promise(function(r) { resolve = r; }).then(function() { |
4068 | | - if (lines.length > 0) return { value: lines.shift(), done: false }; |
4069 | | - return { value: undefined, done: true }; |
4070 | | - }); |
4071 | | - } |
4072 | | - }; |
| 4049 | + return rl._iterState; |
4073 | 4050 | } |
4074 | 4051 | }; |
| 4052 | + // Shared line parsing state for both "line" event and async iterator. |
| 4053 | + var _lineBuf = ''; |
| 4054 | + var _iterLines = []; |
| 4055 | + var _iterResolve = null; |
| 4056 | + var _iterDone = false; |
| 4057 | + rl._iterState = { |
| 4058 | + next: function() { |
| 4059 | + if (_iterLines.length > 0) return Promise.resolve({ value: _iterLines.shift(), done: false }); |
| 4060 | + if (_iterDone) return Promise.resolve({ value: undefined, done: true }); |
| 4061 | + return new Promise(function(r) { _iterResolve = r; }).then(function() { |
| 4062 | + if (_iterLines.length > 0) return { value: _iterLines.shift(), done: false }; |
| 4063 | + return { value: undefined, done: true }; |
| 4064 | + }); |
| 4065 | + } |
| 4066 | + }; |
| 4067 | + // Wire up input data handler to emit "line" events and feed the iterator. |
| 4068 | + if (input && input.on) { |
| 4069 | + input.on('data', function(chunk) { |
| 4070 | + _lineBuf += (typeof chunk === 'string' ? chunk : new TextDecoder().decode(chunk)); |
| 4071 | + var idx; |
| 4072 | + while ((idx = _lineBuf.indexOf('\n')) !== -1) { |
| 4073 | + var line = _lineBuf.slice(0, idx); |
| 4074 | + _lineBuf = _lineBuf.slice(idx + 1); |
| 4075 | + rl.emit('line', line); |
| 4076 | + _iterLines.push(line); |
| 4077 | + if (_iterResolve) { _iterResolve(); _iterResolve = null; } |
| 4078 | + } |
| 4079 | + }); |
| 4080 | + input.on('end', function() { |
| 4081 | + rl.emit('close'); |
| 4082 | + _iterDone = true; |
| 4083 | + if (_iterResolve) { _iterResolve(); _iterResolve = null; } |
| 4084 | + }); |
| 4085 | + if (input.resume) input.resume(); |
| 4086 | + } |
4075 | 4087 | return rl; |
4076 | 4088 | }, |
4077 | 4089 | promises: { |
|
0 commit comments