lib/render_sync/clients/faye.rb
module RenderSync
module Clients
class Faye
def setup
require 'faye'
# nothing to set up
end
def batch_publish(*args)
Message.batch_publish(*args)
end
def build_message(*args)
Message.new(*args)
end
# Public: Normalize channel to adapter supported format
#
# channel - The string channel name
#
# Returns The normalized channel prefixed with supported format for Faye
def normalize_channel(channel)
"/#{channel}"
end
class Message
attr_accessor :channel, :data
def self.batch_publish(messages)
if RenderSync.async?
batch_publish_asynchronous(messages)
else
batch_publish_synchronous(messages)
end
end
def self.batch_publish_synchronous(messages)
Net::HTTP.post_form(
URI.parse(RenderSync.server),
message: batch_messages_query_hash(messages).to_json
)
end
def self.batch_publish_asynchronous(messages)
RenderSync.reactor.perform do
EM::HttpRequest.new(RenderSync.server).post(body: {
message: batch_messages_query_hash(messages).to_json
})
end
end
def self.batch_messages_query_hash(messages)
{
channel: "/batch_publish",
data: messages.collect(&:to_hash),
ext: { auth_token: RenderSync.auth_token }
}
end
def initialize(channel, data)
self.channel = channel
self.data = data
end
def to_hash
{
channel: channel,
data: data,
ext: {
auth_token: RenderSync.auth_token
}
}
end
def to_json
to_hash.to_json
end
def publish
if RenderSync.async?
publish_asynchronous
else
publish_synchronous
end
end
def publish_synchronous
Net::HTTP.post_form URI.parse(RenderSync.server), message: to_json
end
def publish_asynchronous
RenderSync.reactor.perform do
EM::HttpRequest.new(RenderSync.server).post(body: {
message: self.to_json
})
end
end
end
end
end
end