fix: error handling of container failures

This commit is contained in:
wancat committed 2023-09-01 13:49:00 +08:00
1 parent 3fdbca89f3
commit 8b5f7175a7
2 files changed
+30 -33

No files matched your search

+29 -27
View File
@@ -19,31 +19,13 @@ function removeFromSession(sessionId, event, callback) {
} }
export function pushToSession(sessionId, event, data) { export function pushToSession(sessionId, event, data) {
console.log('Push:', sessionId, event)
const callbacks = sessions.get((sessionId, event)) const callbacks = sessions.get((sessionId, event))
console.debug('Callbacks:', sessionId, callbacks.length)
if (callbacks) { if (callbacks) {
callbacks.forEach((callback) => callback(data)) callbacks.forEach((callback) => callback(data))
} }
} }
export default (server) => { async function connectClient(socket) {
const io = new Server(server)
io.use(async (socket, next) => {
console.log('Authenticating...')
try {
const user = await defaultUser()
// eslint-disable-next-line no-param-reassign
socket.user = user
next()
} catch (err) {
console.error(err)
next(err)
}
})
io.on('connection', async (socket) => {
console.log('Connected to the client.') console.log('Connected to the client.')
const sessionId = socket.handshake.query.session_id const sessionId = socket.handshake.query.session_id
if (!sessionId) { if (!sessionId) {
@@ -51,9 +33,8 @@ export default (server) => {
socket.disconnect() socket.disconnect()
return return
} }
let session
try { const session = await Session.findOne({
session = await Session.findOne({
_id: sessionId, _id: sessionId,
user: socket.user, user: socket.user,
status: 'active', status: 'active',
@@ -63,17 +44,20 @@ export default (server) => {
socket.disconnect() socket.disconnect()
return return
} }
const token = await genSessionJWT(session)
let container
let stream
try {
container = await getAndStartContainer(session.containerId)
stream = await attachContainer(container, { token })
} catch (err) { } catch (err) {
socket.send(err.message) socket.send(err.message)
socket.disconnect() socket.disconnect()
return return
} }
const token = await genSessionJWT(session)
const container = await getAndStartContainer(session.containerId)
const stream = await attachContainer(container, { token })
stream.socket.on('data', (chunk) => { stream.socket.on('data', (chunk) => {
socket.emit('terminal', chunk.toString()) socket.emit('terminal', chunk.toString())
}) })
@@ -98,5 +82,23 @@ export default (server) => {
}) })
socket.send(`${container.id}\n`) socket.send(`${container.id}\n`)
}
export default (server) => {
const io = new Server(server)
io.use(async (socket, next) => {
console.log('Authenticating...')
try {
const user = await defaultUser()
// eslint-disable-next-line no-param-reassign
socket.user = user
next()
} catch (err) {
console.error(err)
next(err)
}
}) })
io.on('connection', connectClient)
} }
+1 -6
View File
@@ -35,16 +35,11 @@ export async function createContainer(name) {
export async function getAndStartContainer(id) { export async function getAndStartContainer(id) {
console.log(`Getting container: ${id}`) console.log(`Getting container: ${id}`)
let container const container = engine.getContainer(id)
try {
container = engine.getContainer(id)
if (!(await container.inspect()).State.Running) { if (!(await container.inspect()).State.Running) {
await container.start() await container.start()
} }
return container return container
} catch (error) {
throw new Error(`Container not found: ${id}`)
}
} }
export async function attachContainer(container, { token }) { export async function attachContainer(container, { token }) {