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