diff --git a/src/job-execution/ComputeJobExecutor.ts b/src/job-execution/ComputeJobExecutor.ts index fa7a6f0..4ed67ed 100644 --- a/src/job-execution/ComputeJobExecutor.ts +++ b/src/job-execution/ComputeJobExecutor.ts @@ -20,35 +20,52 @@ export class ComputeJobExecutor extends BaseJobExecutor { const waitForResult = true const expectWebout = true - return this.sasViyaApiClient - ?.executeComputeJob( - sasJob, - config.contextName, - config.debug, - data, - accessToken, - waitForResult, - expectWebout - ) - .then((response) => { - this.appendRequest(response, sasJob, config.debug) - let responseJson + const requestPromise = new Promise((resolve, reject) => { + this.sasViyaApiClient + ?.executeComputeJob( + sasJob, + config.contextName, + config.debug, + data, + accessToken, + waitForResult, + expectWebout + ) + .then((response) => { + this.appendRequest(response, sasJob, config.debug) - return response.result + resolve(response.result) + }) + .catch(async (e: Error) => { + if (e instanceof ComputeJobExecutionError) { + this.appendRequest(e, sasJob, config.debug) - return responseJson - }) - .catch(async (e: Error) => { - if (e instanceof ComputeJobExecutionError) { - this.appendRequest(e, sasJob, config.debug) - } - if (e instanceof LoginRequiredError) { - await loginCallback() - this.appendWaitingRequest(() => - this.execute(sasJob, data, config, loginRequiredCallback) - ) - } - return Promise.reject(new ErrorResponse(e?.message, e)) - }) + reject(new ErrorResponse(e?.message, e)) + } + + if (e instanceof LoginRequiredError) { + await loginCallback() + this.appendWaitingRequest(() => { + return this.execute( + sasJob, + data, + config, + loginRequiredCallback + ).then( + (res: any) => { + resolve(res) + }, + (err: any) => { + reject(err) + } + ) + }) + } else { + reject(new ErrorResponse(e?.message, e)) + } + }) + }) + + return requestPromise } } diff --git a/src/job-execution/JesJobExecutor.ts b/src/job-execution/JesJobExecutor.ts index dad7b9e..277f32c 100644 --- a/src/job-execution/JesJobExecutor.ts +++ b/src/job-execution/JesJobExecutor.ts @@ -17,24 +17,52 @@ export class JesJobExecutor extends BaseJobExecutor { accessToken?: string ) { const loginCallback = loginRequiredCallback || (() => Promise.resolve()) - return await this.sasViyaApiClient - ?.executeJob(sasJob, config.contextName, config.debug, data, accessToken) - .then((response) => { - this.appendRequest(response, sasJob, config.debug) - return response.result - }) - .catch(async (e: Error) => { - if (e instanceof JobExecutionError) { - this.appendRequest(e, sasJob, config.debug) - } - if (e instanceof LoginRequiredError) { - await loginCallback() - this.appendWaitingRequest(() => - this.execute(sasJob, data, config, loginRequiredCallback) - ) - } - return Promise.reject(new ErrorResponse(e?.message, e)) - }) + const requestPromise = new Promise((resolve, reject) => { + this.sasViyaApiClient + ?.executeJob( + sasJob, + config.contextName, + config.debug, + data, + accessToken + ) + .then((response) => { + this.appendRequest(response, sasJob, config.debug) + + resolve(response.result) + }) + .catch(async (e: Error) => { + if (e instanceof JobExecutionError) { + this.appendRequest(e, sasJob, config.debug) + + reject(new ErrorResponse(e?.message, e)) + } + + if (e instanceof LoginRequiredError) { + await loginCallback() + + this.appendWaitingRequest(() => { + return this.execute( + sasJob, + data, + config, + loginRequiredCallback + ).then( + (res: any) => { + resolve(res) + }, + (err: any) => { + reject(err) + } + ) + }) + } else { + reject(new ErrorResponse(e?.message, e)) + } + }) + }) + + return requestPromise } } diff --git a/src/job-execution/WebJobExecutor.ts b/src/job-execution/WebJobExecutor.ts index ad913e8..494cf61 100644 --- a/src/job-execution/WebJobExecutor.ts +++ b/src/job-execution/WebJobExecutor.ts @@ -7,6 +7,11 @@ import { SASViyaApiClient } from '../SASViyaApiClient' import { isRelativePath } from '../utils' import { BaseJobExecutor } from './JobExecutor' +export interface WaitingRequstPromise { + promise: Promise | null + resolve: any + reject: any +} export class WebJobExecutor extends BaseJobExecutor { constructor( serverUrl: string, @@ -80,30 +85,51 @@ export class WebJobExecutor extends BaseJobExecutor { } } - return this.requestClient!.post(apiUrl, formData, undefined) - .then(async (res) => { - if (this.serverType === ServerType.SasViya && config.debug) { - const jsonResponse = await this.parseSasViyaDebugResponse( - res.result as string - ) + const requestPromise = new Promise((resolve, reject) => { + this.requestClient!.post(apiUrl, formData, undefined) + .then(async (res) => { + if (this.serverType === ServerType.SasViya && config.debug) { + const jsonResponse = await this.parseSasViyaDebugResponse( + res.result as string + ) + this.appendRequest(res, sasJob, config.debug) + resolve(jsonResponse) + } this.appendRequest(res, sasJob, config.debug) - return jsonResponse - } - this.appendRequest(res, sasJob, config.debug) - return res.result - }) - .catch(async (e: Error) => { - if (e instanceof JobExecutionError) { - this.appendRequest(e, sasJob, config.debug) - } - if (e instanceof LoginRequiredError) { - await loginCallback() - this.appendWaitingRequest(() => - this.execute(sasJob, data, config, loginRequiredCallback) - ) - } - return Promise.reject(new ErrorResponse(e?.message, e)) - }) + resolve(res.result) + }) + .catch(async (e: Error) => { + if (e instanceof JobExecutionError) { + this.appendRequest(e, sasJob, config.debug) + + reject(new ErrorResponse(e?.message, e)) + } + + if (e instanceof LoginRequiredError) { + await loginCallback() + + this.appendWaitingRequest(() => { + return this.execute( + sasJob, + data, + config, + loginRequiredCallback + ).then( + (res: any) => { + resolve(res) + }, + (err: any) => { + reject(err) + } + ) + }) + } else { + reject(new ErrorResponse(e?.message, e)) + } + }) + }) + + return requestPromise } private parseSasViyaDebugResponse = async (response: string) => { diff --git a/src/request/RequestClient.ts b/src/request/RequestClient.ts index 98a7fd7..1d36fca 100644 --- a/src/request/RequestClient.ts +++ b/src/request/RequestClient.ts @@ -386,6 +386,7 @@ export class RequestClient implements HttpClient { private parseResponse(response: AxiosResponse) { const etag = response?.headers ? response.headers['etag'] : '' let parsedResponse + let includeSAS9Log: boolean = false try { if (typeof response.data === 'string') { @@ -399,11 +400,20 @@ export class RequestClient implements HttpClient { } catch { parsedResponse = response.data } + + includeSAS9Log = true } - return { + + let responseToReturn: { result: T; etag: any; log?: string } = { result: parsedResponse as T, etag } + + if (includeSAS9Log) { + responseToReturn.log = response.data + } + + return responseToReturn } } diff --git a/src/test/SessionManager.spec.ts b/src/test/SessionManager.spec.ts index 099af85..2af3855 100644 --- a/src/test/SessionManager.spec.ts +++ b/src/test/SessionManager.spec.ts @@ -29,7 +29,10 @@ describe('SessionManager', () => { Promise.resolve({ data: sampleResponse }) ) - const expectedResponse = { etag: '', result: sampleResponse } + const expectedResponse = { + etag: '', + result: sampleResponse + } await expect( sessionManager.getVariable(