in src/app/lib/realtimeConnection.ts [3:44]
export async function createRealtimeConnection(
EPHEMERAL_KEY: string,
audioElement: RefObject<HTMLAudioElement | null>
): Promise<{ pc: RTCPeerConnection; dc: RTCDataChannel }> {
const pc = new RTCPeerConnection();
pc.ontrack = (e) => {
if (audioElement.current) {
audioElement.current.srcObject = e.streams[0];
}
};
const ms = await navigator.mediaDevices.getUserMedia({ audio: true });
pc.addTrack(ms.getTracks()[0]);
const dc = pc.createDataChannel("oai-events");
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const baseUrl = "https://api.openai.com/v1/realtime";
const model = "gpt-4o-realtime-preview-2024-12-17";
const sdpResponse = await fetch(`${baseUrl}?model=${model}`, {
method: "POST",
body: offer.sdp,
headers: {
Authorization: `Bearer ${EPHEMERAL_KEY}`,
"Content-Type": "application/sdp",
},
});
const answerSdp = await sdpResponse.text();
const answer: RTCSessionDescriptionInit = {
type: "answer",
sdp: answerSdp,
};
await pc.setRemoteDescription(answer);
return { pc, dc };
}