UNPKG

15.3 kBSource Map (JSON)View Raw
1{"version":3,"file":"ExpoUpdatesManifestHandler.js","names":["_config","data","require","_configPlugins","_chalk","_interopRequireDefault","_nullthrows","_url","_uuid","_internal","_ManifestHandler","obj","__esModule","default","getPlatformFromRequest","req","url","parse","platform","query","headers","Error","stringifiedPlatform","String","includes","shouldUseAnonymousManifestAsync","easProjectId","ConnectionStatus","isOffline","currentSession","UserManager","getSessionAsync","getScopeKeyForProjectIdAsync","projectId","user","ensureLoggedInAsync","project","ApiV2","clientForUser","getAsync","encodeURIComponent","scopeKey","signManifestAsync","manifest","signature","postAsync","getManifestResponseAsync","projectRoot","host","acceptSignature","_expoConfig$runtimeVe","_expoConfig$extra","_expoConfig$extra$eas","Map","set","hostname","stripPort","projectSettings","bundleUrlPackagerOpts","getPackagerOptionsAsync","projectConfig","getConfig","entryPoint","resolveEntryPoint","mainModuleName","UrlUtils","stripJSExtension","expoConfig","exp","expoGoConfig","getExpoGoConfig","hostUri","constructHostUriAsync","runtimeVersion","Updates","getRuntimeVersion","policy","bundleUrl","getBundleUrlAsync","ProjectAssets","resolveManifestAssets","resolver","path","match","extra","eas","shouldUseAnonymousManifest","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","ANONYMOUS_USERNAME","slug","nullthrows","expoUpdatesManifest","id","uuidv4","createdAt","Date","toISOString","launchAsset","key","contentType","assets","metadata","undefined","expoClient","expoGo","manifestSignature","body","getManifestHandler","res","next","pathname","Env","isDebug","console","log","chalk","gray","JSON","stringify","headerName","headerValue","setHeader","end","Analytics","logEvent","developerTool","Config","e","ProjectUtils","logError","stack","statusCode","error","toString"],"sources":["../../src/start/ExpoUpdatesManifestHandler.ts"],"sourcesContent":["import { ExpoUpdatesManifest, getConfig } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport { JSONObject } from '@expo/json-file';\nimport chalk from 'chalk';\nimport express from 'express';\nimport http from 'http';\nimport nullthrows from 'nullthrows';\nimport { parse } from 'url';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n Analytics,\n ANONYMOUS_USERNAME,\n ApiV2,\n Config,\n ConnectionStatus,\n Env,\n ProjectAssets,\n ProjectUtils,\n resolveEntryPoint,\n UrlUtils,\n UserManager,\n UserSettings,\n} from '../internal';\nimport {\n getBundleUrlAsync,\n getExpoGoConfig,\n getPackagerOptionsAsync,\n stripPort,\n} from './ManifestHandler';\n\nfunction getPlatformFromRequest(req: express.Request | http.IncomingMessage): 'android' | 'ios' {\n const url = req.url ? parse(req.url, /* parseQueryString */ true) : null;\n const platform = url?.query.platform || req.headers['expo-platform'];\n if (!platform) {\n throw new Error('Must specify expo-platform header or query parameter');\n }\n\n const stringifiedPlatform = String(platform);\n if (!['android', 'ios'].includes(stringifiedPlatform)) {\n throw new Error(`platform must be \"android\" or \"ios\". Recieved: \"${platform}\"`);\n }\n return stringifiedPlatform as 'android' | 'ios';\n}\n\n/**\n * Whether an anonymous scope key should be used. It should be used when:\n * 1. Offline\n * 2. Not logged-in\n * 3. No EAS project ID in config\n */\nasync function shouldUseAnonymousManifestAsync(\n easProjectId: string | undefined | null\n): Promise<boolean> {\n if (!easProjectId || ConnectionStatus.isOffline()) {\n return true;\n }\n\n const currentSession = await UserManager.getSessionAsync();\n if (!currentSession) {\n return true;\n }\n\n return false;\n}\n\nasync function getScopeKeyForProjectIdAsync(projectId: string): Promise<string> {\n const user = await UserManager.ensureLoggedInAsync();\n const project = await ApiV2.clientForUser(user).getAsync(\n `projects/${encodeURIComponent(projectId)}`\n );\n return project.scopeKey;\n}\n\nasync function signManifestAsync(manifest: ExpoUpdatesManifest): Promise<string> {\n const user = await UserManager.ensureLoggedInAsync();\n const { signature } = await ApiV2.clientForUser(user).postAsync('manifest/eas/sign', {\n manifest: (manifest as any) as JSONObject,\n });\n return signature;\n}\n\nexport async function getManifestResponseAsync({\n projectRoot,\n platform,\n host,\n acceptSignature,\n}: {\n projectRoot: string;\n platform: 'android' | 'ios';\n host?: string;\n acceptSignature: boolean;\n}): Promise<{\n body: ExpoUpdatesManifest;\n headers: Map<string, number | string | readonly string[]>;\n}> {\n const headers = new Map<string, any>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n headers.set('content-type', 'application/json');\n\n const hostname = stripPort(host);\n const [projectSettings, bundleUrlPackagerOpts] = await getPackagerOptionsAsync(projectRoot);\n const projectConfig = getConfig(projectRoot);\n const entryPoint = resolveEntryPoint(projectRoot, platform, projectConfig);\n const mainModuleName = UrlUtils.stripJSExtension(entryPoint);\n const expoConfig = projectConfig.exp;\n const expoGoConfig = await getExpoGoConfig({\n projectRoot,\n projectSettings,\n mainModuleName,\n hostname,\n });\n\n const hostUri = await UrlUtils.constructHostUriAsync(projectRoot, hostname);\n\n const runtimeVersion = Updates.getRuntimeVersion(\n { ...expoConfig, runtimeVersion: expoConfig.runtimeVersion ?? { policy: 'sdkVersion' } },\n platform\n );\n\n if (!runtimeVersion) {\n throw new Error(`Unable to determine runtime version for ${platform}`);\n }\n\n const bundleUrl = await getBundleUrlAsync({\n projectRoot,\n platform,\n projectSettings,\n bundleUrlPackagerOpts,\n mainModuleName,\n hostname,\n });\n\n await ProjectAssets.resolveManifestAssets({\n projectRoot,\n manifest: expoConfig,\n async resolver(path) {\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n\n const easProjectId = expoConfig.extra?.eas?.projectId;\n const shouldUseAnonymousManifest = await shouldUseAnonymousManifestAsync(easProjectId);\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n const scopeKey = shouldUseAnonymousManifest\n ? `@${ANONYMOUS_USERNAME}/${expoConfig.slug}-${userAnonymousIdentifier}`\n : await getScopeKeyForProjectIdAsync(nullthrows(easProjectId));\n\n const expoUpdatesManifest = {\n id: uuidv4(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...expoConfig,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n if (acceptSignature && !shouldUseAnonymousManifest) {\n const manifestSignature = await signManifestAsync(expoUpdatesManifest);\n headers.set('expo-manifest-signature', manifestSignature);\n }\n\n return {\n body: expoUpdatesManifest,\n headers,\n };\n}\n\nexport function getManifestHandler(projectRoot: string) {\n return async (\n req: express.Request | http.IncomingMessage,\n res: express.Response | http.ServerResponse,\n next: (err?: Error) => void\n ) => {\n // Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n if (\n !req.url ||\n !['/', '/manifest', '/index.exp'].includes(\n // Strip the query params\n parse(req.url).pathname || req.url\n )\n ) {\n next();\n return;\n }\n\n if (Env.isDebug()) {\n console.log(\n chalk.gray(`Manifest request: URL \"${req.url}\", Headers ${JSON.stringify(req.headers)}`)\n );\n }\n\n try {\n const { body, headers } = await getManifestResponseAsync({\n projectRoot,\n host: req.headers.host,\n platform: getPlatformFromRequest(req),\n acceptSignature: !!req.headers['expo-accept-signature'],\n });\n for (const [headerName, headerValue] of headers) {\n res.setHeader(headerName, headerValue);\n }\n res.end(JSON.stringify(body));\n\n Analytics.logEvent('Serve Expo Updates Manifest', {\n developerTool: Config.developerTool,\n runtimeVersion: (body as any).runtimeVersion,\n });\n } catch (e: any) {\n ProjectUtils.logError(projectRoot, 'expo', e.stack);\n res.statusCode = 520;\n res.end(\n JSON.stringify({\n error: e.toString(),\n })\n );\n }\n };\n}\n"],"mappings":"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"}
\No newline at end of file