-
Notifications
You must be signed in to change notification settings - Fork 308
/
mysterium_api.go
142 lines (118 loc) · 3.36 KB
/
mysterium_api.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package server
import (
"fmt"
"net/http"
log "github.com/cihub/seelog"
"github.com/mysterium/node/identity"
"github.com/mysterium/node/server/dto"
dto_discovery "github.com/mysterium/node/service_discovery/dto"
"net/url"
)
const (
mysteriumApiLogPrefix = "[Mysterium.api] "
)
//HttpTransport interface with single method do is extracted from net/transport.Client structure
type HttpTransport interface {
Do(*http.Request) (*http.Response, error)
}
type mysteriumApi struct {
http HttpTransport
}
//NewClient creates mysterium centralized api instance with real communcation
func NewClient() Client {
return &mysteriumApi{
&http.Client{
Transport: &http.Transport{},
},
}
}
func (mApi *mysteriumApi) RegisterIdentity(identity identity.Identity, signer identity.Signer) error {
req, err := newSignedPostRequest("identities", dto.CreateIdentityRequest{
Identity: identity.Address,
}, signer)
if err != nil {
return err
}
err = mApi.doRequest(req)
if err == nil {
log.Info(mysteriumApiLogPrefix, "Identity registered: ", identity)
}
return err
}
func (mApi *mysteriumApi) RegisterProposal(proposal dto_discovery.ServiceProposal, signer identity.Signer) error {
req, err := newSignedPostRequest("node_register", dto.NodeRegisterRequest{
ServiceProposal: proposal,
}, signer)
if err != nil {
return err
}
err = mApi.doRequest(req)
if err == nil {
log.Info(mysteriumApiLogPrefix, "Node registered: ", proposal.ProviderId)
}
return err
}
func (mApi *mysteriumApi) NodeSendStats(nodeKey string, signer identity.Signer) error {
req, err := newSignedPostRequest("node_send_stats", dto.NodeStatsRequest{
NodeKey: nodeKey,
// TODO Refactor Node statistics with new `SessionStats` DTO
Sessions: []dto.SessionStats{},
}, signer)
if err != nil {
return err
}
err = mApi.doRequest(req)
if err == nil {
log.Info(mysteriumApiLogPrefix, "Node stats sent: ", nodeKey)
} else {
log.Error(mysteriumApiLogPrefix, "Node stats failed: ", err)
}
return err
}
func (mApi *mysteriumApi) FindProposals(nodeKey string) ([]dto_discovery.ServiceProposal, error) {
values := url.Values{}
values.Set("node_key", nodeKey)
req, err := newGetRequest("proposals", values)
if err != nil {
return nil, err
}
var proposalsResponse dto.ProposalsResponse
err = mApi.doRequestAndParseResponse(req, &proposalsResponse)
if err != nil {
return nil, err
}
log.Info(mysteriumApiLogPrefix, "FindProposals fetched: ", proposalsResponse.Proposals)
return proposalsResponse.Proposals, nil
}
func (mApi *mysteriumApi) SendSessionStats(sessionId string, sessionStats dto.SessionStats, signer identity.Signer) error {
path := fmt.Sprintf("sessions/%s/stats", sessionId)
req, err := newSignedPostRequest(path, sessionStats, signer)
if err != nil {
return err
}
err = mApi.doRequest(req)
if err == nil {
log.Info(mysteriumApiLogPrefix, "Session stats sent: ", sessionId)
}
return nil
}
func (mApi *mysteriumApi) doRequest(req *http.Request) error {
resp, err := mApi.http.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return parseResponseError(resp)
}
func (mApi *mysteriumApi) doRequestAndParseResponse(req *http.Request, responseValue interface{}) error {
resp, err := mApi.http.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
err = parseResponseError(resp)
if err != nil {
return err
}
return parseResponseJson(resp, responseValue)
}