/
nayvok
/
livecoding
Обзор
Документация
Войти
/
nayvok
/
livecoding
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
backend/src/server.ts
95 строк
3 KB
nayvok
fix: harden sessions and WebRTC recovery
17 июн 2026, 22:02
17 июн 2026, 22:02
37b9a92
Код
Авторство
О чём код?
import express, { type Request, type Response } from 'express' import cors from 'cors' import { createServer } from 'http' import { WebSocketServer } from 'ws' import { config, getIceServers } from './config.js' import { sessionsRouter } from './routes/sessions.js' import { runRouter } from './routes/run.js' import { handleConnection } from './ws/index.js' import { getStats } from './store/sessions.js' import { createRunnerAddressCache, isBlockedSourceAddress, isLoopbackServiceUrl, resolveServiceAddresses, } from './networkGuard.js' const app = express() app.disable('x-powered-by') app.use(cors({ origin: config.corsOrigin })) app.use(express.json({ limit: '128kb' })) app.get('/api/health', (_req: Request, res: Response) => { res.json({ ok: true, ...getStats() }) }) app.get('/api/config', (_req: Request, res: Response) => { res.json({ iceServers: getIceServers() }) }) app.use('/api/sessions', sessionsRouter) app.use('/api/sessions', runRouter) // 404 для остальных API-маршрутов app.use('/api', (_req: Request, res: Response) => { res.status(404).json({ error: 'Not found' }) }) const server = createServer(app) const runnerSourceGuardEnabled = !isLoopbackServiceUrl(config.runnerUrl) const runnerAddressCache = createRunnerAddressCache(() => resolveServiceAddresses(config.runnerUrl), ) if (runnerSourceGuardEnabled) { try { await runnerAddressCache.refresh() } catch (err) { console.warn( `[server] unable to resolve runner address: ${(err as Error).message}`, ) } const refreshTimer = setInterval(() => { void runnerAddressCache.refresh().catch((err) => { console.warn( `[server] unable to refresh runner address: ${(err as Error).message}`, ) }) }, config.runnerDnsRefreshMs) refreshTimer.unref() } else { console.warn( '[server] runner source guard disabled for loopback RUNNER_URL', ) } server.prependListener('connection', (socket) => { if (!runnerSourceGuardEnabled) return if ( isBlockedSourceAddress( socket.remoteAddress, runnerAddressCache.getAddresses(), ) ) { socket.destroy() } }) const wss = new WebSocketServer({ server, maxPayload: 1024 * 1024, }) wss.on('error', (err) => { console.error(`[ws] server error: ${err.message}`) }) wss.on('connection', handleConnection) server.listen(config.port, () => { console.log(`[server] listening on http://localhost:${config.port}`) console.log(`[server] CORS origin: ${config.corsOrigin}`) console.log( `[server] ICE servers: ${getIceServers() .map((s) => s.urls) .join(', ')}`, ) })