From f8e3cbddc1e5aa7cc40fca2fdd831290407ef0c7 Mon Sep 17 00:00:00 2001 From: Oleg Vaskevich Date: Mon, 24 Aug 2020 10:55:12 -0700 Subject: [PATCH 1/2] Append original stack when WebClient#apiCall throws --- packages/web-api/src/WebClient.spec.js | 1 + packages/web-api/src/WebClient.ts | 79 ++++++++++++++------------ 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/packages/web-api/src/WebClient.spec.js b/packages/web-api/src/WebClient.spec.js index 8c9888219..eb089f991 100644 --- a/packages/web-api/src/WebClient.spec.js +++ b/packages/web-api/src/WebClient.spec.js @@ -213,6 +213,7 @@ describe('WebClient', function () { r.catch((error) => { assert.instanceOf(error, Error); this.scope.done(); + assert.match(error.stack, /Error: thrown by\n\s+at WebClient.apiCall/); done(); }); }); diff --git a/packages/web-api/src/WebClient.ts b/packages/web-api/src/WebClient.ts index d4d90b271..ab3c9a670 100644 --- a/packages/web-api/src/WebClient.ts +++ b/packages/web-api/src/WebClient.ts @@ -145,50 +145,57 @@ export class WebClient extends Methods { * @param options - options */ public async apiCall(method: string, options?: WebAPICallOptions): Promise { - this.logger.debug(`apiCall('${method}') start`); + const {stack: originalStack} = new Error('thrown by'); - warnDeprecations(method, this.logger); + try { + this.logger.debug(`apiCall('${method}') start`); - if (typeof options === 'string' || typeof options === 'number' || typeof options === 'boolean') { - throw new TypeError(`Expected an options argument but instead received a ${typeof options}`); - } + warnDeprecations(method, this.logger); - const response = await this.makeRequest(method, Object.assign( - { token: this.token }, - options, - )); - const result = this.buildResult(response); + if (typeof options === 'string' || typeof options === 'number' || typeof options === 'boolean') { + throw new TypeError(`Expected an options argument but instead received a ${typeof options}`); + } - // log warnings in response metadata - if (result.response_metadata !== undefined && result.response_metadata.warnings !== undefined) { - result.response_metadata.warnings.forEach(this.logger.warn.bind(this.logger)); - } + const response = await this.makeRequest(method, Object.assign( + { token: this.token }, + options, + )); + const result = this.buildResult(response); - // log warnings and errors in response metadata messages - // related to https://api.slack.com/changelog/2016-09-28-response-metadata-is-on-the-way - if (result.response_metadata !== undefined && result.response_metadata.messages !== undefined) { - result.response_metadata.messages.forEach((msg) => { - const errReg: RegExp = /\[ERROR\](.*)/; - const warnReg: RegExp = /\[WARN\](.*)/; - if (errReg.test(msg)) { - const errMatch = msg.match(errReg); - if (errMatch != null) { - this.logger.error(errMatch[1].trim()); - } - } else if (warnReg.test(msg)) { - const warnMatch = msg.match(warnReg); - if (warnMatch != null) { - this.logger.warn(warnMatch[1].trim()); + // log warnings in response metadata + if (result.response_metadata !== undefined && result.response_metadata.warnings !== undefined) { + result.response_metadata.warnings.forEach(this.logger.warn.bind(this.logger)); + } + + // log warnings and errors in response metadata messages + // related to https://api.slack.com/changelog/2016-09-28-response-metadata-is-on-the-way + if (result.response_metadata !== undefined && result.response_metadata.messages !== undefined) { + result.response_metadata.messages.forEach((msg) => { + const errReg: RegExp = /\[ERROR\](.*)/; + const warnReg: RegExp = /\[WARN\](.*)/; + if (errReg.test(msg)) { + const errMatch = msg.match(errReg); + if (errMatch != null) { + this.logger.error(errMatch[1].trim()); + } + } else if (warnReg.test(msg)) { + const warnMatch = msg.match(warnReg); + if (warnMatch != null) { + this.logger.warn(warnMatch[1].trim()); + } } - } - }); - } + }); + } - if (!result.ok) { - throw platformErrorFromResult(result as (WebAPICallResult & { error: string; })); - } + if (!result.ok) { + throw platformErrorFromResult(result as (WebAPICallResult & { error: string; })); + } - return result; + return result; + } catch (err) { + err.stack += `\n${originalStack}`; + throw err; + } } /** From c272377704135d62f7b6bff61a32e9d053116714 Mon Sep 17 00:00:00 2001 From: Oleg Vaskevich Date: Tue, 25 Aug 2020 01:51:07 -0700 Subject: [PATCH 2/2] Fix formatting --- packages/web-api/src/WebClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-api/src/WebClient.ts b/packages/web-api/src/WebClient.ts index ab3c9a670..c612223c7 100644 --- a/packages/web-api/src/WebClient.ts +++ b/packages/web-api/src/WebClient.ts @@ -145,7 +145,7 @@ export class WebClient extends Methods { * @param options - options */ public async apiCall(method: string, options?: WebAPICallOptions): Promise { - const {stack: originalStack} = new Error('thrown by'); + const { stack: originalStack } = new Error('thrown by'); try { this.logger.debug(`apiCall('${method}') start`);