peatio 0.6.3 → 2.4.0.pre.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +148 -8
- data/Gemfile +3 -1
- data/Gemfile.lock +42 -30
- data/lib/peatio.rb +15 -2
- data/lib/peatio/command/inject.rb +3 -1
- data/lib/peatio/command/root.rb +0 -2
- data/lib/peatio/command/security.rb +2 -3
- data/lib/peatio/command/service.rb +18 -4
- data/lib/peatio/injectors/peatio_events.rb +117 -53
- data/lib/peatio/logger.rb +9 -7
- data/lib/peatio/metrics/server.rb +15 -0
- data/lib/peatio/mq/client.rb +35 -14
- data/lib/peatio/ranger/connection.rb +110 -0
- data/lib/peatio/ranger/events.rb +11 -0
- data/lib/peatio/ranger/router.rb +234 -0
- data/lib/peatio/ranger/web_socket.rb +68 -0
- data/lib/peatio/version.rb +1 -1
- data/peatio.gemspec +21 -17
- metadata +76 -32
- data/lib/peatio/command/amqp.rb +0 -9
- data/lib/peatio/mq/events.rb +0 -128
- data/lib/peatio/ranger.rb +0 -135
data/lib/peatio/ranger.rb
DELETED
@@ -1,135 +0,0 @@
|
|
1
|
-
module Peatio::Ranger
|
2
|
-
class Connection
|
3
|
-
def initialize(authenticator, socket, logger)
|
4
|
-
@authenticator = authenticator
|
5
|
-
@socket = socket
|
6
|
-
@logger = logger
|
7
|
-
end
|
8
|
-
|
9
|
-
def send(method, data)
|
10
|
-
payload = JSON.dump(method => data)
|
11
|
-
@logger.debug { payload }
|
12
|
-
@socket.send payload
|
13
|
-
end
|
14
|
-
|
15
|
-
def authenticate(jwt)
|
16
|
-
payload = {}
|
17
|
-
authorized = false
|
18
|
-
begin
|
19
|
-
payload = @authenticator.authenticate!(jwt)
|
20
|
-
authorized = true
|
21
|
-
rescue Peatio::Auth::Error => error
|
22
|
-
@logger.error error.message
|
23
|
-
end
|
24
|
-
return [authorized, payload]
|
25
|
-
end
|
26
|
-
|
27
|
-
def update_streams
|
28
|
-
@socket.instance_variable_set(:@connection_handler, @client)
|
29
|
-
end
|
30
|
-
|
31
|
-
def subscribe(streams)
|
32
|
-
raise "Streams must be an array of strings" unless streams.is_a?(Array)
|
33
|
-
streams.each do |stream|
|
34
|
-
next if stream.nil?
|
35
|
-
@client.streams[stream] = true
|
36
|
-
end
|
37
|
-
send :success, message: "subscribed", streams: @client.streams.keys
|
38
|
-
end
|
39
|
-
|
40
|
-
def unsubscribe(streams)
|
41
|
-
raise "Streams must be an array of strings" unless streams.is_a?(Array)
|
42
|
-
streams.each do |stream|
|
43
|
-
next if stream.nil?
|
44
|
-
@client.streams.delete(stream)
|
45
|
-
end
|
46
|
-
send :success, message: "unsubscribed", streams: @client.streams.keys
|
47
|
-
end
|
48
|
-
|
49
|
-
def handle(msg)
|
50
|
-
begin
|
51
|
-
data = JSON.parse(msg)
|
52
|
-
|
53
|
-
case data["event"]
|
54
|
-
when "subscribe"
|
55
|
-
subscribe data["streams"]
|
56
|
-
when "unsubscribe"
|
57
|
-
unsubscribe data["streams"]
|
58
|
-
end
|
59
|
-
|
60
|
-
rescue JSON::ParserError => error
|
61
|
-
@logger.debug { "#{error}, msg: `#{msg}`" }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def handshake(hs)
|
66
|
-
@client = Peatio::MQ::Events::Client.new(@socket)
|
67
|
-
|
68
|
-
query = URI::decode_www_form(hs.query_string)
|
69
|
-
subscribe(query.map {|item| item.last if item.first == "stream"})
|
70
|
-
@logger.info "ranger: WebSocket connection openned"
|
71
|
-
|
72
|
-
if hs.headers_downcased.key?("authorization")
|
73
|
-
authorized, payload = authenticate(hs.headers["authorization"])
|
74
|
-
|
75
|
-
if !authorized
|
76
|
-
@logger.info "ranger: #{@client.user} authentication failed"
|
77
|
-
raise EM::WebSocket::HandshakeError, "Authorization failed"
|
78
|
-
else
|
79
|
-
@logger.info [authorized, payload].inspect
|
80
|
-
@client.user = payload[:uid]
|
81
|
-
@client.authorized = true
|
82
|
-
@logger.info "ranger: user #{@client.user} authenticated #{@client.streams}"
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def self.run!(jwt_public_key)
|
89
|
-
host = ENV["RANGER_HOST"] || "0.0.0.0"
|
90
|
-
port = ENV["RANGER_PORT"] || "8081"
|
91
|
-
|
92
|
-
authenticator = Peatio::Auth::JWTAuthenticator.new(jwt_public_key)
|
93
|
-
|
94
|
-
logger = Peatio::Logger.logger
|
95
|
-
logger.info "Starting the server on port #{port}"
|
96
|
-
|
97
|
-
EM.run do
|
98
|
-
Peatio::MQ::Client.new
|
99
|
-
Peatio::MQ::Client.connect!
|
100
|
-
Peatio::MQ::Client.create_channel!
|
101
|
-
|
102
|
-
Peatio::MQ::Events.subscribe!
|
103
|
-
|
104
|
-
EM::WebSocket.start(
|
105
|
-
host: host,
|
106
|
-
port: port,
|
107
|
-
secure: false
|
108
|
-
) do |socket|
|
109
|
-
connection = Connection.new(authenticator, socket, logger)
|
110
|
-
|
111
|
-
socket.onopen do |hs|
|
112
|
-
connection.handshake(hs)
|
113
|
-
end
|
114
|
-
|
115
|
-
socket.onmessage do |msg|
|
116
|
-
connection.handle(msg)
|
117
|
-
end
|
118
|
-
|
119
|
-
socket.onping do |value|
|
120
|
-
logger.info "Received ping: #{value}"
|
121
|
-
end
|
122
|
-
|
123
|
-
socket.onclose do
|
124
|
-
logger.info "ranger: websocket connection closed"
|
125
|
-
end
|
126
|
-
|
127
|
-
socket.onerror do |e|
|
128
|
-
logger.error "ranger: WebSocket Error: #{e.message}"
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
yield if block_given?
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|