From 7ac62d3cdb89ffd22aec04f8d89dbb6e6a4e6568 Mon Sep 17 00:00:00 2001 From: Ivo Julca Date: Wed, 23 Mar 2016 02:22:23 -0500 Subject: [PATCH] Refactor Verifier to use the PM API --- app.js | 1 + verifier.js | 85 +++++++++++++++++++++++++++-------------------------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/app.js b/app.js index 0a4df73a63..a52f3b3c1f 100644 --- a/app.js +++ b/app.js @@ -115,6 +115,7 @@ global.Rooms = require('./rooms.js'); delete process.send; // in case we're a child process global.Verifier = require('./verifier.js'); +Verifier.PM.spawn(); global.CommandParser = require('./command-parser.js'); diff --git a/verifier.js b/verifier.js index d8848bdea5..a8151dd2a2 100644 --- a/verifier.js +++ b/verifier.js @@ -14,55 +14,58 @@ 'use strict'; -// Because I don't want two files, we're going to fork ourselves. +const crypto = require('crypto'); +const ProcessManager = require('./process-manager'); -if (!process.send) { - // This is the parent +const PM = exports.PM = new ProcessManager({ + maxProcesses: 1, + execFile: 'verifier.js', + onMessageUpstream: function (message) { + // Protocol: + // success: "[id]|1" + // failure: "[id]|0" + let pipeIndex = message.indexOf('|'); + let id = +message.substr(0, pipeIndex); + let result = Boolean(~~message.slice(pipeIndex + 1)); - let guid = 1; - let resolvers = Object.create(null); - - let child = exports.child = require('child_process').fork('verifier.js', {cwd: __dirname}); - - exports.verify = function (data, signature) { - return new Promise((resolve, reject) => { - let localGuid = guid++; - resolvers[localGuid] = resolve; - child.send({data: data, sig: signature, guid: localGuid}); - }); - }; - - child.on('message', response => { - if (response.guid in resolvers) { - resolvers[response.guid](response.success); - delete resolvers[response.guid]; + if (this.pendingTasks.has(id)) { + this.pendingTasks.get(id)(result); + this.pendingTasks.delete(id); + this.release(); } - }); -} else { - // This is the child + }, + onMessageDownstream: function (message) { + // protocol: + // "[id]|{data, sig}" + let pipeIndex = message.indexOf('|'); + let id = message.substr(0, pipeIndex); - global.Config = require('./config/config.js'); - let crypto = require('crypto'); - - let keyalgo = Config.loginserverkeyalgo; - let pkey = Config.loginserverpublickey; - - process.on('message', message => { - let verifier = crypto.createVerify(keyalgo); - verifier.update(message.data); + let data = JSON.parse(message.slice(pipeIndex + 1)); + process.send(id + '|' + this.receive(data)); + }, + receive: function (data) { + let verifier = crypto.createVerify(Config.loginserverkeyalgo); + verifier.update(data.data); let success = false; try { - success = verifier.verify(pkey, message.sig, 'hex'); + success = verifier.verify(Config.loginserverpublickey, data.sig, 'hex'); } catch (e) {} - process.send({ - success: success, - guid: message.guid, - }); - }); - process.on('disconnect', () => { - process.exit(); - }); + return success ? 1 : 0; + }, +}); + +if (process.send && module === process.mainModule) { + // This is a child process! + + global.Config = require('./config/config.js'); require('./repl.js').start('verifier', cmd => eval(cmd)); + + process.on('message', message => PM.onMessageDownstream(message)); + process.on('disconnect', () => process.exit()); } + +exports.verify = function (data, signature) { + return PM.send({data: data, sig: signature}); +};