fix(gateway): secure control and terminal ownership

This commit is contained in:
sechmachine
2026-07-30 11:15:48 +07:00
parent df75b1d250
commit baf4073f68
16 changed files with 488 additions and 36 deletions
+25 -5
View File
@@ -289,6 +289,7 @@ type nativeApolloSession struct {
audio chan ProviderMedia
events chan ProviderEvent
mu sync.Mutex
eventMu sync.Mutex
mediaMu sync.Mutex
controlMu sync.Mutex
state protocol.ProviderState
@@ -686,10 +687,32 @@ func (s *nativeApolloSession) handleApolloControlPayload(_ uint8, _ bool, payloa
}
func (s *nativeApolloSession) emitProviderEvent(event ProviderEvent) {
if !s.enqueueProviderEvent(event) {
s.handleApolloDisconnect(ErrProviderMalformed)
}
}
func (s *nativeApolloSession) enqueueProviderEvent(event ProviderEvent) bool {
s.eventMu.Lock()
defer s.eventMu.Unlock()
select {
case s.events <- event:
return true
default:
s.handleApolloDisconnect(ErrProviderMalformed)
}
if event.Kind != ProviderEventTerminated && event.Kind != ProviderEventDisconnected {
return false
}
select {
case <-s.events:
default:
return false
}
select {
case s.events <- event:
return true
default:
return false
}
}
@@ -706,10 +729,7 @@ func (s *nativeApolloSession) handleApolloDisconnect(err error) {
}
s.state.State = ProviderStateDisconnected
s.mu.Unlock()
select {
case s.events <- ProviderEvent{Kind: ProviderEventDisconnected}:
default:
}
s.enqueueProviderEvent(ProviderEvent{Kind: ProviderEventDisconnected})
})
}