node-ldapjs/examples/cluster-threading.js

67 lines
1.7 KiB
JavaScript

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();
});
}