mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-08 03:20:12 +08:00
fix: update backend socket error handling
This commit is contained in:
1 parent
4ee88fe7ba
commit
2d0fffc8f4
1 file changed
+18
-12
+18
-12
@@ -4,7 +4,6 @@ import { Session } from '@linux-odyssey/models'
|
|||||||
import { getAndStartContainer, attachContainer } from '../containers/docker.js'
|
import { getAndStartContainer, attachContainer } from '../containers/docker.js'
|
||||||
import SessionMiddleware from '../middleware/session.js'
|
import SessionMiddleware from '../middleware/session.js'
|
||||||
import { genJWT } from '../utils/auth.js'
|
import { genJWT } from '../utils/auth.js'
|
||||||
import { checkSessionId } from './validators/sessionValidator.js'
|
|
||||||
|
|
||||||
const sessions = new Map()
|
const sessions = new Map()
|
||||||
|
|
||||||
@@ -28,14 +27,18 @@ export function pushToSession(sessionId, event, ...args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function connectClient(socket, next) {
|
async function connectContainer(socket, next) {
|
||||||
|
console.log(next)
|
||||||
const user = socket.request.session?.passport?.user
|
const user = socket.request.session?.passport?.user
|
||||||
|
// console.log(user)
|
||||||
if (!user) {
|
if (!user) {
|
||||||
next(new Error('User not found.'))
|
next(new Error('User not found.'))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// console.log(socket.handshake)
|
||||||
const { sessionId } = socket.handshake.query
|
const { sessionId } = socket.handshake.query
|
||||||
if (!validator.isMongoId(sessionId)) {
|
if (!(sessionId && validator.isMongoId(sessionId))) {
|
||||||
|
console.warn('Invalid Session ID.', sessionId)
|
||||||
next(new Error('Invalid Session ID.'))
|
next(new Error('Invalid Session ID.'))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -50,16 +53,21 @@ async function connectClient(socket, next) {
|
|||||||
sessionId: session.id,
|
sessionId: session.id,
|
||||||
})
|
})
|
||||||
|
|
||||||
let container
|
|
||||||
let stream
|
|
||||||
try {
|
try {
|
||||||
container = await getAndStartContainer(session.containerId)
|
const container = await getAndStartContainer(session.containerId)
|
||||||
stream = await attachContainer(container, { token })
|
const stream = await attachContainer(container, { token })
|
||||||
|
socket.context = {
|
||||||
|
session,
|
||||||
|
stream,
|
||||||
|
}
|
||||||
|
next()
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
next(new Error('Failed to start container.'))
|
next(new Error('Failed to start container.'))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function onConnect(socket) {
|
||||||
|
const { session, stream } = socket.context
|
||||||
stream.socket.on('data', (chunk) => {
|
stream.socket.on('data', (chunk) => {
|
||||||
socket.emit('terminal', chunk.toString())
|
socket.emit('terminal', chunk.toString())
|
||||||
})
|
})
|
||||||
@@ -81,17 +89,15 @@ async function connectClient(socket, next) {
|
|||||||
removeFromSession(session.id, socketCallback)
|
removeFromSession(session.id, socketCallback)
|
||||||
stream.destroy()
|
stream.destroy()
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.send(`${container.id}\n`)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default (server) => {
|
export default (server) => {
|
||||||
const io = new Server(server)
|
const io = new Server(server)
|
||||||
|
|
||||||
io.engine.use(SessionMiddleware)
|
io.engine.use(SessionMiddleware)
|
||||||
io.engine.use(checkSessionId())
|
io.use(connectContainer)
|
||||||
|
|
||||||
io.on('connection', connectClient)
|
io.on('connection', onConnect)
|
||||||
io.on('connect_error', (err) => {
|
io.on('connect_error', (err) => {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in new issue
Block a user