From a0b38054d935d13e1acb2a23f417c3fb76e27156 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Wed, 24 May 2017 11:00:28 -0400 Subject: [PATCH] doc: make socket IPC examples more robust This commit aims to improve the documentation examples that send sockets over IPC channels. Specifically, pauseOnConnect is added to a server that inspects the socket before sending and a 'message' handler adds a check that the socket still exists. PR-URL: https://github.com/nodejs/node/pull/13196 Reviewed-By: Santiago Gimeno Reviewed-By: Refael Ackermann --- doc/api/child_process.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/api/child_process.md b/doc/api/child_process.md index d04f756eb7f140..c5f5dfe7c515c1 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -1052,8 +1052,9 @@ const { fork } = require('child_process'); const normal = fork('subprocess.js', ['normal']); const special = fork('subprocess.js', ['special']); -// Open up the server and send sockets to child -const server = require('net').createServer(); +// Open up the server and send sockets to child. Use pauseOnConnect to prevent +// the sockets from being read before they are sent to the child process. +const server = require('net').createServer({ pauseOnConnect: true }); server.on('connection', (socket) => { // If this is special priority @@ -1073,7 +1074,12 @@ passed to the event callback function: ```js process.on('message', (m, socket) => { if (m === 'socket') { - socket.end(`Request handled with ${process.argv[2]} priority`); + if (socket) { + // Check that the client socket exists. + // It is possible for the socket to be closed between the time it is + // sent and the time it is received in the child process. + socket.end(`Request handled with ${process.argv[2]} priority`); + } } }); ``` @@ -1083,6 +1089,10 @@ tracking when the socket is destroyed. To indicate this, the `.connections` property becomes `null`. It is recommended not to use `.maxConnections` when this occurs. +It is also recommended that any `'message'` handlers in the child process +verify that `socket` exists, as the connection may have been closed during the +time it takes to send the connection to the child. + *Note: this function uses [`JSON.stringify()`][] internally to serialize the `message`.*