@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,218 @@
1
+ import { Blob } from 'node:buffer';
2
+ import { EventEmitter } from 'node:events';
3
+ import { Collection } from '@discordjs/collection';
4
+ import { DiscordSnowflake } from '@sapphire/snowflake';
5
+ import { FormData } from 'undici';
6
+ import { SequentialHandler } from './handlers/SequentialHandler.mjs';
7
+ import { DefaultRestOptions, RESTEvents, DefaultUserAgent } from './utils/constants.mjs';
8
+ import { resolveBody } from './utils/utils.mjs';
9
+
10
+ var __accessCheck = (obj, member, msg) => {
11
+ if (!member.has(obj))
12
+ throw TypeError("Cannot " + msg);
13
+ };
14
+ var __privateGet = (obj, member, getter) => {
15
+ __accessCheck(obj, member, "read from private field");
16
+ return getter ? getter.call(obj) : member.get(obj);
17
+ };
18
+ var __privateAdd = (obj, member, value) => {
19
+ if (member.has(obj))
20
+ throw TypeError("Cannot add the same private member more than once");
21
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
22
+ };
23
+ var __privateSet = (obj, member, value, setter) => {
24
+ __accessCheck(obj, member, "write to private field");
25
+ setter ? setter.call(obj, value) : member.set(obj, value);
26
+ return value;
27
+ };
28
+ var _token;
29
+ const getFileType = () => {
30
+ let cached;
31
+ return cached ?? (cached = import('file-type'));
32
+ };
33
+ var RequestMethod = /* @__PURE__ */ ((RequestMethod2) => {
34
+ RequestMethod2["Delete"] = "DELETE";
35
+ RequestMethod2["Get"] = "GET";
36
+ RequestMethod2["Patch"] = "PATCH";
37
+ RequestMethod2["Post"] = "POST";
38
+ RequestMethod2["Put"] = "PUT";
39
+ return RequestMethod2;
40
+ })(RequestMethod || {});
41
+ const _RequestManager = class extends EventEmitter {
42
+ constructor(options) {
43
+ super();
44
+ this.agent = null;
45
+ this.globalDelay = null;
46
+ this.globalReset = -1;
47
+ this.hashes = new Collection();
48
+ this.handlers = new Collection();
49
+ __privateAdd(this, _token, null);
50
+ this.options = { ...DefaultRestOptions, ...options };
51
+ this.options.offset = Math.max(0, this.options.offset);
52
+ this.globalRemaining = this.options.globalRequestsPerSecond;
53
+ this.agent = options.agent ?? null;
54
+ this.setupSweepers();
55
+ }
56
+ setupSweepers() {
57
+ const validateMaxInterval = (interval) => {
58
+ if (interval > 144e5) {
59
+ throw new Error("Cannot set an interval greater than 4 hours");
60
+ }
61
+ };
62
+ if (this.options.hashSweepInterval !== 0 && this.options.hashSweepInterval !== Infinity) {
63
+ validateMaxInterval(this.options.hashSweepInterval);
64
+ this.hashTimer = setInterval(() => {
65
+ const sweptHashes = new Collection();
66
+ const currentDate = Date.now();
67
+ this.hashes.sweep((v, k) => {
68
+ if (v.lastAccess === -1)
69
+ return false;
70
+ const shouldSweep = Math.floor(currentDate - v.lastAccess) > this.options.hashLifetime;
71
+ if (shouldSweep) {
72
+ sweptHashes.set(k, v);
73
+ }
74
+ this.emit(RESTEvents.Debug, `Hash ${v.value} for ${k} swept due to lifetime being exceeded`);
75
+ return shouldSweep;
76
+ });
77
+ this.emit(RESTEvents.HashSweep, sweptHashes);
78
+ }, this.options.hashSweepInterval).unref();
79
+ }
80
+ if (this.options.handlerSweepInterval !== 0 && this.options.handlerSweepInterval !== Infinity) {
81
+ validateMaxInterval(this.options.handlerSweepInterval);
82
+ this.handlerTimer = setInterval(() => {
83
+ const sweptHandlers = new Collection();
84
+ this.handlers.sweep((v, k) => {
85
+ const { inactive } = v;
86
+ if (inactive) {
87
+ sweptHandlers.set(k, v);
88
+ }
89
+ this.emit(RESTEvents.Debug, `Handler ${v.id} for ${k} swept due to being inactive`);
90
+ return inactive;
91
+ });
92
+ this.emit(RESTEvents.HandlerSweep, sweptHandlers);
93
+ }, this.options.handlerSweepInterval).unref();
94
+ }
95
+ }
96
+ setAgent(agent) {
97
+ this.agent = agent;
98
+ return this;
99
+ }
100
+ setToken(token) {
101
+ __privateSet(this, _token, token);
102
+ return this;
103
+ }
104
+ async queueRequest(request) {
105
+ const routeId = _RequestManager.generateRouteData(request.fullRoute, request.method);
106
+ const hash = this.hashes.get(`${request.method}:${routeId.bucketRoute}`) ?? {
107
+ value: `Global(${request.method}:${routeId.bucketRoute})`,
108
+ lastAccess: -1
109
+ };
110
+ const handler = this.handlers.get(`${hash.value}:${routeId.majorParameter}`) ?? this.createHandler(hash.value, routeId.majorParameter);
111
+ const { url, fetchOptions } = await this.resolveRequest(request);
112
+ return handler.queueRequest(routeId, url, fetchOptions, {
113
+ body: request.body,
114
+ files: request.files,
115
+ auth: request.auth !== false
116
+ });
117
+ }
118
+ createHandler(hash, majorParameter) {
119
+ const queue = new SequentialHandler(this, hash, majorParameter);
120
+ this.handlers.set(queue.id, queue);
121
+ return queue;
122
+ }
123
+ async resolveRequest(request) {
124
+ const { options } = this;
125
+ let query = "";
126
+ if (request.query) {
127
+ const resolvedQuery = request.query.toString();
128
+ if (resolvedQuery !== "") {
129
+ query = `?${resolvedQuery}`;
130
+ }
131
+ }
132
+ const headers = {
133
+ ...this.options.headers,
134
+ "User-Agent": `${DefaultUserAgent} ${options.userAgentAppendix}`.trim()
135
+ };
136
+ if (request.auth !== false) {
137
+ if (!__privateGet(this, _token)) {
138
+ throw new Error("Expected token to be set for this request, but none was present");
139
+ }
140
+ headers.Authorization = `${request.authPrefix ?? this.options.authPrefix} ${__privateGet(this, _token)}`;
141
+ }
142
+ if (request.reason?.length) {
143
+ headers["X-Audit-Log-Reason"] = encodeURIComponent(request.reason);
144
+ }
145
+ const url = `${options.api}${request.versioned === false ? "" : `/v${options.version}`}${request.fullRoute}${query}`;
146
+ let finalBody;
147
+ let additionalHeaders = {};
148
+ if (request.files?.length) {
149
+ const formData = new FormData();
150
+ for (const [index, file] of request.files.entries()) {
151
+ const fileKey = file.key ?? `files[${index}]`;
152
+ if (Buffer.isBuffer(file.data)) {
153
+ const { fileTypeFromBuffer } = await getFileType();
154
+ const contentType = file.contentType ?? (await fileTypeFromBuffer(file.data))?.mime;
155
+ formData.append(fileKey, new Blob([file.data], { type: contentType }), file.name);
156
+ } else {
157
+ formData.append(fileKey, new Blob([`${file.data}`], { type: file.contentType }), file.name);
158
+ }
159
+ }
160
+ if (request.body != null) {
161
+ if (request.appendToFormData) {
162
+ for (const [key, value] of Object.entries(request.body)) {
163
+ formData.append(key, value);
164
+ }
165
+ } else {
166
+ formData.append("payload_json", JSON.stringify(request.body));
167
+ }
168
+ }
169
+ finalBody = formData;
170
+ } else if (request.body != null) {
171
+ if (request.passThroughBody) {
172
+ finalBody = request.body;
173
+ } else {
174
+ finalBody = JSON.stringify(request.body);
175
+ additionalHeaders = { "Content-Type": "application/json" };
176
+ }
177
+ }
178
+ finalBody = await resolveBody(finalBody);
179
+ const fetchOptions = {
180
+ headers: { ...request.headers ?? {}, ...additionalHeaders, ...headers },
181
+ method: request.method.toUpperCase()
182
+ };
183
+ if (finalBody !== void 0) {
184
+ fetchOptions.body = finalBody;
185
+ }
186
+ fetchOptions.dispatcher = request.dispatcher ?? this.agent ?? void 0;
187
+ return { url, fetchOptions };
188
+ }
189
+ clearHashSweeper() {
190
+ clearInterval(this.hashTimer);
191
+ }
192
+ clearHandlerSweeper() {
193
+ clearInterval(this.handlerTimer);
194
+ }
195
+ static generateRouteData(endpoint, method) {
196
+ const majorIdMatch = /^\/(?:channels|guilds|webhooks)\/(\d{16,19})/.exec(endpoint);
197
+ const majorId = majorIdMatch?.[1] ?? "global";
198
+ const baseRoute = endpoint.replace(/\d{16,19}/g, ":id").replace(/\/reactions\/(.*)/, "/reactions/:reaction");
199
+ let exceptions = "";
200
+ if (method === "DELETE" /* Delete */ && baseRoute === "/channels/:id/messages/:id") {
201
+ const id = /\d{16,19}$/.exec(endpoint)[0];
202
+ const timestamp = DiscordSnowflake.timestampFrom(id);
203
+ if (Date.now() - timestamp > 1e3 * 60 * 60 * 24 * 14) {
204
+ exceptions += "/Delete Old Message";
205
+ }
206
+ }
207
+ return {
208
+ majorParameter: majorId,
209
+ bucketRoute: baseRoute + exceptions,
210
+ original: endpoint
211
+ };
212
+ }
213
+ };
214
+ let RequestManager = _RequestManager;
215
+ _token = new WeakMap();
216
+
217
+ export { RequestManager, RequestMethod };
218
+ //# sourceMappingURL=RequestManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestManager.mjs","sources":["../../src/lib/RequestManager.ts"],"sourcesContent":["import { Blob } from 'node:buffer';\nimport { EventEmitter } from 'node:events';\nimport { Collection } from '@discordjs/collection';\nimport { DiscordSnowflake } from '@sapphire/snowflake';\nimport { FormData, type RequestInit, type BodyInit, type Dispatcher, Agent } from 'undici';\nimport type { RESTOptions, RestEvents, RequestOptions } from './REST';\nimport type { IHandler } from './handlers/IHandler';\nimport { SequentialHandler } from './handlers/SequentialHandler';\nimport { DefaultRestOptions, DefaultUserAgent, RESTEvents } from './utils/constants';\nimport { resolveBody } from './utils/utils';\n\n// Make this a lazy dynamic import as file-type is a pure ESM package\nconst getFileType = (): Promise<typeof import('file-type')> => {\n\tlet cached: Promise<typeof import('file-type')>;\n\treturn (cached ??= import('file-type'));\n};\n\n/**\n * Represents a file to be added to the request\n */\nexport interface RawFile {\n\t/**\n\t * The name of the file\n\t */\n\tname: string;\n\t/**\n\t * An explicit key to use for key of the formdata field for this file.\n\t * When not provided, the index of the file in the files array is used in the form `files[${index}]`.\n\t * If you wish to alter the placeholder snowflake, you must provide this property in the same form (`files[${placeholder}]`)\n\t */\n\tkey?: string;\n\t/**\n\t * The actual data for the file\n\t */\n\tdata: string | number | boolean | Buffer;\n\t/**\n\t * Content-Type of the file\n\t */\n\tcontentType?: string;\n}\n\n/**\n * Represents possible data to be given to an endpoint\n */\nexport interface RequestData {\n\t/**\n\t * Whether to append JSON data to form data instead of `payload_json` when sending files\n\t */\n\tappendToFormData?: boolean;\n\t/**\n\t * If this request needs the `Authorization` header\n\t *\n\t * @default true\n\t */\n\tauth?: boolean;\n\t/**\n\t * The authorization prefix to use for this request, useful if you use this with bearer tokens\n\t *\n\t * @default 'Bot'\n\t */\n\tauthPrefix?: 'Bot' | 'Bearer';\n\t/**\n\t * The body to send to this request.\n\t * If providing as BodyInit, set `passThroughBody: true`\n\t */\n\tbody?: BodyInit | unknown;\n\t/**\n\t * The {@link https://undici.nodejs.org/#/docs/api/Agent Agent} to use for the request.\n\t */\n\tdispatcher?: Agent;\n\t/**\n\t * Files to be attached to this request\n\t */\n\tfiles?: RawFile[] | undefined;\n\t/**\n\t * Additional headers to add to this request\n\t */\n\theaders?: Record<string, string>;\n\t/**\n\t * Whether to pass-through the body property directly to `fetch()`.\n\t * <warn>This only applies when files is NOT present</warn>\n\t */\n\tpassThroughBody?: boolean;\n\t/**\n\t * Query string parameters to append to the called endpoint\n\t */\n\tquery?: URLSearchParams;\n\t/**\n\t * Reason to show in the audit logs\n\t */\n\treason?: string;\n\t/**\n\t * If this request should be versioned\n\t *\n\t * @default true\n\t */\n\tversioned?: boolean;\n}\n\n/**\n * Possible headers for an API call\n */\nexport interface RequestHeaders {\n\tAuthorization?: string;\n\t'User-Agent': string;\n\t'X-Audit-Log-Reason'?: string;\n}\n\n/**\n * Possible API methods to be used when doing requests\n */\nexport const enum RequestMethod {\n\tDelete = 'DELETE',\n\tGet = 'GET',\n\tPatch = 'PATCH',\n\tPost = 'POST',\n\tPut = 'PUT',\n}\n\nexport type RouteLike = `/${string}`;\n\n/**\n * Internal request options\n *\n * @internal\n */\nexport interface InternalRequest extends RequestData {\n\tmethod: RequestMethod;\n\tfullRoute: RouteLike;\n}\n\nexport type HandlerRequestData = Pick<InternalRequest, 'files' | 'body' | 'auth'>;\n\n/**\n * Parsed route data for an endpoint\n *\n * @internal\n */\nexport interface RouteData {\n\tmajorParameter: string;\n\tbucketRoute: string;\n\toriginal: RouteLike;\n}\n\n/**\n * Represents a hash and its associated fields\n *\n * @internal\n */\nexport interface HashData {\n\tvalue: string;\n\tlastAccess: number;\n}\n\nexport interface RequestManager {\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\n/**\n * Represents the class that manages handlers for endpoints\n */\nexport class RequestManager extends EventEmitter {\n\t/**\n\t * The {@link https://undici.nodejs.org/#/docs/api/Agent Agent} for all requests\n\t * performed by this manager.\n\t */\n\tpublic agent: Dispatcher | null = null;\n\t/**\n\t * The number of requests remaining in the global bucket\n\t */\n\tpublic globalRemaining: number;\n\n\t/**\n\t * The promise used to wait out the global rate limit\n\t */\n\tpublic globalDelay: Promise<void> | null = null;\n\n\t/**\n\t * The timestamp at which the global bucket resets\n\t */\n\tpublic globalReset = -1;\n\n\t/**\n\t * API bucket hashes that are cached from provided routes\n\t */\n\tpublic readonly hashes = new Collection<string, HashData>();\n\n\t/**\n\t * Request handlers created from the bucket hash and the major parameters\n\t */\n\tpublic readonly handlers = new Collection<string, IHandler>();\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-member-accessibility\n\t#token: string | null = null;\n\n\tprivate hashTimer!: NodeJS.Timer;\n\tprivate handlerTimer!: NodeJS.Timer;\n\n\tpublic readonly options: RESTOptions;\n\n\tpublic constructor(options: Partial<RESTOptions>) {\n\t\tsuper();\n\t\tthis.options = { ...DefaultRestOptions, ...options };\n\t\tthis.options.offset = Math.max(0, this.options.offset);\n\t\tthis.globalRemaining = this.options.globalRequestsPerSecond;\n\t\tthis.agent = options.agent ?? null;\n\n\t\t// Start sweepers\n\t\tthis.setupSweepers();\n\t}\n\n\tprivate setupSweepers() {\n\t\tconst validateMaxInterval = (interval: number) => {\n\t\t\tif (interval > 14_400_000) {\n\t\t\t\tthrow new Error('Cannot set an interval greater than 4 hours');\n\t\t\t}\n\t\t};\n\n\t\tif (this.options.hashSweepInterval !== 0 && this.options.hashSweepInterval !== Infinity) {\n\t\t\tvalidateMaxInterval(this.options.hashSweepInterval);\n\t\t\tthis.hashTimer = setInterval(() => {\n\t\t\t\tconst sweptHashes = new Collection<string, HashData>();\n\t\t\t\tconst currentDate = Date.now();\n\n\t\t\t\t// Begin sweeping hash based on lifetimes\n\t\t\t\tthis.hashes.sweep((v, k) => {\n\t\t\t\t\t// `-1` indicates a global hash\n\t\t\t\t\tif (v.lastAccess === -1) return false;\n\n\t\t\t\t\t// Check if lifetime has been exceeded\n\t\t\t\t\tconst shouldSweep = Math.floor(currentDate - v.lastAccess) > this.options.hashLifetime;\n\n\t\t\t\t\t// Add hash to collection of swept hashes\n\t\t\t\t\tif (shouldSweep) {\n\t\t\t\t\t\t// Add to swept hashes\n\t\t\t\t\t\tsweptHashes.set(k, v);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Emit debug information\n\t\t\t\t\tthis.emit(RESTEvents.Debug, `Hash ${v.value} for ${k} swept due to lifetime being exceeded`);\n\n\t\t\t\t\treturn shouldSweep;\n\t\t\t\t});\n\n\t\t\t\t// Fire event\n\t\t\t\tthis.emit(RESTEvents.HashSweep, sweptHashes);\n\t\t\t}, this.options.hashSweepInterval).unref();\n\t\t}\n\n\t\tif (this.options.handlerSweepInterval !== 0 && this.options.handlerSweepInterval !== Infinity) {\n\t\t\tvalidateMaxInterval(this.options.handlerSweepInterval);\n\t\t\tthis.handlerTimer = setInterval(() => {\n\t\t\t\tconst sweptHandlers = new Collection<string, IHandler>();\n\n\t\t\t\t// Begin sweeping handlers based on activity\n\t\t\t\tthis.handlers.sweep((v, k) => {\n\t\t\t\t\tconst { inactive } = v;\n\n\t\t\t\t\t// Collect inactive handlers\n\t\t\t\t\tif (inactive) {\n\t\t\t\t\t\tsweptHandlers.set(k, v);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.emit(RESTEvents.Debug, `Handler ${v.id} for ${k} swept due to being inactive`);\n\t\t\t\t\treturn inactive;\n\t\t\t\t});\n\n\t\t\t\t// Fire event\n\t\t\t\tthis.emit(RESTEvents.HandlerSweep, sweptHandlers);\n\t\t\t}, this.options.handlerSweepInterval).unref();\n\t\t}\n\t}\n\n\t/**\n\t * Sets the default agent to use for requests performed by this manager\n\t *\n\t * @param agent - The agent to use\n\t */\n\tpublic setAgent(agent: Dispatcher) {\n\t\tthis.agent = 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.#token = token;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Queues a request to be sent\n\t *\n\t * @param request - All the information needed to make a request\n\t *\n\t * @returns The response from the api request\n\t */\n\tpublic async queueRequest(request: InternalRequest): Promise<Dispatcher.ResponseData> {\n\t\t// Generalize the endpoint to its route data\n\t\tconst routeId = RequestManager.generateRouteData(request.fullRoute, request.method);\n\t\t// Get the bucket hash for the generic route, or point to a global route otherwise\n\t\tconst hash = this.hashes.get(`${request.method}:${routeId.bucketRoute}`) ?? {\n\t\t\tvalue: `Global(${request.method}:${routeId.bucketRoute})`,\n\t\t\tlastAccess: -1,\n\t\t};\n\n\t\t// Get the request handler for the obtained hash, with its major parameter\n\t\tconst handler =\n\t\t\tthis.handlers.get(`${hash.value}:${routeId.majorParameter}`) ??\n\t\t\tthis.createHandler(hash.value, routeId.majorParameter);\n\n\t\t// Resolve the request into usable fetch options\n\t\tconst { url, fetchOptions } = await this.resolveRequest(request);\n\n\t\t// Queue the request\n\t\treturn handler.queueRequest(routeId, url, fetchOptions, {\n\t\t\tbody: request.body,\n\t\t\tfiles: request.files,\n\t\t\tauth: request.auth !== false,\n\t\t});\n\t}\n\n\t/**\n\t * Creates a new rate limit handler from a hash, based on the hash and the major parameter\n\t *\n\t * @param hash - The hash for the route\n\t * @param majorParameter - The major parameter for this handler\n\t *\n\t * @private\n\t */\n\tprivate createHandler(hash: string, majorParameter: string) {\n\t\t// Create the async request queue to handle requests\n\t\tconst queue = new SequentialHandler(this, hash, majorParameter);\n\t\t// Save the queue based on its id\n\t\tthis.handlers.set(queue.id, queue);\n\n\t\treturn queue;\n\t}\n\n\t/**\n\t * Formats the request data to a usable format for fetch\n\t *\n\t * @param request - The request data\n\t */\n\tprivate async resolveRequest(request: InternalRequest): Promise<{ url: string; fetchOptions: RequestOptions }> {\n\t\tconst { options } = this;\n\n\t\tlet query = '';\n\n\t\t// If a query option is passed, use it\n\t\tif (request.query) {\n\t\t\tconst resolvedQuery = request.query.toString();\n\t\t\tif (resolvedQuery !== '') {\n\t\t\t\tquery = `?${resolvedQuery}`;\n\t\t\t}\n\t\t}\n\n\t\t// Create the required headers\n\t\tconst headers: RequestHeaders = {\n\t\t\t...this.options.headers,\n\t\t\t'User-Agent': `${DefaultUserAgent} ${options.userAgentAppendix}`.trim(),\n\t\t};\n\n\t\t// If this request requires authorization (allowing non-\"authorized\" requests for webhooks)\n\t\tif (request.auth !== false) {\n\t\t\t// If we haven't received a token, throw an error\n\t\t\tif (!this.#token) {\n\t\t\t\tthrow new Error('Expected token to be set for this request, but none was present');\n\t\t\t}\n\n\t\t\theaders.Authorization = `${request.authPrefix ?? this.options.authPrefix} ${this.#token}`;\n\t\t}\n\n\t\t// If a reason was set, set it's appropriate header\n\t\tif (request.reason?.length) {\n\t\t\theaders['X-Audit-Log-Reason'] = encodeURIComponent(request.reason);\n\t\t}\n\n\t\t// Format the full request URL (api base, optional version, endpoint, optional querystring)\n\t\tconst url = `${options.api}${request.versioned === false ? '' : `/v${options.version}`}${\n\t\t\trequest.fullRoute\n\t\t}${query}`;\n\n\t\tlet finalBody: RequestInit['body'];\n\t\tlet additionalHeaders: Record<string, string> = {};\n\n\t\tif (request.files?.length) {\n\t\t\tconst formData = new FormData();\n\n\t\t\t// Attach all files to the request\n\t\t\tfor (const [index, file] of request.files.entries()) {\n\t\t\t\tconst fileKey = file.key ?? `files[${index}]`;\n\n\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/API/FormData/append#parameters\n\t\t\t\t// FormData.append only accepts a string or Blob.\n\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob#parameters\n\t\t\t\t// The Blob constructor accepts TypedArray/ArrayBuffer, strings, and Blobs.\n\t\t\t\tif (Buffer.isBuffer(file.data)) {\n\t\t\t\t\t// Try to infer the content type from the buffer if one isn't passed\n\t\t\t\t\tconst { fileTypeFromBuffer } = await getFileType();\n\t\t\t\t\tconst contentType = file.contentType ?? (await fileTypeFromBuffer(file.data))?.mime;\n\t\t\t\t\tformData.append(fileKey, new Blob([file.data], { type: contentType }), file.name);\n\t\t\t\t} else {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\t\t\t\t\tformData.append(fileKey, new Blob([`${file.data}`], { type: file.contentType }), file.name);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If a JSON body was added as well, attach it to the form data, using payload_json unless otherwise specified\n\t\t\t// eslint-disable-next-line no-eq-null\n\t\t\tif (request.body != null) {\n\t\t\t\tif (request.appendToFormData) {\n\t\t\t\t\tfor (const [key, value] of Object.entries(request.body as Record<string, unknown>)) {\n\t\t\t\t\t\tformData.append(key, value);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tformData.append('payload_json', JSON.stringify(request.body));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the final body to the form data\n\t\t\tfinalBody = formData;\n\n\t\t\t// eslint-disable-next-line no-eq-null\n\t\t} else if (request.body != null) {\n\t\t\tif (request.passThroughBody) {\n\t\t\t\tfinalBody = request.body as BodyInit;\n\t\t\t} else {\n\t\t\t\t// Stringify the JSON data\n\t\t\t\tfinalBody = JSON.stringify(request.body);\n\t\t\t\t// Set the additional headers to specify the content-type\n\t\t\t\tadditionalHeaders = { 'Content-Type': 'application/json' };\n\t\t\t}\n\t\t}\n\n\t\tfinalBody = await resolveBody(finalBody);\n\n\t\tconst fetchOptions: RequestOptions = {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\theaders: { ...(request.headers ?? {}), ...additionalHeaders, ...headers } as Record<string, string>,\n\t\t\tmethod: request.method.toUpperCase() as Dispatcher.HttpMethod,\n\t\t};\n\n\t\tif (finalBody !== undefined) {\n\t\t\tfetchOptions.body = finalBody as Exclude<RequestOptions['body'], undefined>;\n\t\t}\n\n\t\t// Prioritize setting an agent per request, use the agent for this instance otherwise.\n\t\tfetchOptions.dispatcher = request.dispatcher ?? this.agent ?? undefined!;\n\n\t\treturn { url, fetchOptions };\n\t}\n\n\t/**\n\t * Stops the hash sweeping interval\n\t */\n\tpublic clearHashSweeper() {\n\t\tclearInterval(this.hashTimer);\n\t}\n\n\t/**\n\t * Stops the request handler sweeping interval\n\t */\n\tpublic clearHandlerSweeper() {\n\t\tclearInterval(this.handlerTimer);\n\t}\n\n\t/**\n\t * Generates route data for an endpoint:method\n\t *\n\t * @param endpoint - The raw endpoint to generalize\n\t * @param method - The HTTP method this endpoint is called without\n\t *\n\t * @private\n\t */\n\tprivate static generateRouteData(endpoint: RouteLike, method: RequestMethod): RouteData {\n\t\tconst majorIdMatch = /^\\/(?:channels|guilds|webhooks)\\/(\\d{16,19})/.exec(endpoint);\n\n\t\t// Get the major id for this route - global otherwise\n\t\tconst majorId = majorIdMatch?.[1] ?? 'global';\n\n\t\tconst baseRoute = endpoint\n\t\t\t// Strip out all ids\n\t\t\t.replace(/\\d{16,19}/g, ':id')\n\t\t\t// Strip out reaction as they fall under the same bucket\n\t\t\t.replace(/\\/reactions\\/(.*)/, '/reactions/:reaction');\n\n\t\tlet exceptions = '';\n\n\t\t// Hard-Code Old Message Deletion Exception (2 week+ old messages are a different bucket)\n\t\t// https://github.com/discord/discord-api-docs/issues/1295\n\t\tif (method === RequestMethod.Delete && baseRoute === '/channels/:id/messages/:id') {\n\t\t\tconst id = /\\d{16,19}$/.exec(endpoint)![0]!;\n\t\t\tconst timestamp = DiscordSnowflake.timestampFrom(id);\n\t\t\tif (Date.now() - timestamp > 1000 * 60 * 60 * 24 * 14) {\n\t\t\t\texceptions += '/Delete Old Message';\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tmajorParameter: majorId,\n\t\t\tbucketRoute: baseRoute + exceptions,\n\t\t\toriginal: endpoint,\n\t\t};\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA,IAAI,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK;AAC1C,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AACtB,IAAI,MAAM,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC;AACF,IAAI,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK;AAC5C,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;AACxD,EAAE,OAAO,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC,CAAC;AACF,IAAI,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,KAAK;AAC3C,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AACrB,IAAI,MAAM,SAAS,CAAC,mDAAmD,CAAC,CAAC;AACzE,EAAE,MAAM,YAAY,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACvE,CAAC,CAAC;AACF,IAAI,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK;AACnD,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC;AACvD,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5D,EAAE,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AACF,IAAI,MAAM,CAAC;AASX,MAAM,WAAW,GAAG,MAAM;AAC1B,EAAE,IAAI,MAAM,CAAC;AACb,EAAE,OAAO,MAAM,KAAK,MAAM,GAAG,OAAO,WAAW,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC;AACQ,IAAC,aAAa,mBAAmB,CAAC,CAAC,cAAc,KAAK;AAChE,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AACtC,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAChC,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACpC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAClC,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAChC,EAAE,OAAO,cAAc,CAAC;AACxB,CAAC,EAAE,aAAa,IAAI,EAAE,EAAE;AACxB,MAAM,eAAe,GAAG,cAAc,YAAY,CAAC;AACnD,EAAE,WAAW,CAAC,OAAO,EAAE;AACvB,IAAI,KAAK,EAAE,CAAC;AACZ,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACtB,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAC5B,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;AAC1B,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;AACnC,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAC;AACrC,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACrC,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,EAAE,CAAC;AACzD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3D,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC;AAChE,IAAI,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;AACvC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;AACzB,GAAG;AACH,EAAE,aAAa,GAAG;AAClB,IAAI,MAAM,mBAAmB,GAAG,CAAC,QAAQ,KAAK;AAC9C,MAAM,IAAI,QAAQ,GAAG,KAAK,EAAE;AAC5B,QAAQ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;AACvE,OAAO;AACP,KAAK,CAAC;AACN,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,QAAQ,EAAE;AAC7F,MAAM,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC1D,MAAM,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,MAAM;AACzC,QAAQ,MAAM,WAAW,GAAG,IAAI,UAAU,EAAE,CAAC;AAC7C,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACvC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;AACpC,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC;AACjC,YAAY,OAAO,KAAK,CAAC;AACzB,UAAU,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AACjG,UAAU,IAAI,WAAW,EAAE;AAC3B,YAAY,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,WAAW;AACX,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC;AACvG,UAAU,OAAO,WAAW,CAAC;AAC7B,SAAS,CAAC,CAAC;AACX,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACrD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC;AACjD,KAAK;AACL,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,KAAK,QAAQ,EAAE;AACnG,MAAM,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC7D,MAAM,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,MAAM;AAC5C,QAAQ,MAAM,aAAa,GAAG,IAAI,UAAU,EAAE,CAAC;AAC/C,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;AACtC,UAAU,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;AACjC,UAAU,IAAI,QAAQ,EAAE;AACxB,YAAY,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,WAAW;AACX,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC;AAC9F,UAAU,OAAO,QAAQ,CAAC;AAC1B,SAAS,CAAC,CAAC;AACX,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAC1D,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;AACpD,KAAK;AACL,GAAG;AACH,EAAE,QAAQ,CAAC,KAAK,EAAE;AAClB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,EAAE,QAAQ,CAAC,KAAK,EAAE;AAClB,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACtC,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,EAAE,MAAM,YAAY,CAAC,OAAO,EAAE;AAC9B,IAAI,MAAM,OAAO,GAAG,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AACzF,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;AAChF,MAAM,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAC/D,MAAM,UAAU,EAAE,CAAC,CAAC;AACpB,KAAK,CAAC;AACN,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;AAC3I,IAAI,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACrE,IAAI,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE;AAC5D,MAAM,IAAI,EAAE,OAAO,CAAC,IAAI;AACxB,MAAM,KAAK,EAAE,OAAO,CAAC,KAAK;AAC1B,MAAM,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK;AAClC,KAAK,CAAC,CAAC;AACP,GAAG;AACH,EAAE,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE;AACtC,IAAI,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACpE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACvC,IAAI,OAAO,KAAK,CAAC;AACjB,GAAG;AACH,EAAE,MAAM,cAAc,CAAC,OAAO,EAAE;AAChC,IAAI,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;AAC7B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;AACnB,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE;AACvB,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AACrD,MAAM,IAAI,aAAa,KAAK,EAAE,EAAE;AAChC,QAAQ,KAAK,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;AACpC,OAAO;AACP,KAAK;AACL,IAAI,MAAM,OAAO,GAAG;AACpB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;AAC7B,MAAM,YAAY,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE;AAC7E,KAAK,CAAC;AACN,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE;AAChC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;AACvC,QAAQ,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;AAC3F,OAAO;AACP,MAAM,OAAO,CAAC,aAAa,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC/G,KAAK;AACL,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAChC,MAAM,OAAO,CAAC,oBAAoB,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACzE,KAAK;AACL,IAAI,MAAM,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzH,IAAI,IAAI,SAAS,CAAC;AAClB,IAAI,IAAI,iBAAiB,GAAG,EAAE,CAAC;AAC/B,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE;AAC/B,MAAM,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AACtC,MAAM,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;AAC3D,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACtD,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACxC,UAAU,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;AAC7D,UAAU,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC9F,UAAU,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5F,SAAS,MAAM;AACf,UAAU,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACtG,SAAS;AACT,OAAO;AACP,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE;AAChC,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE;AACtC,UAAU,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACnE,YAAY,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACxC,WAAW;AACX,SAAS,MAAM;AACf,UAAU,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACxE,SAAS;AACT,OAAO;AACP,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE;AACrC,MAAM,IAAI,OAAO,CAAC,eAAe,EAAE;AACnC,QAAQ,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;AACjC,OAAO,MAAM;AACb,QAAQ,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjD,QAAQ,iBAAiB,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AACnE,OAAO;AACP,KAAK;AACL,IAAI,SAAS,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;AAC7C,IAAI,MAAM,YAAY,GAAG;AACzB,MAAM,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,iBAAiB,EAAE,GAAG,OAAO,EAAE;AAC7E,MAAM,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE;AAC1C,KAAK,CAAC;AACN,IAAI,IAAI,SAAS,KAAK,KAAK,CAAC,EAAE;AAC9B,MAAM,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;AACpC,KAAK;AACL,IAAI,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;AACzE,IAAI,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;AACjC,GAAG;AACH,EAAE,gBAAgB,GAAG;AACrB,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAClC,GAAG;AACH,EAAE,mBAAmB,GAAG;AACxB,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACrC,GAAG;AACH,EAAE,OAAO,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC7C,IAAI,MAAM,YAAY,GAAG,8CAA8C,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvF,IAAI,MAAM,OAAO,GAAG,YAAY,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC;AAClD,IAAI,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAC;AACjH,IAAI,IAAI,UAAU,GAAG,EAAE,CAAC;AACxB,IAAI,IAAI,MAAM,KAAK,QAAQ,iBAAiB,SAAS,KAAK,4BAA4B,EAAE;AACxF,MAAM,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,MAAM,MAAM,SAAS,GAAG,gBAAgB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AAC3D,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;AAC5D,QAAQ,UAAU,IAAI,qBAAqB,CAAC;AAC5C,OAAO;AACP,KAAK;AACL,IAAI,OAAO;AACX,MAAM,cAAc,EAAE,OAAO;AAC7B,MAAM,WAAW,EAAE,SAAS,GAAG,UAAU;AACzC,MAAM,QAAQ,EAAE,QAAQ;AACxB,KAAK,CAAC;AACN,GAAG;AACH,CAAC,CAAC;AACQ,IAAC,cAAc,GAAG,gBAAgB;AAC5C,MAAM,GAAG,IAAI,OAAO,EAAE;;;;"}
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function isErrorGroupWrapper(error) {
6
+ return Reflect.has(error, "_errors");
7
+ }
8
+ function isErrorResponse(error) {
9
+ return typeof Reflect.get(error, "message") === "string";
10
+ }
11
+ class DiscordAPIError extends Error {
12
+ constructor(rawError, code, status, method, url, bodyData) {
13
+ super(DiscordAPIError.getMessage(rawError));
14
+ this.rawError = rawError;
15
+ this.code = code;
16
+ this.status = status;
17
+ this.method = method;
18
+ this.url = url;
19
+ this.requestBody = { files: bodyData.files, json: bodyData.body };
20
+ }
21
+ get name() {
22
+ return `${DiscordAPIError.name}[${this.code}]`;
23
+ }
24
+ static getMessage(error) {
25
+ let flattened = "";
26
+ if ("code" in error) {
27
+ if (error.errors) {
28
+ flattened = [...this.flattenDiscordError(error.errors)].join("\n");
29
+ }
30
+ return error.message && flattened ? `${error.message}
31
+ ${flattened}` : error.message || flattened || "Unknown Error";
32
+ }
33
+ return error.error_description ?? "No Description";
34
+ }
35
+ static *flattenDiscordError(obj, key = "") {
36
+ if (isErrorResponse(obj)) {
37
+ return yield `${key.length ? `${key}[${obj.code}]` : `${obj.code}`}: ${obj.message}`.trim();
38
+ }
39
+ for (const [k, v] of Object.entries(obj)) {
40
+ const nextKey = k.startsWith("_") ? key : key ? Number.isNaN(Number(k)) ? `${key}.${k}` : `${key}[${k}]` : k;
41
+ if (typeof v === "string") {
42
+ yield v;
43
+ } else if (isErrorGroupWrapper(v)) {
44
+ for (const error of v._errors) {
45
+ yield* this.flattenDiscordError(error, nextKey);
46
+ }
47
+ } else {
48
+ yield* this.flattenDiscordError(v, nextKey);
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ exports.DiscordAPIError = DiscordAPIError;
55
+ //# sourceMappingURL=DiscordAPIError.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscordAPIError.cjs","sources":["../../../src/lib/errors/DiscordAPIError.ts"],"sourcesContent":["import type { InternalRequest, RawFile } from '../RequestManager';\n\ninterface DiscordErrorFieldInformation {\n\tcode: string;\n\tmessage: string;\n}\n\ninterface DiscordErrorGroupWrapper {\n\t_errors: DiscordError[];\n}\n\ntype DiscordError = DiscordErrorGroupWrapper | DiscordErrorFieldInformation | { [k: string]: DiscordError } | string;\n\nexport interface DiscordErrorData {\n\tcode: number;\n\tmessage: string;\n\terrors?: DiscordError;\n}\n\nexport interface OAuthErrorData {\n\terror: string;\n\terror_description?: string;\n}\n\nexport interface RequestBody {\n\tfiles: RawFile[] | undefined;\n\tjson: unknown | undefined;\n}\n\nfunction isErrorGroupWrapper(error: DiscordError): error is DiscordErrorGroupWrapper {\n\treturn Reflect.has(error as Record<string, unknown>, '_errors');\n}\n\nfunction isErrorResponse(error: DiscordError): error is DiscordErrorFieldInformation {\n\treturn typeof Reflect.get(error as Record<string, unknown>, 'message') === 'string';\n}\n\n/**\n * Represents an API error returned by Discord\n * @extends Error\n */\nexport class DiscordAPIError extends Error {\n\tpublic requestBody: RequestBody;\n\n\t/**\n\t * @param rawError - The error reported by Discord\n\t * @param code - The error code reported by Discord\n\t * @param status - The status code of the response\n\t * @param method - The method of the request that erred\n\t * @param url - The url of the request that erred\n\t * @param bodyData - The unparsed data for the request that errored\n\t */\n\tpublic constructor(\n\t\tpublic rawError: DiscordErrorData | OAuthErrorData,\n\t\tpublic code: number | string,\n\t\tpublic status: number,\n\t\tpublic method: string,\n\t\tpublic url: string,\n\t\tbodyData: Pick<InternalRequest, 'files' | 'body'>,\n\t) {\n\t\tsuper(DiscordAPIError.getMessage(rawError));\n\n\t\tthis.requestBody = { files: bodyData.files, json: bodyData.body };\n\t}\n\n\t/**\n\t * The name of the error\n\t */\n\tpublic override get name(): string {\n\t\treturn `${DiscordAPIError.name}[${this.code}]`;\n\t}\n\n\tprivate static getMessage(error: DiscordErrorData | OAuthErrorData) {\n\t\tlet flattened = '';\n\t\tif ('code' in error) {\n\t\t\tif (error.errors) {\n\t\t\t\tflattened = [...this.flattenDiscordError(error.errors)].join('\\n');\n\t\t\t}\n\t\t\treturn error.message && flattened\n\t\t\t\t? `${error.message}\\n${flattened}`\n\t\t\t\t: error.message || flattened || 'Unknown Error';\n\t\t}\n\t\treturn error.error_description ?? 'No Description';\n\t}\n\n\tprivate static *flattenDiscordError(obj: DiscordError, key = ''): IterableIterator<string> {\n\t\tif (isErrorResponse(obj)) {\n\t\t\treturn yield `${key.length ? `${key}[${obj.code}]` : `${obj.code}`}: ${obj.message}`.trim();\n\t\t}\n\n\t\tfor (const [k, v] of Object.entries(obj)) {\n\t\t\tconst nextKey = k.startsWith('_') ? key : key ? (Number.isNaN(Number(k)) ? `${key}.${k}` : `${key}[${k}]`) : k;\n\n\t\t\tif (typeof v === 'string') {\n\t\t\t\tyield v;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t} else if (isErrorGroupWrapper(v)) {\n\t\t\t\tfor (const error of v._errors) {\n\t\t\t\t\tyield* this.flattenDiscordError(error, nextKey);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\tyield* this.flattenDiscordError(v, nextKey);\n\t\t\t}\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { InternalRequest, RawFile } from '../RequestManager';
2
+ interface DiscordErrorFieldInformation {
3
+ code: string;
4
+ message: string;
5
+ }
6
+ interface DiscordErrorGroupWrapper {
7
+ _errors: DiscordError[];
8
+ }
9
+ declare type DiscordError = DiscordErrorGroupWrapper | DiscordErrorFieldInformation | {
10
+ [k: string]: DiscordError;
11
+ } | string;
12
+ export interface DiscordErrorData {
13
+ code: number;
14
+ message: string;
15
+ errors?: DiscordError;
16
+ }
17
+ export interface OAuthErrorData {
18
+ error: string;
19
+ error_description?: string;
20
+ }
21
+ export interface RequestBody {
22
+ files: RawFile[] | undefined;
23
+ json: unknown | undefined;
24
+ }
25
+ /**
26
+ * Represents an API error returned by Discord
27
+ * @extends Error
28
+ */
29
+ export declare class DiscordAPIError extends Error {
30
+ rawError: DiscordErrorData | OAuthErrorData;
31
+ code: number | string;
32
+ status: number;
33
+ method: string;
34
+ url: string;
35
+ requestBody: RequestBody;
36
+ /**
37
+ * @param rawError - The error reported by Discord
38
+ * @param code - The error code reported by Discord
39
+ * @param status - The status code of the response
40
+ * @param method - The method of the request that erred
41
+ * @param url - The url of the request that erred
42
+ * @param bodyData - The unparsed data for the request that errored
43
+ */
44
+ constructor(rawError: DiscordErrorData | OAuthErrorData, code: number | string, status: number, method: string, url: string, bodyData: Pick<InternalRequest, 'files' | 'body'>);
45
+ /**
46
+ * The name of the error
47
+ */
48
+ get name(): string;
49
+ private static getMessage;
50
+ private static flattenDiscordError;
51
+ }
52
+ export {};
53
+ //# sourceMappingURL=DiscordAPIError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscordAPIError.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/DiscordAPIError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAElE,UAAU,4BAA4B;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,wBAAwB;IACjC,OAAO,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,aAAK,YAAY,GAAG,wBAAwB,GAAG,4BAA4B,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,GAAG,MAAM,CAAC;AAErH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1B;AAUD;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAYjC,QAAQ,EAAE,gBAAgB,GAAG,cAAc;IAC3C,IAAI,EAAE,MAAM,GAAG,MAAM;IACrB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,MAAM;IAfZ,WAAW,EAAE,WAAW,CAAC;IAEhC;;;;;;;OAOG;gBAEK,QAAQ,EAAE,gBAAgB,GAAG,cAAc,EAC3C,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EAClB,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC;IAOlD;;OAEG;IACH,IAAoB,IAAI,IAAI,MAAM,CAEjC;IAED,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB,OAAO,CAAC,MAAM,CAAE,mBAAmB;CAqBnC"}
@@ -0,0 +1,51 @@
1
+ function isErrorGroupWrapper(error) {
2
+ return Reflect.has(error, "_errors");
3
+ }
4
+ function isErrorResponse(error) {
5
+ return typeof Reflect.get(error, "message") === "string";
6
+ }
7
+ class DiscordAPIError extends Error {
8
+ constructor(rawError, code, status, method, url, bodyData) {
9
+ super(DiscordAPIError.getMessage(rawError));
10
+ this.rawError = rawError;
11
+ this.code = code;
12
+ this.status = status;
13
+ this.method = method;
14
+ this.url = url;
15
+ this.requestBody = { files: bodyData.files, json: bodyData.body };
16
+ }
17
+ get name() {
18
+ return `${DiscordAPIError.name}[${this.code}]`;
19
+ }
20
+ static getMessage(error) {
21
+ let flattened = "";
22
+ if ("code" in error) {
23
+ if (error.errors) {
24
+ flattened = [...this.flattenDiscordError(error.errors)].join("\n");
25
+ }
26
+ return error.message && flattened ? `${error.message}
27
+ ${flattened}` : error.message || flattened || "Unknown Error";
28
+ }
29
+ return error.error_description ?? "No Description";
30
+ }
31
+ static *flattenDiscordError(obj, key = "") {
32
+ if (isErrorResponse(obj)) {
33
+ return yield `${key.length ? `${key}[${obj.code}]` : `${obj.code}`}: ${obj.message}`.trim();
34
+ }
35
+ for (const [k, v] of Object.entries(obj)) {
36
+ const nextKey = k.startsWith("_") ? key : key ? Number.isNaN(Number(k)) ? `${key}.${k}` : `${key}[${k}]` : k;
37
+ if (typeof v === "string") {
38
+ yield v;
39
+ } else if (isErrorGroupWrapper(v)) {
40
+ for (const error of v._errors) {
41
+ yield* this.flattenDiscordError(error, nextKey);
42
+ }
43
+ } else {
44
+ yield* this.flattenDiscordError(v, nextKey);
45
+ }
46
+ }
47
+ }
48
+ }
49
+
50
+ export { DiscordAPIError };
51
+ //# sourceMappingURL=DiscordAPIError.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscordAPIError.mjs","sources":["../../../src/lib/errors/DiscordAPIError.ts"],"sourcesContent":["import type { InternalRequest, RawFile } from '../RequestManager';\n\ninterface DiscordErrorFieldInformation {\n\tcode: string;\n\tmessage: string;\n}\n\ninterface DiscordErrorGroupWrapper {\n\t_errors: DiscordError[];\n}\n\ntype DiscordError = DiscordErrorGroupWrapper | DiscordErrorFieldInformation | { [k: string]: DiscordError } | string;\n\nexport interface DiscordErrorData {\n\tcode: number;\n\tmessage: string;\n\terrors?: DiscordError;\n}\n\nexport interface OAuthErrorData {\n\terror: string;\n\terror_description?: string;\n}\n\nexport interface RequestBody {\n\tfiles: RawFile[] | undefined;\n\tjson: unknown | undefined;\n}\n\nfunction isErrorGroupWrapper(error: DiscordError): error is DiscordErrorGroupWrapper {\n\treturn Reflect.has(error as Record<string, unknown>, '_errors');\n}\n\nfunction isErrorResponse(error: DiscordError): error is DiscordErrorFieldInformation {\n\treturn typeof Reflect.get(error as Record<string, unknown>, 'message') === 'string';\n}\n\n/**\n * Represents an API error returned by Discord\n * @extends Error\n */\nexport class DiscordAPIError extends Error {\n\tpublic requestBody: RequestBody;\n\n\t/**\n\t * @param rawError - The error reported by Discord\n\t * @param code - The error code reported by Discord\n\t * @param status - The status code of the response\n\t * @param method - The method of the request that erred\n\t * @param url - The url of the request that erred\n\t * @param bodyData - The unparsed data for the request that errored\n\t */\n\tpublic constructor(\n\t\tpublic rawError: DiscordErrorData | OAuthErrorData,\n\t\tpublic code: number | string,\n\t\tpublic status: number,\n\t\tpublic method: string,\n\t\tpublic url: string,\n\t\tbodyData: Pick<InternalRequest, 'files' | 'body'>,\n\t) {\n\t\tsuper(DiscordAPIError.getMessage(rawError));\n\n\t\tthis.requestBody = { files: bodyData.files, json: bodyData.body };\n\t}\n\n\t/**\n\t * The name of the error\n\t */\n\tpublic override get name(): string {\n\t\treturn `${DiscordAPIError.name}[${this.code}]`;\n\t}\n\n\tprivate static getMessage(error: DiscordErrorData | OAuthErrorData) {\n\t\tlet flattened = '';\n\t\tif ('code' in error) {\n\t\t\tif (error.errors) {\n\t\t\t\tflattened = [...this.flattenDiscordError(error.errors)].join('\\n');\n\t\t\t}\n\t\t\treturn error.message && flattened\n\t\t\t\t? `${error.message}\\n${flattened}`\n\t\t\t\t: error.message || flattened || 'Unknown Error';\n\t\t}\n\t\treturn error.error_description ?? 'No Description';\n\t}\n\n\tprivate static *flattenDiscordError(obj: DiscordError, key = ''): IterableIterator<string> {\n\t\tif (isErrorResponse(obj)) {\n\t\t\treturn yield `${key.length ? `${key}[${obj.code}]` : `${obj.code}`}: ${obj.message}`.trim();\n\t\t}\n\n\t\tfor (const [k, v] of Object.entries(obj)) {\n\t\t\tconst nextKey = k.startsWith('_') ? key : key ? (Number.isNaN(Number(k)) ? `${key}.${k}` : `${key}[${k}]`) : k;\n\n\t\t\tif (typeof v === 'string') {\n\t\t\t\tyield v;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t} else if (isErrorGroupWrapper(v)) {\n\t\t\t\tfor (const error of v._errors) {\n\t\t\t\t\tyield* this.flattenDiscordError(error, nextKey);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\tyield* this.flattenDiscordError(v, nextKey);\n\t\t\t}\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ class HTTPError extends Error {
6
+ constructor(name, status, method, url, bodyData) {
7
+ super();
8
+ this.name = name;
9
+ this.status = status;
10
+ this.method = method;
11
+ this.url = url;
12
+ this.requestBody = { files: bodyData.files, json: bodyData.body };
13
+ }
14
+ }
15
+
16
+ exports.HTTPError = HTTPError;
17
+ //# sourceMappingURL=HTTPError.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HTTPError.cjs","sources":["../../../src/lib/errors/HTTPError.ts"],"sourcesContent":["import type { RequestBody } from './DiscordAPIError';\nimport type { InternalRequest } from '../RequestManager';\n\n/**\n * Represents a HTTP error\n */\nexport class HTTPError extends Error {\n\tpublic requestBody: RequestBody;\n\n\t/**\n\t * @param name - The name of the error\n\t * @param status - The status code of the response\n\t * @param method - The method of the request that erred\n\t * @param url - The url of the request that erred\n\t * @param bodyData - The unparsed data for the request that errored\n\t */\n\tpublic constructor(\n\t\tpublic override name: string,\n\t\tpublic status: number,\n\t\tpublic method: string,\n\t\tpublic url: string,\n\t\tbodyData: Pick<InternalRequest, 'files' | 'body'>,\n\t) {\n\t\tsuper();\n\n\t\tthis.requestBody = { files: bodyData.files, json: bodyData.body };\n\t}\n}\n"],"names":[],"mappings":";;;;AAAO,MAAM,SAAS,SAAS,KAAK,CAAC;AACrC,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE;AACnD,IAAI,KAAK,EAAE,CAAC;AACZ,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACrB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AACnB,IAAI,IAAI,CAAC,WAAW,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AACtE,GAAG;AACH;;;;"}
@@ -0,0 +1,21 @@
1
+ import type { RequestBody } from './DiscordAPIError';
2
+ import type { InternalRequest } from '../RequestManager';
3
+ /**
4
+ * Represents a HTTP error
5
+ */
6
+ export declare class HTTPError extends Error {
7
+ name: string;
8
+ status: number;
9
+ method: string;
10
+ url: string;
11
+ requestBody: RequestBody;
12
+ /**
13
+ * @param name - The name of the error
14
+ * @param status - The status code of the response
15
+ * @param method - The method of the request that erred
16
+ * @param url - The url of the request that erred
17
+ * @param bodyData - The unparsed data for the request that errored
18
+ */
19
+ constructor(name: string, status: number, method: string, url: string, bodyData: Pick<InternalRequest, 'files' | 'body'>);
20
+ }
21
+ //# sourceMappingURL=HTTPError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HTTPError.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/HTTPError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAWlB,IAAI,EAAE,MAAM;IACrB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,MAAM;IAbZ,WAAW,EAAE,WAAW,CAAC;IAEhC;;;;;;OAMG;gBAEc,IAAI,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EAClB,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC;CAMlD"}
@@ -0,0 +1,13 @@
1
+ class HTTPError extends Error {
2
+ constructor(name, status, method, url, bodyData) {
3
+ super();
4
+ this.name = name;
5
+ this.status = status;
6
+ this.method = method;
7
+ this.url = url;
8
+ this.requestBody = { files: bodyData.files, json: bodyData.body };
9
+ }
10
+ }
11
+
12
+ export { HTTPError };
13
+ //# sourceMappingURL=HTTPError.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HTTPError.mjs","sources":["../../../src/lib/errors/HTTPError.ts"],"sourcesContent":["import type { RequestBody } from './DiscordAPIError';\nimport type { InternalRequest } from '../RequestManager';\n\n/**\n * Represents a HTTP error\n */\nexport class HTTPError extends Error {\n\tpublic requestBody: RequestBody;\n\n\t/**\n\t * @param name - The name of the error\n\t * @param status - The status code of the response\n\t * @param method - The method of the request that erred\n\t * @param url - The url of the request that erred\n\t * @param bodyData - The unparsed data for the request that errored\n\t */\n\tpublic constructor(\n\t\tpublic override name: string,\n\t\tpublic status: number,\n\t\tpublic method: string,\n\t\tpublic url: string,\n\t\tbodyData: Pick<InternalRequest, 'files' | 'body'>,\n\t) {\n\t\tsuper();\n\n\t\tthis.requestBody = { files: bodyData.files, json: bodyData.body };\n\t}\n}\n"],"names":[],"mappings":"AAAO,MAAM,SAAS,SAAS,KAAK,CAAC;AACrC,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE;AACnD,IAAI,KAAK,EAAE,CAAC;AACZ,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACrB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AACnB,IAAI,IAAI,CAAC,WAAW,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AACtE,GAAG;AACH;;;;"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ class RateLimitError extends Error {
6
+ constructor({ timeToReset, limit, method, hash, url, route, majorParameter, global }) {
7
+ super();
8
+ this.timeToReset = timeToReset;
9
+ this.limit = limit;
10
+ this.method = method;
11
+ this.hash = hash;
12
+ this.url = url;
13
+ this.route = route;
14
+ this.majorParameter = majorParameter;
15
+ this.global = global;
16
+ }
17
+ get name() {
18
+ return `${RateLimitError.name}[${this.route}]`;
19
+ }
20
+ }
21
+
22
+ exports.RateLimitError = RateLimitError;
23
+ //# sourceMappingURL=RateLimitError.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitError.cjs","sources":["../../../src/lib/errors/RateLimitError.ts"],"sourcesContent":["import type { RateLimitData } from '../REST';\n\nexport class RateLimitError extends Error implements RateLimitData {\n\tpublic timeToReset: number;\n\tpublic limit: number;\n\tpublic method: string;\n\tpublic hash: string;\n\tpublic url: string;\n\tpublic route: string;\n\tpublic majorParameter: string;\n\tpublic global: boolean;\n\tpublic constructor({ timeToReset, limit, method, hash, url, route, majorParameter, global }: RateLimitData) {\n\t\tsuper();\n\t\tthis.timeToReset = timeToReset;\n\t\tthis.limit = limit;\n\t\tthis.method = method;\n\t\tthis.hash = hash;\n\t\tthis.url = url;\n\t\tthis.route = route;\n\t\tthis.majorParameter = majorParameter;\n\t\tthis.global = global;\n\t}\n\n\t/**\n\t * The name of the error\n\t */\n\tpublic override get name(): string {\n\t\treturn `${RateLimitError.name}[${this.route}]`;\n\t}\n}\n"],"names":[],"mappings":";;;;AAAO,MAAM,cAAc,SAAS,KAAK,CAAC;AAC1C,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE;AACxF,IAAI,KAAK,EAAE,CAAC;AACZ,IAAI,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AACnC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACrB,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AACnB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB,IAAI,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;AACzC,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,GAAG;AACH,EAAE,IAAI,IAAI,GAAG;AACb,IAAI,OAAO,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnD,GAAG;AACH;;;;"}
@@ -0,0 +1,17 @@
1
+ import type { RateLimitData } from '../REST';
2
+ export declare class RateLimitError extends Error implements RateLimitData {
3
+ timeToReset: number;
4
+ limit: number;
5
+ method: string;
6
+ hash: string;
7
+ url: string;
8
+ route: string;
9
+ majorParameter: string;
10
+ global: boolean;
11
+ constructor({ timeToReset, limit, method, hash, url, route, majorParameter, global }: RateLimitData);
12
+ /**
13
+ * The name of the error
14
+ */
15
+ get name(): string;
16
+ }
17
+ //# sourceMappingURL=RateLimitError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitError.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/RateLimitError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,qBAAa,cAAe,SAAQ,KAAM,YAAW,aAAa;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;gBACJ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,aAAa;IAY1G;;OAEG;IACH,IAAoB,IAAI,IAAI,MAAM,CAEjC;CACD"}
@@ -0,0 +1,19 @@
1
+ class RateLimitError extends Error {
2
+ constructor({ timeToReset, limit, method, hash, url, route, majorParameter, global }) {
3
+ super();
4
+ this.timeToReset = timeToReset;
5
+ this.limit = limit;
6
+ this.method = method;
7
+ this.hash = hash;
8
+ this.url = url;
9
+ this.route = route;
10
+ this.majorParameter = majorParameter;
11
+ this.global = global;
12
+ }
13
+ get name() {
14
+ return `${RateLimitError.name}[${this.route}]`;
15
+ }
16
+ }
17
+
18
+ export { RateLimitError };
19
+ //# sourceMappingURL=RateLimitError.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitError.mjs","sources":["../../../src/lib/errors/RateLimitError.ts"],"sourcesContent":["import type { RateLimitData } from '../REST';\n\nexport class RateLimitError extends Error implements RateLimitData {\n\tpublic timeToReset: number;\n\tpublic limit: number;\n\tpublic method: string;\n\tpublic hash: string;\n\tpublic url: string;\n\tpublic route: string;\n\tpublic majorParameter: string;\n\tpublic global: boolean;\n\tpublic constructor({ timeToReset, limit, method, hash, url, route, majorParameter, global }: RateLimitData) {\n\t\tsuper();\n\t\tthis.timeToReset = timeToReset;\n\t\tthis.limit = limit;\n\t\tthis.method = method;\n\t\tthis.hash = hash;\n\t\tthis.url = url;\n\t\tthis.route = route;\n\t\tthis.majorParameter = majorParameter;\n\t\tthis.global = global;\n\t}\n\n\t/**\n\t * The name of the error\n\t */\n\tpublic override get name(): string {\n\t\treturn `${RateLimitError.name}[${this.route}]`;\n\t}\n}\n"],"names":[],"mappings":"AAAO,MAAM,cAAc,SAAS,KAAK,CAAC;AAC1C,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE;AACxF,IAAI,KAAK,EAAE,CAAC;AACZ,IAAI,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AACnC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACrB,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AACnB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB,IAAI,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;AACzC,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,GAAG;AACH,EAAE,IAAI,IAAI,GAAG;AACb,IAAI,OAAO,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnD,GAAG;AACH;;;;"}
@@ -0,0 +1,9 @@
1
+ import type { Dispatcher } from 'undici';
2
+ import type { RequestOptions } from '../REST';
3
+ import type { HandlerRequestData, RouteData } from '../RequestManager';
4
+ export interface IHandler {
5
+ queueRequest: (routeId: RouteData, url: string, options: RequestOptions, requestData: HandlerRequestData) => Promise<Dispatcher.ResponseData>;
6
+ get inactive(): boolean;
7
+ readonly id: string;
8
+ }
9
+ //# sourceMappingURL=IHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IHandler.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/IHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,QAAQ;IACxB,YAAY,EAAE,CACb,OAAO,EAAE,SAAS,EAClB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,kBAAkB,KAC3B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAEtC,IAAI,QAAQ,IAAI,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACpB"}