Skip to content

Commit 897365b

Browse files
committed
fix: cr
1 parent 8574bd2 commit 897365b

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

plugin/controller/lib/impl/mcp/MCPControllerRegister.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,21 @@ export interface MCPControllerHook {
4545

4646
class InnerSSEServerTransport extends SSEServerTransport {
4747
async send(message: JSONRPCMessage) {
48-
await super.send(message);
49-
// eslint-disable-next-line @typescript-eslint/no-use-before-define
50-
const map = MCPControllerRegister.instance?.sseTransportsRequestMap.get(this);
51-
if (map && 'id' in message) {
52-
const resolve = map[message.id];
53-
resolve(null);
54-
delete map[message.id];
48+
let res: null | Error = null;
49+
try {
50+
await super.send(message);
51+
} catch (e) {
52+
res = e as Error;
53+
} finally {
54+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
55+
const map = MCPControllerRegister.instance?.sseTransportsRequestMap.get(this);
56+
if (map && 'id' in message) {
57+
const { resolve, reject } = map[message.id] ?? {};
58+
if (resolve) {
59+
res ? reject(res) : resolve(res);
60+
delete map[message.id];
61+
}
62+
}
5563
}
5664
}
5765
}
@@ -75,7 +83,10 @@ export class MCPControllerRegister implements ControllerRegister {
7583
// eslint-disable-next-line no-spaced-func
7684
sseTransportsRequestMap = new Map<
7785
InnerSSEServerTransport,
78-
Record<string, (value: PromiseLike<null> | null) => void
86+
Record<string, {
87+
resolve: (value: PromiseLike<null> | null) => void,
88+
reject: (reason?: any) => void,
89+
}
7990
>>();
8091
static hooks: MCPControllerHook[] = [];
8192

@@ -366,16 +377,18 @@ export class MCPControllerRegister implements ControllerRegister {
366377
}
367378

368379
sseCtxStorageRun(ctx: Context, transport: SSEServerTransport) {
380+
const self = this;
369381
const mw = this.app.middleware.teggCtxLifecycleMiddleware();
370382
const closeFunc = transport.onclose;
371383
transport.onclose = (...args) => {
372384
closeFunc?.(...args);
385+
delete self.transports[transport.sessionId];
386+
self.sseTransportsRequestMap.delete(transport);
373387
};
374388
transport.onerror = error => {
375-
this.app.logger.error('session %s error %o', transport.sessionId, error);
389+
self.app.logger.error('session %s error %o', transport.sessionId, error);
376390
};
377391
const messageFunc = transport.onmessage;
378-
const self = this;
379392
self.sseTransportsRequestMap.set(transport, {});
380393
transport.onmessage = async (...args: [ JSONRPCMessage ]) => {
381394
// 这里需要 new 一个新的 ctx,否则 ContextProto 会未被初始化
@@ -394,9 +407,9 @@ export class MCPControllerRegister implements ControllerRegister {
394407
messageFunc!(...args);
395408
if (isJSONRPCRequest(args[0])) {
396409
const map = self.sseTransportsRequestMap.get(transport)!;
397-
const wait = new Promise<null>(resolve => {
410+
const wait = new Promise<null>((resolve, reject) => {
398411
if ('id' in args[0]) {
399-
map[args[0].id] = resolve;
412+
map[args[0].id] = { resolve, reject };
400413
}
401414
});
402415
await wait;

0 commit comments

Comments
 (0)