diff --git a/lib/process/processLauncher.js b/lib/process/processLauncher.js index 0cf8cdf0..7086d696 100644 --- a/lib/process/processLauncher.js +++ b/lib/process/processLauncher.js @@ -1,7 +1,18 @@ const child_process = require('child_process'); const constants = require('../constants'); + class ProcessLauncher { + + /** + * Constructor of ProcessLauncher. Forks the module and sets up the message handling + * @param {Object} options Options tp start the process + * * modulePath {String} Absolute path to the module to fork + * * logger {Object} Logger + * * normalizeInput {Function} Function to normalize logs + * * events {Function} Events Emitter instance + * @return {ProcessLauncher} The ProcessLauncher instance + */ constructor(options) { this.process = child_process.fork(options.modulePath); this.logger = options.logger; @@ -12,6 +23,7 @@ class ProcessLauncher { this._subscribeToMessages(); } + // Subscribes to messages from the child process and delegates to the right methods _subscribeToMessages() { const self = this; this.process.on('message', (msg) => { @@ -25,6 +37,7 @@ class ProcessLauncher { }); } + // Translates logs from the child process to the logger _handleLog(msg) { if (this.logger[msg.type]) { return this.logger[msg.type](this.normalizeInput(msg.message)); @@ -32,6 +45,7 @@ class ProcessLauncher { this.logger.debug(this.normalizeInput(msg.message)); } + // Handle event calls from the child process _handleEvent(msg) { const self = this; if (!self.events[msg.event]) { @@ -52,6 +66,7 @@ class ProcessLauncher { self.events[msg.event](msg.requestName, ...msg.args); } + // Looks at the subscriptions to see if there is a callback to call _checkSubscriptions(msg) { const messageKeys = Object.keys(msg); const subscriptionsKeys = Object.keys(this.subscriptions); @@ -87,6 +102,13 @@ class ProcessLauncher { } } + /** + * Subscribe to a message using a key-value pair + * @param {String} key Message key to subscribe to + * @param {String} value Value that the above key must have for the callback to be called + * @param {Function} callback callback(response) + * @return {void} + */ subscribeTo(key, value, callback) { if (this.subscriptions[key]) { this.subscriptions[key].push(value); @@ -95,6 +117,13 @@ class ProcessLauncher { this.subscriptions[key] = [{value, callback}]; } + /** + * Unsubscribes from a previously subscribed key-value pair (or key if no value) + * @param {String} key Message key to unsubscribe + * @param {String} value [Optional] Value of the key to unsubscribe + * If there is no value, unsubscribes from all the values of that key + * @return {void} + */ unsubscribeTo(key, value) { if (!value) { this.subscriptions[key] = []; @@ -108,18 +137,38 @@ class ProcessLauncher { } } + /** + * Unsubscribes from all subscriptions + * @return {void} + */ unsubsribeToAll() { this.subscriptions = {}; } + /** + * Sends a message to the child process. Same as ChildProcess.send() + * @params {Object} message Message to send + * For other parameters, see: + * https://nodejs.org/api/child_process.html#child_process_subprocess_send_message_sendhandle_options_callback + * @return {void} + */ send() { this.process.send(...arguments); } + /** + * Disconnects the child process. It will exit on its own + * @return {void} + */ disconnect() { this.process.disconnect(); } + /** + * Kills the child process + * https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal + * @return {void} + */ kill() { this.process.kill(...arguments); }