rustcon-js
Version:
RustCON JS is a JavaScript library for interacting with Rust servers via WebSockets (Web RCON)
1 lines • 23.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/client/Client.ts","../src/structures/ServerInfo.ts","../src/utils/validators.ts","../src/managers/Server.ts","../src/structures/Player.ts","../src/managers/Players.ts","../src/structures/Message.ts"],"sourcesContent":["import { WebSocket } from \"unws\";\nimport { EventEmitter } from \"events\";\nimport ServerManager from \"../managers/Server\";\nimport PlayersManager from \"../managers/Players\";\nimport Message from \"../structures/Message\";\nimport ConnectionOptions from \"../types/ConnectionOptions\";\nimport { validateConnectionOptions } from \"../utils/validators\";\n\ninterface ClientEvents {\n \"connected\": () => void;\n \"message\": (message: Message) => void;\n \"error\": (error: any) => void;\n \"disconnected\": () => void;\n}\n\nexport default class Client extends EventEmitter {\n\n public ws: WebSocket | null;\n\n public server: ServerManager;\n\n public players: PlayersManager;\n\n private connectionOptions: ConnectionOptions;\n\n private pendingCommands: Map<number, Function>;\n\n constructor(options: ConnectionOptions) {\n\n super();\n\n const validationResult = validateConnectionOptions(options);\n\n if (validationResult) {\n\n throw new Error(`Invalid Connection Options: ${validationResult}`);\n\n }\n\n this.ws = null;\n\n this.server = new ServerManager(this);\n\n this.players = new PlayersManager(this);\n\n this.connectionOptions = options;\n\n this.pendingCommands = new Map<number, (value: Message | PromiseLike<Message>) => void>();\n\n }\n\n public on<K extends keyof ClientEvents>(e: K, listener: ClientEvents[K]): this {\n\n return super.on(e, listener);\n\n }\n\n /**\n * Connects to the server\n * @returns {void}\n */\n public connect(): void {\n\n this.ws = new WebSocket(`ws://${this.connectionOptions.ip}:${this.connectionOptions.port ?? 28016}/${this.connectionOptions.password}`);\n\n this.ws.onopen = this.onConnection.bind(this);\n\n this.ws.onmessage = (data) => this.onMessage(data.data);\n\n this.ws.onerror = this.onError.bind(this);\n\n this.ws.onclose = this.onClose.bind(this);\n\n }\n\n /**\n * Sends a command to the server\n * @param {string} command - The command to be sent\n * @returns {Promise<Message>}\n */\n public sendCommand(command: string): Promise<Message> {\n\n return new Promise((resolve, reject) => {\n\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\n const identifier = this.generateIdentifier();\n\n this.ws.send(JSON.stringify({\n\n Identifier: identifier,\n\n Message: command,\n\n Name: \"RCON\"\n\n }));\n\n this.pendingCommands.set(identifier, resolve);\n\n setTimeout(() => {\n\n if (this.pendingCommands.has(identifier)) {\n\n this.pendingCommands.delete(identifier);\n\n reject(\"Command Timed Out\");\n\n }\n\n }, 5000);\n\n } else {\n\n reject(\"Not connected to server\");\n\n }\n\n });\n\n }\n\n /**\n * Disconnects from the server\n * @returns {void}\n */\n public disconnect(): void {\n\n if (this.ws) {\n\n this.ws.close();\n\n } else {\n\n throw new Error(\"Not connected to server\");\n\n }\n\n }\n\n private onConnection() {\n\n this.emit(\"connected\");\n\n }\n\n private onMessage(data: string) {\n\n const message = new Message(JSON.parse(data));\n\n const pendingCommand = this.pendingCommands.get(message.identifier);\n\n if (pendingCommand) {\n\n pendingCommand(message);\n\n this.pendingCommands.delete(message.identifier);\n\n } else {\n\n this.emit(\"message\", message);\n\n }\n\n }\n\n private onError(error: any) {\n\n this.emit(\"error\", error);\n\n }\n\n private onClose() {\n\n this.ws = null;\n\n this.pendingCommands.clear();\n\n this.emit(\"disconnected\");\n\n }\n\n private generateIdentifier(): number {\n\n // Generates a random number between 10 and 1000\n const randomNumber = Math.floor(Math.random() * (1000 - 10 + 1)) + 10;\n\n if (this.pendingCommands.has(randomNumber)) {\n\n return this.generateIdentifier();\n\n }\n\n return randomNumber;\n\n }\n\n}\n","import { ServerInfo as ServerServerInfo } from \"../types/ServerResponses\";\n\nexport default class ServerInfo {\n\n /**\n * Server hostname\n * @type {string}\n */\n public hostname: string;\n\n /**\n * \n * @type {number}\n */\n public players: number;\n\n /**\n * \n * @type {number}\n */\n public maxPlayers: number;\n\n /**\n * \n * @type {number}\n */\n public queuedPlayers: number;\n\n /**\n * \n * @type {number}\n */\n public joiningPlayers: number;\n\n /**\n * Server entity count\n * @type {number}\n */\n public entityCount: number;\n\n /**\n * Server game time\n * @type {string}\n */\n public gameTime: string;\n\n /**\n * Server uptime (seconds)\n * @type {number}\n */\n public uptime: number;\n\n /**\n * Server map type\n * @type {string}\n */\n public map: string;\n\n /**\n * Server framerate\n * @type {number}\n */\n public framerate: number;\n\n /**\n * Server memory usage\n * @type {number}\n */\n public memory: number;\n\n /**\n * System memory usage\n * @type {number}\n */\n public memoryUsageSystem: number;\n\n /**\n * \n * @type {number}\n */\n public collections: number;\n\n /**\n * Server network in (bytes)\n * @type {number}\n */\n public networkIn: number;\n\n /**\n * Server network out (bytes)\n * @type {number}\n */\n public networkOut: number;\n\n /**\n * Is the server restarting\n * @type {boolean}\n */\n public restarting: boolean;\n\n /**\n * Server save created time\n * @type {string}\n */\n public saveCreatedTime: string;\n\n /**\n * Server version\n * @type {number}\n */\n public version: number;\n \n /**\n * Server protocol\n * @type {string}\n */\n public protocol: string;\n \n constructor(serverInfo: ServerServerInfo) {\n\n this.hostname = serverInfo.Hostname;\n\n this.players = serverInfo.Players;\n\n this.maxPlayers = serverInfo.MaxPlayers;\n\n this.queuedPlayers = serverInfo.Queued;\n\n this.joiningPlayers = serverInfo.Joining;\n\n this.entityCount = serverInfo.EntityCount;\n\n this.gameTime = serverInfo.GameTime;\n\n this.uptime = serverInfo.Uptime;\n\n this.map = serverInfo.Map;\n\n this.framerate = serverInfo.Framerate;\n\n this.memory = serverInfo.Memory;\n\n this.memoryUsageSystem = serverInfo.MemoryUsageSystem;\n\n this.collections = serverInfo.Collections;\n\n this.networkIn = serverInfo.NetworkIn;\n\n this.networkOut = serverInfo.NetworkOut;\n\n this.restarting = serverInfo.Restarting;\n\n this.saveCreatedTime = serverInfo.SaveCreatedTime;\n\n this.version = serverInfo.Version;\n\n this.protocol = serverInfo.Protocol;\n\n }\n\n /**\n * Check if the server is full\n * @returns {boolean}\n */\n public isFull(): boolean {\n\n return this.players >= this.maxPlayers;\n\n }\n\n /**\n * Check if the server has a queue\n * @returns {boolean}\n */\n public hasQueue(): boolean {\n\n return this.queuedPlayers > 0;\n\n }\n\n /**\n * Check if the server has players joining\n * @returns {boolean}\n */\n public hasPlayersJoining(): boolean {\n\n return this.joiningPlayers > 0;\n\n }\n\n}\n","import ConnectionOptions from \"../types/ConnectionOptions\";\n\nexport function validateConnectionOptions(options: ConnectionOptions): string | null {\n\n if (!options.ip) {\n\n return \"IP is required\";\n\n }\n\n if (!/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(options.ip)) {\n\n return \"Invalid IP Address\";\n\n }\n\n if (options.port && (isNaN(options.port) || options.port < 1 || options.port > 65535)) {\n\n return \"Invalid Port\";\n\n }\n\n if (!options.password || options.password === \"\") {\n\n return \"Password is required\";\n\n }\n\n return null;\n\n}\n\nexport function isValidSteamId(steamId: string | number): boolean {\n\n if (!steamId) {\n\n return false;\n\n }\n\n if (typeof steamId === \"string\") {\n\n steamId = Number(steamId);\n\n }\n\n if (isNaN(steamId)) {\n\n return false;\n\n }\n\n return steamId > 76561190000000000;\n\n}\n","import ServerInfo from \"../structures/ServerInfo\";\nimport { isValidSteamId } from \"../utils/validators\";\nimport type Client from \"../client/Client\";\n\nexport default class ServerManager {\n\n private client: Client;\n\n constructor(client: Client) {\n\n this.client = client;\n\n }\n\n /**\n * Get the server info\n * @returns {Promise<ServerInfo>}\n */\n public async getInfo(): Promise<ServerInfo> {\n\n const response = await this.client.sendCommand(\"serverinfo\");\n\n const serverInfo = new ServerInfo(JSON.parse(response.content));\n\n return serverInfo;\n\n }\n\n /**\n * Save the server\n * @returns {Promise<void>}\n */\n public async save() {\n\n await this.client.sendCommand(\"save\");\n\n }\n\n /**\n * Save the server configuration\n * @returns {Promise<void>}\n */\n public async writeCFG() {\n\n await this.client.sendCommand(\"writecfg\");\n\n }\n\n /**\n * Restart the server\n * @param {string} reason\n * @param {number} duration\n * @returns {Promise<void>}\n */\n public async restart(reason: string, duration: number) {\n\n await this.client.sendCommand(`restart ${reason} ${duration}`);\n\n }\n\n /**\n * Shutdown the server\n * @param {string} reason\n * @param {number} duration\n * @returns {Promise<void>}\n */\n public async shutdown(reason: string, duration: number) {\n\n await this.client.sendCommand(`shutdown ${reason} ${duration}`);\n\n }\n\n /**\n * Add a moderator to the server\n * @param {(number|string)} steamId\n * @param {string} name\n * @param {string} reason\n * @param {boolean} save\n * @returns {Promise<void>}\n */\n public async addModerator(steamId: string, name?: string, reason?: string, save: boolean = true) {\n\n if (!isValidSteamId(steamId)) {\n\n throw new Error(\"Invalid Steam ID\");\n\n }\n\n await this.client.sendCommand(`moderatorid ${steamId} ${name} ${reason}`);\n\n if (save) {\n\n await this.writeCFG();\n\n }\n\n }\n\n /**\n * Add an owner to the server\n * @param {(number|string)} steamId\n * @param {string} name\n * @param {string} reason\n * @param {boolean} save\n * @returns {Promise<void>}\n */\n public async addOwner(steamId: string, name?: string, reason?: string, save: boolean = true) {\n\n if (!isValidSteamId(steamId)) {\n\n throw new Error(\"Invalid Steam ID\");\n\n }\n\n await this.client.sendCommand(`ownerid ${steamId} ${name} ${reason}`);\n\n if (save) {\n\n await this.writeCFG();\n\n }\n\n }\n\n}\n","import PlayersManager from \"../managers/Players\";\nimport type { PlayerInfo } from \"../types/ServerResponses\";\n\nexport default class Player {\n\n /**\n * Player name\n * @type {string}\n */\n public name: string;\n\n /**\n * Player Steam ID\n * @type {string}\n */\n public steamId: string;\n\n /**\n * Player IP address\n * @type {string}\n */\n public ipAddress: string;\n\n /**\n * Player ping\n * @type {number}\n */\n public ping: number;\n\n /**\n * Player health\n * @type {number}\n */\n public health: number;\n\n /**\n * Player connected time (seconds)\n * @type {number}\n */\n public connectedTime: number;\n\n private playersManager: PlayersManager;\n\n constructor(player: PlayerInfo, playersManager: PlayersManager) {\n\n this.name = player.DisplayName;\n\n this.steamId = player.SteamID;\n\n this.ipAddress = player.Address;\n\n this.ping = player.Ping;\n\n this.health = player.Health;\n\n this.connectedTime = player.ConnectedSeconds;\n\n this.playersManager = playersManager;\n\n }\n\n /**\n * Kick player\n * @param {string} reason\n * @example\n * player.kick();\n * player.kick(\"You're a bad player!\");\n */\n public async kick(reason?: string) {\n\n await this.playersManager.kickPlayer(this.steamId, reason);\n\n }\n\n /**\n * Ban player\n * @param {string} reason\n * @example\n * player.ban();\n * player.ban(\"You're a bad player!\");\n */\n public async ban(reason?: string) {\n\n await this.playersManager.banPlayer(this.steamId, reason);\n\n }\n\n}\n","import Player from \"../structures/Player\";\nimport { isValidSteamId } from \"../utils/validators\";\nimport type Client from \"../client/Client\";\nimport type { PlayerInfo } from \"../types/ServerResponses\";\n\nexport default class PlayersManager {\n\n private client: Client;\n\n constructor(client: Client) {\n\n this.client = client;\n\n }\n\n /**\n * Get all connected players\n * @returns {Promise<Player[]>}\n */\n public async getAll(): Promise<Player[]> {\n\n const response = await this.client.sendCommand(\"playerlist\");\n\n const playerList = JSON.parse(response.content) as PlayerInfo[];\n\n return playerList.map((player) => new Player(player, this));\n\n }\n\n /**\n * Get a player by their Steam ID\n * @param {(number|string)} steamId\n * @returns {Promise<(Player|null)>}\n */\n public async get(steamId: number | string): Promise<Player | null> {\n\n if (!isValidSteamId(steamId)) {\n\n throw new Error(\"Invalid Steam ID\");\n\n }\n\n const allPlayers = await this.getAll();\n\n return allPlayers.find((player) => player.steamId === steamId) || null;\n\n }\n\n /**\n * Kick a player\n * @param {(number|string)} steamId\n * @param {string} reason\n * @returns {Promise<void>}\n */\n public async kickPlayer(steamId: number | string, reason?: string): Promise<void> {\n\n if (!isValidSteamId(steamId)) {\n\n throw new Error(\"Invalid Steam ID\");\n\n }\n\n await this.client.sendCommand(`kick ${steamId} ${reason}`);\n\n }\n\n /**\n * Ban a player\n * @param {(number|string)} steamId\n * @param {string} reason\n * @returns {Promise<void>}\n */\n public async banPlayer(steamId: number | string, reason?: string): Promise<void> {\n\n if (!isValidSteamId(steamId)) {\n\n throw new Error(\"Invalid Steam ID\");\n\n }\n\n await this.client.sendCommand(`ban ${steamId} ${reason}`);\n\n }\n\n /**\n * Unban a player\n * @param {(number|string)} steamId\n * @returns {Promise<void>}\n */\n public async unbanPlayer(steamId: number | string): Promise<void> {\n\n if (!isValidSteamId(steamId)) {\n\n throw new Error(\"Invalid Steam ID\");\n\n }\n\n await this.client.sendCommand(`unban ${steamId}`);\n\n }\n\n}\n","import { GenericMessage } from \"../types/ServerResponses\";\n\nexport default class Message {\n\n public content: string;\n\n public identifier: number;\n\n public type: string;\n\n public stacktrace: string;\n\n constructor(messageData: GenericMessage) {\n\n this.content = messageData.Message;\n\n this.identifier = messageData.Identifier;\n\n this.type = messageData.Type;\n\n this.stacktrace = messageData.Stacktrace;\n\n }\n\n}\n"],"mappings":"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","names":["ServerInfo","ServerInfo","Player","Player","Message","Message"]}