生产环境中WebRTC与OpenAI实时API通过Cloudflare Workers连接失败
问题:Cloudflare Workers部署后WebRTC无法连接OpenAI实时API
我正在开发一个基于WebRTC的实时应用,前端(浏览器)通过部署在Cloudflare Workers上的信令服务器连接OpenAI实时API,项目参考了Cloudflare Workers的示例代码实现信令逻辑。该应用在本地localhost环境下可正常运行,但部署到Cloudflare Workers生产环境后无法建立对等连接,进入failed状态,重试连接也无效。
具体流程如下:
- 前端(浏览器)生成SDP Offer并发送至Worker的
/rtc-connect端点,代码如下:
peerConnection = new RTCPeerConnection(); dataChannel = peerConnection.createDataChannel('response'); peerConnection.createOffer().then((offer) => { peerConnection.setLocalDescription(offer); fetch('/rtc-connect', { method: 'POST', body: offer.sdp, headers: { 'Content-Type': 'application/sdp', }, }) .then((r) => r.text()) .then((answer) => { peerConnection.setRemoteDescription({ sdp: answer, type: 'answer', }); }) .catch((error) => console.error("Error in signaling:", error)); });
- Worker将SDP Offer转发至OpenAI实时API;
- 浏览器设置远程SDP描述并与OpenAI交换ICE候选。
Worker端app.js中的相关代码如下:
app.post('/rtc-connect', async (c) => { const body = await c.req.text(); const url = new URL('https://api.openai.com/v1/realtime'); url.searchParams.set('model', 'gpt-4o-realtime-preview-2024-12-17'); url.searchParams.set('instructions', DEFAULT_INSTRUCTIONS); url.searchParams.set('voice', 'ash'); const response = await fetch(url.toString(), { method: 'POST', body, headers: { Authorization: `Bearer ${c.env.OPENAI_API_KEY}`, 'Content-Type': 'application/sdp', }, }); if (!response.ok) { const errorText = await response.text(); console.error('OpenAI API Error:', errorText); return c.text(errorText, 500); } const sdp = await response.text(); console.log('OpenAI SDP Answer:', sdp); return c.body(sdp, { headers: { 'Content-Type': 'application/sdp', }, }); });
请问我遗漏了什么配置或步骤?
可能的遗漏配置及解决步骤
1. CORS跨域配置缺失
Cloudflare Workers生产环境下的CORS检查远严于本地环境,必须添加明确的跨域响应头。在Worker路由处理前添加全局CORS配置:
// 全局CORS处理 app.use(async (c, next) => { // 生产环境建议替换为具体域名,避免使用* c.res.headers.set('Access-Control-Allow-Origin', '*'); c.res.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); c.res.headers.set('Access-Control-Allow-Headers', 'Content-Type'); // 处理OPTIONS预检请求 if (c.req.method === 'OPTIONS') { return new Response(null, { status: 204 }); } await next(); });
2. ICE候选交换未正确实现
仅处理SDP Offer/Answer不足以建立WebRTC连接,必须通过信令服务器转发ICE候选:
- 前端监听
icecandidate事件,发送候选到Worker新端点:
peerConnection.onicecandidate = (event) => { if (event.candidate) { fetch('/ice-candidate', { method: 'POST', body: JSON.stringify(event.candidate), headers: { 'Content-Type': 'application/json' } }); } };
- Worker添加
/ice-candidate路由,将候选转发给OpenAI(需维护会话关联,可通过请求中的标识匹配对应连接):
app.post('/ice-candidate', async (c) => { const candidate = await c.req.json(); const response = await fetch('https://api.openai.com/v1/realtime/ice-candidate', { method: 'POST', body: JSON.stringify(candidate), headers: { Authorization: `Bearer ${c.env.OPENAI_API_KEY}`, 'Content-Type': 'application/json' } }); if (!response.ok) { console.error('OpenAI ICE Error:', await response.text()); return c.text('Failed to send ICE candidate', 500); } return c.text('OK', 200); });
3. Cloudflare Workers请求超时与配额限制
- Worker默认请求超时为10秒,WebRTC信令交互可能超时,需手动设置更长超时:
const response = await fetch(url.toString(), { method: 'POST', body, headers: { /* ... */ }, signal: AbortSignal.timeout(30000) // 设置30秒超时 });
- 检查Worker的CPU时间配额,若超过会被强制中断,可通过Cloudflare控制台查看资源使用情况。
4. SDP内容与ICE服务器兼容性
检查OpenAI返回的SDP中的a=ice-server字段,确保浏览器能访问对应的STUN/TURN服务器。部分服务器可能被Cloudflare网络拦截,需确认连通性。
5. Cloudflare安全规则拦截
检查Cloudflare的WAF、防火墙规则,是否拦截了WebRTC相关的POST请求(比如ICE候选接口)。可临时禁用规则测试,或添加允许Worker端点的放行规则。
6. 生产环境变量配置错误
确认Cloudflare Workers生产环境中已正确配置OPENAI_API_KEY,且该密钥拥有OpenAI实时API的访问权限。本地环境的密钥配置不会自动同步到生产环境,需手动在Cloudflare控制台设置。
内容的提问来源于stack exchange,提问作者Sansei
相关产品推荐
相关产品推荐

