From c97f1becff4ddcb0a301e2be474770a6e2e868e7 Mon Sep 17 00:00:00 2001 From: CoryGH Date: Fri, 21 May 2021 04:53:57 -0400 Subject: [PATCH] adding example for cluster-based multithreading working example of cluster-based multithreading utilizing connectionRouter override. --- examples/cluster-threading.js | 66 +++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 examples/cluster-threading.js diff --git a/examples/cluster-threading.js b/examples/cluster-threading.js new file mode 100644 index 0000000..b631c44 --- /dev/null +++ b/examples/cluster-threading.js @@ -0,0 +1,66 @@ +const cluster = require('cluster'); +const ldap = require('ldapjs'); +const os = require('os'); + +const threads = []; +threads.getNext = function () { + return (Math.floor(Math.random() * this.length)); +}; + +const serverOptions = { + connectionRouter: (socket) => { + socket.pause(); + console.log('ldapjs client requesting connection'); + let routeTo = threads.getNext(); + threads[routeTo].send({ type: 'connection' }, socket); + } +}; + +const server = ldap.createServer(serverOptions); + +if (cluster.isMaster) { + for (let i = 0; i < os.cpus().length; i++) { + let thread = cluster.fork({ + 'id': i + }); + thread.id = i; + thread.on('message', function (msg) { + + }); + threads.push(thread); + } + + server.listen(1389, function () { + console.log('ldapjs listening at ' + server.url); + }); +} else { + let threadId = process.env.id; + serverOptions.connectionRouter = (connection) => { + console.log('should not be hit'); + }; + + process.on('message', (msg, socket) => { + switch (msg.type) { + case 'connection': + server.newConnection(socket); + socket.resume(); + console.log('ldapjs client connection accepted on ' + threadId.toString()); + } + }); + + server.search('dc=example', function (req, res, next) { + console.log('ldapjs search initiated on ' + threadId.toString()); + var obj = { + dn: req.dn.toString(), + attributes: { + objectclass: ['organization', 'top'], + o: 'example' + } + }; + + if (req.filter.matches(obj.attributes)) + res.send(obj); + + res.end(); + }); +}