mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-08 11:30:12 +08:00
feat: exit shell on disconnect
This commit is contained in:
1 parent
d9836318db
commit
99da610d9e
4 files changed
+22
-12
No files matched your search
@@ -7,7 +7,6 @@ import CommandHandler from '../../game/commandHandler.js'
|
|||||||
export async function newCommand(req, res) {
|
export async function newCommand(req, res) {
|
||||||
console.log('new command:', req.body)
|
console.log('new command:', req.body)
|
||||||
const { token, command, pwd, output, error, ...additionalData } = req.body
|
const { token, command, pwd, output, error, ...additionalData } = req.body
|
||||||
console.log('additionalData:', additionalData)
|
|
||||||
|
|
||||||
if (!command) {
|
if (!command) {
|
||||||
res.status(400).json({ message: 'command is required' })
|
res.status(400).json({ message: 'command is required' })
|
||||||
@@ -50,7 +49,6 @@ export async function newCommand(req, res) {
|
|||||||
const commandHandler = new CommandHandler(session, c, additionalData)
|
const commandHandler = new CommandHandler(session, c, additionalData)
|
||||||
|
|
||||||
const response = await commandHandler.run()
|
const response = await commandHandler.run()
|
||||||
console.log(response)
|
|
||||||
|
|
||||||
res.status(201).json(response)
|
res.status(201).json(response)
|
||||||
await session.save()
|
await session.save()
|
||||||
|
|||||||
@@ -10,9 +10,18 @@ function listenToSession(sessionId, event, callback) {
|
|||||||
sessions.set((sessionId, event), callbacks.concat(callback))
|
sessions.set((sessionId, event), callbacks.concat(callback))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeFromSession(sessionId, event, callback) {
|
||||||
|
const callbacks = sessions.get((sessionId, event)) || []
|
||||||
|
sessions.set(
|
||||||
|
(sessionId, event),
|
||||||
|
callbacks.filter((cb) => cb !== callback)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export function pushToSession(sessionId, event, data) {
|
export function pushToSession(sessionId, event, data) {
|
||||||
console.log('Push:', sessionId, event)
|
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))
|
||||||
}
|
}
|
||||||
@@ -65,22 +74,27 @@ export default (server) => {
|
|||||||
const container = await getAndStartContainer(session.containerId)
|
const container = await getAndStartContainer(session.containerId)
|
||||||
const stream = await attachContainer(container, { token })
|
const stream = await attachContainer(container, { token })
|
||||||
|
|
||||||
stream.on('data', (chunk) => {
|
stream.socket.on('data', (chunk) => {
|
||||||
socket.emit('terminal', chunk.toString())
|
socket.emit('terminal', chunk.toString())
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.on('message', console.log)
|
socket.on('message', console.log)
|
||||||
|
|
||||||
socket.on('terminal', function incoming(message) {
|
socket.on('terminal', function incoming(message) {
|
||||||
stream.write(message)
|
stream.socket.write(message)
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.on('close', () => {
|
const graphCallback = (data) => {
|
||||||
console.log('Disconnected from the client.')
|
|
||||||
})
|
|
||||||
|
|
||||||
listenToSession(session.id, 'graph', (data) => {
|
|
||||||
socket.emit('graph', data)
|
socket.emit('graph', data)
|
||||||
|
}
|
||||||
|
|
||||||
|
listenToSession(session.id, 'graph', graphCallback)
|
||||||
|
|
||||||
|
socket.on('disconnect', () => {
|
||||||
|
console.log('Disconnected from the client.')
|
||||||
|
stream.socket.write('exit\n')
|
||||||
|
removeFromSession(session.id, 'graph', graphCallback)
|
||||||
|
stream.destroy()
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.send(`${container.id}\n`)
|
socket.send(`${container.id}\n`)
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ export async function attachContainer(container, { token }) {
|
|||||||
Tty: true,
|
Tty: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
return execOutput.socket
|
return execOutput
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function deleteContainer(id) {
|
export async function deleteContainer(id) {
|
||||||
|
|||||||
@@ -94,8 +94,6 @@ export default class CommandHandler {
|
|||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('stages', stages)
|
|
||||||
|
|
||||||
this.handleEvent()
|
this.handleEvent()
|
||||||
this.handleCommand()
|
this.handleCommand()
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user