Calmlo commited on
Commit
89e1f0c
·
verified ·
1 Parent(s): c9e0fd6

Update server.js

Browse files
Files changed (1) hide show
  1. server.js +39 -14
server.js CHANGED
@@ -427,6 +427,7 @@ async function makeFalRequestWithRetry(falInput, stream = false) {
427
  if (isKeyRelatedError(error)) {
428
  console.warn(`Marking Fal Key index ${keyInfo.index} as invalid due to caught initiation error.`);
429
  invalidKeys.add(keyInfo.key);
 
430
  // Continue loop to try the next key
431
  } else {
432
  console.error("Initiation error does not appear to be key-related. Failing request without further key retries.");
@@ -510,9 +511,9 @@ app.post('/v1/chat/completions', async (req, res) => {
510
  id: `chatcmpl-${Date.now()}-error`, object: "chat.completion.chunk", created: Math.floor(Date.now() / 1000), model: model,
511
  choices: [{ index: 0, delta: {}, finish_reason: "error", message: { role: 'assistant', content: `Fal Stream Event Error: ${JSON.stringify(errorInfo)}` } }]
512
  };
 
513
  if (!res.writableEnded) { res.write(`data: ${JSON.stringify(errorChunk)}\n\n`); }
514
  else { console.warn("Stream ended before writing event error."); }
515
- // Potentially break or add logic based on error type here
516
  }
517
 
518
  // Calculate the delta (new content)
@@ -539,6 +540,7 @@ app.post('/v1/chat/completions', async (req, res) => {
539
  finish_reason: isPartial === false ? "stop" : null
540
  }]
541
  };
 
542
  if (!res.writableEnded) { res.write(`data: ${JSON.stringify(openAIChunk)}\n\n`); }
543
  else { console.warn("Stream ended before writing data chunk."); }
544
  }
@@ -553,42 +555,65 @@ app.post('/v1/chat/completions', async (req, res) => {
553
  console.log("<-- Stream processing finished, but connection was already ended before [DONE].");
554
  }
555
 
 
 
 
556
  } catch (streamError) {
557
  // **Catch block for errors during stream processing OR initiation failure**
558
  console.error('Error during stream request processing/initiation:', streamError.message || streamError);
 
 
559
 
560
  // **Check if the error is key-related AND if initiation succeeded**
561
  // This ensures we only invalidate the key if the error happened *during* processing
562
  // using a key that successfully initiated the stream.
563
  if (keyUsedForRequest && isKeyRelatedError(streamError)) {
564
- console.warn(`Marking Fal Key index ${indexUsedForRequest} as invalid due to error during stream processing.`);
565
  invalidKeys.add(keyUsedForRequest);
 
566
  }
567
- // else: Error was either non-key-related or happened during initiation (already handled/logged in makeFalRequestWithRetry).
568
 
569
- // --- Report error back to the client ---
570
  try {
 
571
  if (!res.headersSent) {
572
- // Error likely during initiation (caught from makeFalRequestWithRetry)
573
  const errorMessage = (streamError instanceof Error) ? streamError.message : JSON.stringify(streamError);
574
- res.status(502).json({ error: 'Failed to initiate Fal stream', details: errorMessage });
 
 
575
  console.log("<-- Stream initiation failed response sent (502).");
576
- } else if (!res.writableEnded) {
577
- // Error during stream processing after headers sent
 
 
578
  const errorDetails = (streamError instanceof Error) ? streamError.message : JSON.stringify(streamError);
579
- res.write(`data: ${JSON.stringify({ error: { message: "Stream processing error after initiation", type: "proxy_error", details: errorDetails } })}\n\n`);
580
- res.write(`data: [DONE]\n\n`); // Still send DONE for robust client handling
581
- res.end();
 
 
 
582
  console.log("<-- Stream error sent within stream, stream ended.");
583
  } else {
584
- console.log("<-- Stream error occurred, but connection was already ended.");
 
585
  }
586
  } catch (finalError) {
587
- console.error('Error sending stream error message to client:', finalError);
588
- if (!res.writableEnded) { res.end(); }
 
 
 
 
 
589
  }
590
  // --- End error reporting ---
591
  }
 
 
 
592
 
593
  } else {
594
  // --- Non-Stream Request ---
 
427
  if (isKeyRelatedError(error)) {
428
  console.warn(`Marking Fal Key index ${keyInfo.index} as invalid due to caught initiation error.`);
429
  invalidKeys.add(keyInfo.key);
430
+ console.log(`--> Invalid Keys Set now contains: [${Array.from(invalidKeys).join(', ')}]`); // Log the set content
431
  // Continue loop to try the next key
432
  } else {
433
  console.error("Initiation error does not appear to be key-related. Failing request without further key retries.");
 
511
  id: `chatcmpl-${Date.now()}-error`, object: "chat.completion.chunk", created: Math.floor(Date.now() / 1000), model: model,
512
  choices: [{ index: 0, delta: {}, finish_reason: "error", message: { role: 'assistant', content: `Fal Stream Event Error: ${JSON.stringify(errorInfo)}` } }]
513
  };
514
+ // Check write status before sending
515
  if (!res.writableEnded) { res.write(`data: ${JSON.stringify(errorChunk)}\n\n`); }
516
  else { console.warn("Stream ended before writing event error."); }
 
517
  }
518
 
519
  // Calculate the delta (new content)
 
540
  finish_reason: isPartial === false ? "stop" : null
541
  }]
542
  };
543
+ // Check write status before sending
544
  if (!res.writableEnded) { res.write(`data: ${JSON.stringify(openAIChunk)}\n\n`); }
545
  else { console.warn("Stream ended before writing data chunk."); }
546
  }
 
555
  console.log("<-- Stream processing finished, but connection was already ended before [DONE].");
556
  }
557
 
558
+ // ==================================================
559
+ // START: UPDATED CATCH BLOCK FOR STREAM HANDLING
560
+ // ==================================================
561
  } catch (streamError) {
562
  // **Catch block for errors during stream processing OR initiation failure**
563
  console.error('Error during stream request processing/initiation:', streamError.message || streamError);
564
+ // **Log the specific error object for more details**
565
+ console.error('Full streamError object:', streamError);
566
 
567
  // **Check if the error is key-related AND if initiation succeeded**
568
  // This ensures we only invalidate the key if the error happened *during* processing
569
  // using a key that successfully initiated the stream.
570
  if (keyUsedForRequest && isKeyRelatedError(streamError)) {
571
+ console.warn(`--> Marking Fal Key index ${indexUsedForRequest} as invalid due to error during stream processing.`);
572
  invalidKeys.add(keyUsedForRequest);
573
+ console.log(`--> Invalid Keys Set now contains: [${Array.from(invalidKeys).map(k => k.substring(0, 5) + '...').join(', ')}]`); // Log obfuscated keys in set
574
  }
575
+ // else: Error was non-key-related or happened during initiation (already handled/logged in makeFalRequestWithRetry).
576
 
577
+ // --- Safely Report error back to the client ---
578
  try {
579
+ // **Check headersSent first for initiation errors**
580
  if (!res.headersSent) {
581
+ console.log("<-- Attempting to send 502 error response (headers not sent).");
582
  const errorMessage = (streamError instanceof Error) ? streamError.message : JSON.stringify(streamError);
583
+ // Avoid sending huge objects if stringify fails or is too large
584
+ const detail = String(errorMessage).length < 1000 ? errorMessage : "Error details too large or complex, check server logs.";
585
+ res.status(502).json({ error: 'Failed to initiate Fal stream', details: detail });
586
  console.log("<-- Stream initiation failed response sent (502).");
587
+ }
588
+ // **Check writableEnded for errors during processing**
589
+ else if (!res.writableEnded) {
590
+ console.log("<-- Attempting to send error within stream (headers sent, not ended).");
591
  const errorDetails = (streamError instanceof Error) ? streamError.message : JSON.stringify(streamError);
592
+ const detail = String(errorDetails).length < 1000 ? errorDetails : "Error details too large or complex, check server logs.";
593
+ // Send an error object in the SSE stream format
594
+ res.write(`data: ${JSON.stringify({ error: { message: "Stream processing error after initiation", type: "proxy_error", details: detail } })}\n\n`);
595
+ // Still attempt to send [DONE] for robust client handling
596
+ res.write(`data: [DONE]\n\n`);
597
+ res.end(); // Explicitly end the response
598
  console.log("<-- Stream error sent within stream, stream ended.");
599
  } else {
600
+ // Stream already ended, just log server-side.
601
+ console.log("<-- Stream error occurred, but connection was already ended. Cannot send error to client.");
602
  }
603
  } catch (finalError) {
604
+ // Error trying to send the error message itself (e.g., network gone)
605
+ console.error('!!! Error sending stream error message to client:', finalError);
606
+ // Attempt to end the response if it wasn't already
607
+ if (!res.writableEnded) {
608
+ console.log("<-- Forcefully ending response after error during error reporting.");
609
+ res.end();
610
+ }
611
  }
612
  // --- End error reporting ---
613
  }
614
+ // ==================================================
615
+ // END: UPDATED CATCH BLOCK FOR STREAM HANDLING
616
+ // ==================================================
617
 
618
  } else {
619
  // --- Non-Stream Request ---