lib/render_sync.rb
require 'eventmachine'
require 'monitor'
require 'digest/sha1'
require 'erb'
require 'net/http'
require 'net/https'
require 'logger'
require 'render_sync/renderer'
require 'render_sync/actions'
require 'render_sync/action'
require 'render_sync/controller_helpers'
require 'render_sync/view_helpers'
require 'render_sync/model_change_tracking'
require 'render_sync/model_actions'
require 'render_sync/model_syncing'
require 'render_sync/model_touching'
require 'render_sync/model'
require 'render_sync/scope'
require 'render_sync/scope_definition'
require 'render_sync/refetch_model'
require 'render_sync/faye_extension'
require 'render_sync/partial_creator'
require 'render_sync/refetch_partial_creator'
require 'render_sync/partial'
require 'render_sync/refetch_partial'
require 'render_sync/channel'
require 'render_sync/resource'
require 'render_sync/clients/faye'
require 'render_sync/clients/pusher'
require 'render_sync/clients/dummy'
require 'render_sync/reactor'
if defined? Rails
require 'render_sync/erb_tracker'
require 'render_sync/engine'
end
module RenderSync
class << self
attr_accessor :config, :client, :logger
def config
@config || {}
end
def config_json
@config_json ||= begin
{
server: server,
api_key: api_key,
pusher_ws_host: pusher_ws_host,
pusher_ws_port: pusher_ws_port,
pusher_wss_port: pusher_wss_port,
pusher_encrypted: pusher_encrypted,
adapter: adapter
}.reject { |k, v| v.nil? }.to_json
end
end
# Resets the configuration to the default (empty hash)
def reset_config
@config = {}
@config_json = nil
end
# Loads the configuration from a given YAML file and environment (such as production)
def load_config(filename, environment)
reset_config
yaml = YAML.load(ERB.new(File.read(filename)).result)[environment.to_s]
raise ArgumentError, "The #{environment} environment does not exist in #{filename}" if yaml.nil?
yaml.each{|key, value| config[key.to_sym] = value }
setup_logger
if adapter
setup_client
else
setup_dummy_client
end
end
def setup_client
raise ArgumentError, "auth_token missing" if config[:auth_token].nil?
@client = RenderSync::Clients.const_get(adapter).new
@client.setup
end
def setup_dummy_client
config[:auth_token] = 'dummy_auth_token'
@client = RenderSync::Clients::Dummy.new
end
def setup_logger
@logger = (defined?(Rails) && Rails.logger) ? Rails.logger : Logger.new(STDOUT)
end
def async?
config[:async]
end
def server
config[:server]
end
def adapter_javascript_url
config[:adapter_javascript_url]
end
def auth_token
config[:auth_token]
end
def adapter
config[:adapter]
end
def app_id
config[:app_id]
end
def api_key
config[:api_key]
end
def pusher_api_scheme
config[:pusher_api_scheme]
end
def pusher_api_host
config[:pusher_api_host]
end
def pusher_api_port
config[:pusher_api_port]
end
def pusher_ws_host
config[:pusher_ws_host]
end
def pusher_ws_port
config[:pusher_ws_port]
end
def pusher_wss_port
config[:pusher_wss_port]
end
def pusher_encrypted
if config[:pusher_encrypted].nil?
true
else
config[:pusher_encrypted]
end
end
def reactor
@reactor ||= Reactor.new
end
# Returns the Faye Rack application.
# Any options given are passed to the Faye::RackAdapter.
def pubsub_app(options = {})
Faye::RackAdapter.new({
mount: config[:mount] || "/faye",
timeout: config[:timeout] || 45,
extensions: [FayeExtension.new]
}.merge(options))
end
def views_root
Rails.root.join('app', 'views', 'sync')
end
end
end