37 lines
1.4 KiB
JavaScript
37 lines
1.4 KiB
JavaScript
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);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
};
|