1package chat
2
3import (
4	"time"
5
6	"github.com/keybase/client/go/chat/globals"
7	"github.com/keybase/client/go/chat/types"
8	"github.com/keybase/client/go/chat/utils"
9	"github.com/keybase/go-framed-msgpack-rpc/rpc"
10	"golang.org/x/net/context"
11)
12
13type RemoteClient struct {
14	utils.DebugLabeler
15
16	cli rpc.GenericClient
17}
18
19func NewRemoteClient(g *globals.Context, cli rpc.GenericClient) *RemoteClient {
20	return &RemoteClient{
21		DebugLabeler: utils.NewDebugLabeler(g.ExternalG(), "RemoteClient", false),
22		cli:          cli,
23	}
24}
25
26func (c *RemoteClient) Call(ctx context.Context, method string, arg interface{},
27	res interface{}, timeout time.Duration) (err error) {
28	defer c.Trace(ctx, &err, method)()
29	err = c.cli.Call(ctx, method, arg, res, timeout)
30	if err == nil {
31		if rlRes, ok := res.(types.RateLimitedResult); ok {
32			globals.CtxAddRateLimit(ctx, rlRes.GetRateLimit())
33		}
34	}
35	return err
36}
37
38func (c *RemoteClient) CallCompressed(ctx context.Context, method string, arg interface{},
39	res interface{}, ctype rpc.CompressionType, timeout time.Duration) (err error) {
40	defer c.Trace(ctx, &err, method)()
41	err = c.cli.CallCompressed(ctx, method, arg, res, ctype, timeout)
42	if err == nil {
43		if rlRes, ok := res.(types.RateLimitedResult); ok {
44			globals.CtxAddRateLimit(ctx, rlRes.GetRateLimit())
45		}
46	}
47	return err
48}
49
50func (c *RemoteClient) Notify(ctx context.Context, method string, arg interface{}, timeout time.Duration) (err error) {
51	defer c.Trace(ctx, &err, method)()
52	return c.cli.Notify(ctx, method, arg, timeout)
53}
54