Skip to content

Instantly share code, notes, and snippets.

@dreanmer
Created October 7, 2021 05:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dreanmer/e9ed5f780e0adcf806b136bc2930b6fb to your computer and use it in GitHub Desktop.
Save dreanmer/e9ed5f780e0adcf806b136bc2930b6fb to your computer and use it in GitHub Desktop.
Node.js: call method on forked process and get response through socket (vanilla)
const net = require('net');
// send message to server (forked process)
process.send({
event: 'spawned',
data: {
client: 'is loading'
}
});
// receive message from server
process.on('message', (message) => {
console.log('[client] received message from server:', message);
// connect to socket connection
const socket = net.connect(message.server);
socket.on('ready', () => {
console.log('[client] connected on socket');
// execute what do you want
console.log('[client] server wants to execute `' + message.method + '` method')
// write response message to server (through socket)
socket.write(JSON.stringify({
success: true
}));
socket.destroy(); // dont forget to end the connection
});
});
const net = require('net');
const fork = require('child_process').fork;
// init client
const client = fork(__dirname + '/client.js');
// lets log forked process messages
client.on('message', (message) => {
console.log('[server] received message from client:', message);
});
function clientExecute(method) {
// create the socket server
return new Promise((resolve, reject) => {
const server = net.createServer(function (socket) {
console.log('[server] got client connection');
// listen for messages
socket.on('data', function (data) {
const responseData = JSON.parse(data.toString());
console.log('[server] got response through socket');
server.close(); // dont forget to close the server
return resolve(responseData);
});
// if dont receive data in 5s close the server
setTimeout(() => {
if (server.listening) {
console.log('[server] was closed by timeout');
server.close(); // never forget
return reject(new Error('timeout'));
}
}, 5000);
});
// start net socket server. Null value for port will set a it to a random unused port
server.listen(null, () => {
// send through fork process message the client address
// and some data like the method you want to be called
client.send({
method: method,
server: server.address()
});
});
});
}
// executes it
clientExecute('teste').then((responseData) => {
console.log(responseData);
});
@dreanmer
Copy link
Author

dreanmer commented Oct 7, 2021

This is the expected log when server is executed:

[server] received message from client: { 
  event: 'spawned', 
  data: { client: 'is loading' } 
}
[client] received message from server: {
  method: 'teste',
  server: { address: '::', family: 'IPv6', port: 36975 }
}
[client] connected on socket
[client] server wants to execute `teste` method
[server] got client connection
[server] got response through socket
{ success: true }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment