Skip to content

Commit fe6d3aa

Browse files
authored
Merge pull request #536 from ant-media/get-ice-config-from-server
Implement getIceServerConfig websocket command in webrtc_adaptor
2 parents cda4460 + 2cf196e commit fe6d3aa

File tree

3 files changed

+164
-0
lines changed

3 files changed

+164
-0
lines changed

src/main/js/webrtc_adaptor.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,15 @@ export class WebRTCAdaptor {
364364
*/
365365
this.pendingTryAgainTimerId = -1;
366366

367+
/**
368+
* Flag to indicate if peerconnection_config was provided by the user
369+
*/
370+
this.userDefinedIceServers = false;
371+
372+
if (initialValues && initialValues.peerconnection_config && initialValues.peerconnection_config.iceServers) {
373+
this.userDefinedIceServers = true;
374+
}
375+
367376
/**
368377
* All media management works for teh local stream are made by @MediaManager class.
369378
* for details please check @MediaManager
@@ -468,7 +477,19 @@ export class WebRTCAdaptor {
468477
this.checkWebSocketConnection();
469478
resolve("Wait 'initialized' callback from websocket");
470479
});
480+
}
471481

482+
/**
483+
* Called to get the ICE server configuration from the server
484+
* if user hasn't provided any ICE servers in initialization
485+
*/
486+
getIceServerConfiguration() {
487+
if (!this.userDefinedIceServers) {
488+
let jsCmd = {
489+
command: "getIceServerConfig"
490+
};
491+
this.webSocketAdaptor.send(JSON.stringify(jsCmd));
492+
}
472493
}
473494

474495
/**

src/main/js/websocket_adaptor.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ export class WebSocketAdaptor {
6060
this.connected = true;
6161
this.connecting = false;
6262
this.callback("initialized");
63+
64+
// Request ICE server configuration from server if user hasn't provided any
65+
this.webrtcadaptor.getIceServerConfiguration();
6366

6467
if (typeof callbackConnected != "undefined") {
6568
callbackConnected();
@@ -117,6 +120,38 @@ export class WebSocketAdaptor {
117120
this.join(obj.streamId);
118121
} else if (obj.command == "peerMessageCommand") {
119122
this.callback(obj.command, obj);
123+
} else if (obj.command == "iceServerConfig") {
124+
if (this.debug) {
125+
Logger.debug("received ice server config");
126+
}
127+
128+
if (obj.stunServerUri) {
129+
// Construct the iceServers configuration based on URI type
130+
if (obj.stunServerUri.startsWith("turn:")) {
131+
// For TURN server
132+
this.webrtcadaptor.peerconnection_config.iceServers = [
133+
{
134+
'urls': 'stun:stun1.l.google.com:19302'
135+
},
136+
{
137+
'urls': obj.stunServerUri,
138+
'username': obj.turnServerUsername || "",
139+
'credential': obj.turnServerCredential || ""
140+
}
141+
];
142+
} else if (obj.stunServerUri.startsWith("stun:")) {
143+
// For STUN server
144+
this.webrtcadaptor.peerconnection_config.iceServers = [
145+
{
146+
'urls': obj.stunServerUri
147+
}
148+
];
149+
}
150+
151+
if (this.debug) {
152+
Logger.debug("ice servers updated: " + JSON.stringify(this.webrtcadaptor.peerconnection_config.iceServers));
153+
}
154+
}
120155
}
121156
}
122157

src/test/js/webrtc_adaptor.test.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { WebRTCAdaptor } from '../../main/js/webrtc_adaptor.js';
22
import { MediaManager } from "../../main/js/media_manager.js";
33
import { PeerStats } from "../../main/js/peer_stats.js";
4+
import { WebSocketAdaptor } from '../../main/js/websocket_adaptor.js';
45

6+
// Add this before the ICE ServerConfig debug logging test to mock Logger
7+
window.Logger = { debug: () => {} };
58

69
describe("WebRTCAdaptor", function() {
710

@@ -2104,3 +2107,108 @@ describe("WebRTCAdaptor", function() {
21042107

21052108

21062109
});
2110+
2111+
describe("ICE Server Configuration", function() {
2112+
it("should set userDefinedIceServers to true if peerconnection_config is provided", function() {
2113+
const adaptor = new WebRTCAdaptor({
2114+
websocketURL: "ws://example.com",
2115+
peerconnection_config: { iceServers: [{ urls: "stun:custom" }] },
2116+
initializeComponents: false
2117+
});
2118+
expect(adaptor.userDefinedIceServers).to.be.true;
2119+
2120+
const adaptor2 = new WebRTCAdaptor({
2121+
websocketURL: "ws://example.com",
2122+
peerconnection_config: { sdpSemantics: 'unified-plan' },
2123+
initializeComponents: false
2124+
});
2125+
expect(adaptor2.userDefinedIceServers).to.be.false;
2126+
});
2127+
2128+
it("should set userDefinedIceServers to false if peerconnection_config is not provided", function() {
2129+
const adaptor = new WebRTCAdaptor({
2130+
websocketURL: "ws://example.com",
2131+
initializeComponents: false
2132+
});
2133+
expect(adaptor.userDefinedIceServers).to.be.false;
2134+
});
2135+
2136+
it("getIceServerConfiguration should send getIceServerConfig if userDefinedIceServers is false", function() {
2137+
const adaptor = new WebRTCAdaptor({
2138+
websocketURL: "ws://example.com",
2139+
initializeComponents: false
2140+
});
2141+
adaptor.userDefinedIceServers = false;
2142+
adaptor.webSocketAdaptor = { send: sinon.fake() };
2143+
adaptor.getIceServerConfiguration();
2144+
expect(adaptor.webSocketAdaptor.send.calledOnce).to.be.true;
2145+
const sentArg = JSON.parse(adaptor.webSocketAdaptor.send.firstCall.args[0]);
2146+
expect(sentArg.command).to.equal("getIceServerConfig");
2147+
});
2148+
2149+
it("getIceServerConfiguration should NOT send getIceServerConfig if userDefinedIceServers is true", function() {
2150+
const adaptor = new WebRTCAdaptor({
2151+
websocketURL: "ws://example.com",
2152+
initializeComponents: false
2153+
});
2154+
adaptor.userDefinedIceServers = true;
2155+
adaptor.webSocketAdaptor = { send: sinon.fake() };
2156+
adaptor.getIceServerConfiguration();
2157+
expect(adaptor.webSocketAdaptor.send.called).to.be.false;
2158+
});
2159+
});
2160+
2161+
describe("WebSocketAdaptor ICE ServerConfig Integration", function() {
2162+
let originalLogger;
2163+
let originalLog;
2164+
before(function() {
2165+
// Save and mock Logger and log for debug test
2166+
originalLogger = window.Logger;
2167+
originalLog = window.log;
2168+
window.log = { debug: () => {} };
2169+
window.Logger = window.log;
2170+
});
2171+
after(function() {
2172+
window.Logger = originalLogger;
2173+
window.log = originalLog;
2174+
});
2175+
2176+
it("should update peerconnection_config.iceServers for TURN server via real onmessage", function() {
2177+
const adaptor = { peerconnection_config: { iceServers: [] } };
2178+
const wsAdaptor = new WebSocketAdaptor({ websocket_url: "ws://example.com", webrtcadaptor: adaptor });
2179+
wsAdaptor.debug = false;
2180+
wsAdaptor.wsConn = {};
2181+
wsAdaptor.initWebSocketConnection();
2182+
const event = {
2183+
data: JSON.stringify({
2184+
command: "iceServerConfig",
2185+
stunServerUri: "turn:turn.example.com",
2186+
turnServerUsername: "user",
2187+
turnServerCredential: "pass"
2188+
})
2189+
};
2190+
wsAdaptor.wsConn.onmessage(event);
2191+
expect(adaptor.peerconnection_config.iceServers.length).to.equal(2);
2192+
expect(adaptor.peerconnection_config.iceServers[1].urls).to.equal("turn:turn.example.com");
2193+
expect(adaptor.peerconnection_config.iceServers[1].username).to.equal("user");
2194+
expect(adaptor.peerconnection_config.iceServers[1].credential).to.equal("pass");
2195+
});
2196+
2197+
it("should update peerconnection_config.iceServers for STUN server via real onmessage", function() {
2198+
const adaptor = { peerconnection_config: { iceServers: [] } };
2199+
const wsAdaptor = new WebSocketAdaptor({ websocket_url: "ws://example.com", webrtcadaptor: adaptor });
2200+
wsAdaptor.debug = false;
2201+
wsAdaptor.wsConn = {};
2202+
wsAdaptor.initWebSocketConnection();
2203+
const event = {
2204+
data: JSON.stringify({
2205+
command: "iceServerConfig",
2206+
stunServerUri: "stun:stun.example.com"
2207+
})
2208+
};
2209+
wsAdaptor.wsConn.onmessage(event);
2210+
expect(adaptor.peerconnection_config.iceServers.length).to.equal(1);
2211+
expect(adaptor.peerconnection_config.iceServers[0].urls).to.equal("stun:stun.example.com");
2212+
});
2213+
2214+
});

0 commit comments

Comments
 (0)