Created
October 7, 2021 05:19
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
}); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is the expected log when server is executed: