Repository navigation
Expand file tree
/
Copy pathapp.ts
More file actions
70 lines (66 loc) · 2.48 KB
/
Copy pathapp.ts
File metadata and controls
70 lines (66 loc) · 2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import express, { type Application, type RequestHandler } from 'express'
import type { Server as HttpServer } from 'node:http'
import type { Server as IOServer } from 'socket.io'
import { getConfig } from './config.js'
import SSHConnection from './ssh.js'
import socketHandler, { type SSHCtor } from './socket.js'
import { createRoutes } from './routes.js'
import { applyMiddleware } from './middleware.js'
import { createServer, startServer } from './server.js'
import { configureSocketIO } from './io.js'
import { handleError, ConfigError } from './errors.js'
import { createNamespacedDebug } from './logger.js'
import { MESSAGES } from './constants.js'
import { getClientPublicPath } from './client-path.js'
import type { Config } from './types/config.js'
const debug = createNamespacedDebug('app')
export function createAppAsync(appConfig: Config): {
app: Application
sessionMiddleware: RequestHandler
} {
const app = express()
try {
const clientPath = getClientPublicPath()
const { sessionMiddleware } = applyMiddleware(app, appConfig) as unknown as {
sessionMiddleware: RequestHandler
}
const sshRoutes = createRoutes(appConfig)
app.use('/ssh/assets', express.static(clientPath))
app.use('/ssh', sshRoutes)
return { app, sessionMiddleware }
} catch (err) {
const message =
err !== null && err !== undefined && typeof err === 'object' && 'message' in (err as { message?: unknown })
? String((err as { message?: unknown }).message)
: String(err)
throw new ConfigError(`${MESSAGES.EXPRESS_APP_CONFIG_ERROR}: ${message}`)
}
}
export async function initializeServerAsync(): Promise<{
server: HttpServer
io: IOServer
app: Application
config: Config
}> {
try {
const appConfig = await getConfig()
debug('Configuration loaded asynchronously')
const { app, sessionMiddleware } = createAppAsync(appConfig)
const server = createServer(app)
const cfgForIO = appConfig as unknown as {
getCorsConfig: () => { origin: string[]; methods: string[]; credentials: boolean }
}
const io = configureSocketIO(server, sessionMiddleware, cfgForIO)
socketHandler(io as Parameters<typeof socketHandler>[0], appConfig, SSHConnection as SSHCtor)
startServer(server, appConfig)
debug('Server initialized asynchronously')
return { server, io, app, config: appConfig }
} catch (err) {
if (err instanceof Error) {
handleError(err)
} else {
handleError(new Error(String(err)))
}
process.exit(1)
}
}