message.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package datachannel
  2. import (
  3. "fmt"
  4. )
  5. // message is a parsed DataChannel message
  6. type message interface {
  7. Marshal() ([]byte, error)
  8. Unmarshal([]byte) error
  9. }
  10. // messageType is the first byte in a DataChannel message that specifies type
  11. type messageType byte
  12. // DataChannel Message Types
  13. const (
  14. dataChannelAck messageType = 0x02
  15. dataChannelOpen messageType = 0x03
  16. )
  17. func (t messageType) String() string {
  18. switch t {
  19. case dataChannelAck:
  20. return "DataChannelAck"
  21. case dataChannelOpen:
  22. return "DataChannelOpen"
  23. default:
  24. return fmt.Sprintf("Unknown MessageType: %d", t)
  25. }
  26. }
  27. // parse accepts raw input and returns a DataChannel message
  28. func parse(raw []byte) (message, error) {
  29. if len(raw) == 0 {
  30. return nil, ErrDataChannelMessageTooShort
  31. }
  32. var msg message
  33. switch messageType(raw[0]) {
  34. case dataChannelOpen:
  35. msg = &channelOpen{}
  36. case dataChannelAck:
  37. msg = &channelAck{}
  38. default:
  39. return nil, fmt.Errorf("%w %v", ErrInvalidMessageType, messageType(raw[0]))
  40. }
  41. if err := msg.Unmarshal(raw); err != nil {
  42. return nil, err
  43. }
  44. return msg, nil
  45. }
  46. // parseExpectDataChannelOpen parses a DataChannelOpen message
  47. // or throws an error
  48. func parseExpectDataChannelOpen(raw []byte) (*channelOpen, error) {
  49. if len(raw) == 0 {
  50. return nil, ErrDataChannelMessageTooShort
  51. }
  52. if actualTyp := messageType(raw[0]); actualTyp != dataChannelOpen {
  53. return nil, fmt.Errorf("%w expected(%s) actual(%s)", ErrUnexpectedDataChannelType, actualTyp, dataChannelOpen)
  54. }
  55. msg := &channelOpen{}
  56. if err := msg.Unmarshal(raw); err != nil {
  57. return nil, err
  58. }
  59. return msg, nil
  60. }