Files
linux-odyssey/server/src/containers/expiryChecker.js
T

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)
}