-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathdispatcher.go
68 lines (57 loc) · 1.48 KB
/
dispatcher.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
package gostratum
import (
"sync"
"errors"
"encoding/json"
)
type Dispatcher struct{
pending map[uint64] *Action
callbacks map[string] func(*json.RawMessage)
mutex *sync.Mutex
}
func MakeDispatcher() *Dispatcher{
return &Dispatcher{pending:make(map[uint64] *Action), callbacks: make(map[string] func(*json.RawMessage)), mutex: &sync.Mutex{}}
}
func (d *Dispatcher) RegisterRequest(request *Request) (*Action, error){
action:=MakeAction()
d.mutex.Lock()
defer d.mutex.Unlock()
if d.pending[request.ID] !=nil{
return nil,errors.New("id already taken")
}
d.pending[request.ID] = action
return action,nil
}
func (d *Dispatcher) RegisterNotifiactionHandler(uri string, callback func(*json.RawMessage)){
d.mutex.Lock()
defer d.mutex.Unlock()
d.callbacks[uri] = callback
}
func (d *Dispatcher) Cancel(id uint64){
d.mutex.Lock()
defer d.mutex.Unlock()
delete(d.pending, id)
}
func (d *Dispatcher) Process(msg *Response){
d.mutex.Lock()
action := d.pending[msg.ID]
if action!=nil{
delete(d.pending, msg.ID)
d.mutex.Unlock()
action.Done(msg)
}else{
callback:=d.callbacks[msg.Method]
d.mutex.Unlock()
if(callback!=nil){
callback(msg.Params)
}
}
}
func (d *Dispatcher) Error(err error){
response := &Response{Error:err}
d.mutex.Lock()
defer d.mutex.Unlock()
for _,action := range d.pending{
action.Done(response)
}
}