diff --git a/src/SessionManager.ts b/src/SessionManager.ts index 914a686..eb195a0 100644 --- a/src/SessionManager.ts +++ b/src/SessionManager.ts @@ -1,4 +1,5 @@ -import { Session, Context, CsrfToken, SessionVariable } from './types' +import { Session, Context, SessionVariable } from './types' +import { NoSessionStateError } from './types/errors' import { asyncForEach, isUrl } from './utils' import { prefixMessage } from '@sasjs/utils/error' import { RequestClient } from './request/RequestClient' @@ -173,13 +174,14 @@ export class SessionManager { this.printedSessionState.printed = true } - const state = await this.getSessionState( - `${this.serverUrl}${stateLink.href}?wait=30`, - etag!, - accessToken - ).catch((err) => { - throw prefixMessage(err, 'Error while getting session state.') - }) + const { result: state, responseStatus: responseStatus } = + await this.getSessionState( + `${this.serverUrl}${stateLink.href}?wait=30`, + etag!, + accessToken + ).catch((err) => { + throw prefixMessage(err, 'Error while getting session state.') + }) sessionState = state.trim() @@ -198,7 +200,14 @@ export class SessionManager { resolve(this.waitForSession(session, etag, accessToken)) } else { - reject('Could not get session state.') + reject( + new NoSessionStateError( + responseStatus, + this.serverUrl + stateLink.href, + session.links.find((l: any) => l.rel === 'log') + ?.href as string + ) + ) } } @@ -217,7 +226,10 @@ export class SessionManager { ) { return await this.requestClient .get(url, accessToken, 'text/plain', { 'If-None-Match': etag }) - .then((res) => res.result as string) + .then((res) => ({ + result: res.result as string, + responseStatus: res.status + })) .catch((err) => { throw err }) diff --git a/src/request/RequestClient.ts b/src/request/RequestClient.ts index eb6aac2..704401e 100644 --- a/src/request/RequestClient.ts +++ b/src/request/RequestClient.ts @@ -84,7 +84,7 @@ export class RequestClient implements HttpClient { contentType: string = 'application/json', overrideHeaders: { [key: string]: string | number } = {}, debug: boolean = false - ): Promise<{ result: T; etag: string }> { + ): Promise<{ result: T; etag: string; status: number }> { const headers = { ...this.getHeaders(accessToken, contentType), ...overrideHeaders @@ -438,9 +438,15 @@ export class RequestClient implements HttpClient { includeSAS9Log = true } - let responseToReturn: { result: T; etag: any; log?: string } = { + let responseToReturn: { + result: T + etag: any + log?: string + status: number + } = { result: parsedResponse as T, - etag + etag, + status: response.status } if (includeSAS9Log) { diff --git a/src/request/Sas9RequestClient.ts b/src/request/Sas9RequestClient.ts index eedb3ef..5fb4750 100644 --- a/src/request/Sas9RequestClient.ts +++ b/src/request/Sas9RequestClient.ts @@ -39,7 +39,7 @@ export class Sas9RequestClient extends RequestClient { contentType: string = 'application/json', overrideHeaders: { [key: string]: string | number } = {}, debug: boolean = false - ): Promise<{ result: T; etag: string }> { + ): Promise<{ result: T; etag: string; status: number }> { const headers = { ...this.getHeaders(accessToken, contentType), ...overrideHeaders diff --git a/src/types/errors/NoSessionStateError.ts b/src/types/errors/NoSessionStateError.ts new file mode 100644 index 0000000..3409b43 --- /dev/null +++ b/src/types/errors/NoSessionStateError.ts @@ -0,0 +1,15 @@ +export class NoSessionStateError extends Error { + constructor( + public serverResponseStatus: number, + public sessionStateUrl: string, + public logUrl: string + ) { + super( + `Could not get session state. Server responded with ${serverResponseStatus} whilst checking state: ${sessionStateUrl}` + ) + + this.name = 'NoSessionStatus' + + Object.setPrototypeOf(this, NoSessionStateError.prototype) + } +} diff --git a/src/types/errors/index.ts b/src/types/errors/index.ts index 3db6b72..72b63cc 100644 --- a/src/types/errors/index.ts +++ b/src/types/errors/index.ts @@ -5,3 +5,4 @@ export * from './JobExecutionError' export * from './LoginRequiredError' export * from './NotFoundError' export * from './ErrorResponse' +export * from './NoSessionStateError'