package datachannel
import (
"fmt"
)
type message interface {
Marshal() ([]byte , error )
Unmarshal([]byte ) error
String() string
}
type messageType byte
const (
dataChannelAck messageType = 0x02
dataChannelOpen messageType = 0x03
)
func (t messageType ) String () string {
switch t {
case dataChannelAck :
return "DataChannelAck"
case dataChannelOpen :
return "DataChannelOpen"
default :
return fmt .Sprintf ("Unknown MessageType: %d" , t )
}
}
func parse(raw []byte ) (message , error ) {
if len (raw ) == 0 {
return nil , ErrDataChannelMessageTooShort
}
var msg message
switch messageType (raw [0 ]) {
case dataChannelOpen :
msg = &channelOpen {}
case dataChannelAck :
msg = &channelAck {}
default :
return nil , fmt .Errorf ("%w %v" , ErrInvalidMessageType , messageType (raw [0 ]))
}
if err := msg .Unmarshal (raw ); err != nil {
return nil , err
}
return msg , nil
}
func parseExpectDataChannelOpen(raw []byte ) (*channelOpen , error ) {
if len (raw ) == 0 {
return nil , ErrDataChannelMessageTooShort
}
if actualTyp := messageType (raw [0 ]); actualTyp != dataChannelOpen {
return nil , fmt .Errorf ("%w expected(%s) actual(%s)" , ErrUnexpectedDataChannelType , actualTyp , dataChannelOpen )
}
msg := &channelOpen {}
if err := msg .Unmarshal (raw ); err != nil {
return nil , err
}
return msg , nil
}
func TryMarshalUnmarshal (msg []byte ) int {
message , err := parse (msg )
if err != nil {
return 0
}
_, err = message .Marshal ()
if err != nil {
return 0
}
return 1
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .