Skip to content

Commit ebcd217

Browse files
committed
Establish connection
1 parent 07b2ee8 commit ebcd217

File tree

4 files changed

+186
-4
lines changed

4 files changed

+186
-4
lines changed

013-cloud-gaming/go.mod

+27-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,30 @@ module cloud-gaming
22

33
go 1.23.0
44

5-
require github.com/gorilla/websocket v1.5.3
5+
require (
6+
github.com/gorilla/websocket v1.5.3
7+
github.com/pion/webrtc/v4 v4.0.1
8+
)
9+
10+
require (
11+
github.com/google/uuid v1.6.0 // indirect
12+
github.com/pion/datachannel v1.5.9 // indirect
13+
github.com/pion/dtls/v3 v3.0.3 // indirect
14+
github.com/pion/ice/v4 v4.0.2 // indirect
15+
github.com/pion/interceptor v0.1.37 // indirect
16+
github.com/pion/logging v0.2.2 // indirect
17+
github.com/pion/mdns/v2 v2.0.7 // indirect
18+
github.com/pion/randutil v0.1.0 // indirect
19+
github.com/pion/rtcp v1.2.14 // indirect
20+
github.com/pion/rtp v1.8.9 // indirect
21+
github.com/pion/sctp v1.8.33 // indirect
22+
github.com/pion/sdp/v3 v3.0.9 // indirect
23+
github.com/pion/srtp/v3 v3.0.4 // indirect
24+
github.com/pion/stun/v3 v3.0.0 // indirect
25+
github.com/pion/transport/v3 v3.0.7 // indirect
26+
github.com/pion/turn/v4 v4.0.0 // indirect
27+
github.com/wlynxg/anet v0.0.3 // indirect
28+
golang.org/x/crypto v0.28.0 // indirect
29+
golang.org/x/net v0.29.0 // indirect
30+
golang.org/x/sys v0.26.0 // indirect
31+
)

013-cloud-gaming/go.sum

+60
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,62 @@
1+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
3+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
5+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
16
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
27
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
8+
github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA=
9+
github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE=
10+
github.com/pion/dtls/v3 v3.0.3 h1:j5ajZbQwff7Z8k3pE3S+rQ4STvKvXUdKsi/07ka+OWM=
11+
github.com/pion/dtls/v3 v3.0.3/go.mod h1:weOTUyIV4z0bQaVzKe8kpaP17+us3yAuiQsEAG1STMU=
12+
github.com/pion/ice/v4 v4.0.2 h1:1JhBRX8iQLi0+TfcavTjPjI6GO41MFn4CeTBX+Y9h5s=
13+
github.com/pion/ice/v4 v4.0.2/go.mod h1:DCdqyzgtsDNYN6/3U8044j3U7qsJ9KFJC92VnOWHvXg=
14+
github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
15+
github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
16+
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
17+
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
18+
github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM=
19+
github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA=
20+
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
21+
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
22+
github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE=
23+
github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
24+
github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk=
25+
github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
26+
github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw=
27+
github.com/pion/sctp v1.8.33/go.mod h1:beTnqSzewI53KWoG3nqB282oDMGrhNxBdb+JZnkCwRM=
28+
github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY=
29+
github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M=
30+
github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
31+
github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
32+
github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
33+
github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU=
34+
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
35+
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
36+
github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
37+
github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
38+
github.com/pion/webrtc/v4 v4.0.1 h1:6Unwc6JzoTsjxetcAIoWH81RUM4K5dBc1BbJGcF9WVE=
39+
github.com/pion/webrtc/v4 v4.0.1/go.mod h1:SfNn8CcFxR6OUVjLXVslAQ3a3994JhyE3Hw1jAuqEto=
40+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
41+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
42+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
43+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
44+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
45+
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
46+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
47+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
48+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
49+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
50+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
51+
github.com/wlynxg/anet v0.0.3 h1:PvR53psxFXstc12jelG6f1Lv4MWqE0tI76/hHGjh9rg=
52+
github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
53+
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
54+
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
55+
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
56+
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
57+
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
58+
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
59+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
60+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
61+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
62+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

013-cloud-gaming/service/webrtc.go

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package service
+98-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package transport
22

33
import (
4+
"log"
45
"net/http"
6+
"sync"
57

68
"github.com/gorilla/websocket"
9+
"github.com/pion/webrtc/v4"
710
)
811

912
var (
@@ -12,12 +15,104 @@ var (
1215
WriteBufferSize: 1024,
1316
CheckOrigin: func(r *http.Request) bool { return true },
1417
}
18+
// peerConns []*PeerConnState
19+
peerConnCh = make(chan *PeerConnState)
1520
)
1621

1722
func WebsocketHandler(w http.ResponseWriter, r *http.Request) {
18-
conn, err := upgrader.Upgrade(w, r, nil)
23+
unsafeConn, err := upgrader.Upgrade(w, r, nil)
1924
if err != nil {
20-
panic(err)
25+
log.Fatal(err)
2126
}
22-
defer conn.Close()
27+
28+
conn := &threadSafeWriter{unsafeConn, sync.Mutex{}}
29+
pc, err := webrtc.NewPeerConnection(webrtc.Configuration{
30+
ICEServers: []webrtc.ICEServer{
31+
{
32+
URLs: []string{"stun:stun.l.google.com:19302"},
33+
},
34+
},
35+
})
36+
if err != nil {
37+
conn.WriteJSON(Message{Type: "error", Value: "Error creating peer connection"})
38+
return
39+
}
40+
41+
pcs := &PeerConnState{peerConnection: pc, ws: conn}
42+
pc.OnConnectionStateChange(func(state webrtc.PeerConnectionState) {
43+
log.Println("Connection state changed:", state)
44+
if state == webrtc.PeerConnectionStateConnected {
45+
pcs = &PeerConnState{peerConnection: pc, ws: conn}
46+
peerConnCh <- pcs
47+
log.Println("Added new peer connection to channel")
48+
}
49+
})
50+
51+
go handleMessage(pcs)
52+
}
53+
54+
func handleMessage(pcs *PeerConnState) {
55+
for {
56+
var msg Message
57+
err := pcs.ws.ReadJSON(&msg)
58+
if websocket.IsCloseError(err, websocket.CloseNormalClosure, websocket.CloseAbnormalClosure) {
59+
log.Printf("Websocket closed: %v", err)
60+
break
61+
} else if err != nil {
62+
log.Printf("Error reading from websocket: %v", err)
63+
continue
64+
}
65+
66+
switch msg.Type {
67+
case "offer":
68+
offer := msg.Value.(string)
69+
err = pcs.peerConnection.SetRemoteDescription(webrtc.SessionDescription{Type: webrtc.SDPTypeOffer, SDP: offer})
70+
if err != nil {
71+
log.Printf("Error reading from websocket: %v", err)
72+
continue
73+
}
74+
75+
answer, err := pcs.peerConnection.CreateAnswer(nil)
76+
if err != nil {
77+
log.Printf("Error reading from websocket: %v", err)
78+
continue
79+
}
80+
81+
err = pcs.peerConnection.SetLocalDescription(answer)
82+
if err != nil {
83+
log.Printf("Error reading from websocket: %v", err)
84+
continue
85+
}
86+
pcs.ws.WriteJSON(Message{Type: "answer", Value: answer.SDP})
87+
88+
case "ice":
89+
ice := msg.Value.(string)
90+
pcs.peerConnection.AddICECandidate(webrtc.ICECandidateInit{Candidate: ice})
91+
92+
default:
93+
log.Printf("Unknown message type: %+v", msg)
94+
continue
95+
}
96+
}
97+
}
98+
99+
type Message struct {
100+
Type string `json:"type"`
101+
Value any `json:"value"`
102+
}
103+
104+
type PeerConnState struct {
105+
peerConnection *webrtc.PeerConnection
106+
ws *threadSafeWriter
107+
}
108+
109+
type threadSafeWriter struct {
110+
*websocket.Conn
111+
sync.Mutex
112+
}
113+
114+
func (t *threadSafeWriter) WriteJSON(v interface{}) error {
115+
t.Lock()
116+
defer t.Unlock()
117+
return t.Conn.WriteJSON(v)
23118
}

0 commit comments

Comments
 (0)