fix(sfu): use concrete WebRTC listen IP for browser-consumable ICE candidates
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { randomUUID } from 'crypto';
|
||||
import { networkInterfaces } from 'os';
|
||||
|
||||
import { mediaConfig } from '../config';
|
||||
import type {
|
||||
@@ -39,6 +40,45 @@ const parsePort = (value: string | undefined, fallback: number): number => {
|
||||
return parsed;
|
||||
};
|
||||
|
||||
const pickHostIpv4 = (): string | null => {
|
||||
const interfaces = networkInterfaces();
|
||||
for (const addresses of Object.values(interfaces)) {
|
||||
if (!addresses) continue;
|
||||
for (const address of addresses) {
|
||||
if (address.family === 'IPv4' && !address.internal) {
|
||||
return address.address;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
const resolveListenAddress = (): { ip: string; announcedAddress?: string } => {
|
||||
const configuredListenIp = (process.env.MEDIA_WEBRTC_LISTEN_IP ?? '').trim();
|
||||
const configuredAnnounced = process.env.MEDIA_WEBRTC_ANNOUNCED_IP?.trim();
|
||||
|
||||
if (configuredListenIp && configuredListenIp !== '0.0.0.0') {
|
||||
return {
|
||||
ip: configuredListenIp,
|
||||
...(configuredAnnounced ? { announcedAddress: configuredAnnounced } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
const discoveredIp = pickHostIpv4();
|
||||
if (!configuredAnnounced && configuredListenIp === '0.0.0.0') {
|
||||
console.warn(
|
||||
`[sfu] MEDIA_WEBRTC_LISTEN_IP is 0.0.0.0 without MEDIA_WEBRTC_ANNOUNCED_IP. ` +
|
||||
`Using ${discoveredIp ?? '127.0.0.1'} for ICE candidates. Configure both env vars for production.`,
|
||||
);
|
||||
}
|
||||
|
||||
const ip = discoveredIp ?? '127.0.0.1';
|
||||
return {
|
||||
ip,
|
||||
...(configuredAnnounced ? { announcedAddress: configuredAnnounced } : {}),
|
||||
};
|
||||
};
|
||||
|
||||
const toTransportOptions = (transport: any): SfuTransportOptions => ({
|
||||
id: transport.id,
|
||||
iceParameters: transport.iceParameters ?? {},
|
||||
@@ -105,19 +145,18 @@ export class MediasoupSfuService implements SfuService {
|
||||
}
|
||||
|
||||
private async createWebRtcTransport(router: any): Promise<any> {
|
||||
const listenIp = process.env.MEDIA_WEBRTC_LISTEN_IP ?? '0.0.0.0';
|
||||
const announcedAddress = process.env.MEDIA_WEBRTC_ANNOUNCED_IP?.trim();
|
||||
const listenAddress = resolveListenAddress();
|
||||
return await router.createWebRtcTransport({
|
||||
listenInfos: [
|
||||
{
|
||||
protocol: 'udp',
|
||||
ip: listenIp,
|
||||
...(announcedAddress ? { announcedAddress } : {}),
|
||||
ip: listenAddress.ip,
|
||||
...(listenAddress.announcedAddress ? { announcedAddress: listenAddress.announcedAddress } : {}),
|
||||
},
|
||||
{
|
||||
protocol: 'tcp',
|
||||
ip: listenIp,
|
||||
...(announcedAddress ? { announcedAddress } : {}),
|
||||
ip: listenAddress.ip,
|
||||
...(listenAddress.announcedAddress ? { announcedAddress: listenAddress.announcedAddress } : {}),
|
||||
},
|
||||
],
|
||||
enableUdp: true,
|
||||
@@ -364,4 +403,3 @@ export class MediasoupSfuService implements SfuService {
|
||||
return consumerDescriptor;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user