Source: servers/telemetry.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TelloTelemetry = void 0;
const http_1 = require("http");
const logger_1 = require("../lib/logger");
const websocket_1 = require("websocket");
const warp10_1 = require("../lib/warp10");
const MqttForwarder_1 = require("../lib/MqttForwarder");
/** WebSocket server that broadcasts OSD telemetry to browser clients. Optionally forwards to Warp 10 and/or MQTT. */
class TelloTelemetry {
    constructor() {
        this.wsClients = [];
        this.port = 1338;
        this.lastSend = 0;
    }
    /** Start the WebSocket server on port 1338. Initialises Warp 10 and MQTT forwarders if configured in options. */
    start(options) {
        this.options = options;
        if (options.withWarp10 && options.warp10Params) {
            this.warp10 = new warp10_1.Warp10(options.warp10Params);
        }
        if (options.withMqtt && options.mqttParams) {
            this.mqttForwarder = new MqttForwarder_1.MqttForwarder(options.mqttParams);
        }
        return new Promise(resolve => {
            this.lastSend = Date.now();
            this.httpServer = (0, http_1.createServer)(() => { });
            this.httpServer.listen(this.port, () => {
                logger_1.Logger.info('[TelloTelemetry - WS]', 'Server is listening on port', this.port);
                resolve(this);
            });
            this.wsServer = new websocket_1.server({ httpServer: this.httpServer });
            this.wsServer.on('request', (req) => {
                const cnx = req.accept(null, req.origin);
                logger_1.Logger.info('[TelloTelemetry - WS]', 'Connection from', req.origin);
                const index = this.wsClients.push(cnx) - 1;
                cnx.on('close', () => {
                    logger_1.Logger.info('[TelloTelemetry - WS]', 'Peer', cnx.remoteAddress, 'disconnected');
                    this.wsClients.splice(index, 1);
                });
            });
        });
    }
    /** Broadcast a telemetry frame to all connected WebSocket clients (throttled to 500ms). */
    send(data) {
        var _a, _b;
        if (Date.now() - this.lastSend >= 500) {
            (_a = this.warp10) === null || _a === void 0 ? void 0 : _a.pushData(data);
            (_b = this.mqttForwarder) === null || _b === void 0 ? void 0 : _b.pushData(data);
            this.wsClients.forEach(c => c.sendUTF(JSON.stringify(data)));
            this.lastSend = Date.now();
        }
    }
    /** Broadcast a raw video chunk to all connected clients. */
    sendVideo(chunk) {
        this.wsClients.forEach(c => c.sendBytes(chunk));
    }
    /** Stop the HTTP and WebSocket server. */
    stop() {
        return new Promise(resolve => {
            if (this.httpServer) {
                this.httpServer.close(() => {
                    logger_1.Logger.info('[TelloTelemetry - WS]', 'Web Server stopped');
                    resolve(this);
                });
            }
            else {
                resolve(this);
            }
        });
    }
}
exports.TelloTelemetry = TelloTelemetry;
//# sourceMappingURL=telemetry.js.map