@expo/cli 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -0
- package/build/bin/cli +125 -0
- package/build/bin/cli.map +1 -0
- package/build/src/api/endpoint.js +17 -0
- package/build/src/api/endpoint.js.map +1 -0
- package/build/src/api/getExpoGoIntermediateCertificate.js +21 -0
- package/build/src/api/getExpoGoIntermediateCertificate.js.map +1 -0
- package/build/src/api/getExpoSchema.js +69 -0
- package/build/src/api/getExpoSchema.js.map +1 -0
- package/build/src/api/getNativeModuleVersions.js +31 -0
- package/build/src/api/getNativeModuleVersions.js.map +1 -0
- package/build/src/api/getProject.js +19 -0
- package/build/src/api/getProject.js.map +1 -0
- package/build/src/api/getProjectDevelopmentCertificate.js +24 -0
- package/build/src/api/getProjectDevelopmentCertificate.js.map +1 -0
- package/build/src/api/getVersions.js +37 -0
- package/build/src/api/getVersions.js.map +1 -0
- package/build/src/api/graphql/client.js +104 -0
- package/build/src/api/graphql/client.js.map +1 -0
- package/build/src/api/graphql/generated.js +113 -0
- package/build/src/api/graphql/generated.js.map +1 -0
- package/build/src/api/graphql/queries/UserQuery.js +43 -0
- package/build/src/api/graphql/queries/UserQuery.js.map +1 -0
- package/build/src/api/rest/cache/FileSystemCache.js +79 -0
- package/build/src/api/rest/cache/FileSystemCache.js.map +1 -0
- package/build/src/api/rest/cache/response.js +31 -0
- package/build/src/api/rest/cache/response.js.map +1 -0
- package/build/src/api/rest/cache/wrapFetchWithCache.js +156 -0
- package/build/src/api/rest/cache/wrapFetchWithCache.js.map +1 -0
- package/build/src/api/rest/client.js +94 -0
- package/build/src/api/rest/client.js.map +1 -0
- package/build/src/api/rest/client.types.js +6 -0
- package/build/src/api/rest/client.types.js.map +1 -0
- package/build/src/api/rest/wrapFetchWithBaseUrl.js +20 -0
- package/build/src/api/rest/wrapFetchWithBaseUrl.js.map +1 -0
- package/build/src/api/rest/wrapFetchWithOffline.js +39 -0
- package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -0
- package/build/src/api/rest/wrapFetchWithProgress.js +59 -0
- package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -0
- package/build/src/api/settings.js +11 -0
- package/build/src/api/settings.js.map +1 -0
- package/build/src/api/signManifest.js +38 -0
- package/build/src/api/signManifest.js.map +1 -0
- package/build/src/api/updateDevelopmentSession.js +74 -0
- package/build/src/api/updateDevelopmentSession.js.map +1 -0
- package/build/src/api/user/UserSettings.js +71 -0
- package/build/src/api/user/UserSettings.js.map +1 -0
- package/build/src/api/user/actions.js +97 -0
- package/build/src/api/user/actions.js.map +1 -0
- package/build/src/api/user/otp.js +139 -0
- package/build/src/api/user/otp.js.map +1 -0
- package/build/src/api/user/user.js +114 -0
- package/build/src/api/user/user.js.map +1 -0
- package/build/src/config/configAsync.js +118 -0
- package/build/src/config/configAsync.js.map +1 -0
- package/build/src/config/index.js +85 -0
- package/build/src/config/index.js.map +1 -0
- package/build/src/install/checkPackages.js +74 -0
- package/build/src/install/checkPackages.js.map +1 -0
- package/build/src/install/index.js +76 -0
- package/build/src/install/index.js.map +1 -0
- package/build/src/install/installAsync.js +103 -0
- package/build/src/install/installAsync.js.map +1 -0
- package/build/src/install/resolveOptions.js +99 -0
- package/build/src/install/resolveOptions.js.map +1 -0
- package/build/src/install/utils/autoAddConfigPlugins.js +87 -0
- package/build/src/install/utils/autoAddConfigPlugins.js.map +1 -0
- package/build/src/log.js +74 -0
- package/build/src/log.js.map +1 -0
- package/build/src/login/index.js +76 -0
- package/build/src/login/index.js.map +1 -0
- package/build/src/logout/index.js +63 -0
- package/build/src/logout/index.js.map +1 -0
- package/build/src/prebuild/clearNativeFolder.js +137 -0
- package/build/src/prebuild/clearNativeFolder.js.map +1 -0
- package/build/src/prebuild/configureProjectAsync.js +68 -0
- package/build/src/prebuild/configureProjectAsync.js.map +1 -0
- package/build/src/prebuild/copyTemplateFiles.js +124 -0
- package/build/src/prebuild/copyTemplateFiles.js.map +1 -0
- package/build/src/prebuild/ensureConfigAsync.js +86 -0
- package/build/src/prebuild/ensureConfigAsync.js.map +1 -0
- package/build/src/prebuild/index.js +101 -0
- package/build/src/prebuild/index.js.map +1 -0
- package/build/src/prebuild/prebuildAsync.js +112 -0
- package/build/src/prebuild/prebuildAsync.js.map +1 -0
- package/build/src/prebuild/resolveOptions.js +97 -0
- package/build/src/prebuild/resolveOptions.js.map +1 -0
- package/build/src/prebuild/resolveTemplate.js +157 -0
- package/build/src/prebuild/resolveTemplate.js.map +1 -0
- package/build/src/prebuild/updateFromTemplate.js +102 -0
- package/build/src/prebuild/updateFromTemplate.js.map +1 -0
- package/build/src/prebuild/updatePackageJson.js +236 -0
- package/build/src/prebuild/updatePackageJson.js.map +1 -0
- package/build/src/prebuild/writeMetroConfig.js +89 -0
- package/build/src/prebuild/writeMetroConfig.js.map +1 -0
- package/build/src/register/index.js +63 -0
- package/build/src/register/index.js.map +1 -0
- package/build/src/register/registerAsync.js +37 -0
- package/build/src/register/registerAsync.js.map +1 -0
- package/build/src/start/doctor/Prerequisite.js +47 -0
- package/build/src/start/doctor/Prerequisite.js.map +1 -0
- package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js +68 -0
- package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js.map +1 -0
- package/build/src/start/doctor/apple/XcodePrerequisite.js +115 -0
- package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -0
- package/build/src/start/doctor/apple/XcrunPrerequisite.js +65 -0
- package/build/src/start/doctor/apple/XcrunPrerequisite.js.map +1 -0
- package/build/src/start/doctor/dependencies/bundledNativeModules.js +64 -0
- package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -0
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +131 -0
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -0
- package/build/src/start/doctor/dependencies/getMissingPackages.js +95 -0
- package/build/src/start/doctor/dependencies/getMissingPackages.js.map +1 -0
- package/build/src/start/doctor/dependencies/getVersionedPackages.js +119 -0
- package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -0
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +147 -0
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -0
- package/build/src/start/doctor/ngrok/ExternalModule.js +164 -0
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -0
- package/build/src/start/doctor/ngrok/NgrokResolver.js +17 -0
- package/build/src/start/doctor/ngrok/NgrokResolver.js.map +1 -0
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +142 -0
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -0
- package/build/src/start/doctor/typescript/updateTSConfig.js +92 -0
- package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -0
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +112 -0
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -0
- package/build/src/start/index.js +126 -0
- package/build/src/start/index.js.map +1 -0
- package/build/src/start/interface/KeyPressHandler.js +99 -0
- package/build/src/start/interface/KeyPressHandler.js.map +1 -0
- package/build/src/start/interface/commandsTable.js +175 -0
- package/build/src/start/interface/commandsTable.js.map +1 -0
- package/build/src/start/interface/interactiveActions.js +134 -0
- package/build/src/start/interface/interactiveActions.js.map +1 -0
- package/build/src/start/interface/startInterface.js +217 -0
- package/build/src/start/interface/startInterface.js.map +1 -0
- package/build/src/start/platforms/AppIdResolver.js +44 -0
- package/build/src/start/platforms/AppIdResolver.js.map +1 -0
- package/build/src/start/platforms/DeviceManager.js +43 -0
- package/build/src/start/platforms/DeviceManager.js.map +1 -0
- package/build/src/start/platforms/ExpoGoInstaller.js +108 -0
- package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -0
- package/build/src/start/platforms/PlatformManager.js +96 -0
- package/build/src/start/platforms/PlatformManager.js.map +1 -0
- package/build/src/start/platforms/android/ADBServer.js +127 -0
- package/build/src/start/platforms/android/ADBServer.js.map +1 -0
- package/build/src/start/platforms/android/AndroidAppIdResolver.js +40 -0
- package/build/src/start/platforms/android/AndroidAppIdResolver.js.map +1 -0
- package/build/src/start/platforms/android/AndroidDeviceManager.js +171 -0
- package/build/src/start/platforms/android/AndroidDeviceManager.js.map +1 -0
- package/build/src/start/platforms/android/AndroidPlatformManager.js +35 -0
- package/build/src/start/platforms/android/AndroidPlatformManager.js.map +1 -0
- package/build/src/start/platforms/android/activateWindow.js +78 -0
- package/build/src/start/platforms/android/activateWindow.js.map +1 -0
- package/build/src/start/platforms/android/adb.js +230 -0
- package/build/src/start/platforms/android/adb.js.map +1 -0
- package/build/src/start/platforms/android/adbReverse.js +84 -0
- package/build/src/start/platforms/android/adbReverse.js.map +1 -0
- package/build/src/start/platforms/android/emulator.js +118 -0
- package/build/src/start/platforms/android/emulator.js.map +1 -0
- package/build/src/start/platforms/android/getDevices.js +36 -0
- package/build/src/start/platforms/android/getDevices.js.map +1 -0
- package/build/src/start/platforms/android/promptAndroidDevice.js +60 -0
- package/build/src/start/platforms/android/promptAndroidDevice.js.map +1 -0
- package/build/src/start/platforms/ios/AppleAppIdResolver.js +46 -0
- package/build/src/start/platforms/ios/AppleAppIdResolver.js.map +1 -0
- package/build/src/start/platforms/ios/AppleDeviceManager.js +201 -0
- package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -0
- package/build/src/start/platforms/ios/ApplePlatformManager.js +31 -0
- package/build/src/start/platforms/ios/ApplePlatformManager.js.map +1 -0
- package/build/src/start/platforms/ios/assertSystemRequirements.js +16 -0
- package/build/src/start/platforms/ios/assertSystemRequirements.js.map +1 -0
- package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js +85 -0
- package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js.map +1 -0
- package/build/src/start/platforms/ios/getBestSimulator.js +101 -0
- package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -0
- package/build/src/start/platforms/ios/promptAppleDevice.js +60 -0
- package/build/src/start/platforms/ios/promptAppleDevice.js.map +1 -0
- package/build/src/start/platforms/ios/simctl.js +229 -0
- package/build/src/start/platforms/ios/simctl.js.map +1 -0
- package/build/src/start/platforms/ios/xcrun.js +67 -0
- package/build/src/start/platforms/ios/xcrun.js.map +1 -0
- package/build/src/start/project/devices.js +77 -0
- package/build/src/start/project/devices.js.map +1 -0
- package/build/src/start/project/dotExpo.js +74 -0
- package/build/src/start/project/dotExpo.js.map +1 -0
- package/build/src/start/project/settings.js +13 -0
- package/build/src/start/project/settings.js.map +1 -0
- package/build/src/start/resolveOptions.js +156 -0
- package/build/src/start/resolveOptions.js.map +1 -0
- package/build/src/start/server/AsyncNgrok.js +173 -0
- package/build/src/start/server/AsyncNgrok.js.map +1 -0
- package/build/src/start/server/BundlerDevServer.js +252 -0
- package/build/src/start/server/BundlerDevServer.js.map +1 -0
- package/build/src/start/server/DevServerManager.js +142 -0
- package/build/src/start/server/DevServerManager.js.map +1 -0
- package/build/src/start/server/DevelopmentSession.js +104 -0
- package/build/src/start/server/DevelopmentSession.js.map +1 -0
- package/build/src/start/server/UrlCreator.js +158 -0
- package/build/src/start/server/UrlCreator.js.map +1 -0
- package/build/src/start/server/metro/MetroBundlerDevServer.js +100 -0
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -0
- package/build/src/start/server/metro/MetroTerminalReporter.js +178 -0
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -0
- package/build/src/start/server/metro/TerminalReporter.js +87 -0
- package/build/src/start/server/metro/TerminalReporter.js.map +1 -0
- package/build/src/start/server/metro/TerminalReporter.types.js +6 -0
- package/build/src/start/server/metro/TerminalReporter.types.js.map +1 -0
- package/build/src/start/server/metro/instantiateMetro.js +53 -0
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -0
- package/build/src/start/server/metro/resolveFromProject.js +38 -0
- package/build/src/start/server/metro/resolveFromProject.js.map +1 -0
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +145 -0
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +185 -0
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ExpoMiddleware.js +78 -0
- package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js +70 -0
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ManifestMiddleware.js +177 -0
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +69 -0
- package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/createDevServerMiddleware.js +24 -0
- package/build/src/start/server/middleware/createDevServerMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/resolveAssets.js +107 -0
- package/build/src/start/server/middleware/resolveAssets.js.map +1 -0
- package/build/src/start/server/middleware/resolveEntryPoint.js +37 -0
- package/build/src/start/server/middleware/resolveEntryPoint.js.map +1 -0
- package/build/src/start/server/middleware/resolvePlatform.js +32 -0
- package/build/src/start/server/middleware/resolvePlatform.js.map +1 -0
- package/build/src/start/server/middleware/server.types.js +6 -0
- package/build/src/start/server/middleware/server.types.js.map +1 -0
- package/build/src/start/server/openPlatforms.js +30 -0
- package/build/src/start/server/openPlatforms.js.map +1 -0
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js +303 -0
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -0
- package/build/src/start/server/webpack/formatWebpackMessages.js +94 -0
- package/build/src/start/server/webpack/formatWebpackMessages.js.map +1 -0
- package/build/src/start/server/webpack/resolveFromProject.js +43 -0
- package/build/src/start/server/webpack/resolveFromProject.js.map +1 -0
- package/build/src/start/server/webpack/tls.js +72 -0
- package/build/src/start/server/webpack/tls.js.map +1 -0
- package/build/src/start/startAsync.js +150 -0
- package/build/src/start/startAsync.js.map +1 -0
- package/build/src/utils/FileNotifier.js +71 -0
- package/build/src/utils/FileNotifier.js.map +1 -0
- package/build/src/utils/analytics/getDevClientProperties.js +41 -0
- package/build/src/utils/analytics/getDevClientProperties.js.map +1 -0
- package/build/src/utils/analytics/rudderstackClient.js +106 -0
- package/build/src/utils/analytics/rudderstackClient.js.map +1 -0
- package/build/src/utils/ansi.js +17 -0
- package/build/src/utils/ansi.js.map +1 -0
- package/build/src/utils/args.js +63 -0
- package/build/src/utils/args.js.map +1 -0
- package/build/src/utils/array.js +27 -0
- package/build/src/utils/array.js.map +1 -0
- package/build/src/utils/cocoapods.js +143 -0
- package/build/src/utils/cocoapods.js.map +1 -0
- package/build/src/utils/codesigning.js +283 -0
- package/build/src/utils/codesigning.js.map +1 -0
- package/build/src/utils/createFileTransform.js +89 -0
- package/build/src/utils/createFileTransform.js.map +1 -0
- package/build/src/utils/delay.js +39 -0
- package/build/src/utils/delay.js.map +1 -0
- package/build/src/utils/dir.js +34 -0
- package/build/src/utils/dir.js.map +1 -0
- package/build/src/utils/downloadAppAsync.js +71 -0
- package/build/src/utils/downloadAppAsync.js.map +1 -0
- package/build/src/utils/downloadExpoGoAsync.js +93 -0
- package/build/src/utils/downloadExpoGoAsync.js.map +1 -0
- package/build/src/utils/editor.js +60 -0
- package/build/src/utils/editor.js.map +1 -0
- package/build/src/utils/env.js +59 -0
- package/build/src/utils/env.js.map +1 -0
- package/build/src/utils/errors.js +69 -0
- package/build/src/utils/errors.js.map +1 -0
- package/build/src/utils/exit.js +90 -0
- package/build/src/utils/exit.js.map +1 -0
- package/build/src/utils/findUp.js +33 -0
- package/build/src/utils/findUp.js.map +1 -0
- package/build/src/utils/fn.js +32 -0
- package/build/src/utils/fn.js.map +1 -0
- package/build/src/utils/getOrPromptApplicationId.js +183 -0
- package/build/src/utils/getOrPromptApplicationId.js.map +1 -0
- package/build/src/utils/getRunningProcess.js +92 -0
- package/build/src/utils/getRunningProcess.js.map +1 -0
- package/build/src/utils/git.js +88 -0
- package/build/src/utils/git.js.map +1 -0
- package/build/src/utils/glob.js +65 -0
- package/build/src/utils/glob.js.map +1 -0
- package/build/src/utils/ip.js +16 -0
- package/build/src/utils/ip.js.map +1 -0
- package/build/src/utils/isModuleSymlinked.js +37 -0
- package/build/src/utils/isModuleSymlinked.js.map +1 -0
- package/build/src/utils/link.js +31 -0
- package/build/src/utils/link.js.map +1 -0
- package/build/src/utils/mergeGitIgnorePaths.js +112 -0
- package/build/src/utils/mergeGitIgnorePaths.js.map +1 -0
- package/build/src/utils/modifyConfigAsync.js +68 -0
- package/build/src/utils/modifyConfigAsync.js.map +1 -0
- package/build/src/utils/modifyConfigPlugins.js +51 -0
- package/build/src/utils/modifyConfigPlugins.js.map +1 -0
- package/build/src/utils/nodeModules.js +118 -0
- package/build/src/utils/nodeModules.js.map +1 -0
- package/build/src/utils/npm.js +144 -0
- package/build/src/utils/npm.js.map +1 -0
- package/build/src/utils/obj.js +45 -0
- package/build/src/utils/obj.js.map +1 -0
- package/build/src/utils/ora.js +102 -0
- package/build/src/utils/ora.js.map +1 -0
- package/build/src/utils/port.js +130 -0
- package/build/src/utils/port.js.map +1 -0
- package/build/src/utils/profile.js +63 -0
- package/build/src/utils/profile.js.map +1 -0
- package/build/src/utils/progress.js +15 -0
- package/build/src/utils/progress.js.map +1 -0
- package/build/src/utils/prompts.js +127 -0
- package/build/src/utils/prompts.js.map +1 -0
- package/build/src/utils/scheme.js +106 -0
- package/build/src/utils/scheme.js.map +1 -0
- package/build/src/utils/tar.js +59 -0
- package/build/src/utils/tar.js.map +1 -0
- package/build/src/utils/url.js +67 -0
- package/build/src/utils/url.js.map +1 -0
- package/build/src/utils/validateApplicationId.js +90 -0
- package/build/src/utils/validateApplicationId.js.map +1 -0
- package/build/src/whoami/index.js +63 -0
- package/build/src/whoami/index.js.map +1 -0
- package/build/src/whoami/whoamiAsync.js +44 -0
- package/build/src/whoami/whoamiAsync.js.map +1 -0
- package/package.json +128 -4
- package/static/loading-page/index.html +270 -0
- package/index.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/start/server/AsyncNgrok.ts"],"sourcesContent":["import crypto from 'crypto';\nimport * as path from 'path';\nimport slugify from 'slugify';\n\nimport UserSettings from '../../api/user/UserSettings';\nimport { getActorDisplayName, getUserAsync } from '../../api/user/user';\nimport * as Log from '../../log';\nimport { delayAsync, resolveWithTimeout } from '../../utils/delay';\nimport { CommandError } from '../../utils/errors';\nimport { NgrokInstance, NgrokResolver } from '../doctor/ngrok/NgrokResolver';\nimport { startAdbReverseAsync } from '../platforms/android/adbReverse';\nimport { ProjectSettings } from '../project/settings';\n\nconst NGROK_CONFIG = {\n authToken: '5W1bR67GNbWcXqmxZzBG1_56GezNeaX6sSRvn8npeQ8',\n domain: 'exp.direct',\n};\n\nconst TUNNEL_TIMEOUT = 10 * 1000;\n\nexport class AsyncNgrok {\n /** Resolves the best instance of ngrok, exposed for testing. */\n resolver: NgrokResolver;\n\n /** Info about the currently running instance of ngrok. */\n private serverUrl: string | null = null;\n\n constructor(private projectRoot: string, private port: number) {\n this.resolver = new NgrokResolver(projectRoot);\n }\n\n public getActiveUrl(): string | null {\n return this.serverUrl;\n }\n\n /** Exposed for testing. */\n async _getProjectHostnameAsync() {\n const user = await getUserAsync();\n if (user?.__typename === 'Robot') {\n throw new CommandError('NGROK_ROBOT', 'Cannot use ngrok with a robot user.');\n }\n const username = getActorDisplayName(user);\n\n return [\n // NOTE: https://github.com/expo/expo/pull/16556#discussion_r822944286\n await this.getProjectRandomnessAsync(),\n slugify(username),\n // Use the port to distinguish between multiple tunnels (webpack, metro).\n this.port,\n NGROK_CONFIG.domain,\n ].join('.');\n }\n\n /** Start ngrok on the given port for the project. */\n async startAsync({ timeout }: { timeout?: number } = {}): Promise<void> {\n // Ensure the instance is loaded first, this can linger so we should run it before the timeout.\n await this.resolver.resolveAsync({\n // For now, prefer global install since the package has native code (harder to install) and doesn't change very often.\n prefersGlobalInstall: true,\n });\n\n // Ensure ADB reverse is running.\n if (!(await startAdbReverseAsync([this.port]))) {\n // TODO: Better error message.\n throw new CommandError(\n 'NGROK_ADB',\n `Cannot start tunnel URL because \\`adb reverse\\` failed for the connected Android device(s).`\n );\n }\n\n this.serverUrl = await this._connectToNgrokAsync({ timeout });\n\n Log.debug('[ngrok] Tunnel URL:', this.serverUrl);\n Log.log('Tunnel ready.');\n }\n\n /** Stop the ngrok process if it's running. */\n public async stopAsync(): Promise<void> {\n Log.debug('[ngrok] Stopping Tunnel');\n\n await this.resolver.get()?.kill?.();\n this.serverUrl = null;\n }\n\n /** Exposed for testing. */\n async _connectToNgrokAsync(\n options: { timeout?: number } = {},\n attempts: number = 0\n ): Promise<string> {\n // Attempt to stop any hanging processes, this increases the chances of a successful connection.\n await this.stopAsync();\n\n // Get the instance quietly or assert otherwise.\n const instance = await this.resolver.resolveAsync({\n shouldPrompt: false,\n autoInstall: false,\n });\n\n // TODO(Bacon): Consider dropping the timeout functionality:\n // https://github.com/expo/expo/pull/16556#discussion_r822307373\n const results = await resolveWithTimeout(\n () => this.connectToNgrokInternalAsync(instance, attempts),\n {\n timeout: options.timeout ?? TUNNEL_TIMEOUT,\n errorMessage: 'ngrok tunnel took too long to connect.',\n }\n );\n if (typeof results === 'string') {\n return results;\n }\n\n // Wait 100ms and then try again\n await delayAsync(100);\n\n return this._connectToNgrokAsync(options, attempts + 1);\n }\n\n private async connectToNgrokInternalAsync(\n instance: NgrokInstance,\n attempts: number = 0\n ): Promise<string | false> {\n try {\n // Global config path.\n const configPath = path.join(UserSettings.getDirectory(), 'ngrok.yml');\n Log.debug('[ngrok] Global config path:', configPath);\n const hostname = await this._getProjectHostnameAsync();\n Log.debug('[ngrok] Hostname:', hostname);\n\n const url = await instance.connect({\n authtoken: NGROK_CONFIG.authToken,\n proto: 'http',\n hostname,\n configPath,\n onStatusChange(status) {\n if (status === 'closed') {\n Log.error(\n 'We noticed your tunnel is having issues. ' +\n 'This may be due to intermittent problems with ngrok. ' +\n 'If you have trouble connecting to your app, try to restart the project, ' +\n 'or switch the host to `lan`.'\n );\n } else if (status === 'connected') {\n Log.log('Tunnel connected.');\n }\n },\n port: this.port,\n });\n return url;\n } catch (error: any) {\n // Attempt to connect 3 times\n if (attempts >= 2) {\n throw new CommandError('NGROK_CONNECT', error.toString());\n }\n\n // Attempt to fix the issue\n if (error?.error_code === 103) {\n // Change randomness to avoid conflict if killing ngrok doesn't help\n await this._resetProjectRandomnessAsync();\n }\n return false;\n }\n }\n\n private async getProjectRandomnessAsync() {\n const { urlRandomness: randomness } = await ProjectSettings.readAsync(this.projectRoot);\n if (randomness) {\n return randomness;\n }\n return await this._resetProjectRandomnessAsync();\n }\n\n async _resetProjectRandomnessAsync() {\n const randomness = crypto.randomBytes(5).toString('base64url');\n await ProjectSettings.setAsync(this.projectRoot, { urlRandomness: randomness });\n Log.debug('[ngrok] Resetting project randomness:', randomness);\n return randomness;\n }\n}\n"],"names":["path","Log","NGROK_CONFIG","authToken","domain","TUNNEL_TIMEOUT","AsyncNgrok","constructor","projectRoot","port","serverUrl","resolver","NgrokResolver","getActiveUrl","_getProjectHostnameAsync","user","getUserAsync","__typename","CommandError","username","getActorDisplayName","getProjectRandomnessAsync","slugify","join","startAsync","timeout","resolveAsync","prefersGlobalInstall","startAdbReverseAsync","_connectToNgrokAsync","debug","log","stopAsync","get","kill","options","attempts","instance","shouldPrompt","autoInstall","results","resolveWithTimeout","connectToNgrokInternalAsync","errorMessage","delayAsync","configPath","UserSettings","getDirectory","hostname","url","connect","authtoken","proto","onStatusChange","status","error","toString","error_code","_resetProjectRandomnessAsync","urlRandomness","randomness","ProjectSettings","readAsync","crypto","randomBytes","setAsync"],"mappings":"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"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
var _assert = _interopRequireDefault(require("assert"));
|
|
6
|
+
var _betterOpn = _interopRequireDefault(require("better-opn"));
|
|
7
|
+
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
8
|
+
var _settings = require("../../api/settings");
|
|
9
|
+
var Log = _interopRequireWildcard(require("../../log"));
|
|
10
|
+
var _fileNotifier = require("../../utils/FileNotifier");
|
|
11
|
+
var _delay = require("../../utils/delay");
|
|
12
|
+
var _env = require("../../utils/env");
|
|
13
|
+
var _errors = require("../../utils/errors");
|
|
14
|
+
var _asyncNgrok = require("./AsyncNgrok");
|
|
15
|
+
var _developmentSession = require("./DevelopmentSession");
|
|
16
|
+
function _interopRequireDefault(obj) {
|
|
17
|
+
return obj && obj.__esModule ? obj : {
|
|
18
|
+
default: obj
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function _interopRequireWildcard(obj) {
|
|
22
|
+
if (obj && obj.__esModule) {
|
|
23
|
+
return obj;
|
|
24
|
+
} else {
|
|
25
|
+
var newObj = {};
|
|
26
|
+
if (obj != null) {
|
|
27
|
+
for(var key in obj){
|
|
28
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
29
|
+
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
|
|
30
|
+
if (desc.get || desc.set) {
|
|
31
|
+
Object.defineProperty(newObj, key, desc);
|
|
32
|
+
} else {
|
|
33
|
+
newObj[key] = obj[key];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
newObj.default = obj;
|
|
39
|
+
return newObj;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const PLATFORM_MANAGERS = {
|
|
43
|
+
simulator: ()=>require("../platforms/ios/ApplePlatformManager").ApplePlatformManager
|
|
44
|
+
,
|
|
45
|
+
emulator: ()=>require("../platforms/android/AndroidPlatformManager").AndroidPlatformManager
|
|
46
|
+
};
|
|
47
|
+
const MIDDLEWARES = {
|
|
48
|
+
classic: ()=>require("./middleware/ClassicManifestMiddleware").ClassicManifestMiddleware
|
|
49
|
+
,
|
|
50
|
+
"expo-updates": ()=>require("./middleware/ExpoGoManifestHandlerMiddleware").ExpoGoManifestHandlerMiddleware
|
|
51
|
+
};
|
|
52
|
+
class BundlerDevServer {
|
|
53
|
+
constructor(projectRoot, isDevClient){
|
|
54
|
+
this.projectRoot = projectRoot;
|
|
55
|
+
this.isDevClient = isDevClient;
|
|
56
|
+
this.ngrok = null;
|
|
57
|
+
this.devSession = null;
|
|
58
|
+
this.instance = null;
|
|
59
|
+
this.platformManagers = {};
|
|
60
|
+
this.urlCreator = null;
|
|
61
|
+
}
|
|
62
|
+
setInstance(instance) {
|
|
63
|
+
this.instance = instance;
|
|
64
|
+
}
|
|
65
|
+
/** Get the manifest middleware function. */ async getManifestMiddlewareAsync(options = {}) {
|
|
66
|
+
const manifestType = options.forceManifestType || "classic";
|
|
67
|
+
(0, _assert).default(manifestType in MIDDLEWARES, `Manifest middleware for type '${manifestType}' not found`);
|
|
68
|
+
const Middleware = MIDDLEWARES[manifestType]();
|
|
69
|
+
const urlCreator = this.getUrlCreator();
|
|
70
|
+
const middleware = new Middleware(this.projectRoot, {
|
|
71
|
+
constructUrl: urlCreator.constructUrl.bind(urlCreator),
|
|
72
|
+
mode: options.mode,
|
|
73
|
+
minify: options.minify,
|
|
74
|
+
isNativeWebpack: this.name === "webpack" && this.isTargetingNative(),
|
|
75
|
+
privateKeyPath: options.privateKeyPath
|
|
76
|
+
});
|
|
77
|
+
return middleware.getHandler();
|
|
78
|
+
}
|
|
79
|
+
async postStartAsync(options) {
|
|
80
|
+
if (options.location.hostType === "tunnel" && !_settings.APISettings.isOffline) {
|
|
81
|
+
await this._startTunnelAsync();
|
|
82
|
+
}
|
|
83
|
+
await this.startDevSessionAsync();
|
|
84
|
+
this.watchConfig();
|
|
85
|
+
}
|
|
86
|
+
watchConfig() {
|
|
87
|
+
const notifier = new _fileNotifier.FileNotifier(this.projectRoot, this.getConfigModuleIds());
|
|
88
|
+
notifier.startObserving();
|
|
89
|
+
}
|
|
90
|
+
/** Create ngrok instance and start the tunnel server. Exposed for testing. */ async _startTunnelAsync() {
|
|
91
|
+
var ref;
|
|
92
|
+
const port = (ref = this.getInstance()) == null ? void 0 : ref.location.port;
|
|
93
|
+
if (!port) return null;
|
|
94
|
+
Log.debug("[ngrok] connect to port: " + port);
|
|
95
|
+
this.ngrok = new _asyncNgrok.AsyncNgrok(this.projectRoot, port);
|
|
96
|
+
await this.ngrok.startAsync();
|
|
97
|
+
return this.ngrok;
|
|
98
|
+
}
|
|
99
|
+
async startDevSessionAsync() {
|
|
100
|
+
// This is used to make Expo Go open the project in either Expo Go, or the web browser.
|
|
101
|
+
// Must come after ngrok (`startTunnelAsync`) setup.
|
|
102
|
+
if (this.devSession) {
|
|
103
|
+
this.devSession.stopNotifying();
|
|
104
|
+
}
|
|
105
|
+
this.devSession = new _developmentSession.DevelopmentSession(this.projectRoot, // This URL will be used on external devices so the computer IP won't be relevant.
|
|
106
|
+
this.isTargetingNative() ? this.getNativeRuntimeUrl() : this.getDevServerUrl({
|
|
107
|
+
hostType: "localhost"
|
|
108
|
+
}));
|
|
109
|
+
await this.devSession.startAsync({
|
|
110
|
+
runtime: this.isTargetingNative() ? "native" : "web"
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
isTargetingNative() {
|
|
114
|
+
// Temporary hack while we implement multi-bundler dev server proxy.
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
isTargetingWeb() {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Sends a message over web sockets to any connected device,
|
|
122
|
+
* does nothing when the dev server is not running.
|
|
123
|
+
*
|
|
124
|
+
* @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.
|
|
125
|
+
* @param params
|
|
126
|
+
*/ broadcastMessage(method, params) {
|
|
127
|
+
var ref;
|
|
128
|
+
(ref = this.getInstance()) == null ? void 0 : ref.messageSocket.broadcast(method, params);
|
|
129
|
+
}
|
|
130
|
+
/** Get the running dev server instance. */ getInstance() {
|
|
131
|
+
return this.instance;
|
|
132
|
+
}
|
|
133
|
+
/** Stop the running dev server instance. */ async stopAsync() {
|
|
134
|
+
var ref2, ref1;
|
|
135
|
+
// Stop the dev session timer and tell Expo API to remove dev session.
|
|
136
|
+
await ((ref2 = this.devSession) == null ? void 0 : ref2.closeAsync());
|
|
137
|
+
// Stop ngrok if running.
|
|
138
|
+
await ((ref1 = this.ngrok) == null ? void 0 : ref1.stopAsync().catch((e)=>{
|
|
139
|
+
Log.error(`Error stopping ngrok:`);
|
|
140
|
+
Log.exception(e);
|
|
141
|
+
}));
|
|
142
|
+
return (0, _delay).resolveWithTimeout(()=>{
|
|
143
|
+
return new Promise((resolve, reject)=>{
|
|
144
|
+
var ref;
|
|
145
|
+
// Close the server.
|
|
146
|
+
Log.debug(`Stopping dev server (bundler: ${this.name})`);
|
|
147
|
+
if ((ref = this.instance) == null ? void 0 : ref.server) {
|
|
148
|
+
this.instance.server.close((error)=>{
|
|
149
|
+
Log.debug(`Stopped dev server (bundler: ${this.name})`);
|
|
150
|
+
this.instance = null;
|
|
151
|
+
if (error) {
|
|
152
|
+
reject(error);
|
|
153
|
+
} else {
|
|
154
|
+
resolve();
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
} else {
|
|
158
|
+
Log.debug(`Stopped dev server (bundler: ${this.name})`);
|
|
159
|
+
this.instance = null;
|
|
160
|
+
resolve();
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}, {
|
|
164
|
+
// NOTE(Bacon): Metro dev server doesn't seem to be closing in time.
|
|
165
|
+
timeout: 1000,
|
|
166
|
+
errorMessage: `Timeout waiting for '${this.name}' dev server to close`
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
getUrlCreator() {
|
|
170
|
+
(0, _assert).default(this.urlCreator, "Dev server is not running.");
|
|
171
|
+
return this.urlCreator;
|
|
172
|
+
}
|
|
173
|
+
getNativeRuntimeUrl(opts = {}) {
|
|
174
|
+
var ref;
|
|
175
|
+
return this.isDevClient ? (ref = this.getUrlCreator().constructDevClientUrl(opts)) != null ? ref : this.getDevServerUrl() : this.getUrlCreator().constructUrl({
|
|
176
|
+
...opts,
|
|
177
|
+
scheme: "exp"
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/** Get the URL for the running instance of the dev server. */ getDevServerUrl(options = {}) {
|
|
181
|
+
const instance = this.getInstance();
|
|
182
|
+
if (!(instance == null ? void 0 : instance.location)) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
const { location } = instance;
|
|
186
|
+
if (options.hostType === "localhost") {
|
|
187
|
+
return `${location.protocol}://localhost:${location.port}`;
|
|
188
|
+
}
|
|
189
|
+
var _url;
|
|
190
|
+
return (_url = location.url) != null ? _url : null;
|
|
191
|
+
}
|
|
192
|
+
/** Get the tunnel URL from ngrok. */ getTunnelUrl() {
|
|
193
|
+
var ref;
|
|
194
|
+
var ref3;
|
|
195
|
+
return (ref3 = (ref = this.ngrok) == null ? void 0 : ref.getActiveUrl()) != null ? ref3 : null;
|
|
196
|
+
}
|
|
197
|
+
/** Open the dev server in a runtime. */ async openPlatformAsync(launchTarget, resolver = {}) {
|
|
198
|
+
if (launchTarget === "desktop") {
|
|
199
|
+
const url = this.getDevServerUrl({
|
|
200
|
+
hostType: "localhost"
|
|
201
|
+
});
|
|
202
|
+
await (0, _betterOpn).default(url);
|
|
203
|
+
return {
|
|
204
|
+
url
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
const runtime = this.isTargetingNative() ? this.isDevClient ? "custom" : "expo" : "web";
|
|
208
|
+
const manager = await this.getPlatformManagerAsync(launchTarget);
|
|
209
|
+
return manager.openAsync({
|
|
210
|
+
runtime
|
|
211
|
+
}, resolver);
|
|
212
|
+
}
|
|
213
|
+
/** Should use the interstitial page for selecting which runtime to use. */ shouldUseInterstitialPage() {
|
|
214
|
+
return _env.env.EXPO_ENABLE_INTERSTITIAL_PAGE && // Checks if dev client is installed.
|
|
215
|
+
!!_resolveFrom.default.silent(this.projectRoot, "expo-dev-launcher");
|
|
216
|
+
}
|
|
217
|
+
/** Get the URL for opening in Expo Go. */ getExpoGoUrl(platform) {
|
|
218
|
+
var ref;
|
|
219
|
+
if (this.shouldUseInterstitialPage()) {
|
|
220
|
+
var ref4, ref5;
|
|
221
|
+
const loadingUrl = platform === "emulator" ? (ref4 = this.urlCreator) == null ? void 0 : ref4.constructLoadingUrl({}, "android") : (ref5 = this.urlCreator) == null ? void 0 : ref5.constructLoadingUrl({
|
|
222
|
+
hostType: "localhost"
|
|
223
|
+
}, "ios");
|
|
224
|
+
return loadingUrl != null ? loadingUrl : null;
|
|
225
|
+
}
|
|
226
|
+
var ref6;
|
|
227
|
+
return (ref6 = (ref = this.urlCreator) == null ? void 0 : ref.constructUrl({
|
|
228
|
+
scheme: "exp"
|
|
229
|
+
})) != null ? ref6 : null;
|
|
230
|
+
}
|
|
231
|
+
async getPlatformManagerAsync(platform) {
|
|
232
|
+
if (!this.platformManagers[platform]) {
|
|
233
|
+
var ref;
|
|
234
|
+
const Manager = PLATFORM_MANAGERS[platform]();
|
|
235
|
+
const port = (ref = this.getInstance()) == null ? void 0 : ref.location.port;
|
|
236
|
+
if (!port || !this.urlCreator) {
|
|
237
|
+
throw new _errors.CommandError("DEV_SERVER", "Cannot interact with native platforms until dev server has started");
|
|
238
|
+
}
|
|
239
|
+
this.platformManagers[platform] = new Manager(this.projectRoot, port, {
|
|
240
|
+
getCustomRuntimeUrl: this.urlCreator.constructDevClientUrl.bind(this.urlCreator),
|
|
241
|
+
getExpoGoUrl: this.getExpoGoUrl.bind(this, platform),
|
|
242
|
+
getDevServerUrl: this.getDevServerUrl.bind(this, {
|
|
243
|
+
hostType: "localhost"
|
|
244
|
+
})
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return this.platformManagers[platform];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.BundlerDevServer = BundlerDevServer;
|
|
251
|
+
|
|
252
|
+
//# sourceMappingURL=BundlerDevServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/start/server/BundlerDevServer.ts"],"sourcesContent":["import { MessageSocket } from '@expo/dev-server';\nimport assert from 'assert';\nimport openBrowserAsync from 'better-opn';\nimport resolveFrom from 'resolve-from';\n\nimport { APISettings } from '../../api/settings';\nimport * as Log from '../../log';\nimport { FileNotifier } from '../../utils/FileNotifier';\nimport { resolveWithTimeout } from '../../utils/delay';\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport { BaseResolveDeviceProps, PlatformManager } from '../platforms/PlatformManager';\nimport { AsyncNgrok } from './AsyncNgrok';\nimport { DevelopmentSession } from './DevelopmentSession';\nimport { CreateURLOptions, UrlCreator } from './UrlCreator';\n\nexport type ServerLike = {\n close(callback?: (err?: Error) => void): void;\n};\n\nexport type DevServerInstance = {\n /** Bundler dev server instance. */\n server: ServerLike;\n /** Dev server URL location properties. */\n location: {\n url: string;\n port: number;\n protocol: 'http' | 'https';\n host?: string;\n };\n /** Additional middleware that's attached to the `server`. */\n middleware: any;\n /** Message socket for communicating with the runtime. */\n messageSocket: MessageSocket;\n};\n\nexport interface BundlerStartOptions {\n /** Should the dev server use `https` protocol. */\n https?: boolean;\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Is dev client enabled. */\n devClient?: boolean;\n /** Should run dev servers with clean caches. */\n resetDevServer?: boolean;\n /** Which manifest type to serve. */\n forceManifestType?: 'expo-updates' | 'classic';\n /** Code signing private key path (defaults to same directory as certificate) */\n privateKeyPath?: string;\n\n /** Max amount of workers (threads) to use with Metro bundler, defaults to undefined for max workers. */\n maxWorkers?: number;\n /** Port to start the dev server on. */\n port?: number;\n\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n\n // Webpack options\n /** Should modify and create PWA icons. */\n isImageEditingEnabled?: boolean;\n\n location: CreateURLOptions;\n}\n\nconst PLATFORM_MANAGERS = {\n simulator: () =>\n require('../platforms/ios/ApplePlatformManager')\n .ApplePlatformManager as typeof import('../platforms/ios/ApplePlatformManager').ApplePlatformManager,\n emulator: () =>\n require('../platforms/android/AndroidPlatformManager')\n .AndroidPlatformManager as typeof import('../platforms/android/AndroidPlatformManager').AndroidPlatformManager,\n};\n\nconst MIDDLEWARES = {\n classic: () =>\n require('./middleware/ClassicManifestMiddleware')\n .ClassicManifestMiddleware as typeof import('./middleware/ClassicManifestMiddleware').ClassicManifestMiddleware,\n 'expo-updates': () =>\n require('./middleware/ExpoGoManifestHandlerMiddleware')\n .ExpoGoManifestHandlerMiddleware as typeof import('./middleware/ExpoGoManifestHandlerMiddleware').ExpoGoManifestHandlerMiddleware,\n};\n\nexport abstract class BundlerDevServer {\n /** Name of the bundler. */\n abstract get name(): string;\n\n /** Ngrok instance for managing tunnel connections. */\n protected ngrok: AsyncNgrok | null = null;\n /** Interfaces with the Expo 'Development Session' API. */\n protected devSession: DevelopmentSession | null = null;\n /** Http server and related info. */\n protected instance: DevServerInstance | null = null;\n /** Native platform interfaces for opening projects. */\n private platformManagers: Record<string, PlatformManager<any>> = {};\n /** Manages the creation of dev server URLs. */\n protected urlCreator?: UrlCreator | null = null;\n\n constructor(\n /** Project root folder. */\n public projectRoot: string,\n // TODO: Replace with custom scheme maybe...\n public isDevClient?: boolean\n ) {}\n\n protected setInstance(instance: DevServerInstance) {\n this.instance = instance;\n }\n\n /** Get the manifest middleware function. */\n protected async getManifestMiddlewareAsync(\n options: Pick<\n BundlerStartOptions,\n 'minify' | 'mode' | 'forceManifestType' | 'privateKeyPath'\n > = {}\n ) {\n const manifestType = options.forceManifestType || 'classic';\n assert(manifestType in MIDDLEWARES, `Manifest middleware for type '${manifestType}' not found`);\n const Middleware = MIDDLEWARES[manifestType]();\n\n const urlCreator = this.getUrlCreator();\n const middleware = new Middleware(this.projectRoot, {\n constructUrl: urlCreator.constructUrl.bind(urlCreator),\n mode: options.mode,\n minify: options.minify,\n isNativeWebpack: this.name === 'webpack' && this.isTargetingNative(),\n privateKeyPath: options.privateKeyPath,\n });\n return middleware.getHandler();\n }\n\n /** Start the dev server using settings defined in the start command. */\n public abstract startAsync(options: BundlerStartOptions): Promise<DevServerInstance>;\n\n protected async postStartAsync(options: BundlerStartOptions) {\n if (options.location.hostType === 'tunnel' && !APISettings.isOffline) {\n await this._startTunnelAsync();\n }\n await this.startDevSessionAsync();\n\n this.watchConfig();\n }\n\n protected abstract getConfigModuleIds(): string[];\n\n protected watchConfig() {\n const notifier = new FileNotifier(this.projectRoot, this.getConfigModuleIds());\n notifier.startObserving();\n }\n\n /** Create ngrok instance and start the tunnel server. Exposed for testing. */\n public async _startTunnelAsync(): Promise<AsyncNgrok | null> {\n const port = this.getInstance()?.location.port;\n if (!port) return null;\n Log.debug('[ngrok] connect to port: ' + port);\n this.ngrok = new AsyncNgrok(this.projectRoot, port);\n await this.ngrok.startAsync();\n return this.ngrok;\n }\n\n protected async startDevSessionAsync() {\n // This is used to make Expo Go open the project in either Expo Go, or the web browser.\n // Must come after ngrok (`startTunnelAsync`) setup.\n\n if (this.devSession) {\n this.devSession.stopNotifying();\n }\n\n this.devSession = new DevelopmentSession(\n this.projectRoot,\n // This URL will be used on external devices so the computer IP won't be relevant.\n this.isTargetingNative()\n ? this.getNativeRuntimeUrl()\n : this.getDevServerUrl({ hostType: 'localhost' })\n );\n\n await this.devSession.startAsync({\n runtime: this.isTargetingNative() ? 'native' : 'web',\n });\n }\n\n public isTargetingNative() {\n // Temporary hack while we implement multi-bundler dev server proxy.\n return true;\n }\n\n public isTargetingWeb() {\n return false;\n }\n\n /**\n * Sends a message over web sockets to any connected device,\n * does nothing when the dev server is not running.\n *\n * @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.\n * @param params\n */\n public broadcastMessage(\n method: 'reload' | 'devMenu' | 'sendDevCommand',\n params?: Record<string, any>\n ) {\n this.getInstance()?.messageSocket.broadcast(method, params);\n }\n\n /** Get the running dev server instance. */\n public getInstance() {\n return this.instance;\n }\n\n /** Stop the running dev server instance. */\n async stopAsync() {\n // Stop the dev session timer and tell Expo API to remove dev session.\n await this.devSession?.closeAsync();\n\n // Stop ngrok if running.\n await this.ngrok?.stopAsync().catch((e) => {\n Log.error(`Error stopping ngrok:`);\n Log.exception(e);\n });\n\n return resolveWithTimeout(\n () =>\n new Promise<void>((resolve, reject) => {\n // Close the server.\n Log.debug(`Stopping dev server (bundler: ${this.name})`);\n\n if (this.instance?.server) {\n this.instance.server.close((error) => {\n Log.debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n } else {\n Log.debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n resolve();\n }\n }),\n {\n // NOTE(Bacon): Metro dev server doesn't seem to be closing in time.\n timeout: 1000,\n errorMessage: `Timeout waiting for '${this.name}' dev server to close`,\n }\n );\n }\n\n private getUrlCreator() {\n assert(this.urlCreator, 'Dev server is not running.');\n return this.urlCreator;\n }\n\n public getNativeRuntimeUrl(opts: Partial<CreateURLOptions> = {}) {\n return this.isDevClient\n ? this.getUrlCreator().constructDevClientUrl(opts) ?? this.getDevServerUrl()\n : this.getUrlCreator().constructUrl({ ...opts, scheme: 'exp' });\n }\n\n /** Get the URL for the running instance of the dev server. */\n public getDevServerUrl(options: { hostType?: 'localhost' } = {}): string | null {\n const instance = this.getInstance();\n if (!instance?.location) {\n return null;\n }\n const { location } = instance;\n if (options.hostType === 'localhost') {\n return `${location.protocol}://localhost:${location.port}`;\n }\n return location.url ?? null;\n }\n\n /** Get the tunnel URL from ngrok. */\n public getTunnelUrl(): string | null {\n return this.ngrok?.getActiveUrl() ?? null;\n }\n\n /** Open the dev server in a runtime. */\n public async openPlatformAsync(\n launchTarget: keyof typeof PLATFORM_MANAGERS | 'desktop',\n resolver: BaseResolveDeviceProps<any> = {}\n ) {\n if (launchTarget === 'desktop') {\n const url = this.getDevServerUrl({ hostType: 'localhost' });\n await openBrowserAsync(url!);\n return { url };\n }\n\n const runtime = this.isTargetingNative() ? (this.isDevClient ? 'custom' : 'expo') : 'web';\n const manager = await this.getPlatformManagerAsync(launchTarget);\n return manager.openAsync({ runtime }, resolver);\n }\n\n /** Should use the interstitial page for selecting which runtime to use. */\n protected shouldUseInterstitialPage(): boolean {\n return (\n env.EXPO_ENABLE_INTERSTITIAL_PAGE &&\n // Checks if dev client is installed.\n !!resolveFrom.silent(this.projectRoot, 'expo-dev-launcher')\n );\n }\n\n /** Get the URL for opening in Expo Go. */\n protected getExpoGoUrl(platform: keyof typeof PLATFORM_MANAGERS): string | null {\n if (this.shouldUseInterstitialPage()) {\n const loadingUrl =\n platform === 'emulator'\n ? this.urlCreator?.constructLoadingUrl({}, 'android')\n : this.urlCreator?.constructLoadingUrl({ hostType: 'localhost' }, 'ios');\n return loadingUrl ?? null;\n }\n\n return this.urlCreator?.constructUrl({ scheme: 'exp' }) ?? null;\n }\n\n protected async getPlatformManagerAsync(platform: keyof typeof PLATFORM_MANAGERS) {\n if (!this.platformManagers[platform]) {\n const Manager = PLATFORM_MANAGERS[platform]();\n const port = this.getInstance()?.location.port;\n if (!port || !this.urlCreator) {\n throw new CommandError(\n 'DEV_SERVER',\n 'Cannot interact with native platforms until dev server has started'\n );\n }\n this.platformManagers[platform] = new Manager(this.projectRoot, port, {\n getCustomRuntimeUrl: this.urlCreator.constructDevClientUrl.bind(this.urlCreator),\n getExpoGoUrl: this.getExpoGoUrl.bind(this, platform),\n getDevServerUrl: this.getDevServerUrl.bind(this, { hostType: 'localhost' }),\n });\n }\n return this.platformManagers[platform];\n }\n}\n"],"names":["Log","PLATFORM_MANAGERS","simulator","require","ApplePlatformManager","emulator","AndroidPlatformManager","MIDDLEWARES","classic","ClassicManifestMiddleware","ExpoGoManifestHandlerMiddleware","BundlerDevServer","constructor","projectRoot","isDevClient","ngrok","devSession","instance","platformManagers","urlCreator","setInstance","getManifestMiddlewareAsync","options","manifestType","forceManifestType","assert","Middleware","getUrlCreator","middleware","constructUrl","bind","mode","minify","isNativeWebpack","name","isTargetingNative","privateKeyPath","getHandler","postStartAsync","location","hostType","APISettings","isOffline","_startTunnelAsync","startDevSessionAsync","watchConfig","notifier","FileNotifier","getConfigModuleIds","startObserving","port","getInstance","debug","AsyncNgrok","startAsync","stopNotifying","DevelopmentSession","getNativeRuntimeUrl","getDevServerUrl","runtime","isTargetingWeb","broadcastMessage","method","params","messageSocket","broadcast","stopAsync","closeAsync","catch","e","error","exception","resolveWithTimeout","Promise","resolve","reject","server","close","timeout","errorMessage","opts","constructDevClientUrl","scheme","protocol","url","getTunnelUrl","getActiveUrl","openPlatformAsync","launchTarget","resolver","openBrowserAsync","manager","getPlatformManagerAsync","openAsync","shouldUseInterstitialPage","env","EXPO_ENABLE_INTERSTITIAL_PAGE","resolveFrom","silent","getExpoGoUrl","platform","loadingUrl","constructLoadingUrl","Manager","CommandError","getCustomRuntimeUrl"],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
var _config = require("@expo/config");
|
|
6
|
+
var _assert = _interopRequireDefault(require("assert"));
|
|
7
|
+
var Log = _interopRequireWildcard(require("../../log"));
|
|
8
|
+
var _fileNotifier = require("../../utils/FileNotifier");
|
|
9
|
+
var _rudderstackClient = require("../../utils/analytics/rudderstackClient");
|
|
10
|
+
var AndroidDebugBridge = _interopRequireWildcard(require("../platforms/android/adb"));
|
|
11
|
+
function _interopRequireDefault(obj) {
|
|
12
|
+
return obj && obj.__esModule ? obj : {
|
|
13
|
+
default: obj
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function _interopRequireWildcard(obj) {
|
|
17
|
+
if (obj && obj.__esModule) {
|
|
18
|
+
return obj;
|
|
19
|
+
} else {
|
|
20
|
+
var newObj = {};
|
|
21
|
+
if (obj != null) {
|
|
22
|
+
for(var key in obj){
|
|
23
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
24
|
+
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
|
|
25
|
+
if (desc.get || desc.set) {
|
|
26
|
+
Object.defineProperty(newObj, key, desc);
|
|
27
|
+
} else {
|
|
28
|
+
newObj[key] = obj[key];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
newObj.default = obj;
|
|
34
|
+
return newObj;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const devServers = [];
|
|
38
|
+
const BUNDLERS = {
|
|
39
|
+
webpack: ()=>require("./webpack/WebpackBundlerDevServer").WebpackBundlerDevServer
|
|
40
|
+
,
|
|
41
|
+
metro: ()=>require("./metro/MetroBundlerDevServer").MetroBundlerDevServer
|
|
42
|
+
};
|
|
43
|
+
class DevServerManager {
|
|
44
|
+
constructor(projectRoot, options){
|
|
45
|
+
this.projectRoot = projectRoot;
|
|
46
|
+
this.options = options;
|
|
47
|
+
this.projectPrerequisites = [];
|
|
48
|
+
this.watchBabelConfig();
|
|
49
|
+
}
|
|
50
|
+
watchBabelConfig() {
|
|
51
|
+
const notifier = new _fileNotifier.FileNotifier(this.projectRoot, [
|
|
52
|
+
"./babel.config.js",
|
|
53
|
+
"./babel.config.json",
|
|
54
|
+
"./.babelrc.json",
|
|
55
|
+
"./.babelrc",
|
|
56
|
+
"./.babelrc.js",
|
|
57
|
+
]);
|
|
58
|
+
notifier.startObserving();
|
|
59
|
+
return notifier;
|
|
60
|
+
}
|
|
61
|
+
/** Lazily load and assert a project-level prerequisite. */ async ensureProjectPrerequisiteAsync(PrerequisiteClass) {
|
|
62
|
+
let prerequisite1 = this.projectPrerequisites.find((prerequisite)=>prerequisite instanceof PrerequisiteClass
|
|
63
|
+
);
|
|
64
|
+
if (!prerequisite1) {
|
|
65
|
+
prerequisite1 = new PrerequisiteClass(this.projectRoot);
|
|
66
|
+
this.projectPrerequisites.push(prerequisite1);
|
|
67
|
+
}
|
|
68
|
+
await prerequisite1.assertAsync();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Sends a message over web sockets to all connected devices,
|
|
72
|
+
* does nothing when the dev server is not running.
|
|
73
|
+
*
|
|
74
|
+
* @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.
|
|
75
|
+
* @param params extra event info to send over the socket.
|
|
76
|
+
*/ broadcastMessage(method, params) {
|
|
77
|
+
devServers.forEach((server)=>{
|
|
78
|
+
server.broadcastMessage(method, params);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** Get the port for the dev server (either Webpack or Metro) that is hosting code for React Native runtimes. */ getNativeDevServerPort() {
|
|
82
|
+
var ref;
|
|
83
|
+
const server1 = devServers.find((server)=>server.isTargetingNative()
|
|
84
|
+
);
|
|
85
|
+
var _port;
|
|
86
|
+
return (_port = (ref = server1 == null ? void 0 : server1.getInstance()) == null ? void 0 : ref.location.port) != null ? _port : null;
|
|
87
|
+
}
|
|
88
|
+
/** Get the first server that targets web. */ getWebDevServer() {
|
|
89
|
+
const server2 = devServers.find((server)=>server.isTargetingWeb()
|
|
90
|
+
);
|
|
91
|
+
return server2 != null ? server2 : null;
|
|
92
|
+
}
|
|
93
|
+
getDefaultDevServer() {
|
|
94
|
+
// Return the first native dev server otherwise return the first dev server.
|
|
95
|
+
const server3 = devServers.find((server)=>server.isTargetingNative()
|
|
96
|
+
);
|
|
97
|
+
const defaultServer = server3 != null ? server3 : devServers[0];
|
|
98
|
+
(0, _assert).default(defaultServer, "No dev servers are running");
|
|
99
|
+
return defaultServer;
|
|
100
|
+
}
|
|
101
|
+
async ensureWebDevServerRunningAsync() {
|
|
102
|
+
const [server4] = devServers.filter((server)=>server.isTargetingWeb()
|
|
103
|
+
);
|
|
104
|
+
if (server4) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
Log.debug("Starting webpack dev server");
|
|
108
|
+
return this.startAsync([
|
|
109
|
+
{
|
|
110
|
+
type: "webpack",
|
|
111
|
+
options: this.options
|
|
112
|
+
},
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
/** Start all dev servers. */ async startAsync(startOptions) {
|
|
116
|
+
const { exp } = (0, _config).getConfig(this.projectRoot);
|
|
117
|
+
var _sdkVersion;
|
|
118
|
+
(0, _rudderstackClient).logEvent("Start Project", {
|
|
119
|
+
sdkVersion: (_sdkVersion = exp.sdkVersion) != null ? _sdkVersion : null
|
|
120
|
+
});
|
|
121
|
+
// Start all dev servers...
|
|
122
|
+
for (const { type , options } of startOptions){
|
|
123
|
+
const BundlerDevServerClass = await BUNDLERS[type]();
|
|
124
|
+
const server = new BundlerDevServerClass(this.projectRoot, !!(options == null ? void 0 : options.devClient));
|
|
125
|
+
await server.startAsync(options != null ? options : this.options);
|
|
126
|
+
devServers.push(server);
|
|
127
|
+
}
|
|
128
|
+
return exp;
|
|
129
|
+
}
|
|
130
|
+
/** Stop all servers including ADB. */ async stopAsync() {
|
|
131
|
+
await Promise.allSettled([
|
|
132
|
+
// Stop all dev servers
|
|
133
|
+
...devServers.map((server)=>server.stopAsync()
|
|
134
|
+
),
|
|
135
|
+
// Stop ADB
|
|
136
|
+
AndroidDebugBridge.getServer().stopAsync(),
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.DevServerManager = DevServerManager;
|
|
141
|
+
|
|
142
|
+
//# sourceMappingURL=DevServerManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/start/server/DevServerManager.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport assert from 'assert';\n\nimport * as Log from '../../log';\nimport { FileNotifier } from '../../utils/FileNotifier';\nimport { logEvent } from '../../utils/analytics/rudderstackClient';\nimport { ProjectPrerequisite } from '../doctor/Prerequisite';\nimport * as AndroidDebugBridge from '../platforms/android/adb';\nimport { BundlerDevServer, BundlerStartOptions } from './BundlerDevServer';\n\nexport type MultiBundlerStartOptions = {\n type: keyof typeof BUNDLERS;\n options?: BundlerStartOptions;\n}[];\n\nconst devServers: BundlerDevServer[] = [];\n\nconst BUNDLERS = {\n webpack: () =>\n require('./webpack/WebpackBundlerDevServer')\n .WebpackBundlerDevServer as typeof import('./webpack/WebpackBundlerDevServer').WebpackBundlerDevServer,\n metro: () =>\n require('./metro/MetroBundlerDevServer')\n .MetroBundlerDevServer as typeof import('./metro/MetroBundlerDevServer').MetroBundlerDevServer,\n};\n\n/** Manages interacting with multiple dev servers. */\nexport class DevServerManager {\n private projectPrerequisites: ProjectPrerequisite[] = [];\n\n constructor(\n public projectRoot: string,\n /** Keep track of the original CLI options for bundlers that are started interactively. */\n public options: BundlerStartOptions\n ) {\n this.watchBabelConfig();\n }\n\n private watchBabelConfig() {\n const notifier = new FileNotifier(this.projectRoot, [\n './babel.config.js',\n './babel.config.json',\n './.babelrc.json',\n './.babelrc',\n './.babelrc.js',\n ]);\n\n notifier.startObserving();\n\n return notifier;\n }\n\n /** Lazily load and assert a project-level prerequisite. */\n async ensureProjectPrerequisiteAsync(PrerequisiteClass: typeof ProjectPrerequisite) {\n let prerequisite = this.projectPrerequisites.find(\n (prerequisite) => prerequisite instanceof PrerequisiteClass\n );\n if (!prerequisite) {\n prerequisite = new PrerequisiteClass(this.projectRoot);\n this.projectPrerequisites.push(prerequisite);\n }\n await prerequisite.assertAsync();\n }\n\n /**\n * Sends a message over web sockets to all connected devices,\n * does nothing when the dev server is not running.\n *\n * @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.\n * @param params extra event info to send over the socket.\n */\n broadcastMessage(method: 'reload' | 'devMenu' | 'sendDevCommand', params?: Record<string, any>) {\n devServers.forEach((server) => {\n server.broadcastMessage(method, params);\n });\n }\n\n /** Get the port for the dev server (either Webpack or Metro) that is hosting code for React Native runtimes. */\n getNativeDevServerPort() {\n const server = devServers.find((server) => server.isTargetingNative());\n return server?.getInstance()?.location.port ?? null;\n }\n\n /** Get the first server that targets web. */\n getWebDevServer() {\n const server = devServers.find((server) => server.isTargetingWeb());\n return server ?? null;\n }\n\n getDefaultDevServer(): BundlerDevServer {\n // Return the first native dev server otherwise return the first dev server.\n const server = devServers.find((server) => server.isTargetingNative());\n const defaultServer = server ?? devServers[0];\n assert(defaultServer, 'No dev servers are running');\n return defaultServer;\n }\n\n async ensureWebDevServerRunningAsync() {\n const [server] = devServers.filter((server) => server.isTargetingWeb());\n if (server) {\n return;\n }\n Log.debug('Starting webpack dev server');\n return this.startAsync([\n {\n type: 'webpack',\n options: this.options,\n },\n ]);\n }\n\n /** Start all dev servers. */\n async startAsync(startOptions: MultiBundlerStartOptions): Promise<ExpoConfig> {\n const { exp } = getConfig(this.projectRoot);\n\n logEvent('Start Project', {\n sdkVersion: exp.sdkVersion ?? null,\n });\n\n // Start all dev servers...\n for (const { type, options } of startOptions) {\n const BundlerDevServerClass = await BUNDLERS[type]();\n const server = new BundlerDevServerClass(this.projectRoot, !!options?.devClient);\n await server.startAsync(options ?? this.options);\n devServers.push(server);\n }\n\n return exp;\n }\n\n /** Stop all servers including ADB. */\n async stopAsync(): Promise<void> {\n await Promise.allSettled([\n // Stop all dev servers\n ...devServers.map((server) => server.stopAsync()),\n // Stop ADB\n AndroidDebugBridge.getServer().stopAsync(),\n ]);\n }\n}\n"],"names":["Log","AndroidDebugBridge","devServers","BUNDLERS","webpack","require","WebpackBundlerDevServer","metro","MetroBundlerDevServer","DevServerManager","constructor","projectRoot","options","projectPrerequisites","watchBabelConfig","notifier","FileNotifier","startObserving","ensureProjectPrerequisiteAsync","PrerequisiteClass","prerequisite","find","push","assertAsync","broadcastMessage","method","params","forEach","server","getNativeDevServerPort","isTargetingNative","getInstance","location","port","getWebDevServer","isTargetingWeb","getDefaultDevServer","defaultServer","assert","ensureWebDevServerRunningAsync","filter","debug","startAsync","type","startOptions","exp","getConfig","logEvent","sdkVersion","BundlerDevServerClass","devClient","stopAsync","Promise","allSettled","map","getServer"],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
var _config = require("@expo/config");
|
|
6
|
+
var _settings = require("../../api/settings");
|
|
7
|
+
var _updateDevelopmentSession = require("../../api/updateDevelopmentSession");
|
|
8
|
+
var _user = require("../../api/user/user");
|
|
9
|
+
var ProjectDevices = _interopRequireWildcard(require("../project/devices"));
|
|
10
|
+
function _interopRequireWildcard(obj) {
|
|
11
|
+
if (obj && obj.__esModule) {
|
|
12
|
+
return obj;
|
|
13
|
+
} else {
|
|
14
|
+
var newObj = {};
|
|
15
|
+
if (obj != null) {
|
|
16
|
+
for(var key in obj){
|
|
17
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
18
|
+
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
|
|
19
|
+
if (desc.get || desc.set) {
|
|
20
|
+
Object.defineProperty(newObj, key, desc);
|
|
21
|
+
} else {
|
|
22
|
+
newObj[key] = obj[key];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
newObj.default = obj;
|
|
28
|
+
return newObj;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const UPDATE_FREQUENCY = 20 * 1000; // 20 seconds
|
|
32
|
+
async function isAuthenticatedAsync() {
|
|
33
|
+
return !!await (0, _user).getUserAsync().catch(()=>null
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
class DevelopmentSession {
|
|
37
|
+
constructor(projectRoot, url){
|
|
38
|
+
this.projectRoot = projectRoot;
|
|
39
|
+
this.url = url;
|
|
40
|
+
this.timeout = null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Notify the Expo servers that a project is running, this enables the Expo Go app
|
|
44
|
+
* and Dev Clients to offer a "recently in development" section for quick access.
|
|
45
|
+
*
|
|
46
|
+
* This method starts an interval that will continue to ping the servers until we stop it.
|
|
47
|
+
*
|
|
48
|
+
* @param projectRoot Project root folder, used for retrieving device installation IDs.
|
|
49
|
+
* @param props.exp Partial Expo config with values that will be used in the Expo Go app.
|
|
50
|
+
* @param props.runtime which runtime the app should be opened in. `native` for dev clients, `web` for web browsers.
|
|
51
|
+
* @returns
|
|
52
|
+
*/ async startAsync({ exp =(0, _config).getConfig(this.projectRoot).exp , runtime }) {
|
|
53
|
+
if (_settings.APISettings.isOffline) {
|
|
54
|
+
this.stopNotifying();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const deviceIds = await this.getDeviceInstallationIdsAsync();
|
|
58
|
+
if (!await isAuthenticatedAsync() && !(deviceIds == null ? void 0 : deviceIds.length)) {
|
|
59
|
+
this.stopNotifying();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (this.url) {
|
|
63
|
+
await (0, _updateDevelopmentSession).updateDevelopmentSessionAsync({
|
|
64
|
+
url: this.url,
|
|
65
|
+
runtime,
|
|
66
|
+
exp,
|
|
67
|
+
deviceIds
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
this.stopNotifying();
|
|
71
|
+
this.timeout = setTimeout(()=>this.startAsync({
|
|
72
|
+
exp,
|
|
73
|
+
runtime
|
|
74
|
+
})
|
|
75
|
+
, UPDATE_FREQUENCY);
|
|
76
|
+
}
|
|
77
|
+
/** Get all recent devices for the project. */ async getDeviceInstallationIdsAsync() {
|
|
78
|
+
const { devices } = await ProjectDevices.getDevicesInfoAsync(this.projectRoot);
|
|
79
|
+
return devices.map(({ installationId })=>installationId
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
/** Stop notifying the Expo servers that the development session is running. */ stopNotifying() {
|
|
83
|
+
if (this.timeout) {
|
|
84
|
+
clearTimeout(this.timeout);
|
|
85
|
+
}
|
|
86
|
+
this.timeout = null;
|
|
87
|
+
}
|
|
88
|
+
async closeAsync() {
|
|
89
|
+
this.stopNotifying();
|
|
90
|
+
const deviceIds = await this.getDeviceInstallationIdsAsync();
|
|
91
|
+
if (!await isAuthenticatedAsync() && !(deviceIds == null ? void 0 : deviceIds.length)) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (this.url) {
|
|
95
|
+
await (0, _updateDevelopmentSession).closeDevelopmentSessionAsync({
|
|
96
|
+
url: this.url,
|
|
97
|
+
deviceIds
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.DevelopmentSession = DevelopmentSession;
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=DevelopmentSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/start/server/DevelopmentSession.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\n\nimport { APISettings } from '../../api/settings';\nimport {\n closeDevelopmentSessionAsync,\n updateDevelopmentSessionAsync,\n} from '../../api/updateDevelopmentSession';\nimport { getUserAsync } from '../../api/user/user';\nimport * as ProjectDevices from '../project/devices';\n\nconst UPDATE_FREQUENCY = 20 * 1000; // 20 seconds\n\nasync function isAuthenticatedAsync(): Promise<boolean> {\n return !!(await getUserAsync().catch(() => null));\n}\n\nexport class DevelopmentSession {\n private timeout: NodeJS.Timeout | null = null;\n\n constructor(\n /** Project root directory. */\n private projectRoot: string,\n /** Development Server URL. */\n public url: string | null\n ) {}\n\n /**\n * Notify the Expo servers that a project is running, this enables the Expo Go app\n * and Dev Clients to offer a \"recently in development\" section for quick access.\n *\n * This method starts an interval that will continue to ping the servers until we stop it.\n *\n * @param projectRoot Project root folder, used for retrieving device installation IDs.\n * @param props.exp Partial Expo config with values that will be used in the Expo Go app.\n * @param props.runtime which runtime the app should be opened in. `native` for dev clients, `web` for web browsers.\n * @returns\n */\n public async startAsync({\n exp = getConfig(this.projectRoot).exp,\n runtime,\n }: {\n exp?: Pick<ExpoConfig, 'name' | 'description' | 'slug' | 'primaryColor'>;\n runtime: 'native' | 'web';\n }): Promise<void> {\n if (APISettings.isOffline) {\n this.stopNotifying();\n return;\n }\n\n const deviceIds = await this.getDeviceInstallationIdsAsync();\n\n if (!(await isAuthenticatedAsync()) && !deviceIds?.length) {\n this.stopNotifying();\n return;\n }\n\n if (this.url) {\n await updateDevelopmentSessionAsync({\n url: this.url,\n runtime,\n exp,\n deviceIds,\n });\n }\n\n this.stopNotifying();\n\n this.timeout = setTimeout(() => this.startAsync({ exp, runtime }), UPDATE_FREQUENCY);\n }\n\n /** Get all recent devices for the project. */\n private async getDeviceInstallationIdsAsync(): Promise<string[]> {\n const { devices } = await ProjectDevices.getDevicesInfoAsync(this.projectRoot);\n return devices.map(({ installationId }) => installationId);\n }\n\n /** Stop notifying the Expo servers that the development session is running. */\n public stopNotifying() {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n this.timeout = null;\n }\n\n public async closeAsync(): Promise<void> {\n this.stopNotifying();\n\n const deviceIds = await this.getDeviceInstallationIdsAsync();\n\n if (!(await isAuthenticatedAsync()) && !deviceIds?.length) {\n return;\n }\n\n if (this.url) {\n await closeDevelopmentSessionAsync({\n url: this.url,\n deviceIds,\n });\n }\n }\n}\n"],"names":["ProjectDevices","UPDATE_FREQUENCY","isAuthenticatedAsync","getUserAsync","catch","DevelopmentSession","constructor","projectRoot","url","timeout","startAsync","exp","getConfig","runtime","APISettings","isOffline","stopNotifying","deviceIds","getDeviceInstallationIdsAsync","length","updateDevelopmentSessionAsync","setTimeout","devices","getDevicesInfoAsync","map","installationId","clearTimeout","closeAsync","closeDevelopmentSessionAsync"],"mappings":"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"}
|