52 lines
1.3 KiB
JavaScript
52 lines
1.3 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true,
|
||
|
});
|
||
|
exports.default = isDevServerRunning;
|
||
|
var _net = _interopRequireDefault(require("net"));
|
||
|
function _interopRequireDefault(e) {
|
||
|
return e && e.__esModule ? e : { default: e };
|
||
|
}
|
||
|
async function isDevServerRunning(devServerUrl, projectRoot) {
|
||
|
const { hostname, port } = new URL(devServerUrl);
|
||
|
try {
|
||
|
if (!(await isPortOccupied(hostname, port))) {
|
||
|
return "not_running";
|
||
|
}
|
||
|
const statusResponse = await fetch(`${devServerUrl}/status`);
|
||
|
const body = await statusResponse.text();
|
||
|
return body === "packager-status:running" &&
|
||
|
statusResponse.headers.get("X-React-Native-Project-Root") === projectRoot
|
||
|
? "matched_server_running"
|
||
|
: "port_taken";
|
||
|
} catch (e) {
|
||
|
return "unknown";
|
||
|
}
|
||
|
}
|
||
|
async function isPortOccupied(hostname, port) {
|
||
|
let result = false;
|
||
|
const server = _net.default.createServer();
|
||
|
return new Promise((resolve, reject) => {
|
||
|
server.once("error", (e) => {
|
||
|
server.close();
|
||
|
if (e.code === "EADDRINUSE") {
|
||
|
result = true;
|
||
|
} else {
|
||
|
reject(e);
|
||
|
}
|
||
|
});
|
||
|
server.once("listening", () => {
|
||
|
result = false;
|
||
|
server.close();
|
||
|
});
|
||
|
server.once("close", () => {
|
||
|
resolve(result);
|
||
|
});
|
||
|
server.listen({
|
||
|
host: hostname,
|
||
|
port,
|
||
|
});
|
||
|
});
|
||
|
}
|