File size: 1,126 Bytes
60a8358
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { acquireToken } from './auth.js';

const MAX_QUEUE_SIZE = 100;
const queue = [];

export function enqueueRequest(timeoutMs = 30000) {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      const idx = queue.findIndex(e => e.resolve === resolve);
      if (idx !== -1) queue.splice(idx, 1);
      reject(new Error('Request timed out waiting for available token'));
    }, timeoutMs);

    const slot = acquireToken();
    if (slot) {
      clearTimeout(timer);
      resolve(slot);
      return;
    }

    if (queue.length >= MAX_QUEUE_SIZE) {
      clearTimeout(timer);
      reject(new Error('Too many queued requests'));
      return;
    }

    queue.push({ resolve: (slot) => { clearTimeout(timer); resolve(slot); }, reject: (err) => { clearTimeout(timer); reject(err); } });
  });
}

export function dispatchQueued() {
  while (queue.length > 0) {
    const next = queue[0];
    const slot = acquireToken();
    if (!slot) break;
    queue.shift();
    next.resolve(slot);
  }
}

export function getQueueInfo() {
  return { queued: queue.length, maxQueueSize: MAX_QUEUE_SIZE };
}