11import { handleMcpMessage , type JsonRpcMessage } from './router.ts' ;
22
33type JsonRpcResponse = Awaited < NonNullable < ReturnType < typeof handleMcpMessage > > > ;
4+ type JsonRpcId = string | number | null ;
45type MessageSink = ( message : JsonRpcMessage | JsonRpcMessage [ ] ) => void ;
56
67export async function runAgentDeviceMcpServer ( ) : Promise < void > {
78 const decoder = new McpMessageDecoder ( ( messageOrBatch ) => {
9+ const fallbackId = fallbackErrorId ( messageOrBatch ) ;
810 void handleMcpPayload ( messageOrBatch )
911 . then ( ( response ) => {
1012 if ( response ) writeMessage ( response ) ;
1113 } )
1214 . catch ( ( error : unknown ) => {
1315 writeMessage ( {
1416 jsonrpc : '2.0' ,
15- id : null ,
17+ id : fallbackId ,
1618 error : {
1719 code : - 32603 ,
1820 message : error instanceof Error ? error . message : String ( error ) ,
@@ -44,7 +46,7 @@ export async function runAgentDeviceMcpServer(): Promise<void> {
4446 } ) ;
4547}
4648
47- function handleMcpPayload (
49+ export function handleMcpPayload (
4850 messageOrBatch : JsonRpcMessage | JsonRpcMessage [ ] ,
4951) : Promise < unknown | null > {
5052 if ( Array . isArray ( messageOrBatch ) ) {
@@ -54,12 +56,20 @@ function handleMcpPayload(
5456}
5557
5658async function handleMcpBatch ( messages : JsonRpcMessage [ ] ) : Promise < JsonRpcResponse [ ] | null > {
57- const responses = (
58- await Promise . all ( messages . map ( async ( message ) => await handleMcpMessage ( message ) ) )
59- ) . flatMap ( responseArray ) ;
59+ const responses : JsonRpcResponse [ ] = [ ] ;
60+ for ( const message of messages ) {
61+ responses . push ( ...responseArray ( await handleMcpMessage ( message ) ) ) ;
62+ }
6063 return responses . length > 0 ? responses : null ;
6164}
6265
66+ function fallbackErrorId ( messageOrBatch : JsonRpcMessage | JsonRpcMessage [ ] ) : JsonRpcId {
67+ if ( Array . isArray ( messageOrBatch ) ) {
68+ return messageOrBatch . length === 1 ? ( messageOrBatch [ 0 ] ?. id ?? null ) : null ;
69+ }
70+ return messageOrBatch . id ?? null ;
71+ }
72+
6373class McpMessageDecoder {
6474 private buffer = '' ;
6575 private readonly sink : MessageSink ;
0 commit comments