WalleGriffkinder commited on
Commit
c021453
·
verified ·
1 Parent(s): 25b0663

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +53 -13
index.js CHANGED
@@ -9,6 +9,58 @@ app.get('/', (req, res) => {
9
  res.send('Hello World');
10
  });
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  // Прокси для всех остальных путей
13
  app.all('*', async (req, res) => {
14
  if (req.url === '/') return;
@@ -16,28 +68,16 @@ app.all('*', async (req, res) => {
16
  try {
17
  const url = `https://api.groq.com${req.url}`;
18
 
19
- // Копируем и фильтруем заголовки
20
  const headers = {...req.headers};
21
  delete headers['host'];
22
  delete headers['content-length'];
23
 
24
- const response = await fetch(url, {
25
  method: req.method,
26
  headers,
27
  body: req.method !== 'GET' ? req.body : undefined
28
  });
29
 
30
- // Streaming response
31
- if (response.headers.get('content-type')?.includes('text/event-stream')) {
32
- res.setHeader('Content-Type', 'text/event-stream');
33
- response.body.pipe(res);
34
- return;
35
- }
36
-
37
- // Regular response
38
- const data = await response.buffer();
39
- res.status(response.status);
40
- res.set('Content-Type', response.headers.get('content-type'));
41
  res.send(data);
42
 
43
  } catch (error) {
 
9
  res.send('Hello World');
10
  });
11
 
12
+ const fetchWithRetry = async (url, options, maxRetries = 3) => {
13
+ let lastChunkTime = Date.now();
14
+ let totalTime = Date.now();
15
+ let fullResponse = [];
16
+ let currentRetry = 0;
17
+
18
+ while(currentRetry < maxRetries) {
19
+ try {
20
+ const response = await fetch(url, {
21
+ ...options,
22
+ headers: {
23
+ ...options.headers,
24
+ 'Accept': 'text/event-stream'
25
+ }
26
+ });
27
+
28
+ const reader = response.body.getReader();
29
+
30
+ while(true) {
31
+ const {value, done} = await reader.read();
32
+
33
+ if(done) break;
34
+
35
+ if(value) {
36
+ fullResponse.push(value);
37
+ lastChunkTime = Date.now();
38
+ }
39
+
40
+ // Проверяем таймауты
41
+ const chunkIdle = Date.now() - lastChunkTime;
42
+ const totalElapsed = Date.now() - totalTime;
43
+
44
+ if(chunkIdle > 2000 || totalElapsed > 6000) {
45
+ reader.cancel();
46
+ currentRetry++;
47
+ fullResponse = []; // Сбрасываем буфер
48
+ lastChunkTime = Date.now();
49
+ totalTime = Date.now();
50
+ break;
51
+ }
52
+ }
53
+
54
+ // Если дошли сюда без breaks - значит успешно
55
+ return Buffer.concat(fullResponse);
56
+
57
+ } catch(error) {
58
+ currentRetry++;
59
+ if(currentRetry === maxRetries) throw error;
60
+ }
61
+ }
62
+ };
63
+
64
  // Прокси для всех остальных путей
65
  app.all('*', async (req, res) => {
66
  if (req.url === '/') return;
 
68
  try {
69
  const url = `https://api.groq.com${req.url}`;
70
 
 
71
  const headers = {...req.headers};
72
  delete headers['host'];
73
  delete headers['content-length'];
74
 
75
+ const data = await fetchWithRetry(url, {
76
  method: req.method,
77
  headers,
78
  body: req.method !== 'GET' ? req.body : undefined
79
  });
80
 
 
 
 
 
 
 
 
 
 
 
 
81
  res.send(data);
82
 
83
  } catch (error) {