mirror of
https://github.com/Unitech/pm2.git
synced 2025-12-08 20:35:53 +00:00
123 lines
2.9 KiB
JavaScript
123 lines
2.9 KiB
JavaScript
/**
|
|
* Copyright 2013 the PM2 project authors. All rights reserved.
|
|
* Use of this source code is governed by a license that
|
|
* can be found in the LICENSE file.
|
|
*/
|
|
|
|
/**
|
|
* Dependencies
|
|
*/
|
|
|
|
var axon = require('pm2-axon');
|
|
var cst = require('../../constants.js');
|
|
var util = require('util');
|
|
var rpc = require('pm2-axon-rpc');
|
|
var log = require('debug')('pm2:interface');
|
|
var EventEmitter = require('events').EventEmitter;
|
|
|
|
/**
|
|
* Export with conf
|
|
*/
|
|
module.exports = function(opts){
|
|
var sub_port = opts && opts.sub_port || cst.DAEMON_PUB_PORT;
|
|
var rpc_port = opts && opts.rpc_port || cst.DAEMON_RPC_PORT;
|
|
|
|
return new IPM2(sub_port, rpc_port);
|
|
};
|
|
|
|
/**
|
|
* IPM2, Pm2 Interface
|
|
*/
|
|
|
|
var IPM2 = function(sub_port, rpc_port) {
|
|
if (!(this instanceof IPM2)) return new IPM2(sub_port, rpc_port);
|
|
var self = this;
|
|
|
|
EventEmitter.call(this);
|
|
|
|
this.sub_port = sub_port;
|
|
this.rpc_port = rpc_port;
|
|
|
|
|
|
var sub = axon.socket('sub-emitter');
|
|
var sub_sock = this.sub_sock = sub.connect(sub_port);
|
|
this.bus = sub;
|
|
|
|
var req = axon.socket('req');
|
|
var rpc_sock = this.rpc_sock = req.connect(rpc_port);
|
|
this.rpc_client = new rpc.Client(req);
|
|
|
|
this.rpc = {};
|
|
|
|
rpc_sock.on('connect', function() {
|
|
log('rpc_sock:ready');
|
|
self.emit('rpc_sock:ready');
|
|
generateMethods(function() {
|
|
self.emit('ready');
|
|
});
|
|
});
|
|
|
|
rpc_sock.on('close', function() {
|
|
log('rpc_sock:closed');
|
|
self.emit('close');
|
|
});
|
|
|
|
rpc_sock.on('reconnect attempt', function() {
|
|
log('rpc_sock:reconnecting');
|
|
self.emit('reconnecting');
|
|
});
|
|
|
|
sub_sock.on('connect', function() {
|
|
log('sub_sock ready');
|
|
self.emit('sub_sock:ready');
|
|
});
|
|
|
|
sub_sock.on('close', function() {
|
|
log('sub_sock:closed');
|
|
self.emit('closed');
|
|
});
|
|
|
|
sub_sock.on('reconnect attempt', function() {
|
|
log('sub_sock:reconnecting');
|
|
self.emit('reconnecting');
|
|
});
|
|
|
|
/**
|
|
* Disconnect socket connections. This will allow Node to exit automatically.
|
|
* Further calls to PM2 from this object will throw an error.
|
|
*/
|
|
this.disconnect = function () {
|
|
self.sub_sock.close();
|
|
self.rpc_sock.close();
|
|
};
|
|
|
|
/**
|
|
* Generate method by requesting exposed methods by PM2
|
|
* You can now control/interact with PM2
|
|
*/
|
|
var generateMethods = function(cb) {
|
|
log('Requesting and generating RPC methods');
|
|
self.rpc_client.methods(function(err, methods) {
|
|
Object.keys(methods).forEach(function(key) {
|
|
var method_signature, md;
|
|
method_signature = md = methods[key];
|
|
|
|
log('+-- Creating %s method', md.name);
|
|
|
|
(function(name) {
|
|
self.rpc[name] = function() {
|
|
log(name);
|
|
var args = Array.prototype.slice.call(arguments);
|
|
args.unshift(name);
|
|
self.rpc_client.call.apply(self.rpc_client, args);
|
|
};
|
|
})(md.name);
|
|
|
|
});
|
|
return cb();
|
|
});
|
|
};
|
|
};
|
|
|
|
util.inherits(IPM2, EventEmitter);
|