1import { AbortCommandError } from '../../utils/errors';
2import { Options } from '../resolveOptions';
3import { DevServerManager } from './DevServerManager';
4
5/** Launch the app on various platforms in parallel. */
6export async function openPlatformsAsync(
7  devServerManager: DevServerManager,
8  options: Pick<Options, 'ios' | 'android' | 'web'>
9) {
10  const results = await Promise.allSettled([
11    options.android ? devServerManager.getDefaultDevServer().openPlatformAsync('emulator') : null,
12    options.ios ? devServerManager.getDefaultDevServer().openPlatformAsync('simulator') : null,
13    options.web
14      ? devServerManager
15          .ensureWebDevServerRunningAsync()
16          .then(() => devServerManager.getWebDevServer()?.openPlatformAsync('desktop'))
17      : null,
18  ]);
19
20  const errors = results
21    .map((result) => (result.status === 'rejected' ? result.reason : null))
22    .filter(Boolean);
23
24  if (errors.length) {
25    // ctrl+c
26    const isEscapedError = errors.some((error: any) => error.code === 'ABORTED');
27    if (isEscapedError) {
28      throw new AbortCommandError();
29    }
30    throw errors[0];
31  }
32
33  return !!options.android || !!options.ios;
34}
35