-
Notifications
You must be signed in to change notification settings - Fork 1
/
mcall.go
60 lines (48 loc) · 1.06 KB
/
mcall.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
package bddp
import (
"errors"
"github.com/glycerine/go-capnproto"
)
var (
ErrMethodInterrupted = errors.New("client disconnected")
)
type MCall interface {
Segment() (seg *capn.Segment)
Call(params capn.Object) (res capn.Object, err error)
}
type mcall struct {
id string
name string
client *client
segment *capn.Segment
message *Message
}
func (m *mcall) Segment() (seg *capn.Segment) {
return m.segment
}
// Response will be nil if the method call fails inflight
func (m *mcall) Call(params capn.Object) (res capn.Object, err error) {
root := m.message
msg := NewMethodMsg(m.segment)
msg.SetId(m.id)
msg.SetMethod(m.name)
msg.SetParams(params)
root.SetMethod(msg)
ch := make(chan *ResultMsg)
m.client.calls[m.id] = ch
m.client.write(root)
// wait until we get a response
response := <-ch
delete(m.client.calls, m.id)
if response == nil {
err = ErrMethodInterrupted
return res, err
}
switch response.Which() {
case RESULTMSG_RESULT:
res = response.Result()
case RESULTMSG_ERROR:
err = response.Error()
}
return res, err
}