-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathev.go
112 lines (101 loc) · 1.66 KB
/
ev.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
package l2
import "sync"
const (
EvTCP = iota + 1
EvTCPReady
EvTCPConnAdded
EvTCPConnDeleted
EvTCPReadInboundError
EvTCPConnGotAddr
EvTCPConnGotIP
EvTCPInboundSent
EvTCPListening
EvTCPListenFailed
EvTCPListened
EvTCPAccepted
EvTCPDialing
EvTCPDialed
EvTCPDialFailed
EvTCPRefreshed
EvTCPWriteError
EvTCPNotSent
EvTCPListenerClosed
EvTCPClosed
EvTCPSlow
EvUDP
EvUDPReady
EvUDPRemoteAdded
EvUDPLocalAdded
EvUDPConnReadError
EvUDPReadInboundError
EvUDPLocalClosed
EvUDPRemoteClosed
EvUDPRemoteGotAddr
EvUDPRemoteGotIP
EvUDPInboundSent
EvUDPWriteError
EvUDPNotSent
EvUDPClosed
EvICMP
EvICMPReady
EvICMPClosed
EvICMPNotSent
EvICMPInboundSent
EvICMPReadInboundError
EvICMPWriteError
EvNetwork
EvNetworkClosing
EvNetworkOutboundSent
EvNetworkInboundReceived
EvNetworkInboundDuplicated
EvNetworkInboundWritten
)
type (
On func(ev any, fn any)
Trigger func(scope Scope, evs ...any)
)
func (Network) Events() (
on On,
trigger Trigger,
) {
type callback struct {
fn any
oneshot bool
}
callbacks := make(map[any][]callback)
var l sync.Mutex
on = func(ev any, fn any) {
l.Lock()
defer l.Unlock()
callbacks[ev] = append(callbacks[ev], callback{
fn: fn,
})
}
trigger = func(scope Scope, evs ...any) {
for _, ev := range evs {
l.Lock()
cs := callbacks[ev]
if len(cs) == 0 {
l.Unlock()
continue
}
var fns []any
i := 0
for i < len(cs) {
callback := cs[i]
fns = append(fns, callback.fn)
if callback.oneshot {
cs = append(cs[:i], cs[i+1:]...)
continue
}
i++
}
callbacks[ev] = cs
l.Unlock()
for _, fn := range fns {
scope.Call(fn)
}
}
}
return
}