1*26ad19fcSEvan Bacon/**
2*26ad19fcSEvan Bacon * Copyright © 2022 650 Industries.
3*26ad19fcSEvan Bacon *
4*26ad19fcSEvan Bacon * This source code is licensed under the MIT license found in the
5*26ad19fcSEvan Bacon * LICENSE file in the root directory of this source tree.
6*26ad19fcSEvan Bacon */
7*26ad19fcSEvan Baconimport { buildUrlForBundle } from './buildUrlForBundle';
8*26ad19fcSEvan Baconimport { fetchThenEvalAsync } from './fetchThenEval';
9*26ad19fcSEvan Bacon// import LoadingView from '../LoadingView';
10*26ad19fcSEvan Bacon
11*26ad19fcSEvan Baconlet pendingRequests = 0;
12*26ad19fcSEvan Bacon
13*26ad19fcSEvan Bacon/**
14*26ad19fcSEvan Bacon * Load a bundle for a URL using fetch + eval on native and script tag injection on web.
15*26ad19fcSEvan Bacon *
16*26ad19fcSEvan Bacon * @param bundlePath Given a statement like `import('./Bacon')` `bundlePath` would be `Bacon.bundle?params=from-metro`.
17*26ad19fcSEvan Bacon */
18*26ad19fcSEvan Baconexport async function loadBundleAsync(bundlePath: string): Promise<void> {
19*26ad19fcSEvan Bacon  const requestUrl = buildUrlForBundle(bundlePath);
20*26ad19fcSEvan Bacon
21*26ad19fcSEvan Bacon  if (process.env.NODE_ENV === 'production') {
22*26ad19fcSEvan Bacon    return fetchThenEvalAsync(requestUrl);
23*26ad19fcSEvan Bacon  } else {
24*26ad19fcSEvan Bacon    const LoadingView = require('../LoadingView')
25*26ad19fcSEvan Bacon      .default as typeof import('../LoadingView').default;
26*26ad19fcSEvan Bacon
27*26ad19fcSEvan Bacon    // Send a signal to the `expo` package to show the loading indicator.
28*26ad19fcSEvan Bacon    LoadingView.showMessage('Downloading...', 'load');
29*26ad19fcSEvan Bacon
30*26ad19fcSEvan Bacon    pendingRequests++;
31*26ad19fcSEvan Bacon
32*26ad19fcSEvan Bacon    return fetchThenEvalAsync(requestUrl)
33*26ad19fcSEvan Bacon      .then(() => {
34*26ad19fcSEvan Bacon        if (process.env.NODE_ENV !== 'production') {
35*26ad19fcSEvan Bacon          const HMRClient = require('../HMRClient')
36*26ad19fcSEvan Bacon            .default as typeof import('../HMRClient').default;
37*26ad19fcSEvan Bacon          HMRClient.registerBundle(requestUrl);
38*26ad19fcSEvan Bacon        }
39*26ad19fcSEvan Bacon      })
40*26ad19fcSEvan Bacon      .finally(() => {
41*26ad19fcSEvan Bacon        if (!--pendingRequests) {
42*26ad19fcSEvan Bacon          LoadingView.hide();
43*26ad19fcSEvan Bacon        }
44*26ad19fcSEvan Bacon      });
45*26ad19fcSEvan Bacon  }
46*26ad19fcSEvan Bacon}
47