mxvp-coinbase 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ module Coinbase
2
+ module Exchange
3
+ class Client < NetHTTPClient
4
+ end
5
+
6
+ class AsyncClient < EMHTTPClient
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,42 @@
1
+ module Coinbase
2
+ module Exchange
3
+ #
4
+ # Websocket Errors
5
+ #
6
+ class WebsocketError < RuntimeError
7
+ end
8
+
9
+ class DroppedPackets < WebsocketError
10
+ end
11
+
12
+ #
13
+ # Rest API Errors
14
+ #
15
+ class APIError < RuntimeError
16
+ end
17
+
18
+ # Status 400
19
+ class BadRequestError < APIError
20
+ end
21
+
22
+ # Status 401
23
+ class NotAuthorizedError < APIError
24
+ end
25
+
26
+ # Status 403
27
+ class ForbiddenError < APIError
28
+ end
29
+
30
+ # Status 404
31
+ class NotFoundError < APIError
32
+ end
33
+
34
+ # Status 429
35
+ class RateLimitError < APIError
36
+ end
37
+
38
+ # Status 500
39
+ class InternalServerError < APIError
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,6 @@
1
+ module Coinbase
2
+ # Gem version
3
+ module Exchange
4
+ VERSION = "0.2.0"
5
+ end
6
+ end
@@ -0,0 +1,119 @@
1
+ module Coinbase
2
+ module Exchange
3
+ # Websocket client for Coinbase Exchange
4
+ class Websocket
5
+ def initialize(options = {})
6
+ @ws_url = options[:ws_url] || "wss://ws-feed.gdax.com"
7
+ @product = options[:product_id] || 'BTC-USD'
8
+ @keepalive = options[:keepalive] || false
9
+
10
+ @message_cb = ->(_data) { nil }
11
+ @received_cb = ->(_data) { nil }
12
+ @open_cb = ->(_data) { nil }
13
+ @match_cb = ->(_data) { nil }
14
+ @change_cb = ->(_data) { nil }
15
+ @done_cb = ->(_data) { nil }
16
+ @error_cb = ->(_data) { nil }
17
+ end
18
+
19
+ def start!
20
+ if EventMachine.reactor_running?
21
+ @reactor_owner = false
22
+ refresh!
23
+ else
24
+ @reactor_owner = true
25
+ EM.run { refresh! }
26
+ end
27
+ end
28
+
29
+ def stop!
30
+ if @reactor_owner == true
31
+ @socket.onclose = ->(_event) { EM.stop }
32
+ else
33
+ @socket.onclose = ->(_event) { nil }
34
+ end
35
+ @socket.close
36
+ end
37
+
38
+ def refresh!
39
+ @socket = Faye::WebSocket::Client.new(@ws_url)
40
+ @socket.onopen = method(:ws_opened)
41
+ @socket.onmessage = method(:ws_received)
42
+ @socket.onclose = method(:ws_closed)
43
+ @socket.onerror = method(:ws_error)
44
+ end
45
+
46
+ def subscribe!(options = {})
47
+ product = options[:product_id] || @product
48
+ @socket.send({ type: 'subscribe', product_id: product }.to_json)
49
+ end
50
+
51
+ def ping(options = {})
52
+ msg = options[:payload] || Time.now.to_s
53
+ @socket.ping(msg) do |resp|
54
+ yield(resp) if block_given?
55
+ end
56
+ end
57
+
58
+ # Run this before processing every message
59
+ def message(&block)
60
+ @message_cb = block
61
+ end
62
+
63
+ def received(&block)
64
+ @received_cb = block
65
+ end
66
+
67
+ def open(&block)
68
+ @open_cb = block
69
+ end
70
+
71
+ def match(&block)
72
+ @match_cb = block
73
+ end
74
+
75
+ def change(&block)
76
+ @change_cb = block
77
+ end
78
+
79
+ def done(&block)
80
+ @done_cb = block
81
+ end
82
+
83
+ def error(&block)
84
+ @error_cb = block
85
+ end
86
+
87
+ private
88
+
89
+ def ws_opened(_event)
90
+ subscribe!
91
+ end
92
+
93
+ def ws_received(event)
94
+ data = APIObject.new(JSON.parse(event.data))
95
+ @message_cb.call(data)
96
+ case data['type']
97
+ when 'received' then @received_cb.call(data)
98
+ when 'open' then @open_cb.call(data)
99
+ when 'match' then @match_cb.call(data)
100
+ when 'change' then @change_cb.call(data)
101
+ when 'done' then @done_cb.call(data)
102
+ when 'error' then @error_cb.call(data)
103
+ end
104
+ end
105
+
106
+ def ws_closed(_event)
107
+ if @keepalive
108
+ refresh!
109
+ else
110
+ EM.stop
111
+ end
112
+ end
113
+
114
+ def ws_error(event)
115
+ fail WebsocketError, event.data
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,21 @@
1
+ require "bigdecimal"
2
+ require "json"
3
+ require "uri"
4
+ require "net/http"
5
+ require "em-http-request"
6
+ require "faye/websocket"
7
+
8
+ require "coinbase/exchange/errors"
9
+ require "coinbase/exchange/api_object"
10
+ require "coinbase/exchange/api_response"
11
+ require "coinbase/exchange/api_client.rb"
12
+ require "coinbase/exchange/adapters/net_http.rb"
13
+ require "coinbase/exchange/adapters/em_http.rb"
14
+ require "coinbase/exchange/client"
15
+ require "coinbase/exchange/websocket"
16
+
17
+ module Coinbase
18
+ # Coinbase Exchange module
19
+ module Exchange
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mxvp-coinbase
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - John Duhamel
8
+ - James Mock
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-03-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bigdecimal
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: faye-websocket
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: em-http-request
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.8'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.8'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '10.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '10.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: webmock
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: pry
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description:
127
+ email:
128
+ - james.willard.mock@gmail.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".gitignore"
134
+ - ".rubocop.yml"
135
+ - CONTRIBUTING.md
136
+ - Gemfile
137
+ - LICENSE
138
+ - README.md
139
+ - Rakefile
140
+ - bin/console
141
+ - bin/setup
142
+ - coinbase-exchange.gemspec
143
+ - lib/coinbase/exchange.rb
144
+ - lib/coinbase/exchange/adapters/em_http.rb
145
+ - lib/coinbase/exchange/adapters/net_http.rb
146
+ - lib/coinbase/exchange/api_client.rb
147
+ - lib/coinbase/exchange/api_object.rb
148
+ - lib/coinbase/exchange/api_response.rb
149
+ - lib/coinbase/exchange/ca-coinbase.crt
150
+ - lib/coinbase/exchange/client.rb
151
+ - lib/coinbase/exchange/errors.rb
152
+ - lib/coinbase/exchange/version.rb
153
+ - lib/coinbase/exchange/websocket.rb
154
+ homepage: https://github.com/jwmock/coinbase-exchange-ruby
155
+ licenses:
156
+ - MIT
157
+ metadata: {}
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 2.4.8
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Client library for Coinbase Exchange
178
+ test_files: []