scout 5.7.1 → 5.7.2.pre

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.
Files changed (251) hide show
  1. data/CHANGELOG.markdown +5 -0
  2. data/lib/scout/command/run.rb +1 -1
  3. data/lib/scout/server.rb +2 -1
  4. data/lib/scout/streamer.rb +3 -2
  5. data/lib/scout/streamer_daemon.rb +4 -4
  6. data/lib/scout/version.rb +1 -1
  7. data/test/scout_test.rb +7 -8
  8. data/vendor/httpclient/README.txt +759 -0
  9. data/vendor/httpclient/bin/httpclient +65 -0
  10. data/vendor/httpclient/lib/hexdump.rb +50 -0
  11. data/vendor/httpclient/lib/http-access2.rb +55 -0
  12. data/vendor/httpclient/lib/http-access2/cookie.rb +1 -0
  13. data/vendor/httpclient/lib/http-access2/http.rb +1 -0
  14. data/vendor/httpclient/lib/httpclient.rb +1156 -0
  15. data/vendor/httpclient/lib/httpclient/auth.rb +899 -0
  16. data/vendor/httpclient/lib/httpclient/cacert.p7s +1912 -0
  17. data/vendor/httpclient/lib/httpclient/connection.rb +88 -0
  18. data/vendor/httpclient/lib/httpclient/cookie.rb +438 -0
  19. data/vendor/httpclient/lib/httpclient/http.rb +1046 -0
  20. data/vendor/httpclient/lib/httpclient/include_client.rb +83 -0
  21. data/vendor/httpclient/lib/httpclient/session.rb +1025 -0
  22. data/vendor/httpclient/lib/httpclient/ssl_config.rb +403 -0
  23. data/vendor/httpclient/lib/httpclient/timeout.rb +140 -0
  24. data/vendor/httpclient/lib/httpclient/util.rb +178 -0
  25. data/vendor/httpclient/lib/httpclient/version.rb +3 -0
  26. data/vendor/httpclient/lib/oauthclient.rb +110 -0
  27. data/vendor/httpclient/sample/async.rb +8 -0
  28. data/vendor/httpclient/sample/auth.rb +11 -0
  29. data/vendor/httpclient/sample/cookie.rb +18 -0
  30. data/vendor/httpclient/sample/dav.rb +103 -0
  31. data/vendor/httpclient/sample/howto.rb +49 -0
  32. data/vendor/httpclient/sample/oauth_buzz.rb +57 -0
  33. data/vendor/httpclient/sample/oauth_friendfeed.rb +59 -0
  34. data/vendor/httpclient/sample/oauth_salesforce_10.rb +63 -0
  35. data/vendor/httpclient/sample/oauth_twitter.rb +61 -0
  36. data/vendor/httpclient/sample/ssl/0cert.pem +22 -0
  37. data/vendor/httpclient/sample/ssl/0key.pem +30 -0
  38. data/vendor/httpclient/sample/ssl/1000cert.pem +19 -0
  39. data/vendor/httpclient/sample/ssl/1000key.pem +18 -0
  40. data/vendor/httpclient/sample/ssl/htdocs/index.html +10 -0
  41. data/vendor/httpclient/sample/ssl/ssl_client.rb +22 -0
  42. data/vendor/httpclient/sample/ssl/webrick_httpsd.rb +29 -0
  43. data/vendor/httpclient/sample/stream.rb +21 -0
  44. data/vendor/httpclient/sample/thread.rb +27 -0
  45. data/vendor/httpclient/sample/wcat.rb +21 -0
  46. data/vendor/httpclient/test/ca-chain.cert +44 -0
  47. data/vendor/httpclient/test/ca.cert +23 -0
  48. data/vendor/httpclient/test/client.cert +19 -0
  49. data/vendor/httpclient/test/client.key +15 -0
  50. data/vendor/httpclient/test/helper.rb +129 -0
  51. data/vendor/httpclient/test/htdigest +1 -0
  52. data/vendor/httpclient/test/htpasswd +2 -0
  53. data/vendor/httpclient/test/runner.rb +2 -0
  54. data/vendor/httpclient/test/server.cert +19 -0
  55. data/vendor/httpclient/test/server.key +15 -0
  56. data/vendor/httpclient/test/sslsvr.rb +65 -0
  57. data/vendor/httpclient/test/subca.cert +21 -0
  58. data/vendor/httpclient/test/test_auth.rb +321 -0
  59. data/vendor/httpclient/test/test_cookie.rb +391 -0
  60. data/vendor/httpclient/test/test_hexdump.rb +14 -0
  61. data/vendor/httpclient/test/test_http-access2.rb +507 -0
  62. data/vendor/httpclient/test/test_httpclient.rb +1783 -0
  63. data/vendor/httpclient/test/test_include_client.rb +52 -0
  64. data/vendor/httpclient/test/test_ssl.rb +235 -0
  65. data/vendor/multi_json/.document +5 -0
  66. data/vendor/multi_json/.rspec +3 -0
  67. data/vendor/multi_json/.travis.yml +11 -0
  68. data/vendor/multi_json/.yardopts +6 -0
  69. data/vendor/multi_json/CHANGELOG.md +169 -0
  70. data/vendor/multi_json/CONTRIBUTING.md +46 -0
  71. data/vendor/multi_json/Gemfile +31 -0
  72. data/vendor/multi_json/LICENSE.md +20 -0
  73. data/vendor/multi_json/README.md +109 -0
  74. data/vendor/multi_json/Rakefile +12 -0
  75. data/vendor/multi_json/lib/multi_json.rb +157 -0
  76. data/vendor/multi_json/lib/multi_json/adapter.rb +48 -0
  77. data/vendor/multi_json/lib/multi_json/adapters/gson.rb +19 -0
  78. data/vendor/multi_json/lib/multi_json/adapters/jr_jackson.rb +19 -0
  79. data/vendor/multi_json/lib/multi_json/adapters/json_common.rb +25 -0
  80. data/vendor/multi_json/lib/multi_json/adapters/json_gem.rb +11 -0
  81. data/vendor/multi_json/lib/multi_json/adapters/json_pure.rb +11 -0
  82. data/vendor/multi_json/lib/multi_json/adapters/nsjsonserialization.rb +34 -0
  83. data/vendor/multi_json/lib/multi_json/adapters/oj.rb +24 -0
  84. data/vendor/multi_json/lib/multi_json/adapters/ok_json.rb +22 -0
  85. data/vendor/multi_json/lib/multi_json/adapters/yajl.rb +19 -0
  86. data/vendor/multi_json/lib/multi_json/convertible_hash_keys.rb +43 -0
  87. data/vendor/multi_json/lib/multi_json/load_error.rb +11 -0
  88. data/vendor/multi_json/lib/multi_json/options.rb +48 -0
  89. data/vendor/multi_json/lib/multi_json/vendor/okjson.rb +606 -0
  90. data/vendor/multi_json/lib/multi_json/version.rb +20 -0
  91. data/vendor/multi_json/multi_json.gemspec +22 -0
  92. data/vendor/multi_json/spec/adapter_shared_example.rb +235 -0
  93. data/vendor/multi_json/spec/has_options.rb +119 -0
  94. data/vendor/multi_json/spec/helper.rb +35 -0
  95. data/vendor/multi_json/spec/json_common_shared_example.rb +30 -0
  96. data/vendor/multi_json/spec/multi_json_spec.rb +226 -0
  97. data/vendor/{signature → pusher}/.document +0 -0
  98. data/vendor/{json_pure/diagrams/.keep → pusher/.gemtest} +0 -0
  99. data/vendor/pusher/.gitignore +23 -0
  100. data/vendor/pusher/.travis.yml +15 -0
  101. data/vendor/pusher/Gemfile +2 -0
  102. data/vendor/{pusher-gem → pusher}/LICENSE +1 -1
  103. data/vendor/pusher/README.md +186 -0
  104. data/vendor/{pusher-gem → pusher}/Rakefile +0 -0
  105. data/vendor/{pusher-gem → pusher}/examples/async_message.rb +0 -0
  106. data/vendor/pusher/lib/pusher.rb +60 -0
  107. data/vendor/{pusher-gem → pusher}/lib/pusher/channel.rb +47 -54
  108. data/vendor/pusher/lib/pusher/client.rb +306 -0
  109. data/vendor/pusher/lib/pusher/request.rb +107 -0
  110. data/vendor/pusher/lib/pusher/resource.rb +36 -0
  111. data/vendor/pusher/lib/pusher/webhook.rb +110 -0
  112. data/vendor/{pusher-gem → pusher}/pusher.gemspec +6 -5
  113. data/vendor/pusher/spec/channel_spec.rb +127 -0
  114. data/vendor/pusher/spec/client_spec.rb +464 -0
  115. data/vendor/{pusher-gem → pusher}/spec/spec_helper.rb +12 -0
  116. data/vendor/pusher/spec/web_hook_spec.rb +117 -0
  117. data/vendor/signature/.travis.yml +15 -0
  118. data/vendor/signature/Gemfile +1 -1
  119. data/vendor/signature/README.md +38 -28
  120. data/vendor/signature/lib/signature.rb +97 -15
  121. data/vendor/signature/lib/signature/query_encoder.rb +47 -0
  122. data/vendor/signature/lib/signature/version.rb +1 -1
  123. data/vendor/signature/signature.gemspec +3 -2
  124. data/vendor/signature/spec/signature_spec.rb +164 -55
  125. data/vendor/signature/spec/spec_helper.rb +2 -3
  126. metadata +120 -145
  127. data/vendor/json_pure/.gitignore +0 -12
  128. data/vendor/json_pure/.travis.yml +0 -20
  129. data/vendor/json_pure/CHANGES +0 -282
  130. data/vendor/json_pure/COPYING +0 -58
  131. data/vendor/json_pure/COPYING-json-jruby +0 -57
  132. data/vendor/json_pure/GPL +0 -340
  133. data/vendor/json_pure/Gemfile +0 -11
  134. data/vendor/json_pure/README-json-jruby.markdown +0 -33
  135. data/vendor/json_pure/README.rdoc +0 -358
  136. data/vendor/json_pure/Rakefile +0 -412
  137. data/vendor/json_pure/TODO +0 -1
  138. data/vendor/json_pure/VERSION +0 -1
  139. data/vendor/json_pure/data/example.json +0 -1
  140. data/vendor/json_pure/data/index.html +0 -38
  141. data/vendor/json_pure/data/prototype.js +0 -4184
  142. data/vendor/json_pure/ext/json/ext/fbuffer/fbuffer.h +0 -181
  143. data/vendor/json_pure/ext/json/ext/generator/depend +0 -1
  144. data/vendor/json_pure/ext/json/ext/generator/extconf.rb +0 -14
  145. data/vendor/json_pure/ext/json/ext/generator/generator.c +0 -1435
  146. data/vendor/json_pure/ext/json/ext/generator/generator.h +0 -148
  147. data/vendor/json_pure/ext/json/ext/parser/depend +0 -1
  148. data/vendor/json_pure/ext/json/ext/parser/extconf.rb +0 -13
  149. data/vendor/json_pure/ext/json/ext/parser/parser.c +0 -2204
  150. data/vendor/json_pure/ext/json/ext/parser/parser.h +0 -77
  151. data/vendor/json_pure/ext/json/ext/parser/parser.rl +0 -927
  152. data/vendor/json_pure/install.rb +0 -23
  153. data/vendor/json_pure/java/src/json/ext/ByteListTranscoder.java +0 -167
  154. data/vendor/json_pure/java/src/json/ext/Generator.java +0 -444
  155. data/vendor/json_pure/java/src/json/ext/GeneratorMethods.java +0 -232
  156. data/vendor/json_pure/java/src/json/ext/GeneratorService.java +0 -43
  157. data/vendor/json_pure/java/src/json/ext/GeneratorState.java +0 -543
  158. data/vendor/json_pure/java/src/json/ext/OptionsReader.java +0 -114
  159. data/vendor/json_pure/java/src/json/ext/Parser.java +0 -2644
  160. data/vendor/json_pure/java/src/json/ext/Parser.rl +0 -968
  161. data/vendor/json_pure/java/src/json/ext/ParserService.java +0 -35
  162. data/vendor/json_pure/java/src/json/ext/RuntimeInfo.java +0 -121
  163. data/vendor/json_pure/java/src/json/ext/StringDecoder.java +0 -167
  164. data/vendor/json_pure/java/src/json/ext/StringEncoder.java +0 -106
  165. data/vendor/json_pure/java/src/json/ext/Utils.java +0 -89
  166. data/vendor/json_pure/json-java.gemspec +0 -23
  167. data/vendor/json_pure/json.gemspec +0 -37
  168. data/vendor/json_pure/json_pure.gemspec +0 -39
  169. data/vendor/json_pure/lib/json.rb +0 -62
  170. data/vendor/json_pure/lib/json/add/bigdecimal.rb +0 -28
  171. data/vendor/json_pure/lib/json/add/complex.rb +0 -22
  172. data/vendor/json_pure/lib/json/add/core.rb +0 -11
  173. data/vendor/json_pure/lib/json/add/date.rb +0 -34
  174. data/vendor/json_pure/lib/json/add/date_time.rb +0 -50
  175. data/vendor/json_pure/lib/json/add/exception.rb +0 -31
  176. data/vendor/json_pure/lib/json/add/ostruct.rb +0 -31
  177. data/vendor/json_pure/lib/json/add/range.rb +0 -29
  178. data/vendor/json_pure/lib/json/add/rational.rb +0 -22
  179. data/vendor/json_pure/lib/json/add/regexp.rb +0 -30
  180. data/vendor/json_pure/lib/json/add/struct.rb +0 -30
  181. data/vendor/json_pure/lib/json/add/symbol.rb +0 -25
  182. data/vendor/json_pure/lib/json/add/time.rb +0 -38
  183. data/vendor/json_pure/lib/json/common.rb +0 -487
  184. data/vendor/json_pure/lib/json/ext.rb +0 -21
  185. data/vendor/json_pure/lib/json/ext/.keep +0 -0
  186. data/vendor/json_pure/lib/json/generic_object.rb +0 -70
  187. data/vendor/json_pure/lib/json/pure.rb +0 -21
  188. data/vendor/json_pure/lib/json/pure/generator.rb +0 -522
  189. data/vendor/json_pure/lib/json/pure/parser.rb +0 -359
  190. data/vendor/json_pure/lib/json/version.rb +0 -8
  191. data/vendor/json_pure/tests/fixtures/fail1.json +0 -1
  192. data/vendor/json_pure/tests/fixtures/fail10.json +0 -1
  193. data/vendor/json_pure/tests/fixtures/fail11.json +0 -1
  194. data/vendor/json_pure/tests/fixtures/fail12.json +0 -1
  195. data/vendor/json_pure/tests/fixtures/fail13.json +0 -1
  196. data/vendor/json_pure/tests/fixtures/fail14.json +0 -1
  197. data/vendor/json_pure/tests/fixtures/fail18.json +0 -1
  198. data/vendor/json_pure/tests/fixtures/fail19.json +0 -1
  199. data/vendor/json_pure/tests/fixtures/fail2.json +0 -1
  200. data/vendor/json_pure/tests/fixtures/fail20.json +0 -1
  201. data/vendor/json_pure/tests/fixtures/fail21.json +0 -1
  202. data/vendor/json_pure/tests/fixtures/fail22.json +0 -1
  203. data/vendor/json_pure/tests/fixtures/fail23.json +0 -1
  204. data/vendor/json_pure/tests/fixtures/fail24.json +0 -1
  205. data/vendor/json_pure/tests/fixtures/fail25.json +0 -1
  206. data/vendor/json_pure/tests/fixtures/fail27.json +0 -2
  207. data/vendor/json_pure/tests/fixtures/fail28.json +0 -2
  208. data/vendor/json_pure/tests/fixtures/fail3.json +0 -1
  209. data/vendor/json_pure/tests/fixtures/fail4.json +0 -1
  210. data/vendor/json_pure/tests/fixtures/fail5.json +0 -1
  211. data/vendor/json_pure/tests/fixtures/fail6.json +0 -1
  212. data/vendor/json_pure/tests/fixtures/fail7.json +0 -1
  213. data/vendor/json_pure/tests/fixtures/fail8.json +0 -1
  214. data/vendor/json_pure/tests/fixtures/fail9.json +0 -1
  215. data/vendor/json_pure/tests/fixtures/pass1.json +0 -56
  216. data/vendor/json_pure/tests/fixtures/pass15.json +0 -1
  217. data/vendor/json_pure/tests/fixtures/pass16.json +0 -1
  218. data/vendor/json_pure/tests/fixtures/pass17.json +0 -1
  219. data/vendor/json_pure/tests/fixtures/pass2.json +0 -1
  220. data/vendor/json_pure/tests/fixtures/pass26.json +0 -1
  221. data/vendor/json_pure/tests/fixtures/pass3.json +0 -6
  222. data/vendor/json_pure/tests/setup_variant.rb +0 -11
  223. data/vendor/json_pure/tests/test_json.rb +0 -545
  224. data/vendor/json_pure/tests/test_json_addition.rb +0 -196
  225. data/vendor/json_pure/tests/test_json_encoding.rb +0 -65
  226. data/vendor/json_pure/tests/test_json_fixtures.rb +0 -35
  227. data/vendor/json_pure/tests/test_json_generate.rb +0 -322
  228. data/vendor/json_pure/tests/test_json_generic_object.rb +0 -75
  229. data/vendor/json_pure/tests/test_json_string_matching.rb +0 -39
  230. data/vendor/json_pure/tests/test_json_unicode.rb +0 -72
  231. data/vendor/json_pure/tools/fuzz.rb +0 -139
  232. data/vendor/json_pure/tools/server.rb +0 -62
  233. data/vendor/pusher-gem/Gemfile +0 -2
  234. data/vendor/pusher-gem/README.md +0 -80
  235. data/vendor/pusher-gem/lib/pusher.rb +0 -107
  236. data/vendor/pusher-gem/lib/pusher/request.rb +0 -107
  237. data/vendor/pusher-gem/spec/channel_spec.rb +0 -274
  238. data/vendor/pusher-gem/spec/pusher_spec.rb +0 -87
  239. data/vendor/ruby-hmac/History.txt +0 -15
  240. data/vendor/ruby-hmac/Manifest.txt +0 -11
  241. data/vendor/ruby-hmac/README.md +0 -41
  242. data/vendor/ruby-hmac/Rakefile +0 -23
  243. data/vendor/ruby-hmac/lib/hmac-md5.rb +0 -11
  244. data/vendor/ruby-hmac/lib/hmac-rmd160.rb +0 -11
  245. data/vendor/ruby-hmac/lib/hmac-sha1.rb +0 -11
  246. data/vendor/ruby-hmac/lib/hmac-sha2.rb +0 -25
  247. data/vendor/ruby-hmac/lib/hmac.rb +0 -118
  248. data/vendor/ruby-hmac/lib/ruby_hmac.rb +0 -2
  249. data/vendor/ruby-hmac/ruby-hmac.gemspec +0 -33
  250. data/vendor/ruby-hmac/test/test_hmac.rb +0 -89
  251. data/vendor/signature/VERSION +0 -1
File without changes
@@ -0,0 +1,60 @@
1
+ autoload 'Logger', 'logger'
2
+ require 'uri'
3
+ require 'forwardable'
4
+
5
+ require 'pusher/client'
6
+
7
+ # Used for configuring API credentials and creating Channel objects
8
+ #
9
+ module Pusher
10
+ # All errors descend from this class so they can be easily rescued
11
+ #
12
+ # @example
13
+ # begin
14
+ # Pusher.trigger('channel_name', 'event_name, {:some => 'data'})
15
+ # rescue Pusher::Error => e
16
+ # # Do something on error
17
+ # end
18
+ class Error < RuntimeError; end
19
+ class AuthenticationError < Error; end
20
+ class ConfigurationError < Error; end
21
+ class HTTPError < Error; attr_accessor :original_error; end
22
+
23
+ class << self
24
+ extend Forwardable
25
+
26
+ def_delegators :default_client, :scheme, :host, :port, :app_id, :key, :secret, :http_proxy
27
+ def_delegators :default_client, :scheme=, :host=, :port=, :app_id=, :key=, :secret=, :http_proxy=
28
+
29
+ def_delegators :default_client, :authentication_token, :url
30
+ def_delegators :default_client, :encrypted=, :url=
31
+ def_delegators :default_client, :timeout=, :connect_timeout=, :send_timeout=, :receive_timeout=, :keep_alive_timeout=
32
+
33
+ def_delegators :default_client, :get, :get_async, :post, :post_async
34
+ def_delegators :default_client, :channels, :channel_info, :trigger, :trigger_async
35
+ def_delegators :default_client, :webhook, :channel, :[]
36
+
37
+ attr_writer :logger
38
+
39
+ def logger
40
+ @logger ||= begin
41
+ log = Logger.new($stdout)
42
+ log.level = Logger::INFO
43
+ log
44
+ end
45
+ end
46
+
47
+ def default_client
48
+ @default_client ||= Pusher::Client.new
49
+ end
50
+ end
51
+
52
+ if ENV['PUSHER_URL']
53
+ self.url = ENV['PUSHER_URL']
54
+ end
55
+ end
56
+
57
+ require 'pusher/channel'
58
+ require 'pusher/request'
59
+ require 'pusher/resource'
60
+ require 'pusher/webhook'
@@ -1,20 +1,23 @@
1
- require 'core_extensions'
2
- require 'hmac-sha2'
3
- require 'json'
1
+ require 'openssl'
2
+ require 'multi_json'
4
3
 
5
4
  module Pusher
6
5
  # Trigger events on Channels
7
6
  class Channel
8
7
  attr_reader :name
9
8
 
10
- def initialize(base_url, name)
9
+ def initialize(base_url, name, client = Pusher)
11
10
  @uri = base_url.dup
12
11
  @uri.path = @uri.path + "/channels/#{name}/"
13
12
  @name = name
13
+ @client = client
14
14
  end
15
15
 
16
16
  # Trigger event asynchronously using EventMachine::HttpRequest
17
17
  #
18
+ # [Deprecated] This method will be removed in a future gem version. Please
19
+ # switch to Pusher.trigger_async or Pusher::Client#trigger_async instead
20
+ #
18
21
  # @param (see #trigger!)
19
22
  # @return [EM::DefaultDeferrable]
20
23
  # Attach a callback to be notified of success (with no parameters).
@@ -24,13 +27,17 @@ module Pusher
24
27
  # @raise [Pusher::Error] unless the eventmachine reactor is running. You
25
28
  # probably want to run your application inside a server such as thin
26
29
  #
27
- def trigger_async(event_name, data, socket_id = nil, &block)
28
- request = construct_event_request(event_name, data, socket_id)
29
- request.send_async
30
+ def trigger_async(event_name, data, socket_id = nil)
31
+ params = {}
32
+ params[:socket_id] = socket_id if socket_id
33
+ @client.trigger_async(name, event_name, data, params)
30
34
  end
31
35
 
32
36
  # Trigger event
33
37
  #
38
+ # [Deprecated] This method will be removed in a future gem version. Please
39
+ # switch to Pusher.trigger or Pusher::Client#trigger instead
40
+ #
34
41
  # @example
35
42
  # begin
36
43
  # Pusher['my-channel'].trigger!('an_event', {:some => 'data'})
@@ -44,15 +51,19 @@ module Pusher
44
51
  # event - see http://pusher.com/docs/publisher_api_guide/publisher_excluding_recipients for more info
45
52
  #
46
53
  # @raise [Pusher::Error] on invalid Pusher response - see the error message for more details
47
- # @raise [Pusher::HTTPError] on any error raised inside Net::HTTP - the original error is available in the original_error attribute
54
+ # @raise [Pusher::HTTPError] on any error raised inside http client - the original error is available in the original_error attribute
48
55
  #
49
56
  def trigger!(event_name, data, socket_id = nil)
50
- request = construct_event_request(event_name, data, socket_id)
51
- request.send_sync
57
+ params = {}
58
+ params[:socket_id] = socket_id if socket_id
59
+ @client.trigger(name, event_name, data, params)
52
60
  end
53
61
 
54
62
  # Trigger event, catching and logging any errors.
55
63
  #
64
+ # [Deprecated] This method will be removed in a future gem version. Please
65
+ # switch to Pusher.trigger or Pusher::Client#trigger instead
66
+ #
56
67
  # @note CAUTION! No exceptions will be raised on failure
57
68
  # @param (see #trigger!)
58
69
  #
@@ -62,21 +73,21 @@ module Pusher
62
73
  Pusher.logger.error("#{e.message} (#{e.class})")
63
74
  Pusher.logger.debug(e.backtrace.join("\n"))
64
75
  end
65
-
66
- # Request channel stats
76
+
77
+ # Request info for a channel
67
78
  #
68
- # @return [Hash] See Pusher api docs for reported stats
79
+ # @param info [Array] Array of attributes required (as lowercase strings)
80
+ # @return [Hash] Hash of requested attributes for this channel
69
81
  # @raise [Pusher::Error] on invalid Pusher response - see the error message for more details
70
- # @raise [Pusher::HTTPError] on any error raised inside Net::HTTP - the original error is available in the original_error attribute
82
+ # @raise [Pusher::HTTPError] on any error raised inside http client - the original error is available in the original_error attribute
71
83
  #
72
- def stats
73
- request = Pusher::Request.new(:get, @uri + 'stats', {})
74
- return request.send_sync
84
+ def info(attributes = [])
85
+ @client.get("/channels/#{name}", :info => attributes.join(','))
75
86
  end
76
87
 
77
- # Compute authentication string required to subscribe to this channel.
78
- #
79
- # See http://pusher.com/docs/auth_signatures for more details.
88
+ # Compute authentication string required as part of the authentication
89
+ # endpoint response. Generally the authenticate method should be used in
90
+ # preference to this one
80
91
  #
81
92
  # @param socket_id [String] Each Pusher socket connection receives a
82
93
  # unique socket_id. This is sent from pusher.js to your server when
@@ -85,21 +96,26 @@ module Pusher
85
96
  # @return [String]
86
97
  #
87
98
  def authentication_string(socket_id, custom_string = nil)
88
- raise "Invalid socket_id" if socket_id.nil? || socket_id.empty?
89
- raise 'Custom argument must be a string' unless custom_string.nil? || custom_string.kind_of?(String)
99
+ if socket_id.nil? || socket_id.empty?
100
+ raise Error, "Invalid socket_id #{socket_id}"
101
+ end
90
102
 
91
- string_to_sign = [socket_id, name, custom_string].compact.map{|e|e.to_s}.join(':')
103
+ unless custom_string.nil? || custom_string.kind_of?(String)
104
+ raise Error, 'Custom argument must be a string'
105
+ end
106
+
107
+ string_to_sign = [socket_id, name, custom_string].
108
+ compact.map(&:to_s).join(':')
92
109
  Pusher.logger.debug "Signing #{string_to_sign}"
93
- token = Pusher.authentication_token
94
- signature = HMAC::SHA256.hexdigest(token.secret, string_to_sign)
110
+ token = @client.authentication_token
111
+ digest = OpenSSL::Digest::SHA256.new
112
+ signature = OpenSSL::HMAC.hexdigest(digest, token.secret, string_to_sign)
95
113
 
96
114
  return "#{token.key}:#{signature}"
97
115
  end
98
-
99
- # Deprecated - for backward compatibility
100
- alias :socket_auth :authentication_string
101
116
 
102
- # Generate an authentication endpoint response
117
+ # Generate the expected response for an authentication endpoint.
118
+ # See http://pusher.com/docs/authenticating_users for details.
103
119
  #
104
120
  # @example Private channels
105
121
  # render :json => Pusher['private-my_channel'].authenticate(params[:socket_id])
@@ -121,34 +137,11 @@ module Pusher
121
137
  # @private Custom data is sent to server as JSON-encoded string
122
138
  #
123
139
  def authenticate(socket_id, custom_data = nil)
124
- custom_data = custom_data.to_json if custom_data
125
- auth = socket_auth(socket_id, custom_data)
140
+ custom_data = MultiJson.encode(custom_data) if custom_data
141
+ auth = authentication_string(socket_id, custom_data)
126
142
  r = {:auth => auth}
127
143
  r[:channel_data] = custom_data if custom_data
128
144
  r
129
145
  end
130
-
131
- private
132
-
133
- def construct_event_request(event_name, data, socket_id)
134
- params = {
135
- :name => event_name,
136
- }
137
- params[:socket_id] = socket_id if socket_id
138
-
139
- body = case data
140
- when String
141
- data
142
- else
143
- begin
144
- data.to_json
145
- rescue Exception => e
146
- Pusher.logger.error("Could not convert #{data.inspect} into JSON")
147
- raise e
148
- end
149
- end
150
-
151
- Pusher::Request.new(:post, @uri + 'events', params, body)
152
- end
153
146
  end
154
147
  end
@@ -0,0 +1,306 @@
1
+ require 'signature'
2
+
3
+ module Pusher
4
+ class Client
5
+ attr_accessor :scheme, :host, :port, :app_id, :key, :secret
6
+ attr_reader :http_proxy, :proxy
7
+ attr_writer :connect_timeout, :send_timeout, :receive_timeout,
8
+ :keep_alive_timeout
9
+
10
+ ## CONFIGURATION ##
11
+
12
+ def initialize(options = {})
13
+ options = {
14
+ :scheme => 'http',
15
+ :host => 'api.pusherapp.com',
16
+ :port => 80,
17
+ }.merge(options)
18
+ @scheme, @host, @port, @app_id, @key, @secret = options.values_at(
19
+ :scheme, :host, :port, :app_id, :key, :secret
20
+ )
21
+ @http_proxy = nil
22
+ self.http_proxy = options[:http_proxy] if options[:http_proxy]
23
+
24
+ # Default timeouts
25
+ @connect_timeout = 5
26
+ @send_timeout = 5
27
+ @receive_timeout = 5
28
+ @keep_alive_timeout = 30
29
+ end
30
+
31
+ # @private Returns the authentication token for the client
32
+ def authentication_token
33
+ Signature::Token.new(@key, @secret)
34
+ end
35
+
36
+ # @private Builds a url for this app, optionally appending a path
37
+ def url(path = nil)
38
+ URI::Generic.build({
39
+ :scheme => @scheme,
40
+ :host => @host,
41
+ :port => @port,
42
+ :path => "/apps/#{@app_id}#{path}"
43
+ })
44
+ end
45
+
46
+ # Configure Pusher connection by providing a url rather than specifying
47
+ # scheme, key, secret, and app_id separately.
48
+ #
49
+ # @example
50
+ # Pusher.url = http://KEY:SECRET@api.pusherapp.com/apps/APP_ID
51
+ #
52
+ def url=(url)
53
+ uri = URI.parse(url)
54
+ @scheme = uri.scheme
55
+ @app_id = uri.path.split('/').last
56
+ @key = uri.user
57
+ @secret = uri.password
58
+ @host = uri.host
59
+ @port = uri.port
60
+ end
61
+
62
+ def http_proxy=(http_proxy)
63
+ @http_proxy = http_proxy
64
+ uri = URI.parse(http_proxy)
65
+ @proxy = {
66
+ :scheme => uri.scheme,
67
+ :host => uri.host,
68
+ :port => uri.port,
69
+ :user => uri.user,
70
+ :password => uri.password
71
+ }
72
+ @http_proxy
73
+ end
74
+
75
+ # Configure whether Pusher API calls should be made over SSL
76
+ # (default false)
77
+ #
78
+ # @example
79
+ # Pusher.encrypted = true
80
+ #
81
+ def encrypted=(boolean)
82
+ @scheme = boolean ? 'https' : 'http'
83
+ # Configure port if it hasn't already been configured
84
+ @port = boolean ? 443 : 80
85
+ end
86
+
87
+ def encrypted?
88
+ @scheme == 'https'
89
+ end
90
+
91
+ # Convenience method to set all timeouts to the same value (in seconds).
92
+ # For more control, use the individual writers.
93
+ def timeout=(value)
94
+ @connect_timeout, @send_timeout, @receive_timeout = value, value, value
95
+ end
96
+
97
+ ## INTERACE WITH THE API ##
98
+
99
+ def resource(path)
100
+ Resource.new(self, path)
101
+ end
102
+
103
+ # GET arbitrary REST API resource using a synchronous http client.
104
+ # All request signing is handled automatically.
105
+ #
106
+ # @example
107
+ # begin
108
+ # Pusher.get('/channels', filter_by_prefix: 'private-')
109
+ # rescue Pusher::Error => e
110
+ # # Handle error
111
+ # end
112
+ #
113
+ # @param path [String] Path excluding /apps/APP_ID
114
+ # @param params [Hash] API params (see http://pusher.com/docs/rest_api)
115
+ #
116
+ # @return [Hash] See Pusher API docs
117
+ #
118
+ # @raise [Pusher::Error] Unsuccessful response - see the error message
119
+ # @raise [Pusher::HTTPError] Error raised inside http client. The original error is wrapped in error.original_error
120
+ #
121
+ def get(path, params = {})
122
+ Resource.new(self, path).get(params)
123
+ end
124
+
125
+ # GET arbitrary REST API resource using an asynchronous http client.
126
+ # All request signing is handled automatically.
127
+ #
128
+ # When the eventmachine reactor is running, the em-http-request gem is used;
129
+ # otherwise an async request is made using httpclient. See README for
130
+ # details and examples.
131
+ #
132
+ # @param path [String] Path excluding /apps/APP_ID
133
+ # @param params [Hash] API params (see http://pusher.com/docs/rest_api)
134
+ #
135
+ # @return Either an EM::DefaultDeferrable or a HTTPClient::Connection
136
+ #
137
+ def get_async(path, params = {})
138
+ Resource.new(self, path).get_async(params)
139
+ end
140
+
141
+ # POST arbitrary REST API resource using a synchronous http client.
142
+ # Works identially to get method, but posts params as JSON in post body.
143
+ def post(path, params = {})
144
+ Resource.new(self, path).post(params)
145
+ end
146
+
147
+ # POST arbitrary REST API resource using an asynchronous http client.
148
+ # Works identially to get_async method, but posts params as JSON in post
149
+ # body.
150
+ def post_async(path, params = {})
151
+ Resource.new(self, path).post_async(params)
152
+ end
153
+
154
+ ## HELPER METHODS ##
155
+
156
+ # Convenience method for creating a new WebHook instance for validating
157
+ # and extracting info from a received WebHook
158
+ #
159
+ # @param request [Rack::Request] Either a Rack::Request or a Hash containing :key, :signature, :body, and optionally :content_type.
160
+ #
161
+ def webhook(request)
162
+ WebHook.new(request, self)
163
+ end
164
+
165
+ # Return a convenience channel object by name. No API request is made.
166
+ #
167
+ # @example
168
+ # Pusher['my-channel']
169
+ # @return [Channel]
170
+ # @raise [ConfigurationError] unless key, secret and app_id have been
171
+ # configured
172
+ def channel(channel_name)
173
+ raise ConfigurationError, 'Missing client configuration: please check that key, secret and app_id are configured.' unless configured?
174
+ Channel.new(url, channel_name, self)
175
+ end
176
+
177
+ alias :[] :channel
178
+
179
+ # Request a list of occupied channels from the API
180
+ #
181
+ # GET /apps/[id]/channels
182
+ #
183
+ # @param params [Hash] Hash of parameters for the API - see REST API docs
184
+ #
185
+ # @return [Hash] See Pusher API docs
186
+ #
187
+ # @raise [Pusher::Error] Unsuccessful response - see the error message
188
+ # @raise [Pusher::HTTPError] Error raised inside http client. The original error is wrapped in error.original_error
189
+ #
190
+ def channels(params = {})
191
+ get('/channels', params)
192
+ end
193
+
194
+ # Request info for a specific channel
195
+ #
196
+ # GET /apps/[id]/channels/[channel_name]
197
+ #
198
+ # @param channel_name [String] Channel name
199
+ # @param params [Hash] Hash of parameters for the API - see REST API docs
200
+ #
201
+ # @return [Hash] See Pusher API docs
202
+ #
203
+ # @raise [Pusher::Error] Unsuccessful response - see the error message
204
+ # @raise [Pusher::HTTPError] Error raised inside http client. The original error is wrapped in error.original_error
205
+ #
206
+ def channel_info(channel_name, params = {})
207
+ get("/channels/#{channel_name}", params)
208
+ end
209
+
210
+ # Trigger an event on one or more channels
211
+ #
212
+ # POST /apps/[app_id]/events
213
+ #
214
+ # @param channels [String or Array] One of more channel names
215
+ # @param event_name [String]
216
+ # @param data [Object] Event data to be triggered in javascript.
217
+ # Objects other than strings will be converted to JSON
218
+ # @param params [Hash] Additional parameters to send to api, e.g socket_id
219
+ #
220
+ # @return [Hash] See Pusher API docs
221
+ #
222
+ # @raise [Pusher::Error] Unsuccessful response - see the error message
223
+ # @raise [Pusher::HTTPError] Error raised inside http client. The original error is wrapped in error.original_error
224
+ #
225
+ def trigger(channels, event_name, data, params = {})
226
+ post('/events', trigger_params(channels, event_name, data, params))
227
+ end
228
+
229
+ # Trigger an event on one or more channels asynchronously.
230
+ # For parameters see #trigger
231
+ #
232
+ def trigger_async(channels, event_name, data, params = {})
233
+ post_async('/events', trigger_params(channels, event_name, data, params))
234
+ end
235
+
236
+ # @private Construct a net/http http client
237
+ def sync_http_client
238
+ @client ||= begin
239
+ require 'httpclient'
240
+
241
+ HTTPClient.new(@http_proxy).tap do |c|
242
+ c.connect_timeout = @connect_timeout
243
+ c.send_timeout = @send_timeout
244
+ c.receive_timeout = @receive_timeout
245
+ c.keep_alive_timeout = @keep_alive_timeout
246
+ end
247
+ end
248
+ end
249
+
250
+ # @private Construct an em-http-request http client
251
+ def em_http_client(uri)
252
+ begin
253
+ unless defined?(EventMachine) && EventMachine.reactor_running?
254
+ raise Error, "In order to use async calling you must be running inside an eventmachine loop"
255
+ end
256
+ require 'em-http' unless defined?(EventMachine::HttpRequest)
257
+
258
+ connection_opts = {
259
+ :connect_timeout => @connect_timeout,
260
+ :inactivity_timeout => @receive_timeout,
261
+ }
262
+
263
+ if defined?(@proxy)
264
+ proxy_opts = {
265
+ :host => @proxy[:host],
266
+ :port => @proxy[:port]
267
+ }
268
+ if @proxy[:user]
269
+ proxy_opts[:authorization] = [@proxy[:user], @proxy[:password]]
270
+ end
271
+ connection_opts[:proxy] = proxy_opts
272
+ end
273
+
274
+ EventMachine::HttpRequest.new(uri, connection_opts)
275
+ end
276
+ end
277
+
278
+ private
279
+
280
+ def trigger_params(channels, event_name, data, params)
281
+ channels = Array(channels).map(&:to_s)
282
+
283
+ encoded_data = case data
284
+ when String
285
+ data
286
+ else
287
+ begin
288
+ MultiJson.encode(data)
289
+ rescue MultiJson::DecodeError => e
290
+ Pusher.logger.error("Could not convert #{data.inspect} into JSON")
291
+ raise e
292
+ end
293
+ end
294
+
295
+ return params.merge({
296
+ :name => event_name,
297
+ :channels => channels,
298
+ :data => encoded_data,
299
+ })
300
+ end
301
+
302
+ def configured?
303
+ host && scheme && key && secret && app_id
304
+ end
305
+ end
306
+ end