export async function buildWidgetSource()

in src/components/custom-widget/ko/utils.ts [27:95]


export async function buildWidgetSource(
    blobStorage: MapiBlobStorage,
    model: CustomWidgetModel,
    settingsProvider: ISettingsProvider,
    filePath: string,
    logger: Logger
): Promise<{ override: string | null, src: string }> {
    const name = customWidgetRemovePrefixName(model.name);
    let developmentSrc = null;
    let urlString = "";
    const environment = await settingsProvider.getSetting<Environment>("environment");

    if (environment === "publishing") {
        urlString = `${PUBLISHING_HOST}/content/${BLOB_ROOT}/${name}/${filePath}`;
    } else {
        // check is necessary during publishing as window.sessionStorage.getItem throws "DOMException {}  node:internal/process/promises:279"
        developmentSrc = window.sessionStorage.getItem(Constants.overrideConfigSessionKeyPrefix + name);
    }

    if (!urlString) {
        if (!developmentSrc) {
            const backendUrl = (await settingsProvider.getSetting<string>("backendUrl")) || location.origin;
            const proxyEditorContentRequests = await getFeatureFlagIsEnabled("proxyEditorContentRequests");

            if (proxyEditorContentRequests == true) {
                urlString = `${backendUrl}/editors_content/${BLOB_ROOT}/${BLOB_DATA_FOLDER}/${name}/${filePath}`;
                logger?.trackEvent("BuildWidgetSource", { message: "Proxy requests through backend" });
            } else {
                urlString = await blobStorage.getDownloadUrlWithoutToken(`${buildBlobDataPath(name)}${filePath}`);
                logger?.trackEvent("BuildWidgetSource", { message: "Direct requests to storage" });
            }
        } else {
            urlString = developmentSrc + filePath;
        }
    }

    const url = new URL(urlString);
    url.pathname = decodeURIComponent(url.pathname);

    const data: EditorData<ValuesCommon> = {
        values: JSON.parse(model.customInputValue).values ?? {},
        instanceId: model.instanceId,
        environment
    };
    url.searchParams.append(APIM_EDITOR_DATA_KEY, encodeURIComponent(JSON.stringify(data)));
    let src = url.toString();

    if (environment === "publishing") {
       src = src.replace(PUBLISHING_HOST, "");
    }

    return { override: developmentSrc, src };

    async function getFeatureFlagIsEnabled(featureFlagName: string): Promise<boolean> {
        try {
            const settingsObject = await settingsProvider.getSetting("featureFlags");

            const featureFlags = new Map(Object.entries(settingsObject ?? {}));
            if (!featureFlags || !featureFlags.has(featureFlagName)) {
                return false;
            }

            return featureFlags.get(featureFlagName) == true;
        } catch (error) {
            logger?.trackEvent("BuildWidgetSource", { message: "Feature flag check failed", data: error.message });
            return false;
        }
    }
}