Class: Pusher::Client
- Inherits:
-
Object
- Object
- Pusher::Client
- Defined in:
- lib/pusher/client.rb
Constant Summary collapse
- DEFAULT_CONNECT_TIMEOUT =
CONFIGURATION ##
5
- DEFAULT_SEND_TIMEOUT =
5
- DEFAULT_RECEIVE_TIMEOUT =
5
- DEFAULT_KEEP_ALIVE_TIMEOUT =
30
- DEFAULT_CLUSTER =
"mt1"
Instance Attribute Summary collapse
-
#app_id ⇒ Object
Returns the value of attribute app_id.
-
#connect_timeout ⇒ Object
writeonly
Sets the attribute connect_timeout.
-
#encryption_master_key ⇒ Object
Returns the value of attribute encryption_master_key.
-
#host ⇒ Object
Returns the value of attribute host.
-
#http_proxy ⇒ Object
Returns the value of attribute http_proxy.
-
#keep_alive_timeout ⇒ Object
writeonly
Sets the attribute keep_alive_timeout.
-
#key ⇒ Object
Returns the value of attribute key.
-
#port ⇒ Object
Returns the value of attribute port.
-
#proxy ⇒ Object
readonly
Returns the value of attribute proxy.
-
#receive_timeout ⇒ Object
writeonly
Sets the attribute receive_timeout.
-
#scheme ⇒ Object
Returns the value of attribute scheme.
-
#secret ⇒ Object
Returns the value of attribute secret.
-
#send_timeout ⇒ Object
writeonly
Sets the attribute send_timeout.
Class Method Summary collapse
-
.from_env(key = 'PUSHER_URL') ⇒ Object
Loads the configuration from an url in the environment.
-
.from_url(url) ⇒ Object
Loads the configuration from a url.
Instance Method Summary collapse
-
#authenticate(channel_name, socket_id, custom_data = nil) ⇒ Hash
Generate the expected response for an authentication endpoint.
- #authentication_token ⇒ Object
-
#channel(channel_name) ⇒ Channel
(also: #[])
Return a convenience channel object by name that delegates operations on a channel.
-
#channel_info(channel_name, params = {}) ⇒ Hash
Request info for a specific channel.
-
#channel_users(channel_name, params = {}) ⇒ Hash
Request info for users of a presence channel.
-
#channels(params = {}) ⇒ Hash
Request a list of occupied channels from the API.
- #cluster=(cluster) ⇒ Object
- #em_http_client(uri) ⇒ Object
-
#encrypted=(boolean) ⇒ Object
Configure whether Pusher API calls should be made over SSL (default false).
- #encrypted? ⇒ Boolean
-
#encryption_master_key_base64=(s) ⇒ Object
Set an encryption_master_key to use with private-encrypted channels from a base64 encoded string.
-
#get(path, params = {}) ⇒ Hash
GET arbitrary REST API resource using a synchronous http client.
-
#get_async(path, params = {}) ⇒ Object
GET arbitrary REST API resource using an asynchronous http client.
-
#initialize(options = {}) ⇒ Client
constructor
A new instance of Client.
-
#post(path, params = {}) ⇒ Object
POST arbitrary REST API resource using a synchronous http client.
-
#post_async(path, params = {}) ⇒ Object
POST arbitrary REST API resource using an asynchronous http client.
-
#resource(path) ⇒ Object
INTERACT WITH THE API ##.
- #sync_http_client ⇒ Object
-
#timeout=(value) ⇒ Object
Convenience method to set all timeouts to the same value (in seconds).
-
#trigger(channels, event_name, data, params = {}) ⇒ Hash
Trigger an event on one or more channels.
-
#trigger_async(channels, event_name, data, params = {}) ⇒ Object
Trigger an event on one or more channels asynchronously.
-
#trigger_batch(*events) ⇒ Hash
Trigger multiple events at the same time.
-
#trigger_batch_async(*events) ⇒ Object
Trigger multiple events asynchronously.
- #url(path = nil) ⇒ Object
-
#url=(url) ⇒ Object
Configure Pusher connection by providing a url rather than specifying scheme, key, secret, and app_id separately.
-
#webhook(request) ⇒ Object
Convenience method for creating a new WebHook instance for validating and extracting info from a received WebHook.
Constructor Details
#initialize(options = {}) ⇒ Client
Returns a new instance of Client.
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 |
# File 'lib/pusher/client.rb', line 31 def initialize( = {}) @scheme = "https" @port = [:port] || 443 if .key?(:encrypted) warn "[DEPRECATION] `encrypted` is deprecated and will be removed in the next major version. Use `use_tls` instead." end if [:use_tls] == false || [:encrypted] == false @scheme = "http" @port = [:port] || 80 end @app_id = [:app_id] @key = [:key] @secret = [:secret] @host = [:host] @host ||= "api-#{[:cluster]}.pusher.com" unless [:cluster].nil? || [:cluster].empty? @host ||= "api-#{DEFAULT_CLUSTER}.pusher.com" @encryption_master_key = Base64.strict_decode64([:encryption_master_key_base64]) if [:encryption_master_key_base64] @http_proxy = [:http_proxy] # Default timeouts @connect_timeout = DEFAULT_CONNECT_TIMEOUT @send_timeout = DEFAULT_SEND_TIMEOUT @receive_timeout = DEFAULT_RECEIVE_TIMEOUT @keep_alive_timeout = DEFAULT_KEEP_ALIVE_TIMEOUT end |
Instance Attribute Details
#app_id ⇒ Object
Returns the value of attribute app_id.
6 7 8 |
# File 'lib/pusher/client.rb', line 6 def app_id @app_id end |
#connect_timeout=(value) ⇒ Object (writeonly)
Sets the attribute connect_timeout
8 9 10 |
# File 'lib/pusher/client.rb', line 8 def connect_timeout=(value) @connect_timeout = value end |
#encryption_master_key ⇒ Object
Returns the value of attribute encryption_master_key.
6 7 8 |
# File 'lib/pusher/client.rb', line 6 def encryption_master_key @encryption_master_key end |
#host ⇒ Object
Returns the value of attribute host.
6 7 8 |
# File 'lib/pusher/client.rb', line 6 def host @host end |
#http_proxy ⇒ Object
Returns the value of attribute http_proxy.
7 8 9 |
# File 'lib/pusher/client.rb', line 7 def http_proxy @http_proxy end |
#keep_alive_timeout=(value) ⇒ Object (writeonly)
Sets the attribute keep_alive_timeout
8 9 10 |
# File 'lib/pusher/client.rb', line 8 def keep_alive_timeout=(value) @keep_alive_timeout = value end |
#key ⇒ Object
Returns the value of attribute key.
6 7 8 |
# File 'lib/pusher/client.rb', line 6 def key @key end |
#port ⇒ Object
Returns the value of attribute port.
6 7 8 |
# File 'lib/pusher/client.rb', line 6 def port @port end |
#proxy ⇒ Object (readonly)
Returns the value of attribute proxy.
7 8 9 |
# File 'lib/pusher/client.rb', line 7 def proxy @proxy end |
#receive_timeout=(value) ⇒ Object (writeonly)
Sets the attribute receive_timeout
8 9 10 |
# File 'lib/pusher/client.rb', line 8 def receive_timeout=(value) @receive_timeout = value end |
#scheme ⇒ Object
Returns the value of attribute scheme.
6 7 8 |
# File 'lib/pusher/client.rb', line 6 def scheme @scheme end |
#secret ⇒ Object
Returns the value of attribute secret.
6 7 8 |
# File 'lib/pusher/client.rb', line 6 def secret @secret end |
#send_timeout=(value) ⇒ Object (writeonly)
Sets the attribute send_timeout
8 9 10 |
# File 'lib/pusher/client.rb', line 8 def send_timeout=(value) @send_timeout = value end |
Class Method Details
.from_env(key = 'PUSHER_URL') ⇒ Object
Loads the configuration from an url in the environment
19 20 21 22 |
# File 'lib/pusher/client.rb', line 19 def self.from_env(key = 'PUSHER_URL') url = ENV[key] || raise(ConfigurationError, key) from_url(url) end |
.from_url(url) ⇒ Object
Loads the configuration from a url
25 26 27 28 29 |
# File 'lib/pusher/client.rb', line 25 def self.from_url(url) client = new client.url = url client end |
Instance Method Details
#authenticate(channel_name, socket_id, custom_data = nil) ⇒ Hash
Generate the expected response for an authentication endpoint. See pusher.com/docs/authenticating_users for details.
347 348 349 350 351 352 353 354 355 356 |
# File 'lib/pusher/client.rb', line 347 def authenticate(channel_name, socket_id, custom_data = nil) channel_instance = channel(channel_name) r = channel_instance.authenticate(socket_id, custom_data) if channel_name.match(/^private-encrypted-/) r[:shared_secret] = Base64.strict_encode64( channel_instance.shared_secret(encryption_master_key) ) end r end |
#authentication_token ⇒ Object
64 65 66 67 68 |
# File 'lib/pusher/client.rb', line 64 def authentication_token raise ConfigurationError, :key unless @key raise ConfigurationError, :secret unless @secret Pusher::Signature::Token.new(@key, @secret) end |
#channel(channel_name) ⇒ Channel Also known as: []
Return a convenience channel object by name that delegates operations on a channel. No API request is made.
221 222 223 |
# File 'lib/pusher/client.rb', line 221 def channel(channel_name) Channel.new(nil, channel_name, self) end |
#channel_info(channel_name, params = {}) ⇒ Hash
254 255 256 |
# File 'lib/pusher/client.rb', line 254 def channel_info(channel_name, params = {}) get("/channels/#{channel_name}", params) end |
#channel_users(channel_name, params = {}) ⇒ Hash
270 271 272 |
# File 'lib/pusher/client.rb', line 270 def channel_users(channel_name, params = {}) get("/channels/#{channel_name}/users", params) end |
#channels(params = {}) ⇒ Hash
Request a list of occupied channels from the API
GET /apps//channels
238 239 240 |
# File 'lib/pusher/client.rb', line 238 def channels(params = {}) get('/channels', params) end |
#cluster=(cluster) ⇒ Object
125 126 127 128 129 |
# File 'lib/pusher/client.rb', line 125 def cluster=(cluster) cluster = DEFAULT_CLUSTER if cluster.nil? || cluster.empty? @host = "api-#{cluster}.pusher.com" end |
#em_http_client(uri) ⇒ Object
373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 |
# File 'lib/pusher/client.rb', line 373 def em_http_client(uri) begin unless defined?(EventMachine) && EventMachine.reactor_running? raise Error, "In order to use async calling you must be running inside an eventmachine loop" end require 'em-http' unless defined?(EventMachine::HttpRequest) connection_opts = { connect_timeout: @connect_timeout, inactivity_timeout: @receive_timeout, } if defined?(@proxy) proxy_opts = { host: @proxy[:host], port: @proxy[:port] } if @proxy[:user] proxy_opts[:authorization] = [@proxy[:user], @proxy[:password]] end connection_opts[:proxy] = proxy_opts end EventMachine::HttpRequest.new(uri, connection_opts) end end |
#encrypted=(boolean) ⇒ Object
Configure whether Pusher API calls should be made over SSL (default false)
115 116 117 118 119 |
# File 'lib/pusher/client.rb', line 115 def encrypted=(boolean) @scheme = boolean ? 'https' : 'http' # Configure port if it hasn't already been configured @port = boolean ? 443 : 80 end |
#encrypted? ⇒ Boolean
121 122 123 |
# File 'lib/pusher/client.rb', line 121 def encrypted? @scheme == 'https' end |
#encryption_master_key_base64=(s) ⇒ Object
Set an encryption_master_key to use with private-encrypted channels from a base64 encoded string.
139 140 141 |
# File 'lib/pusher/client.rb', line 139 def encryption_master_key_base64=(s) @encryption_master_key = s ? Base64.strict_decode64(s) : nil end |
#get(path, params = {}) ⇒ Hash
GET arbitrary REST API resource using a synchronous http client. All request signing is handled automatically.
167 168 169 |
# File 'lib/pusher/client.rb', line 167 def get(path, params = {}) resource(path).get(params) end |
#get_async(path, params = {}) ⇒ Object
GET arbitrary REST API resource using an asynchronous http client. All request signing is handled automatically.
When the eventmachine reactor is running, the em-http-request gem is used; otherwise an async request is made using httpclient. See README for details and examples.
183 184 185 |
# File 'lib/pusher/client.rb', line 183 def get_async(path, params = {}) resource(path).get_async(params) end |
#post(path, params = {}) ⇒ Object
POST arbitrary REST API resource using a synchronous http client. Works identially to get method, but posts params as JSON in post body.
189 190 191 |
# File 'lib/pusher/client.rb', line 189 def post(path, params = {}) resource(path).post(params) end |
#post_async(path, params = {}) ⇒ Object
POST arbitrary REST API resource using an asynchronous http client. Works identially to get_async method, but posts params as JSON in post body.
196 197 198 |
# File 'lib/pusher/client.rb', line 196 def post_async(path, params = {}) resource(path).post_async(params) end |
#resource(path) ⇒ Object
INTERACT WITH THE API ##
145 146 147 |
# File 'lib/pusher/client.rb', line 145 def resource(path) Resource.new(self, path) end |
#sync_http_client ⇒ Object
359 360 361 362 363 364 365 366 367 368 369 370 |
# File 'lib/pusher/client.rb', line 359 def sync_http_client require 'httpclient' @client ||= begin HTTPClient.new(@http_proxy).tap do |c| c.connect_timeout = @connect_timeout c.send_timeout = @send_timeout c.receive_timeout = @receive_timeout c.keep_alive_timeout = @keep_alive_timeout end end end |
#timeout=(value) ⇒ Object
Convenience method to set all timeouts to the same value (in seconds). For more control, use the individual writers.
133 134 135 |
# File 'lib/pusher/client.rb', line 133 def timeout=(value) @connect_timeout, @send_timeout, @receive_timeout = value, value, value end |
#trigger(channels, event_name, data, params = {}) ⇒ Hash
Trigger an event on one or more channels
POST /apps//events
289 290 291 |
# File 'lib/pusher/client.rb', line 289 def trigger(channels, event_name, data, params = {}) post('/events', trigger_params(channels, event_name, data, params)) end |
#trigger_async(channels, event_name, data, params = {}) ⇒ Object
Trigger an event on one or more channels asynchronously. For parameters see #trigger
311 312 313 |
# File 'lib/pusher/client.rb', line 311 def trigger_async(channels, event_name, data, params = {}) post_async('/events', trigger_params(channels, event_name, data, params)) end |
#trigger_batch(*events) ⇒ Hash
Trigger multiple events at the same time
POST /apps//batch_events
304 305 306 |
# File 'lib/pusher/client.rb', line 304 def trigger_batch(*events) post('/batch_events', trigger_batch_params(events.flatten)) end |
#trigger_batch_async(*events) ⇒ Object
Trigger multiple events asynchronously. For parameters see #trigger_batch
318 319 320 |
# File 'lib/pusher/client.rb', line 318 def trigger_batch_async(*events) post_async('/batch_events', trigger_batch_params(events.flatten)) end |
#url(path = nil) ⇒ Object
71 72 73 74 75 76 77 78 79 |
# File 'lib/pusher/client.rb', line 71 def url(path = nil) raise ConfigurationError, :app_id unless @app_id URI::Generic.build({ scheme: @scheme, host: @host, port: @port, path: "/apps/#{@app_id}#{path}" }) end |
#url=(url) ⇒ Object
Configure Pusher connection by providing a url rather than specifying scheme, key, secret, and app_id separately.
87 88 89 90 91 92 93 94 95 |
# File 'lib/pusher/client.rb', line 87 def url=(url) uri = URI.parse(url) @scheme = uri.scheme @app_id = uri.path.split('/').last @key = uri.user @secret = uri.password @host = uri.host @port = uri.port end |