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) {
console.log('Push:', sessionId, event)
const callbacks = sessions.get((sessionId, event))
console.debug('Callbacks:', sessionId, callbacks.length)
if (callbacks) {
callbacks.forEach((callback) => callback(data))
}
}
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', async (socket) => {
async function connectClient(socket) {
console.log('Connected to the client.')
const sessionId = socket.handshake.query.session_id
if (!sessionId) {
@@ -51,9 +33,8 @@ export default (server) => {
socket.disconnect()
return
}
let session
try {
session = await Session.findOne({
const session = await Session.findOne({
_id: sessionId,
user: socket.user,
status: 'active',
@@ -63,17 +44,20 @@ export default (server) => {
socket.disconnect()
return
}
const token = await genSessionJWT(session)
let container
let stream
try {
container = await getAndStartContainer(session.containerId)
stream = await attachContainer(container, { token })
} catch (err) {
socket.send(err.message)
socket.disconnect()
return
}
const token = await genSessionJWT(session)
const container = await getAndStartContainer(session.containerId)
const stream = await attachContainer(container, { token })
stream.socket.on('data', (chunk) => {
socket.emit('terminal', chunk.toString())
})
@@ -98,5 +82,23 @@ export default (server) => {
})
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) {
console.log(`Getting container: ${id}`)
let container
try {
container = engine.getContainer(id)
const container = engine.getContainer(id)
if (!(await container.inspect()).State.Running) {
await container.start()
}
return container
} catch (error) {
throw new Error(`Container not found: ${id}`)
}
}
export async function attachContainer(container, { token }) {