Skip to content

Commit 0583b5e

Browse files
fix: apply middleware before Promise to maintain sync behavior for tests
1 parent 8644ff4 commit 0583b5e

1 file changed

Lines changed: 55 additions & 66 deletions

File tree

packages/core/src/shared/protocol.ts

Lines changed: 55 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,9 +1120,50 @@ export abstract class Protocol<SendRequestT extends Request, SendNotificationT e
11201120
*
11211121
* Do not use this method to emit notifications! Use notification() instead.
11221122
*/
1123-
request<T extends AnySchema>(request: SendRequestT, resultSchema: T, options?: RequestOptions): Promise<SchemaOutput<T>> {
1123+
async request<T extends AnySchema>(request: SendRequestT, resultSchema: T, options?: RequestOptions): Promise<SchemaOutput<T>> {
11241124
const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options ?? {};
11251125

1126+
// Build the JSON-RPC request
1127+
const messageId = this._requestMessageId++;
1128+
let jsonrpcRequest: JSONRPCRequest = {
1129+
...request,
1130+
jsonrpc: '2.0',
1131+
id: messageId
1132+
};
1133+
1134+
if (options?.onprogress) {
1135+
this._progressHandlers.set(messageId, options.onprogress);
1136+
jsonrpcRequest.params = {
1137+
...request.params,
1138+
_meta: {
1139+
...(request.params?._meta || {}),
1140+
progressToken: messageId
1141+
}
1142+
};
1143+
}
1144+
1145+
// Augment with task creation parameters if provided
1146+
if (task) {
1147+
jsonrpcRequest.params = {
1148+
...jsonrpcRequest.params,
1149+
task: task
1150+
};
1151+
}
1152+
1153+
// Augment with related task metadata if relatedTask is provided
1154+
if (relatedTask) {
1155+
jsonrpcRequest.params = {
1156+
...jsonrpcRequest.params,
1157+
_meta: {
1158+
...(jsonrpcRequest.params?._meta || {}),
1159+
[RELATED_TASK_META_KEY]: relatedTask
1160+
}
1161+
};
1162+
}
1163+
1164+
// Apply send middleware before sending
1165+
jsonrpcRequest = await this._applyMiddleware(jsonrpcRequest, this._options?.sendMiddleware) as JSONRPCRequest;
1166+
11261167
// Send the request
11271168
return new Promise<SchemaOutput<T>>((resolve, reject) => {
11281169
const earlyReject = (error: unknown) => {
@@ -1150,43 +1191,6 @@ export abstract class Protocol<SendRequestT extends Request, SendNotificationT e
11501191

11511192
options?.signal?.throwIfAborted();
11521193

1153-
const messageId = this._requestMessageId++;
1154-
const jsonrpcRequest: JSONRPCRequest = {
1155-
...request,
1156-
jsonrpc: '2.0',
1157-
id: messageId
1158-
};
1159-
1160-
if (options?.onprogress) {
1161-
this._progressHandlers.set(messageId, options.onprogress);
1162-
jsonrpcRequest.params = {
1163-
...request.params,
1164-
_meta: {
1165-
...(request.params?._meta || {}),
1166-
progressToken: messageId
1167-
}
1168-
};
1169-
}
1170-
1171-
// Augment with task creation parameters if provided
1172-
if (task) {
1173-
jsonrpcRequest.params = {
1174-
...jsonrpcRequest.params,
1175-
task: task
1176-
};
1177-
}
1178-
1179-
// Augment with related task metadata if relatedTask is provided
1180-
if (relatedTask) {
1181-
jsonrpcRequest.params = {
1182-
...jsonrpcRequest.params,
1183-
_meta: {
1184-
...(jsonrpcRequest.params?._meta || {}),
1185-
[RELATED_TASK_META_KEY]: relatedTask
1186-
}
1187-
};
1188-
}
1189-
11901194
const cancel = (reason: unknown) => {
11911195
this._responseHandlers.delete(messageId);
11921196
this._progressHandlers.delete(messageId);
@@ -1257,38 +1261,23 @@ export abstract class Protocol<SendRequestT extends Request, SendNotificationT e
12571261
};
12581262
this._requestResolvers.set(messageId, responseResolver);
12591263

1260-
// Apply send middleware before queuing
1261-
this._applyMiddleware(jsonrpcRequest, this._options?.sendMiddleware)
1262-
.then(transformedRequest => {
1263-
this._enqueueTaskMessage(relatedTaskId, {
1264-
type: 'request',
1265-
message: transformedRequest as JSONRPCRequest,
1266-
timestamp: Date.now()
1267-
}).catch(error => {
1268-
this._cleanupTimeout(messageId);
1269-
reject(error);
1270-
});
1271-
})
1272-
.catch(error => {
1273-
this._cleanupTimeout(messageId);
1274-
reject(error);
1275-
});
1264+
this._enqueueTaskMessage(relatedTaskId, {
1265+
type: 'request',
1266+
message: jsonrpcRequest,
1267+
timestamp: Date.now()
1268+
}).catch(error => {
1269+
this._cleanupTimeout(messageId);
1270+
reject(error);
1271+
});
12761272

12771273
// Don't send through transport - queued messages are delivered via tasks/result only
12781274
// This prevents duplicate delivery for bidirectional transports
12791275
} else {
1280-
// No related task - apply send middleware and send through transport normally
1281-
this._applyMiddleware(jsonrpcRequest, this._options?.sendMiddleware)
1282-
.then(transformedRequest => {
1283-
this._transport!.send(transformedRequest as JSONRPCRequest, { relatedRequestId, resumptionToken, onresumptiontoken }).catch(error => {
1284-
this._cleanupTimeout(messageId);
1285-
reject(error);
1286-
});
1287-
})
1288-
.catch(error => {
1289-
this._cleanupTimeout(messageId);
1290-
reject(error);
1291-
});
1276+
// No related task - send through transport normally
1277+
this._transport!.send(jsonrpcRequest, { relatedRequestId, resumptionToken, onresumptiontoken }).catch(error => {
1278+
this._cleanupTimeout(messageId);
1279+
reject(error);
1280+
});
12921281
}
12931282
});
12941283
}

0 commit comments

Comments
 (0)