UNPKG

5.24 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.broadcastMessage = broadcastMessage;
7exports.startAsync = startAsync;
8exports.startWebpackAsync = startWebpackAsync;
9exports.stopAsync = stopAsync;
10function _config() {
11 const data = require("@expo/config");
12 _config = function () {
13 return data;
14 };
15 return data;
16}
17function _devServer() {
18 const data = require("@expo/dev-server");
19 _devServer = function () {
20 return data;
21 };
22 return data;
23}
24function _internal() {
25 const data = require("../internal");
26 _internal = function () {
27 return data;
28 };
29 return data;
30}
31function _watchBabelConfig() {
32 const data = require("./watchBabelConfig");
33 _watchBabelConfig = function () {
34 return data;
35 };
36 return data;
37}
38let serverInstance = null;
39let messageSocket = null;
40let webpackDevServer = null;
41
42/**
43 * Sends a message over web sockets to any connected device,
44 * does nothing when the dev server is not running.
45 *
46 * @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.
47 * @param params
48 */
49function broadcastMessage(method, params) {
50 if (webpackDevServer) {
51 webpackDevServer.messageSocket.broadcast(method, params);
52 }
53 if (messageSocket) {
54 messageSocket.broadcast(method, params);
55 }
56}
57async function startWebpackAsync(projectRoot, {
58 exp = (0, _config().getConfig)(projectRoot).exp,
59 ...options
60} = {}) {
61 webpackDevServer = await _internal().Webpack.startAsync(projectRoot, {
62 ...options,
63 port: options.webpackPort
64 });
65}
66async function startAsync(projectRoot, {
67 exp = (0, _config().getConfig)(projectRoot, {
68 skipSDKVersionRequirement: true
69 }).exp,
70 ...options
71} = {}, verbose = true) {
72 var _exp$sdkVersion;
73 (0, _internal().assertValidProjectRoot)(projectRoot);
74 _internal().Analytics.logEvent('Start Project', {
75 developerTool: _internal().Config.developerTool,
76 sdkVersion: (_exp$sdkVersion = exp.sdkVersion) !== null && _exp$sdkVersion !== void 0 ? _exp$sdkVersion : null
77 });
78 (0, _watchBabelConfig().watchBabelConfigForProject)(projectRoot);
79 if (options.webOnly) {
80 await startWebpackAsync(projectRoot, {
81 exp,
82 ...options
83 });
84 } else if (_internal().Env.shouldUseDevServer(exp) || options.devClient) {
85 [serverInstance,, messageSocket] = await (0, _internal().startDevServerAsync)(projectRoot, options);
86 } else {
87 await (0, _internal().startExpoServerAsync)(projectRoot);
88 await (0, _internal().startReactNativeServerAsync)({
89 projectRoot,
90 exp,
91 options,
92 verbose
93 });
94 }
95 const {
96 hostType
97 } = await _internal().ProjectSettings.readAsync(projectRoot);
98 if (!_internal().ConnectionStatus.isOffline() && hostType === 'tunnel') {
99 try {
100 await (0, _internal().startTunnelsAsync)(projectRoot);
101 } catch (e) {
102 _internal().ProjectUtils.logError(projectRoot, 'expo', `Error starting ngrok: ${e.message}`);
103 }
104 }
105 const target = !options.webOnly ? 'native' : 'web';
106 // This is used to make Expo Go open the project in either Expo Go, or the web browser.
107 // Must come after ngrok (`startTunnelsAsync`) setup.
108 _internal().DevSession.startSession(projectRoot, exp, target);
109 return exp;
110}
111async function stopDevServerAsync() {
112 return new Promise((resolve, reject) => {
113 if (serverInstance) {
114 (0, _devServer().closeJsInspector)();
115 serverInstance.close(error => {
116 if (error) {
117 reject(error);
118 } else {
119 resolve();
120 }
121 });
122 }
123 });
124}
125async function stopInternalAsync(projectRoot) {
126 _internal().DevSession.stopSession();
127 await Promise.all([_internal().Webpack.stopAsync(projectRoot), stopDevServerAsync(), (0, _internal().stopExpoServerAsync)(projectRoot), (0, _internal().stopReactNativeServerAsync)(projectRoot), async () => {
128 if (!_internal().ConnectionStatus.isOffline()) {
129 try {
130 await (0, _internal().stopTunnelsAsync)(projectRoot);
131 } catch (e) {
132 _internal().ProjectUtils.logError(projectRoot, 'expo', `Error stopping ngrok: ${e.message}`);
133 }
134 }
135 }, await _internal().Android.maybeStopAdbDaemonAsync()]);
136}
137async function forceQuitAsync(projectRoot) {
138 // find RN packager and ngrok pids, attempt to kill them manually
139 const {
140 packagerPid,
141 ngrokPid
142 } = await _internal().ProjectSettings.readPackagerInfoAsync(projectRoot);
143 if (packagerPid) {
144 try {
145 process.kill(packagerPid);
146 } catch {}
147 }
148 if (ngrokPid) {
149 try {
150 process.kill(ngrokPid);
151 } catch {}
152 }
153 await _internal().ProjectSettings.setPackagerInfoAsync(projectRoot, {
154 expoServerPort: null,
155 packagerPort: null,
156 packagerPid: null,
157 expoServerNgrokUrl: null,
158 packagerNgrokUrl: null,
159 ngrokPid: null,
160 webpackServerPort: null
161 });
162}
163async function stopAsync(projectRoot) {
164 try {
165 const result = await Promise.race([stopInternalAsync(projectRoot), new Promise(resolve => setTimeout(resolve, 2000, 'stopFailed'))]);
166 if (result === 'stopFailed') {
167 await forceQuitAsync(projectRoot);
168 }
169 } catch (error) {
170 await forceQuitAsync(projectRoot);
171 throw error;
172 }
173}
174//# sourceMappingURL=startAsync.js.map
\No newline at end of file