mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-10 00:23:30 +01:00
91 lines
2.1 KiB
JavaScript
91 lines
2.1 KiB
JavaScript
const EventEmitter = require('events');
|
|
const { Events, Status } = require('../../util/Constants');
|
|
const WebSocketConnection = require('./WebSocketConnection');
|
|
|
|
/**
|
|
* WebSocket Manager of the client.
|
|
* @private
|
|
*/
|
|
class WebSocketManager extends EventEmitter {
|
|
constructor(client) {
|
|
super();
|
|
/**
|
|
* The client that instantiated this WebSocketManager
|
|
* @type {Client}
|
|
*/
|
|
this.client = client;
|
|
|
|
/**
|
|
* The WebSocket connection of this manager
|
|
* @type {?WebSocketConnection}
|
|
*/
|
|
this.connection = null;
|
|
}
|
|
|
|
/**
|
|
* Sends a heartbeat on the available connection.
|
|
* @returns {void}
|
|
*/
|
|
heartbeat() {
|
|
if (!this.connection) return this.debug('No connection to heartbeat');
|
|
return this.connection.heartbeat();
|
|
}
|
|
|
|
/**
|
|
* Emits a debug event.
|
|
* @param {string} message Debug message
|
|
* @returns {void}
|
|
*/
|
|
debug(message) {
|
|
return this.client.emit(Events.DEBUG, `[ws] ${message}`);
|
|
}
|
|
|
|
/**
|
|
* Destroy the client.
|
|
* @returns {void} Whether or not destruction was successful
|
|
*/
|
|
destroy() {
|
|
if (!this.connection) {
|
|
this.debug('Attempted to destroy WebSocket but no connection exists!');
|
|
return false;
|
|
}
|
|
return this.connection.destroy();
|
|
}
|
|
|
|
/**
|
|
* Send a packet on the available WebSocket.
|
|
* @param {Object} packet Packet to send
|
|
* @returns {void}
|
|
*/
|
|
send(packet) {
|
|
if (!this.connection) {
|
|
this.debug('No connection to websocket');
|
|
return;
|
|
}
|
|
this.connection.send(packet);
|
|
}
|
|
|
|
/**
|
|
* Connects the client to a gateway.
|
|
* @param {string} gateway The gateway to connect to
|
|
* @returns {boolean}
|
|
*/
|
|
connect(gateway) {
|
|
if (!this.connection) {
|
|
this.connection = new WebSocketConnection(this, gateway);
|
|
return true;
|
|
}
|
|
switch (this.connection.status) {
|
|
case Status.IDLE:
|
|
case Status.DISCONNECTED:
|
|
this.connection.connect(gateway, 5500);
|
|
return true;
|
|
default:
|
|
this.debug(`Couldn't connect to ${gateway} as the websocket is at state ${this.connection.status}`);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = WebSocketManager;
|