@@ -23,6 +23,7 @@ type Session struct {
23
23
HidChannel * webrtc.DataChannel
24
24
DiskChannel * webrtc.DataChannel
25
25
shouldUmountVirtualMedia bool
26
+ rpcQueue chan webrtc.DataChannelMessage
26
27
}
27
28
28
29
type SessionConfig struct {
@@ -105,14 +106,21 @@ func newSession(config SessionConfig) (*Session, error) {
105
106
return nil , err
106
107
}
107
108
session := & Session {peerConnection : peerConnection }
109
+ session .rpcQueue = make (chan webrtc.DataChannelMessage , 256 )
110
+ go func () {
111
+ for msg := range session .rpcQueue {
112
+ onRPCMessage (msg , session )
113
+ }
114
+ }()
108
115
109
116
peerConnection .OnDataChannel (func (d * webrtc.DataChannel ) {
110
117
scopedLogger .Info ().Str ("label" , d .Label ()).Uint16 ("id" , * d .ID ()).Msg ("New DataChannel" )
111
118
switch d .Label () {
112
119
case "rpc" :
113
120
session .RPCChannel = d
114
121
d .OnMessage (func (msg webrtc.DataChannelMessage ) {
115
- go onRPCMessage (msg , session )
122
+ // Enqueue to ensure ordered processing
123
+ session .rpcQueue <- msg
116
124
})
117
125
triggerOTAStateUpdate ()
118
126
triggerVideoStateUpdate ()
@@ -186,6 +194,11 @@ func newSession(config SessionConfig) (*Session, error) {
186
194
if session == currentSession {
187
195
currentSession = nil
188
196
}
197
+ // Stop RPC processor
198
+ if session .rpcQueue != nil {
199
+ close (session .rpcQueue )
200
+ session .rpcQueue = nil
201
+ }
189
202
if session .shouldUmountVirtualMedia {
190
203
err := rpcUnmountImage ()
191
204
scopedLogger .Warn ().Err (err ).Msg ("unmount image failed on connection close" )
0 commit comments