Skip to content

Commit c7c04ee

Browse files
authored
feat: add ice servers to WebRTC (#155)
This adds the default ice servers of aiortc to the WebRTC handshake. Signed-off-by: Patrick Gehrsitz <github@mryel.de>
1 parent e9a447d commit c7c04ee

1 file changed

Lines changed: 17 additions & 7 deletions

File tree

spyglass/server/webrtc_whep.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
from collections import deque
66
from fractions import Fraction
77
from http import HTTPStatus
8-
from typing import TYPE_CHECKING
8+
from typing import TYPE_CHECKING, Union
99

10+
from aiortc import RTCIceGatherer, RTCIceServer
1011
from picamera2.outputs import Output
1112

1213
from spyglass import WEBRTC_ENABLED
@@ -78,9 +79,9 @@ def response_headers() -> None:
7879
):
7980
response_headers()
8081
handler.send_header("Access-Control-Expose-Headers", "Link")
81-
ice_servers = get_ICE_servers()
82+
ice_servers = get_ICE_servers_header()
8283
if ice_servers is not None:
83-
handler.headers["Link"] = ice_servers
84+
handler.send_header("Link", ice_servers)
8485
handler.end_headers()
8586

8687

@@ -160,9 +161,9 @@ async def on_connectionstatechange() -> None:
160161
"Access-Control-Expose-Headers", "ETag, ID, Accept-Patch, Link, Location"
161162
)
162163
handler.send_header("Accept-Patch", "application/trickle-ice-sdpfrag")
163-
ice_servers = get_ICE_servers()
164+
ice_servers = get_ICE_servers_header()
164165
if ice_servers is not None:
165-
handler.headers["Link"] = ice_servers
166+
handler.send_header("Link", ice_servers)
166167
handler.send_header("Location", f"/whep/{secret}")
167168
handler.send_header("Content-Length", str(len(pc.localDescription.sdp)))
168169
handler.end_headers()
@@ -196,8 +197,17 @@ async def do_PATCH_async(streaming_handler: StreamingHandler) -> None:
196197
streaming_handler.end_headers()
197198

198199

199-
def get_ICE_servers() -> None:
200-
return None
200+
def get_ICE_servers_header() -> str | None:
201+
links = []
202+
ice_servers: list[RTCIceServer] = RTCIceGatherer.getDefaultIceServers()
203+
for ice in ice_servers:
204+
urls: Union[str, list[str]] = ice.urls
205+
if isinstance(urls, str):
206+
urls = [urls]
207+
208+
links.extend([f'<{url}>; rel="ice-server"' for url in urls if url])
209+
210+
return ",".join(links) if links else None
201211

202212

203213
def parse_ice_candidates(sdp_message: str) -> list[RTCIceCandidate]:

0 commit comments

Comments
 (0)