diff --git a/datachannel.go b/datachannel.go index f3e811e..0050185 100644 --- a/datachannel.go +++ b/datachannel.go @@ -287,7 +287,7 @@ func (c *DataChannel) handleDCEP(data []byte) error { case *channelAck: c.onOpenComplete() default: - return fmt.Errorf("%w %v", ErrInvalidMessageType, msg) + return fmt.Errorf("%w, wanted ACK got %v", ErrUnexpectedDataChannelType, msg) } return nil diff --git a/message.go b/message.go index 6da47ec..53f221b 100644 --- a/message.go +++ b/message.go @@ -11,6 +11,7 @@ import ( type message interface { Marshal() ([]byte, error) Unmarshal([]byte) error + String() string } // messageType is the first byte in a DataChannel message that specifies type diff --git a/message_channel_ack.go b/message_channel_ack.go index e98c438..8fe396f 100644 --- a/message_channel_ack.go +++ b/message_channel_ack.go @@ -23,3 +23,7 @@ func (c *channelAck) Unmarshal(_ []byte) error { // Message type already checked in Parse and there is no further data return nil } + +func (c channelAck) String() string { + return "ACK" +} diff --git a/message_channel_open.go b/message_channel_open.go index 9dab85a..e7052f4 100644 --- a/message_channel_open.go +++ b/message_channel_open.go @@ -75,6 +75,23 @@ const ( ChannelTypePartialReliableTimedUnordered ChannelType = 0x82 ) +func (c ChannelType) String() string { + switch c { + case ChannelTypeReliable: + case ChannelTypeReliableUnordered: + return "ReliableUnordered" + case ChannelTypePartialReliableRexmit: + return "PartialReliableRexmit" + case ChannelTypePartialReliableRexmitUnordered: + return "PartialReliableRexmitUnordered" + case ChannelTypePartialReliableTimed: + return "PartialReliableTimed" + case ChannelTypePartialReliableTimedUnordered: + return "PartialReliableTimedUnordered" + } + return "Unknown" +} + // ChannelPriority enums const ( ChannelPriorityBelowNormal uint16 = 128 @@ -124,3 +141,7 @@ func (c *channelOpen) Unmarshal(raw []byte) error { c.Protocol = raw[channelOpenHeaderLength+labelLength : channelOpenHeaderLength+labelLength+protocolLength] return nil } + +func (c channelOpen) String() string { + return fmt.Sprintf("Open ChannelType(%s) Priority(%v) ReliabilityParameter(%d) Label(%s) Protocol(%s)", c.ChannelType, c.Priority, c.ReliabilityParameter, string(c.Label), string(c.Protocol)) +} diff --git a/message_test.go b/message_test.go index d6d0be1..e32b95c 100644 --- a/message_test.go +++ b/message_test.go @@ -95,3 +95,17 @@ func TestChannelAckUnmarshal(t *testing.T) { _, ok := msgUncast.(*channelAck) assert.True(t, ok, "Failed to cast to ChannelAck") } + +func TestChannelString(t *testing.T) { + channelString := channelOpen{ + ChannelType: ChannelTypeReliable, + Priority: 0, + ReliabilityParameter: 0, + + Label: []byte("foo"), + Protocol: []byte("bar"), + }.String() + + assert.Equal(t, channelString, "Open ChannelType(Unknown) Priority(0) ReliabilityParameter(0) Label(foo) Protocol(bar)") + assert.Equal(t, channelAck{}.String(), "ACK") +}