diff --git a/wsnet/dial.go b/wsnet/dial.go index 9debf47a..eaab8938 100644 --- a/wsnet/dial.go +++ b/wsnet/dial.go @@ -176,6 +176,9 @@ func (d *Dialer) Close() error { // Ping sends a ping through the control channel. func (d *Dialer) Ping(ctx context.Context) error { + if d.ctrl.ReadyState() == webrtc.DataChannelStateClosed || d.ctrl.ReadyState() == webrtc.DataChannelStateClosing { + return webrtc.ErrConnectionClosed + } // Since we control the client and server we could open this // data channel with `Negotiated` true to reduce traffic being // sent when the RTC connection is opened. diff --git a/wsnet/dial_test.go b/wsnet/dial_test.go index 50bdd938..3e52f17b 100644 --- a/wsnet/dial_test.go +++ b/wsnet/dial_test.go @@ -161,6 +161,29 @@ func TestDial(t *testing.T) { return } }) + + t.Run("Disconnect", func(t *testing.T) { + connectAddr, listenAddr := createDumbBroker(t) + _, err := Listen(context.Background(), listenAddr) + if err != nil { + t.Error(err) + return + } + dialer, err := DialWebsocket(context.Background(), connectAddr, nil) + if err != nil { + t.Error(err) + return + } + err = dialer.Close() + if err != nil { + t.Error(err) + return + } + err = dialer.Ping(context.Background()) + if err != webrtc.ErrConnectionClosed { + t.Error(err) + } + }) } func BenchmarkThroughput(b *testing.B) {