From 2d6efa2437231e5e9a4920ef3a025666d9ef2c32 Mon Sep 17 00:00:00 2001 From: Yury Shkoda Date: Thu, 4 May 2023 10:57:24 +0300 Subject: [PATCH 1/2] fix(job-execution): fixed webout for SASJS server type --- src/SASjsApiClient.ts | 39 ++++++++++++++++++++------- src/job-execution/SasjsJobExecutor.ts | 10 ++++++- src/request/SasjsRequestClient.ts | 29 +++++++++++++++----- src/utils/getValidJson.ts | 1 + 4 files changed, 62 insertions(+), 17 deletions(-) diff --git a/src/SASjsApiClient.ts b/src/SASjsApiClient.ts index 62cc60a..41201b0 100644 --- a/src/SASjsApiClient.ts +++ b/src/SASjsApiClient.ts @@ -1,11 +1,24 @@ import * as NodeFormData from 'form-data' import { AuthConfig, ServerType, ServicePackSASjs } from '@sasjs/utils/types' +import { prefixMessage } from '@sasjs/utils/error' import { ExecutionQuery } from './types' import { RequestClient } from './request/RequestClient' import { getAccessTokenForSasjs } from './auth/getAccessTokenForSasjs' import { refreshTokensForSasjs } from './auth/refreshTokensForSasjs' import { getTokens } from './auth/getTokens' +// TODO: move to sasjs/utils +export interface SASjsAuthResponse { + access_token: string + refresh_token: string +} + +export interface ScriptExecutionResult { + log: string + webout?: string + printOutput?: string +} + export class SASjsApiClient { constructor(private requestClient: RequestClient) {} @@ -118,18 +131,30 @@ export class SASjsApiClient { code: string, runTime: string = 'sas', authConfig?: AuthConfig - ) { + ): Promise { const access_token = await this.getAccessTokenForRequest(authConfig) - let parsedSasjsServerLog = '' + let executionResult: ScriptExecutionResult = { log: '' } await this.requestClient .post('SASjsApi/code/execute', { code, runTime }, access_token) .then((res: any) => { - if (res.log) parsedSasjsServerLog = res.log + const { log, printOutput } = res + const webout = res.result + + executionResult.log = log + + if (printOutput) executionResult = { ...executionResult, printOutput } + if (webout) executionResult = { ...executionResult, webout } + }) + .catch((err) => { + throw prefixMessage( + err, + 'Error while sending POST request to execute code. ' + ) }) - return parsedSasjsServerLog + return executionResult } /** @@ -152,9 +177,3 @@ export class SASjsApiClient { return refreshTokensForSasjs(this.requestClient, refreshToken) } } - -// todo move to sasjs/utils -export interface SASjsAuthResponse { - access_token: string - refresh_token: string -} diff --git a/src/job-execution/SasjsJobExecutor.ts b/src/job-execution/SasjsJobExecutor.ts index d9fd230..925f639 100644 --- a/src/job-execution/SasjsJobExecutor.ts +++ b/src/job-execution/SasjsJobExecutor.ts @@ -13,7 +13,11 @@ import { generateFileUploadForm } from '../file/generateFileUploadForm' import { RequestClient } from '../request/RequestClient' -import { isRelativePath, appendExtraResponseAttributes } from '../utils' +import { + isRelativePath, + appendExtraResponseAttributes, + getValidJson +} from '../utils' import { BaseJobExecutor } from './JobExecutor' export class SasjsJobExecutor extends BaseJobExecutor { @@ -89,12 +93,16 @@ export class SasjsJobExecutor extends BaseJobExecutor { ) } + const { result } = res.result + if (result && result.trim()) res.result = getValidJson(result) + this.requestClient!.appendRequest(res, sasJob, config.debug) const responseObject = appendExtraResponseAttributes( res, extraResponseAttributes ) + resolve(responseObject) }) .catch(async (e: Error) => { diff --git a/src/request/SasjsRequestClient.ts b/src/request/SasjsRequestClient.ts index 5b99c56..31c91d3 100644 --- a/src/request/SasjsRequestClient.ts +++ b/src/request/SasjsRequestClient.ts @@ -1,6 +1,14 @@ import { RequestClient } from './RequestClient' import { AxiosResponse } from 'axios' -import { SASJS_LOGS_SEPARATOR, getValidJson } from '../utils' +import { SASJS_LOGS_SEPARATOR } from '../utils' + +interface SasjsParsedResponse { + result: T + log: string + etag: string + status: number + printOutput?: string +} /** * Specific request client for SASJS. @@ -27,7 +35,7 @@ export class SasjsRequestClient extends RequestClient { protected parseResponse(response: AxiosResponse) { const etag = response?.headers ? response.headers['etag'] : '' let parsedResponse = {} - let log + let webout, log, printOutput try { if (typeof response.data === 'string') { @@ -38,17 +46,26 @@ export class SasjsRequestClient extends RequestClient { } catch { if (response.data.includes(SASJS_LOGS_SEPARATOR)) { const splittedResponse = response.data.split(SASJS_LOGS_SEPARATOR) + + webout = splittedResponse[0] + if (webout) parsedResponse = webout + log = splittedResponse[1] - if (splittedResponse[0].trim()) - parsedResponse = getValidJson(splittedResponse[0]) - } else parsedResponse = response.data + printOutput = splittedResponse[2] + } else { + parsedResponse = response.data + } } - return { + const returnResult: SasjsParsedResponse = { result: parsedResponse as T, log, etag, status: response.status } + + if (printOutput) returnResult.printOutput = printOutput + + return returnResult } } diff --git a/src/utils/getValidJson.ts b/src/utils/getValidJson.ts index 7a81cb2..63387f0 100644 --- a/src/utils/getValidJson.ts +++ b/src/utils/getValidJson.ts @@ -17,6 +17,7 @@ export const getValidJson = (str: string | object): object => { return JSON.parse(str) } catch (e: any) { if (e instanceof JsonParseArrayError) throw e + throw new InvalidJsonError() } } From 0f47326bb6c220e36fcc66355218e6580d479e0e Mon Sep 17 00:00:00 2001 From: Yury Shkoda Date: Thu, 4 May 2023 12:21:22 +0300 Subject: [PATCH 2/2] chore(execute-script): improved code style --- src/SASjsApiClient.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/SASjsApiClient.ts b/src/SASjsApiClient.ts index 41201b0..e9bd8e8 100644 --- a/src/SASjsApiClient.ts +++ b/src/SASjsApiClient.ts @@ -133,19 +133,17 @@ export class SASjsApiClient { authConfig?: AuthConfig ): Promise { const access_token = await this.getAccessTokenForRequest(authConfig) - - let executionResult: ScriptExecutionResult = { log: '' } + const executionResult: ScriptExecutionResult = { log: '' } await this.requestClient .post('SASjsApi/code/execute', { code, runTime }, access_token) .then((res: any) => { - const { log, printOutput } = res - const webout = res.result + const { log, printOutput, result: webout } = res executionResult.log = log - if (printOutput) executionResult = { ...executionResult, printOutput } - if (webout) executionResult = { ...executionResult, webout } + if (printOutput) executionResult.printOutput = printOutput + if (webout) executionResult.webout = webout }) .catch((err) => { throw prefixMessage(