forked from keybase/client
/
kex2_router.go
92 lines (76 loc) · 2.29 KB
/
kex2_router.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
// Copyright 2015 Keybase, Inc. All rights reserved. Use of
// this source code is governed by the included BSD license.
package libkb
import (
"encoding/base64"
"time"
"github.com/keybase/client/go/kex2"
)
// KexRouter implements the kex2.MessageRouter interface.
type KexRouter struct {
Contextified
}
// NewKexRouter creates a contextified KexRouter.
func NewKexRouter(g *GlobalContext) *KexRouter {
return &KexRouter{Contextified: NewContextified(g)}
}
// Post implements Post in the kex2.MessageRouter interface.
func (k *KexRouter) Post(sessID kex2.SessionID, sender kex2.DeviceID, seqno kex2.Seqno, msg []byte) (err error) {
k.G().Log.Debug("+ KexRouter.Post(%x, %x, %d, ...)", sessID, sender, seqno)
defer func() {
k.G().Log.Debug("- KexRouter.Post(%x, %x, %d) -> %s", sessID, sender, seqno, ErrToOk(err))
}()
_, err = k.G().API.Post(APIArg{
Endpoint: "kex2/send",
Args: HTTPArgs{
"I": HexArg(sessID[:]),
"sender": HexArg(sender[:]),
"seqno": I{Val: int(seqno)},
"msg": B64Arg(msg),
},
})
return err
}
type kexResp struct {
Msgs []struct {
Msg string `json:"msg"`
} `json:"msgs"`
Status AppStatus `json:"status"`
}
func (k *kexResp) GetAppStatus() *AppStatus {
return &k.Status
}
// Get implements Get in the kex2.MessageRouter interface.
func (k *KexRouter) Get(sessID kex2.SessionID, receiver kex2.DeviceID, low kex2.Seqno, poll time.Duration) (msgs [][]byte, err error) {
k.G().Log.Debug("+ KexRouter.Get(%x, %x, %d, %s)", sessID, receiver, low, poll)
defer func() {
k.G().Log.Debug("- KexRouter.Get(%x, %x, %d, %s) -> %s (messages: %d)", sessID, receiver, low, poll, ErrToOk(err), len(msgs))
}()
if poll > HTTPPollMaximum {
poll = HTTPPollMaximum
}
arg := APIArg{
Endpoint: "kex2/receive",
Args: HTTPArgs{
"I": HexArg(sessID[:]),
"receiver": HexArg(receiver[:]),
"low": I{Val: int(low)},
"poll": I{Val: int(poll / time.Millisecond)},
},
}
var j kexResp
if err = k.G().API.GetDecode(arg, &j); err != nil {
return nil, err
}
if j.Status.Code != SCOk {
return nil, AppStatusError{Code: j.Status.Code, Name: j.Status.Name, Desc: j.Status.Desc}
}
for _, m := range j.Msgs {
dec, err := base64.StdEncoding.DecodeString(m.Msg)
if err != nil {
return nil, err
}
msgs = append(msgs, dec)
}
return msgs, nil
}