-
Notifications
You must be signed in to change notification settings - Fork 3
/
event.go
127 lines (99 loc) · 2.41 KB
/
event.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package socket
import (
"github.com/gogf/gf/v2/os/gctx"
"github.com/iimeta/iim-server/utility/logger"
)
type IEvent interface {
Open(client IClient)
Message(client IClient, data []byte)
Close(client IClient, code int, text string)
Destroy(client IClient)
}
type (
OpenEvent func(client IClient)
MessageEvent func(client IClient, data []byte)
CloseEvent func(client IClient, code int, text string)
DestroyEvent func(client IClient)
EventOption func(event *Event)
)
type Event struct {
open OpenEvent
message MessageEvent
close CloseEvent
destroy DestroyEvent
}
func NewEvent(opts ...EventOption) IEvent {
o := &Event{}
for _, opt := range opts {
opt(o)
}
return o
}
func (c *Event) Open(client IClient) {
if c.open == nil {
return
}
defer func() {
if err := recover(); err != nil {
logger.Error(gctx.New(), "open event callback exception: ", client.Uid(), client.Cid(), client.Channel().Name(), err)
}
}()
c.open(client)
}
func (c *Event) Message(client IClient, data []byte) {
if c.message == nil {
return
}
defer func() {
if err := recover(); err != nil {
logger.Error(gctx.New(), "message event callback exception: ", client.Uid(), client.Cid(), client.Channel().Name(), err)
}
}()
c.message(client, data)
}
func (c *Event) Close(client IClient, code int, text string) {
if c.close == nil {
return
}
defer func() {
if err := recover(); err != nil {
logger.Error(gctx.New(), "close event callback exception: ", client.Uid(), client.Cid(), client.Channel().Name(), err)
}
}()
c.close(client, code, text)
}
func (c *Event) Destroy(client IClient) {
if c.destroy == nil {
return
}
defer func() {
if err := recover(); err != nil {
logger.Error(gctx.New(), "destroy event callback exception: ", client.Uid(), client.Cid(), client.Channel().Name(), err)
}
}()
c.destroy(client)
}
// WithOpenEvent 连接成功回调事件
func WithOpenEvent(e OpenEvent) EventOption {
return func(event *Event) {
event.open = e
}
}
// WithMessageEvent 消息回调事件
func WithMessageEvent(e MessageEvent) EventOption {
return func(event *Event) {
event.message = e
}
}
// WithCloseEvent 连接关闭回调事件
func WithCloseEvent(e CloseEvent) EventOption {
return func(event *Event) {
event.close = e
}
}
// WithDestroyEvent 连接销毁回调事件
func WithDestroyEvent(e DestroyEvent) EventOption {
return func(event *Event) {
event.destroy = e
}
}