webtorrent/tracker-client.go | 1 + webtorrent/transport.go | 10 ++++++++-- diff --git a/webtorrent/tracker-client.go b/webtorrent/tracker-client.go index 311b296a8965d37cbf14f91c060c575cd9a649e4..b0ca6c2c35289de8bcb89864fc4e1a1db2cf33b2 100644 --- a/webtorrent/tracker-client.go +++ b/webtorrent/tracker-client.go @@ -191,6 +191,7 @@ func (tc *TrackerClient) closeUnusedOffers() { for _, offer := range tc.outboundOffers { offer.peerConnection.Close() + offer.dataChannel.Close() } tc.outboundOffers = nil } diff --git a/webtorrent/transport.go b/webtorrent/transport.go index da56e40d1a2ef1d9ec34d8b0ca780c489d139b3b..852990860e00d9e27b0b4a81d26a2d4c90647e64 100644 --- a/webtorrent/transport.go +++ b/webtorrent/transport.go @@ -232,13 +232,18 @@ if err != nil { // This shouldn't happen if the API is configured correctly, and we call from OnOpen. panic(err) } - onOpen(hookDataChannelCloser(raw, pc, span), ctx, span) + onOpen(hookDataChannelCloser(raw, pc, span, dc), ctx, span) }) } // Hooks the datachannel's Close to Close the owning PeerConnection. The datachannel takes ownership // and responsibility for the PeerConnection. -func hookDataChannelCloser(dcrwc datachannel.ReadWriteCloser, pc *wrappedPeerConnection, dataChannelSpan trace.Span) datachannel.ReadWriteCloser { +func hookDataChannelCloser( + dcrwc datachannel.ReadWriteCloser, + pc *wrappedPeerConnection, + dataChannelSpan trace.Span, + originalDataChannel *webrtc.DataChannel, +) datachannel.ReadWriteCloser { return struct { datachannelReadWriter io.Closer @@ -247,6 +252,7 @@ dcrwc, ioCloserFunc(func() error { dcrwc.Close() pc.Close() + originalDataChannel.Close() dataChannelSpan.End() return nil }),