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;
}
}