react-teamspeak-remote-app-api
Version:
React hook/api for the TeamSpeak5/6 remote app feature
115 lines (114 loc) • 5.13 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TS5ConnectionHandler = void 0;
var dataHandler_1 = require("../../handlers/teamspeak/dataHandler");
var messageHandler_1 = require("../../handlers/teamspeak/messageHandler");
// Establish connection to TS5 client
// Main class
var TS5ConnectionHandler = /** @class */ (function () {
function TS5ConnectionHandler(
// Port of TS5 client
remoteAppPort, authPayload, logger,
// State setters for dataHandler
setConnections, setChannels, setClients, setActiveConnectionStateId) {
this.authenticated = false; // Is the connection authenticated?
// Create websocket connection to TS5 client
this.remoteAppPort = remoteAppPort;
this.authPayload = authPayload;
this.logger = logger;
this.ws = new WebSocket("ws://localhost:".concat(this.remoteAppPort));
// Create dataHandler and messageHandler
this.dataHandler = new dataHandler_1.TS5DataHandler(setConnections, setChannels, setClients, logger);
this.messageHandler = new messageHandler_1.TS5MessageHandler(this.ws, this.dataHandler, setActiveConnectionStateId, logger);
}
TS5ConnectionHandler.prototype.reconnect = function () {
this.logger.log("Reconnecting...");
this.ws.close();
this.ws = new WebSocket("ws://localhost:".concat(this.remoteAppPort));
this.dataHandler.clearAll();
this.authenticated = false;
this.connect();
};
// Connect to TS5 client
TS5ConnectionHandler.prototype.connect = function () {
var _this = this;
var _a;
this.logger.log('Connecting to TS5 client...');
// Create authentication payload
var initialPayload = {
type: "auth",
payload: __assign(__assign({}, this.authPayload), { content: {
apiKey: (_a = localStorage.getItem("apiKey")) !== null && _a !== void 0 ? _a : "",
} })
};
this.ws.onopen = function () {
// Send authentication payload to TS5 client
_this.ws.send(JSON.stringify(initialPayload));
_this.logger.wsSent(initialPayload);
};
this.ws.onclose = function (event) {
_this.logger.log("WebSocket connection closed", event);
// If the connection was closed before authentication, remove the API key from local storage
// OBS weirdly caches the localstorage and is very stubborn about clearing it (even when clicking "Clear Cache")
if (!_this.authenticated) {
_this.logger.log("WebSocket connection closed before authentication");
localStorage.removeItem("apiKey");
}
setTimeout(function () {
_this.reconnect();
}, 2000);
};
// Handle messages received from TS5 client
// See TS5MessageHandler class
this.ws.onmessage = function (event) {
var data = JSON.parse(event.data);
_this.logger.wsReceived(data);
switch (data.type) {
case "auth":
_this.messageHandler.handleAuthMessage(data);
_this.authenticated = true;
break;
case "clientMoved":
_this.messageHandler.handleClientMovedMessage(data);
break;
case "clientPropertiesUpdated":
_this.messageHandler.handleClientPropertiesUpdatedMessage(data);
break;
case "talkStatusChanged":
_this.messageHandler.handleTalkStatusChangedMessage(data);
break;
case "serverPropertiesUpdated":
_this.messageHandler.handleServerPropertiesUpdatedMessage(data);
break;
case "connectStatusChanged":
_this.messageHandler.handleConnectStatusChangedMessage(data);
break;
case "clientSelfPropertyUpdated":
_this.messageHandler.handleClientSelfPropertyUpdatedMessage(data);
break;
case "channels":
_this.messageHandler.handleChannelsMessage(data);
break;
case "channelCreated":
_this.messageHandler.handleChannelCreatedMessage(data);
break;
default:
_this.logger.log("No handler for event type: ".concat(data.type));
break;
}
};
};
return TS5ConnectionHandler;
}());
exports.TS5ConnectionHandler = TS5ConnectionHandler;