From c7e54cfe9fea29817717ab4d4a8ed330182f79b6 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Tue, 23 Feb 2021 22:36:11 +0100 Subject: [PATCH 1/6] 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( From 4b28ee8e730db578ab9d45fc63fcc930d4eb01f9 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Tue, 23 Feb 2021 22:36:32 +0100 Subject: [PATCH 2/6] style: lint --- src/test/ContextManager.spec.ts | 16 +++++++++------- src/test/SessionManager.spec.ts | 18 +++++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/test/ContextManager.spec.ts b/src/test/ContextManager.spec.ts index d93172d..de58b32 100644 --- a/src/test/ContextManager.spec.ts +++ b/src/test/ContextManager.spec.ts @@ -9,13 +9,15 @@ describe('ContextManager', () => { dotenv.config() const sampleLogResponse = { - "items": [{ - "attributes": {}, - "createdBy": "fake creator", - "id": "fakeId", - "name": "Compute Context To Delete", - "version": 2, - }] + items: [ + { + attributes: {}, + createdBy: 'fake creator', + id: 'fakeId', + name: 'Compute Context To Delete', + version: 2 + } + ] } const contextManager = new ContextManager( diff --git a/src/test/SessionManager.spec.ts b/src/test/SessionManager.spec.ts index 5b8cfd8..c509741 100644 --- a/src/test/SessionManager.spec.ts +++ b/src/test/SessionManager.spec.ts @@ -26,19 +26,23 @@ describe('SessionManager', () => { } const sampleLogResponse = { - "links": [], - "name": "SYSJOBID", - "ok": true, - "scope": "GLOBAL", - "value": "25218", - "version": 1, + links: [], + name: 'SYSJOBID', + ok: true, + scope: 'GLOBAL', + value: '25218', + version: 1 } mockedAxios.get.mockImplementation(() => Promise.resolve({ data: sampleResponse }) ) - const expectedResponse = { etag: '', result: sampleResponse, log: sampleLogResponse} + const expectedResponse = { + etag: '', + result: sampleResponse, + log: sampleLogResponse + } await expect( sessionManager.getVariable( From f2c8e40430a56f9a889f64cd16cfa41490764678 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Tue, 23 Feb 2021 22:58:48 +0100 Subject: [PATCH 3/6] chore: cleanup, parseResponse optimization --- src/request/RequestClient.ts | 13 +++++++++++-- src/test/ContextManager.spec.ts | 20 ++------------------ src/test/SessionManager.spec.ts | 11 +---------- 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/src/request/RequestClient.ts b/src/request/RequestClient.ts index e586be2..a5e26b0 100644 --- a/src/request/RequestClient.ts +++ b/src/request/RequestClient.ts @@ -360,6 +360,7 @@ export class RequestClient implements HttpClient { private async parseResponse(response: AxiosResponse) { const etag = response?.headers ? response.headers['etag'] : '' let parsedResponse + let includeSAS9Log: boolean = false try { if (typeof response.data === 'string') { @@ -373,12 +374,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, - log: response.data, etag } + + if (includeSAS9Log) { + responseToReturn.log = response.data + } + + return responseToReturn } } diff --git a/src/test/ContextManager.spec.ts b/src/test/ContextManager.spec.ts index de58b32..da97a01 100644 --- a/src/test/ContextManager.spec.ts +++ b/src/test/ContextManager.spec.ts @@ -8,18 +8,6 @@ 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) @@ -460,12 +448,10 @@ describe('ContextManager', () => { Promise.resolve({ data: sampleResponseGetComputeContextByName }) ) - sampleLogResponse.items[0].name = 'updated name' - const expectedResponse = { etag: '', result: sampleResponseGetComputeContextByName, - log: sampleLogResponse + log: sampleResponseGetComputeContextByName } await expect( @@ -592,12 +578,10 @@ describe('ContextManager', () => { Promise.resolve({ data: sampleResponseDeletedContext }) ) - sampleLogResponse.items[0].name = 'Compute Context To Delete' - const expectedResponse = { etag: '', result: sampleResponseDeletedContext, - log: sampleLogResponse + log: sampleResponseDeletedContext } await expect( diff --git a/src/test/SessionManager.spec.ts b/src/test/SessionManager.spec.ts index c509741..d904cc5 100644 --- a/src/test/SessionManager.spec.ts +++ b/src/test/SessionManager.spec.ts @@ -25,15 +25,6 @@ describe('SessionManager', () => { version: 1 } - const sampleLogResponse = { - links: [], - name: 'SYSJOBID', - ok: true, - scope: 'GLOBAL', - value: '25218', - version: 1 - } - mockedAxios.get.mockImplementation(() => Promise.resolve({ data: sampleResponse }) ) @@ -41,7 +32,7 @@ describe('SessionManager', () => { const expectedResponse = { etag: '', result: sampleResponse, - log: sampleLogResponse + log: sampleResponse } await expect( From 66d02cf1d1d34a2759c47ebe4eff769127e7504e Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Tue, 23 Feb 2021 23:01:08 +0100 Subject: [PATCH 4/6] style: lint --- src/request/RequestClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/request/RequestClient.ts b/src/request/RequestClient.ts index a5e26b0..8447188 100644 --- a/src/request/RequestClient.ts +++ b/src/request/RequestClient.ts @@ -378,7 +378,7 @@ export class RequestClient implements HttpClient { includeSAS9Log = true } - let responseToReturn: {result: T, etag: any, log?: string} = { + let responseToReturn: { result: T; etag: any; log?: string } = { result: parsedResponse as T, etag } From e0051bf276bb296d2987c39c89907bb3fe667f31 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Wed, 24 Feb 2021 13:15:14 +0100 Subject: [PATCH 5/6] chore: test fixing --- src/test/ContextManager.spec.ts | 6 ++---- src/test/SessionManager.spec.ts | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/test/ContextManager.spec.ts b/src/test/ContextManager.spec.ts index da97a01..ad0c11c 100644 --- a/src/test/ContextManager.spec.ts +++ b/src/test/ContextManager.spec.ts @@ -450,8 +450,7 @@ describe('ContextManager', () => { const expectedResponse = { etag: '', - result: sampleResponseGetComputeContextByName, - log: sampleResponseGetComputeContextByName + result: sampleResponseGetComputeContextByName } await expect( @@ -580,8 +579,7 @@ describe('ContextManager', () => { const expectedResponse = { etag: '', - result: sampleResponseDeletedContext, - log: sampleResponseDeletedContext + result: sampleResponseDeletedContext } await expect( diff --git a/src/test/SessionManager.spec.ts b/src/test/SessionManager.spec.ts index d904cc5..2af3855 100644 --- a/src/test/SessionManager.spec.ts +++ b/src/test/SessionManager.spec.ts @@ -31,8 +31,7 @@ describe('SessionManager', () => { const expectedResponse = { etag: '', - result: sampleResponse, - log: sampleResponse + result: sampleResponse } await expect( From e48b22128d71f73e596a13d2dd66fba6f17b04c1 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Wed, 24 Feb 2021 14:11:00 +0100 Subject: [PATCH 6/6] chore: small fix, error was not beign returned --- src/job-execution/ComputeJobExecutor.ts | 2 ++ src/job-execution/JesJobExecutor.ts | 2 ++ src/job-execution/WebJobExecutor.ts | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/job-execution/ComputeJobExecutor.ts b/src/job-execution/ComputeJobExecutor.ts index fd54dcf..4ed67ed 100644 --- a/src/job-execution/ComputeJobExecutor.ts +++ b/src/job-execution/ComputeJobExecutor.ts @@ -60,6 +60,8 @@ export class ComputeJobExecutor extends BaseJobExecutor { } ) }) + } else { + reject(new ErrorResponse(e?.message, e)) } }) }) diff --git a/src/job-execution/JesJobExecutor.ts b/src/job-execution/JesJobExecutor.ts index 1ee5d68..277f32c 100644 --- a/src/job-execution/JesJobExecutor.ts +++ b/src/job-execution/JesJobExecutor.ts @@ -57,6 +57,8 @@ export class JesJobExecutor extends BaseJobExecutor { } ) }) + } else { + reject(new ErrorResponse(e?.message, e)) } }) }) diff --git a/src/job-execution/WebJobExecutor.ts b/src/job-execution/WebJobExecutor.ts index c3f1479..494cf61 100644 --- a/src/job-execution/WebJobExecutor.ts +++ b/src/job-execution/WebJobExecutor.ts @@ -123,6 +123,8 @@ export class WebJobExecutor extends BaseJobExecutor { } ) }) + } else { + reject(new ErrorResponse(e?.message, e)) } }) })