mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-06 03:20:13 +08:00
52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
import schedule from 'node-schedule'
|
|
import { Session } from '@linux-odyssey/models'
|
|
import config from '../config.js'
|
|
import { deleteContainer } from './docker.js'
|
|
import logger from '../utils/logger.js'
|
|
|
|
async function disableSession(session) {
|
|
try {
|
|
await deleteContainer(session.containerId)
|
|
} catch (err) {
|
|
// If the container doesn't exist, we can ignore the error
|
|
if (err.statusCode !== 404) {
|
|
throw new Error(
|
|
`Failed to delete container ${session.containerId} for session ${session._id}`
|
|
)
|
|
}
|
|
}
|
|
if (session.status === 'active') {
|
|
session.status = 'inactive'
|
|
}
|
|
session.containerId = null
|
|
try {
|
|
await session.save()
|
|
} catch (err) {
|
|
throw new Error(`Failed to save session ${session._id}\n${err}`)
|
|
}
|
|
}
|
|
|
|
export async function removeExpired() {
|
|
// Find all sessions that are containerId is not null and lastActivityAt is
|
|
// less than the current time minus the expiry time
|
|
try {
|
|
const sessions = await Session.find({
|
|
containerId: { $ne: null },
|
|
lastActivityAt: { $lt: new Date(Date.now() - config.containerExpiry) },
|
|
})
|
|
await Promise.all(
|
|
sessions.map((session) =>
|
|
disableSession(session).catch((err) => {
|
|
throw new Error(`Failed to expire session: ${session._id}\n${err}`)
|
|
})
|
|
)
|
|
)
|
|
} catch (err) {
|
|
logger.error('Remove expiring failed:', err)
|
|
}
|
|
}
|
|
|
|
export default function expiryRemovalScheduler() {
|
|
schedule.scheduleJob('*/5 * * * *', removeExpired)
|
|
}
|