1
0
mirror of https://github.com/sasjs/server.git synced 2026-01-06 14:10:06 +00:00

chore: merge js, py and r session controller classes to base session controller class

This commit is contained in:
2022-09-09 00:49:26 +05:00
parent 4560ef942f
commit 16b7aa6abb
3 changed files with 41 additions and 162 deletions

View File

@@ -19,13 +19,41 @@ import {
const execFilePromise = promisify(execFile) const execFilePromise = promisify(execFile)
abstract class SessionController { export class SessionController {
protected sessions: Session[] = [] protected sessions: Session[] = []
protected getReadySessions = (): Session[] => protected getReadySessions = (): Session[] =>
this.sessions.filter((sess: Session) => sess.ready && !sess.consumed) this.sessions.filter((sess: Session) => sess.ready && !sess.consumed)
protected abstract createSession(): Promise<Session> protected async createSession(): Promise<Session> {
const sessionId = generateUniqueFileName(generateTimestamp())
const sessionFolder = path.join(getSessionsFolder(), sessionId)
const creationTimeStamp = sessionId.split('-').pop() as string
// death time of session is 15 mins from creation
const deathTimeStamp = (
parseInt(creationTimeStamp) +
15 * 60 * 1000 -
1000
).toString()
const session: Session = {
id: sessionId,
ready: true,
inUse: true,
consumed: false,
completed: false,
creationTimeStamp,
deathTimeStamp,
path: sessionFolder
}
const headersPath = path.join(session.path, 'stpsrv_header.txt')
await createFile(headersPath, 'Content-type: text/plain')
this.sessions.push(session)
return session
}
public async getSession() { public async getSession() {
const readySessions = this.getReadySessions() const readySessions = this.getReadySessions()
@@ -167,158 +195,17 @@ ${autoExecContent}`
} }
} }
export class JSSessionController extends SessionController {
protected async createSession(): Promise<Session> {
const sessionId = generateUniqueFileName(generateTimestamp())
const sessionFolder = path.join(getSessionsFolder(), sessionId)
const creationTimeStamp = sessionId.split('-').pop() as string
// death time of session is 15 mins from creation
const deathTimeStamp = (
parseInt(creationTimeStamp) +
15 * 60 * 1000 -
1000
).toString()
const session: Session = {
id: sessionId,
ready: true,
inUse: true,
consumed: false,
completed: false,
creationTimeStamp,
deathTimeStamp,
path: sessionFolder
}
const headersPath = path.join(session.path, 'stpsrv_header.txt')
await createFile(headersPath, 'Content-type: text/plain')
this.sessions.push(session)
return session
}
}
export class PythonSessionController extends SessionController {
protected async createSession(): Promise<Session> {
const sessionId = generateUniqueFileName(generateTimestamp())
const sessionFolder = path.join(getSessionsFolder(), sessionId)
const creationTimeStamp = sessionId.split('-').pop() as string
// death time of session is 15 mins from creation
const deathTimeStamp = (
parseInt(creationTimeStamp) +
15 * 60 * 1000 -
1000
).toString()
const session: Session = {
id: sessionId,
ready: true,
inUse: true,
consumed: false,
completed: false,
creationTimeStamp,
deathTimeStamp,
path: sessionFolder
}
const headersPath = path.join(session.path, 'stpsrv_header.txt')
await createFile(headersPath, 'Content-type: text/plain')
this.sessions.push(session)
return session
}
}
export class RSessionController extends SessionController {
protected async createSession(): Promise<Session> {
const sessionId = generateUniqueFileName(generateTimestamp())
const sessionFolder = path.join(getSessionsFolder(), sessionId)
const creationTimeStamp = sessionId.split('-').pop() as string
// death time of session is 15 mins from creation
const deathTimeStamp = (
parseInt(creationTimeStamp) +
15 * 60 * 1000 -
1000
).toString()
const session: Session = {
id: sessionId,
ready: true,
inUse: true,
consumed: false,
completed: false,
creationTimeStamp,
deathTimeStamp,
path: sessionFolder
}
const headersPath = path.join(session.path, 'stpsrv_header.txt')
await createFile(headersPath, 'Content-type: text/plain')
this.sessions.push(session)
return session
}
}
export const getSessionController = ( export const getSessionController = (
runTime: RunTimeType runTime: RunTimeType
): ): SessionController => {
| SASSessionController if (process.sessionController) return process.sessionController
| JSSessionController
| PythonSessionController
| RSessionController => {
if (runTime === RunTimeType.SAS) {
return getSASSessionController()
}
if (runTime === RunTimeType.JS) { process.sessionController =
return getJSSessionController() runTime === RunTimeType.SAS
} ? new SASSessionController()
: new SessionController()
if (runTime === RunTimeType.PY) { return process.sessionController
return getPythonSessionController()
}
if (runTime === RunTimeType.R) {
return getRSessionController()
}
throw new Error('No Runtime is configured')
}
const getSASSessionController = (): SASSessionController => {
if (process.sasSessionController) return process.sasSessionController
process.sasSessionController = new SASSessionController()
return process.sasSessionController
}
const getJSSessionController = (): JSSessionController => {
if (process.jsSessionController) return process.jsSessionController
process.jsSessionController = new JSSessionController()
return process.jsSessionController
}
const getPythonSessionController = (): PythonSessionController => {
if (process.pythonSessionController) return process.pythonSessionController
process.pythonSessionController = new PythonSessionController()
return process.pythonSessionController
}
const getRSessionController = (): RSessionController => {
if (process.rSessionController) return process.rSessionController
process.rSessionController = new RSessionController()
return process.rSessionController
} }
const autoExecContent = ` const autoExecContent = `

View File

@@ -21,9 +21,8 @@ import {
} from '../../../utils' } from '../../../utils'
import { createFile, generateTimestamp, deleteFolder } from '@sasjs/utils' import { createFile, generateTimestamp, deleteFolder } from '@sasjs/utils'
import { import {
SASSessionController, SessionController,
JSSessionController, SASSessionController
PythonSessionController
} from '../../../controllers/internal' } from '../../../controllers/internal'
import * as ProcessProgramModule from '../../../controllers/internal/processProgram' import * as ProcessProgramModule from '../../../controllers/internal/processProgram'
import { Session } from '../../../types' import { Session } from '../../../types'
@@ -472,11 +471,7 @@ const setupMocks = async () => {
.mockImplementation(mockedGetSession) .mockImplementation(mockedGetSession)
jest jest
.spyOn(JSSessionController.prototype, 'getSession') .spyOn(SASSessionController.prototype, 'getSession')
.mockImplementation(mockedGetSession)
jest
.spyOn(PythonSessionController.prototype, 'getSession')
.mockImplementation(mockedGetSession) .mockImplementation(mockedGetSession)
jest jest

View File

@@ -7,10 +7,7 @@ declare namespace NodeJS {
driveLoc: string driveLoc: string
logsLoc: string logsLoc: string
logsUUID: string logsUUID: string
sasSessionController?: import('../../controllers/internal').SASSessionController sessionController?: import('../../controllers/internal').SessionController
jsSessionController?: import('../../controllers/internal').JSSessionController
pythonSessionController?: import('../../controllers/internal').PythonSessionController
rSessionController?: import('../../controllers/internal').RSessionController
appStreamConfig: import('../').AppStreamConfig appStreamConfig: import('../').AppStreamConfig
logger: import('@sasjs/utils/logger').Logger logger: import('@sasjs/utils/logger').Logger
runTimes: import('../../utils').RunTimeType[] runTimes: import('../../utils').RunTimeType[]