lavacord
Version:
A simple by design lavalink wrapper made for any discord library.
1 lines • 13 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/lib/Rest.ts"],"names":[],"mappings":"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","file":"Rest.mjs","sourcesContent":["import { URLSearchParams } from \"url\";\nimport type { LavalinkNode } from \"./LavalinkNode\";\nimport { VERSION } from \"../index\";\nimport {\n\tErrorResponse,\n\tTrackLoadingResult,\n\tDecodeTrackResult,\n\tDecodeTracksResult,\n\tGetLavalinkVersionResult,\n\tGetLavalinkInfoResult,\n\tGetLavalinkStatsResult,\n\tUpdateSessionResult,\n\tUpdateSessionData,\n\tUpdatePlayerData,\n\tUpdatePlayerResult,\n\tDestroyPlayerResult\n} from \"lavalink-types\";\n\n/**\n * Error class for Lavalink REST API errors.\n * @remarks\n * Contains the full error response from the Lavalink server.\n * See {@link https://lavalink.dev/api/rest#error-responses}\n * @public\n */\nexport class RestError extends Error {\n\tconstructor(public error: ErrorResponse, public data: RequestInit) {\n\t\tsuper(error.message);\n\t\tthis.name = \"RestError\";\n\t}\n}\n\n/**\n * A utility class for interacting with the Lavalink REST API.\n *\n * @remarks\n * Provides methods to perform various operations on a Lavalink server through its REST API,\n * including loading tracks, decoding tracks, and controlling players.\n *\n * @public\n * @sealed\n */\nexport class Rest {\n\t/**\n\t * Base request function that handles communication with Lavalink REST API.\n\t *\n\t * @internal\n\t * @param node - The Lavalink node to send the request to.\n\t * @param path - The API route path, starting with /.\n\t * @param init - Optional request initialization options.\n\t * @param requiresSessionId - Whether the request requires a valid session ID.\n\t * @returns A promise resolving to the response data.\n\t * @throws {@link RestError} If Lavalink returns an error response.\n\t */\n\tprivate static async baseRequest<T>(node: LavalinkNode, path: string, init?: BaseRequestInit, requiresSessionId?: boolean): Promise<T> {\n\t\tconst headers = new Headers(init?.headers);\n\t\theaders.set(\"Authorization\", node.password);\n\t\theaders.set(\"User-Agent\", `Lavacord/${VERSION}`);\n\n\t\tconst fetchConfig: RequestInit = {\n\t\t\tmethod: init?.method ?? \"GET\",\n\t\t\theaders,\n\t\t\tbody: init?.body\n\t\t};\n\t\tif (init?.query) path += `?${new URLSearchParams(init.query)}`;\n\n\t\tif (requiresSessionId && !node.sessionId) {\n\t\t\tthrow new RestError({\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tstatus: 400,\n\t\t\t\terror: \"Bad Request\",\n\t\t\t\tmessage: `Node ${node.id} requires a session ID for this route. Did you forget to connect?`,\n\t\t\t\tpath\n\t\t\t}, fetchConfig);\n\t\t}\n\n\t\tconst response = await fetch(node.restURL + path, fetchConfig).catch((error) => {\n\t\t\tthrow new RestError({\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tstatus: 503,\n\t\t\t\terror: \"Network Error\",\n\t\t\t\tmessage: `Failed to connect to ${node.id}: ${error.message}`,\n\t\t\t\tpath\n\t\t\t}, fetchConfig);\n\t\t});\n\n\t\tif (response.status === 204) return undefined as T;\n\n\t\tconst contentType = response.headers.get(\"content-type\");\n\t\tconst body = await (contentType?.includes(\"application/json\") ? response.json() : response.text());\n\n\t\tif (!response.ok || (body as ErrorResponse)?.error) throw new RestError(body as ErrorResponse, fetchConfig);\n\n\t\treturn body as T;\n\t}\n\n\t/**\n\t * Loads tracks from various sources using Lavalink's loadtracks endpoint.\n\t *\n\t * @param node - The Lavalink node to use.\n\t * @param identifer - The identifier to load tracks from (URL, search query, etc.)\n\t * @returns A promise resolving to the track loading result.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic load(node: LavalinkNode, identifer: string): Promise<TrackLoadingResult> {\n\t\treturn Rest.baseRequest(node, `/v${node.version}/loadtracks`, { query: { identifier: identifer } });\n\t}\n\n\t/**\n\t * Decodes track(s) from their base64 encoded form.\n\t *\n\t * @param node - The Lavalink node to use.\n\t * @param track - A single track to decode.\n\t * @returns A promise resolving to the decoded track information.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\n\t * @public\n\t */\n\tstatic decode(node: LavalinkNode, track: string): Promise<DecodeTrackResult>;\n\t/**\n\t * Decodes multiple tracks from their base64 encoded form.\n\t *\n\t * @param node - The Lavalink node to use.\n\t * @param tracks - An array of tracks to decode.\n\t * @returns A promise resolving to an array of decoded track information.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic decode(node: LavalinkNode, tracks: string[]): Promise<DecodeTracksResult>;\n\tstatic decode(node: LavalinkNode, tracks: string | string[]): Promise<DecodeTrackResult | DecodeTracksResult> {\n\t\tif (!Array.isArray(tracks)) return Rest.baseRequest(node, `/v4/decodetrack`, { query: { track: tracks } });\n\t\treturn Rest.baseRequest(node, `/v${node.version}/decodetracks`, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify(tracks),\n\t\t\theaders: { \"Content-Type\": \"application/json\" }\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves the version from the Lavalink server.\n\t *\n\t * @param node - The Lavalink node to query.\n\t * @returns A promise resolving to the version of lavalink.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic version(node: LavalinkNode): Promise<GetLavalinkVersionResult> {\n\t\treturn Rest.baseRequest(node, `/version`);\n\t}\n\n\t/**\n\t * Retrieves the information of the Lavalink server.\n\t *\n\t * @param node - The Lavalink node to query.\n\t * @returns A promise resolving to the information of lavalink.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic info(node: LavalinkNode): Promise<GetLavalinkInfoResult> {\n\t\treturn Rest.baseRequest(node, `/v${node.version}/info`);\n\t}\n\n\t/**\n\t * Retrieves the statistics of the Lavalink node.\n\t *\n\t * @param node - The Lavalink node to query.\n\t * @returns A promise resolving to the statistics of lavalink.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic stats(node: LavalinkNode): Promise<GetLavalinkStatsResult> {\n\t\treturn Rest.baseRequest(node, `/v${node.version}/stats`);\n\t}\n\n\t/**\n\t * Updates the session properties of a Lavalink node.\n\t *\n\t * @param node - The Lavalink node to update.\n\t * @returns A promise resolving to the update session result.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic updateSession(node: LavalinkNode): Promise<UpdateSessionResult> {\n\t\treturn Rest.baseRequest(\n\t\t\tnode,\n\t\t\t`/v${node.version}/sessions/${node.sessionId}`,\n\t\t\t{\n\t\t\t\tmethod: \"PATCH\",\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tresuming: node.resuming,\n\t\t\t\t\ttimeout: node.resumeTimeout\n\t\t\t\t} as UpdateSessionData),\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" }\n\t\t\t},\n\t\t\ttrue\n\t\t);\n\t}\n\n\t/**\n\t * Updates a player on a Lavalink node.\n\t *\n\t * @param node - The Lavalink node hosting the player.\n\t * @param guildId - The guild ID associated with the player.\n\t * @param data - The player update data.\n\t * @param noReplace - If true, the event will be dropped if there's a currently playing track.\n\t * @returns A promise resolving to the updated player information.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\n\t * @public\n\t */\n\tstatic updatePlayer(node: LavalinkNode, guildId: string, data: UpdatePlayerData, noReplace = false): Promise<UpdatePlayerResult> {\n\t\treturn Rest.baseRequest(\n\t\t\tnode,\n\t\t\t`/v${node.version}/sessions/${node.sessionId}/players/${guildId}`,\n\t\t\t{\n\t\t\t\tmethod: \"PATCH\",\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tquery: noReplace ? { noReplace: \"true\" } : undefined\n\t\t\t},\n\t\t\ttrue\n\t\t);\n\t}\n\n\t/**\n\t * Destroys a player on a Lavalink node.\n\t *\n\t * @param node - The Lavalink node hosting the player.\n\t * @param guildId - The guild ID associated with the player to destroy.\n\t * @returns A promise resolving to the destroy player result.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic destroyPlayer(node: LavalinkNode, guildId: string): Promise<DestroyPlayerResult> {\n\t\treturn Rest.baseRequest(node, `/v${node.version}/sessions/${node.sessionId}/players/${guildId}`, { method: \"DELETE\" }, true);\n\t}\n}\n\nexport interface BaseRequestInit extends RequestInit {\n\tquery?: string | URLSearchParams | Record<string, string> | [string, string][];\n}\n"]}