146 lines
4.4 KiB
JavaScript
146 lines
4.4 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
function _metro() {
|
|
const data = _interopRequireDefault(require("metro"));
|
|
_metro = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _metroCore() {
|
|
const data = require("metro-core");
|
|
_metroCore = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _path() {
|
|
const data = _interopRequireDefault(require("path"));
|
|
_path = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _cliServerApi() {
|
|
const data = require("@react-native-community/cli-server-api");
|
|
_cliServerApi = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
var _loadMetroConfig = _interopRequireDefault(require("../../tools/loadMetroConfig"));
|
|
function _cliTools() {
|
|
const data = require("@react-native-community/cli-tools");
|
|
_cliTools = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
var _watchMode = _interopRequireDefault(require("./watchMode"));
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
// @ts-ignore untyped metro
|
|
|
|
async function runServer(_argv, ctx, args) {
|
|
let reportEvent;
|
|
const terminal = new (_metroCore().Terminal)(process.stdout);
|
|
const ReporterImpl = getReporterImpl(args.customLogReporterPath);
|
|
const terminalReporter = new ReporterImpl(terminal);
|
|
const reporter = {
|
|
update(event) {
|
|
terminalReporter.update(event);
|
|
if (reportEvent) {
|
|
reportEvent(event);
|
|
}
|
|
}
|
|
};
|
|
const metroConfig = await (0, _loadMetroConfig.default)(ctx, {
|
|
config: args.config,
|
|
maxWorkers: args.maxWorkers,
|
|
port: args.port,
|
|
resetCache: args.resetCache,
|
|
watchFolders: args.watchFolders,
|
|
projectRoot: args.projectRoot,
|
|
sourceExts: args.sourceExts,
|
|
reporter
|
|
});
|
|
if (args.assetPlugins) {
|
|
// @ts-ignore - assigning to readonly property
|
|
metroConfig.transformer.assetPlugins = args.assetPlugins.map(plugin => require.resolve(plugin));
|
|
}
|
|
const {
|
|
middleware,
|
|
websocketEndpoints,
|
|
messageSocketEndpoint,
|
|
eventsSocketEndpoint
|
|
} = (0, _cliServerApi().createDevServerMiddleware)({
|
|
host: args.host,
|
|
port: metroConfig.server.port,
|
|
watchFolders: metroConfig.watchFolders
|
|
});
|
|
middleware.use(_cliServerApi().indexPageMiddleware);
|
|
const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;
|
|
// @ts-ignore - assigning to readonly property
|
|
metroConfig.server.enhanceMiddleware = (metroMiddleware, server) => {
|
|
if (customEnhanceMiddleware) {
|
|
metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);
|
|
}
|
|
return middleware.use(metroMiddleware);
|
|
};
|
|
const serverInstance = await _metro().default.runServer(metroConfig, {
|
|
host: args.host,
|
|
secure: args.https,
|
|
secureCert: args.cert,
|
|
secureKey: args.key,
|
|
// @ts-ignore - ws.Server types are incompatible
|
|
websocketEndpoints
|
|
});
|
|
reportEvent = eventsSocketEndpoint.reportEvent;
|
|
if (args.interactive) {
|
|
(0, _watchMode.default)(messageSocketEndpoint);
|
|
}
|
|
|
|
// In Node 8, the default keep-alive for an HTTP connection is 5 seconds. In
|
|
// early versions of Node 8, this was implemented in a buggy way which caused
|
|
// some HTTP responses (like those containing large JS bundles) to be
|
|
// terminated early.
|
|
//
|
|
// As a workaround, arbitrarily increase the keep-alive from 5 to 30 seconds,
|
|
// which should be enough to send even the largest of JS bundles.
|
|
//
|
|
// For more info: https://github.com/nodejs/node/issues/13391
|
|
//
|
|
serverInstance.keepAliveTimeout = 30000;
|
|
await _cliTools().version.logIfUpdateAvailable(ctx.root);
|
|
}
|
|
function getReporterImpl(customLogReporterPath) {
|
|
if (customLogReporterPath === undefined) {
|
|
return require('metro/src/lib/TerminalReporter');
|
|
}
|
|
try {
|
|
// First we let require resolve it, so we can require packages in node_modules
|
|
// as expected. eg: require('my-package/reporter');
|
|
return require(customLogReporterPath);
|
|
} catch (e) {
|
|
if (e.code !== 'MODULE_NOT_FOUND') {
|
|
throw e;
|
|
}
|
|
// If that doesn't work, then we next try relative to the cwd, eg:
|
|
// require('./reporter');
|
|
return require(_path().default.resolve(customLogReporterPath));
|
|
}
|
|
}
|
|
var _default = runServer;
|
|
exports.default = _default;
|
|
|
|
//# sourceMappingURL=runServer.ts.map
|