Files
supabase/apps/studio/lib/api/edgeFunctions.ts
2026-07-16 14:06:40 +01:00

59 lines
1.9 KiB
TypeScript

import { IS_PLATFORM } from '@/lib/constants'
const NIMBUS_PROD_PROJECTS_URL = process.env.NIMBUS_PROD_PROJECTS_URL
// Cron jobs and database hooks run inside Postgres, where Kong is available by this network alias.
const SELF_HOSTED_EDGE_FUNCTIONS_URL = 'http://kong:8000/functions/v1'
const PLATFORM_TLDS = ['co', 'red'] as const
export const buildDatabaseEdgeFunctionUrl = (
slug: string,
projectRef: string,
restUrl?: string,
isPlatform = IS_PLATFORM
) => {
if (!isPlatform) return `${SELF_HOSTED_EDGE_FUNCTIONS_URL}/${slug}`
const projectOrigin = restUrl ? new URL(restUrl).origin : `https://${projectRef}.supabase.co`
return `${projectOrigin}/functions/v1/${slug}`
}
export const isEdgeFunctionUrl = (
url: string,
projectRef: string,
restUrl?: string,
isPlatform = IS_PLATFORM
) => {
if (!isPlatform && url.startsWith(`${SELF_HOSTED_EDGE_FUNCTIONS_URL}/`)) return true
const projectOrigin = restUrl ? new URL(restUrl).origin : undefined
if (projectOrigin && url.startsWith(`${projectOrigin}/functions/v1/`)) return true
return PLATFORM_TLDS.some(
(tld) =>
url.startsWith(`https://${projectRef}.functions.supabase.${tld}/`) ||
url.startsWith(`https://${projectRef}.supabase.${tld}/functions/`)
)
}
export const isValidEdgeFunctionURL = (url: string, isPlatform: boolean) => {
if (NIMBUS_PROD_PROJECTS_URL !== undefined) {
const apexDomain = NIMBUS_PROD_PROJECTS_URL.replace('https://*.', '').replace(/\./g, '\\.')
const nimbusRegex = new RegExp('^https://[a-z]*\\.' + apexDomain + '/functions/v[0-9]{1}/.*$')
return nimbusRegex.test(url)
}
if (!isPlatform) {
const regexValidLocalEdgeFunctionURL = new RegExp(
/^https?:\/\/[^\s/?#]+\/functions\/v[0-9]{1}\/.*$/
)
return regexValidLocalEdgeFunctionURL.test(url)
}
const regexValidEdgeFunctionURL = new RegExp(
/^https:\/\/[a-z]{20}\.supabase\.(red|co)\/functions\/v[0-9]{1}\/.*$/
)
return regexValidEdgeFunctionURL.test(url)
}