@discordjs/rest 0.6.0 → 1.0.1-dev.1658331002-a05386a.0

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.
Files changed (67) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +15 -12
  3. package/dist/index.cjs +31 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.ts +9 -827
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.mjs +9 -985
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/lib/CDN.cjs +87 -0
  10. package/dist/lib/CDN.cjs.map +1 -0
  11. package/dist/lib/CDN.d.ts +199 -0
  12. package/dist/lib/CDN.d.ts.map +1 -0
  13. package/dist/lib/CDN.mjs +83 -0
  14. package/dist/lib/CDN.mjs.map +1 -0
  15. package/dist/lib/REST.cjs +61 -0
  16. package/dist/lib/REST.cjs.map +1 -0
  17. package/dist/lib/REST.d.ts +279 -0
  18. package/dist/lib/REST.d.ts.map +1 -0
  19. package/dist/lib/REST.mjs +57 -0
  20. package/dist/lib/REST.mjs.map +1 -0
  21. package/dist/lib/RequestManager.cjs +223 -0
  22. package/dist/lib/RequestManager.cjs.map +1 -0
  23. package/dist/lib/RequestManager.d.ts +232 -0
  24. package/dist/lib/RequestManager.d.ts.map +1 -0
  25. package/dist/lib/RequestManager.mjs +218 -0
  26. package/dist/lib/RequestManager.mjs.map +1 -0
  27. package/dist/lib/errors/DiscordAPIError.cjs +55 -0
  28. package/dist/lib/errors/DiscordAPIError.cjs.map +1 -0
  29. package/dist/lib/errors/DiscordAPIError.d.ts +53 -0
  30. package/dist/lib/errors/DiscordAPIError.d.ts.map +1 -0
  31. package/dist/lib/errors/DiscordAPIError.mjs +51 -0
  32. package/dist/lib/errors/DiscordAPIError.mjs.map +1 -0
  33. package/dist/lib/errors/HTTPError.cjs +17 -0
  34. package/dist/lib/errors/HTTPError.cjs.map +1 -0
  35. package/dist/lib/errors/HTTPError.d.ts +21 -0
  36. package/dist/lib/errors/HTTPError.d.ts.map +1 -0
  37. package/dist/lib/errors/HTTPError.mjs +13 -0
  38. package/dist/lib/errors/HTTPError.mjs.map +1 -0
  39. package/dist/lib/errors/RateLimitError.cjs +23 -0
  40. package/dist/lib/errors/RateLimitError.cjs.map +1 -0
  41. package/dist/lib/errors/RateLimitError.d.ts +17 -0
  42. package/dist/lib/errors/RateLimitError.d.ts.map +1 -0
  43. package/dist/lib/errors/RateLimitError.mjs +19 -0
  44. package/dist/lib/errors/RateLimitError.mjs.map +1 -0
  45. package/dist/lib/handlers/IHandler.d.ts +9 -0
  46. package/dist/lib/handlers/IHandler.d.ts.map +1 -0
  47. package/dist/lib/handlers/SequentialHandler.cjs +299 -0
  48. package/dist/lib/handlers/SequentialHandler.cjs.map +1 -0
  49. package/dist/lib/handlers/SequentialHandler.d.ts +88 -0
  50. package/dist/lib/handlers/SequentialHandler.d.ts.map +1 -0
  51. package/dist/lib/handlers/SequentialHandler.mjs +295 -0
  52. package/dist/lib/handlers/SequentialHandler.mjs.map +1 -0
  53. package/dist/lib/utils/constants.cjs +49 -0
  54. package/dist/lib/utils/constants.cjs.map +1 -0
  55. package/dist/lib/utils/constants.d.ts +21 -0
  56. package/dist/lib/utils/constants.d.ts.map +1 -0
  57. package/dist/lib/utils/constants.mjs +49 -0
  58. package/dist/lib/utils/constants.mjs.map +1 -0
  59. package/dist/lib/utils/utils.cjs +111 -0
  60. package/dist/lib/utils/utils.cjs.map +1 -0
  61. package/dist/lib/utils/utils.d.ts +32 -0
  62. package/dist/lib/utils/utils.d.ts.map +1 -0
  63. package/dist/lib/utils/utils.mjs +103 -0
  64. package/dist/lib/utils/utils.mjs.map +1 -0
  65. package/package.json +13 -10
  66. package/dist/index.js +0 -1026
  67. package/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CDN.mjs","sources":["../../src/lib/CDN.ts"],"sourcesContent":["import {\n\tALLOWED_EXTENSIONS,\n\tALLOWED_SIZES,\n\tALLOWED_STICKER_EXTENSIONS,\n\tDefaultRestOptions,\n\tImageExtension,\n\tImageSize,\n\tStickerExtension,\n} from './utils/constants';\n\n/**\n * The options used for image URLs\n */\nexport interface BaseImageURLOptions {\n\t/**\n\t * The extension to use for the image URL\n\t *\n\t * @default 'webp'\n\t */\n\textension?: ImageExtension;\n\t/**\n\t * The size specified in the image URL\n\t */\n\tsize?: ImageSize;\n}\n\n/**\n * The options used for image URLs with animated content\n */\nexport interface ImageURLOptions extends BaseImageURLOptions {\n\t/**\n\t * Whether or not to prefer the static version of an image asset.\n\t */\n\tforceStatic?: boolean;\n}\n\n/**\n * The options to use when making a CDN URL\n */\nexport interface MakeURLOptions {\n\t/**\n\t * The extension to use for the image URL\n\t *\n\t * @default 'webp'\n\t */\n\textension?: string | undefined;\n\t/**\n\t * The size specified in the image URL\n\t */\n\tsize?: ImageSize;\n\t/**\n\t * The allowed extensions that can be used\n\t */\n\tallowedExtensions?: ReadonlyArray<string>;\n}\n\n/**\n * The CDN link builder\n */\nexport class CDN {\n\tpublic constructor(private readonly base: string = DefaultRestOptions.cdn) {}\n\n\t/**\n\t * Generates an app asset URL for a client's asset.\n\t *\n\t * @param clientId - The client id that has the asset\n\t * @param assetHash - The hash provided by Discord for this asset\n\t * @param options - Optional options for the asset\n\t */\n\tpublic appAsset(clientId: string, assetHash: string, options?: Readonly<BaseImageURLOptions>): string {\n\t\treturn this.makeURL(`/app-assets/${clientId}/${assetHash}`, options);\n\t}\n\n\t/**\n\t * Generates an app icon URL for a client's icon.\n\t *\n\t * @param clientId - The client id that has the icon\n\t * @param iconHash - The hash provided by Discord for this icon\n\t * @param options - Optional options for the icon\n\t */\n\tpublic appIcon(clientId: string, iconHash: string, options?: Readonly<BaseImageURLOptions>): string {\n\t\treturn this.makeURL(`/app-icons/${clientId}/${iconHash}`, options);\n\t}\n\n\t/**\n\t * Generates an avatar URL, e.g. for a user or a webhook.\n\t *\n\t * @param id - The id that has the icon\n\t * @param avatarHash - The hash provided by Discord for this avatar\n\t * @param options - Optional options for the avatar\n\t */\n\tpublic avatar(id: string, avatarHash: string, options?: Readonly<ImageURLOptions>): string {\n\t\treturn this.dynamicMakeURL(`/avatars/${id}/${avatarHash}`, avatarHash, options);\n\t}\n\n\t/**\n\t * Generates a banner URL, e.g. for a user or a guild.\n\t *\n\t * @param id - The id that has the banner splash\n\t * @param bannerHash - The hash provided by Discord for this banner\n\t * @param options - Optional options for the banner\n\t */\n\tpublic banner(id: string, bannerHash: string, options?: Readonly<ImageURLOptions>): string {\n\t\treturn this.dynamicMakeURL(`/banners/${id}/${bannerHash}`, bannerHash, options);\n\t}\n\n\t/**\n\t * Generates an icon URL for a channel, e.g. a group DM.\n\t *\n\t * @param channelId - The channel id that has the icon\n\t * @param iconHash - The hash provided by Discord for this channel\n\t * @param options - Optional options for the icon\n\t */\n\tpublic channelIcon(channelId: string, iconHash: string, options?: Readonly<BaseImageURLOptions>): string {\n\t\treturn this.makeURL(`/channel-icons/${channelId}/${iconHash}`, options);\n\t}\n\n\t/**\n\t * Generates the default avatar URL for a discriminator.\n\t *\n\t * @param discriminator - The discriminator modulo 5\n\t */\n\tpublic defaultAvatar(discriminator: number): string {\n\t\treturn this.makeURL(`/embed/avatars/${discriminator}`, { extension: 'png' });\n\t}\n\n\t/**\n\t * Generates a discovery splash URL for a guild's discovery splash.\n\t *\n\t * @param guildId - The guild id that has the discovery splash\n\t * @param splashHash - The hash provided by Discord for this splash\n\t * @param options - Optional options for the splash\n\t */\n\tpublic discoverySplash(guildId: string, splashHash: string, options?: Readonly<BaseImageURLOptions>): string {\n\t\treturn this.makeURL(`/discovery-splashes/${guildId}/${splashHash}`, options);\n\t}\n\n\t/**\n\t * Generates an emoji's URL for an emoji.\n\t *\n\t * @param emojiId - The emoji id\n\t * @param extension - The extension of the emoji\n\t */\n\tpublic emoji(emojiId: string, extension?: ImageExtension): string {\n\t\treturn this.makeURL(`/emojis/${emojiId}`, { extension });\n\t}\n\n\t/**\n\t * Generates a guild member avatar URL.\n\t *\n\t * @param guildId - The id of the guild\n\t * @param userId - The id of the user\n\t * @param avatarHash - The hash provided by Discord for this avatar\n\t * @param options - Optional options for the avatar\n\t */\n\tpublic guildMemberAvatar(\n\t\tguildId: string,\n\t\tuserId: string,\n\t\tavatarHash: string,\n\t\toptions?: Readonly<ImageURLOptions>,\n\t): string {\n\t\treturn this.dynamicMakeURL(`/guilds/${guildId}/users/${userId}/avatars/${avatarHash}`, avatarHash, options);\n\t}\n\n\t/**\n\t * Generates a guild member banner URL.\n\t *\n\t * @param guildId - The id of the guild\n\t * @param userId - The id of the user\n\t * @param bannerHash - The hash provided by Discord for this banner\n\t * @param options - Optional options for the banner\n\t */\n\tpublic guildMemberBanner(\n\t\tguildId: string,\n\t\tuserId: string,\n\t\tbannerHash: string,\n\t\toptions?: Readonly<ImageURLOptions>,\n\t): string {\n\t\treturn this.dynamicMakeURL(`/guilds/${guildId}/users/${userId}/banner`, bannerHash, options);\n\t}\n\n\t/**\n\t * Generates an icon URL, e.g. for a guild.\n\t *\n\t * @param id - The id that has the icon splash\n\t * @param iconHash - The hash provided by Discord for this icon\n\t * @param options - Optional options for the icon\n\t */\n\tpublic icon(id: string, iconHash: string, options?: Readonly<ImageURLOptions>): string {\n\t\treturn this.dynamicMakeURL(`/icons/${id}/${iconHash}`, iconHash, options);\n\t}\n\n\t/**\n\t * Generates a URL for the icon of a role\n\t * @param roleId - The id of the role that has the icon\n\t * @param roleIconHash - The hash provided by Discord for this role icon\n\t * @param options - Optional options for the role icon\n\t */\n\tpublic roleIcon(roleId: string, roleIconHash: string, options?: Readonly<BaseImageURLOptions>): string {\n\t\treturn this.makeURL(`/role-icons/${roleId}/${roleIconHash}`, options);\n\t}\n\n\t/**\n\t * Generates a guild invite splash URL for a guild's invite splash.\n\t *\n\t * @param guildId - The guild id that has the invite splash\n\t * @param splashHash - The hash provided by Discord for this splash\n\t * @param options - Optional options for the splash\n\t */\n\tpublic splash(guildId: string, splashHash: string, options?: Readonly<BaseImageURLOptions>): string {\n\t\treturn this.makeURL(`/splashes/${guildId}/${splashHash}`, options);\n\t}\n\n\t/**\n\t * Generates a sticker URL.\n\t *\n\t * @param stickerId - The sticker id\n\t * @param extension - The extension of the sticker\n\t */\n\tpublic sticker(stickerId: string, extension?: StickerExtension): string {\n\t\treturn this.makeURL(`/stickers/${stickerId}`, {\n\t\t\tallowedExtensions: ALLOWED_STICKER_EXTENSIONS,\n\t\t\textension: extension ?? 'png', // Stickers cannot have a `.webp` extension, so we default to a `.png`\n\t\t});\n\t}\n\n\t/**\n\t * Generates a sticker pack banner URL.\n\t *\n\t * @param bannerId - The banner id\n\t * @param options - Optional options for the banner\n\t */\n\tpublic stickerPackBanner(bannerId: string, options?: Readonly<BaseImageURLOptions>): string {\n\t\treturn this.makeURL(`/app-assets/710982414301790216/store/${bannerId}`, options);\n\t}\n\n\t/**\n\t * Generates a team icon URL for a team's icon.\n\t *\n\t * @param teamId - The team id that has the icon\n\t * @param iconHash - The hash provided by Discord for this icon\n\t * @param options - Optional options for the icon\n\t */\n\tpublic teamIcon(teamId: string, iconHash: string, options?: Readonly<BaseImageURLOptions>): string {\n\t\treturn this.makeURL(`/team-icons/${teamId}/${iconHash}`, options);\n\t}\n\n\t/**\n\t * Generates a cover image for a guild scheduled event.\n\t *\n\t * @param scheduledEventId - The scheduled event id\n\t * @param coverHash - The hash provided by discord for this cover image\n\t * @param options - Optional options for the cover image\n\t */\n\tpublic guildScheduledEventCover(\n\t\tscheduledEventId: string,\n\t\tcoverHash: string,\n\t\toptions?: Readonly<BaseImageURLOptions>,\n\t): string {\n\t\treturn this.makeURL(`/guild-events/${scheduledEventId}/${coverHash}`, options);\n\t}\n\n\t/**\n\t * Constructs the URL for the resource, checking whether or not `hash` starts with `a_` if `dynamic` is set to `true`.\n\t *\n\t * @param route - The base cdn route\n\t * @param hash - The hash provided by Discord for this icon\n\t * @param options - Optional options for the link\n\t */\n\tprivate dynamicMakeURL(\n\t\troute: string,\n\t\thash: string,\n\t\t{ forceStatic = false, ...options }: Readonly<ImageURLOptions> = {},\n\t): string {\n\t\treturn this.makeURL(route, !forceStatic && hash.startsWith('a_') ? { ...options, extension: 'gif' } : options);\n\t}\n\n\t/**\n\t * Constructs the URL for the resource\n\t *\n\t * @param route - The base cdn route\n\t * @param options - The extension/size options for the link\n\t */\n\tprivate makeURL(\n\t\troute: string,\n\t\t{ allowedExtensions = ALLOWED_EXTENSIONS, extension = 'webp', size }: Readonly<MakeURLOptions> = {},\n\t): string {\n\t\textension = String(extension).toLowerCase();\n\n\t\tif (!allowedExtensions.includes(extension)) {\n\t\t\tthrow new RangeError(`Invalid extension provided: ${extension}\\nMust be one of: ${allowedExtensions.join(', ')}`);\n\t\t}\n\n\t\tif (size && !ALLOWED_SIZES.includes(size)) {\n\t\t\tthrow new RangeError(`Invalid size provided: ${size}\\nMust be one of: ${ALLOWED_SIZES.join(', ')}`);\n\t\t}\n\n\t\tconst url = new URL(`${this.base}${route}.${extension}`);\n\n\t\tif (size) {\n\t\t\turl.searchParams.set('size', String(size));\n\t\t}\n\n\t\treturn url.toString();\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const node_events = require('node:events');
6
+ const CDN = require('./CDN.cjs');
7
+ const RequestManager = require('./RequestManager.cjs');
8
+ const constants = require('./utils/constants.cjs');
9
+ const utils = require('./utils/utils.cjs');
10
+
11
+ class REST extends node_events.EventEmitter {
12
+ constructor(options = {}) {
13
+ super();
14
+ this.cdn = new CDN.CDN(options.cdn ?? constants.DefaultRestOptions.cdn);
15
+ this.requestManager = new RequestManager.RequestManager(options).on(constants.RESTEvents.Debug, this.emit.bind(this, constants.RESTEvents.Debug)).on(constants.RESTEvents.RateLimited, this.emit.bind(this, constants.RESTEvents.RateLimited)).on(constants.RESTEvents.InvalidRequestWarning, this.emit.bind(this, constants.RESTEvents.InvalidRequestWarning)).on(constants.RESTEvents.HashSweep, this.emit.bind(this, constants.RESTEvents.HashSweep));
16
+ this.on("newListener", (name, listener) => {
17
+ if (name === constants.RESTEvents.Response)
18
+ this.requestManager.on(name, listener);
19
+ });
20
+ this.on("removeListener", (name, listener) => {
21
+ if (name === constants.RESTEvents.Response)
22
+ this.requestManager.off(name, listener);
23
+ });
24
+ }
25
+ getAgent() {
26
+ return this.requestManager.agent;
27
+ }
28
+ setAgent(agent) {
29
+ this.requestManager.setAgent(agent);
30
+ return this;
31
+ }
32
+ setToken(token) {
33
+ this.requestManager.setToken(token);
34
+ return this;
35
+ }
36
+ get(fullRoute, options = {}) {
37
+ return this.request({ ...options, fullRoute, method: RequestManager.RequestMethod.Get });
38
+ }
39
+ delete(fullRoute, options = {}) {
40
+ return this.request({ ...options, fullRoute, method: RequestManager.RequestMethod.Delete });
41
+ }
42
+ post(fullRoute, options = {}) {
43
+ return this.request({ ...options, fullRoute, method: RequestManager.RequestMethod.Post });
44
+ }
45
+ put(fullRoute, options = {}) {
46
+ return this.request({ ...options, fullRoute, method: RequestManager.RequestMethod.Put });
47
+ }
48
+ patch(fullRoute, options = {}) {
49
+ return this.request({ ...options, fullRoute, method: RequestManager.RequestMethod.Patch });
50
+ }
51
+ async request(options) {
52
+ const response = await this.raw(options);
53
+ return utils.parseResponse(response);
54
+ }
55
+ raw(options) {
56
+ return this.requestManager.queueRequest(options);
57
+ }
58
+ }
59
+
60
+ exports.REST = REST;
61
+ //# sourceMappingURL=REST.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"REST.cjs","sources":["../../src/lib/REST.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { Collection } from '@discordjs/collection';\nimport type { request, Dispatcher } from 'undici';\nimport { CDN } from './CDN';\nimport {\n\tHandlerRequestData,\n\tInternalRequest,\n\tRequestData,\n\tRequestManager,\n\tRequestMethod,\n\tRouteLike,\n} from './RequestManager';\nimport type { HashData } from './RequestManager';\nimport type { IHandler } from './handlers/IHandler';\nimport { DefaultRestOptions, RESTEvents } from './utils/constants';\nimport { parseResponse } from './utils/utils';\n\n/**\n * Options to be passed when creating the REST instance\n */\nexport interface RESTOptions {\n\t/**\n\t * The agent to set globally\n\t */\n\tagent: Dispatcher;\n\t/**\n\t * The base api path, without version\n\t * @default 'https://discord.com/api'\n\t */\n\tapi: string;\n\t/**\n\t * The authorization prefix to use for requests, useful if you want to use\n\t * bearer tokens\n\t *\n\t * @default 'Bot'\n\t */\n\tauthPrefix: 'Bot' | 'Bearer';\n\t/**\n\t * The cdn path\n\t *\n\t * @default 'https://cdn.discordapp.com'\n\t */\n\tcdn: string;\n\t/**\n\t * Additional headers to send for all API requests\n\t *\n\t * @default {}\n\t */\n\theaders: Record<string, string>;\n\t/**\n\t * The number of invalid REST requests (those that return 401, 403, or 429) in a 10 minute window between emitted warnings (0 for no warnings).\n\t * That is, if set to 500, warnings will be emitted at invalid request number 500, 1000, 1500, and so on.\n\t *\n\t * @default 0\n\t */\n\tinvalidRequestWarningInterval: number;\n\t/**\n\t * How many requests to allow sending per second (Infinity for unlimited, 50 for the standard global limit used by Discord)\n\t *\n\t * @default 50\n\t */\n\tglobalRequestsPerSecond: number;\n\t/**\n\t * The extra offset to add to rate limits in milliseconds\n\t *\n\t * @default 50\n\t */\n\toffset: number;\n\t/**\n\t * Determines how rate limiting and pre-emptive throttling should be handled.\n\t * When an array of strings, each element is treated as a prefix for the request route\n\t * (e.g. `/channels` to match any route starting with `/channels` such as `/channels/:id/messages`)\n\t * for which to throw {@link RateLimitError}s. All other request routes will be queued normally\n\t *\n\t * @default null\n\t */\n\trejectOnRateLimit: string[] | RateLimitQueueFilter | null;\n\t/**\n\t * The number of retries for errors with the 500 code, or errors\n\t * that timeout\n\t *\n\t * @default 3\n\t */\n\tretries: number;\n\t/**\n\t * The time to wait in milliseconds before a request is aborted\n\t *\n\t * @default 15_000\n\t */\n\ttimeout: number;\n\t/**\n\t * Extra information to add to the user agent\n\t *\n\t * @default `Node.js ${process.version}`\n\t */\n\tuserAgentAppendix: string;\n\t/**\n\t * The version of the API to use\n\t *\n\t * @default '10'\n\t */\n\tversion: string;\n\t/**\n\t * The amount of time in milliseconds that passes between each hash sweep. (defaults to 4h)\n\t *\n\t * @default 14_400_000\n\t */\n\thashSweepInterval: number;\n\t/**\n\t * The maximum amount of time a hash can exist in milliseconds without being hit with a request (defaults to 24h)\n\t *\n\t * @default 86_400_000\n\t */\n\thashLifetime: number;\n\t/**\n\t * The amount of time in milliseconds that passes between each hash sweep. (defaults to 1h)\n\t *\n\t * @default 3_600_000\n\t */\n\thandlerSweepInterval: number;\n}\n\n/**\n * Data emitted on `RESTEvents.RateLimited`\n */\nexport interface RateLimitData {\n\t/**\n\t * The time, in milliseconds, until the request-lock is reset\n\t */\n\ttimeToReset: number;\n\t/**\n\t * The amount of requests we can perform before locking requests\n\t */\n\tlimit: number;\n\t/**\n\t * The HTTP method being performed\n\t */\n\tmethod: string;\n\t/**\n\t * The bucket hash for this request\n\t */\n\thash: string;\n\t/**\n\t * The full URL for this request\n\t */\n\turl: string;\n\t/**\n\t * The route being hit in this request\n\t */\n\troute: string;\n\t/**\n\t * The major parameter of the route\n\t *\n\t * For example, in `/channels/x`, this will be `x`.\n\t * If there is no major parameter (e.g: `/bot/gateway`) this will be `global`.\n\t */\n\tmajorParameter: string;\n\t/**\n\t * Whether the rate limit that was reached was the global limit\n\t */\n\tglobal: boolean;\n}\n\n/**\n * A function that determines whether the rate limit hit should throw an Error\n */\nexport type RateLimitQueueFilter = (rateLimitData: RateLimitData) => boolean | Promise<boolean>;\n\nexport interface APIRequest {\n\t/**\n\t * The HTTP method used in this request\n\t */\n\tmethod: string;\n\t/**\n\t * The full path used to make the request\n\t */\n\tpath: RouteLike;\n\t/**\n\t * The API route identifying the ratelimit for this request\n\t */\n\troute: string;\n\t/**\n\t * Additional HTTP options for this request\n\t */\n\toptions: RequestOptions;\n\t/**\n\t * The data that was used to form the body of this request\n\t */\n\tdata: HandlerRequestData;\n\t/**\n\t * The number of times this request has been attempted\n\t */\n\tretries: number;\n}\n\nexport interface InvalidRequestWarningData {\n\t/**\n\t * Number of invalid requests that have been made in the window\n\t */\n\tcount: number;\n\t/**\n\t * Time in milliseconds remaining before the count resets\n\t */\n\tremainingTime: number;\n}\n\nexport interface RestEvents {\n\tinvalidRequestWarning: [invalidRequestInfo: InvalidRequestWarningData];\n\trestDebug: [info: string];\n\trateLimited: [rateLimitInfo: RateLimitData];\n\tresponse: [request: APIRequest, response: Dispatcher.ResponseData];\n\tnewListener: [name: string, listener: (...args: any) => void];\n\tremoveListener: [name: string, listener: (...args: any) => void];\n\thashSweep: [sweptHashes: Collection<string, HashData>];\n\thandlerSweep: [sweptHandlers: Collection<string, IHandler>];\n}\n\nexport interface REST {\n\ton: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &\n\t\t(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);\n\n\tonce: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &\n\t\t(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);\n\n\temit: (<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]) => boolean) &\n\t\t(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]) => boolean);\n\n\toff: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &\n\t\t(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);\n\n\tremoveAllListeners: (<K extends keyof RestEvents>(event?: K) => this) &\n\t\t(<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>) => this);\n}\n\nexport type RequestOptions = Exclude<Parameters<typeof request>[1], undefined>;\n\nexport class REST extends EventEmitter {\n\tpublic readonly cdn: CDN;\n\tpublic readonly requestManager: RequestManager;\n\n\tpublic constructor(options: Partial<RESTOptions> = {}) {\n\t\tsuper();\n\t\tthis.cdn = new CDN(options.cdn ?? DefaultRestOptions.cdn);\n\t\tthis.requestManager = new RequestManager(options)\n\t\t\t.on(RESTEvents.Debug, this.emit.bind(this, RESTEvents.Debug))\n\t\t\t.on(RESTEvents.RateLimited, this.emit.bind(this, RESTEvents.RateLimited))\n\t\t\t.on(RESTEvents.InvalidRequestWarning, this.emit.bind(this, RESTEvents.InvalidRequestWarning))\n\t\t\t.on(RESTEvents.HashSweep, this.emit.bind(this, RESTEvents.HashSweep));\n\n\t\tthis.on('newListener', (name, listener) => {\n\t\t\tif (name === RESTEvents.Response) this.requestManager.on(name, listener);\n\t\t});\n\t\tthis.on('removeListener', (name, listener) => {\n\t\t\tif (name === RESTEvents.Response) this.requestManager.off(name, listener);\n\t\t});\n\t}\n\n\t/**\n\t * Gets the agent set for this instance\n\t */\n\tpublic getAgent() {\n\t\treturn this.requestManager.agent;\n\t}\n\n\t/**\n\t * Sets the default agent to use for requests performed by this instance\n\t *\n\t * @param agent - Sets the agent to use\n\t */\n\tpublic setAgent(agent: Dispatcher) {\n\t\tthis.requestManager.setAgent(agent);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the authorization token that should be used for requests\n\t *\n\t * @param token - The authorization token to use\n\t */\n\tpublic setToken(token: string) {\n\t\tthis.requestManager.setToken(token);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Runs a get request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic get(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Get });\n\t}\n\n\t/**\n\t * Runs a delete request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic delete(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Delete });\n\t}\n\n\t/**\n\t * Runs a post request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic post(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Post });\n\t}\n\n\t/**\n\t * Runs a put request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic put(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Put });\n\t}\n\n\t/**\n\t * Runs a patch request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic patch(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Patch });\n\t}\n\n\t/**\n\t * Runs a request from the api\n\t *\n\t * @param options - Request options\n\t */\n\tpublic async request(options: InternalRequest) {\n\t\tconst response = await this.raw(options);\n\t\treturn parseResponse(response);\n\t}\n\n\t/**\n\t * Runs a request from the API, yielding the raw Response object\n\t *\n\t * @param options - Request options\n\t */\n\tpublic raw(options: InternalRequest) {\n\t\treturn this.requestManager.queueRequest(options);\n\t}\n}\n"],"names":["EventEmitter","CDN","DefaultRestOptions","RequestManager","RESTEvents","RequestMethod","parseResponse"],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'node:events';
3
+ import type { Collection } from '@discordjs/collection';
4
+ import type { request, Dispatcher } from 'undici';
5
+ import { CDN } from './CDN';
6
+ import { HandlerRequestData, InternalRequest, RequestData, RequestManager, RouteLike } from './RequestManager';
7
+ import type { HashData } from './RequestManager';
8
+ import type { IHandler } from './handlers/IHandler';
9
+ /**
10
+ * Options to be passed when creating the REST instance
11
+ */
12
+ export interface RESTOptions {
13
+ /**
14
+ * The agent to set globally
15
+ */
16
+ agent: Dispatcher;
17
+ /**
18
+ * The base api path, without version
19
+ * @default 'https://discord.com/api'
20
+ */
21
+ api: string;
22
+ /**
23
+ * The authorization prefix to use for requests, useful if you want to use
24
+ * bearer tokens
25
+ *
26
+ * @default 'Bot'
27
+ */
28
+ authPrefix: 'Bot' | 'Bearer';
29
+ /**
30
+ * The cdn path
31
+ *
32
+ * @default 'https://cdn.discordapp.com'
33
+ */
34
+ cdn: string;
35
+ /**
36
+ * Additional headers to send for all API requests
37
+ *
38
+ * @default {}
39
+ */
40
+ headers: Record<string, string>;
41
+ /**
42
+ * The number of invalid REST requests (those that return 401, 403, or 429) in a 10 minute window between emitted warnings (0 for no warnings).
43
+ * That is, if set to 500, warnings will be emitted at invalid request number 500, 1000, 1500, and so on.
44
+ *
45
+ * @default 0
46
+ */
47
+ invalidRequestWarningInterval: number;
48
+ /**
49
+ * How many requests to allow sending per second (Infinity for unlimited, 50 for the standard global limit used by Discord)
50
+ *
51
+ * @default 50
52
+ */
53
+ globalRequestsPerSecond: number;
54
+ /**
55
+ * The extra offset to add to rate limits in milliseconds
56
+ *
57
+ * @default 50
58
+ */
59
+ offset: number;
60
+ /**
61
+ * Determines how rate limiting and pre-emptive throttling should be handled.
62
+ * When an array of strings, each element is treated as a prefix for the request route
63
+ * (e.g. `/channels` to match any route starting with `/channels` such as `/channels/:id/messages`)
64
+ * for which to throw {@link RateLimitError}s. All other request routes will be queued normally
65
+ *
66
+ * @default null
67
+ */
68
+ rejectOnRateLimit: string[] | RateLimitQueueFilter | null;
69
+ /**
70
+ * The number of retries for errors with the 500 code, or errors
71
+ * that timeout
72
+ *
73
+ * @default 3
74
+ */
75
+ retries: number;
76
+ /**
77
+ * The time to wait in milliseconds before a request is aborted
78
+ *
79
+ * @default 15_000
80
+ */
81
+ timeout: number;
82
+ /**
83
+ * Extra information to add to the user agent
84
+ *
85
+ * @default `Node.js ${process.version}`
86
+ */
87
+ userAgentAppendix: string;
88
+ /**
89
+ * The version of the API to use
90
+ *
91
+ * @default '10'
92
+ */
93
+ version: string;
94
+ /**
95
+ * The amount of time in milliseconds that passes between each hash sweep. (defaults to 4h)
96
+ *
97
+ * @default 14_400_000
98
+ */
99
+ hashSweepInterval: number;
100
+ /**
101
+ * The maximum amount of time a hash can exist in milliseconds without being hit with a request (defaults to 24h)
102
+ *
103
+ * @default 86_400_000
104
+ */
105
+ hashLifetime: number;
106
+ /**
107
+ * The amount of time in milliseconds that passes between each hash sweep. (defaults to 1h)
108
+ *
109
+ * @default 3_600_000
110
+ */
111
+ handlerSweepInterval: number;
112
+ }
113
+ /**
114
+ * Data emitted on `RESTEvents.RateLimited`
115
+ */
116
+ export interface RateLimitData {
117
+ /**
118
+ * The time, in milliseconds, until the request-lock is reset
119
+ */
120
+ timeToReset: number;
121
+ /**
122
+ * The amount of requests we can perform before locking requests
123
+ */
124
+ limit: number;
125
+ /**
126
+ * The HTTP method being performed
127
+ */
128
+ method: string;
129
+ /**
130
+ * The bucket hash for this request
131
+ */
132
+ hash: string;
133
+ /**
134
+ * The full URL for this request
135
+ */
136
+ url: string;
137
+ /**
138
+ * The route being hit in this request
139
+ */
140
+ route: string;
141
+ /**
142
+ * The major parameter of the route
143
+ *
144
+ * For example, in `/channels/x`, this will be `x`.
145
+ * If there is no major parameter (e.g: `/bot/gateway`) this will be `global`.
146
+ */
147
+ majorParameter: string;
148
+ /**
149
+ * Whether the rate limit that was reached was the global limit
150
+ */
151
+ global: boolean;
152
+ }
153
+ /**
154
+ * A function that determines whether the rate limit hit should throw an Error
155
+ */
156
+ export declare type RateLimitQueueFilter = (rateLimitData: RateLimitData) => boolean | Promise<boolean>;
157
+ export interface APIRequest {
158
+ /**
159
+ * The HTTP method used in this request
160
+ */
161
+ method: string;
162
+ /**
163
+ * The full path used to make the request
164
+ */
165
+ path: RouteLike;
166
+ /**
167
+ * The API route identifying the ratelimit for this request
168
+ */
169
+ route: string;
170
+ /**
171
+ * Additional HTTP options for this request
172
+ */
173
+ options: RequestOptions;
174
+ /**
175
+ * The data that was used to form the body of this request
176
+ */
177
+ data: HandlerRequestData;
178
+ /**
179
+ * The number of times this request has been attempted
180
+ */
181
+ retries: number;
182
+ }
183
+ export interface InvalidRequestWarningData {
184
+ /**
185
+ * Number of invalid requests that have been made in the window
186
+ */
187
+ count: number;
188
+ /**
189
+ * Time in milliseconds remaining before the count resets
190
+ */
191
+ remainingTime: number;
192
+ }
193
+ export interface RestEvents {
194
+ invalidRequestWarning: [invalidRequestInfo: InvalidRequestWarningData];
195
+ restDebug: [info: string];
196
+ rateLimited: [rateLimitInfo: RateLimitData];
197
+ response: [request: APIRequest, response: Dispatcher.ResponseData];
198
+ newListener: [name: string, listener: (...args: any) => void];
199
+ removeListener: [name: string, listener: (...args: any) => void];
200
+ hashSweep: [sweptHashes: Collection<string, HashData>];
201
+ handlerSweep: [sweptHandlers: Collection<string, IHandler>];
202
+ }
203
+ export interface REST {
204
+ on: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
205
+ once: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
206
+ emit: (<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]) => boolean) & (<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]) => boolean);
207
+ off: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
208
+ removeAllListeners: (<K extends keyof RestEvents>(event?: K) => this) & (<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>) => this);
209
+ }
210
+ export declare type RequestOptions = Exclude<Parameters<typeof request>[1], undefined>;
211
+ export declare class REST extends EventEmitter {
212
+ readonly cdn: CDN;
213
+ readonly requestManager: RequestManager;
214
+ constructor(options?: Partial<RESTOptions>);
215
+ /**
216
+ * Gets the agent set for this instance
217
+ */
218
+ getAgent(): Dispatcher | null;
219
+ /**
220
+ * Sets the default agent to use for requests performed by this instance
221
+ *
222
+ * @param agent - Sets the agent to use
223
+ */
224
+ setAgent(agent: Dispatcher): this;
225
+ /**
226
+ * Sets the authorization token that should be used for requests
227
+ *
228
+ * @param token - The authorization token to use
229
+ */
230
+ setToken(token: string): this;
231
+ /**
232
+ * Runs a get request from the api
233
+ *
234
+ * @param fullRoute - The full route to query
235
+ * @param options - Optional request options
236
+ */
237
+ get(fullRoute: RouteLike, options?: RequestData): Promise<unknown>;
238
+ /**
239
+ * Runs a delete request from the api
240
+ *
241
+ * @param fullRoute - The full route to query
242
+ * @param options - Optional request options
243
+ */
244
+ delete(fullRoute: RouteLike, options?: RequestData): Promise<unknown>;
245
+ /**
246
+ * Runs a post request from the api
247
+ *
248
+ * @param fullRoute - The full route to query
249
+ * @param options - Optional request options
250
+ */
251
+ post(fullRoute: RouteLike, options?: RequestData): Promise<unknown>;
252
+ /**
253
+ * Runs a put request from the api
254
+ *
255
+ * @param fullRoute - The full route to query
256
+ * @param options - Optional request options
257
+ */
258
+ put(fullRoute: RouteLike, options?: RequestData): Promise<unknown>;
259
+ /**
260
+ * Runs a patch request from the api
261
+ *
262
+ * @param fullRoute - The full route to query
263
+ * @param options - Optional request options
264
+ */
265
+ patch(fullRoute: RouteLike, options?: RequestData): Promise<unknown>;
266
+ /**
267
+ * Runs a request from the api
268
+ *
269
+ * @param options - Request options
270
+ */
271
+ request(options: InternalRequest): Promise<unknown>;
272
+ /**
273
+ * Runs a request from the API, yielding the raw Response object
274
+ *
275
+ * @param options - Request options
276
+ */
277
+ raw(options: InternalRequest): Promise<Dispatcher.ResponseData>;
278
+ }
279
+ //# sourceMappingURL=REST.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"REST.d.ts","sourceRoot":"","sources":["../../src/lib/REST.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { CDN } from './CDN.mjs';
3
+ import { RequestManager, RequestMethod } from './RequestManager.mjs';
4
+ import { DefaultRestOptions, RESTEvents } from './utils/constants.mjs';
5
+ import { parseResponse } from './utils/utils.mjs';
6
+
7
+ class REST extends EventEmitter {
8
+ constructor(options = {}) {
9
+ super();
10
+ this.cdn = new CDN(options.cdn ?? DefaultRestOptions.cdn);
11
+ this.requestManager = new RequestManager(options).on(RESTEvents.Debug, this.emit.bind(this, RESTEvents.Debug)).on(RESTEvents.RateLimited, this.emit.bind(this, RESTEvents.RateLimited)).on(RESTEvents.InvalidRequestWarning, this.emit.bind(this, RESTEvents.InvalidRequestWarning)).on(RESTEvents.HashSweep, this.emit.bind(this, RESTEvents.HashSweep));
12
+ this.on("newListener", (name, listener) => {
13
+ if (name === RESTEvents.Response)
14
+ this.requestManager.on(name, listener);
15
+ });
16
+ this.on("removeListener", (name, listener) => {
17
+ if (name === RESTEvents.Response)
18
+ this.requestManager.off(name, listener);
19
+ });
20
+ }
21
+ getAgent() {
22
+ return this.requestManager.agent;
23
+ }
24
+ setAgent(agent) {
25
+ this.requestManager.setAgent(agent);
26
+ return this;
27
+ }
28
+ setToken(token) {
29
+ this.requestManager.setToken(token);
30
+ return this;
31
+ }
32
+ get(fullRoute, options = {}) {
33
+ return this.request({ ...options, fullRoute, method: RequestMethod.Get });
34
+ }
35
+ delete(fullRoute, options = {}) {
36
+ return this.request({ ...options, fullRoute, method: RequestMethod.Delete });
37
+ }
38
+ post(fullRoute, options = {}) {
39
+ return this.request({ ...options, fullRoute, method: RequestMethod.Post });
40
+ }
41
+ put(fullRoute, options = {}) {
42
+ return this.request({ ...options, fullRoute, method: RequestMethod.Put });
43
+ }
44
+ patch(fullRoute, options = {}) {
45
+ return this.request({ ...options, fullRoute, method: RequestMethod.Patch });
46
+ }
47
+ async request(options) {
48
+ const response = await this.raw(options);
49
+ return parseResponse(response);
50
+ }
51
+ raw(options) {
52
+ return this.requestManager.queueRequest(options);
53
+ }
54
+ }
55
+
56
+ export { REST };
57
+ //# sourceMappingURL=REST.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"REST.mjs","sources":["../../src/lib/REST.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { Collection } from '@discordjs/collection';\nimport type { request, Dispatcher } from 'undici';\nimport { CDN } from './CDN';\nimport {\n\tHandlerRequestData,\n\tInternalRequest,\n\tRequestData,\n\tRequestManager,\n\tRequestMethod,\n\tRouteLike,\n} from './RequestManager';\nimport type { HashData } from './RequestManager';\nimport type { IHandler } from './handlers/IHandler';\nimport { DefaultRestOptions, RESTEvents } from './utils/constants';\nimport { parseResponse } from './utils/utils';\n\n/**\n * Options to be passed when creating the REST instance\n */\nexport interface RESTOptions {\n\t/**\n\t * The agent to set globally\n\t */\n\tagent: Dispatcher;\n\t/**\n\t * The base api path, without version\n\t * @default 'https://discord.com/api'\n\t */\n\tapi: string;\n\t/**\n\t * The authorization prefix to use for requests, useful if you want to use\n\t * bearer tokens\n\t *\n\t * @default 'Bot'\n\t */\n\tauthPrefix: 'Bot' | 'Bearer';\n\t/**\n\t * The cdn path\n\t *\n\t * @default 'https://cdn.discordapp.com'\n\t */\n\tcdn: string;\n\t/**\n\t * Additional headers to send for all API requests\n\t *\n\t * @default {}\n\t */\n\theaders: Record<string, string>;\n\t/**\n\t * The number of invalid REST requests (those that return 401, 403, or 429) in a 10 minute window between emitted warnings (0 for no warnings).\n\t * That is, if set to 500, warnings will be emitted at invalid request number 500, 1000, 1500, and so on.\n\t *\n\t * @default 0\n\t */\n\tinvalidRequestWarningInterval: number;\n\t/**\n\t * How many requests to allow sending per second (Infinity for unlimited, 50 for the standard global limit used by Discord)\n\t *\n\t * @default 50\n\t */\n\tglobalRequestsPerSecond: number;\n\t/**\n\t * The extra offset to add to rate limits in milliseconds\n\t *\n\t * @default 50\n\t */\n\toffset: number;\n\t/**\n\t * Determines how rate limiting and pre-emptive throttling should be handled.\n\t * When an array of strings, each element is treated as a prefix for the request route\n\t * (e.g. `/channels` to match any route starting with `/channels` such as `/channels/:id/messages`)\n\t * for which to throw {@link RateLimitError}s. All other request routes will be queued normally\n\t *\n\t * @default null\n\t */\n\trejectOnRateLimit: string[] | RateLimitQueueFilter | null;\n\t/**\n\t * The number of retries for errors with the 500 code, or errors\n\t * that timeout\n\t *\n\t * @default 3\n\t */\n\tretries: number;\n\t/**\n\t * The time to wait in milliseconds before a request is aborted\n\t *\n\t * @default 15_000\n\t */\n\ttimeout: number;\n\t/**\n\t * Extra information to add to the user agent\n\t *\n\t * @default `Node.js ${process.version}`\n\t */\n\tuserAgentAppendix: string;\n\t/**\n\t * The version of the API to use\n\t *\n\t * @default '10'\n\t */\n\tversion: string;\n\t/**\n\t * The amount of time in milliseconds that passes between each hash sweep. (defaults to 4h)\n\t *\n\t * @default 14_400_000\n\t */\n\thashSweepInterval: number;\n\t/**\n\t * The maximum amount of time a hash can exist in milliseconds without being hit with a request (defaults to 24h)\n\t *\n\t * @default 86_400_000\n\t */\n\thashLifetime: number;\n\t/**\n\t * The amount of time in milliseconds that passes between each hash sweep. (defaults to 1h)\n\t *\n\t * @default 3_600_000\n\t */\n\thandlerSweepInterval: number;\n}\n\n/**\n * Data emitted on `RESTEvents.RateLimited`\n */\nexport interface RateLimitData {\n\t/**\n\t * The time, in milliseconds, until the request-lock is reset\n\t */\n\ttimeToReset: number;\n\t/**\n\t * The amount of requests we can perform before locking requests\n\t */\n\tlimit: number;\n\t/**\n\t * The HTTP method being performed\n\t */\n\tmethod: string;\n\t/**\n\t * The bucket hash for this request\n\t */\n\thash: string;\n\t/**\n\t * The full URL for this request\n\t */\n\turl: string;\n\t/**\n\t * The route being hit in this request\n\t */\n\troute: string;\n\t/**\n\t * The major parameter of the route\n\t *\n\t * For example, in `/channels/x`, this will be `x`.\n\t * If there is no major parameter (e.g: `/bot/gateway`) this will be `global`.\n\t */\n\tmajorParameter: string;\n\t/**\n\t * Whether the rate limit that was reached was the global limit\n\t */\n\tglobal: boolean;\n}\n\n/**\n * A function that determines whether the rate limit hit should throw an Error\n */\nexport type RateLimitQueueFilter = (rateLimitData: RateLimitData) => boolean | Promise<boolean>;\n\nexport interface APIRequest {\n\t/**\n\t * The HTTP method used in this request\n\t */\n\tmethod: string;\n\t/**\n\t * The full path used to make the request\n\t */\n\tpath: RouteLike;\n\t/**\n\t * The API route identifying the ratelimit for this request\n\t */\n\troute: string;\n\t/**\n\t * Additional HTTP options for this request\n\t */\n\toptions: RequestOptions;\n\t/**\n\t * The data that was used to form the body of this request\n\t */\n\tdata: HandlerRequestData;\n\t/**\n\t * The number of times this request has been attempted\n\t */\n\tretries: number;\n}\n\nexport interface InvalidRequestWarningData {\n\t/**\n\t * Number of invalid requests that have been made in the window\n\t */\n\tcount: number;\n\t/**\n\t * Time in milliseconds remaining before the count resets\n\t */\n\tremainingTime: number;\n}\n\nexport interface RestEvents {\n\tinvalidRequestWarning: [invalidRequestInfo: InvalidRequestWarningData];\n\trestDebug: [info: string];\n\trateLimited: [rateLimitInfo: RateLimitData];\n\tresponse: [request: APIRequest, response: Dispatcher.ResponseData];\n\tnewListener: [name: string, listener: (...args: any) => void];\n\tremoveListener: [name: string, listener: (...args: any) => void];\n\thashSweep: [sweptHashes: Collection<string, HashData>];\n\thandlerSweep: [sweptHandlers: Collection<string, IHandler>];\n}\n\nexport interface REST {\n\ton: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &\n\t\t(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);\n\n\tonce: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &\n\t\t(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);\n\n\temit: (<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]) => boolean) &\n\t\t(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]) => boolean);\n\n\toff: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &\n\t\t(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);\n\n\tremoveAllListeners: (<K extends keyof RestEvents>(event?: K) => this) &\n\t\t(<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>) => this);\n}\n\nexport type RequestOptions = Exclude<Parameters<typeof request>[1], undefined>;\n\nexport class REST extends EventEmitter {\n\tpublic readonly cdn: CDN;\n\tpublic readonly requestManager: RequestManager;\n\n\tpublic constructor(options: Partial<RESTOptions> = {}) {\n\t\tsuper();\n\t\tthis.cdn = new CDN(options.cdn ?? DefaultRestOptions.cdn);\n\t\tthis.requestManager = new RequestManager(options)\n\t\t\t.on(RESTEvents.Debug, this.emit.bind(this, RESTEvents.Debug))\n\t\t\t.on(RESTEvents.RateLimited, this.emit.bind(this, RESTEvents.RateLimited))\n\t\t\t.on(RESTEvents.InvalidRequestWarning, this.emit.bind(this, RESTEvents.InvalidRequestWarning))\n\t\t\t.on(RESTEvents.HashSweep, this.emit.bind(this, RESTEvents.HashSweep));\n\n\t\tthis.on('newListener', (name, listener) => {\n\t\t\tif (name === RESTEvents.Response) this.requestManager.on(name, listener);\n\t\t});\n\t\tthis.on('removeListener', (name, listener) => {\n\t\t\tif (name === RESTEvents.Response) this.requestManager.off(name, listener);\n\t\t});\n\t}\n\n\t/**\n\t * Gets the agent set for this instance\n\t */\n\tpublic getAgent() {\n\t\treturn this.requestManager.agent;\n\t}\n\n\t/**\n\t * Sets the default agent to use for requests performed by this instance\n\t *\n\t * @param agent - Sets the agent to use\n\t */\n\tpublic setAgent(agent: Dispatcher) {\n\t\tthis.requestManager.setAgent(agent);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the authorization token that should be used for requests\n\t *\n\t * @param token - The authorization token to use\n\t */\n\tpublic setToken(token: string) {\n\t\tthis.requestManager.setToken(token);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Runs a get request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic get(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Get });\n\t}\n\n\t/**\n\t * Runs a delete request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic delete(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Delete });\n\t}\n\n\t/**\n\t * Runs a post request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic post(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Post });\n\t}\n\n\t/**\n\t * Runs a put request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic put(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Put });\n\t}\n\n\t/**\n\t * Runs a patch request from the api\n\t *\n\t * @param fullRoute - The full route to query\n\t * @param options - Optional request options\n\t */\n\tpublic patch(fullRoute: RouteLike, options: RequestData = {}) {\n\t\treturn this.request({ ...options, fullRoute, method: RequestMethod.Patch });\n\t}\n\n\t/**\n\t * Runs a request from the api\n\t *\n\t * @param options - Request options\n\t */\n\tpublic async request(options: InternalRequest) {\n\t\tconst response = await this.raw(options);\n\t\treturn parseResponse(response);\n\t}\n\n\t/**\n\t * Runs a request from the API, yielding the raw Response object\n\t *\n\t * @param options - Request options\n\t */\n\tpublic raw(options: InternalRequest) {\n\t\treturn this.requestManager.queueRequest(options);\n\t}\n}\n"],"names":[],"mappings":"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"}