Files
pikasTech-HWLAB/internal/cloud/server-m3-http.ts
T

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