@artinet/sdk
Version:
A TypeScript SDK for building collaborative AI agents.
65 lines (64 loc) • 2.09 kB
JavaScript
/**
* 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 { A2AError } from '@a2a-js/sdk/server';
import { formatJson, sanitizeString } 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: sanitizeString(reqId),
error: jsonRpcError,
};
if (!headersSent) {
res.json(errorResponse);
}
else {
res.write(JSON.stringify(errorResponse));
res.end();
}
};