UNPKG

10.1 kBSource Map (JSON)View Raw
1{"version":3,"file":"LoadingPageHandler.js","names":["_config","data","require","_Updates","_fsExtra","_path","_url","_internal","LoadingEndpoint","exports","DeepLinkEndpoint","onDeepLink","setOnDeepLink","listener","getPlatform","query","userAgent","match","getRuntimeVersion","exp","platform","getRuntimeVersionNullable","noCacheMiddleware","res","setHeader","loadingEndpointHandler","projectRoot","req","_getSDKVersion","content","readFile","resolve","__dirname","toString","getConfig","skipSDKVersionRequirement","scheme","ProjectSettings","readAsync","appName","getNameFromConfig","parse","url","headers","runtimeVersion","replace","getSDKVersion","end","deeplinkEndpointHandler","isDevClient","projectUrl","UrlUtils","constructDevClientUrlAsync","constructManifestUrlAsync","statusCode","getLoadingPageHandler","next","pathname","exception","JSON","stringify","error"],"sources":["../../src/start/LoadingPageHandler.ts"],"sourcesContent":["import { ExpoConfig, getConfig, getNameFromConfig } from '@expo/config';\nimport { getRuntimeVersionNullable, getSDKVersion } from '@expo/config-plugins/build/utils/Updates';\nimport express from 'express';\nimport { readFile } from 'fs-extra';\nimport http from 'http';\nimport { resolve } from 'path';\nimport { parse } from 'url';\n\nimport { ProjectSettings, UrlUtils } from './../internal';\n\nexport const LoadingEndpoint = '/_expo/loading';\nexport const DeepLinkEndpoint = '/_expo/link';\n\ntype OnDeepLinkListener = (\n projectRoot: string,\n isDevClient: boolean,\n platform: string | null\n) => Promise<void>;\n\nlet onDeepLink: OnDeepLinkListener = async () => {};\n\nexport function setOnDeepLink(listener: OnDeepLinkListener) {\n onDeepLink = listener;\n}\n\nfunction getPlatform(\n query: { [x: string]: string | string[] | null },\n userAgent: string | null = null\n): 'android' | 'ios' | null {\n if (query['platform'] === 'android' || query['platform'] === 'ios') {\n return query['platform'];\n }\n\n if (userAgent?.match(/Android/i)) {\n return 'android';\n }\n\n if (userAgent?.match(/iPhone|iPad/i)) {\n return 'ios';\n }\n\n return null;\n}\n\nfunction getRuntimeVersion(exp: ExpoConfig, platform: 'android' | 'ios' | null) {\n if (!platform) {\n return null;\n }\n\n return getRuntimeVersionNullable(exp, platform);\n}\n\nexport function noCacheMiddleware(\n res: express.Response | http.ServerResponse\n): express.Response | http.ServerResponse {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, must-revalidate');\n res.setHeader('Expires', '-1');\n res.setHeader('Pragma', 'no-cache');\n return res;\n}\n\nasync function loadingEndpointHandler(\n projectRoot: string,\n req: express.Request | http.IncomingMessage,\n res: express.Response | http.ServerResponse\n) {\n res.setHeader('Content-Type', 'text/html');\n\n let content = (\n await readFile(resolve(__dirname, './../../static/loading-page/index.html'))\n ).toString('utf-8');\n\n const { exp } = getConfig(projectRoot, { skipSDKVersionRequirement: true });\n const { scheme } = await ProjectSettings.readAsync(projectRoot);\n const { appName } = getNameFromConfig(exp);\n const { query } = parse(req.url!, true);\n const platform = getPlatform(query, req.headers['user-agent']);\n const runtimeVersion = getRuntimeVersion(exp, platform);\n\n content = content.replace(/{{\\s*AppName\\s*}}/, appName ?? 'App');\n\n content = content.replace(\n /{{\\s*ProjectVersionType\\s*}}/,\n runtimeVersion ? 'Runtime version' : 'SDK version'\n );\n\n content = content.replace(\n /{{\\s*ProjectVersion\\s*}}/,\n runtimeVersion ? runtimeVersion : getSDKVersion(exp) ?? 'Undetected'\n );\n\n content = content.replace(/{{\\s*Path\\s*}}/, projectRoot);\n content = content.replace(/{{\\s*Scheme\\s*}}/, scheme ?? 'Unknown');\n\n res.end(content);\n}\n\nasync function deeplinkEndpointHandler(\n projectRoot: string,\n req: express.Request | http.IncomingMessage,\n res: express.Response | http.ServerResponse\n) {\n const { query } = parse(req.url!, true);\n const isDevClient = query['choice'] === 'expo-dev-client';\n const projectUrl = isDevClient\n ? await UrlUtils.constructDevClientUrlAsync(projectRoot)\n : await UrlUtils.constructManifestUrlAsync(projectRoot);\n\n res.setHeader('Location', projectUrl);\n\n onDeepLink(projectRoot, isDevClient, getPlatform(query, req.headers['user-agent']));\n\n res.setHeader('Cache-Control', 'private, no-cache, no-store, must-revalidate');\n res.setHeader('Expires', '-1');\n res.setHeader('Pragma', 'no-cache');\n\n res.statusCode = 307;\n res.end();\n}\n\nexport function getLoadingPageHandler(projectRoot: string) {\n return async (\n req: express.Request | http.IncomingMessage,\n res: express.Response | http.ServerResponse,\n next: (err?: Error) => void\n ) => {\n if (!req.url) {\n next();\n return;\n }\n\n try {\n const url = parse(req.url).pathname || req.url;\n switch (url) {\n case LoadingEndpoint:\n await loadingEndpointHandler(projectRoot, req, noCacheMiddleware(res));\n break;\n case DeepLinkEndpoint:\n await deeplinkEndpointHandler(projectRoot, req, noCacheMiddleware(res));\n break;\n default:\n next();\n }\n } catch (exception) {\n res.statusCode = 520;\n if (typeof exception == 'object' && exception != null) {\n res.end(\n JSON.stringify({\n error: exception.toString(),\n })\n );\n } else {\n res.end(`Unexpected error: ${exception}`);\n }\n }\n };\n}\n"],"mappings":"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"}
\No newline at end of file