Я реализовал инициированные пользователи 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
Пользователь WhatsApp инициировал звонки, не работая над в прямом эфире ⇐ Javascript
Форум по Javascript
1756558018
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, "
Подробнее здесь: [url]https://stackoverflow.com/questions/79751137/whatsapp-user-initiated-calling-not-working-on-live[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия