From c7e54cfe9fea29817717ab4d4a8ed330182f79b6 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Tue, 23 Feb 2021 22:36:11 +0100 Subject: [PATCH] fix: web approach login callback and debug issue --- src/job-execution/ComputeJobExecutor.ts | 71 +++++++++++++++---------- src/job-execution/JesJobExecutor.ts | 62 ++++++++++++++------- src/job-execution/WebJobExecutor.ts | 70 ++++++++++++++++-------- src/request/RequestClient.ts | 1 + src/test/ContextManager.spec.ts | 20 ++++++- src/test/SessionManager.spec.ts | 11 +++- 6 files changed, 163 insertions(+), 72 deletions(-) diff --git a/src/job-execution/ComputeJobExecutor.ts b/src/job-execution/ComputeJobExecutor.ts index fa7a6f0..fd54dcf 100644 --- a/src/job-execution/ComputeJobExecutor.ts +++ b/src/job-execution/ComputeJobExecutor.ts @@ -20,35 +20,50 @@ 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) + } + ) + }) + } + }) + }) + + return requestPromise } } diff --git a/src/job-execution/JesJobExecutor.ts b/src/job-execution/JesJobExecutor.ts index dad7b9e..1ee5d68 100644 --- a/src/job-execution/JesJobExecutor.ts +++ b/src/job-execution/JesJobExecutor.ts @@ -17,24 +17,50 @@ 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) + } + ) + }) + } + }) + }) + + return requestPromise } } diff --git a/src/job-execution/WebJobExecutor.ts b/src/job-execution/WebJobExecutor.ts index ad913e8..c3f1479 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,49 @@ 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) + } + ) + }) + } + }) + }) + + return requestPromise } private parseSasViyaDebugResponse = async (response: string) => { diff --git a/src/request/RequestClient.ts b/src/request/RequestClient.ts index e0ff19b..e586be2 100644 --- a/src/request/RequestClient.ts +++ b/src/request/RequestClient.ts @@ -376,6 +376,7 @@ export class RequestClient implements HttpClient { } return { result: parsedResponse as T, + log: response.data, etag } } diff --git a/src/test/ContextManager.spec.ts b/src/test/ContextManager.spec.ts index ad0c11c..d93172d 100644 --- a/src/test/ContextManager.spec.ts +++ b/src/test/ContextManager.spec.ts @@ -8,6 +8,16 @@ const mockedAxios = axios as jest.Mocked describe('ContextManager', () => { dotenv.config() + const sampleLogResponse = { + "items": [{ + "attributes": {}, + "createdBy": "fake creator", + "id": "fakeId", + "name": "Compute Context To Delete", + "version": 2, + }] + } + const contextManager = new ContextManager( process.env.SERVER_URL as string, new RequestClient(process.env.SERVER_URL as string) @@ -448,9 +458,12 @@ describe('ContextManager', () => { Promise.resolve({ data: sampleResponseGetComputeContextByName }) ) + sampleLogResponse.items[0].name = 'updated name' + const expectedResponse = { etag: '', - result: sampleResponseGetComputeContextByName + result: sampleResponseGetComputeContextByName, + log: sampleLogResponse } await expect( @@ -577,9 +590,12 @@ describe('ContextManager', () => { Promise.resolve({ data: sampleResponseDeletedContext }) ) + sampleLogResponse.items[0].name = 'Compute Context To Delete' + const expectedResponse = { etag: '', - result: sampleResponseDeletedContext + result: sampleResponseDeletedContext, + log: sampleLogResponse } await expect( diff --git a/src/test/SessionManager.spec.ts b/src/test/SessionManager.spec.ts index 099af85..5b8cfd8 100644 --- a/src/test/SessionManager.spec.ts +++ b/src/test/SessionManager.spec.ts @@ -25,11 +25,20 @@ describe('SessionManager', () => { version: 1 } + const sampleLogResponse = { + "links": [], + "name": "SYSJOBID", + "ok": true, + "scope": "GLOBAL", + "value": "25218", + "version": 1, + } + mockedAxios.get.mockImplementation(() => Promise.resolve({ data: sampleResponse }) ) - const expectedResponse = { etag: '', result: sampleResponse } + const expectedResponse = { etag: '', result: sampleResponse, log: sampleLogResponse} await expect( sessionManager.getVariable(