UNPKG

@fibercom/routeros-api

Version:

Robust MikroTik RouterOS API client for Node.js and TypeScript

97 lines 7.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Transmitter = void 0; const iconv = require("iconv-lite"); const debug = require("debug"); const info = debug('routeros-api:connector:transmitter:info'); const error = debug('routeros-api:connector:transmitter:error'); /** * Transmitter encodes RouterOS commands into properly framed buffers * and writes them to a socket. If the socket is not ready, it queues * the commands to be sent later. */ class Transmitter { constructor(socket) { this.pool = []; this.socket = socket; } /** * Sends a command line. If the socket isn't writable or if a backlog exists, * it queues the command instead. * * @param {string} data - Command or null to terminate a command group. */ write(data) { const encodedData = this.encodeString(data); if (!this.socket.writable || this.pool.length > 0) { info('Socket not writable, queuing command: %o', data); this.pool.push(encodedData); } else { info('Writing command to socket: %s', data); this.socket.write(encodedData); } } /** * Sends all previously queued commands once the socket is ready. */ runPool() { info('Flushing command pool'); while (this.pool.length > 0) { const data = this.pool.shift(); this.socket.write(data); } } /** * Encodes a string into RouterOS framed protocol using win1252. * Adds appropriate length prefix for each frame. * * @param {string|null} str * @returns {string} Encoded frame to be sent over the socket. */ encodeString(str) { if (str === null) return String.fromCharCode(0); const encoded = iconv.encode(str, 'win1252'); let len = encoded.length; let offset = 0; let data; if (len < 0x80) { data = Buffer.alloc(len + 1); data[offset++] = len; } else if (len < 0x4000) { data = Buffer.alloc(len + 2); len |= 0x8000; data[offset++] = (len >> 8) & 0xff; data[offset++] = len & 0xff; } else if (len < 0x200000) { data = Buffer.alloc(len + 3); len |= 0xc00000; data[offset++] = (len >> 16) & 0xff; data[offset++] = (len >> 8) & 0xff; data[offset++] = len & 0xff; } else if (len < 0x10000000) { data = Buffer.alloc(len + 4); len |= 0xe0000000; data[offset++] = (len >> 24) & 0xff; data[offset++] = (len >> 16) & 0xff; data[offset++] = (len >> 8) & 0xff; data[offset++] = len & 0xff; } else { data = Buffer.alloc(len + 5); data[offset++] = 0xf0; data[offset++] = (len >> 24) & 0xff; data[offset++] = (len >> 16) & 0xff; data[offset++] = (len >> 8) & 0xff; data[offset++] = len & 0xff; } encoded.copy(data, offset); return data.toString(); } } exports.Transmitter = Transmitter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNtaXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29ubmVjdG9yL1RyYW5zbWl0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG9DQUFvQztBQUNwQywrQkFBK0I7QUFFL0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7QUFDOUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7QUFFaEU7Ozs7R0FJRztBQUNILE1BQWEsV0FBVztJQUlwQixZQUFZLE1BQWM7UUFGbEIsU0FBSSxHQUFhLEVBQUUsQ0FBQztRQUd4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsSUFBWTtRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsMENBQTBDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDVixJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFB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