diff --git a/pkg/sfu/datachannel.go b/pkg/sfu/datachannel.go index f292a81f4..497af0946 100644 --- a/pkg/sfu/datachannel.go +++ b/pkg/sfu/datachannel.go @@ -11,9 +11,10 @@ type ( // The datachannels created will be negotiated on join to all peers that joins // the SFU. Datachannel struct { - Label string - middlewares []func(MessageProcessor) MessageProcessor - onMessage func(ctx context.Context, args ProcessArgs) + Label string + middlewares []func(MessageProcessor) MessageProcessor + onMessage func(ctx context.Context, args ProcessArgs) + onRemovePeer func(peer Peer) } ProcessArgs struct { @@ -49,6 +50,10 @@ func (dc *Datachannel) OnMessage(fn func(ctx context.Context, args ProcessArgs)) dc.onMessage = fn } +func (dc *Datachannel) OnRemovePeer(fn func(peer Peer)) { + dc.onRemovePeer = fn +} + func (p ProcessFunc) Process(ctx context.Context, args ProcessArgs) { p(ctx, args) } diff --git a/pkg/sfu/subscriber.go b/pkg/sfu/subscriber.go index 63ea9e0c2..ca002ce83 100644 --- a/pkg/sfu/subscriber.go +++ b/pkg/sfu/subscriber.go @@ -93,6 +93,11 @@ func (s *Subscriber) AddDatachannel(peer Peer, dc *Datachannel) error { DataChannel: ndc, }) }) + ndc.OnClose(func() { + if dc.onRemovePeer != nil { + dc.onRemovePeer(peer) + } + }) s.channels[dc.Label] = ndc