Class: Pusher::Channel

Inherits:
Object
  • Object
show all
Defined in:
lib/pusher/channel.rb

Overview

Trigger events on Channels

Constant Summary

INVALID_CHANNEL_REGEX =
/[^A-Za-z0-9_\-=@,.;]/

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Channel) initialize(base_url, name, client = Pusher)

Returns a new instance of Channel



9
10
11
12
13
14
15
16
17
18
19
# File 'lib/pusher/channel.rb', line 9

def initialize(base_url, name, client = Pusher)
  @uri = base_url.dup
  if Pusher::Channel::INVALID_CHANNEL_REGEX.match(name)
    raise Pusher::Error, "Illegal channel name '#{name}'"
  elsif name.length > 200
    raise Pusher::Error, "Channel name too long (limit 100 characters) '#{name}'"
  end
  @uri.path = @uri.path + "/channels/#{name}/"
  @name = name
  @client = client
end

Instance Attribute Details

- (Object) name (readonly)

Returns the value of attribute name



7
8
9
# File 'lib/pusher/channel.rb', line 7

def name
  @name
end

Instance Method Details

- (Hash) authenticate(socket_id, custom_data = nil)

Generate the expected response for an authentication endpoint. See pusher.com/docs/authenticating_users for details.

Examples:

Private channels

render :json => Pusher['private-my_channel'].authenticate(params[:socket_id])

Presence channels

render :json => Pusher['private-my_channel'].authenticate(params[:socket_id], {
  :user_id => current_user.id, # => required
  :user_info => { # => optional - for example
    :name => current_user.name,
    :email => current_user.email
  }
})

Parameters:

  • socket_id (String)
  • custom_data (Hash) (defaults to: nil)

    used for example by private channels

Returns:

  • (Hash)


144
145
146
147
148
149
150
# File 'lib/pusher/channel.rb', line 144

def authenticate(socket_id, custom_data = nil)
  custom_data = MultiJson.encode(custom_data) if custom_data
  auth = authentication_string(socket_id, custom_data)
  r = {:auth => auth}
  r[:channel_data] = custom_data if custom_data
  r
end

- (String) authentication_string(socket_id, custom_string = nil)

Compute authentication string required as part of the authentication endpoint response. Generally the authenticate method should be used in preference to this one

Parameters:

  • socket_id (String)

    Each Pusher socket connection receives a unique socket_id. This is sent from pusher.js to your server when channel authentication is required.

  • custom_string (String) (defaults to: nil)

    Allows signing additional data

Returns:

  • (String)


103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/pusher/channel.rb', line 103

def authentication_string(socket_id, custom_string = nil)
  if socket_id.nil? || socket_id.empty?
    raise Error, "Invalid socket_id #{socket_id}"
  end

  unless custom_string.nil? || custom_string.kind_of?(String)
    raise Error, 'Custom argument must be a string'
  end

  string_to_sign = [socket_id, name, custom_string].
    compact.map(&:to_s).join(':')
  Pusher.logger.debug "Signing #{string_to_sign}"
  token = @client.authentication_token
  digest = OpenSSL::Digest::SHA256.new
  signature = OpenSSL::HMAC.hexdigest(digest, token.secret, string_to_sign)

  return "#{token.key}:#{signature}"
end

- (Hash) info(attributes = [])

Request info for a channel

Parameters:

  • info (Array)

    Array of attributes required (as lowercase strings)

Returns:

  • (Hash)

    Hash of requested attributes for this channel

Raises:

  • (Pusher::Error)

    on invalid Pusher response - see the error message for more details

  • (Pusher::HTTPError)

    on any error raised inside http client - the original error is available in the original_error attribute



89
90
91
# File 'lib/pusher/channel.rb', line 89

def info(attributes = [])
  @client.get("/channels/#{name}", :info => attributes.join(','))
end

- (Object) trigger(event_name, data, socket_id = nil)

Note:

CAUTION! No exceptions will be raised on failure

Trigger event, catching and logging any errors.

Deprecated

This method will be removed in a future gem version. Please

switch to Pusher.trigger or Pusher::Client#trigger instead

Parameters:



75
76
77
78
79
80
# File 'lib/pusher/channel.rb', line 75

def trigger(event_name, data, socket_id = nil)
  trigger!(event_name, data, socket_id)
rescue Pusher::Error => e
  Pusher.logger.error("#{e.message} (#{e.class})")
  Pusher.logger.debug(e.backtrace.join("\n"))
end

- (Object) trigger!(event_name, data, socket_id = nil)

Trigger event

Deprecated

This method will be removed in a future gem version. Please

switch to Pusher.trigger or Pusher::Client#trigger instead

Examples:

begin
  Pusher['my-channel'].trigger!('an_event', {:some => 'data'})
rescue Pusher::Error => e
  # Do something on error
end

Parameters:

Raises:

  • (Pusher::Error)

    on invalid Pusher response - see the error message for more details

  • (Pusher::HTTPError)

    on any error raised inside http client - the original error is available in the original_error attribute



61
62
63
64
65
# File 'lib/pusher/channel.rb', line 61

def trigger!(event_name, data, socket_id = nil)
  params = {}
  params[:socket_id] = socket_id if socket_id
  @client.trigger(name, event_name, data, params)
end

- (EM::DefaultDeferrable) trigger_async(event_name, data, socket_id = nil)

Trigger event asynchronously using EventMachine::HttpRequest

Deprecated

This method will be removed in a future gem version. Please

switch to Pusher.trigger_async or Pusher::Client#trigger_async instead

Parameters:

Returns:

  • (EM::DefaultDeferrable)

    Attach a callback to be notified of success (with no parameters). Attach an errback to be notified of failure (with an error parameter which includes the HTTP status code returned)

Raises:

  • (LoadError)

    unless em-http-request gem is available

  • (Pusher::Error)

    unless the eventmachine reactor is running. You probably want to run your application inside a server such as thin



35
36
37
38
39
# File 'lib/pusher/channel.rb', line 35

def trigger_async(event_name, data, socket_id = nil)
  params = {}
  params[:socket_id] = socket_id if socket_id
  @client.trigger_async(name, event_name, data, params)
end