@@ -10,52 +10,83 @@ import (
1010
1111var errIncompleteFrame = errors .New ("incomplete frame" )
1212
13- type tinyFrame struct {
13+ type baseWriteableFrame struct {
1414 header core.FrameHeader
1515 done chan struct {}
1616}
1717
18- func (t * tinyFrame ) Header () core.FrameHeader {
18+ // FromBytes creates frame from a byte slice.
19+ func FromBytes (b []byte ) (f core.BufferedFrame , err error ) {
20+ if len (b ) < core .FrameHeaderLen {
21+ err = errIncompleteFrame
22+ return
23+ }
24+ header := core .ParseFrameHeader (b [:core .FrameHeaderLen ])
25+ bb := common .BorrowByteBuff ()
26+ _ , err = bb .Write (b [core .FrameHeaderLen :])
27+ if err != nil {
28+ common .ReturnByteBuff (bb )
29+ return
30+ }
31+ raw := newBaseDefaultFrame (header , bb )
32+ f , err = FromRawFrame (raw )
33+ if err != nil {
34+ common .ReturnByteBuff (bb )
35+ }
36+ return
37+ }
38+
39+ func (t baseWriteableFrame ) Header () core.FrameHeader {
1940 return t .header
2041}
2142
2243// Done can be invoked when a frame has been been processed.
23- func (t * tinyFrame ) Done () (closed bool ) {
44+ func (t baseWriteableFrame ) Done () (closed bool ) {
2445 defer func () {
25- if e := recover (); e != nil {
26- closed = true
27- }
46+ closed = recover () != nil
2847 }()
2948 close (t .done )
3049 return
3150}
3251
3352// DoneNotify notify when frame has been done.
34- func (t * tinyFrame ) DoneNotify () <- chan struct {} {
53+ func (t baseWriteableFrame ) DoneNotify () <- chan struct {} {
3554 return t .done
3655}
3756
38- // RawFrame is basic frame implementation.
39- type RawFrame struct {
40- * tinyFrame
41- body * common.ByteBuff
57+ // baseDefaultFrame is basic frame implementation.
58+ type baseDefaultFrame struct {
59+ header core.FrameHeader
60+ body * common.ByteBuff
61+ }
62+
63+ func (f * baseDefaultFrame ) Header () core.FrameHeader {
64+ return f .header
65+ }
66+
67+ // Release releases resource.
68+ func (f * baseDefaultFrame ) Release () {
69+ if f != nil && f .body != nil {
70+ common .ReturnByteBuff (f .body )
71+ f .body = nil
72+ }
4273}
4374
4475// Body returns frame body.
45- func (f * RawFrame ) Body () * common.ByteBuff {
76+ func (f * baseDefaultFrame ) Body () * common.ByteBuff {
4677 return f .body
4778}
4879
4980// Len returns length of frame.
50- func (f * RawFrame ) Len () int {
81+ func (f * baseDefaultFrame ) Len () int {
5182 if f .body == nil {
5283 return core .FrameHeaderLen
5384 }
5485 return core .FrameHeaderLen + f .body .Len ()
5586}
5687
5788// WriteTo write frame to writer.
58- func (f * RawFrame ) WriteTo (w io.Writer ) (n int64 , err error ) {
89+ func (f * baseDefaultFrame ) WriteTo (w io.Writer ) (n int64 , err error ) {
5990 var wrote int64
6091 wrote , err = f .header .WriteTo (w )
6192 if err != nil {
@@ -72,7 +103,7 @@ func (f *RawFrame) WriteTo(w io.Writer) (n int64, err error) {
72103 return
73104}
74105
75- func (f * RawFrame ) trySeekMetadataLen (offset int ) (n int , hasMetadata bool ) {
106+ func (f * baseDefaultFrame ) trySeekMetadataLen (offset int ) (n int , hasMetadata bool ) {
76107 raw := f .body .Bytes ()
77108 if offset > 0 {
78109 raw = raw [offset :]
@@ -89,15 +120,15 @@ func (f *RawFrame) trySeekMetadataLen(offset int) (n int, hasMetadata bool) {
89120 return
90121}
91122
92- func (f * RawFrame ) trySliceMetadata (offset int ) ([]byte , bool ) {
123+ func (f * baseDefaultFrame ) trySliceMetadata (offset int ) ([]byte , bool ) {
93124 n , ok := f .trySeekMetadataLen (offset )
94125 if ! ok || n < 0 {
95126 return nil , false
96127 }
97128 return f .body .Bytes ()[offset + 3 : offset + 3 + n ], true
98129}
99130
100- func (f * RawFrame ) trySliceData (offset int ) []byte {
131+ func (f * baseDefaultFrame ) trySliceData (offset int ) []byte {
101132 n , ok := f .trySeekMetadataLen (offset )
102133 if ! ok {
103134 return f .body .Bytes ()[offset :]
@@ -108,32 +139,16 @@ func (f *RawFrame) trySliceData(offset int) []byte {
108139 return f .body .Bytes ()[offset + n + 3 :]
109140}
110141
111- func newTinyFrame (header core.FrameHeader ) * tinyFrame {
112- return & tinyFrame {
142+ func newBaseWriteableFrame (header core.FrameHeader ) baseWriteableFrame {
143+ return baseWriteableFrame {
113144 header : header ,
114145 done : make (chan struct {}),
115146 }
116147}
117148
118- // NewRawFrame returns a new RawFrame.
119- func NewRawFrame (header core.FrameHeader , body * common.ByteBuff ) * RawFrame {
120- return & RawFrame {
121- tinyFrame : newTinyFrame (header ),
122- body : body ,
123- }
124- }
125-
126- // FromBytes creates frame from a byte slice.
127- func FromBytes (b []byte ) (core.Frame , error ) {
128- if len (b ) < core .FrameHeaderLen {
129- return nil , errIncompleteFrame
130- }
131- header := core .ParseFrameHeader (b [:core .FrameHeaderLen ])
132- bb := common .NewByteBuff ()
133- _ , err := bb .Write (b [core .FrameHeaderLen :])
134- if err != nil {
135- return nil , err
149+ func newBaseDefaultFrame (header core.FrameHeader , body * common.ByteBuff ) * baseDefaultFrame {
150+ return & baseDefaultFrame {
151+ header : header ,
152+ body : body ,
136153 }
137- raw := NewRawFrame (header , bb )
138- return FromRawFrame (raw )
139154}
0 commit comments