Skip to content

Commit 1909bbc

Browse files
authored
Merge pull request #160 from Ozamatash/fix-reset-timeout-on-progress
Fix bug in reset timeout on progress
2 parents ba07d80 + deb2737 commit 1909bbc

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

Diff for: src/shared/protocol.test.ts

+38
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,44 @@ describe("protocol tests", () => {
7171
jest.useRealTimers();
7272
});
7373

74+
test("should not reset timeout when resetTimeoutOnProgress is false", async () => {
75+
await protocol.connect(transport);
76+
const request = { method: "example", params: {} };
77+
const mockSchema: ZodType<{ result: string }> = z.object({
78+
result: z.string(),
79+
});
80+
const onProgressMock = jest.fn();
81+
const requestPromise = protocol.request(request, mockSchema, {
82+
timeout: 1000,
83+
resetTimeoutOnProgress: false,
84+
onprogress: onProgressMock,
85+
});
86+
87+
jest.advanceTimersByTime(800);
88+
89+
if (transport.onmessage) {
90+
transport.onmessage({
91+
jsonrpc: "2.0",
92+
method: "notifications/progress",
93+
params: {
94+
progressToken: 0,
95+
progress: 50,
96+
total: 100,
97+
},
98+
});
99+
}
100+
await Promise.resolve();
101+
102+
expect(onProgressMock).toHaveBeenCalledWith({
103+
progress: 50,
104+
total: 100,
105+
});
106+
107+
jest.advanceTimersByTime(201);
108+
109+
await expect(requestPromise).rejects.toThrow("Request timed out");
110+
});
111+
74112
test("should reset timeout when progress notification is received", async () => {
75113
await protocol.connect(transport);
76114
const request = { method: "example", params: {} };

Diff for: src/shared/protocol.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ type TimeoutInfo = {
103103
startTime: number;
104104
timeout: number;
105105
maxTotalTimeout?: number;
106+
resetTimeoutOnProgress: boolean;
106107
onTimeout: () => void;
107108
};
108109

@@ -184,13 +185,15 @@ export abstract class Protocol<
184185
messageId: number,
185186
timeout: number,
186187
maxTotalTimeout: number | undefined,
187-
onTimeout: () => void
188+
onTimeout: () => void,
189+
resetTimeoutOnProgress: boolean = false
188190
) {
189191
this._timeoutInfo.set(messageId, {
190192
timeoutId: setTimeout(onTimeout, timeout),
191193
startTime: Date.now(),
192194
timeout,
193195
maxTotalTimeout,
196+
resetTimeoutOnProgress,
194197
onTimeout
195198
});
196199
}
@@ -369,7 +372,9 @@ export abstract class Protocol<
369372
}
370373

371374
const responseHandler = this._responseHandlers.get(messageId);
372-
if (this._timeoutInfo.has(messageId) && responseHandler) {
375+
const timeoutInfo = this._timeoutInfo.get(messageId);
376+
377+
if (timeoutInfo && responseHandler && timeoutInfo.resetTimeoutOnProgress) {
373378
try {
374379
this._resetTimeout(messageId);
375380
} catch (error) {
@@ -531,7 +536,7 @@ export abstract class Protocol<
531536
{ timeout }
532537
));
533538

534-
this._setupTimeout(messageId, timeout, options?.maxTotalTimeout, timeoutHandler);
539+
this._setupTimeout(messageId, timeout, options?.maxTotalTimeout, timeoutHandler, options?.resetTimeoutOnProgress ?? false);
535540

536541
this._transport.send(jsonrpcRequest).catch((error) => {
537542
this._cleanupTimeout(messageId);

0 commit comments

Comments
 (0)