export async function getExperiments()

in src/app/functions/server/getExperiments.ts [34:120]


export async function getExperiments(params: {
  experimentationId: ExperimentationId;
  locale: string;
  countryCode: string;
}): Promise<ExperimentData_V2_Or_V2LikeV1> {
  if (["local"].includes(process.env.APP_ENV ?? "local")) {
    return localExperimentData;
  }

  if (!process.env.NIMBUS_SIDECAR_URL) {
    throw new Error("env var NIMBUS_SIDECAR_URL not set");
  }

  const serverUrl = new URL(process.env.NIMBUS_SIDECAR_URL);
  const flags = await getEnabledFeatureFlags({ isSignedOut: true });
  if (flags.includes("CirrusV2")) {
    serverUrl.pathname = "/v2/features";
  } else {
    serverUrl.pathname = "/v1/features";
  }

  const headersList = await headers();
  // Check if the Nimbus preview mode has been set by the middleware.
  const nimbusPreviewMode = headersList.get("x-nimbus-preview-mode");
  const previewMode = nimbusPreviewMode === "true";

  try {
    if (previewMode === true) {
      serverUrl.searchParams.set("nimbus_preview", "true");
    }

    logger.info("Sending request to Cirrus", {
      serverUrl: serverUrl.toString(),
      previewMode,
    });

    const response = await fetch(serverUrl, {
      headers: {
        "Content-Type": "application/json",
      },
      method: "POST",
      body: JSON.stringify({
        client_id: params.experimentationId,
        context: {
          // Nimbus takes a language, rather than a locale, hence the .split:
          language: params.locale.split("-")[0],
          region: params.countryCode.toUpperCase(),
        },
      }),
    });

    if (!response.ok) {
      logger.error("Cirrus request failed", {
        status: response.status,
        url: serverUrl.toString(),
      });
      throw new Error(`Cirrus request failed: ${response.statusText}`);
    }

    // With the `CirrusV2` flag enabled, the response is `ExperimentData`,
    // otherwise, it's just `ExperimentData["Features"]`.
    const json = (await response.json()) as
      | ExperimentData
      | ExperimentData["Features"];

    let experimentData: ExperimentData_V2_Or_V2LikeV1;
    if (flags.includes("CirrusV2")) {
      experimentData = json as ExperimentData;
    } else {
      experimentData = {
        Features: json as ExperimentData["Features"],
      };
    }

    return (experimentData as ExperimentData) ?? defaultExperimentData;
  } catch (ex) {
    logger.error("Could not connect to Cirrus", {
      serverUrl,
      ex,
      flags,
      params,
      previewMode,
    });
    captureException(ex);
    return defaultExperimentData;
  }
}