Skip to content

Commit 1f64bf6

Browse files
Sean-DerNabos
andcommitted
Add Server Trickle ICE Support
Co-authored-by: Nabos <2191596-nabos@users.noreply.gitlab.com>
1 parent ee384f0 commit 1f64bf6

8 files changed

Lines changed: 173 additions & 99 deletions

File tree

go.mod

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ require (
88
github.com/google/uuid v1.6.0
99
github.com/joho/godotenv v1.5.1
1010
github.com/pion/dtls/v3 v3.0.10
11-
github.com/pion/ice/v3 v3.0.16
11+
github.com/pion/ice/v4 v4.2.0
1212
github.com/pion/interceptor v0.1.43
1313
github.com/pion/rtcp v1.2.16
1414
github.com/pion/rtp v1.10.0
@@ -20,19 +20,13 @@ require (
2020
require (
2121
github.com/davecgh/go-spew v1.1.1 // indirect
2222
github.com/pion/datachannel v1.6.0 // indirect
23-
github.com/pion/dtls/v2 v2.2.12 // indirect
24-
github.com/pion/ice/v4 v4.2.0 // indirect
2523
github.com/pion/logging v0.2.4 // indirect
2624
github.com/pion/mdns/v2 v2.1.0 // indirect
2725
github.com/pion/randutil v0.1.0 // indirect
2826
github.com/pion/sctp v1.9.2 // indirect
2927
github.com/pion/srtp/v3 v3.0.10 // indirect
30-
github.com/pion/stun/v2 v2.0.0 // indirect
3128
github.com/pion/stun/v3 v3.1.1 // indirect
32-
github.com/pion/transport/v2 v2.2.10 // indirect
33-
github.com/pion/transport/v3 v3.1.1 // indirect
3429
github.com/pion/transport/v4 v4.0.1 // indirect
35-
github.com/pion/turn/v3 v3.0.3 // indirect
3630
github.com/pion/turn/v4 v4.1.4 // indirect
3731
github.com/pmezard/go-difflib v1.0.0 // indirect
3832
github.com/wlynxg/anet v0.0.5 // indirect

go.sum

Lines changed: 0 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
21
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
32
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
43
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -11,18 +10,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
1110
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
1211
github.com/pion/datachannel v1.6.0 h1:XecBlj+cvsxhAMZWFfFcPyUaDZtd7IJvrXqlXD/53i0=
1312
github.com/pion/datachannel v1.6.0/go.mod h1:ur+wzYF8mWdC+Mkis5Thosk+u/VOL287apDNEbFpsIk=
14-
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
15-
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
16-
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
1713
github.com/pion/dtls/v3 v3.0.10 h1:k9ekkq1kaZoxnNEbyLKI8DI37j/Nbk1HWmMuywpQJgg=
1814
github.com/pion/dtls/v3 v3.0.10/go.mod h1:YEmmBYIoBsY3jmG56dsziTv/Lca9y4Om83370CXfqJ8=
19-
github.com/pion/ice/v3 v3.0.16 h1:YoPlNg3jU1UT/DDTa9v/g1vH6A2/pAzehevI1o66H8E=
20-
github.com/pion/ice/v3 v3.0.16/go.mod h1:SdmubtIsCcvdb1ZInrTUz7Iaqi90/rYd1pzbzlMxsZg=
2115
github.com/pion/ice/v4 v4.2.0 h1:jJC8S+CvXCCvIQUgx+oNZnoUpt6zwc34FhjWwCU4nlw=
2216
github.com/pion/ice/v4 v4.2.0/go.mod h1:EgjBGxDgmd8xB0OkYEVFlzQuEI7kWSCFu+mULqaisy4=
2317
github.com/pion/interceptor v0.1.43 h1:6hmRfnmjogSs300xfkR0JxYFZ9k5blTEvCD7wxEDuNQ=
2418
github.com/pion/interceptor v0.1.43/go.mod h1:BSiC1qKIJt1XVr3l3xQ2GEmCFStk9tx8fwtCZxxgR7M=
25-
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
2619
github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8=
2720
github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so=
2821
github.com/pion/mdns/v2 v2.1.0 h1:3IJ9+Xio6tWYjhN6WwuY142P/1jA0D5ERaIqawg/fOY=
@@ -39,98 +32,32 @@ github.com/pion/sdp/v3 v3.0.17 h1:9SfLAW/fF1XC8yRqQ3iWGzxkySxup4k4V7yN8Fs8nuo=
3932
github.com/pion/sdp/v3 v3.0.17/go.mod h1:9tyKzznud3qiweZcD86kS0ff1pGYB3VX+Bcsmkx6IXo=
4033
github.com/pion/srtp/v3 v3.0.10 h1:tFirkpBb3XccP5VEXLi50GqXhv5SKPxqrdlhDCJlZrQ=
4134
github.com/pion/srtp/v3 v3.0.10/go.mod h1:3mOTIB0cq9qlbn59V4ozvv9ClW/BSEbRp4cY0VtaR7M=
42-
github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0=
43-
github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ=
4435
github.com/pion/stun/v3 v3.1.1 h1:CkQxveJ4xGQjulGSROXbXq94TAWu8gIX2dT+ePhUkqw=
4536
github.com/pion/stun/v3 v3.1.1/go.mod h1:qC1DfmcCTQjl9PBaMa5wSn3x9IPmKxSdcCsxBcDBndM=
46-
github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
47-
github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
48-
github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q=
49-
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
50-
github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
5137
github.com/pion/transport/v3 v3.1.1 h1:Tr684+fnnKlhPceU+ICdrw6KKkTms+5qHMgw6bIkYOM=
5238
github.com/pion/transport/v3 v3.1.1/go.mod h1:+c2eewC5WJQHiAA46fkMMzoYZSuGzA/7E2FPrOYHctQ=
5339
github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o=
5440
github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM=
55-
github.com/pion/turn/v3 v3.0.3 h1:1e3GVk8gHZLPBA5LqadWYV60lmaKUaHCkm9DX9CkGcE=
56-
github.com/pion/turn/v3 v3.0.3/go.mod h1:vw0Dz420q7VYAF3J4wJKzReLHIo2LGp4ev8nXQexYsc=
5741
github.com/pion/turn/v4 v4.1.4 h1:EU11yMXKIsK43FhcUnjLlrhE4nboHZq+TXBIi3QpcxQ=
5842
github.com/pion/turn/v4 v4.1.4/go.mod h1:ES1DXVFKnOhuDkqn9hn5VJlSWmZPaRJLyBXoOeO/BmQ=
5943
github.com/pion/webrtc/v4 v4.2.3 h1:RtdWDnkenNQGxUrZqWa5gSkTm5ncsLg5d+zu0M4cXt4=
6044
github.com/pion/webrtc/v4 v4.2.3/go.mod h1:7vsyFzRzaKP5IELUnj8zLcglPyIT6wWwqTppBZ1k6Kc=
6145
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
6246
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
63-
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
64-
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
65-
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
66-
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
67-
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
68-
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
69-
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
7047
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
7148
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
72-
github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
7349
github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
7450
github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
75-
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
76-
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
77-
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
78-
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
79-
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
80-
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
8151
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
8252
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
83-
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
84-
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
85-
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
86-
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
87-
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
88-
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
89-
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
90-
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
91-
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
92-
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
9353
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
9454
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
95-
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
96-
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
97-
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
98-
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
99-
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
100-
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
101-
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
102-
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
103-
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
104-
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
105-
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
106-
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
107-
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
10855
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
10956
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
110-
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
111-
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
112-
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
113-
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
114-
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
115-
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
116-
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
117-
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
118-
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
119-
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
120-
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
121-
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
122-
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
123-
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
12457
golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
12558
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
126-
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
127-
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
128-
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
129-
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
130-
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
13159
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
13260
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
13361
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
134-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
13562
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
13663
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/networktest/networktest.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"strings"
1212
"time"
1313

14-
"github.com/pion/ice/v3"
14+
"github.com/pion/ice/v4"
1515
"github.com/pion/sdp/v3"
1616
"github.com/pion/webrtc/v4"
1717

@@ -24,15 +24,15 @@ func Run(whepHandler func(res http.ResponseWriter, req *http.Request)) error {
2424
return err
2525
}
2626

27-
s := webrtc.SettingEngine{}
28-
s.SetNetworkTypes([]webrtc.NetworkType{
29-
webrtc.NetworkTypeUDP4,
30-
webrtc.NetworkTypeUDP6,
31-
webrtc.NetworkTypeTCP4,
32-
webrtc.NetworkTypeTCP6,
33-
})
27+
s := webrtc.SettingEngine{}
28+
s.SetNetworkTypes([]webrtc.NetworkType{
29+
webrtc.NetworkTypeUDP4,
30+
webrtc.NetworkTypeUDP6,
31+
webrtc.NetworkTypeTCP4,
32+
webrtc.NetworkTypeTCP6,
33+
})
3434

35-
peerConnection, err := webrtc.NewAPI(webrtc.WithMediaEngine(m), webrtc.WithSettingEngine(s)).NewPeerConnection(webrtc.Configuration{})
35+
peerConnection, err := webrtc.NewAPI(webrtc.WithMediaEngine(m), webrtc.WithSettingEngine(s)).NewPeerConnection(webrtc.Configuration{})
3636
if err != nil {
3737
return err
3838
}

internal/webrtc/webrtc.go

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package webrtc
33
import (
44
"context"
55
"encoding/json"
6+
"errors"
67
"fmt"
78
"io"
89
"log"
@@ -17,7 +18,7 @@ import (
1718
"time"
1819

1920
"github.com/pion/dtls/v3/pkg/crypto/elliptic"
20-
"github.com/pion/ice/v3"
21+
"github.com/pion/ice/v4"
2122
"github.com/pion/interceptor"
2223
"github.com/pion/webrtc/v4"
2324
)
@@ -51,6 +52,8 @@ type (
5152
whipActiveContext context.Context
5253
whipActiveContextCancel func()
5354

55+
peerConnection atomic.Pointer[webrtc.PeerConnection]
56+
5457
whepSessionsLock sync.RWMutex
5558
whepSessions map[string]*whepSession
5659
}
@@ -70,6 +73,9 @@ var (
7073
streamMapLock sync.Mutex
7174
apiWhip, apiWhep *webrtc.API
7275

76+
errNoPeerConnection = errors.New("unable to find PeerConnection")
77+
errICERestartNotSupported = errors.New("ice restart not supported")
78+
7379
// nolint
7480
videoRTCPFeedback = []webrtc.RTCPFeedback{{"goog-remb", ""}, {"ccm", "fir"}, {"nack", ""}, {"nack", "pli"}}
7581
)
@@ -510,3 +516,59 @@ func GetStreamStatuses() []StreamStatus {
510516

511517
return out
512518
}
519+
520+
func HandlePatch(sessionId, body string, isWHIP bool) error {
521+
valueForKey := func(sdp, key string) string {
522+
for _, l := range strings.Split(sdp, "\n") {
523+
expectedPrefix := "a=" + key + ":"
524+
if strings.HasPrefix(l, expectedPrefix) {
525+
return strings.TrimPrefix(l, expectedPrefix)
526+
}
527+
}
528+
529+
return ""
530+
}
531+
532+
var peerConnection *webrtc.PeerConnection
533+
534+
streamMapLock.Lock()
535+
if isWHIP {
536+
if stream := streamMap[sessionId]; stream != nil {
537+
peerConnection = stream.peerConnection.Load()
538+
}
539+
} else {
540+
for _, s := range streamMap {
541+
s.whepSessionsLock.Lock()
542+
if whepSession := s.whepSessions[sessionId]; whepSession != nil {
543+
peerConnection = whepSession.peerConnection
544+
}
545+
s.whepSessionsLock.Unlock()
546+
}
547+
}
548+
streamMapLock.Unlock()
549+
550+
if peerConnection == nil {
551+
return errNoPeerConnection
552+
}
553+
554+
oldUfrag := valueForKey(peerConnection.CurrentRemoteDescription().SDP, "ice-ufrag")
555+
oldPwd := valueForKey(peerConnection.CurrentRemoteDescription().SDP, "ice-pwd")
556+
newUfrag, newPwd := valueForKey(body, "ice-ufrag"), valueForKey(body, "ice-pwd")
557+
isICERestart := oldUfrag != newUfrag || oldPwd != newPwd
558+
if isICERestart {
559+
return errICERestartNotSupported
560+
}
561+
562+
for _, l := range strings.Split(body, "\n") {
563+
expectedPrefix := "a=candidate:"
564+
if strings.HasPrefix(l, expectedPrefix) {
565+
if err := peerConnection.AddICECandidate(webrtc.ICECandidateInit{
566+
Candidate: strings.TrimSpace(strings.TrimPrefix(l, "a=")),
567+
}); err != nil {
568+
return err
569+
}
570+
}
571+
}
572+
573+
return nil
574+
}

internal/webrtc/webrtc_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package webrtc
2+
3+
import (
4+
"context"
5+
"strings"
6+
"testing"
7+
8+
"github.com/pion/webrtc/v4"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestICETrickle(t *testing.T) {
13+
Configure()
14+
localTrack, err := webrtc.NewTrackLocalStaticSample(
15+
webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH264}, "video", "pion",
16+
)
17+
require.NoError(t, err)
18+
19+
peerConnection, err := webrtc.NewPeerConnection(webrtc.Configuration{})
20+
require.NoError(t, err)
21+
22+
connectedCtx, connectedDone := context.WithCancel(context.TODO())
23+
peerConnection.OnConnectionStateChange(func(c webrtc.PeerConnectionState) {
24+
if c == webrtc.PeerConnectionStateConnected {
25+
connectedDone()
26+
}
27+
})
28+
29+
gatheredCtx, gatheredDone := context.WithCancel(context.TODO())
30+
peerConnection.OnICECandidate(func(c *webrtc.ICECandidate) {
31+
if c == nil {
32+
gatheredDone()
33+
}
34+
})
35+
36+
_, err = peerConnection.AddTrack(localTrack)
37+
require.NoError(t, err)
38+
39+
offer, err := peerConnection.CreateOffer(nil)
40+
require.NoError(t, err)
41+
require.NoError(t, peerConnection.SetLocalDescription(offer))
42+
43+
answer, err := WHIP(offer.SDP, testStreamKey)
44+
require.NoError(t, err)
45+
46+
noCandidateAnswer := ""
47+
for _, l := range strings.Split(answer, "\n") {
48+
if !strings.HasPrefix(l, "a=candidate:") {
49+
noCandidateAnswer += l + "\n"
50+
}
51+
}
52+
53+
require.NoError(t, peerConnection.SetRemoteDescription(webrtc.SessionDescription{
54+
Type: webrtc.SDPTypeAnswer,
55+
SDP: noCandidateAnswer,
56+
}))
57+
58+
<-gatheredCtx.Done()
59+
require.NoError(t, HandlePatch(testStreamKey, peerConnection.LocalDescription().SDP, true))
60+
61+
<-connectedCtx.Done()
62+
}

internal/webrtc/whep.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type (
2121
sequenceNumber uint16
2222
timestamp uint32
2323
packetsWritten uint64
24+
peerConnection *webrtc.PeerConnection
2425
}
2526

2627
simulcastLayerResponse struct {
@@ -151,8 +152,9 @@ func WHEP(offer, streamKey string) (string, string, error) {
151152
defer stream.whepSessionsLock.Unlock()
152153

153154
stream.whepSessions[whepSessionId] = &whepSession{
154-
videoTrack: videoTrack,
155-
timestamp: 50000,
155+
videoTrack: videoTrack,
156+
timestamp: 50000,
157+
peerConnection: peerConnection,
156158
}
157159
stream.whepSessions[whepSessionId].currentLayer.Store("")
158160
stream.whepSessions[whepSessionId].waitingForKeyframe.Store(false)

internal/webrtc/whip.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ func WHIP(offer, streamKey string) (string, error) {
156156
if err != nil {
157157
return "", err
158158
}
159+
stream.peerConnection.Store(peerConnection)
159160

160161
peerConnection.OnTrack(func(remoteTrack *webrtc.TrackRemote, rtpReceiver *webrtc.RTPReceiver) {
161162
if strings.HasPrefix(remoteTrack.Codec().MimeType, "audio") {

0 commit comments

Comments
 (0)