{"version":3,"sources":["../src/connectors/libs/index.ts","../src/Constants.ts","../package.json","../src/Utils.ts","../src/connectors/Connector.ts","../src/connectors/libs/DiscordJS.ts","../src/connectors/libs/Eris.ts","../src/connectors/libs/OceanicJS.ts","../src/guild/Connection.ts","../src/guild/Player.ts","../src/node/Node.ts","../src/node/Rest.ts","../src/Shoukaku.ts"],"sourcesContent":["export * from './DiscordJS';\nexport * from './Eris';\nexport * from './OceanicJS';\n","import Info from '../package.json';\nimport { NodeOption, ShoukakuOptions } from './Shoukaku';\n\nexport enum State {\n    CONNECTING,\n    NEARLY,\n    CONNECTED,\n    RECONNECTING,\n    DISCONNECTING,\n    DISCONNECTED\n}\n\nexport enum VoiceState {\n    SESSION_READY,\n    SESSION_ID_MISSING,\n    SESSION_ENDPOINT_MISSING,\n    SESSION_FAILED_UPDATE\n}\n\nexport enum OpCodes {\n    PLAYER_UPDATE = 'playerUpdate',\n    STATS = 'stats',\n    EVENT = 'event',\n    READY = 'ready'\n}\n\nexport enum Versions {\n    REST_VERSION = 4,\n    WEBSOCKET_VERSION = 4\n}\n\nexport const ShoukakuDefaults: Required<ShoukakuOptions> = {\n    resume: false,\n    resumeTimeout: 30,\n    resumeByLibrary: false,\n    reconnectTries: 3,\n    reconnectInterval: 5,\n    restTimeout: 60,\n    moveOnDisconnect: false,\n    userAgent: `${Info.name}bot/${Info.version} (${Info.repository.url})`,\n    structures: {},\n    voiceConnectionTimeout: 15,\n    nodeResolver: (nodes) => [ ...nodes.values() ]\n        .filter(node => node.state === State.CONNECTED)\n        .sort((a, b) => a.penalties - b.penalties)\n        .shift()\n};\n\nexport const NodeDefaults: NodeOption = {\n    name: 'Default',\n    url: '',\n    auth: '',\n    secure: false,\n    group: undefined\n};\n","{\n  \"name\": \"shoukaku\",\n  \"version\": \"4.0.1\",\n  \"description\": \"A stable and updated wrapper around Lavalink\",\n  \"main\": \"dist/index.js\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"dist/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.mjs\",\n      \"require\": \"./dist/index.js\"\n    }\n  },\n  \"scripts\": {\n    \"build\": \"npm run build:ts && npm run build:docs\",\n    \"build:ts\": \"tsup --config tsup-config.json\",\n    \"build:docs\": \"typedoc --theme default --readme README.md --out docs/ --entryPointStrategy expand src/.\",\n    \"lint\": \"eslint --fix --ext .ts\",\n    \"prepare\": \"npm run build:ts\"\n  },\n  \"keywords\": [\n    \"bot\",\n    \"music\",\n    \"lavalink\",\n    \"api\",\n    \"discord\",\n    \"lavalink.js\",\n    \"discord.js\",\n    \"lavalink-api\",\n    \"weeb-library\"\n  ],\n  \"engines\": {\n    \"node\": \">=18.0.0\",\n    \"npm\": \">=7.0.0\"\n  },\n  \"author\": \"Saya\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/shipgirlproject/Shoukaku.git\"\n  },\n  \"dependencies\": {\n    \"ws\": \"^8.14.2\"\n  },\n  \"devDependencies\": {\n    \"@augu/eslint-config\": \"^5.0.0\",\n    \"@types/node\": \"^20.10.5\",\n    \"@types/node-fetch\": \"^2.6.9\",\n    \"@types/ws\": \"^8.5.10\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.15.0\",\n    \"@typescript-eslint/parser\": \"^6.15.0\",\n    \"eslint\": \"^8.56.0\",\n    \"tsup\": \"^8.0.1\",\n    \"typedoc\": \"^0.25.4\",\n    \"typescript\": \"^5.3.3\"\n  }\n}\n","export type Constructor<T> = new (...args: any[]) => T;\n\n/**\n * Merge the default options to user input\n * @param def Default options\n * @param given User input\n * @returns Merged options\n */\nexport function mergeDefault<T extends { [key: string]: any }>(def: T, given: T): Required<T> {\n    if (!given) return def as Required<T>;\n    const defaultKeys: (keyof T)[] = Object.keys(def);\n    for (const key in given) {\n        if (defaultKeys.includes(key)) continue;\n        delete given[key];\n    }\n    for (const key of defaultKeys) {\n        if (def[key] === null || (typeof def[key] === 'string' && def[key].length === 0)) {\n            if (!given[key]) throw new Error(`${String(key)} was not found from the given options.`);\n        }\n        if (given[key] === null || given[key] === undefined) given[key] = def[key];\n    }\n    return given as Required<T>;\n}\n\n/**\n * Wait for a specific amount of time (timeout)\n * @param ms Time to wait in milliseconds\n * @returns A promise that resolves in x seconds\n */\nexport function wait(ms: number): Promise<void> {\n    return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import { NodeOption, Shoukaku } from '../Shoukaku';\nimport { NodeDefaults } from '../Constants';\nimport { mergeDefault } from '../Utils';\n\nexport interface ConnectorMethods {\n    sendPacket: any;\n    getId: any;\n}\n\nexport const AllowedPackets = [ 'VOICE_STATE_UPDATE', 'VOICE_SERVER_UPDATE' ];\n\nexport abstract class Connector {\n    protected readonly client: any;\n    protected manager: Shoukaku|null;\n    constructor(client: any) {\n        this.client = client;\n        this.manager = null;\n    }\n\n    public set(manager: Shoukaku): Connector {\n        this.manager = manager;\n        return this;\n    }\n\n    protected ready(nodes: NodeOption[]): void {\n        this.manager!.id = this.getId();\n        for (const node of nodes) this.manager!.addNode(mergeDefault(NodeDefaults, node));\n    }\n\n    protected raw(packet: any): void {\n        if (!AllowedPackets.includes(packet.t)) return;\n        const guildId = packet.d.guild_id;\n        const connection = this.manager!.connections.get(guildId);\n        if (!connection) return;\n        if (packet.t === 'VOICE_SERVER_UPDATE') return connection.setServerUpdate(packet.d);\n        const userId = packet.d.user_id;\n        if (userId !== this.manager!.id) return;\n        connection.setStateUpdate(packet.d);\n    }\n\n    abstract getId(): string;\n\n    abstract sendPacket(shardId: number, payload: any, important: boolean): void;\n\n    abstract listen(nodes: NodeOption[]): void;\n}\n","import { Connector } from '../Connector';\nimport { NodeOption } from '../../Shoukaku';\n\nexport class DiscordJS extends Connector {\n    // sendPacket is where your library send packets to Discord Gateway\n    public sendPacket(shardId: number, payload: any, important: boolean): void {\n        return this.client.ws.shards.get(shardId)?.send(payload, important);\n    }\n    // getId is a getter where the lib stores the client user (the one logged in as a bot) id\n    public getId(): string {\n        return this.client.user.id;\n    }\n    // Listen attaches the event listener to the library you are using\n    public listen(nodes: NodeOption[]): void {\n        // Only attach to ready event once, refer to your library for its ready event\n        this.client.once('ready', () => this.ready(nodes));\n        // Attach to the raw websocket event, this event must be 1:1 on spec with dapi (most libs implement this)\n        this.client.on('raw', (packet: any) => this.raw(packet));\n    }\n}\n","import { Connector } from '../Connector';\nimport { NodeOption } from '../../Shoukaku';\n\nexport class Eris extends Connector {\n    // sendPacket is where your library send packets to Discord Gateway\n    public sendPacket(shardId: number, payload: any, important: boolean): void {\n        return this.client.shards.get(shardId)?.sendWS(payload.op, payload.d, important);\n    }\n    // getId is a getter where the lib stores the client user (the one logged in as a bot) id\n    public getId(): string {\n        return this.client.user.id;\n    }\n    // Listen attaches the event listener to the library you are using\n    public listen(nodes: NodeOption[]): void {\n        // Only attach to ready event once, refer to your library for its ready event\n        this.client.once('ready', () => this.ready(nodes));\n        // Attach to the raw websocket event, this event must be 1:1 on spec with dapi (most libs implement this)\n        this.client.on('rawWS', (packet: any) => this.raw(packet));\n    }\n}\n","import { Connector } from '../Connector';\nimport { NodeOption } from '../../Shoukaku';\n\nexport class OceanicJS extends Connector {\n    // sendPacket is where your library send packets to Discord Gateway\n    public sendPacket(shardId: number, payload: any, important: boolean): void {\n        return this.client.shards.get(shardId)?.send(payload.op, payload.d, important);\n    }\n    // getId is a getter where the lib stores the client user (the one logged in as a bot) id\n    public getId(): string {\n        return this.client.user.id;\n    }\n    // Listen attaches the event listener to the library you are using\n    public listen(nodes: NodeOption[]): void {\n        // Only attach to ready event once, refer to your library for its ready event\n        this.client.once('ready', () => this.ready(nodes));\n        // Attach to the raw websocket event, this event must be 1:1 on spec with dapi (most libs implement this)\n        this.client.on('packet', (packet: any) => this.raw(packet));\n    }\n}\n","import { EventEmitter, once } from 'events';\nimport { State, VoiceState } from '../Constants';\nimport { Shoukaku, VoiceChannelOptions } from '../Shoukaku.js';\n\n/**\n * Represents the partial payload from a stateUpdate event\n */\nexport interface StateUpdatePartial {\n    channel_id?: string;\n    session_id?: string;\n    self_deaf: boolean;\n    self_mute: boolean;\n}\n\n/**\n * Represents the payload from a serverUpdate event\n */\nexport interface ServerUpdate {\n    token: string;\n    guild_id: string;\n    endpoint: string;\n}\n\n/**\n * Represents a connection to a Discord voice channel\n */\nexport class Connection extends EventEmitter {\n    /**\n     * The manager where this connection is on\n     */\n    public manager: Shoukaku;\n    /**\n     * ID of Guild that contains the connected voice channel\n     */\n    public guildId: string;\n    /**\n     * ID of the connected voice channel\n     */\n    public channelId: string|null;\n\n    /**\n     * ID of the Shard that contains the guild that contains the connected voice channel\n     */\n    public shardId: number;\n    /**\n     * Mute status in connected voice channel\n     */\n    public muted: boolean;\n    /**\n     * Deafen status in connected voice channel\n     */\n    public deafened: boolean;\n    /**\n     * ID of the last channelId connected to\n     */\n    public lastChannelId: string|null;\n    /**\n     * ID of current session\n     */\n    public sessionId: string|null;\n    /**\n     * Region of connected voice channel\n     */\n    public region: string|null;\n    /**\n     * Last region of the connected voice channel\n     */\n    public lastRegion: string|null;\n    /**\n     * Cached serverUpdate event from Lavalink\n     */\n    public serverUpdate: ServerUpdate|null;\n    /**\n     * Connection state\n     */\n    public state: State;\n    /**\n     * @param manager The manager of this connection\n     * @param options The options to pass in connection creation\n     * @param options.guildId GuildId in which voice channel to connect to is located\n     * @param options.shardId ShardId in which the guild exists\n     * @param options.channelId ChannelId of voice channel to connect to\n     * @param options.deaf Optional boolean value to specify whether to deafen the current bot user\n     * @param options.mute Optional boolean value to specify whether to mute the current bot user\n     * @param options.getNode Optional move function for moving players around\n     */\n    constructor(manager: Shoukaku, options: VoiceChannelOptions) {\n        super();\n        this.manager = manager;\n        this.guildId = options.guildId;\n        this.channelId = options.channelId;\n        this.shardId = options.shardId;\n        this.muted = options.mute ?? false;\n        this.deafened = options.deaf ?? false;\n        this.lastChannelId = null;\n        this.sessionId = null;\n        this.region = null;\n        this.lastRegion = null;\n        this.serverUpdate = null;\n        this.state = State.DISCONNECTED;\n    }\n\n    /**\n     * Set the deafen status for the current bot user\n     * @param deaf Boolean value to indicate whether to deafen or undeafen\n     * @defaultValue false\n     */\n    public setDeaf(deaf = false): void {\n        this.deafened = deaf;\n        this.sendVoiceUpdate();\n    }\n\n    /**\n     * Set the mute status for the current bot user\n     * @param mute Boolean value to indicate whether to mute or unmute\n     * @defaultValue false\n     */\n    public setMute(mute = false): void {\n        this.muted = mute;\n        this.sendVoiceUpdate();\n    }\n\n    /**\n     * Disconnect the current bot user from the connected voice channel\n     * @internal\n     */\n    public disconnect(): void {\n        if (this.state === State.DISCONNECTED) return;\n        this.channelId = null;\n        this.deafened = false;\n        this.muted = false;\n        this.removeAllListeners();\n        this.sendVoiceUpdate();\n        this.state = State.DISCONNECTED;\n        this.debug(`[Voice] -> [Node] & [Discord] : Connection Destroyed | Guild: ${this.guildId}`);\n    }\n\n    /**\n     * Connect the current bot user to a voice channel\n     * @internal\n     */\n    public async connect(): Promise<void> {\n        if (this.state === State.CONNECTING || this.state === State.CONNECTED) return;\n\n        this.state = State.CONNECTING;\n        this.sendVoiceUpdate();\n        this.debug(`[Voice] -> [Discord] : Requesting Connection | Guild: ${this.guildId}`);\n\n        const controller = new AbortController();\n        const timeout = setTimeout(() => controller.abort(), this.manager.options.voiceConnectionTimeout * 1000);\n\n        try {\n            const [ status ] = await once(this, 'connectionUpdate', { signal: controller.signal });\n            if (status !== VoiceState.SESSION_READY) {\n                switch(status) {\n                    case VoiceState.SESSION_ID_MISSING: throw new Error('The voice connection is not established due to missing session id');\n                    case VoiceState.SESSION_ENDPOINT_MISSING: throw new Error('The voice connection is not established due to missing connection endpoint');\n                }\n            }\n            this.state = State.CONNECTED;\n        } catch (error: any) {\n            this.debug(`[Voice] </- [Discord] : Request Connection Failed | Guild: ${this.guildId}`);\n            if (error.name === 'AbortError')\n                throw new Error(`The voice connection is not established in ${this.manager.options.voiceConnectionTimeout} seconds`);\n            throw error;\n        } finally {\n            clearTimeout(timeout);\n        }\n    }\n\n    /**\n     * Update Session ID, Channel ID, Deafen status and Mute status of this instance\n     *\n     * @param options.session_id ID of this session\n     * @param options.channel_id ID of currently connected voice channel\n     * @param options.self_deaf Boolean that indicates if the current bot user is deafened or not\n     * @param options.self_mute Boolean that indicates if the current bot user is muted or not\n     * @internal\n     */\n    public setStateUpdate({ session_id, channel_id, self_deaf, self_mute }: StateUpdatePartial): void {\n        this.lastChannelId = this.channelId?.repeat(1) || null;\n        this.channelId = channel_id || null;\n\n        if (this.channelId && this.lastChannelId !== this.channelId) {\n            this.debug(`[Voice] <- [Discord] : Channel Moved | Old Channel: ${this.channelId} Guild: ${this.guildId}`);\n        }\n\n        if (!this.channelId) {\n            this.state = State.DISCONNECTED;\n            this.debug(`[Voice] <- [Discord] : Channel Disconnected | Guild: ${this.guildId}`);\n        }\n\n        this.deafened = self_deaf;\n        this.muted = self_mute;\n        this.sessionId = session_id || null;\n        this.debug(`[Voice] <- [Discord] : State Update Received | Channel: ${this.channelId} Session ID: ${session_id} Guild: ${this.guildId}`);\n    }\n\n    /**\n     * Sets the server update data for this connection\n     * @internal\n     */\n    public setServerUpdate(data: ServerUpdate): void {\n        if (!data.endpoint) {\n            this.emit('connectionUpdate', VoiceState.SESSION_ENDPOINT_MISSING);\n            return;\n        }\n        if (!this.sessionId) {\n            this.emit('connectionUpdate', VoiceState.SESSION_ID_MISSING);\n            return;\n        }\n\n        this.lastRegion = this.region?.repeat(1) || null;\n        this.region = data.endpoint.split('.').shift()?.replace(/[0-9]/g, '') || null;\n\n        if (this.region && this.lastRegion !== this.region) {\n            this.debug(`[Voice] <- [Discord] : Voice Region Moved | Old Region: ${this.lastRegion} New Region: ${this.region} Guild: ${this.guildId}`);\n        }\n\n        this.serverUpdate = data;\n        this.emit('connectionUpdate', VoiceState.SESSION_READY);\n        this.debug(`[Voice] <- [Discord] : Server Update Received | Server: ${this.region} Guild: ${this.guildId}`);\n    }\n\n    /**\n     * Send voice data to discord\n     * @internal\n     */\n    private sendVoiceUpdate() {\n        this.send({ guild_id: this.guildId, channel_id: this.channelId, self_deaf: this.deafened, self_mute: this.muted });\n    }\n\n    /**\n     * Send data to Discord\n     * @param data The data to send\n     * @internal\n     */\n    private send(data: any): void {\n        this.manager.connector.sendPacket(this.shardId, { op: 4, d: data }, false);\n    }\n\n    /**\n     * Emits a debug log\n     * @internal\n     */\n    private debug(message: string): void {\n        this.manager.emit('debug', this.constructor.name, message);\n    }\n}\n","import { EventEmitter } from 'events';\nimport { Node } from '../node/Node';\nimport { Connection } from './Connection';\nimport { OpCodes, State, ShoukakuDefaults } from '../Constants';\nimport { Exception, Track, UpdatePlayerInfo, UpdatePlayerOptions } from '../node/Rest';\n\nexport type TrackEndReason = 'finished' | 'loadFailed' | 'stopped' | 'replaced' | 'cleanup';\nexport type PlayerEventType = 'TrackStartEvent' | 'TrackEndEvent' | 'TrackExceptionEvent' | 'TrackStuckEvent' | 'WebSocketClosedEvent';\n\n/**\n * Options when playing a new track\n */\nexport interface PlayOptions {\n    track: string;\n    options?: {\n        noReplace?: boolean;\n        pause?: boolean;\n        startTime?: number;\n        endTime?: number;\n        volume?: number;\n    }\n}\n\nexport interface ResumeOptions {\n    noReplace?: boolean;\n    pause?: boolean;\n    startTime?: number;\n    endTime?: number;\n}\n\nexport interface Band {\n    band: number;\n    gain: number;\n}\n\nexport interface KaraokeSettings {\n    level?: number;\n    monoLevel?: number;\n    filterBand?: number;\n    filterWidth?: number;\n}\n\nexport interface TimescaleSettings {\n    speed?: number;\n    pitch?: number;\n    rate?: number;\n}\n\nexport interface FreqSettings {\n    frequency?: number;\n    depth?: number;\n}\n\nexport interface RotationSettings {\n    rotationHz?: number;\n}\n\nexport interface DistortionSettings {\n    sinOffset?: number;\n    sinScale?: number;\n    cosOffset?: number;\n    cosScale?: number;\n    tanOffset?: number;\n    tanScale?: number;\n    offset?: number;\n    scale?: number;\n}\n\nexport interface ChannelMixSettings {\n    leftToLeft?: number;\n    leftToRight?: number;\n    rightToLeft?: number;\n    rightToRight?: number;\n}\n\nexport interface LowPassSettings {\n    smoothing?: number\n}\n\nexport interface PlayerEvent {\n    op: OpCodes.EVENT;\n    type: PlayerEventType;\n    guildId: string;\n}\n\nexport interface TrackStartEvent extends PlayerEvent {\n    type: 'TrackStartEvent';\n    track: Track;\n}\n\nexport interface TrackEndEvent extends PlayerEvent {\n    type: 'TrackEndEvent';\n    track: Track;\n    reason: TrackEndReason;\n}\n\nexport interface TrackStuckEvent extends PlayerEvent {\n    type: 'TrackStuckEvent';\n    track: Track;\n    thresholdMs: number;\n}\n\nexport interface TrackExceptionEvent extends PlayerEvent {\n    type: 'TrackExceptionEvent';\n    exception: Exception;\n}\n\nexport interface TrackStuckEvent extends PlayerEvent {\n    type: 'TrackStuckEvent';\n    thresholdMs: number;\n}\n\nexport interface WebSocketClosedEvent extends PlayerEvent {\n    type: 'WebSocketClosedEvent';\n    code: number;\n    byRemote: boolean;\n    reason: string;\n}\n\nexport interface PlayerUpdate {\n    op: OpCodes.PLAYER_UPDATE;\n    state: {\n      connected: boolean;\n      position?: number;\n      time: number;\n    };\n    guildId: string;\n}\n\nexport interface FilterOptions {\n    volume?: number;\n    equalizer?: Band[];\n    karaoke?: KaraokeSettings|null;\n    timescale?: TimescaleSettings|null;\n    tremolo?: FreqSettings|null;\n    vibrato?: FreqSettings|null;\n    rotation?: RotationSettings|null;\n    distortion?: DistortionSettings|null;\n    channelMix?: ChannelMixSettings|null;\n    lowPass?: LowPassSettings|null;\n}\n\nexport declare interface Player {\n    /**\n     * Emitted when the current playing track ends\n     * @eventProperty\n     */\n    on(event: 'end', listener: (reason: TrackEndEvent) => void): this;\n    /**\n     * Emitted when the current playing track gets stuck due to an error\n     * @eventProperty\n     */\n    on(event: 'stuck', listener: (data: TrackStuckEvent) => void): this;\n    /**\n     * Emitted when the current websocket connection is closed\n     * @eventProperty\n     */\n    on(event: 'closed', listener: (reason: WebSocketClosedEvent) => void): this;\n    /**\n     * Emitted when a new track starts\n     * @eventProperty\n     */\n    on(event: 'start', listener: (data: TrackStartEvent) => void): this;\n    /**\n     * Emitted when there is an error caused by the current playing track\n     * @eventProperty\n     */\n    on(event: 'exception', listener: (reason: TrackExceptionEvent) => void): this;\n    /**\n     * Emitted when the library manages to resume the player\n     * @eventProperty\n     */\n    on(event: 'resumed', listener: (player: Player) => void): this;\n    /**\n     * Emitted when a playerUpdate even is received from Lavalink\n     * @eventProperty\n     */\n    on(event: 'update', listener: (data: PlayerUpdate) => void): this;\n    once(event: 'end', listener: (reason: TrackEndEvent) => void): this;\n    once(event: 'stuck', listener: (data: TrackStuckEvent) => void): this;\n    once(event: 'closed', listener: (reason: WebSocketClosedEvent) => void): this;\n    once(event: 'start', listener: (data: TrackStartEvent) => void): this;\n    once(event: 'exception', listener: (reason: TrackExceptionEvent) => void): this;\n    once(event: 'resumed', listener: (player: Player) => void): this;\n    once(event: 'update', listener: (data: PlayerUpdate) => void): this;\n    off(event: 'end', listener: (reason: TrackEndEvent) => void): this;\n    off(event: 'stuck', listener: (data: TrackStuckEvent) => void): this;\n    off(event: 'closed', listener: (reason: WebSocketClosedEvent) => void): this;\n    off(event: 'start', listener: (data: TrackStartEvent) => void): this;\n    off(event: 'exception', listener: (reason: TrackExceptionEvent) => void): this;\n    off(event: 'resumed', listener: (player: Player) => void): this;\n    off(event: 'update', listener: (data: PlayerUpdate) => void): this;\n}\n\n/**\n * Wrapper object around Lavalink\n */\nexport class Player extends EventEmitter {\n    /**\n     * GuildId of this player\n     */\n    public readonly guildId: string;\n    /**\n     * Lavalink node this player is connected to\n     */\n    public node: Node;\n    /**\n     * ID of current track\n     */\n    public track: string|null;\n    /**\n     * Global volume of the player\n     */\n    public volume: number;\n    /**\n     * Pause status in current player\n     */\n    public paused: boolean;\n    /**\n     * Ping represents the number of milliseconds between heartbeat and ack. Could be `-1` if not connected\n     */\n    public ping: number;\n    /**\n     * Position in ms of current track\n     */\n    public position: number;\n    /**\n     * Filters on current track\n     */\n    public filters: FilterOptions;\n    /**\n     * @param node An instance of Node (Lavalink API wrapper)\n     * @param connection An instance of connection class\n     */\n    constructor(guildId: string, node: Node) {\n        super();\n        this.guildId = guildId;\n        this.node = node;\n        this.track = null;\n        this.volume = 100;\n        this.paused = false;\n        this.position = 0;\n        this.ping = 0;\n        this.filters = {};\n    }\n\n    public get data(): UpdatePlayerInfo {\n        const connection = this.node.manager.connections.get(this.guildId)!;\n        return {\n            guildId: this.guildId,\n            playerOptions: {\n                encodedTrack: this.track,\n                position: this.position,\n                paused: this.paused,\n                filters: this.filters,\n                voice: {\n                    token: connection.serverUpdate!.token,\n                    endpoint: connection.serverUpdate!.endpoint,\n                    sessionId: connection.sessionId!\n                },\n                volume: this.volume\n            }\n        };\n    }\n\n    /**\n     * Move player to another node\n     * @param name? Name of node to move to, or the default ideal node\n     * @returns true if the player was moved, false if not\n     */\n    public async move(name?: string): Promise<boolean> {\n        const connection = this.node.manager.connections.get(this.guildId);\n        const node = this.node.manager.nodes.get(name!) || this.node.manager.options.nodeResolver(this.node.manager.nodes, connection);\n        if (!node && ![ ...this.node.manager.nodes.values() ].some(node => node.state === State.CONNECTED))\n            throw new Error('No available nodes to move to');\n        if (!node || node.name === this.node.name || node.state !== State.CONNECTED) return false;\n        let lastNode = this.node.manager.nodes.get(this.node.name);\n        if (!lastNode || lastNode.state !== State.CONNECTED)\n            lastNode = ShoukakuDefaults.nodeResolver(this.node.manager.nodes, connection);\n        await this.destroy();\n        try {\n            this.node = node;\n            await this.resume();\n            return true;\n        } catch (error) {\n            this.node = lastNode!;\n            await this.resume();\n            return false;\n        }\n    }\n\n    /**\n     * Destroys the player in remote lavalink side\n     */\n    public async destroy(): Promise<void> {\n        await this.node.rest.destroyPlayer(this.guildId);\n    }\n\n    /**\n     * Play a new track\n     * @param playable Options for playing this track\n     */\n    public async playTrack(playable: PlayOptions): Promise<void> {\n        const playerOptions: UpdatePlayerOptions = {\n            encodedTrack: playable.track\n        };\n        if (playable.options) {\n            const { pause, startTime, endTime, volume } = playable.options;\n            if (pause) playerOptions.paused = pause;\n            if (startTime) playerOptions.position = startTime;\n            if (endTime) playerOptions.endTime = endTime;\n            if (volume) playerOptions.volume = volume;\n        }\n        this.track = playable.track;\n        if (playerOptions.paused) this.paused = playerOptions.paused;\n        if (playerOptions.position) this.position = playerOptions.position;\n        if (playerOptions.volume) this.volume = playerOptions.volume;\n        await this.node.rest.updatePlayer({\n            guildId: this.guildId,\n            noReplace: playable.options?.noReplace ?? false,\n            playerOptions\n        });\n    }\n\n    /**\n     * Stop the currently playing track\n     */\n    public async stopTrack(): Promise<void> {\n        this.position = 0;\n        await this.node.rest.updatePlayer({\n            guildId: this.guildId,\n            playerOptions: { encodedTrack: null }\n        });\n\n    }\n\n    /**\n     * Pause or unpause the currently playing track\n     * @param paused Boolean value to specify whether to pause or unpause the current bot user\n     */\n    public async setPaused(paused = true): Promise<void> {\n        this.paused = paused;\n        await this.node.rest.updatePlayer({\n            guildId: this.guildId,\n            playerOptions: { paused }\n        });\n    }\n\n    /**\n     * Seek to a specific time in the currently playing track\n     * @param position Position to seek to in milliseconds\n     */\n    public async seekTo(position: number): Promise<void> {\n        this.position = position;\n        await this.node.rest.updatePlayer({\n            guildId: this.guildId,\n            playerOptions: { position }\n        });\n    }\n\n    /**\n     * Sets the global volume of the player\n     * @param volume Target volume 0-1000\n     */\n    public async setGlobalVolume(volume: number): Promise<void> {\n        this.volume = volume;\n        await this.node.rest.updatePlayer({\n            guildId: this.guildId,\n            playerOptions: { volume: this.volume }\n        });\n    }\n\n    /**\n     * Sets the filter volume of the player\n     * @param volume Target volume 0.0-5.0\n     */\n    public async setFilterVolume(volume: number):  Promise<void> {\n        this.filters.volume = volume;\n        await this.setFilters(this.filters);\n    }\n    /**\n     * Change the equalizer settings applied to the currently playing track\n     * @param equalizer An array of objects that conforms to the Bands type that define volumes at different frequencies\n     */\n    public async setEqualizer(equalizer: Band[]): Promise<void> {\n        this.filters.equalizer = equalizer;\n        await this.setFilters(this.filters);\n\n    }\n\n    /**\n     * Change the karaoke settings applied to the currently playing track\n     * @param karaoke An object that conforms to the KaraokeSettings type that defines a range of frequencies to mute\n     */\n    public async setKaraoke(karaoke?: KaraokeSettings): Promise<void> {\n        this.filters.karaoke = karaoke || null;\n        await this.setFilters(this.filters);\n    }\n\n    /**\n     * Change the timescale settings applied to the currently playing track\n     * @param timescale An object that conforms to the TimescaleSettings type that defines the time signature to play the audio at\n     */\n    public async setTimescale(timescale?: TimescaleSettings): Promise<void> {\n        this.filters.timescale = timescale || null;\n        await this.setFilters(this.filters);\n    }\n\n    /**\n     * Change the tremolo settings applied to the currently playing track\n     * @param tremolo An object that conforms to the FreqSettings type that defines an oscillation in volume\n     */\n    public async setTremolo(tremolo?: FreqSettings): Promise<void> {\n        this.filters.tremolo = tremolo || null;\n        await this.setFilters(this.filters);\n    }\n\n    /**\n     * Change the vibrato settings applied to the currently playing track\n     * @param vibrato An object that conforms to the FreqSettings type that defines an oscillation in pitch\n     */\n    public async setVibrato(vibrato?: FreqSettings): Promise<void> {\n        this.filters.vibrato = vibrato || null;\n        await this.setFilters(this.filters);\n    }\n\n    /**\n     * Change the rotation settings applied to the currently playing track\n     * @param rotation An object that conforms to the RotationSettings type that defines the frequency of audio rotating round the listener\n     */\n    public async setRotation(rotation?: RotationSettings): Promise<void> {\n        this.filters.rotation = rotation || null;\n        await this.setFilters(this.filters);\n    }\n\n    /**\n     * Change the distortion settings applied to the currently playing track\n     * @param distortion An object that conforms to DistortionSettings that defines distortions in the audio\n     * @returns The current player instance\n     */\n    public async setDistortion(distortion: DistortionSettings): Promise<void> {\n        this.filters.distortion = distortion || null;\n        await this.setFilters(this.filters);\n    }\n\n    /**\n     * Change the channel mix settings applied to the currently playing track\n     * @param channelMix An object that conforms to ChannelMixSettings that defines how much the left and right channels affect each other (setting all factors to 0.5 causes both channels to get the same audio)\n     */\n    public async setChannelMix(channelMix: ChannelMixSettings): Promise<void> {\n        this.filters.channelMix = channelMix || null;\n        await this.setFilters(this.filters);\n    }\n\n    /**\n     * Change the low pass settings applied to the currently playing track\n     * @param lowPass An object that conforms to LowPassSettings that defines the amount of suppression on higher frequencies\n     */\n    public async setLowPass(lowPass: LowPassSettings): Promise<void> {\n        this.filters.lowPass = lowPass || null;\n        await this.setFilters(this.filters);\n    }\n\n    /**\n     * Change the all filter settings applied to the currently playing track\n     * @param filters An object that conforms to FilterOptions that defines all filters to apply/modify\n     */\n    public async setFilters(filters: FilterOptions): Promise<void> {\n        this.filters = filters;\n        await this.node.rest.updatePlayer({\n            guildId: this.guildId,\n            playerOptions: { filters }\n        });\n    }\n\n    /**\n     * Clear all filters applied to the currently playing track\n     */\n    public clearFilters(): Promise<void> {\n        return this.setFilters({\n            volume: 1,\n            equalizer: [],\n            karaoke: null,\n            timescale: null,\n            tremolo: null,\n            vibrato: null,\n            rotation: null,\n            distortion: null,\n            channelMix: null,\n            lowPass: null,\n        });\n    }\n\n    /**\n     * Resumes the current track\n     * @param options An object that conforms to ResumeOptions that specify behavior on resuming\n     */\n    public async resume(options: ResumeOptions = {}): Promise<void> {\n        const data = this.data;\n        if (options.noReplace) data.noReplace = options.noReplace;\n        if (options.startTime) data.playerOptions.position = options.startTime;\n        if (options.endTime) data.playerOptions.position;\n        if (options.pause) data.playerOptions.paused = options.pause;\n        await this.update(data);\n        this.emit('resumed', this);\n    }\n\n    /**\n     * If you want to update the whole player yourself, sends raw update player info to lavalink\n     */\n    public async update(updatePlayer: UpdatePlayerInfo): Promise<void> {\n        const data = { ...updatePlayer, ...{ guildId: this.guildId, sessionId: this.node.sessionId! }};\n        await this.node.rest.updatePlayer(data);\n        if (updatePlayer.playerOptions) {\n            const options = updatePlayer.playerOptions;\n            if (options.encodedTrack) this.track = options.encodedTrack;\n            if (options.position) this.position = options.position;\n            if (options.paused) this.paused = options.paused;\n            if (options.filters) this.filters = options.filters;\n            if (options.volume) this.volume = options.volume;\n        }\n    }\n\n    /**\n     * Cleans this player instance\n     * @internal\n     */\n    public clean(): void {\n        this.removeAllListeners();\n        this.track = null;\n        this.volume = 100;\n        this.position = 0;\n        this.filters = {};\n    }\n\n    /**\n     * Sends server update to lavalink\n     * @internal\n     */\n    public async sendServerUpdate(connection: Connection): Promise<void> {\n        const playerUpdate = {\n            guildId: this.guildId,\n            playerOptions: {\n                voice: {\n                    token: connection.serverUpdate!.token,\n                    endpoint: connection.serverUpdate!.endpoint,\n                    sessionId: connection.sessionId!\n                }\n            }\n        };\n        await this.node.rest.updatePlayer(playerUpdate);\n    }\n\n    /**\n     * Handle player update data\n     */\n    public onPlayerUpdate(json: { state: { position: number, ping: number } }): void {\n        const { position, ping } = json.state;\n        this.position = position;\n        this.ping = ping;\n        this.emit('update', json);\n    }\n\n    /**\n     * Handle player events received from Lavalink\n     * @param json JSON data from Lavalink\n     * @internal\n     */\n    public onPlayerEvent(json: { type: string, track: Track }): void {\n        switch (json.type) {\n            case 'TrackStartEvent':\n                if (this.track) this.track = json.track.encoded;\n                this.emit('start', json);\n                break;\n            case 'TrackEndEvent':\n                this.emit('end', json);\n                break;\n            case 'TrackStuckEvent':\n                this.emit('stuck', json);\n                break;\n            case 'TrackExceptionEvent':\n                this.emit('exception', json);\n                break;\n            case 'WebSocketClosedEvent':\n                this.emit('closed', json);\n                break;\n            default:\n                this.node.emit(\n                    'debug',\n                    this.node.name,\n                    `[Player] -> [Node] : Unknown Player Event Type ${json.type} | Guild: ${this.guildId}`\n                );\n        }\n    }\n}\n","import { EventEmitter } from 'events';\nimport { IncomingMessage } from 'http';\nimport { NodeOption, Shoukaku } from '../Shoukaku';\nimport { OpCodes, State, Versions } from '../Constants';\nimport { wait } from '../Utils';\nimport { Rest } from './Rest';\nimport Websocket from 'ws';\n\nexport interface NodeStats {\n    players: number;\n    playingPlayers: number;\n    memory: {\n        reservable: number;\n        used: number;\n        free: number;\n        allocated: number\n    };\n    frameStats: {\n        sent: number;\n        deficit: number;\n        nulled: number\n    };\n    cpu: {\n        cores: number;\n        systemLoad: number;\n        lavalinkLoad: number;\n    };\n    uptime: number;\n}\n\ntype NodeInfoVersion = {\n    semver: string;\n    major: number;\n    minor: number;\n    patch: number;\n    preRelease?: string;\n    build?: string;\n};\n\ntype NodeInfoGit = {\n    branch: string;\n    commit: string;\n    commitTime: number;\n};\n\ntype NodeInfoPlugin = {\n    name: string;\n    version: string;\n};\n\nexport type NodeInfo = {\n    version: NodeInfoVersion;\n    buildTime: number;\n    git: NodeInfoGit;\n    jvm: string;\n    lavaplayer: string;\n    sourceManagers: string[];\n    filters: string[];\n    plugins: NodeInfoPlugin[];\n};\n\nexport interface ResumableHeaders {\n    [key: string]: string;\n    'Client-Name': string;\n    'User-Agent': string;\n    'Authorization': string;\n    'User-Id': string;\n    'Session-Id': string;\n}\n\nexport interface NonResumableHeaders extends Omit<ResumableHeaders, 'Session-Id'> {}\n\n/**\n * Represents a Lavalink node\n */\nexport class Node extends EventEmitter {\n    /**\n     * Shoukaku class\n     */\n    public readonly manager: Shoukaku;\n    /**\n     * Lavalink rest API\n     */\n    public readonly rest: Rest;\n    /**\n     * Name of this node\n     */\n    public readonly name: string;\n    /**\n     * Group in which this node is contained\n     */\n    public readonly group?: string;\n    /**\n     * Websocket version this node will use\n     */\n    public readonly version: string;\n    /**\n     * URL of Lavalink\n     */\n    private readonly url: string;\n    /**\n     * Credentials to access Lavalink\n     */\n    private readonly auth: string;\n    /**\n     * The number of reconnects to Lavalink\n     */\n    public reconnects: number;\n    /**\n     * The state of this connection\n     */\n    public state: State;\n    /**\n     * Statistics from Lavalink\n     */\n    public stats: NodeStats|null;\n    /**\n     * Information about lavalink node\n    */\n    public info: NodeInfo|null;\n    /**\n     * Websocket instance\n     */\n    public ws: Websocket|null;\n    /**\n     * SessionId of this Lavalink connection (not to be confused with Discord SessionId)\n     */\n    public sessionId: string|null;\n    /**\n     * Boolean that represents if the node has initialized once\n     */\n    protected initialized: boolean;\n    /**\n     * Boolean that represents if this connection is destroyed\n     */\n    protected destroyed: boolean;\n    /**\n     * @param manager Shoukaku instance\n     * @param options Options on creating this node\n     * @param options.name Name of this node\n     * @param options.url URL of Lavalink\n     * @param options.auth Credentials to access Lavalnk\n     * @param options.secure Whether to use secure protocols or not\n     * @param options.group Group of this node\n     */\n    constructor(manager: Shoukaku, options: NodeOption) {\n        super();\n        this.manager = manager;\n        this.rest = new (this.manager.options.structures.rest || Rest)(this, options);\n        this.name = options.name;\n        this.group = options.group;\n        this.version = `/v${Versions.WEBSOCKET_VERSION}`;\n        this.url = `${options.secure ? 'wss' : 'ws'}://${options.url}`;\n        this.auth = options.auth;\n        this.reconnects = 0;\n        this.state = State.DISCONNECTED;\n        this.stats = null;\n        this.info = null;\n        this.ws = null;\n        this.sessionId = null;\n        this.initialized = false;\n        this.destroyed = false;\n    }\n\n    /**\n     * Penalties for load balancing\n     * @returns Penalty score\n     * @internal @readonly\n     */\n    get penalties(): number {\n        let penalties = 0;\n        if (!this.stats) return penalties;\n\n        penalties += this.stats.players;\n        penalties += Math.round(Math.pow(1.05, 100 * this.stats.cpu.systemLoad) * 10 - 10);\n\n        if (this.stats.frameStats) {\n            penalties += this.stats.frameStats.deficit;\n            penalties += this.stats.frameStats.nulled * 2;\n        }\n\n        return penalties;\n    }\n\n    /**\n     * If we should clean this node\n     * @internal @readonly\n     */\n    private get shouldClean(): boolean {\n        return this.destroyed || this.reconnects >= this.manager.options.reconnectTries;\n    }\n\n    /**\n     * Connect to Lavalink\n     */\n    public connect(): void {\n        if (!this.manager.id) throw new Error('Don\\'t connect a node when the library is not yet ready');\n        if (this.destroyed) throw new Error('You can\\'t re-use the same instance of a node once disconnected, please re-add the node again');\n\n        this.state = State.CONNECTING;\n\n        const headers: NonResumableHeaders|ResumableHeaders = {\n            'Client-Name': this.manager.options.userAgent,\n            'User-Agent': this.manager.options.userAgent,\n            'Authorization': this.auth,\n            'User-Id': this.manager.id\n        };\n\n        if (this.sessionId) headers['Resume-Key'] = this.sessionId;\n        this.emit('debug', `[Socket] -> [${this.name}] : Connecting ${this.url}, Version: ${this.version}, Trying to resume? ${!!this.sessionId}`);\n        if (!this.initialized) this.initialized = true;\n\n        const url = new URL(`${this.url}${this.version}/websocket`);\n        this.ws = new Websocket(url.toString(), { headers } as Websocket.ClientOptions);\n        this.ws.once('upgrade', response => this.open(response));\n        this.ws.once('close', (...args) => this.close(...args));\n        this.ws.on('error', error => this.error(error));\n        this.ws.on('message', data => this.message(data).catch(error => this.error(error)));\n    }\n\n    /**\n     * Disconnect from lavalink\n     * @param code Status code\n     * @param reason Reason for disconnect\n     */\n    public disconnect(code: number, reason?:string): void {\n        if (this.destroyed) return;\n\n        this.destroyed = true;\n        this.state = State.DISCONNECTING;\n\n        if (this.ws)\n            this.ws.close(code, reason);\n        else\n            this.clean();\n    }\n\n    /**\n     * Handle connection open event from Lavalink\n     * @param response Response from Lavalink\n     * @internal\n     */\n    private open(response: IncomingMessage): void {\n        const resumed = response.headers['session-resumed'] === 'true';\n        this.emit('debug', `[Socket] <-> [${this.name}] : Connection Handshake Done! ${this.url} | Upgrade Headers Resumed: ${resumed}`);\n        this.reconnects = 0;\n        this.state = State.NEARLY;\n    }\n\n    /**\n     * Handle message from Lavalink\n     * @param message JSON message\n     * @internal\n     */\n    private async message(message: unknown): Promise<void> {\n        if (this.destroyed) return;\n        const json = JSON.parse(message as string);\n        if (!json) return;\n        this.emit('raw', json);\n        switch(json.op) {\n            case OpCodes.STATS:\n                this.emit('debug', `[Socket] <- [${this.name}] : Node Status Update | Server Load: ${this.penalties}`);\n                this.stats = json;\n                break;\n            case OpCodes.READY:\n                this.sessionId = json.sessionId;\n                const players = [ ...this.manager.players.values() ].filter(player => player.node.name === this.name);\n                const resumeByLibrary = this.initialized && (players.length && this.manager.options.resumeByLibrary);\n                if (!json.resumed && resumeByLibrary) {\n                    try {\n                        await this.resumePlayers();\n                    } catch (error) {\n                        this.error(error);\n                    }\n                }\n\n                this.state = State.CONNECTED;\n                this.emit('debug', `[Socket] -> [${this.name}] : Lavalink is ready! | Lavalink resume: ${json.resumed} | Lib resume: ${!!resumeByLibrary}`);\n                this.emit('ready', json.resumed || resumeByLibrary);\n\n                if (this.manager.options.resume) {\n                    await this.rest.updateSession(this.manager.options.resume, this.manager.options.resumeTimeout);\n                    this.emit('debug', `[Socket] -> [${this.name}] : Resuming configured!`);\n                }\n                break;\n            case OpCodes.EVENT:\n            case OpCodes.PLAYER_UPDATE:\n                const player = this.manager.players.get(json.guildId);\n                if (!player) return;\n                if (json.op === OpCodes.EVENT)\n                    player.onPlayerEvent(json);\n                else\n                    player.onPlayerUpdate(json);\n                break;\n            default:\n                this.emit('debug', `[Player] -> [Node] : Unknown Message OP ${json.op}`);\n        }\n    }\n\n    /**\n     * Handle closed event from lavalink\n     * @param code Status close\n     * @param reason Reason for connection close\n     */\n    private close(code: number, reason: unknown): void {\n        this.emit('debug', `[Socket] <-/-> [${this.name}] : Connection Closed, Code: ${code || 'Unknown Code'}`);\n        this.emit('close', code, reason);\n        if (this.shouldClean)\n            this.clean();\n        else\n            this.reconnect();\n    }\n\n    /**\n     * To emit error events easily\n     * @param error error message\n     */\n    public error(error: Error|unknown): void {\n        this.emit('error', error);\n    }\n\n    /**\n     * Destroys the websocket connection\n     * @internal\n     */\n    private destroy(count: number = 0): void {\n        this.ws?.removeAllListeners();\n        this.ws?.close();\n        this.ws = null;\n        this.sessionId = null;\n        this.state = State.DISCONNECTED;\n        if (!this.shouldClean) return;\n        this.destroyed = true;\n        this.emit('disconnect', count);\n    }\n\n    /**\n     * Cleans and moves players to other nodes if possible\n     * @internal\n     */\n    private async clean(): Promise<void> {\n        const move = this.manager.options.moveOnDisconnect;\n        if (!move) return this.destroy();\n        let count = 0;\n        try {\n            count = await this.movePlayers();\n        } catch (error) {\n            this.error(error);\n        } finally {\n            this.destroy(count);\n        }\n    }\n\n    /**\n     * Reconnect to Lavalink\n     * @internal\n     */\n    private async reconnect(): Promise<void> {\n        if (this.state === State.RECONNECTING) return;\n        if (this.state !== State.DISCONNECTED) this.destroy();\n        this.state = State.RECONNECTING;\n        this.reconnects++;\n        this.emit('reconnecting', this.manager.options.reconnectTries - this.reconnects, this.manager.options.reconnectInterval);\n        this.emit('debug', `[Socket] -> [${this.name}] : Reconnecting in ${this.manager.options.reconnectInterval} seconds. ${this.manager.options.reconnectTries - this.reconnects} tries left`);\n        await wait(this.manager.options.reconnectInterval * 1000);\n        this.connect();\n    }\n\n    /**\n     * Tries to resume the players internally\n     * @internal\n     */\n    private async resumePlayers(): Promise<void> {\n        const playersWithData = [];\n        const playersWithoutData = [];\n\n        for (const player of this.manager.players.values()) {\n            const serverUpdate = this.manager.connections.get(player.guildId)?.serverUpdate;\n            if (serverUpdate)\n                playersWithData.push(player);\n            else\n                playersWithoutData.push(player);\n        }\n\n        await Promise.allSettled([\n            ...playersWithData.map(player => player.resume()),\n            ...playersWithoutData.map(player => this.manager.leaveVoiceChannel(player.guildId))\n        ]);\n    }\n\n    /**\n     * Tries to move the players to another node\n     * @internal\n     */\n    private async movePlayers(): Promise<number> {\n        const players = [ ...this.manager.players.values() ];\n        const data = await Promise.allSettled(players.map(player => player.move()));\n        return data.filter(results => results.status === 'fulfilled').length;\n    }\n}\n","import { Node, NodeInfo, NodeStats } from './Node';\nimport { NodeOption } from '../Shoukaku';\nimport { Versions } from '../Constants';\nimport { FilterOptions } from '../guild/Player';\n\nexport type Severity = 'common' | 'suspicious' | 'fault';\n\nexport enum LoadType {\n    TRACK = 'track',\n    PLAYLIST = 'playlist',\n    SEARCH = 'search',\n    EMPTY = 'empty',\n    ERROR = 'error'\n}\n\nexport interface Track {\n    encoded: string;\n    info: {\n        identifier: string;\n        isSeekable: boolean;\n        author: string;\n        length: number;\n        isStream: boolean;\n        position: number;\n        title: string;\n        uri?: string;\n        artworkUrl?: string;\n        isrc?: string;\n        sourceName: string;\n    }\n    pluginInfo: unknown;\n}\n\nexport interface Playlist {\n    encoded: string;\n    info: {\n        name: string;\n        selectedTrack: number;\n    }\n    pluginInfo: unknown;\n    tracks: Track[];\n}\n\nexport interface Exception {\n    message: string;\n    severity: Severity;\n    cause: string;\n}\n\nexport interface TrackResult {\n    loadType: LoadType.TRACK,\n    data: Track\n}\n\nexport interface PlaylistResult {\n    loadType: LoadType.PLAYLIST,\n    data: Playlist\n}\n\nexport interface SearchResult {\n    loadType: LoadType.SEARCH,\n    data: Track[]\n}\n\nexport interface EmptyResult {\n    loadType: LoadType.EMPTY,\n    data: {}\n}\n\nexport interface ErrorResult {\n    loadType: LoadType.ERROR,\n    data: Exception\n}\n\nexport type LavalinkResponse = TrackResult | PlaylistResult | SearchResult | EmptyResult | ErrorResult;\n\nexport interface Address {\n    address: string;\n    failingTimestamp: number;\n    failingTime: string;\n}\n\nexport interface RoutePlanner {\n    class: null | 'RotatingIpRoutePlanner' | 'NanoIpRoutePlanner' | 'RotatingNanoIpRoutePlanner' | 'BalancingIpRoutePlanner';\n    details: null | {\n        ipBlock: {\n            type: string;\n            size: string;\n        };\n        failingAddresses: Address[];\n        rotateIndex: string;\n        ipIndex: string;\n        currentAddress: string;\n        blockIndex: string;\n        currentAddressIndex: string;\n    };\n}\n\nexport interface LavalinkPlayerVoice {\n    token: string;\n    endpoint: string;\n    sessionId: string;\n    connected?: boolean;\n    ping?: number\n}\n\nexport interface LavalinkPlayerVoiceOptions extends Omit<LavalinkPlayerVoice, 'connected'|'ping'> {}\n\nexport interface LavalinkPlayer {\n    guildId: string,\n    track?: Track,\n    volume: number;\n    paused: boolean;\n    voice: LavalinkPlayerVoice\n    filters: FilterOptions\n}\n\nexport interface UpdatePlayerOptions {\n    encodedTrack?: string|null;\n    identifier?: string;\n    position?: number;\n    endTime?: number;\n    volume?: number;\n    paused?: boolean;\n    filters?: FilterOptions;\n    voice?: LavalinkPlayerVoiceOptions;\n}\n\nexport interface UpdatePlayerInfo {\n    guildId: string;\n    playerOptions: UpdatePlayerOptions;\n    noReplace?: boolean;\n}\n\nexport interface SessionInfo {\n    resumingKey?: string;\n    timeout: number;\n}\n\ninterface FetchOptions {\n    endpoint: string;\n    options: {\n        headers?: Record<string, string>;\n        params?: Record<string, string>;\n        method?: string;\n        body?: Record<string, unknown>;\n        [key: string]: unknown;\n    };\n}\n\ninterface FinalFetchOptions {\n    method: string;\n    headers: Record<string, string>;\n    signal: AbortSignal;\n    body?: string;\n}\n\n/**\n * Wrapper around Lavalink REST API\n */\nexport class Rest {\n    /**\n     * Node that initialized this instance\n     */\n    protected readonly node: Node;\n    /**\n     * URL of Lavalink\n     */\n    protected readonly url: string;\n    /**\n     * Credentials to access Lavalink\n     */\n    protected readonly auth: string;\n    /**\n     * Rest version to use\n     */\n    protected readonly version: string;\n    /**\n     * @param node An instance of Node\n     * @param options The options to initialize this rest class\n     * @param options.name Name of this node\n     * @param options.url URL of Lavalink\n     * @param options.auth Credentials to access Lavalnk\n     * @param options.secure Weather to use secure protocols or not\n     * @param options.group Group of this node\n     */\n    constructor(node: Node, options: NodeOption) {\n        this.node = node;\n        this.url = `${options.secure ? 'https' : 'http'}://${options.url}`;\n        this.version = `/v${Versions.REST_VERSION}`;\n        this.auth = options.auth;\n    }\n\n    protected get sessionId(): string {\n        return this.node.sessionId!;\n    }\n\n    /**\n     * Resolve a track\n     * @param identifier Track ID\n     * @returns A promise that resolves to a Lavalink response\n     */\n    public resolve(identifier: string): Promise<LavalinkResponse | undefined> {\n        const options = {\n            endpoint: '/loadtracks',\n            options: { params: { identifier }}\n        };\n        return this.fetch(options);\n    }\n\n    /**\n     * Decode a track\n     * @param track Encoded track\n     * @returns Promise that resolves to a track\n     */\n    public decode(track: string): Promise<Track | undefined> {\n        const options = {\n            endpoint: '/decodetrack',\n            options: { params: { track }}\n        };\n        return this.fetch<Track>(options);\n    }\n\n    /**\n     * Gets all the player with the specified sessionId\n     * @returns Promise that resolves to an array of Lavalink players\n     */\n    public async getPlayers(): Promise<LavalinkPlayer[]> {\n        const options = {\n            endpoint: `/sessions/${this.sessionId}/players`,\n            options: {}\n        };\n        return await this.fetch<LavalinkPlayer[]>(options) ?? [];\n    }\n\n    /**\n     * Gets all the player with the specified sessionId\n     * @returns Promise that resolves to an array of Lavalink players\n     */\n    public getPlayer(guildId: string): Promise<LavalinkPlayer | undefined> {\n        const options = {\n            endpoint: `/sessions/${this.sessionId}/players/${guildId}`,\n            options: {}\n        };\n        return this.fetch(options);\n    }\n\n    /**\n     * Updates a Lavalink player\n     * @param data SessionId from Discord\n     * @returns Promise that resolves to a Lavalink player\n     */\n    public updatePlayer(data: UpdatePlayerInfo): Promise<LavalinkPlayer | undefined> {\n        const options = {\n            endpoint: `/sessions/${this.sessionId}/players/${data.guildId}`,\n            options: {\n                method: 'PATCH',\n                params: { noReplace: data.noReplace?.toString() || 'false' },\n                headers: { 'Content-Type': 'application/json' },\n                body: data.playerOptions as Record<string, unknown>\n            }\n        };\n        return this.fetch<LavalinkPlayer>(options);\n    }\n\n    /**\n     * Deletes a Lavalink player\n     * @param guildId guildId where this player is\n     */\n    public async destroyPlayer(guildId: string): Promise<void> {\n        const options = {\n            endpoint: `/sessions/${this.sessionId}/players/${guildId}`,\n            options: { method: 'DELETE' }\n        };\n        await this.fetch(options);\n    }\n\n    /**\n     * Updates the session with a resume boolean and timeout\n     * @param resuming Whether resuming is enabled for this session or not\n     * @param timeout Timeout to wait for resuming\n     * @returns Promise that resolves to a Lavalink player\n     */\n    public updateSession(resuming?: boolean, timeout?: number): Promise<SessionInfo | undefined> {\n        const options = {\n            endpoint: `/sessions/${this.sessionId}`,\n            options: {\n                method: 'PATCH',\n                headers: { 'Content-Type': 'application/json' },\n                body: { resuming, timeout }\n            }\n        };\n        return this.fetch(options);\n    }\n\n    /**\n     * Gets the status of this node\n     * @returns Promise that resolves to a node stats response\n     */\n    public stats(): Promise<NodeStats | undefined> {\n        const options = {\n            endpoint: '/stats',\n            options: {}\n        };\n        return this.fetch(options);\n    }\n\n    /**\n     * Get routeplanner status from Lavalink\n     * @returns Promise that resolves to a routeplanner response\n     */\n    public getRoutePlannerStatus(): Promise<RoutePlanner | undefined> {\n        const options = {\n            endpoint: '/routeplanner/status',\n            options: {}\n        };\n        return this.fetch(options);\n    }\n\n    /**\n     * Release blacklisted IP address into pool of IPs\n     * @param address IP address\n     */\n    public async unmarkFailedAddress(address: string): Promise<void> {\n        const options = {\n            endpoint: '/routeplanner/free/address',\n            options: {\n                method: 'POST',\n                headers: { 'Content-Type': 'application/json' },\n                body: { address }\n            }\n        };\n        await this.fetch(options);\n    }\n\n    /**\n     * Get Lavalink info\n     */\n    public getLavalinkInfo(): Promise<NodeInfo|undefined> {\n        const options = {\n            endpoint: '/info',\n            options: {\n                headers: { 'Content-Type': 'application/json' }\n            }\n        };\n        return this.fetch(options);\n    }\n\n    /**\n     * Make a request to Lavalink\n     * @param fetchOptions.endpoint Lavalink endpoint\n     * @param fetchOptions.options Options passed to fetch\n     * @internal\n     */\n    protected async fetch<T = unknown>(fetchOptions: FetchOptions) {\n        const { endpoint, options } = fetchOptions;\n        let headers = {\n            'Authorization': this.auth,\n            'User-Agent': this.node.manager.options.userAgent\n        };\n\n        if (options.headers) headers = { ...headers, ...options.headers };\n\n        const url = new URL(`${this.url}${this.version}${endpoint}`);\n\n        if (options.params) url.search = new URLSearchParams(options.params).toString();\n\n        const abortController = new AbortController();\n        const timeout = setTimeout(() => abortController.abort(), this.node.manager.options.restTimeout * 1000);\n\n        const method = options.method?.toUpperCase() || 'GET';\n\n        const finalFetchOptions: FinalFetchOptions = {\n            method,\n            headers,\n            signal: abortController.signal\n        };\n\n        if (![ 'GET', 'HEAD' ].includes(method) && options.body)\n            finalFetchOptions.body = JSON.stringify(options.body);\n\n        const request = await fetch(url.toString(), finalFetchOptions)\n            .finally(() => clearTimeout(timeout));\n\n        if (!request.ok) {\n            const response = await request\n                .json()\n                .catch(() => null);\n            if (!response?.message)\n                throw new Error(`Rest request failed with response code: ${request.status}`);\n            else\n                throw new Error(`Rest request failed with response code: ${request.status} | message: ${response.message}`);\n        }\n        try {\n            return await request.json() as T;\n        } catch {\n            return;\n        }\n    }\n}\n","import { EventEmitter } from 'events';\nimport { ShoukakuDefaults, VoiceState } from './Constants';\nimport { Node } from './node/Node';\nimport { Connector } from './connectors/Connector';\nimport { Constructor, mergeDefault } from './Utils';\nimport { Player } from './guild/Player';\nimport { Rest } from './node/Rest';\nimport { Connection } from './guild/Connection.js';\n\nexport interface Structures {\n    /**\n     * A custom structure that extends the Rest class\n     */\n    rest?:  Constructor<Rest>;\n    /**\n     * A custom structure that extends the Player class\n     */\n    player?: Constructor<Player>;\n}\n\nexport interface NodeOption {\n    /**\n     * Name of this node\n     */\n    name: string;\n    /**\n     * URL of Lavalink\n     */\n    url: string;\n    /**\n     * Credentials to access Lavalink\n     */\n    auth: string;\n    /**\n     * Whether to use secure protocols or not\n     */\n    secure?: boolean;\n    /**\n     * Group of this node\n     */\n    group?: string;\n}\n\nexport interface ShoukakuOptions {\n    /**\n     * Whether to resume a connection on disconnect to Lavalink (Server Side) (Note: DOES NOT RESUME WHEN THE LAVALINK SERVER DIES)\n     */\n    resume?: boolean;\n    /**\n     * Time to wait before lavalink starts to destroy the players of the disconnected client\n     */\n    resumeTimeout?: number;\n    /**\n     * Whether to resume the players by doing it in the library side (Client Side) (Note: TRIES TO RESUME REGARDLESS OF WHAT HAPPENED ON A LAVALINK SERVER)\n     */\n    resumeByLibrary?: boolean;\n    /**\n     * Number of times to try and reconnect to Lavalink before giving up\n     */\n    reconnectTries?: number;\n    /**\n     * Timeout before trying to reconnect\n     */\n    reconnectInterval?: number;\n    /**\n     * Time to wait for a response from the Lavalink REST API before giving up\n     */\n    restTimeout?: number;\n    /**\n     * Whether to move players to a different Lavalink node when a node disconnects\n     */\n    moveOnDisconnect?: boolean;\n    /**\n     * User Agent to use when making requests to Lavalink\n     */\n    userAgent?: string;\n    /**\n     * Custom structures for shoukaku to use\n     */\n    structures?: Structures;\n    /**\n     * Timeout before abort connection\n     */\n    voiceConnectionTimeout?: number;\n    /**\n     * Node Resolver to use if you want to customize it\n     */\n    nodeResolver?: (nodes: Map<string, Node>, connection?: Connection) => Node|undefined;\n}\n\nexport interface VoiceChannelOptions {\n    guildId: string;\n    shardId: number;\n    channelId: string;\n    deaf?: boolean;\n    mute?: boolean;\n}\n\nexport declare interface Shoukaku {\n    /**\n     * Emitted when reconnect tries are occurring and how many tries are left\n     * @eventProperty\n     */\n    on(event: 'reconnecting', listener: (name: string, reconnectsLeft: number, reconnectInterval: number) => void): this;\n    /**\n     * Emitted when data useful for debugging is produced\n     * @eventProperty\n     */\n    on(event: 'debug', listener: (name: string, info: string) => void): this;\n    /**\n     * Emitted when an error occurs\n     * @eventProperty\n     */\n    on(event: 'error', listener: (name: string, error: Error) => void): this;\n    /**\n     * Emitted when Shoukaku is ready to receive operations\n     * @eventProperty\n     */\n    on(event: 'ready', listener: (name: string, reconnected: boolean) => void): this;\n    /**\n     * Emitted when a websocket connection to Lavalink closes\n     * @eventProperty\n     */\n    on(event: 'close', listener: (name: string, code: number, reason: string) => void): this;\n    /**\n     * Emitted when a websocket connection to Lavalink disconnects\n     * @eventProperty\n     */\n    on(event: 'disconnect', listener: (name: string, count: number) => void): this;\n    /**\n     * Emitted when a raw message is received from Lavalink\n     * @eventProperty\n     */\n    on(event: 'raw', listener: (name: string, json: unknown) => void): this;\n    once(event: 'reconnecting', listener: (name: string, reconnectsLeft: number, reconnectInterval: number) => void): this;\n    once(event: 'debug', listener: (name: string, info: string) => void): this;\n    once(event: 'error', listener: (name: string, error: Error) => void): this;\n    once(event: 'ready', listener: (name: string, reconnected: boolean) => void): this;\n    once(event: 'close', listener: (name: string, code: number, reason: string) => void): this;\n    once(event: 'disconnect', listener: (name: string, count: number) => void): this;\n    once(event: 'raw', listener: (name: string, json: unknown) => void): this;\n    off(event: 'reconnecting', listener: (name: string, reconnectsLeft: number, reconnectInterval: number) => void): this;\n    off(event: 'debug', listener: (name: string, info: string) => void): this;\n    off(event: 'error', listener: (name: string, error: Error) => void): this;\n    off(event: 'ready', listener: (name: string, reconnected: boolean) => void): this;\n    off(event: 'close', listener: (name: string, code: number, reason: string) => void): this;\n    off(event: 'disconnect', listener: (name: string, count: number) => void): this;\n    off(event: 'raw', listener: (name: string, json: unknown) => void): this;\n}\n\n/**\n * Main Shoukaku class\n */\nexport class Shoukaku extends EventEmitter {\n    /**\n     * Discord library connector\n     */\n    public readonly connector: Connector;\n    /**\n     * Shoukaku options\n     */\n    public readonly options: Required<ShoukakuOptions>;\n    /**\n     * Connected Lavalink nodes\n     */\n    public readonly nodes: Map<string, Node>;\n    /**\n     * Voice connections being handled\n     */\n    public readonly connections: Map<string, Connection>;\n    /**\n     * Players being handled\n     */\n    public readonly players: Map<string, Player>;\n    /**\n     * Shoukaku instance identifier\n     */\n    public id: string|null;\n    /**\n     * @param connector A Discord library connector\n     * @param nodes An array that conforms to the NodeOption type that specifies nodes to connect to\n     * @param options Options to pass to create this Shoukaku instance\n     * @param options.resume Whether to resume a connection on disconnect to Lavalink (Server Side) (Note: DOES NOT RESUME WHEN THE LAVALINK SERVER DIES)\n     * @param options.resumeTimeout Time to wait before lavalink starts to destroy the players of the disconnected client\n     * @param options.resumeByLibrary Whether to resume the players by doing it in the library side (Client Side) (Note: TRIES TO RESUME REGARDLESS OF WHAT HAPPENED ON A LAVALINK SERVER)\n     * @param options.reconnectTries Number of times to try and reconnect to Lavalink before giving up\n     * @param options.reconnectInterval Timeout before trying to reconnect\n     * @param options.restTimeout Time to wait for a response from the Lavalink REST API before giving up\n     * @param options.moveOnDisconnect Whether to move players to a different Lavalink node when a node disconnects\n     * @param options.userAgent User Agent to use when making requests to Lavalink\n     * @param options.structures Custom structures for shoukaku to use\n     * @param options.nodeResolver Used if you have custom lavalink node resolving\n     */\n    constructor(connector: Connector, nodes: NodeOption[], options: ShoukakuOptions = {}) {\n        super();\n        this.connector = connector.set(this);\n        this.options = mergeDefault(ShoukakuDefaults, options);\n        this.nodes = new Map();\n        this.connections = new Map();\n        this.players = new Map();\n        this.id = null;\n        this.connector.listen(nodes);\n    }\n\n    /**\n     * Add a Lavalink node to the pool of available nodes\n     * @param options.name Name of this node\n     * @param options.url URL of Lavalink\n     * @param options.auth Credentials to access Lavalnk\n     * @param options.secure Whether to use secure protocols or not\n     * @param options.group Group of this node\n     */\n    public addNode(options: NodeOption): void {\n        const node = new Node(this, options);\n        node.on('debug', (...args) => this.emit('debug', node.name, ...args));\n        node.on('reconnecting', (...args) => this.emit('reconnecting', node.name, ...args));\n        node.on('error', (...args) => this.emit('error', node.name, ...args));\n        node.on('close', (...args) => this.emit('close', node.name, ...args));\n        node.on('ready', (...args) => this.emit('ready', node.name, ...args));\n        node.on('raw', (...args) => this.emit('raw', node.name, ...args));\n        node.once('disconnect', (...args) => this.clean(node, ...args));\n        node.connect();\n        this.nodes.set(node.name, node);\n    }\n\n    /**\n     * Remove a Lavalink node from the pool of available nodes\n     * @param name Name of the node\n     * @param reason Reason of removing the node\n     */\n    public removeNode(name: string, reason = 'Remove node executed'): void {\n        const node = this.nodes.get(name);\n        if (!node) throw new Error('The node name you specified doesn\\'t exist');\n        node.disconnect(1000, reason);\n    }\n\n    /**\n     * Joins a voice channel\n     * @param options.guildId GuildId in which the ChannelId of the voice channel is located\n     * @param options.shardId ShardId to track where this should send on sharded websockets, put 0 if you are unsharded\n     * @param options.channelId ChannelId of the voice channel you want to connect to\n     * @param options.deaf Optional boolean value to specify whether to deafen or undeafen the current bot user\n     * @param options.mute Optional boolean value to specify whether to mute or unmute the current bot user\n     * @returns The created player\n     * @internal\n     */\n    public async joinVoiceChannel(options: VoiceChannelOptions): Promise<Player> {\n        if (this.connections.has(options.guildId))\n            throw new Error('This guild already have an existing connection');\n        const connection = new Connection(this, options);\n        this.connections.set(connection.guildId, connection);\n        try {\n            await connection.connect();\n        } catch (error) {\n            this.connections.delete(options.guildId);\n            throw error;\n        }\n        try {\n            const node = this.options.nodeResolver(this.nodes, connection);\n            if (!node)\n                throw new Error('Can\\'t find any nodes to connect on');\n            const player = this.options.structures.player ? new this.options.structures.player(connection.guildId, node) : new Player(connection.guildId, node);\n            const onUpdate = (state: VoiceState) => {\n                if (state !== VoiceState.SESSION_READY) return;\n                player.sendServerUpdate(connection);\n            };\n            await player.sendServerUpdate(connection);\n            connection.on('connectionUpdate', onUpdate);\n            this.players.set(player.guildId, player);\n            return player;\n        } catch (error) {\n            connection.disconnect();\n            this.connections.delete(options.guildId);\n            throw error;\n        }\n    }\n\n    /**\n     * Leaves a voice channel\n     * @param guildId The id of the guild you want to delete\n     * @returns The destroyed / disconnected player or undefined if none\n     * @internal\n     */\n    public async leaveVoiceChannel(guildId: string): Promise<void> {\n        const connection = this.connections.get(guildId);\n        if (connection) {\n            connection.disconnect();\n            this.connections.delete(guildId);\n        }\n        const player = this.players.get(guildId);\n        if (player) {\n            try {\n                await player.destroy();\n            } catch (_) {}\n            player.clean();\n            this.players.delete(guildId);\n        }\n    }\n\n    /**\n     * Cleans the disconnected lavalink node\n     * @param node The node to clean\n     * @param args Additional arguments for Shoukaku to emit\n     * @returns A Lavalink node or undefined\n     * @internal\n     */\n    private clean(node: Node, ...args: unknown[]): void {\n        node.removeAllListeners();\n        this.nodes.delete(node.name);\n        this.emit('disconnect', node.name, ...args);\n    }\n}\n"],"mappings":"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","names":["State","VoiceState","OpCodes","Versions","EventEmitter","EventEmitter","node","EventEmitter","LoadType","EventEmitter","player","EventEmitter","EventEmitter"]}