1package interceptor 2 3// Chain is an interceptor that runs all child interceptors in order. 4type Chain struct { 5 interceptors []Interceptor 6} 7 8// NewChain returns a new Chain interceptor. 9func NewChain(interceptors []Interceptor) *Chain { 10 return &Chain{interceptors: interceptors} 11} 12 13// BindRTCPReader lets you modify any incoming RTCP packets. It is called once per sender/receiver, however this might 14// change in the future. The returned method will be called once per packet batch. 15func (i *Chain) BindRTCPReader(reader RTCPReader) RTCPReader { 16 for _, interceptor := range i.interceptors { 17 reader = interceptor.BindRTCPReader(reader) 18 } 19 20 return reader 21} 22 23// BindRTCPWriter lets you modify any outgoing RTCP packets. It is called once per PeerConnection. The returned method 24// will be called once per packet batch. 25func (i *Chain) BindRTCPWriter(writer RTCPWriter) RTCPWriter { 26 for _, interceptor := range i.interceptors { 27 writer = interceptor.BindRTCPWriter(writer) 28 } 29 30 return writer 31} 32 33// BindLocalStream lets you modify any outgoing RTP packets. It is called once for per LocalStream. The returned method 34// will be called once per rtp packet. 35func (i *Chain) BindLocalStream(ctx *StreamInfo, writer RTPWriter) RTPWriter { 36 for _, interceptor := range i.interceptors { 37 writer = interceptor.BindLocalStream(ctx, writer) 38 } 39 40 return writer 41} 42 43// UnbindLocalStream is called when the Stream is removed. It can be used to clean up any data related to that track. 44func (i *Chain) UnbindLocalStream(ctx *StreamInfo) { 45 for _, interceptor := range i.interceptors { 46 interceptor.UnbindLocalStream(ctx) 47 } 48} 49 50// BindRemoteStream lets you modify any incoming RTP packets. It is called once for per RemoteStream. The returned method 51// will be called once per rtp packet. 52func (i *Chain) BindRemoteStream(ctx *StreamInfo, reader RTPReader) RTPReader { 53 for _, interceptor := range i.interceptors { 54 reader = interceptor.BindRemoteStream(ctx, reader) 55 } 56 57 return reader 58} 59 60// UnbindRemoteStream is called when the Stream is removed. It can be used to clean up any data related to that track. 61func (i *Chain) UnbindRemoteStream(ctx *StreamInfo) { 62 for _, interceptor := range i.interceptors { 63 interceptor.UnbindRemoteStream(ctx) 64 } 65} 66 67// Close closes the Interceptor, cleaning up any data if necessary. 68func (i *Chain) Close() error { 69 var errs []error 70 for _, interceptor := range i.interceptors { 71 errs = append(errs, interceptor.Close()) 72 } 73 74 return flattenErrs(errs) 75} 76