1
0
mirror of https://github.com/sasjs/adapter.git synced 2025-12-11 01:14:36 +00:00

Merge pull request #833 from sasjs/parent-session-state-check

fix(poll-job-state): fixed checking session state
This commit is contained in:
Yury Shkoda
2023-09-15 12:12:24 +03:00
committed by GitHub
3 changed files with 19 additions and 14 deletions

View File

@@ -43,10 +43,10 @@ module.exports = {
// An object that configures minimum threshold enforcement for coverage results // An object that configures minimum threshold enforcement for coverage results
coverageThreshold: { coverageThreshold: {
global: { global: {
statements: 64.01, statements: 64.03,
branches: 45.11, branches: 45.11,
functions: 54.1, functions: 54.18,
lines: 64.51 lines: 64.53
} }
}, },

View File

@@ -223,7 +223,7 @@ const needsRetry = (state: string) =>
* @param authConfig - an access token, refresh token, client and secret for an authorized user. * @param authConfig - an access token, refresh token, client and secret for an authorized user.
* @param streamLog - indicates if job log should be streamed. * @param streamLog - indicates if job log should be streamed.
* @param logStream - job log stream. * @param logStream - job log stream.
* @param jobSessionManager - job session object containing session object and an instance of Session Manager. Job session object is used to periodically (every 10th job state poll) check parent session state. * @param jobSessionManager - job session object containing session object and an instance of Session Manager. Job session object is used to periodically (every 10th job state poll) check parent session state. Session state is considered healthy if it is equal to 'running' or 'idle'.
* @returns - a promise which resolves with a job state * @returns - a promise which resolves with a job state
*/ */
export const doPoll = async ( export const doPoll = async (
@@ -263,15 +263,20 @@ export const doPoll = async (
throw new JobStatePollError(jobId, err) throw new JobStatePollError(jobId, err)
}) })
// Checks if session state is equal to 'running' or 'idle'.
const isSessionStatesHealthy = (state: string) =>
[SessionState.Running, SessionState.Idle].includes(
state as SessionState
)
// Clear parent session and throw an error if session state is not // Clear parent session and throw an error if session state is not
// 'running' or response status is not 200. // 'running', 'idle' or response status is not 200.
if (sessionState !== SessionState.Running || responseStatus !== 200) { if (!isSessionStatesHealthy(sessionState) || responseStatus !== 200) {
sessionManager.clearSession(sessionId, access_token) sessionManager.clearSession(sessionId, access_token)
const sessionError = const sessionError = isSessionStatesHealthy(sessionState)
sessionState !== SessionState.Running ? `Session response status is not 200. Session response status is ${responseStatus}.`
? `Session state of the job is not 'running'. Session state is '${sessionState}'` : `Session state of the job is not 'running' or 'idle'. Session state is '${sessionState}'`
: `Session response status is not 200. Session response status is ${responseStatus}.`
throw new JobStatePollError(jobId, new Error(sessionError)) throw new JobStatePollError(jobId, new Error(sessionError))
} }

View File

@@ -465,7 +465,7 @@ describe('doPoll', () => {
.spyOn(sessionManager as any, 'getSessionState') .spyOn(sessionManager as any, 'getSessionState')
.mockImplementation(() => { .mockImplementation(() => {
return Promise.resolve({ return Promise.resolve({
result: SessionState.Running, result: SessionState.Idle,
responseStatus: 200 responseStatus: 200
}) })
}) })
@@ -533,9 +533,9 @@ describe('doPoll', () => {
) )
}) })
it('should throw an error if session is not in running state', async () => { it('should throw an error if session state is not healthy', async () => {
const filteredSessionStates = Object.values(SessionState).filter( const filteredSessionStates = Object.values(SessionState).filter(
(state) => state !== SessionState.Running (state) => state !== SessionState.Running && state !== SessionState.Idle
) )
const randomSessionState = const randomSessionState =
filteredSessionStates[ filteredSessionStates[
@@ -580,7 +580,7 @@ describe('doPoll', () => {
new JobStatePollError( new JobStatePollError(
mockJob.id, mockJob.id,
new Error( new Error(
`Session state of the job is not 'running'. Session state is '${randomSessionState}'` `Session state of the job is not 'running' or 'idle'. Session state is '${randomSessionState}'`
) )
) )
) )