@discordjs/rpc 0.2.0-dev.1788538586-ecea9ed57 → 0.2.0-dev.1788566584-096177189

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -673,7 +673,7 @@ var RPCClient = class extends AsyncEventEmitter2 {
673
673
  };
674
674
 
675
675
  // src/index.ts
676
- var version = "0.2.0-dev.1788538586-ecea9ed57";
676
+ var version = "0.2.0-dev.1788566584-096177189";
677
677
  export {
678
678
  Events,
679
679
  IPCTransport,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/RPCEventError.ts","../src/constants.ts","../src/ipc.ts","../src/util.ts","../src/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { AsyncEventEmitter } from '@vladfrangu/async_event_emitter';\nimport type {\n\tRESTPostOAuth2AccessTokenResult,\n\tRESTPostOAuth2AccessTokenURLEncodedData,\n\tRPCCertifiedDevice,\n\tRPCCreateChannelInviteResultData,\n\tRPCGetChannelResultData,\n\tRPCGetChannelsResultData,\n\tRPCGetGuildResultData,\n\tRPCGetGuildsResultData,\n\tRPCGetImageArgs,\n\tRPCGetVoiceSettingsResultData,\n\tRPCMessage,\n\tRPCMessagePayload,\n\tRPCOAuth2Application,\n\tRPCSelectTextChannelArgs,\n\tRPCSelectTextChannelResultData,\n\tRPCSelectVoiceChannelArgs,\n\tRPCSelectVoiceChannelResultData,\n\tRPCSetActivityArgs,\n\tRPCSetCertifiedDevicesResultData,\n\tRPCSetUserVoiceSettingsArgs,\n\tRPCSetUserVoiceSettingsResultData,\n\tRPCSetVoiceSettingsArgs,\n\tRPCUnsubscribeResultData,\n\tAPIUser,\n\tOAuth2Scopes,\n\tSnowflake,\n\tRPCAuthorizeArgs,\n\tRPCCommandSubscribePayload,\n\tRPCSubscribeResultData,\n} from 'discord-api-types/v10';\nimport { RPCEvents, RPCCommands, Routes, RouteBases } from 'discord-api-types/v10';\nimport { RPCEventError } from './RPCEventError.js';\nimport type {\n\tEventAndArgsParameters,\n\tMappedRPCCommandsArgs,\n\tMappedRPCCommandsResultsData,\n\tMappedRPCEventsDispatchData,\n\tRPCCallableCommands,\n} from './constants.js';\nimport { Events } from './constants.js';\nimport { IPCTransport } from './ipc.js';\nimport { getPid, isValidTimestamp } from './util.js';\n\nexport interface RPCClientOptions {\n\t/**\n\t * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant\n\t *\n\t * for authorization requests\n\t */\n\tprompt?: 'consent' | 'none';\n\t/**\n\t * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant\n\t *\n\t * for authorization requests\n\t */\n\tredirectUri?: string;\n\t/**\n\t * An array of scopes\n\t */\n\tscopes?: OAuth2Scopes[];\n\t/**\n\t * the client username\n\t */\n\tusername?: string;\n}\n\nexport interface RPCLoginOptions {\n\t/**\n\t * Access Token\n\t */\n\taccessToken?: string;\n\t/**\n\t * Client id\n\t */\n\tclientId: string;\n\t/**\n\t * Client Secret\n\t */\n\tclientSecret?: string;\n}\n\nexport interface RequestOptions {\n\tsignal?: AbortSignal;\n}\n\n/**\n * The client for interacting with Discord RPC\n */\nexport class RPCClient extends AsyncEventEmitter<MappedRPCEventsDispatchData> {\n\tpublic options: RPCClientOptions;\n\n\tpublic accessToken: string;\n\n\tpublic clientId: string;\n\n\tpublic clientSecret: string;\n\n\tpublic readyTimestamp: number | null;\n\n\tpublic application: RPCOAuth2Application | null;\n\n\tpublic user: APIUser | null;\n\n\t/**\n\t * The transport for the IPC\n\t */\n\tpublic transport: IPCTransport;\n\n\t/**\n\t * Map of nonces being expected from the transport\n\t */\n\treadonly #expectedNonces: Map<\n\t\tstring,\n\t\t{ reject(this: void, reason?: unknown): void; resolve(this: void, value: unknown): void }\n\t>;\n\n\tpublic constructor(options: RPCClientOptions = {}) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\n\t\tthis.accessToken = '';\n\t\tthis.clientId = '';\n\t\tthis.clientSecret = '';\n\t\tthis.readyTimestamp = null;\n\t\tthis.application = null;\n\t\tthis.user = null;\n\n\t\tthis.transport = new IPCTransport(this);\n\t\tthis.transport.on('message', this.#onRpcMessage.bind(this));\n\n\t\tthis.#expectedNonces = new Map();\n\t}\n\n\t/**\n\t * Returns the Date for when the client became ready\n\t */\n\tpublic get readyAt() {\n\t\tif (this.readyTimestamp === null) return null;\n\t\treturn new Date(this.readyTimestamp);\n\t}\n\n\t/**\n\t * Returns true if the client is currently ready\n\t */\n\tpublic get ready() {\n\t\treturn this.readyTimestamp !== null;\n\t}\n\n\t/**\n\t * Search and connect to RPC\n\t */\n\tpublic async connect(options?: RequestOptions) {\n\t\tconst { promise, resolve, reject } = Promise.withResolvers<RPCClient>();\n\n\t\tif (this.ready) {\n\t\t\tresolve(this);\n\t\t\treturn promise;\n\t\t}\n\n\t\tconst signal = options?.signal ?? AbortSignal.timeout(10e3);\n\t\tconst onAbort: (_: Event) => void = (_: Event) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\t\tthis.removeListener(RPCEvents.Ready, onReady);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\t\tthis.transport.removeListener('close', onClose);\n\n\t\t\tconst reason = signal.reason instanceof Error ? signal.reason : new Error(String(signal.reason));\n\t\t\treject(reason);\n\t\t};\n\n\t\tconst onReady = () => {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\tthis.readyTimestamp = Date.now();\n\t\t\tresolve(this);\n\t\t};\n\n\t\tconst onClose = (data: unknown) => {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\tthis.removeListener(RPCEvents.Ready, onReady);\n\t\t\tfor (const expNonce of this.#expectedNonces.values()) {\n\t\t\t\texpNonce.reject(new RPCEventError('connection closed'));\n\t\t\t}\n\n\t\t\tthis.#expectedNonces.clear();\n\n\t\t\tthis.readyTimestamp = null;\n\n\t\t\tthis.emit(Events.Disconnected);\n\t\t\treject(new RPCEventError(JSON.stringify(data)));\n\t\t};\n\n\t\tsignal.addEventListener('abort', onAbort);\n\n\t\tthis.once(RPCEvents.Ready, onReady);\n\n\t\tthis.transport.once('close', onClose);\n\n\t\ttry {\n\t\t\tawait this.transport.connect();\n\t\t} catch (error) {\n\t\t\tthis.readyTimestamp = null;\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\tthis.removeListener(RPCEvents.Ready, onReady);\n\t\t\tthis.transport.removeListener('close', onClose);\n\t\t\treject(error);\n\t\t}\n\n\t\treturn promise;\n\t}\n\n\t/**\n\t * Performs authentication flow. Automatically calls Client#connect if needed.\n\t *\n\t * @example\n\t * logging in with a client id and secret\n\t * ```ts\n\t * client.login({ clientId: '1234567', clientSecret: 'abcdef123' });\n\t * ```\n\t */\n\tpublic async login(\n\t\t{ clientId, clientSecret, accessToken }: RPCLoginOptions,\n\t\toptions?: RequestOptions,\n\t): Promise<RPCClient> {\n\t\tif (!clientId) {\n\t\t\tthrow new Error('A client id must be provided to login');\n\t\t}\n\n\t\tthis.clientId = clientId;\n\n\t\tawait this.connect(options);\n\n\t\tif (!this.options.scopes) {\n\t\t\tthis.emit(Events.ApplicationReady);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (accessToken) {\n\t\t\treturn this.authenticate(accessToken, options);\n\t\t}\n\n\t\tif (!clientSecret) {\n\t\t\tthrow new Error('A client secret must be provided for authorization if scopes are included');\n\t\t}\n\n\t\tthis.clientSecret = clientSecret;\n\n\t\tconst authorizeArgs: RPCAuthorizeArgs = { client_id: this.clientId, scopes: this.options.scopes };\n\t\tif (this.options.username) authorizeArgs.username = this.options.username;\n\n\t\treturn this.authenticate(await this.authorize(authorizeArgs, options), options);\n\t}\n\n\t/**\n\t * Request\n\t *\n\t * @param cmd - Command\n\t * @param args - Arguments\n\t * @param evt - Event\n\t */\n\tpublic async request<Cmd extends RPCCallableCommands = RPCCallableCommands>(\n\t\tcmd: Cmd,\n\t\targs?: MappedRPCCommandsArgs[Cmd],\n\t\toptions?: RequestOptions & { evt?: RPCEvents },\n\t): Promise<MappedRPCCommandsResultsData[Cmd]>;\n\tpublic async request(\n\t\tcmd: RPCCommands.Subscribe | RPCCommands.Unsubscribe,\n\t\targs: RPCCommandSubscribePayload['args'],\n\t\toptions: RequestOptions & { evt: RPCEvents },\n\t): Promise<RPCSubscribeResultData | RPCUnsubscribeResultData>;\n\tpublic async request<Cmd extends RPCCallableCommands = RPCCallableCommands>(\n\t\tcmd: Cmd,\n\t\targs: MappedRPCCommandsArgs[Cmd] = {} as MappedRPCCommandsArgs[Cmd],\n\t\toptions?: RequestOptions & { evt?: RPCEvents },\n\t) {\n\t\tconst signal = options?.signal ?? AbortSignal.timeout(10e3);\n\t\tsignal.throwIfAborted();\n\t\tconst { promise, resolve, reject } = Promise.withResolvers<MappedRPCCommandsResultsData[Cmd]>();\n\t\tconst nonce = randomUUID();\n\t\tconst payload: { args: MappedRPCCommandsArgs[Cmd]; cmd: Cmd; evt?: RPCEvents; nonce: string } = {\n\t\t\tcmd,\n\t\t\targs,\n\t\t\tnonce,\n\t\t};\n\t\tif (cmd === RPCCommands.Subscribe || cmd === RPCCommands.Unsubscribe) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n\t\t\tpayload.evt = options?.evt!;\n\t\t}\n\n\t\tthis.transport.send(payload as RPCMessagePayload);\n\t\tthis.#expectedNonces.set(nonce, { resolve, reject });\n\t\tconst onAbort = (_: Event) => {\n\t\t\tthis.#expectedNonces.delete(nonce);\n\t\t\tconst reason = signal.reason instanceof Error ? signal.reason : new Error(String(signal.reason));\n\t\t\treject(reason);\n\t\t};\n\n\t\tsignal.addEventListener('abort', onAbort, { once: true });\n\n\t\ttry {\n\t\t\treturn await promise;\n\t\t} finally {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t}\n\t}\n\n\t/**\n\t * Message handler\n\t *\n\t * @param message - message\n\t */\n\t#onRpcMessage(message: RPCMessage): void {\n\t\tif (message.cmd === RPCCommands.Dispatch && message.evt === RPCEvents.Ready) {\n\t\t\tif (message.data.user) {\n\t\t\t\tthis.user = message.data.user;\n\t\t\t}\n\n\t\t\tthis.emit(RPCEvents.Ready, message.data);\n\t\t} else if (message.cmd === RPCCommands.Dispatch) {\n\t\t\tthis.emit(message.evt, message.data);\n\t\t} else {\n\t\t\tif (!this.#expectedNonces.has(message.nonce)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { resolve, reject } = this.#expectedNonces.get(message.nonce)!;\n\t\t\tif ('evt' in message && message.evt === RPCEvents.Error) {\n\t\t\t\treject(new RPCEventError(message.data));\n\t\t\t} else {\n\t\t\t\tresolve(message.data);\n\t\t\t}\n\n\t\t\tthis.#expectedNonces.delete(message.nonce);\n\t\t}\n\t}\n\n\t/**\n\t * Authorize\n\t *\n\t * @param args - authorize args\n\t */\n\tprivate async authorize(args: RPCAuthorizeArgs, options?: RequestOptions): Promise<string> {\n\t\tconst { code } = await this.request(RPCCommands.Authorize, args, options);\n\n\t\tconst jsonBody: RESTPostOAuth2AccessTokenURLEncodedData = {\n\t\t\tclient_id: this.clientId,\n\t\t\tclient_secret: this.clientSecret,\n\t\t\tcode,\n\t\t\tgrant_type: 'authorization_code',\n\t\t};\n\n\t\tif (this.options.redirectUri) {\n\t\t\tjsonBody.redirect_uri = this.options.redirectUri;\n\t\t}\n\n\t\tconst response = await fetch(`${RouteBases.api}${Routes.oauth2TokenExchange()}`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams(jsonBody),\n\t\t\t...options,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(response.statusText);\n\t\t}\n\n\t\tconst data = (await response.json()) as RESTPostOAuth2AccessTokenResult;\n\n\t\tif (!('access_token' in data)) {\n\t\t\tthrow new Error(JSON.stringify(response));\n\t\t}\n\n\t\treturn data.access_token;\n\t}\n\n\t/**\n\t * Authenticate\n\t *\n\t * @param accessToken - access token\n\t */\n\tpublic async authenticate(accessToken: string, options?: RequestOptions): Promise<this> {\n\t\tconst { application, user } = await this.request(RPCCommands.Authenticate, { access_token: accessToken }, options);\n\t\tthis.accessToken = accessToken;\n\t\tthis.application = application;\n\t\tthis.user = user;\n\t\tthis.emit(Events.ApplicationReady);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Fetch a guild\n\t *\n\t * @param id - Guild id\n\t * @param timeout - Timeout request\n\t */\n\tpublic async getGuild(id: Snowflake, timeout: number, options?: RequestOptions): Promise<RPCGetGuildResultData> {\n\t\treturn this.request(RPCCommands.GetGuild, { guild_id: id, timeout }, options);\n\t}\n\n\t/**\n\t * Fetch all guilds\n\t *\n\t * @param timeout - Timeout request\n\t */\n\tpublic async getGuilds(timeout: number, options?: RequestOptions): Promise<RPCGetGuildsResultData> {\n\t\treturn this.request(RPCCommands.GetGuilds, { timeout }, options);\n\t}\n\n\t/**\n\t * Get a channel\n\t *\n\t * @param id - Channel id\n\t */\n\tpublic async getChannel(id: Snowflake, options?: RequestOptions): Promise<RPCGetChannelResultData> {\n\t\treturn this.request(RPCCommands.GetChannel, { channel_id: id }, options);\n\t}\n\n\t/**\n\t * Get all channels\n\t *\n\t * @param id - Guild id\n\t */\n\tpublic async getChannels(id: Snowflake, options?: RequestOptions): Promise<RPCGetChannelsResultData['channels']> {\n\t\tconst { channels } = await this.request(RPCCommands.GetChannels, { guild_id: id }, options);\n\t\treturn channels;\n\t}\n\n\t/**\n\t * Create channel invite\n\t *\n\t * @param id - Channel id\n\t */\n\tpublic async createChannelInvite(id: Snowflake, options?: RequestOptions): Promise<RPCCreateChannelInviteResultData> {\n\t\treturn this.request(RPCCommands.CreateChannelInvite, { channel_id: id }, options);\n\t}\n\n\t/**\n\t * Tell discord which devices are certified\n\t *\n\t * @param devices - Certified devices to send to discord\n\t */\n\tpublic async setCertifiedDevices(\n\t\tdevices: RPCCertifiedDevice[],\n\t\toptions?: RequestOptions,\n\t): Promise<RPCSetCertifiedDevicesResultData> {\n\t\treturn this.request(\n\t\t\tRPCCommands.SetCertifiedDevices,\n\t\t\t{\n\t\t\t\tdevices,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Set the voice settings for a user, by id\n\t *\n\t * @param id - Id of the user to set\n\t * @param settings - Settings to set\n\t */\n\tpublic async setUserVoiceSettings(\n\t\tid: Snowflake,\n\t\tsettings: Omit<Partial<RPCSetUserVoiceSettingsArgs>, 'user_id'>,\n\t\toptions?: RequestOptions,\n\t): Promise<RPCSetUserVoiceSettingsResultData> {\n\t\treturn this.request(\n\t\t\tRPCCommands.SetUserVoiceSettings,\n\t\t\t{\n\t\t\t\tuser_id: id,\n\t\t\t\t...settings,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Move the user to a voice channel\n\t *\n\t * @param id - Id of the voice channel\n\t * @param args - select voice channel args\n\t * @param options - request options\n\t */\n\tpublic async selectVoiceChannel(\n\t\tid: Snowflake,\n\t\targs: Omit<RPCSelectVoiceChannelArgs, 'channel_id'> = {},\n\t\toptions?: RequestOptions,\n\t): Promise<RPCSelectVoiceChannelResultData> {\n\t\tconst svcArgs: RPCSelectVoiceChannelArgs = { ...args, channel_id: id };\n\n\t\treturn this.request(RPCCommands.SelectVoiceChannel, svcArgs, options);\n\t}\n\n\t/**\n\t * Move the user to a text channel\n\t *\n\t * @param id - Id of the text channel\n\t * @param args - select text channel args\n\t * @param options - request options\n\t */\n\tpublic async selectTextChannel(\n\t\tid: Snowflake,\n\t\targs: Omit<RPCSelectTextChannelArgs, 'channel_id'> = {},\n\t\toptions?: RequestOptions,\n\t): Promise<RPCSelectTextChannelResultData> {\n\t\tconst stcArgs: RPCSelectTextChannelArgs = { ...args, channel_id: id };\n\n\t\treturn this.request(RPCCommands.SelectTextChannel, stcArgs, options);\n\t}\n\n\t/**\n\t * Get current voice settings\n\t *\n\t */\n\tpublic async getVoiceSettings(options?: RequestOptions): Promise<RPCGetVoiceSettingsResultData> {\n\t\treturn this.request(RPCCommands.GetVoiceSettings, {}, options);\n\t}\n\n\t/**\n\t * Set current voice settings, overriding the current settings until this session disconnects.\n\t * This also locks the settings for any other rpc sessions which may be connected.\n\t *\n\t * @param args - Settings\n\t */\n\tpublic async setVoiceSettings(args: RPCSetVoiceSettingsArgs, options?: RequestOptions): Promise<unknown> {\n\t\treturn this.request(RPCCommands.SetVoiceSettings, args, options);\n\t}\n\n\t/**\n\t * Sets the presence for the logged in user.\n\t *\n\t * @param activity - The rich presence to pass.\n\t * @param pid - The application's process ID. Defaults to the executing process' PID.\n\t * @remarks\n\t * Clients may only update their activity 5 times per 20 seconds.\n\t */\n\tpublic async setActivity(\n\t\tactivity: RPCSetActivityArgs['activity'] = {},\n\t\tpid: number | null = getPid(),\n\t\toptions?: RequestOptions,\n\t): Promise<unknown> {\n\t\tactivity.instance = Boolean(activity.instance);\n\n\t\tif (activity.timestamps) {\n\t\t\tif ('start' in activity.timestamps && !isValidTimestamp(activity.timestamps.start)) {\n\t\t\t\tthrow new RangeError('timestamps.start must fit into a unix timestamp');\n\t\t\t}\n\n\t\t\tif ('end' in activity.timestamps && !isValidTimestamp(activity.timestamps.end)) {\n\t\t\t\tthrow new RangeError('timestamps.end must fit into a unix timestamp');\n\t\t\t}\n\t\t}\n\n\t\treturn this.request(\n\t\t\tRPCCommands.SetActivity,\n\t\t\t{\n\t\t\t\tpid: pid ?? 0,\n\t\t\t\tactivity,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Clears the currently set presence, if any. This will hide the \"Playing X\" message\n\t * displayed below the user's name.\n\t *\n\t * @param pid - The application's process ID. Defaults to the executing process' PID.\n\t */\n\tpublic async clearActivity(pid: number | null = getPid(), options?: RequestOptions): Promise<unknown> {\n\t\treturn this.request(\n\t\t\tRPCCommands.SetActivity,\n\t\t\t{\n\t\t\t\tpid: pid ?? 0,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Invite a user to join the game the RPC user is currently playing\n\t *\n\t * @param userId - The id of the user to invite\n\t */\n\tpublic async sendJoinInvite(userId: Snowflake, options?: RequestOptions): Promise<unknown> {\n\t\treturn this.request(\n\t\t\tRPCCommands.SendActivityJoinInvite,\n\t\t\t{\n\t\t\t\tuser_id: userId,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Reject a join request from a user\n\t *\n\t * @param userId - The id of the user whose request you wish to reject\n\t */\n\tpublic async closeJoinRequest(userId: Snowflake, options?: RequestOptions): Promise<unknown> {\n\t\treturn this.request(\n\t\t\tRPCCommands.CloseActivityJoinRequest,\n\t\t\t{\n\t\t\t\tuser_id: userId,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * requires `relationships.read` scope\n\t */\n\tpublic async getRelationships(options?: RequestOptions) {\n\t\treturn this.request(RPCCommands.GetRelationships, {}, options);\n\t}\n\n\t/**\n\t * Fetches a user\n\t */\n\tpublic async getUser(id: Snowflake, options?: RequestOptions) {\n\t\treturn this.request(RPCCommands.GetUser, { id }, options);\n\t}\n\n\t/**\n\t * Fetches a user's profile picture\n\t */\n\tpublic async getImage(\n\t\t{ id, format, size }: Omit<RPCGetImageArgs, 'type'>,\n\t\toptions?: RequestOptions,\n\t): Promise<string> {\n\t\treturn (await this.request(RPCCommands.GetImage, { type: 'user', id, format, size }, options)).data_url;\n\t}\n\n\t/**\n\t * Subscribe to an event\n\t *\n\t * @param event - Name of event e.g. `MESSAGE_CREATE`\n\t * @param args - Args for event e.g. `{ channel_id: '1234' }`\n\t */\n\tpublic async subscribe<Evt extends RPCEvents>(\n\t\t...[event, args, options]: EventAndArgsParameters<Evt>\n\t): Promise<{ unsubscribe(): Promise<RPCUnsubscribeResultData> }> {\n\t\tawait this.request(RPCCommands.Subscribe, args, { evt: event, ...options });\n\t\treturn {\n\t\t\tunsubscribe: async () => this.request(RPCCommands.Unsubscribe, args, { evt: event, ...options }),\n\t\t};\n\t}\n\n\t/**\n\t * Unsubscribe from an event\n\t *\n\t * @param event - Name of event e.g. `MESSAGE_CREATE`\n\t * @param args - Args for event e.g. `{ channel_id: '1234' }`\n\t */\n\tpublic async unsubscribe<Evt extends RPCEvents>(\n\t\t...[event, args, options]: EventAndArgsParameters<Evt>\n\t): Promise<{ subscribe(): Promise<RPCSubscribeResultData> }> {\n\t\tawait this.request(RPCCommands.Unsubscribe, args, { evt: event, ...options });\n\t\treturn {\n\t\t\tsubscribe: async () => this.request(RPCCommands.Subscribe, args, { evt: event, ...options }),\n\t\t};\n\t}\n\n\t/**\n\t * Destroy the client\n\t */\n\tpublic async destroy() {\n\t\tawait this.transport.close();\n\t}\n}\n","import type { RPCErrorCodes, RPCErrorDispatchData } from 'discord-api-types/v10';\n\nexport class RPCEventError extends Error {\n\tpublic code?: RPCErrorCodes;\n\n\tpublic data?: RPCErrorDispatchData;\n\n\tpublic constructor(data: RPCErrorDispatchData | string) {\n\t\tif (typeof data === 'string') {\n\t\t\tsuper(data);\n\t\t} else {\n\t\t\tsuper(data.message);\n\t\t\tthis.code = data.code;\n\t\t\tthis.data = data;\n\t\t}\n\n\t\tthis.name = 'RPCEventError';\n\t}\n}\n","import type {\n\tRPCAcceptActivityInviteArgs,\n\tRPCAcceptActivityInviteResultData,\n\tRPCActivityInviteDispatchData,\n\tRPCActivityInviteUserArgs,\n\tRPCActivityInviteUserResultData,\n\tRPCActivityJoinDispatchData,\n\tRPCActivityJoinRequestDispatchData,\n\tRPCActivitySpectateDispatchData,\n\tRPCAuthenticateArgs,\n\tRPCAuthenticateResultData,\n\tRPCAuthorizeArgs,\n\tRPCAuthorizeResultData,\n\tRPCBraintreePopupBridgeCallbackArgs,\n\tRPCBraintreePopupBridgeCallbackResultData,\n\tRPCBrowserHandoffArgs,\n\tRPCBrowserHandoffResultData,\n\tRPCChannelCreateDispatchData,\n\tRPCCloseActivityJoinRequestArgs,\n\tRPCCloseActivityJoinRequestResultData,\n\tRPCCommandSubscribePayload,\n\tRPCCommands,\n\tRPCConnectionsCallbackArgs,\n\tRPCConnectionsCallbackResultData,\n\tRPCCreateChannelInviteArgs,\n\tRPCCreateChannelInviteResultData,\n\tRPCCurrentUserUpdateDispatchData,\n\tRPCDeepLinkArgs,\n\tRPCDeepLinkResultData,\n\tRPCEntitlementCreateDispatchData,\n\tRPCEntitlementDeleteDispatchData,\n\tRPCErrorDispatchData,\n\tRPCEvents,\n\tRPCGameJoinDispatchData,\n\tRPCGameSpectateDispatchData,\n\tRPCGetApplicationTicketArgs,\n\tRPCGetApplicationTicketResultData,\n\tRPCGetChannelArgs,\n\tRPCGetChannelResultData,\n\tRPCGetChannelsArgs,\n\tRPCGetChannelsResultData,\n\tRPCGetEntitlementTicketArgs,\n\tRPCGetEntitlementTicketResultData,\n\tRPCGetEntitlementsArgs,\n\tRPCGetEntitlementsResultData,\n\tRPCGetGuildArgs,\n\tRPCGetGuildResultData,\n\tRPCGetGuildsArgs,\n\tRPCGetGuildsResultData,\n\tRPCGetImageArgs,\n\tRPCGetImageResultData,\n\tRPCGetNetworkingConfigArgs,\n\tRPCGetNetworkingConfigResultData,\n\tRPCGetRelationshipsArgs,\n\tRPCGetRelationshipsResultData,\n\tRPCGetSelectedVoiceChannelArgs,\n\tRPCGetSelectedVoiceChannelResultData,\n\tRPCGetSkusArgs,\n\tRPCGetSkusResultData,\n\tRPCGetUserArgs,\n\tRPCGetUserResultData,\n\tRPCGetVoiceSettingsArgs,\n\tRPCGetVoiceSettingsResultData,\n\tRPCGiftCodeBrowserArgs,\n\tRPCGiftCodeBrowserResultData,\n\tRPCGuildCreateDispatchData,\n\tRPCGuildStatusDispatchData,\n\tRPCGuildTemplateBrowserArgs,\n\tRPCGuildTemplateBrowserResultData,\n\tRPCInviteBrowserArgs,\n\tRPCInviteBrowserResultData,\n\tRPCMessageCreateDispatchData,\n\tRPCMessageDeleteDispatchData,\n\tRPCMessageUpdateDispatchData,\n\tRPCNetworkingCreateTokenArgs,\n\tRPCNetworkingCreateTokenResultData,\n\tRPCNetworkingPeerMetricsArgs,\n\tRPCNetworkingPeerMetricsResultData,\n\tRPCNetworkingSystemMetricsArgs,\n\tRPCNetworkingSystemMetricsResultData,\n\tRPCNotificationCreateDispatchData,\n\tRPCOpenOverlayActivityInviteArgs,\n\tRPCOpenOverlayActivityInviteResultData,\n\tRPCOpenOverlayGuildInviteArgs,\n\tRPCOpenOverlayGuildInviteResultData,\n\tRPCOpenOverlayVoiceSettingsArgs,\n\tRPCOpenOverlayVoiceSettingsResultData,\n\tRPCOverlayArgs,\n\tRPCOverlayDispatchData,\n\tRPCOverlayResultData,\n\tRPCOverlayUpdateDispatchData,\n\tRPCReadyDispatchData,\n\tRPCRelationshipUpdateDispatchData,\n\tRPCSelectTextChannelArgs,\n\tRPCSelectTextChannelResultData,\n\tRPCSelectVoiceChannelArgs,\n\tRPCSelectVoiceChannelResultData,\n\tRPCSendActivityJoinInviteArgs,\n\tRPCSendActivityJoinInviteResultData,\n\tRPCSetActivityArgs,\n\tRPCSetActivityResultData,\n\tRPCSetCertifiedDevicesArgs,\n\tRPCSetCertifiedDevicesResultData,\n\tRPCSetOverlayLockedArgs,\n\tRPCSetOverlayLockedResultData,\n\tRPCSetUserVoiceSettings2Args,\n\tRPCSetUserVoiceSettings2ResultData,\n\tRPCSetUserVoiceSettingsArgs,\n\tRPCSetUserVoiceSettingsResultData,\n\tRPCSetVoiceSettings2Args,\n\tRPCSetVoiceSettings2ResultData,\n\tRPCSetVoiceSettingsArgs,\n\tRPCSetVoiceSettingsResultData,\n\tRPCSpeakingStartDispatchData,\n\tRPCSpeakingStopDispatchData,\n\tRPCStartPurchaseArgs,\n\tRPCStartPurchaseResultData,\n\tRPCSubscribeActivityInviteArgs,\n\tRPCSubscribeActivityJoinArgs,\n\tRPCSubscribeActivityJoinRequestArgs,\n\tRPCSubscribeActivitySpectateArgs,\n\tRPCSubscribeChannelCreateArgs,\n\tRPCSubscribeCurrentUserUpdateArgs,\n\tRPCSubscribeEntitlementCreateArgs,\n\tRPCSubscribeEntitlementDeleteArgs,\n\tRPCSubscribeGameJoinArgs,\n\tRPCSubscribeGameSpectateArgs,\n\tRPCSubscribeGuildCreateArgs,\n\tRPCSubscribeGuildStatusArgs,\n\tRPCSubscribeMessageCreateArgs,\n\tRPCSubscribeMessageDeleteArgs,\n\tRPCSubscribeMessageUpdateArgs,\n\tRPCSubscribeNotificationCreateArgs,\n\tRPCSubscribeOverlayArgs,\n\tRPCSubscribeOverlayUpdateArgs,\n\tRPCSubscribeRelationshipUpdateArgs,\n\tRPCSubscribeResultData,\n\tRPCSubscribeSpeakingStartArgs,\n\tRPCSubscribeSpeakingStopArgs,\n\tRPCSubscribeVoiceChannelSelectArgs,\n\tRPCSubscribeVoiceConnectionStatusArgs,\n\tRPCSubscribeVoiceSettingsUpdate2Args,\n\tRPCSubscribeVoiceSettingsUpdateArgs,\n\tRPCSubscribeVoiceStateCreateArgs,\n\tRPCSubscribeVoiceStateDeleteArgs,\n\tRPCSubscribeVoiceStateUpdateArgs,\n\tRPCUnsubscribeResultData,\n\tRPCValidateApplicationArgs,\n\tRPCValidateApplicationResultData,\n\tRPCVoiceChannelSelectDispatchData,\n\tRPCVoiceConnectionStatusDispatchData,\n\tRPCVoiceSettingsUpdate2DispatchData,\n\tRPCVoiceSettingsUpdateDispatchData,\n\tRPCVoiceStateCreateDispatchData,\n\tRPCVoiceStateDeleteDispatchData,\n\tRPCVoiceStateUpdateDispatchData,\n} from 'discord-api-types/v10';\nimport type { RequestOptions } from './client.js';\n\nexport enum Events {\n\tApplicationReady = 'APPLICATION_READY',\n\tDisconnected = 'DISCONNECTED',\n}\n\nexport interface MappedRPCCommandsResultsData {\n\t[RPCCommands.Authorize]: RPCAuthorizeResultData;\n\t[RPCCommands.Authenticate]: RPCAuthenticateResultData;\n\t[RPCCommands.GetChannel]: RPCGetChannelResultData;\n\t[RPCCommands.GetChannels]: RPCGetChannelsResultData;\n\t[RPCCommands.GetGuild]: RPCGetGuildResultData;\n\t[RPCCommands.GetGuilds]: RPCGetGuildsResultData;\n\t[RPCCommands.GetUser]: RPCGetUserResultData;\n\t[RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsResultData;\n\t[RPCCommands.SelectTextChannel]: RPCSelectTextChannelResultData;\n\t[RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelResultData;\n\t[RPCCommands.SetActivity]: RPCSetActivityResultData;\n\t[RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsResultData;\n\t[RPCCommands.Subscribe]: RPCSubscribeResultData;\n\t[RPCCommands.Unsubscribe]: RPCUnsubscribeResultData;\n\t[RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteResultData;\n\t[RPCCommands.ActivityInviteUser]: RPCActivityInviteUserResultData;\n\t[RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackResultData;\n\t[RPCCommands.BrowserHandoff]: RPCBrowserHandoffResultData;\n\t[RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityJoinRequestResultData;\n\t[RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackResultData;\n\t[RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteResultData;\n\t[RPCCommands.DeepLink]: RPCDeepLinkResultData;\n\t[RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketResultData;\n\t[RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketResultData;\n\t[RPCCommands.GetEntitlements]: RPCGetEntitlementsResultData;\n\t[RPCCommands.GetImage]: RPCGetImageResultData;\n\t[RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigResultData;\n\t[RPCCommands.GetRelationships]: RPCGetRelationshipsResultData;\n\t[RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelResultData;\n\t[RPCCommands.GetSkus]: RPCGetSkusResultData;\n\t[RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserResultData;\n\t[RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserResultData;\n\t[RPCCommands.InviteBrowser]: RPCInviteBrowserResultData;\n\t[RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenResultData;\n\t[RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsResultData;\n\t[RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsResultData;\n\t[RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteResultData;\n\t[RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteResultData;\n\t[RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsResultData;\n\t[RPCCommands.Overlay]: RPCOverlayResultData;\n\t[RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteResultData;\n\t[RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesResultData;\n\t[RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedResultData;\n\t[RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsResultData;\n\t[RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2ResultData;\n\t[RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2ResultData;\n\t[RPCCommands.StartPurchase]: RPCStartPurchaseResultData;\n\t[RPCCommands.ValidateApplication]: RPCValidateApplicationResultData;\n}\n\nexport interface MappedRPCCommandsArgs {\n\t[RPCCommands.Authorize]: RPCAuthorizeArgs;\n\t[RPCCommands.Authenticate]: RPCAuthenticateArgs;\n\t[RPCCommands.GetChannel]: RPCGetChannelArgs;\n\t[RPCCommands.GetChannels]: RPCGetChannelsArgs;\n\t[RPCCommands.GetGuild]: RPCGetGuildArgs;\n\t[RPCCommands.GetGuilds]: RPCGetGuildsArgs;\n\t[RPCCommands.GetUser]: RPCGetUserArgs;\n\t[RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsArgs;\n\t[RPCCommands.SelectTextChannel]: RPCSelectTextChannelArgs;\n\t[RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelArgs;\n\t[RPCCommands.SetActivity]: RPCSetActivityArgs;\n\t[RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsArgs;\n\t[RPCCommands.Subscribe]: RPCCommandSubscribePayload['args'];\n\t[RPCCommands.Unsubscribe]: RPCCommandSubscribePayload['args'];\n\t[RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteArgs;\n\t[RPCCommands.ActivityInviteUser]: RPCActivityInviteUserArgs;\n\t[RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackArgs;\n\t[RPCCommands.BrowserHandoff]: RPCBrowserHandoffArgs;\n\t[RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityJoinRequestArgs;\n\t[RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackArgs;\n\t[RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteArgs;\n\t[RPCCommands.DeepLink]: RPCDeepLinkArgs;\n\t[RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketArgs;\n\t[RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketArgs;\n\t[RPCCommands.GetEntitlements]: RPCGetEntitlementsArgs;\n\t[RPCCommands.GetImage]: RPCGetImageArgs;\n\t[RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigArgs;\n\t[RPCCommands.GetRelationships]: RPCGetRelationshipsArgs;\n\t[RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelArgs;\n\t[RPCCommands.GetSkus]: RPCGetSkusArgs;\n\t[RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserArgs;\n\t[RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserArgs;\n\t[RPCCommands.InviteBrowser]: RPCInviteBrowserArgs;\n\t[RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenArgs;\n\t[RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsArgs;\n\t[RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsArgs;\n\t[RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteArgs;\n\t[RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteArgs;\n\t[RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsArgs;\n\t[RPCCommands.Overlay]: RPCOverlayArgs;\n\t[RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteArgs;\n\t[RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesArgs;\n\t[RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedArgs;\n\t[RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsArgs;\n\t[RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2Args;\n\t[RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2Args;\n\t[RPCCommands.StartPurchase]: RPCStartPurchaseArgs;\n\t[RPCCommands.ValidateApplication]: RPCValidateApplicationArgs;\n}\n\nexport type RPCCallableCommands = Exclude<RPCCommands, RPCCommands.Dispatch>;\n\nexport interface MappedRPCSubscribeEventsArgs {\n\t[RPCEvents.ActivityInvite]: RPCSubscribeActivityInviteArgs;\n\t[RPCEvents.ActivityJoin]: RPCSubscribeActivityJoinArgs;\n\t[RPCEvents.ActivityJoinRequest]: RPCSubscribeActivityJoinRequestArgs;\n\t[RPCEvents.ActivitySpectate]: RPCSubscribeActivitySpectateArgs;\n\t[RPCEvents.ChannelCreate]: RPCSubscribeChannelCreateArgs;\n\t[RPCEvents.CurrentUserUpdate]: RPCSubscribeCurrentUserUpdateArgs;\n\t[RPCEvents.EntitlementCreate]: RPCSubscribeEntitlementCreateArgs;\n\t[RPCEvents.EntitlementDelete]: RPCSubscribeEntitlementDeleteArgs;\n\t[RPCEvents.GameJoin]: RPCSubscribeGameJoinArgs;\n\t[RPCEvents.GameSpectate]: RPCSubscribeGameSpectateArgs;\n\t[RPCEvents.GuildCreate]: RPCSubscribeGuildCreateArgs;\n\t[RPCEvents.GuildStatus]: RPCSubscribeGuildStatusArgs;\n\t[RPCEvents.MessageCreate]: RPCSubscribeMessageCreateArgs;\n\t[RPCEvents.MessageDelete]: RPCSubscribeMessageDeleteArgs;\n\t[RPCEvents.MessageUpdate]: RPCSubscribeMessageUpdateArgs;\n\t[RPCEvents.NotificationCreate]: RPCSubscribeNotificationCreateArgs;\n\t[RPCEvents.Overlay]: RPCSubscribeOverlayArgs;\n\t[RPCEvents.OverlayUpdate]: RPCSubscribeOverlayUpdateArgs;\n\t[RPCEvents.RelationshipUpdate]: RPCSubscribeRelationshipUpdateArgs;\n\t[RPCEvents.SpeakingStart]: RPCSubscribeSpeakingStartArgs;\n\t[RPCEvents.SpeakingStop]: RPCSubscribeSpeakingStopArgs;\n\t[RPCEvents.VoiceChannelSelect]: RPCSubscribeVoiceChannelSelectArgs;\n\t[RPCEvents.VoiceConnectionStatus]: RPCSubscribeVoiceConnectionStatusArgs;\n\t[RPCEvents.VoiceSettingsUpdate]: RPCSubscribeVoiceSettingsUpdateArgs;\n\t[RPCEvents.VoiceSettingsUpdate2]: RPCSubscribeVoiceSettingsUpdate2Args;\n\t[RPCEvents.VoiceStateCreate]: RPCSubscribeVoiceStateCreateArgs;\n\t[RPCEvents.VoiceStateDelete]: RPCSubscribeVoiceStateDeleteArgs;\n\t[RPCEvents.VoiceStateUpdate]: RPCSubscribeVoiceStateUpdateArgs;\n}\n\nexport interface MappedRPCEventsDispatchData {\n\t[RPCEvents.ActivityInvite]: [RPCActivityInviteDispatchData];\n\t[RPCEvents.ActivityJoin]: [RPCActivityJoinDispatchData];\n\t[RPCEvents.ActivityJoinRequest]: [RPCActivityJoinRequestDispatchData];\n\t[RPCEvents.ActivitySpectate]: [RPCActivitySpectateDispatchData];\n\t[RPCEvents.ChannelCreate]: [RPCChannelCreateDispatchData];\n\t[RPCEvents.CurrentUserUpdate]: [RPCCurrentUserUpdateDispatchData];\n\t[RPCEvents.EntitlementCreate]: [RPCEntitlementCreateDispatchData];\n\t[RPCEvents.EntitlementDelete]: [RPCEntitlementDeleteDispatchData];\n\t[RPCEvents.Error]: [RPCErrorDispatchData];\n\t[RPCEvents.GameJoin]: [RPCGameJoinDispatchData];\n\t[RPCEvents.GameSpectate]: [RPCGameSpectateDispatchData];\n\t[RPCEvents.GuildCreate]: [RPCGuildCreateDispatchData];\n\t[RPCEvents.GuildStatus]: [RPCGuildStatusDispatchData];\n\t[RPCEvents.MessageCreate]: [RPCMessageCreateDispatchData];\n\t[RPCEvents.MessageDelete]: [RPCMessageDeleteDispatchData];\n\t[RPCEvents.MessageUpdate]: [RPCMessageUpdateDispatchData];\n\t[RPCEvents.NotificationCreate]: [RPCNotificationCreateDispatchData];\n\t[RPCEvents.Overlay]: [RPCOverlayDispatchData];\n\t[RPCEvents.OverlayUpdate]: [RPCOverlayUpdateDispatchData];\n\t[RPCEvents.Ready]: [RPCReadyDispatchData];\n\t[RPCEvents.RelationshipUpdate]: [RPCRelationshipUpdateDispatchData];\n\t[RPCEvents.SpeakingStart]: [RPCSpeakingStartDispatchData];\n\t[RPCEvents.SpeakingStop]: [RPCSpeakingStopDispatchData];\n\t[RPCEvents.VoiceChannelSelect]: [RPCVoiceChannelSelectDispatchData];\n\t[RPCEvents.VoiceConnectionStatus]: [RPCVoiceConnectionStatusDispatchData];\n\t[RPCEvents.VoiceSettingsUpdate]: [RPCVoiceSettingsUpdateDispatchData];\n\t[RPCEvents.VoiceSettingsUpdate2]: [RPCVoiceSettingsUpdate2DispatchData];\n\t[RPCEvents.VoiceStateCreate]: [RPCVoiceStateCreateDispatchData];\n\t[RPCEvents.VoiceStateDelete]: [RPCVoiceStateDeleteDispatchData];\n\t[RPCEvents.VoiceStateUpdate]: [RPCVoiceStateUpdateDispatchData];\n}\n\nexport interface MappedEvents {\n\t[Events.ApplicationReady]: [];\n\t[Events.Disconnected]: [];\n}\n\nexport type EventAndArgsParameters<Evt extends RPCEvents> = Evt extends RPCEvents.Error | RPCEvents.Ready\n\t? never\n\t: [Evt, MappedRPCSubscribeEventsArgs[Exclude<Evt, RPCEvents.Error | RPCEvents.Ready>], RequestOptions?];\n","import { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport { createConnection, Socket } from 'node:net';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { AsyncEventEmitter } from '@vladfrangu/async_event_emitter';\nimport type { RPCMessagePayload } from 'discord-api-types/v10';\nimport type { RequestOptions, RPCClient } from './client.js';\n\nenum OPCodes {\n\tHandshake,\n\tFrame,\n\tClose,\n\tPing,\n\tPong,\n}\n\ninterface HandshakePayload {\n\tclient_id: string;\n\tv: number;\n}\n\nasync function canOpenFile(path: string): Promise<boolean> {\n\ttry {\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function getIPCPath(id: number) {\n\tif (process.platform === 'win32') {\n\t\treturn String.raw`\\\\?\\pipe\\discord-ipc-${id}`;\n\t}\n\n\t// Unix: check XDG_RUNTIME_DIR, TMPDIR, TMP, TEMP, then /tmp.\n\tconst prefix = process.env.XDG_RUNTIME_DIR ?? process.env.TMPDIR ?? '/tmp';\n\n\t// Flatpak/Snap sandboxes nest the socket under app subdirs.\n\tconst bases = [prefix, path.join(prefix, 'app', 'com.discordapp.Discord'), path.join(prefix, 'snap.discord')];\n\n\tfor (const base of bases) {\n\t\tconst candidate = path.join(base, `discord-ipc-${id}`);\n\t\tif (await canOpenFile(candidate)) return candidate;\n\t}\n\n\treturn path.join(prefix, `discord-ipc-${id}`);\n}\n\nasync function getIPC(id: number): Promise<Socket> {\n\tconst { promise, resolve, reject } = Promise.withResolvers<Socket>();\n\tconst path = await getIPCPath(id);\n\n\tconst onError = async () => reject(new Error('Could not connect'));\n\n\tconst socket = createConnection(path, () => {\n\t\tsocket.removeListener('error', onError);\n\n\t\tresolve(socket);\n\t});\n\n\tsocket.once('error', onError);\n\n\treturn promise;\n}\n\nexport function encode(op: number, data: HandshakePayload | Record<string, never> | RPCMessagePayload | string) {\n\tconst stringifiedData = JSON.stringify(data);\n\tconst length = Buffer.byteLength(stringifiedData);\n\tconst packet = Buffer.allocUnsafe(8 + length);\n\n\tpacket.writeInt32LE(op, 0);\n\tpacket.writeInt32LE(length, 4);\n\tpacket.write(stringifiedData, 8, length);\n\n\treturn packet;\n}\n\ninterface Working {\n\tbuffer: Buffer;\n\tlen: number;\n\top: number;\n}\n\nexport class IPCTransport extends AsyncEventEmitter {\n\tprivate socket: Socket;\n\n\tprivate readonly working: Working;\n\n\tpublic constructor(public readonly client: RPCClient) {\n\t\tsuper();\n\n\t\tthis.socket = new Socket();\n\t\tthis.working = {\n\t\t\top: 0,\n\t\t\tlen: 0,\n\t\t\tbuffer: Buffer.from([]),\n\t\t};\n\t}\n\n\tpublic async connect() {\n\t\tfor (let id = 0; id < 10; id++) {\n\t\t\ttry {\n\t\t\t\tthis.socket = await getIPC(id);\n\t\t\t\tbreak;\n\t\t\t} catch (error: unknown) {\n\t\t\t\tif (id === 9) throw error;\n\t\t\t}\n\t\t}\n\n\t\tthis.socket.on('close', this.onClose.bind(this));\n\t\tthis.socket.on('error', this.onError.bind(this));\n\n\t\tthis.emit('open');\n\n\t\tthis.socket.write(\n\t\t\tencode(OPCodes.Handshake, {\n\t\t\t\tv: 1,\n\t\t\t\tclient_id: this.client.clientId,\n\t\t\t}),\n\t\t);\n\n\t\t// paused for manual read management in this.decode()\n\t\tthis.socket.pause();\n\n\t\tthis.socket.on('readable', this.decode.bind(this));\n\t}\n\n\tprivate async decode() {\n\t\tlet packet: Buffer;\n\t\tconst chunks = [];\n\t\twhile ((packet = this.socket.read()) !== null) {\n\t\t\tchunks.push(packet);\n\t\t}\n\n\t\tif (chunks.length === 0) return;\n\n\t\tconst packets = Buffer.concat([this.working.buffer, ...chunks]);\n\n\t\tif (this.working.buffer.byteLength === 0) {\n\t\t\tthis.working.op = packets.readInt32LE(0);\n\t\t\tthis.working.len = packets.readInt32LE(4);\n\t\t}\n\n\t\tthis.working.buffer = packets;\n\n\t\tconst { op, len } = this.working;\n\t\tlet data;\n\t\ttry {\n\t\t\tdata = JSON.parse(packets.subarray(8, len + 8).toString());\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.working.buffer = Buffer.from([]);\n\n\t\t// Pong and Handshake is done from the client\n\t\tswitch (op) {\n\t\t\tcase OPCodes.Ping:\n\t\t\t\tthis.send(data, OPCodes.Pong);\n\t\t\t\tbreak;\n\t\t\tcase OPCodes.Frame:\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.emit('message', data);\n\t\t\t\tbreak;\n\t\t\tcase OPCodes.Close:\n\t\t\t\tthis.emit('close', data);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic onClose(data: unknown) {\n\t\tthis.socket.removeAllListeners();\n\t\tthis.socket = new Socket();\n\t\tthis.working.buffer = Buffer.from([]);\n\t\tconst error = typeof data === 'boolean' ? new Error('socket closed') : data;\n\t\tthis.emit('close', error);\n\t}\n\n\tpublic onError(error: unknown) {\n\t\tthis.emit('error', error);\n\t}\n\n\tpublic send(data: string, op: OPCodes.Ping): void;\n\tpublic send(data: RPCMessagePayload, op?: OPCodes.Frame | OPCodes.Pong): void;\n\tpublic send(data: Record<string, never>, op: OPCodes.Close): void;\n\tpublic send(data: Record<string, never> | RPCMessagePayload | string, op = OPCodes.Frame) {\n\t\tthis.socket.write(encode(op, data));\n\t}\n\n\tpublic async close(options?: RequestOptions) {\n\t\tconst { promise, resolve, reject } = Promise.withResolvers();\n\t\tconst signal = options?.signal ?? AbortSignal.timeout(10e3);\n\n\t\tconst onAbort = (_: Event) =>\n\t\t\treject(signal.reason instanceof Error ? signal.reason : new Error(String(signal.reason)));\n\n\t\tthis.once('close', (error) => {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\tresolve(error);\n\t\t});\n\n\t\tsignal.addEventListener('abort', onAbort);\n\n\t\tthis.send({}, OPCodes.Close);\n\t\tthis.socket.end();\n\n\t\treturn promise;\n\t}\n\n\t/**\n\t * Manual ping method\n\t */\n\tpublic ping() {\n\t\tthis.send(randomUUID(), OPCodes.Ping);\n\t}\n}\n","import { createRequire } from 'node:module';\n\nexport const register: () => Promise<boolean | unknown> = async () => {\n\tconst require = createRequire(import.meta.url);\n\ttry {\n\t\tconst { app } = require('electron');\n\t\treturn app.setAsDefaultProtocolClient.bind(app);\n\t} catch {\n\t\ttry {\n\t\t\treturn require('register-scheme');\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n};\n\nexport function getPid() {\n\t// eslint-disable-next-line n/prefer-global/process\n\tif (typeof globalThis.process !== 'undefined') {\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\treturn process.pid;\n\t}\n\n\treturn null;\n}\n\nexport function isValidTimestamp(timestamp: number) {\n\treturn Number.isInteger(timestamp) && timestamp >= 0 && timestamp <= 2_147_483_647_000;\n}\n","export * from './client.js';\nexport * from './constants.js';\nexport * from './ipc.js';\nexport * from './RPCEventError.js';\nexport * from './util.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/rpc#readme | @discordjs/rpc} version\n * that you are currently using.\n */\n// This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild\nexport const version = '0.2.0-dev.1788538586-ecea9ed57' as string;\n"],"mappings":"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","names":["randomUUID","AsyncEventEmitter","Events","Buffer","process","path","process","Buffer","require","AsyncEventEmitter","randomUUID"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/RPCEventError.ts","../src/constants.ts","../src/ipc.ts","../src/util.ts","../src/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { AsyncEventEmitter } from '@vladfrangu/async_event_emitter';\nimport type {\n\tRESTPostOAuth2AccessTokenResult,\n\tRESTPostOAuth2AccessTokenURLEncodedData,\n\tRPCCertifiedDevice,\n\tRPCCreateChannelInviteResultData,\n\tRPCGetChannelResultData,\n\tRPCGetChannelsResultData,\n\tRPCGetGuildResultData,\n\tRPCGetGuildsResultData,\n\tRPCGetImageArgs,\n\tRPCGetVoiceSettingsResultData,\n\tRPCMessage,\n\tRPCMessagePayload,\n\tRPCOAuth2Application,\n\tRPCSelectTextChannelArgs,\n\tRPCSelectTextChannelResultData,\n\tRPCSelectVoiceChannelArgs,\n\tRPCSelectVoiceChannelResultData,\n\tRPCSetActivityArgs,\n\tRPCSetCertifiedDevicesResultData,\n\tRPCSetUserVoiceSettingsArgs,\n\tRPCSetUserVoiceSettingsResultData,\n\tRPCSetVoiceSettingsArgs,\n\tRPCUnsubscribeResultData,\n\tAPIUser,\n\tOAuth2Scopes,\n\tSnowflake,\n\tRPCAuthorizeArgs,\n\tRPCCommandSubscribePayload,\n\tRPCSubscribeResultData,\n} from 'discord-api-types/v10';\nimport { RPCEvents, RPCCommands, Routes, RouteBases } from 'discord-api-types/v10';\nimport { RPCEventError } from './RPCEventError.js';\nimport type {\n\tEventAndArgsParameters,\n\tMappedRPCCommandsArgs,\n\tMappedRPCCommandsResultsData,\n\tMappedRPCEventsDispatchData,\n\tRPCCallableCommands,\n} from './constants.js';\nimport { Events } from './constants.js';\nimport { IPCTransport } from './ipc.js';\nimport { getPid, isValidTimestamp } from './util.js';\n\nexport interface RPCClientOptions {\n\t/**\n\t * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant\n\t *\n\t * for authorization requests\n\t */\n\tprompt?: 'consent' | 'none';\n\t/**\n\t * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant\n\t *\n\t * for authorization requests\n\t */\n\tredirectUri?: string;\n\t/**\n\t * An array of scopes\n\t */\n\tscopes?: OAuth2Scopes[];\n\t/**\n\t * the client username\n\t */\n\tusername?: string;\n}\n\nexport interface RPCLoginOptions {\n\t/**\n\t * Access Token\n\t */\n\taccessToken?: string;\n\t/**\n\t * Client id\n\t */\n\tclientId: string;\n\t/**\n\t * Client Secret\n\t */\n\tclientSecret?: string;\n}\n\nexport interface RequestOptions {\n\tsignal?: AbortSignal;\n}\n\n/**\n * The client for interacting with Discord RPC\n */\nexport class RPCClient extends AsyncEventEmitter<MappedRPCEventsDispatchData> {\n\tpublic options: RPCClientOptions;\n\n\tpublic accessToken: string;\n\n\tpublic clientId: string;\n\n\tpublic clientSecret: string;\n\n\tpublic readyTimestamp: number | null;\n\n\tpublic application: RPCOAuth2Application | null;\n\n\tpublic user: APIUser | null;\n\n\t/**\n\t * The transport for the IPC\n\t */\n\tpublic transport: IPCTransport;\n\n\t/**\n\t * Map of nonces being expected from the transport\n\t */\n\treadonly #expectedNonces: Map<\n\t\tstring,\n\t\t{ reject(this: void, reason?: unknown): void; resolve(this: void, value: unknown): void }\n\t>;\n\n\tpublic constructor(options: RPCClientOptions = {}) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\n\t\tthis.accessToken = '';\n\t\tthis.clientId = '';\n\t\tthis.clientSecret = '';\n\t\tthis.readyTimestamp = null;\n\t\tthis.application = null;\n\t\tthis.user = null;\n\n\t\tthis.transport = new IPCTransport(this);\n\t\tthis.transport.on('message', this.#onRpcMessage.bind(this));\n\n\t\tthis.#expectedNonces = new Map();\n\t}\n\n\t/**\n\t * Returns the Date for when the client became ready\n\t */\n\tpublic get readyAt() {\n\t\tif (this.readyTimestamp === null) return null;\n\t\treturn new Date(this.readyTimestamp);\n\t}\n\n\t/**\n\t * Returns true if the client is currently ready\n\t */\n\tpublic get ready() {\n\t\treturn this.readyTimestamp !== null;\n\t}\n\n\t/**\n\t * Search and connect to RPC\n\t */\n\tpublic async connect(options?: RequestOptions) {\n\t\tconst { promise, resolve, reject } = Promise.withResolvers<RPCClient>();\n\n\t\tif (this.ready) {\n\t\t\tresolve(this);\n\t\t\treturn promise;\n\t\t}\n\n\t\tconst signal = options?.signal ?? AbortSignal.timeout(10e3);\n\t\tconst onAbort: (_: Event) => void = (_: Event) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\t\tthis.removeListener(RPCEvents.Ready, onReady);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\t\tthis.transport.removeListener('close', onClose);\n\n\t\t\tconst reason = signal.reason instanceof Error ? signal.reason : new Error(String(signal.reason));\n\t\t\treject(reason);\n\t\t};\n\n\t\tconst onReady = () => {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\tthis.readyTimestamp = Date.now();\n\t\t\tresolve(this);\n\t\t};\n\n\t\tconst onClose = (data: unknown) => {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\tthis.removeListener(RPCEvents.Ready, onReady);\n\t\t\tfor (const expNonce of this.#expectedNonces.values()) {\n\t\t\t\texpNonce.reject(new RPCEventError('connection closed'));\n\t\t\t}\n\n\t\t\tthis.#expectedNonces.clear();\n\n\t\t\tthis.readyTimestamp = null;\n\n\t\t\tthis.emit(Events.Disconnected);\n\t\t\treject(new RPCEventError(JSON.stringify(data)));\n\t\t};\n\n\t\tsignal.addEventListener('abort', onAbort);\n\n\t\tthis.once(RPCEvents.Ready, onReady);\n\n\t\tthis.transport.once('close', onClose);\n\n\t\ttry {\n\t\t\tawait this.transport.connect();\n\t\t} catch (error) {\n\t\t\tthis.readyTimestamp = null;\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\tthis.removeListener(RPCEvents.Ready, onReady);\n\t\t\tthis.transport.removeListener('close', onClose);\n\t\t\treject(error);\n\t\t}\n\n\t\treturn promise;\n\t}\n\n\t/**\n\t * Performs authentication flow. Automatically calls Client#connect if needed.\n\t *\n\t * @example\n\t * logging in with a client id and secret\n\t * ```ts\n\t * client.login({ clientId: '1234567', clientSecret: 'abcdef123' });\n\t * ```\n\t */\n\tpublic async login(\n\t\t{ clientId, clientSecret, accessToken }: RPCLoginOptions,\n\t\toptions?: RequestOptions,\n\t): Promise<RPCClient> {\n\t\tif (!clientId) {\n\t\t\tthrow new Error('A client id must be provided to login');\n\t\t}\n\n\t\tthis.clientId = clientId;\n\n\t\tawait this.connect(options);\n\n\t\tif (!this.options.scopes) {\n\t\t\tthis.emit(Events.ApplicationReady);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (accessToken) {\n\t\t\treturn this.authenticate(accessToken, options);\n\t\t}\n\n\t\tif (!clientSecret) {\n\t\t\tthrow new Error('A client secret must be provided for authorization if scopes are included');\n\t\t}\n\n\t\tthis.clientSecret = clientSecret;\n\n\t\tconst authorizeArgs: RPCAuthorizeArgs = { client_id: this.clientId, scopes: this.options.scopes };\n\t\tif (this.options.username) authorizeArgs.username = this.options.username;\n\n\t\treturn this.authenticate(await this.authorize(authorizeArgs, options), options);\n\t}\n\n\t/**\n\t * Request\n\t *\n\t * @param cmd - Command\n\t * @param args - Arguments\n\t * @param evt - Event\n\t */\n\tpublic async request<Cmd extends RPCCallableCommands = RPCCallableCommands>(\n\t\tcmd: Cmd,\n\t\targs?: MappedRPCCommandsArgs[Cmd],\n\t\toptions?: RequestOptions & { evt?: RPCEvents },\n\t): Promise<MappedRPCCommandsResultsData[Cmd]>;\n\tpublic async request(\n\t\tcmd: RPCCommands.Subscribe | RPCCommands.Unsubscribe,\n\t\targs: RPCCommandSubscribePayload['args'],\n\t\toptions: RequestOptions & { evt: RPCEvents },\n\t): Promise<RPCSubscribeResultData | RPCUnsubscribeResultData>;\n\tpublic async request<Cmd extends RPCCallableCommands = RPCCallableCommands>(\n\t\tcmd: Cmd,\n\t\targs: MappedRPCCommandsArgs[Cmd] = {} as MappedRPCCommandsArgs[Cmd],\n\t\toptions?: RequestOptions & { evt?: RPCEvents },\n\t) {\n\t\tconst signal = options?.signal ?? AbortSignal.timeout(10e3);\n\t\tsignal.throwIfAborted();\n\t\tconst { promise, resolve, reject } = Promise.withResolvers<MappedRPCCommandsResultsData[Cmd]>();\n\t\tconst nonce = randomUUID();\n\t\tconst payload: { args: MappedRPCCommandsArgs[Cmd]; cmd: Cmd; evt?: RPCEvents; nonce: string } = {\n\t\t\tcmd,\n\t\t\targs,\n\t\t\tnonce,\n\t\t};\n\t\tif (cmd === RPCCommands.Subscribe || cmd === RPCCommands.Unsubscribe) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n\t\t\tpayload.evt = options?.evt!;\n\t\t}\n\n\t\tthis.transport.send(payload as RPCMessagePayload);\n\t\tthis.#expectedNonces.set(nonce, { resolve, reject });\n\t\tconst onAbort = (_: Event) => {\n\t\t\tthis.#expectedNonces.delete(nonce);\n\t\t\tconst reason = signal.reason instanceof Error ? signal.reason : new Error(String(signal.reason));\n\t\t\treject(reason);\n\t\t};\n\n\t\tsignal.addEventListener('abort', onAbort, { once: true });\n\n\t\ttry {\n\t\t\treturn await promise;\n\t\t} finally {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t}\n\t}\n\n\t/**\n\t * Message handler\n\t *\n\t * @param message - message\n\t */\n\t#onRpcMessage(message: RPCMessage): void {\n\t\tif (message.cmd === RPCCommands.Dispatch && message.evt === RPCEvents.Ready) {\n\t\t\tif (message.data.user) {\n\t\t\t\tthis.user = message.data.user;\n\t\t\t}\n\n\t\t\tthis.emit(RPCEvents.Ready, message.data);\n\t\t} else if (message.cmd === RPCCommands.Dispatch) {\n\t\t\tthis.emit(message.evt, message.data);\n\t\t} else {\n\t\t\tif (!this.#expectedNonces.has(message.nonce)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { resolve, reject } = this.#expectedNonces.get(message.nonce)!;\n\t\t\tif ('evt' in message && message.evt === RPCEvents.Error) {\n\t\t\t\treject(new RPCEventError(message.data));\n\t\t\t} else {\n\t\t\t\tresolve(message.data);\n\t\t\t}\n\n\t\t\tthis.#expectedNonces.delete(message.nonce);\n\t\t}\n\t}\n\n\t/**\n\t * Authorize\n\t *\n\t * @param args - authorize args\n\t */\n\tprivate async authorize(args: RPCAuthorizeArgs, options?: RequestOptions): Promise<string> {\n\t\tconst { code } = await this.request(RPCCommands.Authorize, args, options);\n\n\t\tconst jsonBody: RESTPostOAuth2AccessTokenURLEncodedData = {\n\t\t\tclient_id: this.clientId,\n\t\t\tclient_secret: this.clientSecret,\n\t\t\tcode,\n\t\t\tgrant_type: 'authorization_code',\n\t\t};\n\n\t\tif (this.options.redirectUri) {\n\t\t\tjsonBody.redirect_uri = this.options.redirectUri;\n\t\t}\n\n\t\tconst response = await fetch(`${RouteBases.api}${Routes.oauth2TokenExchange()}`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams(jsonBody),\n\t\t\t...options,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(response.statusText);\n\t\t}\n\n\t\tconst data = (await response.json()) as RESTPostOAuth2AccessTokenResult;\n\n\t\tif (!('access_token' in data)) {\n\t\t\tthrow new Error(JSON.stringify(response));\n\t\t}\n\n\t\treturn data.access_token;\n\t}\n\n\t/**\n\t * Authenticate\n\t *\n\t * @param accessToken - access token\n\t */\n\tpublic async authenticate(accessToken: string, options?: RequestOptions): Promise<this> {\n\t\tconst { application, user } = await this.request(RPCCommands.Authenticate, { access_token: accessToken }, options);\n\t\tthis.accessToken = accessToken;\n\t\tthis.application = application;\n\t\tthis.user = user;\n\t\tthis.emit(Events.ApplicationReady);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Fetch a guild\n\t *\n\t * @param id - Guild id\n\t * @param timeout - Timeout request\n\t */\n\tpublic async getGuild(id: Snowflake, timeout: number, options?: RequestOptions): Promise<RPCGetGuildResultData> {\n\t\treturn this.request(RPCCommands.GetGuild, { guild_id: id, timeout }, options);\n\t}\n\n\t/**\n\t * Fetch all guilds\n\t *\n\t * @param timeout - Timeout request\n\t */\n\tpublic async getGuilds(timeout: number, options?: RequestOptions): Promise<RPCGetGuildsResultData> {\n\t\treturn this.request(RPCCommands.GetGuilds, { timeout }, options);\n\t}\n\n\t/**\n\t * Get a channel\n\t *\n\t * @param id - Channel id\n\t */\n\tpublic async getChannel(id: Snowflake, options?: RequestOptions): Promise<RPCGetChannelResultData> {\n\t\treturn this.request(RPCCommands.GetChannel, { channel_id: id }, options);\n\t}\n\n\t/**\n\t * Get all channels\n\t *\n\t * @param id - Guild id\n\t */\n\tpublic async getChannels(id: Snowflake, options?: RequestOptions): Promise<RPCGetChannelsResultData['channels']> {\n\t\tconst { channels } = await this.request(RPCCommands.GetChannels, { guild_id: id }, options);\n\t\treturn channels;\n\t}\n\n\t/**\n\t * Create channel invite\n\t *\n\t * @param id - Channel id\n\t */\n\tpublic async createChannelInvite(id: Snowflake, options?: RequestOptions): Promise<RPCCreateChannelInviteResultData> {\n\t\treturn this.request(RPCCommands.CreateChannelInvite, { channel_id: id }, options);\n\t}\n\n\t/**\n\t * Tell discord which devices are certified\n\t *\n\t * @param devices - Certified devices to send to discord\n\t */\n\tpublic async setCertifiedDevices(\n\t\tdevices: RPCCertifiedDevice[],\n\t\toptions?: RequestOptions,\n\t): Promise<RPCSetCertifiedDevicesResultData> {\n\t\treturn this.request(\n\t\t\tRPCCommands.SetCertifiedDevices,\n\t\t\t{\n\t\t\t\tdevices,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Set the voice settings for a user, by id\n\t *\n\t * @param id - Id of the user to set\n\t * @param settings - Settings to set\n\t */\n\tpublic async setUserVoiceSettings(\n\t\tid: Snowflake,\n\t\tsettings: Omit<Partial<RPCSetUserVoiceSettingsArgs>, 'user_id'>,\n\t\toptions?: RequestOptions,\n\t): Promise<RPCSetUserVoiceSettingsResultData> {\n\t\treturn this.request(\n\t\t\tRPCCommands.SetUserVoiceSettings,\n\t\t\t{\n\t\t\t\tuser_id: id,\n\t\t\t\t...settings,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Move the user to a voice channel\n\t *\n\t * @param id - Id of the voice channel\n\t * @param args - select voice channel args\n\t * @param options - request options\n\t */\n\tpublic async selectVoiceChannel(\n\t\tid: Snowflake,\n\t\targs: Omit<RPCSelectVoiceChannelArgs, 'channel_id'> = {},\n\t\toptions?: RequestOptions,\n\t): Promise<RPCSelectVoiceChannelResultData> {\n\t\tconst svcArgs: RPCSelectVoiceChannelArgs = { ...args, channel_id: id };\n\n\t\treturn this.request(RPCCommands.SelectVoiceChannel, svcArgs, options);\n\t}\n\n\t/**\n\t * Move the user to a text channel\n\t *\n\t * @param id - Id of the text channel\n\t * @param args - select text channel args\n\t * @param options - request options\n\t */\n\tpublic async selectTextChannel(\n\t\tid: Snowflake,\n\t\targs: Omit<RPCSelectTextChannelArgs, 'channel_id'> = {},\n\t\toptions?: RequestOptions,\n\t): Promise<RPCSelectTextChannelResultData> {\n\t\tconst stcArgs: RPCSelectTextChannelArgs = { ...args, channel_id: id };\n\n\t\treturn this.request(RPCCommands.SelectTextChannel, stcArgs, options);\n\t}\n\n\t/**\n\t * Get current voice settings\n\t *\n\t */\n\tpublic async getVoiceSettings(options?: RequestOptions): Promise<RPCGetVoiceSettingsResultData> {\n\t\treturn this.request(RPCCommands.GetVoiceSettings, {}, options);\n\t}\n\n\t/**\n\t * Set current voice settings, overriding the current settings until this session disconnects.\n\t * This also locks the settings for any other rpc sessions which may be connected.\n\t *\n\t * @param args - Settings\n\t */\n\tpublic async setVoiceSettings(args: RPCSetVoiceSettingsArgs, options?: RequestOptions): Promise<unknown> {\n\t\treturn this.request(RPCCommands.SetVoiceSettings, args, options);\n\t}\n\n\t/**\n\t * Sets the presence for the logged in user.\n\t *\n\t * @param activity - The rich presence to pass.\n\t * @param pid - The application's process ID. Defaults to the executing process' PID.\n\t * @remarks\n\t * Clients may only update their activity 5 times per 20 seconds.\n\t */\n\tpublic async setActivity(\n\t\tactivity: RPCSetActivityArgs['activity'] = {},\n\t\tpid: number | null = getPid(),\n\t\toptions?: RequestOptions,\n\t): Promise<unknown> {\n\t\tactivity.instance = Boolean(activity.instance);\n\n\t\tif (activity.timestamps) {\n\t\t\tif ('start' in activity.timestamps && !isValidTimestamp(activity.timestamps.start)) {\n\t\t\t\tthrow new RangeError('timestamps.start must fit into a unix timestamp');\n\t\t\t}\n\n\t\t\tif ('end' in activity.timestamps && !isValidTimestamp(activity.timestamps.end)) {\n\t\t\t\tthrow new RangeError('timestamps.end must fit into a unix timestamp');\n\t\t\t}\n\t\t}\n\n\t\treturn this.request(\n\t\t\tRPCCommands.SetActivity,\n\t\t\t{\n\t\t\t\tpid: pid ?? 0,\n\t\t\t\tactivity,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Clears the currently set presence, if any. This will hide the \"Playing X\" message\n\t * displayed below the user's name.\n\t *\n\t * @param pid - The application's process ID. Defaults to the executing process' PID.\n\t */\n\tpublic async clearActivity(pid: number | null = getPid(), options?: RequestOptions): Promise<unknown> {\n\t\treturn this.request(\n\t\t\tRPCCommands.SetActivity,\n\t\t\t{\n\t\t\t\tpid: pid ?? 0,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Invite a user to join the game the RPC user is currently playing\n\t *\n\t * @param userId - The id of the user to invite\n\t */\n\tpublic async sendJoinInvite(userId: Snowflake, options?: RequestOptions): Promise<unknown> {\n\t\treturn this.request(\n\t\t\tRPCCommands.SendActivityJoinInvite,\n\t\t\t{\n\t\t\t\tuser_id: userId,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Reject a join request from a user\n\t *\n\t * @param userId - The id of the user whose request you wish to reject\n\t */\n\tpublic async closeJoinRequest(userId: Snowflake, options?: RequestOptions): Promise<unknown> {\n\t\treturn this.request(\n\t\t\tRPCCommands.CloseActivityJoinRequest,\n\t\t\t{\n\t\t\t\tuser_id: userId,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * requires `relationships.read` scope\n\t */\n\tpublic async getRelationships(options?: RequestOptions) {\n\t\treturn this.request(RPCCommands.GetRelationships, {}, options);\n\t}\n\n\t/**\n\t * Fetches a user\n\t */\n\tpublic async getUser(id: Snowflake, options?: RequestOptions) {\n\t\treturn this.request(RPCCommands.GetUser, { id }, options);\n\t}\n\n\t/**\n\t * Fetches a user's profile picture\n\t */\n\tpublic async getImage(\n\t\t{ id, format, size }: Omit<RPCGetImageArgs, 'type'>,\n\t\toptions?: RequestOptions,\n\t): Promise<string> {\n\t\treturn (await this.request(RPCCommands.GetImage, { type: 'user', id, format, size }, options)).data_url;\n\t}\n\n\t/**\n\t * Subscribe to an event\n\t *\n\t * @param event - Name of event e.g. `MESSAGE_CREATE`\n\t * @param args - Args for event e.g. `{ channel_id: '1234' }`\n\t */\n\tpublic async subscribe<Evt extends RPCEvents>(\n\t\t...[event, args, options]: EventAndArgsParameters<Evt>\n\t): Promise<{ unsubscribe(): Promise<RPCUnsubscribeResultData> }> {\n\t\tawait this.request(RPCCommands.Subscribe, args, { evt: event, ...options });\n\t\treturn {\n\t\t\tunsubscribe: async () => this.request(RPCCommands.Unsubscribe, args, { evt: event, ...options }),\n\t\t};\n\t}\n\n\t/**\n\t * Unsubscribe from an event\n\t *\n\t * @param event - Name of event e.g. `MESSAGE_CREATE`\n\t * @param args - Args for event e.g. `{ channel_id: '1234' }`\n\t */\n\tpublic async unsubscribe<Evt extends RPCEvents>(\n\t\t...[event, args, options]: EventAndArgsParameters<Evt>\n\t): Promise<{ subscribe(): Promise<RPCSubscribeResultData> }> {\n\t\tawait this.request(RPCCommands.Unsubscribe, args, { evt: event, ...options });\n\t\treturn {\n\t\t\tsubscribe: async () => this.request(RPCCommands.Subscribe, args, { evt: event, ...options }),\n\t\t};\n\t}\n\n\t/**\n\t * Destroy the client\n\t */\n\tpublic async destroy() {\n\t\tawait this.transport.close();\n\t}\n}\n","import type { RPCErrorCodes, RPCErrorDispatchData } from 'discord-api-types/v10';\n\nexport class RPCEventError extends Error {\n\tpublic code?: RPCErrorCodes;\n\n\tpublic data?: RPCErrorDispatchData;\n\n\tpublic constructor(data: RPCErrorDispatchData | string) {\n\t\tif (typeof data === 'string') {\n\t\t\tsuper(data);\n\t\t} else {\n\t\t\tsuper(data.message);\n\t\t\tthis.code = data.code;\n\t\t\tthis.data = data;\n\t\t}\n\n\t\tthis.name = 'RPCEventError';\n\t}\n}\n","import type {\n\tRPCAcceptActivityInviteArgs,\n\tRPCAcceptActivityInviteResultData,\n\tRPCActivityInviteDispatchData,\n\tRPCActivityInviteUserArgs,\n\tRPCActivityInviteUserResultData,\n\tRPCActivityJoinDispatchData,\n\tRPCActivityJoinRequestDispatchData,\n\tRPCActivitySpectateDispatchData,\n\tRPCAuthenticateArgs,\n\tRPCAuthenticateResultData,\n\tRPCAuthorizeArgs,\n\tRPCAuthorizeResultData,\n\tRPCBraintreePopupBridgeCallbackArgs,\n\tRPCBraintreePopupBridgeCallbackResultData,\n\tRPCBrowserHandoffArgs,\n\tRPCBrowserHandoffResultData,\n\tRPCChannelCreateDispatchData,\n\tRPCCloseActivityJoinRequestArgs,\n\tRPCCloseActivityJoinRequestResultData,\n\tRPCCommandSubscribePayload,\n\tRPCCommands,\n\tRPCConnectionsCallbackArgs,\n\tRPCConnectionsCallbackResultData,\n\tRPCCreateChannelInviteArgs,\n\tRPCCreateChannelInviteResultData,\n\tRPCCurrentUserUpdateDispatchData,\n\tRPCDeepLinkArgs,\n\tRPCDeepLinkResultData,\n\tRPCEntitlementCreateDispatchData,\n\tRPCEntitlementDeleteDispatchData,\n\tRPCErrorDispatchData,\n\tRPCEvents,\n\tRPCGameJoinDispatchData,\n\tRPCGameSpectateDispatchData,\n\tRPCGetApplicationTicketArgs,\n\tRPCGetApplicationTicketResultData,\n\tRPCGetChannelArgs,\n\tRPCGetChannelResultData,\n\tRPCGetChannelsArgs,\n\tRPCGetChannelsResultData,\n\tRPCGetEntitlementTicketArgs,\n\tRPCGetEntitlementTicketResultData,\n\tRPCGetEntitlementsArgs,\n\tRPCGetEntitlementsResultData,\n\tRPCGetGuildArgs,\n\tRPCGetGuildResultData,\n\tRPCGetGuildsArgs,\n\tRPCGetGuildsResultData,\n\tRPCGetImageArgs,\n\tRPCGetImageResultData,\n\tRPCGetNetworkingConfigArgs,\n\tRPCGetNetworkingConfigResultData,\n\tRPCGetRelationshipsArgs,\n\tRPCGetRelationshipsResultData,\n\tRPCGetSelectedVoiceChannelArgs,\n\tRPCGetSelectedVoiceChannelResultData,\n\tRPCGetSkusArgs,\n\tRPCGetSkusResultData,\n\tRPCGetUserArgs,\n\tRPCGetUserResultData,\n\tRPCGetVoiceSettingsArgs,\n\tRPCGetVoiceSettingsResultData,\n\tRPCGiftCodeBrowserArgs,\n\tRPCGiftCodeBrowserResultData,\n\tRPCGuildCreateDispatchData,\n\tRPCGuildStatusDispatchData,\n\tRPCGuildTemplateBrowserArgs,\n\tRPCGuildTemplateBrowserResultData,\n\tRPCInviteBrowserArgs,\n\tRPCInviteBrowserResultData,\n\tRPCMessageCreateDispatchData,\n\tRPCMessageDeleteDispatchData,\n\tRPCMessageUpdateDispatchData,\n\tRPCNetworkingCreateTokenArgs,\n\tRPCNetworkingCreateTokenResultData,\n\tRPCNetworkingPeerMetricsArgs,\n\tRPCNetworkingPeerMetricsResultData,\n\tRPCNetworkingSystemMetricsArgs,\n\tRPCNetworkingSystemMetricsResultData,\n\tRPCNotificationCreateDispatchData,\n\tRPCOpenOverlayActivityInviteArgs,\n\tRPCOpenOverlayActivityInviteResultData,\n\tRPCOpenOverlayGuildInviteArgs,\n\tRPCOpenOverlayGuildInviteResultData,\n\tRPCOpenOverlayVoiceSettingsArgs,\n\tRPCOpenOverlayVoiceSettingsResultData,\n\tRPCOverlayArgs,\n\tRPCOverlayDispatchData,\n\tRPCOverlayResultData,\n\tRPCOverlayUpdateDispatchData,\n\tRPCReadyDispatchData,\n\tRPCRelationshipUpdateDispatchData,\n\tRPCSelectTextChannelArgs,\n\tRPCSelectTextChannelResultData,\n\tRPCSelectVoiceChannelArgs,\n\tRPCSelectVoiceChannelResultData,\n\tRPCSendActivityJoinInviteArgs,\n\tRPCSendActivityJoinInviteResultData,\n\tRPCSetActivityArgs,\n\tRPCSetActivityResultData,\n\tRPCSetCertifiedDevicesArgs,\n\tRPCSetCertifiedDevicesResultData,\n\tRPCSetOverlayLockedArgs,\n\tRPCSetOverlayLockedResultData,\n\tRPCSetUserVoiceSettings2Args,\n\tRPCSetUserVoiceSettings2ResultData,\n\tRPCSetUserVoiceSettingsArgs,\n\tRPCSetUserVoiceSettingsResultData,\n\tRPCSetVoiceSettings2Args,\n\tRPCSetVoiceSettings2ResultData,\n\tRPCSetVoiceSettingsArgs,\n\tRPCSetVoiceSettingsResultData,\n\tRPCSpeakingStartDispatchData,\n\tRPCSpeakingStopDispatchData,\n\tRPCStartPurchaseArgs,\n\tRPCStartPurchaseResultData,\n\tRPCSubscribeActivityInviteArgs,\n\tRPCSubscribeActivityJoinArgs,\n\tRPCSubscribeActivityJoinRequestArgs,\n\tRPCSubscribeActivitySpectateArgs,\n\tRPCSubscribeChannelCreateArgs,\n\tRPCSubscribeCurrentUserUpdateArgs,\n\tRPCSubscribeEntitlementCreateArgs,\n\tRPCSubscribeEntitlementDeleteArgs,\n\tRPCSubscribeGameJoinArgs,\n\tRPCSubscribeGameSpectateArgs,\n\tRPCSubscribeGuildCreateArgs,\n\tRPCSubscribeGuildStatusArgs,\n\tRPCSubscribeMessageCreateArgs,\n\tRPCSubscribeMessageDeleteArgs,\n\tRPCSubscribeMessageUpdateArgs,\n\tRPCSubscribeNotificationCreateArgs,\n\tRPCSubscribeOverlayArgs,\n\tRPCSubscribeOverlayUpdateArgs,\n\tRPCSubscribeRelationshipUpdateArgs,\n\tRPCSubscribeResultData,\n\tRPCSubscribeSpeakingStartArgs,\n\tRPCSubscribeSpeakingStopArgs,\n\tRPCSubscribeVoiceChannelSelectArgs,\n\tRPCSubscribeVoiceConnectionStatusArgs,\n\tRPCSubscribeVoiceSettingsUpdate2Args,\n\tRPCSubscribeVoiceSettingsUpdateArgs,\n\tRPCSubscribeVoiceStateCreateArgs,\n\tRPCSubscribeVoiceStateDeleteArgs,\n\tRPCSubscribeVoiceStateUpdateArgs,\n\tRPCUnsubscribeResultData,\n\tRPCValidateApplicationArgs,\n\tRPCValidateApplicationResultData,\n\tRPCVoiceChannelSelectDispatchData,\n\tRPCVoiceConnectionStatusDispatchData,\n\tRPCVoiceSettingsUpdate2DispatchData,\n\tRPCVoiceSettingsUpdateDispatchData,\n\tRPCVoiceStateCreateDispatchData,\n\tRPCVoiceStateDeleteDispatchData,\n\tRPCVoiceStateUpdateDispatchData,\n} from 'discord-api-types/v10';\nimport type { RequestOptions } from './client.js';\n\nexport enum Events {\n\tApplicationReady = 'APPLICATION_READY',\n\tDisconnected = 'DISCONNECTED',\n}\n\nexport interface MappedRPCCommandsResultsData {\n\t[RPCCommands.Authorize]: RPCAuthorizeResultData;\n\t[RPCCommands.Authenticate]: RPCAuthenticateResultData;\n\t[RPCCommands.GetChannel]: RPCGetChannelResultData;\n\t[RPCCommands.GetChannels]: RPCGetChannelsResultData;\n\t[RPCCommands.GetGuild]: RPCGetGuildResultData;\n\t[RPCCommands.GetGuilds]: RPCGetGuildsResultData;\n\t[RPCCommands.GetUser]: RPCGetUserResultData;\n\t[RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsResultData;\n\t[RPCCommands.SelectTextChannel]: RPCSelectTextChannelResultData;\n\t[RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelResultData;\n\t[RPCCommands.SetActivity]: RPCSetActivityResultData;\n\t[RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsResultData;\n\t[RPCCommands.Subscribe]: RPCSubscribeResultData;\n\t[RPCCommands.Unsubscribe]: RPCUnsubscribeResultData;\n\t[RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteResultData;\n\t[RPCCommands.ActivityInviteUser]: RPCActivityInviteUserResultData;\n\t[RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackResultData;\n\t[RPCCommands.BrowserHandoff]: RPCBrowserHandoffResultData;\n\t[RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityJoinRequestResultData;\n\t[RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackResultData;\n\t[RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteResultData;\n\t[RPCCommands.DeepLink]: RPCDeepLinkResultData;\n\t[RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketResultData;\n\t[RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketResultData;\n\t[RPCCommands.GetEntitlements]: RPCGetEntitlementsResultData;\n\t[RPCCommands.GetImage]: RPCGetImageResultData;\n\t[RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigResultData;\n\t[RPCCommands.GetRelationships]: RPCGetRelationshipsResultData;\n\t[RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelResultData;\n\t[RPCCommands.GetSkus]: RPCGetSkusResultData;\n\t[RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserResultData;\n\t[RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserResultData;\n\t[RPCCommands.InviteBrowser]: RPCInviteBrowserResultData;\n\t[RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenResultData;\n\t[RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsResultData;\n\t[RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsResultData;\n\t[RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteResultData;\n\t[RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteResultData;\n\t[RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsResultData;\n\t[RPCCommands.Overlay]: RPCOverlayResultData;\n\t[RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteResultData;\n\t[RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesResultData;\n\t[RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedResultData;\n\t[RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsResultData;\n\t[RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2ResultData;\n\t[RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2ResultData;\n\t[RPCCommands.StartPurchase]: RPCStartPurchaseResultData;\n\t[RPCCommands.ValidateApplication]: RPCValidateApplicationResultData;\n}\n\nexport interface MappedRPCCommandsArgs {\n\t[RPCCommands.Authorize]: RPCAuthorizeArgs;\n\t[RPCCommands.Authenticate]: RPCAuthenticateArgs;\n\t[RPCCommands.GetChannel]: RPCGetChannelArgs;\n\t[RPCCommands.GetChannels]: RPCGetChannelsArgs;\n\t[RPCCommands.GetGuild]: RPCGetGuildArgs;\n\t[RPCCommands.GetGuilds]: RPCGetGuildsArgs;\n\t[RPCCommands.GetUser]: RPCGetUserArgs;\n\t[RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsArgs;\n\t[RPCCommands.SelectTextChannel]: RPCSelectTextChannelArgs;\n\t[RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelArgs;\n\t[RPCCommands.SetActivity]: RPCSetActivityArgs;\n\t[RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsArgs;\n\t[RPCCommands.Subscribe]: RPCCommandSubscribePayload['args'];\n\t[RPCCommands.Unsubscribe]: RPCCommandSubscribePayload['args'];\n\t[RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteArgs;\n\t[RPCCommands.ActivityInviteUser]: RPCActivityInviteUserArgs;\n\t[RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackArgs;\n\t[RPCCommands.BrowserHandoff]: RPCBrowserHandoffArgs;\n\t[RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityJoinRequestArgs;\n\t[RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackArgs;\n\t[RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteArgs;\n\t[RPCCommands.DeepLink]: RPCDeepLinkArgs;\n\t[RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketArgs;\n\t[RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketArgs;\n\t[RPCCommands.GetEntitlements]: RPCGetEntitlementsArgs;\n\t[RPCCommands.GetImage]: RPCGetImageArgs;\n\t[RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigArgs;\n\t[RPCCommands.GetRelationships]: RPCGetRelationshipsArgs;\n\t[RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelArgs;\n\t[RPCCommands.GetSkus]: RPCGetSkusArgs;\n\t[RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserArgs;\n\t[RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserArgs;\n\t[RPCCommands.InviteBrowser]: RPCInviteBrowserArgs;\n\t[RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenArgs;\n\t[RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsArgs;\n\t[RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsArgs;\n\t[RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteArgs;\n\t[RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteArgs;\n\t[RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsArgs;\n\t[RPCCommands.Overlay]: RPCOverlayArgs;\n\t[RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteArgs;\n\t[RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesArgs;\n\t[RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedArgs;\n\t[RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsArgs;\n\t[RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2Args;\n\t[RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2Args;\n\t[RPCCommands.StartPurchase]: RPCStartPurchaseArgs;\n\t[RPCCommands.ValidateApplication]: RPCValidateApplicationArgs;\n}\n\nexport type RPCCallableCommands = Exclude<RPCCommands, RPCCommands.Dispatch>;\n\nexport interface MappedRPCSubscribeEventsArgs {\n\t[RPCEvents.ActivityInvite]: RPCSubscribeActivityInviteArgs;\n\t[RPCEvents.ActivityJoin]: RPCSubscribeActivityJoinArgs;\n\t[RPCEvents.ActivityJoinRequest]: RPCSubscribeActivityJoinRequestArgs;\n\t[RPCEvents.ActivitySpectate]: RPCSubscribeActivitySpectateArgs;\n\t[RPCEvents.ChannelCreate]: RPCSubscribeChannelCreateArgs;\n\t[RPCEvents.CurrentUserUpdate]: RPCSubscribeCurrentUserUpdateArgs;\n\t[RPCEvents.EntitlementCreate]: RPCSubscribeEntitlementCreateArgs;\n\t[RPCEvents.EntitlementDelete]: RPCSubscribeEntitlementDeleteArgs;\n\t[RPCEvents.GameJoin]: RPCSubscribeGameJoinArgs;\n\t[RPCEvents.GameSpectate]: RPCSubscribeGameSpectateArgs;\n\t[RPCEvents.GuildCreate]: RPCSubscribeGuildCreateArgs;\n\t[RPCEvents.GuildStatus]: RPCSubscribeGuildStatusArgs;\n\t[RPCEvents.MessageCreate]: RPCSubscribeMessageCreateArgs;\n\t[RPCEvents.MessageDelete]: RPCSubscribeMessageDeleteArgs;\n\t[RPCEvents.MessageUpdate]: RPCSubscribeMessageUpdateArgs;\n\t[RPCEvents.NotificationCreate]: RPCSubscribeNotificationCreateArgs;\n\t[RPCEvents.Overlay]: RPCSubscribeOverlayArgs;\n\t[RPCEvents.OverlayUpdate]: RPCSubscribeOverlayUpdateArgs;\n\t[RPCEvents.RelationshipUpdate]: RPCSubscribeRelationshipUpdateArgs;\n\t[RPCEvents.SpeakingStart]: RPCSubscribeSpeakingStartArgs;\n\t[RPCEvents.SpeakingStop]: RPCSubscribeSpeakingStopArgs;\n\t[RPCEvents.VoiceChannelSelect]: RPCSubscribeVoiceChannelSelectArgs;\n\t[RPCEvents.VoiceConnectionStatus]: RPCSubscribeVoiceConnectionStatusArgs;\n\t[RPCEvents.VoiceSettingsUpdate]: RPCSubscribeVoiceSettingsUpdateArgs;\n\t[RPCEvents.VoiceSettingsUpdate2]: RPCSubscribeVoiceSettingsUpdate2Args;\n\t[RPCEvents.VoiceStateCreate]: RPCSubscribeVoiceStateCreateArgs;\n\t[RPCEvents.VoiceStateDelete]: RPCSubscribeVoiceStateDeleteArgs;\n\t[RPCEvents.VoiceStateUpdate]: RPCSubscribeVoiceStateUpdateArgs;\n}\n\nexport interface MappedRPCEventsDispatchData {\n\t[RPCEvents.ActivityInvite]: [RPCActivityInviteDispatchData];\n\t[RPCEvents.ActivityJoin]: [RPCActivityJoinDispatchData];\n\t[RPCEvents.ActivityJoinRequest]: [RPCActivityJoinRequestDispatchData];\n\t[RPCEvents.ActivitySpectate]: [RPCActivitySpectateDispatchData];\n\t[RPCEvents.ChannelCreate]: [RPCChannelCreateDispatchData];\n\t[RPCEvents.CurrentUserUpdate]: [RPCCurrentUserUpdateDispatchData];\n\t[RPCEvents.EntitlementCreate]: [RPCEntitlementCreateDispatchData];\n\t[RPCEvents.EntitlementDelete]: [RPCEntitlementDeleteDispatchData];\n\t[RPCEvents.Error]: [RPCErrorDispatchData];\n\t[RPCEvents.GameJoin]: [RPCGameJoinDispatchData];\n\t[RPCEvents.GameSpectate]: [RPCGameSpectateDispatchData];\n\t[RPCEvents.GuildCreate]: [RPCGuildCreateDispatchData];\n\t[RPCEvents.GuildStatus]: [RPCGuildStatusDispatchData];\n\t[RPCEvents.MessageCreate]: [RPCMessageCreateDispatchData];\n\t[RPCEvents.MessageDelete]: [RPCMessageDeleteDispatchData];\n\t[RPCEvents.MessageUpdate]: [RPCMessageUpdateDispatchData];\n\t[RPCEvents.NotificationCreate]: [RPCNotificationCreateDispatchData];\n\t[RPCEvents.Overlay]: [RPCOverlayDispatchData];\n\t[RPCEvents.OverlayUpdate]: [RPCOverlayUpdateDispatchData];\n\t[RPCEvents.Ready]: [RPCReadyDispatchData];\n\t[RPCEvents.RelationshipUpdate]: [RPCRelationshipUpdateDispatchData];\n\t[RPCEvents.SpeakingStart]: [RPCSpeakingStartDispatchData];\n\t[RPCEvents.SpeakingStop]: [RPCSpeakingStopDispatchData];\n\t[RPCEvents.VoiceChannelSelect]: [RPCVoiceChannelSelectDispatchData];\n\t[RPCEvents.VoiceConnectionStatus]: [RPCVoiceConnectionStatusDispatchData];\n\t[RPCEvents.VoiceSettingsUpdate]: [RPCVoiceSettingsUpdateDispatchData];\n\t[RPCEvents.VoiceSettingsUpdate2]: [RPCVoiceSettingsUpdate2DispatchData];\n\t[RPCEvents.VoiceStateCreate]: [RPCVoiceStateCreateDispatchData];\n\t[RPCEvents.VoiceStateDelete]: [RPCVoiceStateDeleteDispatchData];\n\t[RPCEvents.VoiceStateUpdate]: [RPCVoiceStateUpdateDispatchData];\n}\n\nexport interface MappedEvents {\n\t[Events.ApplicationReady]: [];\n\t[Events.Disconnected]: [];\n}\n\nexport type EventAndArgsParameters<Evt extends RPCEvents> = Evt extends RPCEvents.Error | RPCEvents.Ready\n\t? never\n\t: [Evt, MappedRPCSubscribeEventsArgs[Exclude<Evt, RPCEvents.Error | RPCEvents.Ready>], RequestOptions?];\n","import { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport { createConnection, Socket } from 'node:net';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { AsyncEventEmitter } from '@vladfrangu/async_event_emitter';\nimport type { RPCMessagePayload } from 'discord-api-types/v10';\nimport type { RequestOptions, RPCClient } from './client.js';\n\nenum OPCodes {\n\tHandshake,\n\tFrame,\n\tClose,\n\tPing,\n\tPong,\n}\n\ninterface HandshakePayload {\n\tclient_id: string;\n\tv: number;\n}\n\nasync function canOpenFile(path: string): Promise<boolean> {\n\ttry {\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function getIPCPath(id: number) {\n\tif (process.platform === 'win32') {\n\t\treturn String.raw`\\\\?\\pipe\\discord-ipc-${id}`;\n\t}\n\n\t// Unix: check XDG_RUNTIME_DIR, TMPDIR, TMP, TEMP, then /tmp.\n\tconst prefix = process.env.XDG_RUNTIME_DIR ?? process.env.TMPDIR ?? '/tmp';\n\n\t// Flatpak/Snap sandboxes nest the socket under app subdirs.\n\tconst bases = [prefix, path.join(prefix, 'app', 'com.discordapp.Discord'), path.join(prefix, 'snap.discord')];\n\n\tfor (const base of bases) {\n\t\tconst candidate = path.join(base, `discord-ipc-${id}`);\n\t\tif (await canOpenFile(candidate)) return candidate;\n\t}\n\n\treturn path.join(prefix, `discord-ipc-${id}`);\n}\n\nasync function getIPC(id: number): Promise<Socket> {\n\tconst { promise, resolve, reject } = Promise.withResolvers<Socket>();\n\tconst path = await getIPCPath(id);\n\n\tconst onError = async () => reject(new Error('Could not connect'));\n\n\tconst socket = createConnection(path, () => {\n\t\tsocket.removeListener('error', onError);\n\n\t\tresolve(socket);\n\t});\n\n\tsocket.once('error', onError);\n\n\treturn promise;\n}\n\nexport function encode(op: number, data: HandshakePayload | Record<string, never> | RPCMessagePayload | string) {\n\tconst stringifiedData = JSON.stringify(data);\n\tconst length = Buffer.byteLength(stringifiedData);\n\tconst packet = Buffer.allocUnsafe(8 + length);\n\n\tpacket.writeInt32LE(op, 0);\n\tpacket.writeInt32LE(length, 4);\n\tpacket.write(stringifiedData, 8, length);\n\n\treturn packet;\n}\n\ninterface Working {\n\tbuffer: Buffer;\n\tlen: number;\n\top: number;\n}\n\nexport class IPCTransport extends AsyncEventEmitter {\n\tprivate socket: Socket;\n\n\tprivate readonly working: Working;\n\n\tpublic constructor(public readonly client: RPCClient) {\n\t\tsuper();\n\n\t\tthis.socket = new Socket();\n\t\tthis.working = {\n\t\t\top: 0,\n\t\t\tlen: 0,\n\t\t\tbuffer: Buffer.from([]),\n\t\t};\n\t}\n\n\tpublic async connect() {\n\t\tfor (let id = 0; id < 10; id++) {\n\t\t\ttry {\n\t\t\t\tthis.socket = await getIPC(id);\n\t\t\t\tbreak;\n\t\t\t} catch (error: unknown) {\n\t\t\t\tif (id === 9) throw error;\n\t\t\t}\n\t\t}\n\n\t\tthis.socket.on('close', this.onClose.bind(this));\n\t\tthis.socket.on('error', this.onError.bind(this));\n\n\t\tthis.emit('open');\n\n\t\tthis.socket.write(\n\t\t\tencode(OPCodes.Handshake, {\n\t\t\t\tv: 1,\n\t\t\t\tclient_id: this.client.clientId,\n\t\t\t}),\n\t\t);\n\n\t\t// paused for manual read management in this.decode()\n\t\tthis.socket.pause();\n\n\t\tthis.socket.on('readable', this.decode.bind(this));\n\t}\n\n\tprivate async decode() {\n\t\tlet packet: Buffer;\n\t\tconst chunks = [];\n\t\twhile ((packet = this.socket.read()) !== null) {\n\t\t\tchunks.push(packet);\n\t\t}\n\n\t\tif (chunks.length === 0) return;\n\n\t\tconst packets = Buffer.concat([this.working.buffer, ...chunks]);\n\n\t\tif (this.working.buffer.byteLength === 0) {\n\t\t\tthis.working.op = packets.readInt32LE(0);\n\t\t\tthis.working.len = packets.readInt32LE(4);\n\t\t}\n\n\t\tthis.working.buffer = packets;\n\n\t\tconst { op, len } = this.working;\n\t\tlet data;\n\t\ttry {\n\t\t\tdata = JSON.parse(packets.subarray(8, len + 8).toString());\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.working.buffer = Buffer.from([]);\n\n\t\t// Pong and Handshake is done from the client\n\t\tswitch (op) {\n\t\t\tcase OPCodes.Ping:\n\t\t\t\tthis.send(data, OPCodes.Pong);\n\t\t\t\tbreak;\n\t\t\tcase OPCodes.Frame:\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.emit('message', data);\n\t\t\t\tbreak;\n\t\t\tcase OPCodes.Close:\n\t\t\t\tthis.emit('close', data);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic onClose(data: unknown) {\n\t\tthis.socket.removeAllListeners();\n\t\tthis.socket = new Socket();\n\t\tthis.working.buffer = Buffer.from([]);\n\t\tconst error = typeof data === 'boolean' ? new Error('socket closed') : data;\n\t\tthis.emit('close', error);\n\t}\n\n\tpublic onError(error: unknown) {\n\t\tthis.emit('error', error);\n\t}\n\n\tpublic send(data: string, op: OPCodes.Ping): void;\n\tpublic send(data: RPCMessagePayload, op?: OPCodes.Frame | OPCodes.Pong): void;\n\tpublic send(data: Record<string, never>, op: OPCodes.Close): void;\n\tpublic send(data: Record<string, never> | RPCMessagePayload | string, op = OPCodes.Frame) {\n\t\tthis.socket.write(encode(op, data));\n\t}\n\n\tpublic async close(options?: RequestOptions) {\n\t\tconst { promise, resolve, reject } = Promise.withResolvers();\n\t\tconst signal = options?.signal ?? AbortSignal.timeout(10e3);\n\n\t\tconst onAbort = (_: Event) =>\n\t\t\treject(signal.reason instanceof Error ? signal.reason : new Error(String(signal.reason)));\n\n\t\tthis.once('close', (error) => {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\tresolve(error);\n\t\t});\n\n\t\tsignal.addEventListener('abort', onAbort);\n\n\t\tthis.send({}, OPCodes.Close);\n\t\tthis.socket.end();\n\n\t\treturn promise;\n\t}\n\n\t/**\n\t * Manual ping method\n\t */\n\tpublic ping() {\n\t\tthis.send(randomUUID(), OPCodes.Ping);\n\t}\n}\n","import { createRequire } from 'node:module';\n\nexport const register: () => Promise<boolean | unknown> = async () => {\n\tconst require = createRequire(import.meta.url);\n\ttry {\n\t\tconst { app } = require('electron');\n\t\treturn app.setAsDefaultProtocolClient.bind(app);\n\t} catch {\n\t\ttry {\n\t\t\treturn require('register-scheme');\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n};\n\nexport function getPid() {\n\t// eslint-disable-next-line n/prefer-global/process\n\tif (typeof globalThis.process !== 'undefined') {\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\treturn process.pid;\n\t}\n\n\treturn null;\n}\n\nexport function isValidTimestamp(timestamp: number) {\n\treturn Number.isInteger(timestamp) && timestamp >= 0 && timestamp <= 2_147_483_647_000;\n}\n","export * from './client.js';\nexport * from './constants.js';\nexport * from './ipc.js';\nexport * from './RPCEventError.js';\nexport * from './util.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/rpc#readme | @discordjs/rpc} version\n * that you are currently using.\n */\n// This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild\nexport const version = '0.2.0-dev.1788566584-096177189' as string;\n"],"mappings":"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","names":["randomUUID","AsyncEventEmitter","Events","Buffer","process","path","process","Buffer","require","AsyncEventEmitter","randomUUID"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@discordjs/rpc",
4
- "version": "0.2.0-dev.1788538586-ecea9ed57",
4
+ "version": "0.2.0-dev.1788566584-096177189",
5
5
  "description": "A simple RPC client for Discord",
6
6
  "exports": {
7
7
  ".": {