forked from stith/gorelp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevents.go
81 lines (69 loc) · 1.74 KB
/
events.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
package relp
import "time"
import "log"
import (
"errors"
"fmt"
)
type generalClientEvent struct {
client *Client
event string
message string
error error
}
// String renders event as string
func (e *generalClientEvent) String() string {
return fmt.Sprintf("ClientEvent[%v,%v,%v]",
e.event, e.message, e.error)
}
// Client returns the client sending this message
func (e *generalClientEvent) Client() *Client {
return e.client
}
// Error returns the error contained within this event
func (e *generalClientEvent) Error() error {
return e.error
}
// Event returns a concise string name of the event
func (e *generalClientEvent) Event() string {
return e.event
}
// Message returns a more detailed string description of the event
func (e *generalClientEvent) Message() string {
return e.message
}
// send an event on the listener channel
func (c *Client) notify(event ClientEvent) error {
if c.eventChan == nil {
return nil
}
select {
case c.eventChan <- event:
return nil
case <-time.After(100 * time.Millisecond):
log.Print("notify() timed out after 100ms")
return errors.New("notify() timed out after 100ms")
}
}
// send a standard error object on the notification channel
func (c *Client) notifyError(err error) {
_ = c.notify(&generalClientEvent{
client: c,
event: "error",
message: err.Error(),
error: err,
})
}
// notify the user of the Client that it has been closed
func (c *Client) notifyClose() error {
return c.notifyEvent("serverclose", "server closed connection")
}
// send a general event given a string event name adn message
func (c *Client) notifyEvent(event string, message string) error {
return c.notify(&generalClientEvent{
client: c,
event: event,
message: message,
error: nil,
})
}