@expo/cli
Version:
168 lines (167 loc) • 6.08 kB
JavaScript
// Copyright © 2023 650 Industries.
// Copyright (c) Meta Platforms, Inc. and affiliates.
//
// Forks https://github.com/facebook/metro/blob/b80d9a0f638ee9fb82ff69cd3c8d9f4309ca1da2/packages/metro/src/index.flow.js#L57
// and adds the ability to access the bundler instance.
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "runServer", {
enumerable: true,
get: ()=>runServer
});
function _assert() {
const data = /*#__PURE__*/ _interopRequireDefault(require("assert"));
_assert = function() {
return data;
};
return data;
}
function _http() {
const data = /*#__PURE__*/ _interopRequireDefault(require("http"));
_http = function() {
return data;
};
return data;
}
function _https() {
const data = /*#__PURE__*/ _interopRequireDefault(require("https"));
_https = function() {
return data;
};
return data;
}
function _metro() {
const data = /*#__PURE__*/ _interopRequireDefault(require("metro"));
_metro = function() {
return data;
};
return data;
}
function _hmrServer() {
const data = /*#__PURE__*/ _interopRequireDefault(require("metro/src/HmrServer"));
_hmrServer = function() {
return data;
};
return data;
}
function _createWebsocketServer() {
const data = /*#__PURE__*/ _interopRequireDefault(require("metro/src/lib/createWebsocketServer"));
_createWebsocketServer = function() {
return data;
};
return data;
}
function _url() {
const data = require("url");
_url = function() {
return data;
};
return data;
}
const _log = require("../../../log");
const _getRunningProcess = require("../../../utils/getRunningProcess");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const runServer = async (metroBundler, config, { hasReducedPerformance =false , host , onError , onReady , secureServerOptions , waitForBundler =false , websocketEndpoints ={} , watch }, { mockServer })=>{
// await earlyPortCheck(host, config.server.port);
// if (secure != null || secureCert != null || secureKey != null) {
// // eslint-disable-next-line no-console
// console.warn(
// chalk.inverse.yellow.bold(' DEPRECATED '),
// 'The `secure`, `secureCert`, and `secureKey` options are now deprecated. ' +
// 'Please use the `secureServerOptions` object instead to pass options to ' +
// "Metro's https development server.",
// );
// }
const { middleware , end , metroServer } = await _metro().default.createConnectMiddleware(config, {
hasReducedPerformance,
waitForBundler,
watch
});
if (!mockServer) {
(0, _assert().default)(typeof middleware.use === "function");
}
const serverApp = middleware;
let httpServer;
if (secureServerOptions != null) {
httpServer = _https().default.createServer(secureServerOptions, serverApp);
} else {
httpServer = _http().default.createServer(serverApp);
}
httpServer.on("error", (error)=>{
if ("code" in error && error.code === "EADDRINUSE") {
// If `Error: listen EADDRINUSE: address already in use :::8081` then print additional info
// about the process before throwing.
const info = (0, _getRunningProcess.getRunningProcess)(config.server.port);
if (info) {
_log.Log.error(`Port ${config.server.port} is busy running ${info.command} in: ${info.directory}`);
}
}
if (onError) {
onError(error);
}
end();
});
// Disable any kind of automatic timeout behavior for incoming
// requests in case it takes the packager more than the default
// timeout of 120 seconds to respond to a request.
httpServer.timeout = 0;
httpServer.on("close", ()=>{
end();
});
// Extend the close method to ensure all websocket servers are closed, and connections are terminated
const originalClose = httpServer.close.bind(httpServer);
httpServer.close = function closeHttpServer(callback) {
originalClose(callback);
// Close all websocket servers, including possible client connections (see: https://github.com/websockets/ws/issues/2137#issuecomment-1507469375)
for (const endpoint of Object.values(websocketEndpoints)){
endpoint.close();
endpoint.clients.forEach((client)=>client.terminate());
}
// Forcibly close active connections
this.closeAllConnections();
return this;
};
if (mockServer) {
return {
server: httpServer,
metro: metroServer
};
}
return new Promise((resolve, reject)=>{
httpServer.on("error", (error)=>{
reject(error);
});
httpServer.listen(config.server.port, host, ()=>{
if (onReady) {
onReady(httpServer);
}
Object.assign(websocketEndpoints, {
// @ts-expect-error: incorrect types
"/hot": (0, _createWebsocketServer().default)({
websocketServer: new (_hmrServer()).default(metroServer.getBundler(), metroServer.getCreateModuleId(), config)
})
});
httpServer.on("upgrade", (request, socket, head)=>{
const { pathname } = (0, _url().parse)(request.url);
if (pathname != null && websocketEndpoints[pathname]) {
websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws)=>{
websocketEndpoints[pathname].emit("connection", ws, request);
});
} else {
socket.destroy();
}
});
resolve({
server: httpServer,
metro: metroServer
});
});
});
};
//# sourceMappingURL=runServer-fork.js.map