"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