UNPKG

17.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"ngrok.js","names":["_config","data","require","path","_interopRequireWildcard","_internal","UrlUtils","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","NGROK_CONFIG","authToken","authTokenPublicId","domain","getNgrokConfigPath","join","UserSettings","dotExpoHomeDirectory","getProjectRandomnessAsync","projectRoot","ps","ProjectSettings","readAsync","randomness","urlRandomness","resetProjectRandomnessAsync","someRandomness","setAsync","connectToNgrokAsync","ngrok","args","hostnameAsync","ngrokPid","attempts","configPath","hostname","url","connect","onStatusChange","handleStatusChange","bind","e","message","XDLError","toString","JSON","stringify","error_code","process","kill","ProjectUtils","logDebug","delayAsync","TUNNEL_TIMEOUT","startTunnelsAsync","options","resolveNgrokAsync","username","UserManager","getCurrentUsernameAsync","ANONYMOUS_USERNAME","assertValidProjectRoot","packagerInfo","readPackagerInfoAsync","packagerPort","expoServerPort","stopTunnelsAsync","Android","startAdbReverseAsync","logInfo","packageShortName","parse","base","expRc","readExpRcAsync","startedTunnelsSuccessfully","Promise","race","Error","createResolver","extra","resolveHostnameAsync","manifestTunnelRandomness","domainify","isLegacyDevServer","expoServerNgrokUrl","authtoken","port","proto","packagerNgrokUrl","setPackagerInfoAsync","getActiveProcess","pid","logWithLevel","tag","_expoEventType","shouldPrompt","catch","ngrokProcess","ngrokProcessPid","stopAdbReverseAsync","status","logError"],"sources":["../../src/start/ngrok.ts"],"sourcesContent":["import { readExpRcAsync } from '@expo/config';\nimport * as path from 'path';\n\nimport {\n Android,\n ANONYMOUS_USERNAME,\n assertValidProjectRoot,\n delayAsync,\n NgrokOptions,\n ProjectSettings,\n ProjectUtils,\n resolveNgrokAsync,\n UserManager,\n UserSettings,\n XDLError,\n} from '../internal';\nimport * as UrlUtils from './ngrokUrl';\n\nconst NGROK_CONFIG = {\n authToken: '5W1bR67GNbWcXqmxZzBG1_56GezNeaX6sSRvn8npeQ8',\n authTokenPublicId: '5W1bR67GNbWcXqmxZzBG1',\n domain: 'exp.direct',\n};\n\nfunction getNgrokConfigPath() {\n return path.join(UserSettings.dotExpoHomeDirectory(), 'ngrok.yml');\n}\n\nasync function getProjectRandomnessAsync(projectRoot: string) {\n const ps = await ProjectSettings.readAsync(projectRoot);\n const randomness = ps.urlRandomness;\n if (randomness) {\n return randomness;\n } else {\n return resetProjectRandomnessAsync(projectRoot);\n }\n}\n\nasync function resetProjectRandomnessAsync(projectRoot: string) {\n const randomness = UrlUtils.someRandomness();\n ProjectSettings.setAsync(projectRoot, { urlRandomness: randomness });\n return randomness;\n}\n\nasync function connectToNgrokAsync(\n projectRoot: string,\n ngrok: any,\n args: NgrokOptions,\n hostnameAsync: () => Promise<string>,\n ngrokPid: number | null | undefined,\n attempts: number = 0\n): Promise<string> {\n try {\n const configPath = getNgrokConfigPath();\n const hostname = await hostnameAsync();\n const url = await ngrok.connect({\n hostname,\n configPath,\n onStatusChange: handleStatusChange.bind(null, projectRoot),\n ...args,\n });\n return url;\n } catch (e: any) {\n // Attempt to connect 3 times\n if (attempts >= 2) {\n if (e.message) {\n throw new XDLError('NGROK_ERROR', e.toString());\n } else {\n throw new XDLError('NGROK_ERROR', JSON.stringify(e));\n }\n }\n if (!attempts) {\n attempts = 0;\n } // Attempt to fix the issue\n if (e.error_code && e.error_code === 103) {\n if (attempts === 0) {\n // Failed to start tunnel. Might be because url already bound to another session.\n if (ngrokPid) {\n try {\n process.kill(ngrokPid, 'SIGKILL');\n } catch {\n ProjectUtils.logDebug(projectRoot, 'expo', `Couldn't kill ngrok with PID ${ngrokPid}`);\n }\n } else {\n await ngrok.kill();\n }\n } else {\n // Change randomness to avoid conflict if killing ngrok didn't help\n await resetProjectRandomnessAsync(projectRoot);\n }\n } // Wait 100ms and then try again\n await delayAsync(100);\n return connectToNgrokAsync(projectRoot, ngrok, args, hostnameAsync, null, attempts + 1);\n }\n}\n\nconst TUNNEL_TIMEOUT = 10 * 1000;\n\nexport async function startTunnelsAsync(\n projectRoot: string,\n options: { autoInstall?: boolean } = {}\n): Promise<void> {\n const ngrok = await resolveNgrokAsync(projectRoot, options);\n const username = (await UserManager.getCurrentUsernameAsync()) || ANONYMOUS_USERNAME;\n assertValidProjectRoot(projectRoot);\n const packagerInfo = await ProjectSettings.readPackagerInfoAsync(projectRoot);\n if (!packagerInfo.packagerPort) {\n throw new XDLError('NO_PACKAGER_PORT', `No packager found for project at ${projectRoot}.`);\n }\n if (!packagerInfo.expoServerPort) {\n throw new XDLError(\n 'NO_EXPO_SERVER_PORT',\n `No Expo server found for project at ${projectRoot}.`\n );\n }\n const expoServerPort = packagerInfo.expoServerPort;\n await stopTunnelsAsync(projectRoot);\n if (await Android.startAdbReverseAsync(projectRoot)) {\n ProjectUtils.logInfo(\n projectRoot,\n 'expo',\n 'Successfully ran `adb reverse`. Localhost URLs should work on the connected Android device.'\n );\n }\n const packageShortName = path.parse(projectRoot).base;\n const expRc = await readExpRcAsync(projectRoot);\n\n let startedTunnelsSuccessfully = false;\n\n // Some issues with ngrok cause it to hang indefinitely. After\n // TUNNEL_TIMEOUTms we just throw an error.\n await Promise.race([\n (async () => {\n await delayAsync(TUNNEL_TIMEOUT);\n if (!startedTunnelsSuccessfully) {\n throw new Error('Starting tunnels timed out');\n }\n })(),\n\n (async () => {\n const createResolver = (extra: string[] = []) =>\n async function resolveHostnameAsync() {\n const randomness = expRc.manifestTunnelRandomness\n ? expRc.manifestTunnelRandomness\n : await getProjectRandomnessAsync(projectRoot);\n return [\n ...extra,\n randomness,\n UrlUtils.domainify(username),\n UrlUtils.domainify(packageShortName),\n NGROK_CONFIG.domain,\n ].join('.');\n };\n\n // If both ports are defined and they don't match then we can assume the legacy dev server is being used.\n const isLegacyDevServer =\n !!expoServerPort &&\n !!packagerInfo.packagerPort &&\n expoServerPort !== packagerInfo.packagerPort;\n\n ProjectUtils.logInfo(projectRoot, 'expo', `Using legacy dev server: ${isLegacyDevServer}`);\n\n const expoServerNgrokUrl = await connectToNgrokAsync(\n projectRoot,\n ngrok,\n {\n authtoken: NGROK_CONFIG.authToken,\n port: expoServerPort,\n proto: 'http',\n },\n createResolver(),\n packagerInfo.ngrokPid\n );\n\n let packagerNgrokUrl: string;\n if (isLegacyDevServer) {\n packagerNgrokUrl = await connectToNgrokAsync(\n projectRoot,\n ngrok,\n {\n authtoken: NGROK_CONFIG.authToken,\n port: packagerInfo.packagerPort,\n proto: 'http',\n },\n createResolver(['packager']),\n packagerInfo.ngrokPid\n );\n } else {\n // Custom dev server will share the port across expo and metro dev servers,\n // this means we only need one ngrok URL.\n packagerNgrokUrl = expoServerNgrokUrl;\n }\n\n await ProjectSettings.setPackagerInfoAsync(projectRoot, {\n expoServerNgrokUrl,\n packagerNgrokUrl,\n ngrokPid: ngrok.getActiveProcess().pid,\n });\n\n startedTunnelsSuccessfully = true;\n\n ProjectUtils.logWithLevel(\n projectRoot,\n 'info',\n {\n tag: 'expo',\n _expoEventType: 'TUNNEL_READY',\n },\n 'Tunnel ready.'\n );\n })(),\n ]);\n}\n\nexport async function stopTunnelsAsync(projectRoot: string): Promise<void> {\n assertValidProjectRoot(projectRoot);\n const ngrok = await resolveNgrokAsync(projectRoot, { shouldPrompt: false }).catch(() => null);\n if (!ngrok) {\n return;\n }\n\n // This will kill all ngrok tunnels in the process.\n // We'll need to change this if we ever support more than one project\n // open at a time in XDE.\n const packagerInfo = await ProjectSettings.readPackagerInfoAsync(projectRoot);\n const ngrokProcess = ngrok.getActiveProcess();\n const ngrokProcessPid = ngrokProcess ? ngrokProcess.pid : null;\n if (packagerInfo.ngrokPid && packagerInfo.ngrokPid !== ngrokProcessPid) {\n // Ngrok is running in some other process. Kill at the os level.\n try {\n process.kill(packagerInfo.ngrokPid);\n } catch {\n ProjectUtils.logDebug(\n projectRoot,\n 'expo',\n `Couldn't kill ngrok with PID ${packagerInfo.ngrokPid}`\n );\n }\n } else {\n // Ngrok is running from the current process. Kill using ngrok api.\n await ngrok.kill();\n }\n await ProjectSettings.setPackagerInfoAsync(projectRoot, {\n expoServerNgrokUrl: null,\n packagerNgrokUrl: null,\n ngrokPid: null,\n });\n await Android.stopAdbReverseAsync(projectRoot);\n}\n\nfunction handleStatusChange(projectRoot: string, status: string) {\n if (status === 'closed') {\n ProjectUtils.logError(\n projectRoot,\n 'expo',\n 'We noticed your tunnel is having issues. ' +\n 'This may be due to intermittent problems with our tunnel provider. ' +\n 'If you have trouble connecting to your app, try to Restart the project, ' +\n 'or switch Host to LAN.'\n );\n } else if (status === 'connected') {\n ProjectUtils.logInfo(projectRoot, 'expo', 'Tunnel connected.');\n }\n}\n"],"mappings":"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"}
\No newline at end of file