From e3531e64a8733c5235176bde014e7ddf8177c46f Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 03:29:32 +0000 Subject: [PATCH 01/14] chore: apply user agent string --- packages/discord.js/src/util/Options.js | 6 +++++- packages/rest/src/lib/REST.ts | 2 +- packages/rest/src/lib/utils/constants.ts | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/discord.js/src/util/Options.js b/packages/discord.js/src/util/Options.js index f6106f3bc5cf..69abd4552226 100644 --- a/packages/discord.js/src/util/Options.js +++ b/packages/discord.js/src/util/Options.js @@ -3,6 +3,7 @@ const process = require('node:process'); const { DefaultRestOptions } = require('@discordjs/rest'); const { toSnakeCase } = require('./Transformers'); +const { version } = require('../../package.json'); /** * @typedef {Function} CacheFactory @@ -94,7 +95,10 @@ class Options extends null { }, version: 10, }, - rest: DefaultRestOptions, + rest: { + ...DefaultRestOptions, + userAgentAppendix: `discord.js/${version} Node.js/${process.version}`, + }, jsonTransformer: toSnakeCase, }; } diff --git a/packages/rest/src/lib/REST.ts b/packages/rest/src/lib/REST.ts index d4bd5f5b75fc..824a3cdbec7e 100644 --- a/packages/rest/src/lib/REST.ts +++ b/packages/rest/src/lib/REST.ts @@ -110,7 +110,7 @@ export interface RESTOptions { /** * Extra information to add to the user agent * - * @defaultValue `Node.js ${process.version}` + * @defaultValue `Node.js/${process.version}` */ userAgentAppendix: string; /** diff --git a/packages/rest/src/lib/utils/constants.ts b/packages/rest/src/lib/utils/constants.ts index aada602fb75b..71a8d5d933d9 100644 --- a/packages/rest/src/lib/utils/constants.ts +++ b/packages/rest/src/lib/utils/constants.ts @@ -24,7 +24,7 @@ export const DefaultRestOptions = { rejectOnRateLimit: null, retries: 3, timeout: 15_000, - userAgentAppendix: `Node.js ${process.version}`, + userAgentAppendix: `Node.js/${process.version}`, version: APIVersion, hashSweepInterval: 14_400_000, // 4 Hours hashLifetime: 86_400_000, // 24 Hours From 364c9d0bea0f57718596d92412cafd5a3f4ecc26 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 04:32:19 +0000 Subject: [PATCH 02/14] fix: enforce even in custom option --- packages/discord.js/src/client/BaseClient.js | 10 +++++++++- packages/discord.js/src/util/Options.js | 9 ++++++++- packages/discord.js/typings/index.d.ts | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/discord.js/src/client/BaseClient.js b/packages/discord.js/src/client/BaseClient.js index 60068e164259..9c52289209aa 100644 --- a/packages/discord.js/src/client/BaseClient.js +++ b/packages/discord.js/src/client/BaseClient.js @@ -13,6 +13,7 @@ const { mergeDefault, flatten } = require('../util/Util'); class BaseClient extends EventEmitter { constructor(options = {}) { super({ captureRejections: true }); + const customUserAgentAppendix = options.rest?.userAgentAppendix; if (typeof options !== 'object' || options === null) { throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'options', 'object', true); @@ -28,7 +29,14 @@ class BaseClient extends EventEmitter { * The REST manager of the client * @type {REST} */ - this.rest = new REST(this.options.rest); + this.rest = new REST({ + ...this.options.rest, + ...(customUserAgentAppendix + ? // Merging the default options when a custom user agent appendix is supplied + // Replaces the discord.js string. Enforce it. + { userAgentAppendix: `${Options.userAgentAppendix} ${customUserAgentAppendix}` } + : []), + }); } /** diff --git a/packages/discord.js/src/util/Options.js b/packages/discord.js/src/util/Options.js index 69abd4552226..4517f5c125ad 100644 --- a/packages/discord.js/src/util/Options.js +++ b/packages/discord.js/src/util/Options.js @@ -71,6 +71,13 @@ const { version } = require('../../package.json'); * Contains various utilities for client options. */ class Options extends null { + /** + * The default user agent appendix. + * @memberof Options + * @private + */ + static userAgentAppendix = `discord.js/${version} Node.js/${process.version}`; + /** * The default client options. * @returns {ClientOptions} @@ -97,7 +104,7 @@ class Options extends null { }, rest: { ...DefaultRestOptions, - userAgentAppendix: `discord.js/${version} Node.js/${process.version}`, + userAgentAppendix: this.userAgentAppendix, }, jsonTransformer: toSnakeCase, }; diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index f78620bae886..0fa2ca228cb0 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -1030,6 +1030,7 @@ export class ClientUser extends User { export class Options extends null { private constructor(); + private userAgentAppendix: string; public static get DefaultMakeCacheSettings(): CacheWithLimitsOptions; public static get DefaultSweeperSettings(): SweeperOptions; public static createDefault(): ClientOptions; From 7ebc970bd7738d94af171cf6af599d336f6b4464 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 04:38:35 +0000 Subject: [PATCH 03/14] fix: tests --- packages/discord.js/src/client/BaseClient.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/discord.js/src/client/BaseClient.js b/packages/discord.js/src/client/BaseClient.js index 9c52289209aa..6ebbe7deb660 100644 --- a/packages/discord.js/src/client/BaseClient.js +++ b/packages/discord.js/src/client/BaseClient.js @@ -31,10 +31,10 @@ class BaseClient extends EventEmitter { */ this.rest = new REST({ ...this.options.rest, + // Merging the default options when a custom user agent appendix is supplied + // Replaces the discord.js string. Enforce it. ...(customUserAgentAppendix - ? // Merging the default options when a custom user agent appendix is supplied - // Replaces the discord.js string. Enforce it. - { userAgentAppendix: `${Options.userAgentAppendix} ${customUserAgentAppendix}` } + ? { userAgentAppendix: `${Options.userAgentAppendix} ${customUserAgentAppendix}` } : []), }); } From 41fe732f8811cf517bf4b83831a1952669691d61 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 04:46:41 +0000 Subject: [PATCH 04/14] refactor: simpler way --- packages/discord.js/src/client/BaseClient.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/discord.js/src/client/BaseClient.js b/packages/discord.js/src/client/BaseClient.js index 6ebbe7deb660..f07aff37b9a9 100644 --- a/packages/discord.js/src/client/BaseClient.js +++ b/packages/discord.js/src/client/BaseClient.js @@ -13,7 +13,12 @@ const { mergeDefault, flatten } = require('../util/Util'); class BaseClient extends EventEmitter { constructor(options = {}) { super({ captureRejections: true }); - const customUserAgentAppendix = options.rest?.userAgentAppendix; + + if (options.rest?.userAgentAppendix !== undefined) { + // Merging the default options when a custom user agent appendix is supplied + // Replaces the discord.js string. Enforce it. + options.rest.userAgentAppendix = `${Options.userAgentAppendix} ${options.rest?.userAgentAppendix}`; + } if (typeof options !== 'object' || options === null) { throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'options', 'object', true); @@ -29,14 +34,7 @@ class BaseClient extends EventEmitter { * The REST manager of the client * @type {REST} */ - this.rest = new REST({ - ...this.options.rest, - // Merging the default options when a custom user agent appendix is supplied - // Replaces the discord.js string. Enforce it. - ...(customUserAgentAppendix - ? { userAgentAppendix: `${Options.userAgentAppendix} ${customUserAgentAppendix}` } - : []), - }); + this.rest = new REST(this.options.rest); } /** From b8af3ba1ec7e26bd013ef108a4661a1d05aaa3a9 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 04:47:32 +0000 Subject: [PATCH 05/14] docs: add type --- packages/discord.js/src/util/Options.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/discord.js/src/util/Options.js b/packages/discord.js/src/util/Options.js index 4517f5c125ad..8cd731cfbed0 100644 --- a/packages/discord.js/src/util/Options.js +++ b/packages/discord.js/src/util/Options.js @@ -73,6 +73,7 @@ const { version } = require('../../package.json'); class Options extends null { /** * The default user agent appendix. + * @type {string} * @memberof Options * @private */ From 81465512e981000cb517be9501a4ce0cf320e70a Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 09:55:46 +0000 Subject: [PATCH 06/14] Update packages/discord.js/src/client/BaseClient.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aura Román --- packages/discord.js/src/client/BaseClient.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/discord.js/src/client/BaseClient.js b/packages/discord.js/src/client/BaseClient.js index f07aff37b9a9..35ebaef3082e 100644 --- a/packages/discord.js/src/client/BaseClient.js +++ b/packages/discord.js/src/client/BaseClient.js @@ -17,7 +17,7 @@ class BaseClient extends EventEmitter { if (options.rest?.userAgentAppendix !== undefined) { // Merging the default options when a custom user agent appendix is supplied // Replaces the discord.js string. Enforce it. - options.rest.userAgentAppendix = `${Options.userAgentAppendix} ${options.rest?.userAgentAppendix}`; + options.rest.userAgentAppendix = `${Options.userAgentAppendix} ${options.rest.userAgentAppendix}`; } if (typeof options !== 'object' || options === null) { From 4edaeaeb8cc2537c7af968f0c567e5310a9b1cfb Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 10:20:13 +0000 Subject: [PATCH 07/14] fix: prioritise `option` type check --- packages/discord.js/src/client/BaseClient.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/discord.js/src/client/BaseClient.js b/packages/discord.js/src/client/BaseClient.js index 35ebaef3082e..1090f789380e 100644 --- a/packages/discord.js/src/client/BaseClient.js +++ b/packages/discord.js/src/client/BaseClient.js @@ -14,16 +14,16 @@ class BaseClient extends EventEmitter { constructor(options = {}) { super({ captureRejections: true }); + if (typeof options !== 'object' || options === null) { + throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'options', 'object', true); + } + if (options.rest?.userAgentAppendix !== undefined) { // Merging the default options when a custom user agent appendix is supplied // Replaces the discord.js string. Enforce it. options.rest.userAgentAppendix = `${Options.userAgentAppendix} ${options.rest.userAgentAppendix}`; } - if (typeof options !== 'object' || options === null) { - throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'options', 'object', true); - } - /** * The options the client was instantiated with * @type {ClientOptions} From 517360226457c171b06d48783be72ad23ba26a46 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 10:22:43 +0000 Subject: [PATCH 08/14] types: `static` --- packages/discord.js/typings/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 0fa2ca228cb0..a453d20f9db1 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -1030,7 +1030,7 @@ export class ClientUser extends User { export class Options extends null { private constructor(); - private userAgentAppendix: string; + private static userAgentAppendix: string; public static get DefaultMakeCacheSettings(): CacheWithLimitsOptions; public static get DefaultSweeperSettings(): SweeperOptions; public static createDefault(): ClientOptions; From d17a98431d56672f18806684a53866bb81403949 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 11:45:03 +0000 Subject: [PATCH 09/14] feat: add runtime check --- packages/discord.js/src/util/Options.js | 4 ++-- packages/rest/src/lib/utils/constants.ts | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/discord.js/src/util/Options.js b/packages/discord.js/src/util/Options.js index 8cd731cfbed0..8fbabf433c12 100644 --- a/packages/discord.js/src/util/Options.js +++ b/packages/discord.js/src/util/Options.js @@ -1,7 +1,7 @@ 'use strict'; const process = require('node:process'); -const { DefaultRestOptions } = require('@discordjs/rest'); +const { DefaultRestOptions, DefaultUserAgentAppendix } = require('@discordjs/rest'); const { toSnakeCase } = require('./Transformers'); const { version } = require('../../package.json'); @@ -77,7 +77,7 @@ class Options extends null { * @memberof Options * @private */ - static userAgentAppendix = `discord.js/${version} Node.js/${process.version}`; + static userAgentAppendix = `discord.js/${version}${DefaultUserAgentAppendix}`; /** * The default client options. diff --git a/packages/rest/src/lib/utils/constants.ts b/packages/rest/src/lib/utils/constants.ts index 71a8d5d933d9..71ff49fad62a 100644 --- a/packages/rest/src/lib/utils/constants.ts +++ b/packages/rest/src/lib/utils/constants.ts @@ -6,6 +6,10 @@ import type { RESTOptions } from '../REST.js'; export const DefaultUserAgent = `DiscordBot (https://discord.js.org, [VI]{{inject}}[/VI])` as `DiscordBot (https://discord.js.org, ${string})`; +export const DefaultUserAgentAppendix = + // @ts-expect-error Detecting runtime. + process.release?.name === 'node' ? ` Node.js/${process.version}` : process.isBun ? ` Bun/${process.version}` : ''; + export const DefaultRestOptions = { get agent() { return new Agent({ @@ -24,7 +28,7 @@ export const DefaultRestOptions = { rejectOnRateLimit: null, retries: 3, timeout: 15_000, - userAgentAppendix: `Node.js/${process.version}`, + userAgentAppendix: DefaultUserAgentAppendix, version: APIVersion, hashSweepInterval: 14_400_000, // 4 Hours hashLifetime: 86_400_000, // 24 Hours From 2bc38be585b6c8198e77efa75ea86d3b575057ea Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 11:48:44 +0000 Subject: [PATCH 10/14] docs: update default --- packages/rest/src/lib/REST.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rest/src/lib/REST.ts b/packages/rest/src/lib/REST.ts index 824a3cdbec7e..7369187f4568 100644 --- a/packages/rest/src/lib/REST.ts +++ b/packages/rest/src/lib/REST.ts @@ -110,7 +110,7 @@ export interface RESTOptions { /** * Extra information to add to the user agent * - * @defaultValue `Node.js/${process.version}` + * @defaultValue DefaultUserAgentAppendix */ userAgentAppendix: string; /** From 88587535fba50aaf081111c352f998598880122e Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 12:00:32 +0000 Subject: [PATCH 11/14] refactor: remove Bun --- packages/rest/src/lib/utils/constants.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/rest/src/lib/utils/constants.ts b/packages/rest/src/lib/utils/constants.ts index 71ff49fad62a..f0f1c718fb86 100644 --- a/packages/rest/src/lib/utils/constants.ts +++ b/packages/rest/src/lib/utils/constants.ts @@ -6,9 +6,10 @@ import type { RESTOptions } from '../REST.js'; export const DefaultUserAgent = `DiscordBot (https://discord.js.org, [VI]{{inject}}[/VI])` as `DiscordBot (https://discord.js.org, ${string})`; -export const DefaultUserAgentAppendix = - // @ts-expect-error Detecting runtime. - process.release?.name === 'node' ? ` Node.js/${process.version}` : process.isBun ? ` Bun/${process.version}` : ''; +/** + * The default string to append onto the user agent. + */ +export const DefaultUserAgentAppendix = process.release?.name === 'node' ? ` Node.js/${process.version}` : ''; export const DefaultRestOptions = { get agent() { From fc694ce247ff3638beaff24dc4fa6cc66c7a9599 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 23 Mar 2023 16:33:34 +0000 Subject: [PATCH 12/14] Update packages/discord.js/src/client/BaseClient.js Co-authored-by: Almeida --- packages/discord.js/src/client/BaseClient.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/discord.js/src/client/BaseClient.js b/packages/discord.js/src/client/BaseClient.js index 1090f789380e..3020db823af3 100644 --- a/packages/discord.js/src/client/BaseClient.js +++ b/packages/discord.js/src/client/BaseClient.js @@ -18,7 +18,7 @@ class BaseClient extends EventEmitter { throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'options', 'object', true); } - if (options.rest?.userAgentAppendix !== undefined) { + if (options.rest?.userAgentAppendix) { // Merging the default options when a custom user agent appendix is supplied // Replaces the discord.js string. Enforce it. options.rest.userAgentAppendix = `${Options.userAgentAppendix} ${options.rest.userAgentAppendix}`; From 8be55c2bb6f6048ec1403bc374e0298c84473a34 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Fri, 24 Mar 2023 02:12:46 +0000 Subject: [PATCH 13/14] fix: extra whitespace issues --- packages/discord.js/src/util/Options.js | 2 +- packages/rest/src/lib/utils/constants.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/discord.js/src/util/Options.js b/packages/discord.js/src/util/Options.js index 8fbabf433c12..d5b08418358c 100644 --- a/packages/discord.js/src/util/Options.js +++ b/packages/discord.js/src/util/Options.js @@ -77,7 +77,7 @@ class Options extends null { * @memberof Options * @private */ - static userAgentAppendix = `discord.js/${version}${DefaultUserAgentAppendix}`; + static userAgentAppendix = `discord.js/${version} ${DefaultUserAgentAppendix}`.trim(); /** * The default client options. diff --git a/packages/rest/src/lib/utils/constants.ts b/packages/rest/src/lib/utils/constants.ts index f0f1c718fb86..12ee68be3996 100644 --- a/packages/rest/src/lib/utils/constants.ts +++ b/packages/rest/src/lib/utils/constants.ts @@ -9,7 +9,7 @@ export const DefaultUserAgent = /** * The default string to append onto the user agent. */ -export const DefaultUserAgentAppendix = process.release?.name === 'node' ? ` Node.js/${process.version}` : ''; +export const DefaultUserAgentAppendix = process.release?.name === 'node' ? `Node.js/${process.version}` : ''; export const DefaultRestOptions = { get agent() { From 30178bf667e555a74e5000d981e998e88be45e5f Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Fri, 24 Mar 2023 14:59:14 +0000 Subject: [PATCH 14/14] refactor: `trimEnd()` --- packages/discord.js/src/util/Options.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/discord.js/src/util/Options.js b/packages/discord.js/src/util/Options.js index d5b08418358c..52a756e9446c 100644 --- a/packages/discord.js/src/util/Options.js +++ b/packages/discord.js/src/util/Options.js @@ -77,7 +77,7 @@ class Options extends null { * @memberof Options * @private */ - static userAgentAppendix = `discord.js/${version} ${DefaultUserAgentAppendix}`.trim(); + static userAgentAppendix = `discord.js/${version} ${DefaultUserAgentAppendix}`.trimEnd(); /** * The default client options.