Files
KVideo/lib/server/runtime-features.ts
T

52 lines
1.4 KiB
TypeScript

import 'server-only';
import type { RuntimeFeatures } from '@/lib/config/runtime-features';
function isVercelDeployment(): boolean {
return process.env.VERCEL === '1' || Boolean(process.env.VERCEL_ENV);
}
function isCloudflareDeployment(): boolean {
return (
process.env.CF_PAGES === '1' ||
Boolean(process.env.CF_PAGES_URL) ||
Boolean(process.env.CLOUDFLARE_ACCOUNT_ID) ||
Boolean(process.env.CF_ACCOUNT_ID) ||
Boolean(process.env.WORKERS_CI)
);
}
function getRestrictedFeatures(
deploymentProvider: RuntimeFeatures['deploymentProvider'],
deploymentProviderLabel: string
): RuntimeFeatures {
return {
deploymentProvider,
deploymentProviderLabel,
restrictedManagedDeployment: true,
mediaProxyEnabled: false,
iptvEnabled: false,
restrictionSummary: `${deploymentProviderLabel} 托管部署会启用合规模式:关闭外部媒体代理、热链转发和 IPTV 流中继。需要这些能力时请改用 Docker 或传统 Node.js 自托管。`,
};
}
export function getRuntimeFeatures(): RuntimeFeatures {
if (isVercelDeployment()) {
return getRestrictedFeatures('vercel', 'Vercel');
}
if (isCloudflareDeployment()) {
return getRestrictedFeatures('cloudflare', 'Cloudflare');
}
return {
deploymentProvider: 'self-hosted',
deploymentProviderLabel: '自托管',
restrictedManagedDeployment: false,
mediaProxyEnabled: true,
iptvEnabled: true,
restrictionSummary: null,
};
}