@@ -82,6 +82,13 @@ describe("protocol tests", () => {
82
82
} ) ;
83
83
84
84
describe ( "_meta preservation with onprogress" , ( ) => {
85
+ beforeEach ( ( ) => {
86
+ jest . useFakeTimers ( ) ;
87
+ } ) ;
88
+ afterEach ( ( ) => {
89
+ jest . useRealTimers ( ) ;
90
+ } ) ;
91
+
85
92
test ( "should preserve existing _meta when adding progressToken" , async ( ) => {
86
93
await protocol . connect ( transport ) ;
87
94
const request = {
@@ -101,6 +108,8 @@ describe("protocol tests", () => {
101
108
102
109
protocol . request ( request , mockSchema , {
103
110
onprogress : onProgressMock ,
111
+ resetTimeoutOnProgress : false ,
112
+
104
113
} ) ;
105
114
106
115
expect ( sendSpy ) . toHaveBeenCalledWith ( expect . objectContaining ( {
@@ -133,6 +142,8 @@ describe("protocol tests", () => {
133
142
134
143
protocol . request ( request , mockSchema , {
135
144
onprogress : onProgressMock ,
145
+ resetTimeoutOnProgress : false ,
146
+
136
147
} ) ;
137
148
138
149
expect ( sendSpy ) . toHaveBeenCalledWith ( expect . objectContaining ( {
@@ -163,7 +174,10 @@ describe("protocol tests", () => {
163
174
result : z . string ( ) ,
164
175
} ) ;
165
176
166
- protocol . request ( request , mockSchema ) ;
177
+ protocol . request ( request , mockSchema , {
178
+ resetTimeoutOnProgress : false ,
179
+
180
+ } ) ;
167
181
168
182
expect ( sendSpy ) . toHaveBeenCalledWith ( expect . objectContaining ( {
169
183
method : "example" ,
@@ -190,6 +204,8 @@ describe("protocol tests", () => {
190
204
191
205
protocol . request ( request , mockSchema , {
192
206
onprogress : onProgressMock ,
207
+ resetTimeoutOnProgress : false ,
208
+
193
209
} ) ;
194
210
195
211
expect ( sendSpy ) . toHaveBeenCalledWith ( expect . objectContaining ( {
@@ -465,6 +481,58 @@ describe("protocol tests", () => {
465
481
await Promise . resolve ( ) ;
466
482
await expect ( requestPromise ) . resolves . toEqual ( { result : "success" } ) ;
467
483
} ) ;
484
+
485
+ test ( "should reset timeout by default when progress notification is received" , async ( ) => {
486
+ await protocol . connect ( transport ) ;
487
+ const request = { method : "example" , params : { } } ;
488
+ const mockSchema : ZodType < { result : string } > = z . object ( {
489
+ result : z . string ( ) ,
490
+ } ) ;
491
+ const onProgressMock = jest . fn ( ) ;
492
+ // Don't specify resetTimeoutOnProgress, should default to true
493
+ const requestPromise = protocol . request ( request , mockSchema , {
494
+ timeout : 1000 ,
495
+ onprogress : onProgressMock ,
496
+ } ) ;
497
+
498
+ // Advance past most of the timeout period
499
+ jest . advanceTimersByTime ( 900 ) ;
500
+
501
+ // Send progress notification - should reset timeout
502
+ if ( transport . onmessage ) {
503
+ transport . onmessage ( {
504
+ jsonrpc : "2.0" ,
505
+ method : "notifications/progress" ,
506
+ params : {
507
+ progressToken : 0 ,
508
+ progress : 50 ,
509
+ total : 100 ,
510
+ } ,
511
+ } ) ;
512
+ }
513
+ await Promise . resolve ( ) ;
514
+
515
+ expect ( onProgressMock ) . toHaveBeenCalledWith ( {
516
+ progress : 50 ,
517
+ total : 100 ,
518
+ } ) ;
519
+
520
+ // Advance another 900ms (would have timed out without reset)
521
+ jest . advanceTimersByTime ( 900 ) ;
522
+
523
+ // Send final response
524
+ if ( transport . onmessage ) {
525
+ transport . onmessage ( {
526
+ jsonrpc : "2.0" ,
527
+ id : 0 ,
528
+ result : { result : "completed" } ,
529
+ } ) ;
530
+ }
531
+ await Promise . resolve ( ) ;
532
+
533
+ // Should complete successfully because timeout was reset
534
+ await expect ( requestPromise ) . resolves . toEqual ( { result : "completed" } ) ;
535
+ } ) ;
468
536
} ) ;
469
537
470
538
describe ( "Debounced Notifications" , ( ) => {
0 commit comments