You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
4.8 KiB
160 lines
4.8 KiB
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.broadcastMessage = broadcastMessage;
|
|
exports.startAsync = startAsync;
|
|
exports.stopAsync = stopAsync;
|
|
function _config() {
|
|
const data = require("@expo/config");
|
|
_config = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _devServer() {
|
|
const data = require("@expo/dev-server");
|
|
_devServer = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _internal() {
|
|
const data = require("../internal");
|
|
_internal = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _watchBabelConfig() {
|
|
const data = require("./watchBabelConfig");
|
|
_watchBabelConfig = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
let serverInstance = null;
|
|
let messageSocket = null;
|
|
|
|
/**
|
|
* Sends a message over web sockets to any connected device,
|
|
* does nothing when the dev server is not running.
|
|
*
|
|
* @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.
|
|
* @param params
|
|
*/
|
|
function broadcastMessage(method, params) {
|
|
if (messageSocket) {
|
|
messageSocket.broadcast(method, params);
|
|
}
|
|
}
|
|
async function startAsync(projectRoot, {
|
|
exp = (0, _config().getConfig)(projectRoot, {
|
|
skipSDKVersionRequirement: true
|
|
}).exp,
|
|
...options
|
|
} = {}, verbose = true) {
|
|
var _exp$sdkVersion;
|
|
(0, _internal().assertValidProjectRoot)(projectRoot);
|
|
_internal().Analytics.logEvent('Start Project', {
|
|
developerTool: _internal().Config.developerTool,
|
|
sdkVersion: (_exp$sdkVersion = exp.sdkVersion) !== null && _exp$sdkVersion !== void 0 ? _exp$sdkVersion : null
|
|
});
|
|
(0, _watchBabelConfig().watchBabelConfigForProject)(projectRoot);
|
|
if (options.webOnly) {
|
|
await _internal().Webpack.startAsync(projectRoot, {
|
|
...options,
|
|
port: options.webpackPort
|
|
});
|
|
} else if (_internal().Env.shouldUseDevServer(exp) || options.devClient) {
|
|
[serverInstance,, messageSocket] = await (0, _internal().startDevServerAsync)(projectRoot, options);
|
|
} else {
|
|
await (0, _internal().startExpoServerAsync)(projectRoot);
|
|
await (0, _internal().startReactNativeServerAsync)({
|
|
projectRoot,
|
|
exp,
|
|
options,
|
|
verbose
|
|
});
|
|
}
|
|
const {
|
|
hostType
|
|
} = await _internal().ProjectSettings.readAsync(projectRoot);
|
|
if (!_internal().ConnectionStatus.isOffline() && hostType === 'tunnel') {
|
|
try {
|
|
await (0, _internal().startTunnelsAsync)(projectRoot);
|
|
} catch (e) {
|
|
_internal().ProjectUtils.logError(projectRoot, 'expo', `Error starting ngrok: ${e.message}`);
|
|
}
|
|
}
|
|
const target = !options.webOnly || _internal().Webpack.isTargetingNative() ? 'native' : 'web';
|
|
// This is used to make Expo Go open the project in either Expo Go, or the web browser.
|
|
// Must come after ngrok (`startTunnelsAsync`) setup.
|
|
_internal().DevSession.startSession(projectRoot, exp, target);
|
|
return exp;
|
|
}
|
|
async function stopDevServerAsync() {
|
|
return new Promise((resolve, reject) => {
|
|
if (serverInstance) {
|
|
(0, _devServer().closeJsInspector)();
|
|
serverInstance.close(error => {
|
|
if (error) {
|
|
reject(error);
|
|
} else {
|
|
resolve();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
async function stopInternalAsync(projectRoot) {
|
|
_internal().DevSession.stopSession();
|
|
await Promise.all([_internal().Webpack.stopAsync(projectRoot), stopDevServerAsync(), (0, _internal().stopExpoServerAsync)(projectRoot), (0, _internal().stopReactNativeServerAsync)(projectRoot), async () => {
|
|
if (!_internal().ConnectionStatus.isOffline()) {
|
|
try {
|
|
await (0, _internal().stopTunnelsAsync)(projectRoot);
|
|
} catch (e) {
|
|
_internal().ProjectUtils.logError(projectRoot, 'expo', `Error stopping ngrok: ${e.message}`);
|
|
}
|
|
}
|
|
}, await _internal().Android.maybeStopAdbDaemonAsync()]);
|
|
}
|
|
async function forceQuitAsync(projectRoot) {
|
|
// find RN packager and ngrok pids, attempt to kill them manually
|
|
const {
|
|
packagerPid,
|
|
ngrokPid
|
|
} = await _internal().ProjectSettings.readPackagerInfoAsync(projectRoot);
|
|
if (packagerPid) {
|
|
try {
|
|
process.kill(packagerPid);
|
|
} catch {}
|
|
}
|
|
if (ngrokPid) {
|
|
try {
|
|
process.kill(ngrokPid);
|
|
} catch {}
|
|
}
|
|
await _internal().ProjectSettings.setPackagerInfoAsync(projectRoot, {
|
|
expoServerPort: null,
|
|
packagerPort: null,
|
|
packagerPid: null,
|
|
expoServerNgrokUrl: null,
|
|
packagerNgrokUrl: null,
|
|
ngrokPid: null,
|
|
webpackServerPort: null
|
|
});
|
|
}
|
|
async function stopAsync(projectRoot) {
|
|
try {
|
|
const result = await Promise.race([stopInternalAsync(projectRoot), new Promise(resolve => setTimeout(resolve, 2000, 'stopFailed'))]);
|
|
if (result === 'stopFailed') {
|
|
await forceQuitAsync(projectRoot);
|
|
}
|
|
} catch (error) {
|
|
await forceQuitAsync(projectRoot);
|
|
throw error;
|
|
}
|
|
}
|
|
//# sourceMappingURL=startAsync.js.map
|