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