UNPKG

pinus-robot

Version:

pinus-robot is a simple tool to benchmark the socket.io server's performance.

176 lines 13.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Agent = void 0; let __ = require('underscore'); const socket_io_client_1 = require("socket.io-client"); const logging_1 = require("../common/logging"); const actor_1 = require("./actor"); let monitor = require('../monitor/monitor'); let fs = require('fs'); let util = require('../common/util'); let STATUS_INTERVAL = 10 * 1000; // 10 seconds let RECONNECT_INTERVAL = 10 * 1000; // 15 seconds let HEARTBEAT_PERIOD = 30 * 1000; // 30 seconds let HEARTBEAT_FAILS = 3; // Reconnect after 3 missed heartbeats /** * * @param {Object} conf * init the master and app server for the agent * include app data, exec script,etc. * */ class Agent { constructor(conf) { this.log = logging_1.logging; this.log = logging_1.logging; this.conf = conf || {}; this.last_heartbeat = null; this.connected = false; this.reconnecting = false; this.actors = {}; this.count = 0; } // Create socket, bind callbacks, connect to server connect() { let agent = this; let uri = 'http://' + agent.conf.master.host + ':' + agent.conf.master.port; console.log('connecting:', uri); agent.socket = (0, socket_io_client_1.io)(uri, { forceNew: true, multiplex: false }); agent.socket.on('error', function (reason) { console.error('err:', reason); agent.reconnect(); }); // Register announcement callback agent.socket.on('connect', function () { agent.log.info('Connected to server, sending announcement...'); // console.log(agent.socket.socket.sessionid); // console.log(require('util').inspect(agent.socket.address,true,10,10)); agent.announce(agent.socket); agent.connected = true; agent.reconnecting = false; agent.last_heartbeat = new Date().getTime(); }); agent.socket.on('disconnect', function () { agent.socket.disconnect(); agent.log.error('Disconnect...'); }); // Server heartbeat agent.socket.on('heartbeat', function () { // agent.log.info("Received server heartbeat"); agent.last_heartbeat = new Date().getTime(); return; }); // Node with same label already exists on server, kill process agent.socket.on('node_already_exists', function () { agent.log.error('ERROR: A node of the same name is already registered'); agent.log.error('with the log server. Change this agent\'s instance_name.'); agent.log.error('Exiting.'); process.exit(1); }); // begin to run agent.socket.on('run', function (message) { agent.run(message); }); // Exit for BTN_ReReady agent.socket.on('exit4reready', function () { agent.log.info('Exit for BTN_ReReady.'); process.exit(0); }); } run(msg) { let agent = this; util.deleteLog(); this.count = msg.maxuser; let script = msg.script; let index = msg.index; let conf = {}; conf.master = agent.conf.master; conf.scriptFile = agent.conf.scriptFile; if (!!script && script.length > 1) { conf.script = script; } agent.log.info(this.nodeId + ' run ' + this.count + ' actors '); monitor.clear(); this.actors = {}; let offset = index * this.count; for (let i = 0; i < this.count; i++) { let aid = i + offset; // calc database key offset; let actor = new actor_1.Actor(conf, aid); this.actors[aid] = actor; (function (actor) { actor.on('error', function (error) { agent.socket.emit('error', error); }); if (conf.master.interval <= 0) { actor.run(); } else { let time = Math.round(Math.random() * 1000 + i * conf.master.interval); setTimeout(function () { actor.run(); }, time); } })(actor); } setInterval(function () { let mdata = monitor.getData(); agent.socket.emit('report', mdata); }, STATUS_INTERVAL); } // Run agent start() { let agent = this; agent.connect(); // Check for heartbeat every HEARTBEAT_PERIOD, reconnect if necessary setInterval(function () { let delta = ((new Date().getTime()) - agent.last_heartbeat); if (delta > (HEARTBEAT_PERIOD * HEARTBEAT_FAILS)) { agent.log.warn('Failed heartbeat check, reconnecting...'); agent.connected = false; agent.reconnect(); } }, HEARTBEAT_PERIOD); } // Sends announcement announce(socket) { let agent = this; let sessionid = agent.socket.id; agent.nodeId = sessionid; this._send('announce_node', { client_type: 'node', nodeId: sessionid }); } // Reconnect helper, retry until connection established reconnect(force) { let agent = this; if (!force && agent.reconnecting) { return; } this.reconnecting = true; if (agent.socket != null) { agent.socket.disconnect(); agent.connected = false; } console.log('Reconnecting to server...'); setTimeout(function () { if (agent.connected) { return; } agent.connect(); }, RECONNECT_INTERVAL); } _send(event, message) { try { this.socket.emit(event, message); // If server is down, a non-writeable stream error is thrown. } catch (err) { this.log.error('ERROR: Unable to send message over socket.'); this.connected = false; this.reconnect(); } } } exports.Agent = Agent; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYWdlbnQvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQy9CLHVEQUE0QztBQUM1QywrQ0FBb0Q7QUFDcEQsbUNBQWdDO0FBQ2hDLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzVDLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUVyQyxJQUFJLGVBQWUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsYUFBYTtBQUM5QyxJQUFJLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxhQUFhO0FBQ2pELElBQUksZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLGFBQWE7QUFDL0MsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO0FBTy9EOzs7Ozs7R0FNRztBQUNILE1BQWEsS0FBSztJQVVkLFlBQVksSUFBYztRQVQxQixRQUFHLEdBQVcsaUJBQU8sQ0FBQztRQVVsQixJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFPLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQWMsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxtREFBbUQ7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