From 4422c378275bda475504260fd32141c90a70f3d3 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Thu, 30 Jul 2020 00:43:12 +0200 Subject: [PATCH] fix: retry requests with API approach --- src/SASjs.ts | 103 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 30 deletions(-) diff --git a/src/SASjs.ts b/src/SASjs.ts index bc55b7c..3c2ff6f 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -49,6 +49,8 @@ export default class SASjs { private loginUrl: string = ""; private csrfToken: CsrfToken | null = null; private retryCount: number = 0; + private retryCountComputeApi: number = 0; + private retryCountJeseApi: number = 0; private sasjsRequests: SASjsRequest[] = []; private sasjsWaitingRequests: SASjsWaitingRequest[] = []; private userName: string = ""; @@ -409,6 +411,8 @@ export default class SASjs { loginRequiredCallback, accessToken ); + + this.retryCountComputeApi = 0; } else { requestResponse = await this.executeJobViaJesApi( sasJob, @@ -417,6 +421,8 @@ export default class SASjs { loginRequiredCallback, accessToken ); + + this.retryCountJeseApi = 0; } } else { requestResponse = await this.executeJobViaWeb( @@ -510,36 +516,54 @@ export default class SASjs { sasjsWaitingRequest.requestPromise.promise = new Promise( async (resolve, reject) => { - resolve( - await this.sasViyaApiClient - ?.executeComputeJob( - sasJob, - config.contextName, - config.debug, - data, - accessToken - ) - .then((response) => { - if (!config.debug) { - this.appendSasjsRequest(null, sasJob, null); + this.sasViyaApiClient + ?.executeComputeJob( + sasJob, + config.contextName, + config.debug, + data, + accessToken + ) + .then((response) => { + if (!config.debug) { + this.appendSasjsRequest(null, sasJob, null); + } else { + this.appendSasjsRequest(response, sasJob, null); + } + + resolve(JSON.parse(response!.result)); + }) + .catch(async (e) => { + if (needsRetry(JSON.stringify(e))) { + if (this.retryCountComputeApi < requestRetryLimit) { + let retryResponse = await this.executeJobViaComputeApi( + sasJob, + data, + config, + loginRequiredCallback, + accessToken + ); + + this.retryCountComputeApi++; + + resolve(retryResponse); } else { - this.appendSasjsRequest(response, sasJob, null); + this.retryCountComputeApi = 0; + reject({ MESSAGE: "Compute API retry requests limit reached" }); } - return JSON.parse(response!.result); - }) - .catch((e) => { - if (e && e.status === 401) { - if (loginRequiredCallback) loginRequiredCallback(true); - sasjsWaitingRequest.requestPromise.resolve = resolve; - sasjsWaitingRequest.requestPromise.reject = reject; - sasjsWaitingRequest.config = config; - this.sasjsWaitingRequests.push(sasjsWaitingRequest); - } else { - reject({ MESSAGE: e || "Job execution failed" }); - } - }) - ); - } + } + + if (e && e.status === 401) { + if (loginRequiredCallback) loginRequiredCallback(true); + sasjsWaitingRequest.requestPromise.resolve = resolve; + sasjsWaitingRequest.requestPromise.reject = reject; + sasjsWaitingRequest.config = config; + this.sasjsWaitingRequests.push(sasjsWaitingRequest); + } else { + reject({ MESSAGE: e || "Job execution failed" }); + } + }) + } ); return sasjsWaitingRequest.requestPromise.promise; } @@ -589,9 +613,28 @@ export default class SASjs { } return JSON.parse(response!.result); }) - .catch((e) => + .catch(async (e) => { + if (needsRetry(JSON.stringify(e))) { + if (this.retryCountJeseApi < requestRetryLimit) { + let retryResponse = await this.executeJobViaJesApi( + sasJob, + data, + config, + loginRequiredCallback, + accessToken + ); + + this.retryCountJeseApi++; + + resolve(retryResponse); + } else { + this.retryCountJeseApi = 0; + reject({ MESSAGE: "Jes API retry requests limit reached" }); + } + } + reject({ MESSAGE: (e && e.message) || "Job execution failed" }) - ) + }) ); } }