fix: use configcat proxy (#36130)

* fix: use configcat proxy

* fix: add fallback to origin

* chore: fix test
This commit is contained in:
Kang Ming
2025-06-10 06:19:52 +03:00
committed by GitHub
parent 3c390c7891
commit cacfe7fb12
4 changed files with 38 additions and 8 deletions

View File

@@ -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<typeof vi.fn>
mockFetchHandler.mockResolvedValueOnce(
new Response(JSON.stringify({}), {
status: 200,
})
)
const result = await getFlags(email)
expect(configcat.User).toHaveBeenCalledWith(email)

View File

@@ -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 []

View File

@@ -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}`

View File

@@ -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",