From c3c24eddb525640133a999563eb0a23f45f625c6 Mon Sep 17 00:00:00 2001 From: Michael Kret Date: Wed, 18 May 2022 10:42:52 +0300 Subject: [PATCH 1/2] :hammer: fix and additional option to return response headers --- .../nodes-base/nodes/Discord/Discord.node.ts | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/Discord/Discord.node.ts b/packages/nodes-base/nodes/Discord/Discord.node.ts index 03b3a3ec88528..112c61eea30cd 100644 --- a/packages/nodes-base/nodes/Discord/Discord.node.ts +++ b/packages/nodes-base/nodes/Discord/Discord.node.ts @@ -98,6 +98,13 @@ export class Discord implements INodeType { typeOptions: { alwaysOpenEditWindow: true, editor: 'code' }, default: '', }, + { + displayName: 'Return Response Headers', + name: 'returnResponseHeaders', + type: 'boolean', + default: false, + description: 'Whether to return response headers or just confirmation of success', + }, { displayName: 'Username', name: 'username', @@ -204,6 +211,7 @@ export class Discord implements INodeType { if(!body.payload_json){ requestOptions = { + resolveWithFullResponse: true, method: 'POST', body, uri: webhookUri, @@ -214,6 +222,7 @@ export class Discord implements INodeType { }; }else { requestOptions = { + resolveWithFullResponse: true, method: 'POST', body, uri: webhookUri, @@ -223,33 +232,53 @@ export class Discord implements INodeType { }; } let maxTries = 5; + let response; + do { try { - await this.helpers.request(requestOptions); + response = await this.helpers.request(requestOptions); + const resetAfter = response.headers['x-ratelimit-reset-after'] * 1000; + const remainingRatelimit = response.headers['x-ratelimit-remaining']; + + // remaining requests 0 + // https://discord.com/developers/docs/topics/rate-limits + if (!+remainingRatelimit) { + await new Promise((resolve) => + setTimeout(resolve, resetAfter || 1000), + ); + } + break; } catch (error) { + // HTTP/1.1 429 TOO MANY REQUESTS + // Await when the current rate limit will reset + // https://discord.com/developers/docs/topics/rate-limits if (error.statusCode === 429) { - //* Await ratelimit to be over + const retryAfter = error.response?.headers['retry-after'] || 1000; + await new Promise((resolve) => - setTimeout(resolve, error.response.body.retry_after || 150), + setTimeout(resolve, +retryAfter), ); continue; } - //* Different Discord error, throw it throw error; } } while (--maxTries); if (maxTries <= 0) { throw new Error( - 'Could not send Webhook message. Max. amount of rate-limit retries reached.', + 'Could not send Webhook message. Max amount of rate-limit retries reached.', ); } - returnData.push({ success: true }); - } + if (options.returnResponseHeaders && response.headers) { + returnData.push(response.headers); + } else { + returnData.push({ success: true }); + } + } return [this.helpers.returnJsonArray(returnData)]; } From c32a41972e99b7e3a206908d7ac0f77f32796807 Mon Sep 17 00:00:00 2001 From: ricardo Date: Wed, 25 May 2022 19:00:59 -0400 Subject: [PATCH 2/2] :zap: Remove "return response headers" parameter --- packages/nodes-base/nodes/Discord/Discord.node.ts | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/packages/nodes-base/nodes/Discord/Discord.node.ts b/packages/nodes-base/nodes/Discord/Discord.node.ts index 112c61eea30cd..378088096d68e 100644 --- a/packages/nodes-base/nodes/Discord/Discord.node.ts +++ b/packages/nodes-base/nodes/Discord/Discord.node.ts @@ -98,13 +98,6 @@ export class Discord implements INodeType { typeOptions: { alwaysOpenEditWindow: true, editor: 'code' }, default: '', }, - { - displayName: 'Return Response Headers', - name: 'returnResponseHeaders', - type: 'boolean', - default: false, - description: 'Whether to return response headers or just confirmation of success', - }, { displayName: 'Username', name: 'username', @@ -124,8 +117,6 @@ export class Discord implements INodeType { ], }; - - async execute(this: IExecuteFunctions): Promise { const returnData: IDataObject[] = []; @@ -273,11 +264,7 @@ export class Discord implements INodeType { ); } - if (options.returnResponseHeaders && response.headers) { - returnData.push(response.headers); - } else { - returnData.push({ success: true }); - } + returnData.push({ success: true }); } return [this.helpers.returnJsonArray(returnData)];