lib/ably/realtime/presence.rb in ably-0.8.2 vs lib/ably/realtime/presence.rb in ably-0.8.3
- old
+ new
@@ -80,10 +80,11 @@
@data = data
@client_id = client_id
return deferrable_succeed(deferrable, &success_block) if state == STATE.Entered
+ ensure_presence_publishable_on_connection
ensure_channel_attached(deferrable) do
if entering?
once_or_if(STATE.Entered, else: proc { |args| deferrable_fail deferrable, *args }) do
deferrable_succeed deferrable, &success_block
end
@@ -143,10 +144,11 @@
@data = data
return deferrable_succeed(deferrable, &success_block) if state == STATE.Left
+ ensure_presence_publishable_on_connection
ensure_channel_attached(deferrable) do
if leaving?
once_or_if(STATE.Left, else: proc { |error|deferrable_fail deferrable, *args }) do
deferrable_succeed deferrable, &success_block
end
@@ -199,10 +201,11 @@
ensure_supported_payload data unless data.nil?
raise Ably::Exceptions::Standard.new('Unable to update presence channel without a client_id', 400, 91000) unless client_id
@data = data
+ ensure_presence_publishable_on_connection
ensure_channel_attached(deferrable) do
send_protocol_message_and_transition_state_to(
Ably::Models::PresenceMessage::ACTION.Update,
deferrable: deferrable,
target_state: STATE.Entered,
@@ -367,10 +370,16 @@
Ably::Models::PresenceMessage.new(model, logger: logger).tap do |presence_message|
presence_message.encode self.channel
end
end
+ def ensure_presence_publishable_on_connection
+ if !connection.can_publish_messages?
+ raise Ably::Exceptions::MessageQueueingDisabled.new("Message cannot be published. Client is configured to disallow queueing of messages and connection is currently #{connection.state}")
+ end
+ end
+
def ensure_channel_attached(deferrable = nil)
if channel.attached?
yield
else
attach_channel_then { yield }
@@ -411,33 +420,38 @@
def deferrable_fail(deferrable, *args, &block)
safe_yield block, self, *args if block_given?
EventMachine.next_tick { deferrable.fail self, *args } # allow errback to be added to the returned Deferrable
deferrable
- end
+ end
def send_presence_action_for_client(action, client_id, options = {}, &success_block)
- deferrable = create_deferrable
+ ensure_presence_publishable_on_connection
+ deferrable = create_deferrable
ensure_channel_attached(deferrable) do
send_presence_protocol_message(action, client_id, options).tap do |protocol_message|
protocol_message.callback { |message| deferrable_succeed deferrable, &success_block }
protocol_message.errback { |message, error| deferrable_fail deferrable, error }
end
end
end
def attach_channel_then
if channel.detached? || channel.failed?
- raise Ably::Exceptions::IncompatibleStateForOperation.new("Operation is not allowed when channel is in #{channel.state}", 400, 91001)
+ raise Ably::Exceptions::InvalidStateChange.new("Operation is not allowed when channel is in #{channel.state}", 400, 91001)
else
channel.unsafe_once(Channel::STATE.Attached) { yield }
channel.attach
end
end
def client
channel.client
+ end
+
+ def connection
+ client.connection
end
def rest_presence
client.rest_client.channel(channel.name).presence
end