1
0
mirror of https://github.com/sasjs/adapter.git synced 2026-01-03 18:50:05 +00:00

Compare commits

..

10 Commits

Author SHA1 Message Date
Allan Bowe
927bb8c78c Merge pull request #91 from sasjs/issue90
Issue90
2020-09-18 17:44:08 +02:00
Mihajlo Medjedovic
509171c484 chore: typedoc 2020-09-18 17:41:09 +02:00
Krishna Acondy
ae98b50a21 Merge branch 'master' into issue90 2020-09-18 16:38:23 +01:00
Yury Shkoda
939e6803e1 Merge pull request #99 from sasjs/issue-96
fix(error): added error handling for http responses with status 401 and 403
2020-09-18 13:30:11 +03:00
Yury Shkoda
6a055a4fc6 fix(error): added error handling for http responses with status 401 and 403 2020-09-18 12:54:17 +03:00
Mihajlo Medjedovic
970e14b2e1 Merge branch 'master' into issue90 2020-09-17 12:19:45 +02:00
Mihajlo Medjedovic
4c9e48550e chore: lint 2020-09-15 13:24:20 +02:00
Mihajlo Medjedovic
8504ec6c4d fix: error response stringify and added raw field 2020-09-15 13:18:26 +02:00
Mihajlo Medjedovic
a0ad8b3f34 Merge branch 'master' into issue90 2020-09-15 13:13:52 +02:00
Mihajlo Medjedovic
53990a9ba3 feat: added type for error response 2020-09-14 16:47:54 +02:00
35 changed files with 4099 additions and 74 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -323,17 +323,14 @@ export class SASViyaApiClient {
{
headers
}
).catch((e) => {
console.error(e)
if (e && e.status === 404) {
).catch((err) => {
if (err && err.status === 404) {
throw new Error(
`The context '${contextName}' was not found on this server.`
)
}
throw new Error(
`An error occurred when fetching the context '${contextName}'.`
)
throw err
})
// An If-Match header with the value of the last ETag for the context
@@ -1388,12 +1385,8 @@ export class SASViyaApiClient {
const { result: contexts } = await this.request<{ items: Context[] }>(
`${this.serverUrl}/compute/contexts?filter=eq(name, "${contextName}")`,
{ headers }
).catch((e) => {
console.error(e)
throw new Error(
`An error occurred when fetching the context '${contextName}'.`
)
).catch((err) => {
throw err
})
if (!contexts || !(contexts.items && contexts.items.length)) {

View File

@@ -30,7 +30,8 @@ import {
ServerType,
CsrfToken,
UploadFile,
EditContextInput
EditContextInput,
ErrorResponse
} from './types'
import { SASViyaApiClient } from './SASViyaApiClient'
import { SAS9ApiClient } from './SAS9ApiClient'
@@ -668,7 +669,9 @@ export default class SASjs {
resolve(retryResponse)
} else {
this.retryCountComputeApi = 0
reject({ MESSAGE: 'Compute API retry requests limit reached.' })
reject(
new ErrorResponse('Compute API retry requests limit reached')
)
}
}
@@ -679,7 +682,7 @@ export default class SASjs {
sasjsWaitingRequest.config = config
this.sasjsWaitingRequests.push(sasjsWaitingRequest)
} else {
reject({ MESSAGE: error || 'Job execution failed.' })
reject(new ErrorResponse('Job execution failed', error))
}
this.appendSasjsRequest(response.log, sasJob, null)
@@ -761,11 +764,13 @@ export default class SASjs {
resolve(retryResponse)
} else {
this.retryCountJeseApi = 0
reject({ MESSAGE: 'JES API retry requests limit reached' })
reject(
new ErrorResponse('Jes API retry requests limit reached')
)
}
}
reject({ MESSAGE: (e && e.message) || 'Job execution failed.' })
reject(new ErrorResponse('Job execution failed', e))
})
)
}
@@ -877,7 +882,7 @@ export default class SASjs {
sasjsWaitingRequest.requestPromise.promise = new Promise(
(resolve, reject) => {
if (isError) {
reject({ MESSAGE: errorMsg })
reject(new ErrorResponse(errorMsg))
}
const headers: any = {}
if (this.csrfTokenWeb) {
@@ -943,9 +948,12 @@ export default class SASjs {
if (jsonResponseText !== '') {
resolve(JSON.parse(jsonResponseText))
} else {
reject({
MESSAGE: this.parseSAS9ErrorResponse(responseText)
})
reject(
new ErrorResponse(
'Job WEB execution failed',
this.parseSAS9ErrorResponse(responseText)
)
)
}
} else if (
config.serverType === ServerType.SASViya &&
@@ -958,15 +966,30 @@ export default class SASjs {
try {
resolve(JSON.parse(resText))
} catch (e) {
reject({ MESSAGE: resText })
reject(
new ErrorResponse(
'Job WEB debug response parsing failed',
{ response: resText, exception: e }
)
)
}
},
(err: any) => {
reject({ MESSAGE: err })
reject(
new ErrorResponse(
'Job WEB debug response parsing failed',
err
)
)
}
)
} catch (e) {
reject({ MESSAGE: responseText })
reject(
new ErrorResponse(
'Job WEB debug response parsing failed',
{ response: responseText, exception: e }
)
)
}
} else {
this.updateUsername(responseText)
@@ -974,14 +997,19 @@ export default class SASjs {
const parsedJson = JSON.parse(responseText)
resolve(parsedJson)
} catch (e) {
reject({ MESSAGE: responseText })
reject(
new ErrorResponse('Job WEB response parsing failed', {
response: responseText,
exception: e
})
)
}
}
}
}
})
.catch((e: Error) => {
reject(e)
reject(new ErrorResponse('Job WEB request failed', e))
})
}
)

View File

@@ -0,0 +1,26 @@
export class ErrorResponse {
body: ErrorBody
constructor(message: string, details?: any) {
let detailsString = ''
let raw
try {
detailsString = JSON.stringify(details)
} catch {
raw = details
}
this.body = {
message,
details: detailsString,
raw
}
}
}
interface ErrorBody {
message: string
details: string
raw: any
}

View File

@@ -9,3 +9,4 @@ export * from './SASjsWaitingRequest'
export * from './ServerType'
export * from './Session'
export * from './UploadFile'
export * from './ErrorResponse'

View File

@@ -37,13 +37,28 @@ export async function makeRequest<T>(
...request,
headers: { ...request.headers, [tokenHeader]: token }
}
return fetch(url, retryRequest).then((res) => {
etag = res.headers.get('ETag')
return responseTransform(res)
})
} else {
let body: any = await response.text()
try {
body = JSON.parse(body)
body.message = `Forbidden. Check your permissions and user groups. ${
body.message || ''
}`
body = JSON.stringify(body)
} catch (_) {}
return Promise.reject({ status: response.status, body })
}
} else {
const body = await response.text()
let body: any = await response.text()
if (needsRetry(body)) {
if (retryCount < retryLimit) {
@@ -65,6 +80,18 @@ export async function makeRequest<T>(
}
}
if (response.status === 401) {
try {
body = JSON.parse(body)
body.message = `Unauthorized request. Check your credentials(client, secret, access token). ${
body.message || ''
}`
body = JSON.stringify(body)
} catch (_) {}
}
return Promise.reject({ status: response.status, body })
}
} else {
@@ -104,5 +131,6 @@ export async function makeRequest<T>(
return responseTransformed
}
})
return { result, etag }
}