UNPKG

@artinet/sdk

Version:

A TypeScript SDK for building collaborative AI agents.

69 lines (68 loc) 2.15 kB
/** * Copyright 2025 The Artinet Project * SPDX-License-Identifier: Apache-2.0 * * @archive Helper utilities for express servers. * @note We recommend using the @a2a-js/sdk/express middleware instead as these utilities will no longer be robustly maintained. */ import { SystemError } from "../../utils/index.js"; import { logger } from "../../config/index.js"; import escapeHtml from "escape-html"; import { A2AError } from "@a2a-js/sdk/server"; import { formatJson } from "../../utils/index.js"; import express from "express"; export function rpcParser(req, res, next) { express.json()(req, res, (err) => { if (!req.body || typeof req.body !== "object") { return next(A2AError.parseError(`Invalid request body: ${formatJson(req.body)}`)); } if (err) { if (err instanceof SyntaxError && "status" in err && err.status === 400 && "body" in err) { return next(A2AError.parseError(`Invalid request body: ${formatJson(req.body)}`)); } return next(err); } next(); }); } /** * Express error handler middleware. */ export const errorHandler = (err, req, res, _) => { let headersSent = false; if (res.headersSent) { headersSent = true; } logger.error("errorHandler", err); let reqId = null; try { if (req.body && typeof req.body === "object" && "id" in req.body) { reqId = req.body.id; } } catch (e) { logger.error("errorHandler: Error extracting request ID", e); } let jsonRpcError; if (err instanceof A2AError || err instanceof SystemError) { jsonRpcError = { code: err.code, message: err.message, data: err.data }; } else { jsonRpcError = A2AError.internalError(err.message, err.data).toJSONRPCError(); } const errorResponse = { jsonrpc: "2.0", id: escapeHtml(reqId), error: jsonRpcError, }; if (!headersSent) { res.json(errorResponse); } else { res.write(JSON.stringify(errorResponse)); res.end(); } };