diff --git a/apps/studio/lib/configcat.test.ts b/apps/studio/lib/configcat.test.ts index 58632f1be0..6fae420cc5 100644 --- a/apps/studio/lib/configcat.test.ts +++ b/apps/studio/lib/configcat.test.ts @@ -2,6 +2,10 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import * as configcat from 'configcat-js' import { getFlags } from './configcat' +vi.mock('data/fetchers', () => ({ + fetchHandler: vi.fn(), +})) + vi.mock('configcat-js', () => ({ getClient: vi.fn(), PollingMode: { @@ -30,6 +34,14 @@ describe('configcat', () => { const mockValues = { flag1: true, flag2: false } mockClient.getAllValuesAsync.mockResolvedValue(mockValues) + const { fetchHandler } = await import('data/fetchers') + const mockFetchHandler = fetchHandler as unknown as ReturnType + mockFetchHandler.mockResolvedValueOnce( + new Response(JSON.stringify({}), { + status: 200, + }) + ) + const result = await getFlags(email) expect(configcat.User).toHaveBeenCalledWith(email) diff --git a/apps/studio/lib/configcat.ts b/apps/studio/lib/configcat.ts index 0f3c2044d2..d9745e0e2d 100644 --- a/apps/studio/lib/configcat.ts +++ b/apps/studio/lib/configcat.ts @@ -1,24 +1,38 @@ import * as configcat from 'configcat-js' +import { fetchHandler } from 'data/fetchers' let client: configcat.IConfigCatClient -function getClient() { +const endpoint = '/configuration-files/configcat-proxy/frontend-v2/config_v6.json' + +async function getClient() { if (client) { return client } - client = configcat.getClient( - process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', - configcat.PollingMode.AutoPoll, - { pollIntervalSeconds: 7 * 60 } // 7 minutes - ) + const response = await fetchHandler(process.env.NEXT_PUBLIC_CONFIGCAT_PROXY_URL + endpoint) + const options = { pollIntervalSeconds: 7 * 60 } // 7 minutes + if (response.status !== 200) { + // proxy is down, use default client + client = configcat.getClient( + process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', + configcat.PollingMode.AutoPoll, + options + ) + } else { + client = configcat.getClient('configcat-proxy/frontend-v2', configcat.PollingMode.AutoPoll, { + ...options, + baseUrl: process.env.NEXT_PUBLIC_CONFIGCAT_PROXY_URL, + }) + } return client } export async function getFlags(userEmail: string = '') { if (userEmail) { - return getClient().getAllValuesAsync(new configcat.User(userEmail)) + const client = await getClient() + return client.getAllValuesAsync(new configcat.User(userEmail)) } return [] diff --git a/apps/studio/next.config.js b/apps/studio/next.config.js index fff2ecd326..1e836d3a29 100644 --- a/apps/studio/next.config.js +++ b/apps/studio/next.config.js @@ -37,6 +37,9 @@ const HCAPTCHA_SUBDOMAINS_URL = 'https://*.hcaptcha.com' const HCAPTCHA_ASSET_URL = 'https://newassets.hcaptcha.com' const HCAPTCHA_JS_URL = 'https://js.hcaptcha.com' const CONFIGCAT_URL = 'https://cdn-global.configcat.com' +const CONFIGCAT_PROXY_URL = ['staging', 'local'].includes(process.env.NEXT_PUBLIC_ENVIRONMENT) + ? 'https://configcat.supabase.green' + : 'https://configcat.supabase.com' const STRIPE_SUBDOMAINS_URL = 'https://*.stripe.com' const STRIPE_JS_URL = 'https://js.stripe.com' const STRIPE_NETWORK_URL = 'https://*.stripe.network' @@ -63,7 +66,7 @@ const USERCENTRICS_APP_URL = 'https://app.usercentrics.eu' const PUSHER_URL = 'https://*.pusher.com' const PUSHER_URL_WS = 'wss://*.pusher.com' -const DEFAULT_SRC_URLS = `${API_URL} ${SUPABASE_URL} ${GOTRUE_URL} ${SUPABASE_LOCAL_PROJECTS_URL_WS} ${SUPABASE_PROJECTS_URL} ${SUPABASE_PROJECTS_URL_WS} ${HCAPTCHA_SUBDOMAINS_URL} ${CONFIGCAT_URL} ${STRIPE_SUBDOMAINS_URL} ${STRIPE_NETWORK_URL} ${CLOUDFLARE_URL} ${ONE_ONE_ONE_ONE_URL} ${VERCEL_INSIGHTS_URL} ${GITHUB_API_URL} ${GITHUB_USER_CONTENT_URL} ${SUPABASE_ASSETS_URL} ${USERCENTRICS_URLS}` +const DEFAULT_SRC_URLS = `${API_URL} ${SUPABASE_URL} ${GOTRUE_URL} ${SUPABASE_LOCAL_PROJECTS_URL_WS} ${SUPABASE_PROJECTS_URL} ${SUPABASE_PROJECTS_URL_WS} ${HCAPTCHA_SUBDOMAINS_URL} ${CONFIGCAT_URL} ${CONFIGCAT_PROXY_URL} ${STRIPE_SUBDOMAINS_URL} ${STRIPE_NETWORK_URL} ${CLOUDFLARE_URL} ${ONE_ONE_ONE_ONE_URL} ${VERCEL_INSIGHTS_URL} ${GITHUB_API_URL} ${GITHUB_USER_CONTENT_URL} ${SUPABASE_ASSETS_URL} ${USERCENTRICS_URLS}` const SCRIPT_SRC_URLS = `${CLOUDFLARE_CDN_URL} ${HCAPTCHA_JS_URL} ${STRIPE_JS_URL} ${SUPABASE_ASSETS_URL}` const FRAME_SRC_URLS = `${HCAPTCHA_ASSET_URL} ${STRIPE_JS_URL}` const IMG_SRC_URLS = `${SUPABASE_URL} ${SUPABASE_COM_URL} ${SUPABASE_PROJECTS_URL} ${GITHUB_USER_AVATAR_URL} ${GOOGLE_USER_AVATAR_URL} ${SUPABASE_ASSETS_URL} ${USERCENTRICS_APP_URL}` diff --git a/turbo.json b/turbo.json index 6f4c5c2e08..44a41baf26 100644 --- a/turbo.json +++ b/turbo.json @@ -53,6 +53,7 @@ "NEXT_PUBLIC_SITE_URL", "NEXT_PUBLIC_API_URL", "NEXT_PUBLIC_CONFIGCAT_SDK_KEY", + "NEXT_PUBLIC_CONFIGCAT_PROXY_URL", "NEXT_PUBLIC_HCAPTCHA_SITE_KEY", "NEXT_PUBLIC_SUPABASE_URL", "NEXT_PUBLIC_SUPABASE_ANON_KEY",