summaryrefslogtreecommitdiff
path: root/vendor/github.com/pion/datachannel/message.go
blob: 84665cbb3d5a2fa253dd05674155b2c6d61a9004 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package datachannel

import (
	"fmt"

	"github.com/pkg/errors"
)

// message is a parsed DataChannel message
type message interface {
	Marshal() ([]byte, error)
	Unmarshal([]byte) error
}

// messageType is the first byte in a DataChannel message that specifies type
type messageType byte

// DataChannel Message Types
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)
	}
}

// parse accepts raw input and returns a DataChannel message
func parse(raw []byte) (message, error) {
	if len(raw) == 0 {
		return nil, errors.Errorf("DataChannel message is not long enough to determine type ")
	}

	var msg message
	switch messageType(raw[0]) {
	case dataChannelOpen:
		msg = &channelOpen{}
	case dataChannelAck:
		msg = &channelAck{}
	default:
		return nil, errors.Errorf("Unknown MessageType %v", messageType(raw[0]))
	}

	if err := msg.Unmarshal(raw); err != nil {
		return nil, err
	}

	return msg, nil
}

// parseExpectDataChannelOpen parses a DataChannelOpen message
// or throws an error
func parseExpectDataChannelOpen(raw []byte) (*channelOpen, error) {
	if len(raw) == 0 {
		return nil, errors.Errorf("the DataChannel message is not long enough to determine type")
	}

	if actualTyp := messageType(raw[0]); actualTyp != dataChannelOpen {
		return nil, errors.Errorf("expected DataChannelOpen but got %s", actualTyp)
	}

	msg := &channelOpen{}
	if err := msg.Unmarshal(raw); err != nil {
		return nil, err
	}

	return msg, nil
}

// parseExpectDataChannelAck parses a DataChannelAck message
// or throws an error
// func parseExpectDataChannelAck(raw []byte) (*channelAck, error) {
// 	if len(raw) == 0 {
// 		return nil, errors.Errorf("the DataChannel message is not long enough to determine type")
// 	}
//
// 	if actualTyp := messageType(raw[0]); actualTyp != dataChannelAck {
// 		return nil, errors.Errorf("expected DataChannelAck but got %s", actualTyp)
// 	}
//
// 	msg := &channelAck{}
// 	if err := msg.Unmarshal(raw); err != nil {
// 		return nil, err
// 	}
//
// 	return msg, nil
// }