-
Notifications
You must be signed in to change notification settings - Fork 128
/
frame.go
107 lines (96 loc) 路 2.4 KB
/
frame.go
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
95
96
97
98
99
100
101
102
103
104
105
106
107
package frame
import (
"os"
"strconv"
)
// debugFrameSize print frame data size on debug mode
var debugFrameSize = 16
// Kinds of frames transferable within YoMo
const (
// DataFrame
TagOfDataFrame Type = 0x3F
// MetaFrame of DataFrame
TagOfMetaFrame Type = 0x2F
TagOfMetadata Type = 0x03
TagOfTransactionID Type = 0x01
TagOfSourceID Type = 0x02
TagOfBroadcast Type = 0x04
// PayloadFrame of DataFrame
TagOfPayloadFrame Type = 0x2E
TagOfBackflowFrame Type = 0x2D
TagOfTokenFrame Type = 0x3E
// HandshakeFrame
TagOfHandshakeFrame Type = 0x3D
TagOfHandshakeName Type = 0x01
TagOfHandshakeType Type = 0x02
TagOfHandshakeID Type = 0x03
TagOfHandshakeAuthName Type = 0x04
TagOfHandshakeAuthPayload Type = 0x05
TagOfHandshakeObserveDataTags Type = 0x06
TagOfPingFrame Type = 0x3C
TagOfPongFrame Type = 0x3B
TagOfAcceptedFrame Type = 0x3A
TagOfRejectedFrame Type = 0x39
TagOfRejectedMessage Type = 0x02
// GoawayFrame
TagOfGoawayFrame Type = 0x30
TagOfGoawayCode Type = 0x01
TagOfGoawayMessage Type = 0x02
)
// Type represents the type of frame.
type Type uint8
// Frame is the inferface for frame.
type Frame interface {
// Type gets the type of Frame.
Type() Type
// Encode the frame into []byte.
Encode() []byte
}
func (f Type) String() string {
switch f {
case TagOfDataFrame:
return "DataFrame"
case TagOfTokenFrame:
return "TokenFrame"
case TagOfHandshakeFrame:
return "HandshakeFrame"
case TagOfPingFrame:
return "PingFrame"
case TagOfPongFrame:
return "PongFrame"
case TagOfAcceptedFrame:
return "AcceptedFrame"
case TagOfRejectedFrame:
return "RejectedFrame"
case TagOfGoawayFrame:
return "GoawayFrame"
case TagOfBackflowFrame:
return "BackflowFrame"
case TagOfMetaFrame:
return "MetaFrame"
case TagOfPayloadFrame:
return "PayloadFrame"
// case TagOfTransactionID:
// return "TransactionID"
case TagOfHandshakeName:
return "HandshakeName"
case TagOfHandshakeType:
return "HandshakeType"
default:
return "UnknownFrame"
}
}
// Shortly reduce data size for easy viewing
func Shortly(data []byte) []byte {
if len(data) > debugFrameSize {
return data[:debugFrameSize]
}
return data
}
func init() {
if envFrameSize := os.Getenv("YOMO_DEBUG_FRAME_SIZE"); envFrameSize != "" {
if val, err := strconv.Atoi(envFrameSize); err == nil {
debugFrameSize = val
}
}
}