localhost:1234`,
+ true,
+ );
+ return;
+ }
+ sendWSNotice(`Error creating websocket: ${e.name} - ${e.message}`);
+ startReconnectLoop();
+ return;
+ }
+
+ websocket.addEventListener('open', () => {
+ clearReconnectTimer();
+ sendWSNotice('Websocket connected!', true);
+ Byond.sendMessage('requestMetadata'); // let's be nice and request metadata
+ retryCount = 0;
+ });
+
+ websocket.addEventListener('message', (event) => {
+ if (event.data === 'requestMetadata') {
+ Byond.sendMessage('requestMetadata');
+ }
+ });
+
+ websocket.addEventListener('close', (ev) => {
+ websocket = null;
+
+ if (manuallyClosed || ev.code === WEBSOCKET_DISABLED) return;
+
+ sendWSNotice(
+ `Websocket disconnected! Code: ${ev.code} Reason: ${ev.reason || 'None provided'}`,
+ true,
+ );
+
+ startReconnectLoop();
+ });
+
+ websocket.addEventListener('error', (ev) => {
+ logger.error('got websocket error', ev);
+ safeClose(WEBSOCKET_REATTEMPT, 'got error from server');
+ });
+}
+
+// Initial connect
+setupWebsocket();
+
+export function wsUpdate(enabled: boolean): void {
+ if (enabled) {
+ setupWebsocket();
+ return;
+ }
+
+ manuallyClosed = true;
+ clearReconnectTimer();
+ safeClose(WEBSOCKET_DISABLED);
+ websocket = null;
+}
+
+export function wsReconnect(): void {
+ setupWebsocket(true);
+ sendWSNotice('Attempting to connect to websocket...', true);
+}
+
+export function wsDisconnect(): void {
+ manuallyClosed = true;
+ clearReconnectTimer();
+ safeClose(WEBSOCKET_DISABLED);
+ websocket = null;
+ retryCount = 0;
+ sendWSNotice('Websocket forcefully disconnected. (Retry count reset)', true);
+}
+
+export function wsSend(msg: Record