UNPKG

routeros-api

Version:

Mikrotik Routerboard RouterOS API for NodeJS

203 lines 12.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Connector = void 0; const events_1 = require("events"); const net_1 = require("net"); const tls = require("tls"); const Receiver_1 = require("./Receiver"); const Transmitter_1 = require("./Transmitter"); const RosException_1 = require("../RosException"); const debug = require("debug"); const info = debug('routeros-api:connector:connector:info'); const error = debug('routeros-api:connector:connector:error'); /** * Connector class responsible for communicating with * the routeros via api, sending and receiving buffers. * * The main focus of this class is to be able to * construct and destruct dinamically by the RouterOSAPI class * when needed, so the authentication parameters don't * need to be changed every time we need to reconnect. */ class Connector extends events_1.EventEmitter { /** * Constructor which receive the options of the connection * * @param {Object} options */ constructor(options) { super(); /** * Connected status */ this.connected = false; /** * Connecting status */ this.connecting = false; /** * Closing status */ this.closing = false; this.host = options.host; if (options.timeout) this.timeout = options.timeout; if (options.port) this.port = options.port; if (typeof options.tls === 'boolean' && options.tls) options.tls = {}; if (typeof options.tls === 'object') { if (!options.port) this.port = 8729; this.tls = options.tls; } } /** * Connect to the routerboard * * @returns {Connector} */ connect() { if (!this.connected) { if (!this.connecting) { this.connecting = true; if (this.tls) { this.socket = tls.connect(this.port, this.host, this.tls, this.onConnect.bind(this)); this.transmitter = new Transmitter_1.Transmitter(this.socket); this.receiver = new Receiver_1.Receiver(this.socket); this.socket.on('data', this.onData.bind(this)); this.socket.on('tlsClientError', this.onError.bind(this)); this.socket.once('end', this.onEnd.bind(this)); this.socket.once('timeout', this.onTimeout.bind(this)); this.socket.once('fatal', this.onEnd.bind(this)); this.socket.on('error', this.onError.bind(this)); this.socket.setTimeout(this.timeout * 1000); this.socket.setKeepAlive(true); } else { this.socket = new net_1.Socket(); this.transmitter = new Transmitter_1.Transmitter(this.socket); this.receiver = new Receiver_1.Receiver(this.socket); this.socket.once('connect', this.onConnect.bind(this)); this.socket.once('end', this.onEnd.bind(this)); this.socket.once('timeout', this.onTimeout.bind(this)); this.socket.once('fatal', this.onEnd.bind(this)); this.socket.on('error', this.onError.bind(this)); this.socket.on('data', this.onData.bind(this)); this.socket.setTimeout(this.timeout * 1000); this.socket.setKeepAlive(true); this.socket.connect(this.port, this.host); } } } return this; } /** * Writes data through the open socket * * @param {Array} data * @returns {Connector} */ write(data) { for (const line of data) { this.transmitter.write(line); } this.transmitter.write(null); return this; } /** * Register a tag to receive data * * @param {string} tag * @param {function} callback */ read(tag, callback) { this.receiver.read(tag, callback); } /** * Unregister a tag, so it no longer waits for data * @param {string} tag */ stopRead(tag) { this.receiver.stop(tag); } /** * Start closing the connection */ close() { if (!this.closing) { this.closing = true; this.socket.end(); } } /** * Destroy the socket, no more data * can be exchanged from now on and * this class itself must be recreated */ destroy() { this.socket.destroy(); this.removeAllListeners(); } /** * Socket connection event listener. * After the connection is stablished, * ask the transmitter to run any * command stored over the pool * * @returns {function} */ onConnect() { this.connecting = false; this.connected = true; info('Connected on %s', this.host); this.transmitter.runPool(); this.emit('connected', this); } /** * Socket end event listener. * Terminates the connection after * the socket is released * * @returns {function} */ onEnd() { this.emit('close', this); this.destroy(); } /** * Socket error event listener. * Emmits the error while trying to connect and * destroys the socket. * * @returns {function} */ onError(err) { err = new RosException_1.RosException(err.code, err); error('Problem while trying to connect to %s. Error: %s', this.host, err.message); this.emit('error', err, this); this.destroy(); } /** * Socket timeout event listener * Emmits timeout error and destroys the socket * * @returns {function} */ onTimeout() { this.emit('timeout', new RosException_1.RosException('SOCKTMOUT', { seconds: this.timeout }), this); this.destroy(); } /** * Socket data event listener * Receives the data and sends it to processing * * @returns {function} */ onData(data) { info('Got data from the socket, will process it'); this.receiver.processRawData(data); } } exports.Connector = Connector; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29ubmVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nvbm5lY3Rvci9Db25uZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXNDO0FBQ3RDLDZCQUE2QjtBQUM3QiwyQkFBMkI7QUFDM0IseUNBQXNDO0FBQ3RDLCtDQUE0QztBQUM1QyxrREFBK0M7QUFDL0MsK0JBQStCO0FBRS9CLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0FBQzVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0FBRTlEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSxTQUFVLFNBQVEscUJBQVk7SUFtRHZDOzs7O09BSUc7SUFDSCxZQUFZLE9BQVk7UUFDcEIsS0FBSyxFQUFFLENBQUM7UUExQlo7O1dBRUc7UUFDSyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRW5DOztXQUVHO1FBQ0ssZUFBVSxHQUFZLEtBQUssQ0FBQztRQUVwQzs7V0FFRztRQUNLLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFlN0IsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksT0FBTyxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDcEQsSUFBSSxPQUFPLENBQUMsSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMzQyxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUc7WUFBRSxPQUFPLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN0RSxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUFFLElBQUksQ0FBQyxJQUFJLEdB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