mirror of
https://github.com/sasjs/adapter.git
synced 2026-01-06 12:10:04 +00:00
123 lines
3.2 KiB
TypeScript
123 lines
3.2 KiB
TypeScript
import { ServerType } from '@sasjs/utils/types'
|
|
import { ErrorResponse } from '..'
|
|
import { SASViyaApiClient } from '../SASViyaApiClient'
|
|
import { JobExecutionError, LoginRequiredError, SASjsRequest } from '../types'
|
|
import {
|
|
asyncForEach,
|
|
parseGeneratedCode,
|
|
parseSourceCode,
|
|
parseWeboutResponse
|
|
} from '../utils'
|
|
import { ExecuteFunction, JobExecutor } from './JobExecutor'
|
|
import { parseSasWork } from './parseSasWork'
|
|
|
|
export class JesJobExecutor implements JobExecutor {
|
|
waitingRequests: ExecuteFunction[] = []
|
|
requests: SASjsRequest[] = []
|
|
|
|
constructor(
|
|
private serverUrl: string,
|
|
private sasViyaApiClient: SASViyaApiClient
|
|
) {}
|
|
|
|
async execute(
|
|
sasJob: string,
|
|
data: any,
|
|
config: any,
|
|
loginRequiredCallback?: any,
|
|
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)
|
|
|
|
let responseJson
|
|
|
|
try {
|
|
if (typeof response!.result === 'string') {
|
|
responseJson = JSON.parse(response!.result)
|
|
} else {
|
|
responseJson = response!.result
|
|
}
|
|
} catch {
|
|
responseJson = JSON.parse(parseWeboutResponse(response!.result))
|
|
}
|
|
|
|
return responseJson
|
|
})
|
|
.catch(async (e: Error) => {
|
|
if (e instanceof JobExecutionError) {
|
|
this.appendRequest(e, sasJob, config.debug)
|
|
}
|
|
if (e instanceof LoginRequiredError) {
|
|
await loginCallback()
|
|
this.waitingRequests.push(() =>
|
|
this.execute(sasJob, data, config, loginRequiredCallback)
|
|
)
|
|
}
|
|
return Promise.reject(new ErrorResponse(e?.message, e))
|
|
})
|
|
}
|
|
|
|
resendWaitingRequests = async () => {
|
|
await asyncForEach(
|
|
this.waitingRequests,
|
|
async (waitingRequest: ExecuteFunction) => {
|
|
await waitingRequest()
|
|
}
|
|
)
|
|
|
|
this.waitingRequests = []
|
|
return
|
|
}
|
|
|
|
getRequests = () => this.requests
|
|
|
|
clearRequests = () => {
|
|
this.requests = []
|
|
}
|
|
|
|
private async appendRequest(response: any, program: string, debug: boolean) {
|
|
let sourceCode = ''
|
|
let generatedCode = ''
|
|
let sasWork = null
|
|
|
|
if (debug) {
|
|
if (response?.result && response?.log) {
|
|
sourceCode = parseSourceCode(response.log)
|
|
generatedCode = parseGeneratedCode(response.log)
|
|
|
|
if (response.log) {
|
|
sasWork = response.log
|
|
} else {
|
|
sasWork = JSON.parse(parseWeboutResponse(response.result)).WORK
|
|
}
|
|
} else if (response?.result) {
|
|
sourceCode = parseSourceCode(response.result)
|
|
generatedCode = parseGeneratedCode(response.result)
|
|
sasWork = await parseSasWork(
|
|
response.result,
|
|
debug,
|
|
this.serverUrl,
|
|
ServerType.SasViya
|
|
)
|
|
}
|
|
}
|
|
|
|
this.requests.push({
|
|
logFile: response?.log || response?.result || response,
|
|
serviceLink: program,
|
|
timestamp: new Date(),
|
|
sourceCode,
|
|
generatedCode,
|
|
SASWORK: sasWork
|
|
})
|
|
|
|
if (this.requests.length > 20) {
|
|
this.requests.splice(0, 1)
|
|
}
|
|
}
|
|
}
|