Skip to content

Commit d71ed4e

Browse files
committed
fix: readline createInterface emits line events, wire input data handler
1 parent 3a9f1de commit d71ed4e

3 files changed

Lines changed: 38 additions & 25 deletions

File tree

packages/core/isolate-runtime/src/inject/require-setup.ts

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4046,32 +4046,44 @@
40464046
resume: function() { return rl; },
40474047
write: function() {},
40484048
[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;
40734050
}
40744051
};
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+
}
40754087
return rl;
40764088
},
40774089
promises: {

packages/core/src/generated/isolate-runtime.ts

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/nodejs/src/bridge-handlers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3086,6 +3086,7 @@ export function buildModuleResolutionBridgeHandlers(
30863086
}
30873087

30883088
// Try require.resolve first
3089+
if (req === "undici") console.error(`[DEBUG resolve undici] hostDir=${hostDir} sandboxDir=${sandboxDir} referrer=${referrer}`);
30893090
try {
30903091
const resolved = hostRequire.resolve(req, { paths: [hostDir] });
30913092
return deps.hostToSandboxPath(resolved);

0 commit comments

Comments
 (0)