UNPKG

@epic-web/app-launcher

Version:

Utility for launching your applications on a per-test basis.

49 lines 1.86 kB
import net from 'node:net'; import { setTimeout } from 'node:timers/promises'; const DEFAULT_RETRY_INTERVAL = 500; const DEFAULT_TIMEOUT = 10_000; const MAX_RETRIES = 5; /** * Returns a Promise that resolves when the given port has a process * running on it. If no process is established on the given port * within the timeout window, the returned promise rejects. * * @example * await waitForPort(3000) */ export async function waitForPort(port, options) { const timeout = options?.timeout ?? DEFAULT_TIMEOUT; const retryInterval = options?.retryInterval ?? DEFAULT_RETRY_INTERVAL; const maxRetries = options?.maxRetries ?? MAX_RETRIES; let retry = 0; const attempt = (lastError) => { return new Promise((resolve, reject) => { if (retry === maxRetries) { if (lastError) { console.error(lastError); return reject(new Error(`Failed to wait for port "${port}": retries limit reached. Please see the additional context above.`)); } return reject(new Error(`Failed to wait for port "${port}": retries limit reached`)); } retry++; const socket = net .connect({ port, timeout: options?.timeout ?? DEFAULT_TIMEOUT }, () => { socket.destroy(); resolve(); }) .once('error', (error) => { setTimeout(retryInterval).then(() => resolve(attempt(error))); }); socket.unref(); }); }; return Promise.race([ attempt(), new Promise((_, reject) => { return setTimeout(timeout).then(() => { reject(new Error(`Failed to wait for port "${port}": timeout`)); }); }), ]); } //# sourceMappingURL=wait-for-port.js.map