Skip to content

Commit 7157c64

Browse files
committed
wip: fix ipc on stdio
1 parent 4924fb3 commit 7157c64

3 files changed

Lines changed: 37 additions & 3 deletions

File tree

lib/internal/process.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ function setupChannel() {
224224
const fd = parseInt(process.env.NODE_CHANNEL_FD, 10);
225225
assert(fd >= 0);
226226

227+
Object.defineProperty(process, 'ipcChannelFd', {
228+
configurable: true,
229+
enumerable: true,
230+
value: fd
231+
});
232+
227233
// Make sure it's not accidentally inherited by child processes.
228234
delete process.env.NODE_CHANNEL_FD;
229235

lib/net.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ function noop() {}
5959

6060
function createHandle(fd) {
6161
const type = TTYWrap.guessHandleType(fd);
62-
if (type === 'PIPE') return new Pipe();
62+
if (type === 'PIPE') {
63+
const useIPCPipe = process.platform === 'win32' &&
64+
process.ipcChannelFd === fd;
65+
return new Pipe(useIPCPipe);
66+
}
6367
if (type === 'TCP') return new TCP();
6468
throw new errors.TypeError('ERR_INVALID_FD_TYPE', type);
6569
}

test/parallel/test-child-process-stdout-ipc.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
11
'use strict';
22
const common = require('../common');
33
const assert = require('assert');
4-
4+
const util = require('util');
5+
const fs = require('fs');
56
const spawn = require('child_process').spawn;
67

78
if (process.argv[2] === 'child') {
8-
process.send('hahah');
9+
const consoleLog = common.mustCall(() => {
10+
console.log('{"method": "console.log"}');
11+
})
12+
const processSend = common.mustCall(() => {
13+
process.send({method: 'process.send'}, consoleLog);
14+
});
15+
const fsWrite = common.mustCall(() => {
16+
fs.write(1, '{"method": "process.fs.write"}\n', processSend);
17+
});
18+
const stdoutWrite = () => {
19+
process.stdout.write('{"method": "process.stdout.write"}\n', fsWrite);
20+
};
21+
22+
stdoutWrite();
923
return;
1024
}
1125

@@ -16,3 +30,13 @@ const proc = spawn(process.execPath, [__filename, 'child'], {
1630
proc.on('exit', common.mustCall(function(code) {
1731
assert.strictEqual(code, 0);
1832
}));
33+
34+
let messagesReceived = 0;
35+
proc.on('message', (message) => {
36+
console.log(`Received: ${util.inspect(message)}`);
37+
++messagesReceived;
38+
});
39+
40+
process.on('exit', () => {
41+
assert.equal(messagesReceived, 4, 'Not all messages has been received');
42+
})

0 commit comments

Comments
 (0)