in src/core/utils/net.ts [93:150]
export async function validateDevServerConfig(url: string | undefined, timeout: number | undefined) {
logger.silly(`Validating dev server config:`);
logger.silly({
url,
timeout,
});
let { hostname, port } = parseUrl(url);
try {
const resolvedPortNumber = await isAcceptingTcpConnections({ port, host: hostname });
if (resolvedPortNumber !== 0) {
const spinner = ora();
let waitOnOneOfResources = hostname === "localhost" ? [`tcp:127.0.0.1:${port}`, `tcp:localhost:${port}`] : [`tcp:${hostname}:${port}`];
spinner.start(`Waiting for ${chalk.green(url)} to be ready`);
let promises = waitOnOneOfResources.map((resource) => {
return waitOn({
resources: [resource],
delay: 1000, // initial delay in ms, default 0
interval: 100, // poll interval in ms, default 250ms
simultaneous: 1, // limit to 1 connection per resource at a time
timeout: timeout ? timeout * 1000 : timeout, // timeout in ms, default Infinity
tcpTimeout: 1000, // tcp timeout in ms, default 300ms
window: 1000, // stabilization time in ms, default 750ms
strictSSL: false,
verbose: false, // force disable verbose logs even if SWA_CLI_DEBUG is enabled
})
.then(() => {
logger.silly(`Connected to ${resource} successfully`);
return resource;
})
.catch((err) => {
logger.silly(`Could not connect to ${resource}`);
throw err;
});
});
try {
await Promise.any(promises);
spinner.succeed(`${url} validated successfully`);
spinner.clear();
} catch {
spinner.fail();
logger.error(`Could not connect to "${url}". Is the server up and running?`, true);
}
}
} catch (err) {
if ((err as any).message.includes("EACCES")) {
logger.error(
`Port "${port}" cannot be used. You might need elevated or admin privileges. Or, use a valid port from ${VALID_PORT_MIN} to ${VALID_PORT_MAX}.`,
true
);
} else {
logger.error((err as any).message, true);
}
}
}