123 lines
3.4 KiB
TypeScript
123 lines
3.4 KiB
TypeScript
|
|
import { CLOUD_API_SERVICE_ID } from "../audit/index.mjs";
|
|
import { ERROR_CODES } from "../protocol/index.mjs";
|
|
import { M3_IO_CONTROL_ROUTE, handleM3IoControl } from "./m3-io-control.ts";
|
|
import { getHeader, readBody, sendJson } from "./server-http-utils.ts";
|
|
|
|
export async function handleM3IoControlHttp(request, response, options) {
|
|
const body = await readBody(request, options.bodyLimitBytes);
|
|
let params = {};
|
|
|
|
try {
|
|
params = body ? JSON.parse(body) : {};
|
|
} catch (error) {
|
|
sendJson(response, 400, {
|
|
serviceId: CLOUD_API_SERVICE_ID,
|
|
contractVersion: "m3-io-control-v1",
|
|
route: M3_IO_CONTROL_ROUTE,
|
|
method: "POST",
|
|
status: "blocked",
|
|
accepted: false,
|
|
traceId: getHeader(request, "x-trace-id") || "trc_unassigned",
|
|
operationId: null,
|
|
auditId: null,
|
|
evidenceId: null,
|
|
audit: {
|
|
auditId: null,
|
|
status: "not_written"
|
|
},
|
|
evidence: {
|
|
evidenceId: null,
|
|
status: "blocked",
|
|
sourceKind: "BLOCKED"
|
|
},
|
|
readback: null,
|
|
error: {
|
|
code: "parse_error",
|
|
message: "Invalid JSON body",
|
|
reason: error.message
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (!params || typeof params !== "object" || Array.isArray(params)) {
|
|
sendJson(response, 400, {
|
|
serviceId: CLOUD_API_SERVICE_ID,
|
|
contractVersion: "m3-io-control-v1",
|
|
route: M3_IO_CONTROL_ROUTE,
|
|
method: "POST",
|
|
status: "blocked",
|
|
accepted: false,
|
|
traceId: getHeader(request, "x-trace-id") || "trc_unassigned",
|
|
operationId: null,
|
|
auditId: null,
|
|
evidenceId: null,
|
|
audit: {
|
|
auditId: null,
|
|
status: "not_written"
|
|
},
|
|
evidence: {
|
|
evidenceId: null,
|
|
status: "blocked",
|
|
sourceKind: "BLOCKED"
|
|
},
|
|
readback: null,
|
|
error: {
|
|
code: "invalid_params",
|
|
message: "M3 IO control body must be a JSON object"
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const payload = await handleM3IoControl(
|
|
{
|
|
...params,
|
|
traceId: getHeader(request, "x-trace-id") || params.traceId,
|
|
requestId: getHeader(request, "x-request-id") || params.requestId,
|
|
actorId: getHeader(request, "x-actor-id") || params.actorId
|
|
},
|
|
{
|
|
runtimeStore: options.runtimeStore,
|
|
env: options.env,
|
|
requestJson: options.m3IoRequestJson,
|
|
traceId: getHeader(request, "x-trace-id"),
|
|
requestId: getHeader(request, "x-request-id"),
|
|
actorId: getHeader(request, "x-actor-id")
|
|
}
|
|
);
|
|
sendJson(response, payload.httpStatus ?? 200, payload);
|
|
} catch (error) {
|
|
const protocolCode = Number.isInteger(error?.code) ? error.code : ERROR_CODES.internalError;
|
|
sendJson(response, protocolCode === ERROR_CODES.invalidParams ? 400 : 200, {
|
|
serviceId: CLOUD_API_SERVICE_ID,
|
|
contractVersion: "m3-io-control-v1",
|
|
route: M3_IO_CONTROL_ROUTE,
|
|
method: "POST",
|
|
status: "blocked",
|
|
accepted: false,
|
|
traceId: getHeader(request, "x-trace-id") || params.traceId || "trc_unassigned",
|
|
operationId: null,
|
|
auditId: null,
|
|
evidenceId: null,
|
|
audit: {
|
|
auditId: null,
|
|
status: "not_written"
|
|
},
|
|
evidence: {
|
|
evidenceId: null,
|
|
status: "blocked",
|
|
sourceKind: "BLOCKED"
|
|
},
|
|
readback: null,
|
|
error: {
|
|
code: protocolCode,
|
|
message: error.message,
|
|
data: error.data ?? {}
|
|
}
|
|
});
|
|
}
|
|
}
|