@@ -15,21 +15,22 @@ export type RunQueueConsumerOptions = {
1515 preDequeue ?: PreDequeueFn ;
1616 preSkip ?: PreSkipFn ;
1717 maxRunCount ?: number ;
18- onDequeue : ( messages : WorkerApiDequeueResponseBody ) => Promise < void > ;
18+ onDequeue : ( messages : WorkerApiDequeueResponseBody , timing ?: { dequeueResponseMs : number ; pollingIntervalMs : number } ) => Promise < void > ;
1919} ;
2020
2121export class RunQueueConsumer implements QueueConsumer {
2222 private readonly client : SupervisorHttpClient ;
2323 private readonly preDequeue ?: PreDequeueFn ;
2424 private readonly preSkip ?: PreSkipFn ;
2525 private readonly maxRunCount ?: number ;
26- private readonly onDequeue : ( messages : WorkerApiDequeueResponseBody ) => Promise < void > ;
26+ private readonly onDequeue : ( messages : WorkerApiDequeueResponseBody , timing ?: { dequeueResponseMs : number ; pollingIntervalMs : number } ) => Promise < void > ;
2727
2828 private readonly logger = new SimpleStructuredLogger ( "queue-consumer" ) ;
2929
3030 private intervalMs : number ;
3131 private idleIntervalMs : number ;
3232 private isEnabled : boolean ;
33+ private lastScheduledIntervalMs : number ;
3334
3435 constructor ( opts : RunQueueConsumerOptions ) {
3536 this . isEnabled = false ;
@@ -38,6 +39,7 @@ export class RunQueueConsumer implements QueueConsumer {
3839 this . preDequeue = opts . preDequeue ;
3940 this . preSkip = opts . preSkip ;
4041 this . maxRunCount = opts . maxRunCount ;
42+ this . lastScheduledIntervalMs = opts . idleIntervalMs ;
4143 this . onDequeue = opts . onDequeue ;
4244 this . client = opts . client ;
4345 }
@@ -111,16 +113,18 @@ export class RunQueueConsumer implements QueueConsumer {
111113 let nextIntervalMs = this . idleIntervalMs ;
112114
113115 try {
116+ const dequeueStart = performance . now ( ) ;
114117 const response = await this . client . dequeue ( {
115118 maxResources : preDequeueResult ?. maxResources ,
116119 maxRunCount : this . maxRunCount ,
117120 } ) ;
121+ const dequeueResponseMs = Math . round ( performance . now ( ) - dequeueStart ) ;
118122
119123 if ( ! response . success ) {
120124 this . logger . error ( "Failed to dequeue" , { error : response . error } ) ;
121125 } else {
122126 try {
123- await this . onDequeue ( response . data ) ;
127+ await this . onDequeue ( response . data , { dequeueResponseMs , pollingIntervalMs : this . lastScheduledIntervalMs } ) ;
124128
125129 if ( response . data . length > 0 ) {
126130 nextIntervalMs = this . intervalMs ;
@@ -141,6 +145,7 @@ export class RunQueueConsumer implements QueueConsumer {
141145 this . logger . verbose ( "scheduled dequeue with idle interval" , { delayMs } ) ;
142146 }
143147
148+ this . lastScheduledIntervalMs = delayMs ;
144149 setTimeout ( this . dequeue . bind ( this ) , delayMs ) ;
145150 }
146151}
0 commit comments