Пользователь WhatsApp инициировал звонки, не работая над в прямом эфиреJavascript

Форум по Javascript
Ответить
Anonymous
 Пользователь WhatsApp инициировал звонки, не работая над в прямом эфире

Сообщение Anonymous »

Я реализовал инициированные пользователи WhatsApp с использованием WEBRTC, Nodejs, ReactJS. Он работает должным образом на местном, но не работаю над Live, я нахожусь на обоих концах, кажется похожим и нормальным, но в прямом эфире вызовет, когда он станет замужем через 20 секунд. На местном он работает нормально. Ниже приведен код для обработки инициированных пользовательских вызовов от WhatsApp.const handleUserInitiatedCallRequest = async ({ req, res }) => {
let db;
try {
// Extract and validate webhook data
const change = req.body.entry?.[0]?.changes?.[0] || {};
const call = change?.value?.calls?.[0] || {};
const callId = call?.id;
const receivedSdp = call.session?.sdp;
const WHATSAPP_BUSINESS_ACCOUNT_ID =
change.value?.metadata?.phone_number_id;

let tenantIdRes = await getTenantIdFromUserMetaData(
`whatsapp_id`,
WHATSAPP_BUSINESS_ACCOUNT_ID
);

tenant_id = tenantIdRes?.tenant_id;

const io = getIO();

db = await getUserDBfromRequest({ tenant_id });

let contactDetails =
(await getChatUserDetailsById(db, call?.from, {
platform: "whatsapp",
})) || {};

if (!callId || !receivedSdp || !WHATSAPP_BUSINESS_ACCOUNT_ID) {
console.error("Missing required call data:", {
callId,
receivedSdp,
WHATSAPP_BUSINESS_ACCOUNT_ID,
chat_user: contactDetails,
});
return;
}

const callerName = call?.from || "Unknown";
const callerNumber = call?.from || "Unknown";

console.log(`Incoming WhatsApp call from ${callerName} (${callerNumber})`);
io.emit(`whatsapp_calling_incoming_request_${tenant_id}`, {
callId,
callerName,
callerNumber,
chat_user: contactDetails,
});

setActiveCalls({
callId,
value: {
whatsappOfferSdp: receivedSdp,
phone_number_id: WHATSAPP_BUSINESS_ACCOUNT_ID,
},
});

await initiateWebRTCBridge({ callId });
} catch (error) {
if (db) db.destroy();
console.error("Error handling call request:", getAxiosError(error));
}
};

async function initiateWebRTCBridge({ callId }) {
try {
const { getIO } = require("../../../../../sockets");
let io = getIO();
let browserOfferSdp = activeCalls[callId]?.browserOfferSdp;
let whatsappOfferSdp = activeCalls[callId]?.whatsappOfferSdp;
let browserSocket = io;
let whatsappPc = activeCalls[callId]?.whatsappPc;
if (!browserOfferSdp || !whatsappOfferSdp || !browserSocket) return;

// --- Setup browser peer connection ---
activeCalls[callId].browserPc = new RTCPeerConnection({
iceServers: STUN_SERVERS,
});
activeCalls[callId].browserStream = new MediaStream();

activeCalls[callId].browserPc.ontrack = (event) => {
console.log("Audio track received from browser.");
event.streams[0]
.getTracks()
.forEach((track) => activeCalls[callId].browserStream.addTrack(track));
};

activeCalls[callId].browserPc.onicecandidate = (event) => {
if (event.candidate) {
browserSocket.emit("whatsapp-calling-browser-candidate", {
candidate: event.candidate,
callId,
});
}
};

try {
sdpTransform.parse(sanitizeSdp(browserOfferSdp)); // pinpoints the bad line
} catch (e) {
console.error("Bad SDP from browser:", e);
}

const cleanSdp = sanitizeSdp(browserOfferSdp);

await activeCalls[callId].browserPc.setRemoteDescription(
new RTCSessionDescription(cleanSdp, "offer")
);
console.log("Browser offer SDP set as remote description.");

// --- Setup WhatsApp peer connection ---
whatsappPc = new RTCPeerConnection({ iceServers: STUN_SERVERS });

const waTrackPromise = new Promise((resolve, reject) => {
const timeout = setTimeout(
() => reject("Timed out waiting for WhatsApp track"),
10000
);
whatsappPc.ontrack = (event) => {
clearTimeout(timeout);
console.log("Audio track received from WhatsApp.");
whatsappStream = event.streams[0];
resolve();
};

whatsappPc.onicecandidate = (e) => {
console.log(
"[WA-PC] cand:",
e.candidate?.candidate || "end-of-candidates"
);
};
whatsappPc.oniceconnectionstatechange = () => {
console.log("[WA-PC] ice:", whatsappPc.iceConnectionState);
};
});

await whatsappPc.setRemoteDescription(
new RTCSessionDescription(whatsappOfferSdp, "offer")
);
console.log("WhatsApp offer SDP set as remote description.");

// Forward browser mic to WhatsApp
activeCalls[callId].browserStream?.getAudioTracks().forEach((track) => {
console.log(track, "

Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-on-live
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»