)
func dataChannelStarted(peerConnectionCtx context.Context, dc *webrtc.DataChannel) (dataChannelCtx context.Context, span trace.Span) {
+ trace.SpanFromContext(peerConnectionCtx).AddEvent("starting data channel")
dataChannelCtx, span = otel.Tracer(tracerName).Start(peerConnectionCtx, "DataChannel")
dc.OnClose(func() {
span.End()
onOpen func(closer datachannel.ReadWriteCloser),
) {
dc.OnOpen(func() {
- trace.SpanFromContext(ctx).AddEvent("opened")
+ dataChannelSpan := trace.SpanFromContext(ctx)
+ dataChannelSpan.AddEvent("opened")
raw, err := dc.Detach()
if err != nil {
// This shouldn't happen if the API is configured correctly, and we call from OnOpen.
panic(err)
}
//dc.OnClose()
- onOpen(hookDataChannelCloser(raw, pc))
+ onOpen(hookDataChannelCloser(raw, pc, dataChannelSpan))
})
}
// 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) datachannel.ReadWriteCloser {
+func hookDataChannelCloser(dcrwc datachannel.ReadWriteCloser, pc *wrappedPeerConnection, dataChannelSpan trace.Span) datachannel.ReadWriteCloser {
return struct {
datachannelReadWriter
io.Closer
}{
dcrwc,
- ioCloserFunc(pc.Close),
+ ioCloserFunc(func() error {
+ dcrwc.Close()
+ pc.Close()
+ dataChannelSpan.End()
+ return nil
+ }),
}
}