Files
openchamber/packages/web/server/lib/openchamber-control/routes.js
T

37 lines
1.4 KiB
JavaScript
Raw Normal View History

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