diff --git a/server/src/api/socket.ts b/server/src/api/socket.ts index af63c1a..7db3c27 100644 --- a/server/src/api/socket.ts +++ b/server/src/api/socket.ts @@ -2,7 +2,7 @@ import { Server } from 'socket.io' import type { Socket } from 'socket.io' import validator from 'validator' import type { Server as HttpServer } from 'http' -import { ISession, Session } from '../../../packages/models' +import { Session } from '../../../packages/models' import SessionMiddleware from '../middleware/session.js' import logger from '../utils/logger.js' @@ -34,11 +34,11 @@ export function pushToSession( } } -// eslint-disable-next-line no-unused-vars -async function connectContainer(socket: Socket, next: (err?: Error) => void) { +async function onConnect(socket: Socket) { const user = (socket.request as any).session?.passport?.user if (!user) { - next(new Error('User not found.')) + socket.emit('error', 'User not found.') + socket.disconnect() return } const { sessionId } = socket.handshake.query @@ -48,27 +48,18 @@ async function connectContainer(socket: Socket, next: (err?: Error) => void) { !validator.isMongoId(sessionId) ) { logger.warn('Invalid Session ID.', user.username, sessionId) - next(new Error('Invalid Session ID.')) + socket.emit('error', 'Invalid Session ID.') + socket.disconnect() return } const session = await Session.findById(sessionId) if (!session) { - next(new Error('Session not found.')) + socket.emit('error', 'Session not found.') + socket.disconnect() return } - socket.data.context = { - session, - } - next() -} - -function onConnect(socket: Socket) { - const { session } = socket.data.context as { - session: ISession - } - const socketCallback = (event: string, ...data: any[]) => { socket.emit(event, ...data) } @@ -84,7 +75,6 @@ export default (server: HttpServer) => { const io = new Server(server) io.engine.use(SessionMiddleware) - io.use(connectContainer) io.on('connection', onConnect) io.on('connect_error', (err) => { diff --git a/server/src/containers/docker.ts b/server/src/containers/docker.ts index f2738cd..ef4b84b 100644 --- a/server/src/containers/docker.ts +++ b/server/src/containers/docker.ts @@ -1,9 +1,7 @@ import fs from 'fs/promises' -import { Duplex } from 'stream' import Docker from 'dockerode' import config, { getQuestImage } from '../config.js' import logger from '../utils/logger.js' -import { connectToSSH } from './ssh.js' const engine = new Docker() @@ -100,32 +98,6 @@ export async function getAndStartContainer( return container } -export async function attachContainer( - container: Docker.Container, - { token }: { token: string } -): Promise { - const containerIp = (await container.inspect()).NetworkSettings.Networks[ - config.docker.network - ].IPAddress - console.log('containerIp', containerIp) - - let error: Error | null = null - for (let i = 0; i < 10; i++) { - try { - // eslint-disable-next-line no-await-in-loop - const stream = await connectToSSH(containerIp, { token }) - return stream - } catch (err) { - error = err as Error - // eslint-disable-next-line no-await-in-loop - await new Promise((resolve) => { - setTimeout(resolve, 1000) - }) - } - } - throw new Error('Failed to connect to SSH', { cause: error }) -} - export async function deleteContainer(id: string) { const container = engine.getContainer(id) if (!container) { diff --git a/server/src/containers/ssh.ts b/server/src/containers/ssh.ts deleted file mode 100644 index 4eb54b9..0000000 --- a/server/src/containers/ssh.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Client } from 'ssh2' -import { Duplex } from 'stream' -import config from '../config.js' - -export async function connectToSSH( - containerIp: string, - { token }: { token: string } -): Promise { - const conn = new Client() - - return new Promise((resolve, reject) => { - conn - .on('ready', () => { - conn.shell( - { - env: { - TOKEN: token, - API_ENDPOINT: config.backendUrl, - ZDOTDIR: '/etc/zsh', - NODE_PATH: '/usr/src/node_modules', - }, - }, - (err, stream) => { - if (err) { - reject(err) - } - stream.on('close', () => { - conn.end() - }) - resolve(stream) - } - ) - }) - .on('error', (err) => { - reject(err) - }) - .connect({ - host: containerIp, - port: 22, - username: 'commander', - privateKey: config.docker.keypair.privateKey, - timeout: 5000, - }) - }) -}