Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

33 linhas
1.1 KiB

  1. export async function waitForHttp(url, options = {}) {
  2. const timeoutMs = options.timeoutMs || 60000;
  3. const intervalMs = options.intervalMs || 500;
  4. const attemptTimeoutMs = options.attemptTimeoutMs || 5000;
  5. const start = Date.now();
  6. let lastError;
  7. while (Date.now() - start < timeoutMs) {
  8. const remainingMs = timeoutMs - (Date.now() - start);
  9. if (remainingMs <= 0) break;
  10. const controller = new AbortController();
  11. const timeout = setTimeout(() => controller.abort(), Math.min(attemptTimeoutMs, remainingMs));
  12. timeout.unref?.();
  13. try {
  14. const response = await fetch(url, { cache: 'no-store', signal: controller.signal });
  15. if (response.ok) return response;
  16. lastError = new Error(`HTTP ${response.status}`);
  17. } catch (error) {
  18. lastError = error;
  19. } finally {
  20. clearTimeout(timeout);
  21. }
  22. const remainingAfterAttemptMs = timeoutMs - (Date.now() - start);
  23. if (remainingAfterAttemptMs <= 0) break;
  24. await new Promise((resolve) => setTimeout(resolve, Math.min(intervalMs, remainingAfterAttemptMs)));
  25. }
  26. throw new Error(`Timed out waiting for ${url}: ${lastError?.message || 'no response'}`);
  27. }