fix(gateway): close Phase 3C audit gaps
This commit is contained in:
@@ -43,7 +43,8 @@ func NewNativeApolloBackend() *NativeApolloBackend {
|
||||
|
||||
func (b *NativeApolloBackend) Management(ctx context.Context, request LaunchRequest) ([]byte, error) {
|
||||
work := request.ProviderWork
|
||||
if err := work.Validate(); err != nil || request.SessionID == "" || request.SessionID != work.SessionID || work.ProviderProfile != ProviderProfileApollo {
|
||||
if err := work.Validate(); err != nil || validateApolloStreamPolicy(work.StreamPolicy) != nil ||
|
||||
request.SessionID == "" || request.SessionID != work.SessionID || work.ProviderProfile != ProviderProfileApollo {
|
||||
return nil, ErrProviderMalformed
|
||||
}
|
||||
client, err := newPinnedApolloHTTPClient(work)
|
||||
@@ -199,7 +200,8 @@ func pinnedApolloTLSConfig(work protocol.ProviderSessionWork) (*tls.Config, erro
|
||||
|
||||
func (b *NativeApolloBackend) Setup(ctx context.Context, request LaunchRequest) ([]byte, error) {
|
||||
work := request.ProviderWork
|
||||
if err := work.Validate(); err != nil || request.SessionID == "" || request.SessionID != work.SessionID || work.ProviderProfile != ProviderProfileApollo {
|
||||
if err := work.Validate(); err != nil || validateApolloStreamPolicy(work.StreamPolicy) != nil ||
|
||||
request.SessionID == "" || request.SessionID != work.SessionID || work.ProviderProfile != ProviderProfileApollo {
|
||||
return nil, ErrProviderMalformed
|
||||
}
|
||||
client, err := newPinnedApolloHTTPClient(work)
|
||||
@@ -287,6 +289,7 @@ type nativeApolloSession struct {
|
||||
state protocol.ProviderState
|
||||
pressed map[string]InputEvent
|
||||
closeOnce sync.Once
|
||||
disconnectOnce sync.Once
|
||||
channelsOnce sync.Once
|
||||
done chan struct{}
|
||||
readDone chan struct{}
|
||||
@@ -493,6 +496,9 @@ func (s *nativeApolloSession) ReleaseAll(ctx context.Context) error {
|
||||
|
||||
func (s *nativeApolloSession) Terminate(ctx context.Context) error {
|
||||
var cleanupErr error
|
||||
s.mu.Lock()
|
||||
disconnected := s.state.State == ProviderStateDisconnected
|
||||
s.mu.Unlock()
|
||||
s.closeOnce.Do(func() {
|
||||
if err := s.ReleaseAll(ctx); err != nil {
|
||||
cleanupErr = err
|
||||
@@ -518,7 +524,7 @@ func (s *nativeApolloSession) Terminate(ctx context.Context) error {
|
||||
}
|
||||
if cleanupErr == nil {
|
||||
s.closeMediaChannels()
|
||||
if s.allowApplicationTermination {
|
||||
if s.allowApplicationTermination && !disconnected {
|
||||
if err := apolloCancelRequest(ctx, s.managementClient, s.managementHost, s.managementPort); err != nil {
|
||||
cleanupErr = err
|
||||
}
|
||||
@@ -536,6 +542,8 @@ func (s *nativeApolloSession) Terminate(ctx context.Context) error {
|
||||
if cleanupErr != nil {
|
||||
s.state.State = ProviderStateCleanup
|
||||
s.state.CleanupPending = true
|
||||
} else if disconnected {
|
||||
s.state.State = ProviderStateDisconnected
|
||||
} else {
|
||||
s.state.State = ProviderStateTerminated
|
||||
}
|
||||
@@ -678,11 +686,19 @@ func (s *nativeApolloSession) handleApolloDisconnect(err error) {
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
s.mu.Lock()
|
||||
if s.state.State != ProviderStateTerminated {
|
||||
s.disconnectOnce.Do(func() {
|
||||
s.mu.Lock()
|
||||
if s.state.State == ProviderStateTerminated {
|
||||
s.mu.Unlock()
|
||||
return
|
||||
}
|
||||
s.state.State = ProviderStateDisconnected
|
||||
}
|
||||
s.mu.Unlock()
|
||||
s.mu.Unlock()
|
||||
select {
|
||||
case s.events <- ProviderEvent{Kind: ProviderEventDisconnected}:
|
||||
default:
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func (s *nativeApolloSession) closeMediaChannels() {
|
||||
@@ -738,7 +754,11 @@ func (s *nativeApolloSession) readUDPMedia() {
|
||||
if openErr != nil {
|
||||
continue
|
||||
}
|
||||
payloads, err = s.audioFEC.Add(s.media, shard)
|
||||
var evicted bool
|
||||
payloads, evicted, err = s.audioFEC.Add(s.media, shard)
|
||||
if evicted {
|
||||
s.mediaDrops.Add(1)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user