1import { Platform } from 'expo-modules-core'; 2import { PixelRatio } from 'react-native'; 3// Returns the Metro dev server-specific asset location. 4function getScaledAssetPath(asset) { 5 const scale = AssetSourceResolver.pickScale(asset.scales, PixelRatio.get()); 6 const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x'; 7 const type = !asset.type ? '' : `.${asset.type}`; 8 if (__DEV__) { 9 return asset.httpServerLocation + '/' + asset.name + scaleSuffix + type; 10 } 11 else { 12 return asset.httpServerLocation.replace(/\.\.\//g, '_') + '/' + asset.name + scaleSuffix + type; 13 } 14} 15export default class AssetSourceResolver { 16 serverUrl; 17 // where the jsbundle is being run from 18 // NOTE(EvanBacon): Never defined on web. 19 jsbundleUrl; 20 // the asset to resolve 21 asset; 22 constructor(serverUrl, jsbundleUrl, asset) { 23 this.serverUrl = serverUrl || 'https://expo.dev'; 24 this.jsbundleUrl = null; 25 this.asset = asset; 26 } 27 // Always true for web runtimes 28 isLoadedFromServer() { 29 return true; 30 } 31 // Always false for web runtimes 32 isLoadedFromFileSystem() { 33 return false; 34 } 35 defaultAsset() { 36 return this.assetServerURL(); 37 } 38 /** 39 * @returns absolute remote URL for the hosted asset. 40 */ 41 assetServerURL() { 42 const fromUrl = new URL(getScaledAssetPath(this.asset), this.serverUrl); 43 fromUrl.searchParams.set('platform', Platform.OS); 44 fromUrl.searchParams.set('hash', this.asset.hash); 45 return this.fromSource( 46 // Relative on web 47 fromUrl.toString().replace(fromUrl.origin, '')); 48 } 49 fromSource(source) { 50 return { 51 __packager_asset: true, 52 width: this.asset.width ?? undefined, 53 height: this.asset.height ?? undefined, 54 uri: source, 55 scale: AssetSourceResolver.pickScale(this.asset.scales, PixelRatio.get()), 56 }; 57 } 58 static pickScale(scales, deviceScale) { 59 for (let i = 0; i < scales.length; i++) { 60 if (scales[i] >= deviceScale) { 61 return scales[i]; 62 } 63 } 64 return scales[scales.length - 1] || 1; 65 } 66} 67//# sourceMappingURL=AssetSourceResolver.web.js.map