import express from 'express'; import { asControlError } from './error.js'; export const registerOpenChamberControlRoutes = (app, { controlService }) => { app.post('/api/openchamber/control', express.json({ limit: '1mb' }), async (req, res) => { const controller = new AbortController(); const abortOnDisconnect = () => { if (!res.writableEnded) controller.abort(); }; req.once('aborted', abortOnDisconnect); res.once('close', abortOnDisconnect); try { const action = typeof req.body?.action === 'string' ? req.body.action : ''; const requestInput = req.body?.input; const input = requestInput && typeof requestInput === 'object' && !Array.isArray(requestInput) ? requestInput : {}; const data = await controlService.execute(action, input, req.body?.contextDirectory, { signal: controller.signal }); return res.json(data); } catch (error) { const controlError = asControlError(error, 'OpenChamber control action failed'); return res.status(controlError.statusCode).json({ error: controlError.message, ...(controlError.partial === true ? { partial: true, partialAction: controlError.partialAction, sessionId: controlError.sessionId, directory: controlError.directory, } : {}), }); } finally { req.off('aborted', abortOnDisconnect); res.off('close', abortOnDisconnect); } }); };