faye-1.2.4/0000755000175000017500000000000013425045757013214 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/0000755000175000017500000000000013425045757013762 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/faye.rb0000644000175000017500000000645113425045757015241 0ustar utkarsh2102utkarsh2102require 'cgi' require 'cookiejar' require 'digest/sha1' require 'em-http' require 'em-http/version' require 'eventmachine' require 'faye/websocket' require 'forwardable' require 'multi_json' require 'rack' require 'securerandom' require 'set' require 'time' require 'uri' module Faye VERSION = '1.2.4' ROOT = File.expand_path(File.dirname(__FILE__)) autoload :Deferrable, File.join(ROOT, 'faye', 'mixins', 'deferrable') autoload :Logging, File.join(ROOT, 'faye', 'mixins', 'logging') autoload :Publisher, File.join(ROOT, 'faye', 'mixins', 'publisher') autoload :Timeouts, File.join(ROOT, 'faye', 'mixins', 'timeouts') autoload :Namespace, File.join(ROOT, 'faye', 'util', 'namespace') autoload :Engine, File.join(ROOT, 'faye', 'engines', 'proxy') autoload :Channel, File.join(ROOT, 'faye', 'protocol', 'channel') autoload :Client, File.join(ROOT, 'faye', 'protocol', 'client') autoload :Dispatcher, File.join(ROOT, 'faye', 'protocol', 'dispatcher') autoload :Scheduler, File.join(ROOT, 'faye', 'protocol', 'scheduler') autoload :Extensible, File.join(ROOT, 'faye', 'protocol', 'extensible') autoload :Grammar, File.join(ROOT, 'faye', 'protocol', 'grammar') autoload :Publication, File.join(ROOT, 'faye', 'protocol', 'publication') autoload :Server, File.join(ROOT, 'faye', 'protocol', 'server') autoload :Subscription, File.join(ROOT, 'faye', 'protocol', 'subscription') autoload :Error, File.join(ROOT, 'faye', 'error') autoload :Transport, File.join(ROOT, 'faye', 'transport', 'transport') autoload :RackAdapter, File.join(ROOT, 'faye', 'adapters', 'rack_adapter') autoload :StaticServer, File.join(ROOT, 'faye', 'adapters', 'static_server') BAYEUX_VERSION = '1.0' JSONP_CALLBACK = 'jsonpcallback' CONNECTION_TYPES = %w[long-polling cross-origin-long-polling callback-polling websocket eventsource in-process] MANDATORY_CONNECTION_TYPES = %w[long-polling callback-polling in-process] class << self attr_accessor :logger end def self.ensure_reactor_running! Engine.ensure_reactor_running! end def self.random(*args) Engine.random(*args) end def self.client_id_from_messages(messages) first = [messages].flatten.find { |m| m['channel'] == '/meta/connect' } first && first['clientId'] end def self.copy_object(object) case object when Hash clone = {} object.each { |k,v| clone[k] = copy_object(v) } clone when Array clone = [] object.each { |v| clone << copy_object(v) } clone else object end end def self.to_json(value) case value when Hash, Array then MultiJson.dump(value) when String, NilClass then value.inspect else value.to_s end end def self.async_each(list, iterator, callback) n = list.size i = -1 calls = 0 looping = false loop, resume = nil, nil iterate = lambda do calls -= 1 i += 1 if i == n callback.call if callback else iterator.call(list[i], resume) end end loop = lambda do unless looping looping = true iterate.call while calls > 0 looping = false end end resume = lambda do calls += 1 loop.call end resume.call end end faye-1.2.4/lib/faye/0000755000175000017500000000000013425045757014706 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/faye/util/0000755000175000017500000000000013425045757015663 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/faye/util/namespace.rb0000644000175000017500000000051413425045757020144 0ustar utkarsh2102utkarsh2102module Faye class Namespace extend Forwardable def_delegator :@used, :delete, :release def_delegator :@used, :has_key?, :exists? def initialize @used = {} end def generate name = Engine.random name = Engine.random while @used.has_key?(name) @used[name] = name end end end faye-1.2.4/lib/faye/protocol/0000755000175000017500000000000013425045757016547 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/faye/protocol/publication.rb0000644000175000017500000000010013425045757021374 0ustar utkarsh2102utkarsh2102module Faye class Publication include Deferrable end endfaye-1.2.4/lib/faye/protocol/client.rb0000644000175000017500000002751313425045757020362 0ustar utkarsh2102utkarsh2102module Faye class Client include Deferrable include Publisher include Logging include Extensible UNCONNECTED = 1 CONNECTING = 2 CONNECTED = 3 DISCONNECTED = 4 HANDSHAKE = 'handshake' RETRY = 'retry' NONE = 'none' CONNECTION_TIMEOUT = 60.0 extend Forwardable def_delegators :@dispatcher, :add_websocket_extension, :disable, :set_header def initialize(endpoint = nil, options = {}) ::WebSocket::Driver.validate_options(options, [:interval, :timeout, :endpoints, :proxy, :retry, :scheduler, :websocket_extensions]) super() info('New client created for ?', endpoint) @channels = Channel::Set.new @dispatcher = Dispatcher.new(self, endpoint || RackAdapter::DEFAULT_ENDPOINT, options) @message_id = 0 @state = UNCONNECTED @response_callbacks = {} @advice = { 'reconnect' => RETRY, 'interval' => 1000.0 * (options[:interval] || Engine::INTERVAL), 'timeout' => 1000.0 * (options[:timeout] || CONNECTION_TIMEOUT) } @dispatcher.timeout = @advice['timeout'] / 1000.0 @dispatcher.bind(:message, &method(:receive_message)) end # Request # MUST include: * channel # * version # * supportedConnectionTypes # MAY include: * minimumVersion # * ext # * id # # Success Response Failed Response # MUST include: * channel MUST include: * channel # * version * successful # * supportedConnectionTypes * error # * clientId MAY include: * supportedConnectionTypes # * successful * advice # MAY include: * minimumVersion * version # * advice * minimumVersion # * ext * ext # * id * id # * authSuccessful def handshake(&block) return if @advice['reconnect'] == NONE return if @state != UNCONNECTED @state = CONNECTING info('Initiating handshake with ?', @dispatcher.endpoint.to_s) @dispatcher.select_transport(MANDATORY_CONNECTION_TYPES) send_message({ 'channel' => Channel::HANDSHAKE, 'version' => BAYEUX_VERSION, 'supportedConnectionTypes' => @dispatcher.connection_types }, {}) do |response| if response['successful'] @state = CONNECTED @dispatcher.client_id = response['clientId'] @dispatcher.select_transport(response['supportedConnectionTypes']) info('Handshake successful: ?', @dispatcher.client_id) subscribe(@channels.keys, true) block.call if block_given? else info('Handshake unsuccessful') EventMachine.add_timer(@dispatcher.retry) { handshake(&block) } @state = UNCONNECTED end end end # Request Response # MUST include: * channel MUST include: * channel # * clientId * successful # * connectionType * clientId # MAY include: * ext MAY include: * error # * id * advice # * ext # * id # * timestamp def connect(&block) return if @advice['reconnect'] == NONE or @state == DISCONNECTED return handshake { connect(&block) } if @state == UNCONNECTED callback(&block) return unless @state == CONNECTED info('Calling deferred actions for ?', @dispatcher.client_id) set_deferred_status(:succeeded) set_deferred_status(:unknown) return unless @connect_request.nil? @connect_request = true info('Initiating connection for ?', @dispatcher.client_id) send_message({ 'channel' => Channel::CONNECT, 'clientId' => @dispatcher.client_id, 'connectionType' => @dispatcher.connection_type }, {}) do cycle_connection end end # Request Response # MUST include: * channel MUST include: * channel # * clientId * successful # MAY include: * ext * clientId # * id MAY include: * error # * ext # * id def disconnect return unless @state == CONNECTED @state = DISCONNECTED info('Disconnecting ?', @dispatcher.client_id) promise = Publication.new send_message({ 'channel' => Channel::DISCONNECT, 'clientId' => @dispatcher.client_id }, {}) do |response| if response['successful'] @dispatcher.close promise.set_deferred_status(:succeeded) else promise.set_deferred_status(:failed, Error.parse(response['error'])) end end info('Clearing channel listeners for ?', @dispatcher.client_id) @channels = Channel::Set.new promise end # Request Response # MUST include: * channel MUST include: * channel # * clientId * successful # * subscription * clientId # MAY include: * ext * subscription # * id MAY include: * error # * advice # * ext # * id # * timestamp def subscribe(channel, force = false, &block) if Array === channel return channel.map { |c| subscribe(c, force, &block) } end subscription = Subscription.new(self, channel, block) has_subscribe = @channels.has_subscription?(channel) if has_subscribe and not force @channels.subscribe([channel], subscription) subscription.set_deferred_status(:succeeded) return subscription end connect { info('Client ? attempting to subscribe to ?', @dispatcher.client_id, channel) @channels.subscribe([channel], subscription) unless force send_message({ 'channel' => Channel::SUBSCRIBE, 'clientId' => @dispatcher.client_id, 'subscription' => channel }, {}) do |response| unless response['successful'] subscription.set_deferred_status(:failed, Error.parse(response['error'])) next @channels.unsubscribe(channel, subscription) end channels = [response['subscription']].flatten info('Subscription acknowledged for ? to ?', @dispatcher.client_id, channels) subscription.set_deferred_status(:succeeded) end } subscription end # Request Response # MUST include: * channel MUST include: * channel # * clientId * successful # * subscription * clientId # MAY include: * ext * subscription # * id MAY include: * error # * advice # * ext # * id # * timestamp def unsubscribe(channel, subscription = nil, &block) subscription ||= block if Array === channel return channel.map { |c| unsubscribe(c, subscription) } end dead = @channels.unsubscribe(channel, subscription) return unless dead connect { info('Client ? attempting to unsubscribe from ?', @dispatcher.client_id, channel) send_message({ 'channel' => Channel::UNSUBSCRIBE, 'clientId' => @dispatcher.client_id, 'subscription' => channel }, {}) do |response| next unless response['successful'] channels = [response['subscription']].flatten info('Unsubscription acknowledged for ? from ?', @dispatcher.client_id, channels) end } end # Request Response # MUST include: * channel MUST include: * channel # * data * successful # MAY include: * clientId MAY include: * id # * id * error # * ext * ext def publish(channel, data, options = {}) ::WebSocket::Driver.validate_options(options, [:attempts, :deadline]) publication = Publication.new connect { info('Client ? queueing published message to ?: ?', @dispatcher.client_id, channel, data) send_message({ 'channel' => channel, 'data' => data, 'clientId' => @dispatcher.client_id }, options) do |response| if response['successful'] publication.set_deferred_status(:succeeded) else publication.set_deferred_status(:failed, Error.parse(response['error'])) end end } publication end private def send_message(message, options, &callback) message['id'] = generate_message_id timeout = [nil, 0].include?(@advice['timeout']) ? 1.2 * @dispatcher.retry : 1.2 * @advice['timeout'] / 1000.0 pipe_through_extensions(:outgoing, message, nil) do |message| next unless message @response_callbacks[message['id']] = callback if callback @dispatcher.send_message(message, timeout, options) end end def generate_message_id @message_id += 1 @message_id = 0 if @message_id >= 2**32 @message_id.to_s(36) end def receive_message(message) id = message['id'] if message.has_key?('successful') callback = @response_callbacks.delete(id) end pipe_through_extensions(:incoming, message, nil) do |message| next unless message handle_advice(message['advice']) if message['advice'] deliver_message(message) callback.call(message) if callback end end def handle_advice(advice) @advice.update(advice) @dispatcher.timeout = @advice['timeout'] / 1000.0 if @advice['reconnect'] == HANDSHAKE and @state != DISCONNECTED @state = UNCONNECTED @dispatcher.client_id = nil cycle_connection end end def deliver_message(message) return unless message.has_key?('channel') and message.has_key?('data') info('Client ? calling listeners for ? with ?', @dispatcher.client_id, message['channel'], message['data']) @channels.distribute_message(message) end def cycle_connection if @connect_request @connect_request = nil info('Closed connection for ?', @dispatcher.client_id) end EventMachine.add_timer(@advice['interval'] / 1000.0) { connect } end end end faye-1.2.4/lib/faye/protocol/dispatcher.rb0000644000175000017500000001032713425045757021225 0ustar utkarsh2102utkarsh2102module Faye class Dispatcher class Envelope < Struct.new(:message, :scheduler, :request, :timer) end MAX_REQUEST_SIZE = 2048 DEFAULT_RETRY = 5.0 UP = 1 DOWN = 2 include Publisher include Logging extend Forwardable def_delegators :@transport, :connection_type attr_accessor :client_id, :timeout attr_reader :cookies, :endpoint, :headers, :max_request_size, :proxy, :retry, :transports, :ws_extensions def initialize(client, endpoint, options) super() @client = client @endpoint = String === endpoint ? URI(endpoint) : endpoint @alternates = options[:endpoints] || {} @cookies = CookieJar::Jar.new @disabled = [] @envelopes = {} @headers = {} @retry = options[:retry] || DEFAULT_RETRY @scheduler = options[:scheduler] || Faye::Scheduler @state = 0 @transports = {} @ws_extensions = [] @proxy = options[:proxy] || {} @proxy = {:origin => @proxy} if String === @proxy [*options[:websocket_extensions]].each do |extension| add_websocket_extension(extension) end @alternates.each do |type, url| @alternates[type] = URI(url) end @max_request_size = MAX_REQUEST_SIZE end def endpoint_for(connection_type) @alternates[connection_type] || @endpoint end def add_websocket_extension(extension) @ws_extensions << extension end def disable(feature) @disabled << feature end def set_header(name, value) @headers[name.to_s] = value.to_s end def close transport = @transport @transport = nil transport.close if transport end def connection_types Transport.connection_types end def select_transport(transport_types) Transport.get(self, transport_types, @disabled) do |transport| debug('Selected ? transport for ?', transport.connection_type, transport.endpoint) next if transport == @transport @transport.close if @transport @transport = transport end end def send_message(message, timeout, options = {}) id = message['id'] attempts = options[:attempts] deadline = options[:deadline] && Time.now.to_f + options[:deadline] envelope = @envelopes[id] unless envelope scheduler = @scheduler.new(message, :timeout => timeout, :interval => @retry, :attempts => attempts, :deadline => deadline) envelope = @envelopes[id] = Envelope.new(message, scheduler, nil, nil) end send_envelope(envelope) end def send_envelope(envelope) return unless @transport return if envelope.request or envelope.timer message = envelope.message scheduler = envelope.scheduler unless scheduler.deliverable? scheduler.abort! @envelopes.delete(message['id']) return end envelope.timer = EventMachine.add_timer(scheduler.timeout) do handle_error(message) end scheduler.send! envelope.request = @transport.send_message(message) end private :send_envelope def handle_response(reply) envelope = @envelopes.delete(reply['id']) if reply.has_key?('successful') and envelope envelope.scheduler.succeed! EventMachine.cancel_timer(envelope.timer) if envelope.timer end trigger(:message, reply) return if @state == UP @state = UP @client.trigger('transport:up') end def handle_error(message, immediate = false) return unless envelope = @envelopes[message['id']] return unless request = envelope.request request.callback do |req| req.close if req.respond_to?(:close) end scheduler = envelope.scheduler scheduler.fail! EventMachine.cancel_timer(envelope.timer) envelope.request = envelope.timer = nil if immediate send_envelope(envelope) else envelope.timer = EventMachine.add_timer(scheduler.interval) do envelope.timer = nil send_envelope(envelope) end end return if @state == DOWN @state = DOWN @client.trigger('transport:down') end end end faye-1.2.4/lib/faye/protocol/channel.rb0000644000175000017500000000474413425045757020515 0ustar utkarsh2102utkarsh2102module Faye class Channel include Publisher attr_reader :name def initialize(name) super() @name = name end def <<(message) trigger(:message, message) end def unused? listener_count(:message).zero? end HANDSHAKE = '/meta/handshake' CONNECT = '/meta/connect' SUBSCRIBE = '/meta/subscribe' UNSUBSCRIBE = '/meta/unsubscribe' DISCONNECT = '/meta/disconnect' META = 'meta' SERVICE = 'service' class << self def expand(name) segments = parse(name) channels = ['/**', name] copy = segments.dup copy[copy.size - 1] = '*' channels << unparse(copy) 1.upto(segments.size - 1) do |i| copy = segments[0...i] copy << '**' channels << unparse(copy) end channels end def valid?(name) Grammar::CHANNEL_NAME =~ name or Grammar::CHANNEL_PATTERN =~ name end def parse(name) return nil unless valid?(name) name.split('/')[1..-1] end def unparse(segments) '/' + segments.join('/') end def meta?(name) segments = parse(name) segments ? (segments.first == META) : nil end def service?(name) segments = parse(name) segments ? (segments.first == SERVICE) : nil end def subscribable?(name) return nil unless valid?(name) not meta?(name) and not service?(name) end end class Set def initialize @channels = {} end def keys @channels.keys end def remove(name) @channels.delete(name) end def has_subscription?(name) @channels.has_key?(name) end def subscribe(names, subscription) names.each do |name| channel = @channels[name] ||= Channel.new(name) channel.bind(:message, &subscription) end end def unsubscribe(name, subscription) channel = @channels[name] return false unless channel channel.unbind(:message, &subscription) if channel.unused? remove(name) true else false end end def distribute_message(message) channels = Channel.expand(message['channel']) channels.each do |name| channel = @channels[name] channel.trigger(:message, message) if channel end end end end end faye-1.2.4/lib/faye/protocol/grammar.rb0000644000175000017500000000375413425045757020533 0ustar utkarsh2102utkarsh2102module Faye module Grammar def self.rule(&block) source = instance_eval(&block) %r{^#{string(source)}$} end def self.choice(*list) '(' + list.map(&method(:string)) * '|' + ')' end def self.repeat(*pattern) '(' + string(pattern) + ')*' end def self.oneormore(*pattern) '(' + string(pattern) + ')+' end def self.string(item) return item.map(&method(:string)) * '' if Array === item String === item ? item : item.source.gsub(/^\^/, '').gsub(/\$$/, '') end LOWALPHA = rule {[ '[a-z]' ]} UPALPHA = rule {[ '[A-Z]' ]} ALPHA = rule {[ choice(LOWALPHA, UPALPHA) ]} DIGIT = rule {[ '[0-9]' ]} ALPHANUM = rule {[ choice(ALPHA, DIGIT) ]} MARK = rule {[ choice(*%w[\\- \\_ \\! \\~ \\( \\) \\$ \\@]) ]} STRING = rule {[ repeat(choice(ALPHANUM, MARK, ' ', '\\/', '\\*', '\\.')) ]} TOKEN = rule {[ oneormore(choice(ALPHANUM, MARK)) ]} INTEGER = rule {[ oneormore(DIGIT) ]} CHANNEL_SEGMENT = rule {[ TOKEN ]} CHANNEL_SEGMENTS = rule {[ CHANNEL_SEGMENT, repeat('\\/', CHANNEL_SEGMENT) ]} CHANNEL_NAME = rule {[ '\\/', CHANNEL_SEGMENTS ]} WILD_CARD = rule {[ '\\*{1,2}' ]} CHANNEL_PATTERN = rule {[ repeat('\\/', CHANNEL_SEGMENT), '\\/', WILD_CARD ]} VERSION_ELEMENT = rule {[ ALPHANUM, repeat(choice(ALPHANUM, '\\-', '\\_')) ]} VERSION = rule {[ INTEGER, repeat('\\.', VERSION_ELEMENT) ]} CLIENT_ID = rule {[ oneormore(ALPHANUM) ]} ID = rule {[ oneormore(ALPHANUM) ]} ERROR_MESSAGE = rule {[ STRING ]} ERROR_ARGS = rule {[ STRING, repeat(',', STRING) ]} ERROR_CODE = rule {[ DIGIT, DIGIT, DIGIT ]} ERROR = rule {[ choice(string([ERROR_CODE, ':', ERROR_ARGS, ':', ERROR_MESSAGE]), string([ERROR_CODE, ':', ':', ERROR_MESSAGE])) ]} end end faye-1.2.4/lib/faye/protocol/socket.rb0000644000175000017500000000072313425045757020366 0ustar utkarsh2102utkarsh2102module Faye class Server class Socket def initialize(server, socket, env) @server = server @socket = socket @env = env end def send(message) @server.pipe_through_extensions(:outgoing, message, @env) do |piped_message| @socket.send(Faye.to_json([piped_message])) if @socket end end def close @socket.close if @socket @socket = nil end end end end faye-1.2.4/lib/faye/protocol/scheduler.rb0000644000175000017500000000117113425045757021052 0ustar utkarsh2102utkarsh2102module Faye class Scheduler def initialize(message, options) @message = message @options = options @attempts = 0 end def interval @options[:interval] end def timeout @options[:timeout] end def deliverable? attempts = @options[:attempts] deadline = @options[:deadline] now = Time.now.to_f return false if attempts and @attempts >= attempts return false if deadline and now > deadline true end def send! @attempts += 1 end def succeed! end def fail! end def abort! end end end faye-1.2.4/lib/faye/protocol/server.rb0000644000175000017500000002266113425045757020411 0ustar utkarsh2102utkarsh2102module Faye class Server autoload :Socket, File.join(ROOT, 'faye', 'protocol', 'socket') include Logging include Extensible META_METHODS = %w[handshake connect disconnect subscribe unsubscribe] attr_reader :engine def initialize(options = {}) @options = options || {} engine_opts = @options[:engine] || {} engine_opts[:timeout] = @options[:timeout] @engine = Faye::Engine.get(engine_opts) info('Created new server: ?', @options) end def close @engine.close end def open_socket(client_id, socket, env) return unless client_id and socket @engine.open_socket(client_id, Socket.new(self, socket, env)) end def close_socket(client_id, close = true) @engine.flush_connection(client_id, close) end def process(messages, env, &callback) local = env.nil? messages = [messages].flatten info('Processing messages: ? (local: ?)', messages, local) return callback.call([]) if messages.size == 0 processed, responses = 0, [] gather_replies = lambda do |replies| responses.concat(replies) processed += 1 responses.compact! info('Returning replies: ?', responses) callback.call(responses) if processed == messages.size end handle_reply = lambda do |replies| extended, expected = 0, replies.size gather_replies.call(replies) if expected == 0 replies.each_with_index do |reply, i| debug('Processing reply: ?', reply) pipe_through_extensions(:outgoing, reply, env) do |message| replies[i] = message extended += 1 gather_replies.call(replies) if extended == expected end end end messages.each do |message| pipe_through_extensions(:incoming, message, env) do |piped_message| handle(piped_message, local, &handle_reply) end end end def make_response(message) response = {} response['id'] = message['id'] if message['id'] response['clientId'] = message['clientId'] if message['clientId'] response['channel'] = message['channel'] if message['channel'] response['error'] = message['error'] if message['error'] response['successful'] = !response['error'] response end def handle(message, local = false, &callback) return callback.call([]) if !message info('Handling message: ? (local: ?)', message, local) channel_name = message['channel'] error = message['error'] return handle_meta(message, local, &callback) if Channel.meta?(channel_name) if Grammar::CHANNEL_NAME !~ channel_name error = Faye::Error.channel_invalid(channel_name) end if message['data'].nil? error = Faye::Error.parameter_missing('data') end @engine.publish(message) unless error response = make_response(message) response['error'] = error if error response['successful'] = !response['error'] callback.call([response]) end def handle_meta(message, local, &callback) method = Channel.parse(message['channel'])[1] unless META_METHODS.include?(method) response = make_response(message) response['error'] = Faye::Error.channel_forbidden(message['channel']) response['successful'] = false return callback.call([response]) end __send__(method, message, local) do |responses| responses = [responses].flatten responses.each { |r| advize(r, message['connectionType']) } callback.call(responses) end end def advize(response, connection_type) return unless [Channel::HANDSHAKE, Channel::CONNECT].include?(response['channel']) if connection_type == 'eventsource' interval = (@engine.timeout * 1000).floor timeout = 0 else interval = (@engine.interval * 1000).floor timeout = (@engine.timeout * 1000).floor end advice = response['advice'] ||= {} if response['error'] advice['reconnect'] ||= 'handshake' else advice['reconnect'] ||= 'retry' advice['interval'] ||= interval advice['timeout'] ||= timeout end end # MUST contain * version # * supportedConnectionTypes # MAY contain * minimumVersion # * ext # * id def handshake(message, local = false, &callback) response = make_response(message) response['version'] = BAYEUX_VERSION response['error'] = Error.parameter_missing('version') if message['version'].nil? client_conns = message['supportedConnectionTypes'] response['supportedConnectionTypes'] = CONNECTION_TYPES if client_conns common_conns = client_conns.select { |c| CONNECTION_TYPES.include?(c) } response['error'] = Error.conntype_mismatch(*client_conns) if common_conns.empty? else response['error'] = Error.parameter_missing('supportedConnectionTypes') end response['successful'] = response['error'].nil? return callback.call(response) unless response['successful'] @engine.create_client do |client_id| response['clientId'] = client_id callback.call(response) end end # MUST contain * clientId # * connectionType # MAY contain * ext # * id def connect(message, local = false, &callback) response = make_response(message) client_id = message['clientId'] connection_type = message['connectionType'] @engine.client_exists(client_id) do |exists| response['error'] = Error.client_unknown(client_id) unless exists response['error'] = Error.parameter_missing('clientId') if client_id.nil? unless CONNECTION_TYPES.include?(connection_type) response['error'] = Error.conntype_mismatch(connection_type) end response['error'] = Error.parameter_missing('connectionType') if connection_type.nil? response['successful'] = response['error'].nil? if !response['successful'] response.delete('clientId') next callback.call(response) end if message['connectionType'] == 'eventsource' message['advice'] ||= {} message['advice']['timeout'] = 0 end @engine.connect(response['clientId'], message['advice']) do |events| callback.call([response] + events) end end end # MUST contain * clientId # MAY contain * ext # * id def disconnect(message, local = false, &callback) response = make_response(message) client_id = message['clientId'] @engine.client_exists(client_id) do |exists| response['error'] = Error.client_unknown(client_id) unless exists response['error'] = Error.parameter_missing('clientId') if client_id.nil? response['successful'] = response['error'].nil? response.delete('clientId') unless response['successful'] @engine.destroy_client(client_id) if response['successful'] callback.call(response) end end # MUST contain * clientId # * subscription # MAY contain * ext # * id def subscribe(message, local = false, &callback) response = make_response(message) client_id = message['clientId'] subscription = [message['subscription']].flatten @engine.client_exists(client_id) do |exists| response['error'] = Error.client_unknown(client_id) unless exists response['error'] = Error.parameter_missing('clientId') if client_id.nil? response['error'] = Error.parameter_missing('subscription') if message['subscription'].nil? response['subscription'] = message['subscription'] || [] subscription.each do |channel| next if response['error'] response['error'] = Error.channel_forbidden(channel) unless local or Channel.subscribable?(channel) response['error'] = Error.channel_invalid(channel) unless Channel.valid?(channel) next if response['error'] @engine.subscribe(client_id, channel) end response['successful'] = response['error'].nil? callback.call(response) end end # MUST contain * clientId # * subscription # MAY contain * ext # * id def unsubscribe(message, local = false, &callback) response = make_response(message) client_id = message['clientId'] subscription = [message['subscription']].flatten @engine.client_exists(client_id) do |exists| response['error'] = Error.client_unknown(client_id) unless exists response['error'] = Error.parameter_missing('clientId') if client_id.nil? response['error'] = Error.parameter_missing('subscription') if message['subscription'].nil? response['subscription'] = message['subscription'] || [] subscription.each do |channel| next if response['error'] response['error'] = Error.channel_forbidden(channel) unless local or Channel.subscribable?(channel) response['error'] = Error.channel_invalid(channel) unless Channel.valid?(channel) next if response['error'] @engine.unsubscribe(client_id, channel) end response['successful'] = response['error'].nil? callback.call(response) end end end end faye-1.2.4/lib/faye/protocol/extensible.rb0000644000175000017500000000223113425045757021234 0ustar utkarsh2102utkarsh2102module Faye module Extensible include Logging def add_extension(extension) @extensions ||= [] @extensions << extension extension.added(self) if extension.respond_to?(:added) end def remove_extension(extension) return unless @extensions @extensions.delete_if do |ext| next false unless ext == extension extension.removed(self) if extension.respond_to?(:removed) true end end def pipe_through_extensions(stage, message, env, &callback) debug('Passing through ? extensions: ?', stage, message) return callback.call(message) unless @extensions extensions = @extensions.dup pipe = lambda do |message| next callback.call(message) unless message extension = extensions.shift next callback.call(message) unless extension next pipe.call(message) unless extension.respond_to?(stage) arity = extension.method(stage).arity if arity >= 3 extension.__send__(stage, message, env, pipe) else extension.__send__(stage, message, pipe) end end pipe.call(message) end end end faye-1.2.4/lib/faye/protocol/subscription.rb0000644000175000017500000000133113425045757021616 0ustar utkarsh2102utkarsh2102module Faye class Subscription include Deferrable def initialize(client, channels, callback) @client = client @channels = channels @callback = callback @cancelled = false end def with_channel(&callback) @with_channel = callback self end def call(*args) message = args.first @callback.call(message['data']) if @callback @with_channel.call(message['channel'], message['data']) if @with_channel end def to_proc @to_proc ||= lambda { |*a| call(*a) } end def cancel return if @cancelled @client.unsubscribe(@channels, self) @cancelled = true end def unsubscribe cancel end end end faye-1.2.4/lib/faye/adapters/0000755000175000017500000000000013425045757016511 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/faye/adapters/static_server.rb0000644000175000017500000000266513425045757021724 0ustar utkarsh2102utkarsh2102module Faye class StaticServer def initialize(directory, path_regex) @directory = directory @path_regex = path_regex @path_map = {} @index = {} end def map(request_path, filename) @path_map[request_path] = filename end def =~(pathname) @path_regex =~ pathname end def call(env) filename = File.basename(env['PATH_INFO']) filename = @path_map[filename] || filename cache = @index[filename] ||= {} fullpath = File.join(@directory, filename) begin cache[:content] ||= File.read(fullpath) cache[:digest] ||= Digest::SHA1.hexdigest(cache[:content]) cache[:mtime] ||= File.mtime(fullpath) rescue return [404, {}, []] end type = /\.js$/ =~ fullpath ? RackAdapter::TYPE_SCRIPT : RackAdapter::TYPE_JSON ims = env['HTTP_IF_MODIFIED_SINCE'] no_content_length = env[RackAdapter::HTTP_X_NO_CONTENT_LENGTH] headers = { 'ETag' => cache[:digest], 'Last-Modified' => cache[:mtime].httpdate } if env['HTTP_IF_NONE_MATCH'] == cache[:digest] [304, headers, ['']] elsif ims and cache[:mtime] <= Time.httpdate(ims) [304, headers, ['']] else headers['Content-Length'] = cache[:content].bytesize.to_s unless no_content_length headers.update(type) [200, headers, [cache[:content]]] end end end end faye-1.2.4/lib/faye/adapters/rack_adapter.rb0000644000175000017500000002040613425045757021460 0ustar utkarsh2102utkarsh2102module Faye class RackAdapter include Logging extend Forwardable def_delegators '@server.engine', *Faye::Publisher.instance_methods ASYNC_RESPONSE = [-1, {}, []].freeze DEFAULT_ENDPOINT = '/bayeux' SCRIPT_PATH = 'faye-browser-min.js' TYPE_JSON = {'Content-Type' => 'application/json; charset=utf-8'} TYPE_SCRIPT = {'Content-Type' => 'text/javascript; charset=utf-8'} TYPE_TEXT = {'Content-Type' => 'text/plain; charset=utf-8'} VALID_JSONP_CALLBACK = /^[a-z_\$][a-z0-9_\$]*(\.[a-z_\$][a-z0-9_\$]*)*$/i # This header is passed by Rack::Proxy during testing. Rack::Proxy seems to # set content-length for you, and setting it in here really slows the tests # down. Better suggestions welcome. HTTP_X_NO_CONTENT_LENGTH = 'HTTP_X_NO_CONTENT_LENGTH' def initialize(app = nil, options = nil, &block) @app = app if app.respond_to?(:call) @options = [app, options].grep(Hash).first || {} ::WebSocket::Driver.validate_options(@options, [:engine, :mount, :ping, :timeout, :extensions, :websocket_extensions]) @endpoint = @options[:mount] || DEFAULT_ENDPOINT @extensions = [] @endpoint_re = Regexp.new('^' + @endpoint.gsub(/\/$/, '') + '(/[^/]*)*(\\.[^\\.]+)?$') @server = Server.new(@options) @static = StaticServer.new(File.join(ROOT, '..', 'build', 'client'), /\.(?:js|map)$/) @static.map(File.basename(@endpoint) + '.js', SCRIPT_PATH) @static.map('client.js', SCRIPT_PATH) if extensions = @options[:extensions] [*extensions].each { |extension| add_extension(extension) } end if websocket_extensions = @options[:websocket_extensions] [*websocket_extensions].each { |ext| add_websocket_extension(ext) } end block.call(self) if block end def listen(*args) raise 'The listen() method is deprecated - see https://github.com/faye/faye-websocket-ruby#running-your-socket-application for information on running your Faye server' end def add_extension(extension) @server.add_extension(extension) end def remove_extension(extension) @server.remove_extension(extension) end def add_websocket_extension(extension) @extensions << extension end def close @server.close end def get_client @client ||= Client.new(@server) end def call(env) Faye.ensure_reactor_running! request = Rack::Request.new(env) unless request.path_info =~ @endpoint_re env['faye.client'] = get_client return @app ? @app.call(env) : [404, TYPE_TEXT, ["Sure you're not looking for #{@endpoint} ?"]] end return @static.call(env) if @static =~ request.path_info # http://groups.google.com/group/faye-users/browse_thread/thread/4a01bb7d25d3636a if env['REQUEST_METHOD'] == 'OPTIONS' or env['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'POST' return handle_options end return handle_websocket(request) if Faye::WebSocket.websocket?(env) return handle_eventsource(request) if Faye::EventSource.eventsource?(env) handle_request(request) end private def handle_request(request) unless json_msg = message_from_request(request) error 'Received request with no message: ?', format_request(request) return [400, TYPE_TEXT, ['Bad request']] end unless json_msg.force_encoding('UTF-8').valid_encoding? error 'Received request with invalid encoding: ?', format_request(request) return [400, TYPE_TEXT, ['Bad request']] end debug("Received message via HTTP #{request.request_method}: ?", json_msg) message = parse_json(json_msg) jsonp = request.params['jsonp'] || JSONP_CALLBACK headers = request.get? ? TYPE_SCRIPT.dup : TYPE_JSON.dup origin = request.env['HTTP_ORIGIN'] callback = request.env['async.callback'] if jsonp !~ VALID_JSONP_CALLBACK error 'Invalid JSON-P callback: ?', jsonp return [400, TYPE_TEXT, ['Bad request']] end headers['Access-Control-Allow-Origin'] = origin if origin headers['Cache-Control'] = 'no-cache, no-store' headers['X-Content-Type-Options'] = 'nosniff' request.env['rack.hijack'].call if request.env['rack.hijack'] hijack = request.env['rack.hijack_io'] EventMachine.next_tick do @server.process(message, request) do |replies| response = Faye.to_json(replies) if request.get? response = "/**/#{ jsonp }(#{ jsonp_escape(response) });" headers['Content-Disposition'] = 'attachment; filename=f.txt' end headers['Content-Length'] = response.bytesize.to_s unless request.env[HTTP_X_NO_CONTENT_LENGTH] debug('HTTP response: ?', response) send_response([200, headers, [response]], hijack, callback) end end ASYNC_RESPONSE rescue => e error "#{e.message}\nBacktrace:\n#{e.backtrace * "\n"}" [400, TYPE_TEXT, ['Bad request']] end def message_from_request(request) message = request.params['message'] return message if message # Some clients do not send a content-type, e.g. # Internet Explorer when using cross-origin-long-polling # Some use application/xml when using CORS content_type = request.env['CONTENT_TYPE'] || '' if content_type.split(';').first == 'application/json' request.body.read else CGI.parse(request.body.read)['message'][0] end end def jsonp_escape(json) json.gsub(/\u2028/, '\u2028').gsub(/\u2029/, '\u2029') end def send_response(response, hijack, callback) return callback.call(response) if callback buffer = "HTTP/1.1 #{response[0]} OK\r\n" response[1].each do |name, value| buffer << "#{name}: #{value}\r\n" end buffer << "\r\n" response[2].each do |chunk| buffer << chunk end hijack.write(buffer) hijack.flush hijack.close_write end def handle_websocket(request) options = {:extensions => @extensions, :ping => @options[:ping]} ws = Faye::WebSocket.new(request.env, [], options) client_id = nil ws.onmessage = lambda do |event| begin debug("Received message via WebSocket[#{ws.version}]: ?", event.data) message = parse_json(event.data) cid = Faye.client_id_from_messages(message) @server.close_socket(client_id, false) if client_id and cid and cid != client_id @server.open_socket(cid, ws, request) client_id = cid if cid @server.process(message, request) do |replies| ws.send(Faye.to_json(replies)) if ws end rescue => e error "#{e.message}\nBacktrace:\n#{e.backtrace * "\n"}" end end ws.onclose = lambda do |event| @server.close_socket(client_id) ws = nil end ws.rack_response end def handle_eventsource(request) es = Faye::EventSource.new(request.env, :ping => @options[:ping]) client_id = es.url.split('/').pop debug('Opened EventSource connection for ?', client_id) @server.open_socket(client_id, es, request) es.onclose = lambda do |event| @server.close_socket(client_id) es = nil end es.rack_response end def handle_options headers = { 'Access-Control-Allow-Credentials' => 'false', 'Access-Control-Allow-Headers' => 'Accept, Authorization, Content-Type, Pragma, X-Requested-With', 'Access-Control-Allow-Methods' => 'POST, GET', 'Access-Control-Allow-Origin' => '*', 'Access-Control-Max-Age' => '86400' } [200, headers, []] end def parse_json(json) data = MultiJson.load(json) return data if Array === data or Hash === data raise ArgumentError, 'JSON messages must contain an object or array' end def format_request(request) request.body.rewind string = "curl -X #{request.request_method.upcase}" string << " '#{request.url}'" if request.post? string << " -H 'Content-Type: #{request.env['CONTENT_TYPE']}'" string << " -d '#{request.body.read}'" end string end end end faye-1.2.4/lib/faye/mixins/0000755000175000017500000000000013425045757016215 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/faye/mixins/publisher.rb0000644000175000017500000000046313425045757020542 0ustar utkarsh2102utkarsh2102module Faye module Publisher include ::WebSocket::Driver::EventEmitter alias :bind :add_listener alias :trigger :emit def unbind(event, &listener) if listener remove_listener(event, &listener) else remove_all_listeners(event) end end end end faye-1.2.4/lib/faye/mixins/logging.rb0000644000175000017500000000127313425045757020173 0ustar utkarsh2102utkarsh2102module Faye module Logging LOG_LEVELS = { :fatal => 4, :error => 3, :warn => 2, :info => 1, :debug => 0 } LOG_LEVELS.each do |level, value| define_method(level) { |*args| write_log(args, level) } end private def write_log(message_args, level) return unless Faye.logger message = message_args.shift.gsub(/\?/) do Faye.to_json(message_args.shift) end banner = "[#{ self.class.name }] " if Faye.logger.respond_to?(level) Faye.logger.__send__(level, banner + message) elsif Faye.logger.respond_to?(:call) Faye.logger.call(banner + message) end end end end faye-1.2.4/lib/faye/mixins/deferrable.rb0000644000175000017500000000040013425045757020627 0ustar utkarsh2102utkarsh2102module Faye module Deferrable include EventMachine::Deferrable def set_deferred_status(status, *args) if status == :unknown @deferred_status = @deferred_args = @callbacks = @errbacks = nil end super end end end faye-1.2.4/lib/faye/mixins/timeouts.rb0000644000175000017500000000115113425045757020411 0ustar utkarsh2102utkarsh2102module Faye module Timeouts def add_timeout(name, delay, &block) Engine.ensure_reactor_running! @timeouts ||= {} return if @timeouts.has_key?(name) @timeouts[name] = EventMachine.add_timer(delay) do @timeouts.delete(name) block.call end end def remove_timeout(name) @timeouts ||= {} timeout = @timeouts[name] return if timeout.nil? EventMachine.cancel_timer(timeout) @timeouts.delete(name) end def remove_all_timeouts @timeouts ||= {} @timeouts.keys.each { |name| remove_timeout(name) } end end end faye-1.2.4/lib/faye/transport/0000755000175000017500000000000013425045757016742 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/faye/transport/transport.rb0000644000175000017500000001006013425045757021320 0ustar utkarsh2102utkarsh2102module Faye class Transport include Logging include Publisher include Timeouts DEFAULT_PORTS = {'http' => 80, 'https' => 433, 'ws' => 80, 'wss' => 443} attr_reader :endpoint def initialize(dispatcher, endpoint) super() @dispatcher = dispatcher @endpoint = endpoint @outbox = [] @proxy = @dispatcher.proxy.dup @proxy[:origin] ||= @endpoint.respond_to?(:find_proxy) ? @endpoint.find_proxy : nil end def batching? true end def close end def encode(messages) '' end def connection_type self.class.connection_type end def send_message(message) debug('Client ? sending message to ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, message) unless batching? promise = EventMachine::DefaultDeferrable.new promise.succeed(request([message])) return promise end @outbox << message flush_large_batch if message['channel'] == Channel::HANDSHAKE return publish(0.01) end if message['channel'] == Channel::CONNECT @connection_message = message end publish(Engine::MAX_DELAY) end private def publish(delay) @promise ||= EventMachine::DefaultDeferrable.new add_timeout(:publish, delay) do flush @promise = nil end @promise end def flush remove_timeout(:publish) if @outbox.size > 1 and @connection_message @connection_message['advice'] = {'timeout' => 0} end @promise.succeed(request(@outbox)) @connection_message = nil @outbox = [] end def flush_large_batch string = encode(@outbox) return if string.size < @dispatcher.max_request_size last = @outbox.pop @promise ||= EventMachine::DefaultDeferrable.new flush @outbox.push(last) if last end def receive(replies) return unless replies replies = [replies].flatten debug('Client ? received from ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, replies) replies.each do |reply| @dispatcher.handle_response(reply) end end def handle_error(messages, immediate = false) debug('Client ? failed to send to ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, messages) messages.each do |message| @dispatcher.handle_error(message, immediate) end end def get_cookies @dispatcher.cookies.get_cookies(@endpoint.to_s) * ';' end def store_cookies(set_cookie) [*set_cookie].compact.each do |cookie| @dispatcher.cookies.set_cookie(@endpoint.to_s, cookie) end end @transports = [] class << self attr_accessor :connection_type def get(dispatcher, allowed, disabled, &callback) endpoint = dispatcher.endpoint select = lambda do |(conn_type, klass), resume| conn_endpoint = dispatcher.endpoint_for(conn_type) if disabled.include?(conn_type) next resume.call end unless allowed.include?(conn_type) klass.usable?(dispatcher, conn_endpoint) { |u| } next resume.call end klass.usable?(dispatcher, conn_endpoint) do |is_usable| next resume.call unless is_usable transport = klass.respond_to?(:create) ? klass.create(dispatcher, conn_endpoint) : klass.new(dispatcher, conn_endpoint) callback.call(transport) end end error = lambda do raise "Could not find a usable connection type for #{ endpoint }" end Faye.async_each(@transports, select, error) end def register(type, klass) @transports << [type, klass] klass.connection_type = type end def connection_types @transports.map { |t| t[0] } end end %w[local web_socket http].each do |type| require File.join(ROOT, 'faye', 'transport', type) end end end faye-1.2.4/lib/faye/transport/web_socket.rb0000644000175000017500000000640713425045757021423 0ustar utkarsh2102utkarsh2102module Faye class Transport::WebSocket < Transport UNCONNECTED = 1 CONNECTING = 2 CONNECTED = 3 PROTOCOLS = { 'http' => 'ws', 'https' => 'wss' } include Deferrable class Request include Deferrable def close callback { |socket| socket.close } end end def self.usable?(dispatcher, endpoint, &callback) create(dispatcher, endpoint).usable?(&callback) end def self.create(dispatcher, endpoint) sockets = dispatcher.transports[:websocket] ||= {} sockets[endpoint.to_s] ||= new(dispatcher, endpoint) end def batching? false end def usable?(&callback) self.callback { callback.call(true) } self.errback { callback.call(false) } connect end def request(messages) @pending ||= Set.new messages.each { |message| @pending.add(message) } promise = Request.new callback do |socket| next unless socket and socket.ready_state == 1 socket.send(Faye.to_json(messages)) promise.succeed(socket) end connect promise end def connect @state ||= UNCONNECTED return unless @state == UNCONNECTED @state = CONNECTING url = @endpoint.dup headers = @dispatcher.headers.dup extensions = @dispatcher.ws_extensions cookie = get_cookies url.scheme = PROTOCOLS[url.scheme] headers['Cookie'] = cookie unless cookie == '' options = { :extensions => extensions, :headers => headers, :proxy => @proxy, :tls => {:sni_hostname => url.hostname} } socket = Faye::WebSocket::Client.new(url.to_s, [], options) socket.onopen = lambda do |*args| store_cookies(socket.headers['Set-Cookie']) @socket = socket @state = CONNECTED @ever_connected = true ping set_deferred_status(:succeeded, socket) end closed = false socket.onclose = socket.onerror = lambda do |*args| next if closed closed = true was_connected = (@state == CONNECTED) socket.onopen = socket.onclose = socket.onerror = socket.onmessage = nil @socket = nil @state = UNCONNECTED remove_timeout(:ping) pending = @pending ? @pending.to_a : [] @pending = nil if was_connected or @ever_connected set_deferred_status(:unknown) handle_error(pending, was_connected) else set_deferred_status(:failed) end end socket.onmessage = lambda do |event| replies = MultiJson.load(event.data) rescue nil next if replies.nil? replies = [replies].flatten replies.each do |reply| next unless reply.has_key?('successful') next unless message = @pending.find { |m| m['id'] == reply['id'] } @pending.delete(message) end receive(replies) end end def close return unless @socket @socket.close end private def ping return unless @socket and @socket.ready_state == 1 @socket.send('[]') add_timeout(:ping, @dispatcher.timeout / 2) { ping } end end Transport.register 'websocket', Transport::WebSocket end faye-1.2.4/lib/faye/transport/local.rb0000644000175000017500000000067413425045757020370 0ustar utkarsh2102utkarsh2102module Faye class Transport::Local < Transport def self.usable?(dispatcher, endpoint, &callback) callback.call(Server === endpoint) end def batching? false end def request(messages) EventMachine.next_tick do @endpoint.process(messages, nil) do |replies| receive(Faye.copy_object(replies)) end end end end Transport.register 'in-process', Transport::Local end faye-1.2.4/lib/faye/transport/http.rb0000644000175000017500000000375113425045757020254 0ustar utkarsh2102utkarsh2102module Faye class Transport::Http < Transport def self.usable?(dispatcher, endpoint, &callback) callback.call(URI === endpoint) end def encode(messages) Faye.to_json(messages) end def request(messages) content = encode(messages) params = build_params(content) request = create_request(params) request.callback do handle_response(messages, request.response) store_cookies(request.response_header['SET_COOKIE']) end request.errback do handle_error(messages) end request end private def build_params(content) params = { :head => { 'Content-Length' => content.bytesize, 'Content-Type' => 'application/json', 'Host' => @endpoint.host + (@endpoint.port ? ":#{@endpoint.port}" : '') }.merge(@dispatcher.headers), :body => content, :timeout => -1 # for em-http-request < 1.0 } cookie = get_cookies params[:head]['Cookie'] = cookie unless cookie == '' params end def create_request(params) version = EventMachine::HttpRequest::VERSION.split('.')[0].to_i options = { :inactivity_timeout => 0, :tls => {:sni_hostname => @endpoint.hostname} } if @proxy[:origin] uri = URI(@proxy[:origin]) options[:proxy] = {:host => uri.host, :port => uri.port} if uri.user options[:proxy][:authorization] = [uri.user, uri.password] end end if version >= 1 client = EventMachine::HttpRequest.new(@endpoint.to_s, options) else client = EventMachine::HttpRequest.new(@endpoint.to_s) end client.post(params) end def handle_response(messages, response) replies = MultiJson.load(response) rescue nil if replies receive(replies) else handle_error(messages) end end end Transport.register 'long-polling', Transport::Http end faye-1.2.4/lib/faye/error.rb0000644000175000017500000000257013425045757016370 0ustar utkarsh2102utkarsh2102module Faye class Error def self.method_missing(type, *args) code = const_get(type.to_s.upcase) new(code[0], args, code[1]).to_s end def self.parse(message) message ||= '' return new(nil, [], message) unless Grammar::ERROR =~ message parts = message.split(':') code = parts[0].to_i params = parts[1].split(',') message = parts[2] new(code, params, message) end attr_reader :code, :params, :message def initialize(code, params, message) @code = code @params = params @message = message end def to_s "#{ @code }:#{ @params * ',' }:#{ @message }" end # http://code.google.com/p/cometd/wiki/BayeuxCodes VERSION_MISMATCH = [300, 'Version mismatch'] CONNTYPE_MISMATCH = [301, 'Connection types not supported'] EXT_MISMATCH = [302, 'Extension mismatch'] BAD_REQUEST = [400, 'Bad request'] CLIENT_UNKNOWN = [401, 'Unknown client'] PARAMETER_MISSING = [402, 'Missing required parameter'] CHANNEL_FORBIDDEN = [403, 'Forbidden channel'] CHANNEL_UNKNOWN = [404, 'Unknown channel'] CHANNEL_INVALID = [405, 'Invalid channel'] EXT_UNKNOWN = [406, 'Unknown extension'] PUBLISH_FAILED = [407, 'Failed to publish'] SERVER_ERROR = [500, 'Internal server error'] end end faye-1.2.4/lib/faye/engines/0000755000175000017500000000000013425045757016336 5ustar utkarsh2102utkarsh2102faye-1.2.4/lib/faye/engines/memory.rb0000644000175000017500000000667313425045757020207 0ustar utkarsh2102utkarsh2102module Faye module Engine class Memory include Timeouts def self.create(server, options) new(server, options) end def initialize(server, options) @server = server @options = options reset end def disconnect reset remove_all_timeouts end def reset @namespace = Namespace.new @clients = {} @channels = {} @messages = {} end def create_client(&callback) client_id = @namespace.generate @server.debug('Created new client ?', client_id) ping(client_id) @server.trigger(:handshake, client_id) callback.call(client_id) end def destroy_client(client_id, &callback) return unless @namespace.exists?(client_id) if @clients.has_key?(client_id) @clients[client_id].each { |channel| unsubscribe(client_id, channel) } end remove_timeout(client_id) @namespace.release(client_id) @messages.delete(client_id) @server.debug('Destroyed client ?', client_id) @server.trigger(:disconnect, client_id) @server.trigger(:close, client_id) callback.call if callback end def client_exists(client_id, &callback) callback.call(@namespace.exists?(client_id)) end def ping(client_id) timeout = @server.timeout return unless Numeric === timeout @server.debug('Ping ?, ?', client_id, timeout) remove_timeout(client_id) add_timeout(client_id, 2 * timeout) { destroy_client(client_id) } end def subscribe(client_id, channel, &callback) @clients[client_id] ||= Set.new should_trigger = @clients[client_id].add?(channel) @channels[channel] ||= Set.new @channels[channel].add(client_id) @server.debug('Subscribed client ? to channel ?', client_id, channel) @server.trigger(:subscribe, client_id, channel) if should_trigger callback.call(true) if callback end def unsubscribe(client_id, channel, &callback) if @clients.has_key?(client_id) should_trigger = @clients[client_id].delete?(channel) @clients.delete(client_id) if @clients[client_id].empty? end if @channels.has_key?(channel) @channels[channel].delete(client_id) @channels.delete(channel) if @channels[channel].empty? end @server.debug('Unsubscribed client ? from channel ?', client_id, channel) @server.trigger(:unsubscribe, client_id, channel) if should_trigger callback.call(true) if callback end def publish(message, channels) @server.debug('Publishing message ?', message) clients = Set.new channels.each do |channel| next unless subs = @channels[channel] subs.each(&clients.method(:add)) end clients.each do |client_id| @server.debug('Queueing for client ?: ?', client_id, message) @messages[client_id] ||= [] @messages[client_id] << Faye.copy_object(message) empty_queue(client_id) end @server.trigger(:publish, message['clientId'], message['channel'], message['data']) end def empty_queue(client_id) return unless @server.has_connection?(client_id) @server.deliver(client_id, @messages[client_id]) @messages.delete(client_id) end end end end faye-1.2.4/lib/faye/engines/proxy.rb0000644000175000017500000000667413425045757020061 0ustar utkarsh2102utkarsh2102module Faye module Engine METHODS = %w[create_client client_exists destroy_client ping subscribe unsubscribe] MAX_DELAY = 0.0 INTERVAL = 0.0 TIMEOUT = 60.0 ID_LENGTH = 160 autoload :Connection, File.expand_path('../connection', __FILE__) autoload :Memory, File.expand_path('../memory', __FILE__) def self.ensure_reactor_running! Thread.new { EventMachine.run } unless EventMachine.reactor_running? Thread.pass until EventMachine.reactor_running? end def self.get(options) Proxy.new(options) end def self.random(bitlength = ID_LENGTH) limit = 2 ** bitlength max_size = (bitlength * Math.log(2) / Math.log(36)).ceil string = SecureRandom.random_number(limit).to_s(36) string = '0' + string while string.size < max_size string end class Proxy include Publisher include Logging attr_reader :interval, :timeout extend Forwardable def_delegators :@engine, *METHODS def initialize(options) super() @options = options @connections = {} @interval = @options[:interval] || INTERVAL @timeout = @options[:timeout] || TIMEOUT engine_class = @options[:type] || Memory @engine = engine_class.create(self, @options) bind :close do |client_id| EventMachine.next_tick { flush_connection(client_id) } end debug('Created new engine: ?', @options) end def connect(client_id, options = {}, &callback) debug('Accepting connection from ?', client_id) @engine.ping(client_id) conn = connection(client_id, true) conn.connect(options, &callback) @engine.empty_queue(client_id) end def has_connection?(client_id) @connections.has_key?(client_id) end def connection(client_id, create) conn = @connections[client_id] return conn if conn or not create @connections[client_id] = Connection.new(self, client_id) trigger('connection:open', client_id) @connections[client_id] end def close_connection(client_id) debug('Closing connection for ?', client_id) return unless conn = @connections[client_id] conn.socket.close if conn.socket trigger('connection:close', client_id) @connections.delete(client_id) end def open_socket(client_id, socket) conn = connection(client_id, true) conn.socket = socket end def deliver(client_id, messages) return if !messages || messages.empty? return false unless conn = connection(client_id, false) messages.each(&conn.method(:deliver)) true end def generate_id Engine.random end def flush_connection(client_id, close = true) return unless client_id debug('Flushing connection for ?', client_id) return unless conn = connection(client_id, false) conn.socket = nil unless close conn.flush close_connection(client_id) end def close @connections.keys.each { |client_id| flush_connection(client_id) } @engine.disconnect end def disconnect @engine.disconnect if @engine.respond_to?(:disconnect) end def publish(message) channels = Channel.expand(message['channel']) @engine.publish(message, channels) end end end end faye-1.2.4/lib/faye/engines/connection.rb0000644000175000017500000000237613425045757021032 0ustar utkarsh2102utkarsh2102module Faye module Engine class Connection include Deferrable include Timeouts attr_accessor :socket def initialize(engine, id, options = {}) @engine = engine @id = id @options = options @inbox = Set.new end def deliver(message) message.delete('clientId') return @socket.send(message) if @socket return unless @inbox.add?(message) begin_delivery_timeout end def connect(options, &block) options = options || {} timeout = options['timeout'] ? options['timeout'] / 1000.0 : @engine.timeout set_deferred_status(:unknown) callback(&block) begin_delivery_timeout begin_connection_timeout(timeout) end def flush remove_timeout(:connection) remove_timeout(:delivery) set_deferred_status(:succeeded, @inbox.entries) @inbox = [] @engine.close_connection(@id) unless @socket end private def begin_delivery_timeout return if @inbox.empty? add_timeout(:delivery, MAX_DELAY) { flush } end def begin_connection_timeout(timeout) add_timeout(:connection, timeout) { flush } end end end end faye-1.2.4/CHANGELOG.md0000644000175000017500000004210613425045757015030 0ustar utkarsh2102utkarsh2102### 1.2.4 / 2017-01-28 * Fix `RackAdapter#get_client` that was failing due to a URI error * Define `Promise#catch` in a safe way for old browsers * Log errors in the Node HTTP transport ### 1.2.3 / 2016-10-11 * Return an error if the `data` field is missing on published messages * Fix errors that occur in the new `websocket` util when the browser does not support WebSocket ### 1.2.2 / 2016-07-18 * Mitigate the HTTPoxy vulnerability: https://httpoxy.org/ ### 1.2.1 / 2016-06-29 * Fix a missing variable error in `NodeAdapter` ### 1.2.0 / 2016-06-26 * Add `client.subscribe().withChannel()` to yield the message channel for wildcard subscriptions * Restructure the JavaScript codebase around Node modules (require/exports) rather than globals * Update the Promise shim to reflect the standard API, including `catch()` and `all()` * Support connecting to servers that use SNI in the Ruby client * Make the JavaScript client work inside React Native and Web Workers * Remove JSON2; you should import a JSON shim yourself if necessary * Handle errors that occur when a message is partially delivered via EventSource * Reject requests with invalid (non-array or -object) top-level JSON values * Make local client requests asynchronous to avoid re-entrant request handling errors * Remove `Connection: Close` from HTTP responses to allow use of keep-alive * Use `XMLHttpRequest` in preference to the ActiveX API in IE10 * Fix bug where flushing large message batches puts promises in an invalid state ### 1.1.2 / 2015-07-19 * Allow the `Authorization` header to be used on CORS requests * Disallow unused methods like PUT and DELETE on CORS requests * Stop IE prematurely garbage-collecting `XDomainRequest` objects * Make sure messages can be sent if they overflow the request size limit and the outbox is empty * Don't send messages over WebSockets unless they are in the 'open' ready-state * Fix a bug preventing use of the in-process transport in Ruby ### 1.1.1 / 2015-02-25 * Make sure the client ID associated with a WebSocket is not dropped, so the socket can be closed properly * Handle cases where a JSON-P endpoint returns no response argument * Stop trying to retry messages after the client has been disconnected * Remove duplication of the client ID in EventSource URLs ### 1.1.0 / 2014-12-22 * Allow the server and client to use WebSocket extensions, for example permessage-deflate * Support the `HTTP_PROXY` and `HTTPS_PROXY` environment variables to send all client connections through an HTTP proxy * Introduce the `Scheduler` API to allow the user to control message retries * Add the `attempts` and `deadline` options to `Client#publish()` * Let `RackAdapter` take a block that yields the instance, so extensions can be added to middleware * Allow monitoring listeners to see the `clientId` on publishd messages but still avoid sending it to subscribers * Return a promise from `Client#disconnect()` * Fix client-side retry bugs causing the client to flood the server with duplicate messages * Send all transport types in the `supportedConnectionTypes` handshake parameter * Don't close WebSockets when the client recovers from an error and sends a new `clientId` * Replace `cookiejar` with `tough-cookie` to avoid global variable leaks ### 1.0.3 / 2014-07-08 * Make some changes to JSON-P responses to mitigate the Rosetta Flash attack * http://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/ ### 1.0.2 -- removed due to error while publishing ### 1.0.1 / 2013-12-10 * Add `Adapter#close()` method for gracefully shutting down the server * Fix error recover bug in WebSocket that made transport cycle through `up`/`down` state * Update Promise implementation to pass `promises-aplus-tests 2.0` * Correct some incorrect variable names in the Ruby transports * Make logging methods public to fix a problem on Ruby 2.1 ### 1.0.0 / 2013-10-01 * Client changes: * Allow clients to be instantiated with URI objects rather than strings * Add a `ca` option to the Node `Client` class for passing in trusted server certificates * Objects supporting the `callback()` method in JavaScript are now Promises * Fix protocol-relative URI parsing in the client * Remove the `getClientId()` and `getState()` methods from the `Client` class * Transport changes: * Add request-size limiting to all batching transports * Make the WebSocket transport more robust against quiet network periods and clients going to sleep * Support cookies across all transports when using the client on Node.js or Ruby * Support custom headers in the `cross-origin-long-polling` and server-side `websocket` transports * Adapter changes: * Support the `rack.hijack` streaming API * Migrate to MultiJson for JSON handling on Ruby, allowing use of JRuby * Escape U+2028 and U+2029 in JSON-P output * Fix a bug stopping requests being routed when the mount point is `/` * Fix various bugs that cause errors to be thrown if we try to send a message over a closed socket * Remove the `listen()` method from `Adapter` in favour of using server-specific APIs * Server changes: * Use cryptographically secure random number generators to create client IDs * Allow extensions to access request properties by using 3-ary methods * Objects supporting the `bind()` method now implement the full `EventEmitter` API * Stop the server from forwarding the `clientId` property of published messages * Miscellaneous: * Support Browserify by returning the client module * `Faye.logger` can now be a logger object rather than a function ### 0.8.9 / 2013-02-26 * Specify ciphers for SSL on Node to mitigate the BEAST attack * Mitigate increased risk of socket hang-up errors in Node v0.8.20 * Fix race condition when processing outgoing extensions in the Node server * Fix problem loading the client script when using `{mount: '/'}` * Clean up connection objects when a WebSocket is re-used with a new clientId * All JavaScript code now runs in strict mode * Select transport on handshake, instead of on client creation to allow time for `disable()` calls * Do not speculatively open WebSocket/EventSource connections if they are disabled * Gracefully handle WebSocket messages with no data on the client side * Close and reconnect WebSocket when onerror is fired, not just when onclose is fired * Fix problem with caching of EventSource connections with stale clientIds * Don't parse query strings when checking if a URL is same-origin or not ### 0.8.8 / 2013-01-10 * Patch security hole allowing remote execution of arbitrary Server methods ### 0.8.7 -- removed due to error while publishing ### 0.8.6 / 2012-10-07 * Make sure messages pushed to the client over a socket pass through outgoing extensions ### 0.8.5 / 2012-09-30 * Fix a bug in `URI.parse()` that caused Faye endpoints to inherit search and hash from `window.location` ### 0.8.4 / 2012-09-29 * Optimise upgrade process so that WebSocket is tested earlier and the connection is cached * Check that EventSource actually works to work around broken Opera implementation * Emit `connection:open` and `connection:close` events from the Engine proxy * Increase size of client IDs from 128 to 160 bits * Fix bug with relative URL resolution in IE * Limit the JSON-P transport's message buffer so it doesn't create over-long URLs * Send `Pragma: no-cache` with XHR requests to guard against iOS 6 POST caching * Add `charset=utf-8` to response Content-Type headers ### 0.8.3 / 2012-07-15 * `Client#subscribe` returns an array of Subscriptions if given an array of channels * Allow different endpoints to be specified per-transport * Only use IE's `XDomainRequest` for same-protocol requests * Replace URL parser with one that treats relative URLs the same as the browser * Improve logging of malformed requests and detect problems earlier * Make sure socket connections are closed when a client session is timed out * Stop WebSocket reconnecting after `window.onbeforeunload` ### 0.8.2 / 2012-04-12 * Fix replacement of `null` with `{}` in `copyObject()` * Make EventSource transport trigger `transport:up/down` events * Supply source map for minified JavaScript client, and include source in gem * Return `Content-Length: 0` for 304 responses * Handle pre-flight CORS requests from old versions of Safari ### 0.8.1 / 2012-03-15 * Make `Publisher#trigger` safe for event listeners that modify the listener list * Make `Server#subscribe` return a response if the incoming message has an error * Fix edge case in code that identifies the `clientId` of socket connections * Return `Content-Length` headers for HTTP responses * Don't send empty lists of messages from the WebSocket transport * Stop client sending multiple `/meta/subscribe` messages for subscriptions made before handshaking * Stop client treating incoming published messages as responses to `/meta/*` messages ### 0.8.0 / 2012-02-26 * Extract the Redis engine into a separate library, `faye-redis` * Stabilize and document the Engine API so others can write backends * Extract WebSocket and EventSource tools into a separate library, `faye-websocket` * Improve use of WebSocket so messages are immediately pushed rather than polling * Introduce new EventSource-based transport, for proxies that block WebSocket * Support the Rainbows and Goliath web servers for Ruby, same as `faye-websocket` * Improve detection of network errors and switch to fixed-interval for reconnecting * Add `setHeader()` method to Client (e.g. for connecting to Salesforce API) * Add `timeout()` method to `Faye.Deferrable` to match `EventMachine::Deferrable` * Fix some bugs in client-side message handlers created with `subscribe()` * Improve speed and memory consumption of `copyObject()` * Switch from JSON to Yajl for JSON parsing in Ruby ### 0.7.1 / 2011-12-22 * Extension `added()` and `removed()` methods now receive the extended object * Detection of WebSockets in RackAdapter is more strict ### 0.7.0 / 2011-11-22 * Provide an event API for monitoring engine events on the server side * Implement server-side WebSocket connections for improved latency * Fix WebSocket protocol bugs and expose APIs for developers to use * Make server-side HTTP transports support SSL and cookies * Allow clients to disable selected transports and autodisconnection * Add callback/errback API to `Client#publish()` interface * Add `socket` setting for the Redis engine for connecting through a Unix socket ### 0.6.7 / 2011-10-20 * Cache client script in memory and add `ETag` and `Last-Modified` headers * Fix bug in Node Redis engine where `undefined` was used if no namespace given * Flush Redis message queues using a transaction to avoid re-delivery of messages * Fix race condition and timing errors present in Redis locking code * Use `Cache-Control: no-cache, no-store` on JSON-P responses * Improvements to the CORS and JSON-P transports * Prevent retry handlers in transports from being invoked multiple times * Use the current page protocol by default when parsing relative URIs ### 0.6.6 / 2011-09-12 * Add `:key` and `:cert` options to the `Adapter#listen` methods for setting up SSL * Fix error detection of CORS transport in IE9 running IE8 compatibility mode * Fix dependency versions so that Rubygems lets Faye install ### 0.6.5 / 2011-08-29 * Fix UTF-8 encoding bugs in draft-75/76 and protocol-8 WebSocket parsers * Switch to streaming parser for WebSocket protocol-8 * Remove an `SREM` operation that shouldn't have been in the Redis engine * Move `thin_extensions.rb` so it's not on the Rubygems load path ### 0.6.4 / 2011-08-18 * Support WebSocket protocol used by Chrome 14 and Firefox 6 * Fix handling of multibyte characters in WebSocket messages on Node * Improve message routing in Node memory engine to avoid false duplicates ### 0.6.3 / 2011-07-10 * Use sequential message IDs to reduce memory usage on the client side * Only send advice with handshake and connect responses * Stop trying to publish `/meta/*` messages - no-one is listening and it breaks `/**` * Fix bug causing invalid listeners to appear after a client reconnection * Stop loading `rubygems` within our library code * Make sure we only queue a message for each client once in the Redis engine * Use lists instead of sets for message queues in Redis * Improve clean-up of expired clients in Redis engine ### 0.6.2 / 2011-06-19 * Add authentication, database selection and namespacing to Redis engine * Clean up all client data when removing clients from Redis * Fix `cross-origin-long-polling` for `OPTIONS`-aware browsers * Update secure WebSocket detection for recent Node versions * Reinstate `faye.client` field in Rack environment ### 0.6.1 / 2011-06-06 * Fix `cross-origin-long-polling` support in `RackAdapter` * Plug some potential memory leaks in `Memory` engine ### 0.6.0 / 2011-05-21 * Extract core logic into the `Engine` class to support swappable backends * Introduce a Redis-backed engine to support clustered web front-ends * Use CORS for `cross-domain long-polling` * Make server more resilient against bad requests, including empty message lists * Perform subscription validation on the server and use errbacks to signal errors * Prohibit publishing to wildcard channels * Unsubscribing from a channel is now O(1) instead of O(N) * Much more thorough and consistent unit test coverage of both versions * Automatic integration tests using Terminus and TestSwarm ### 0.5.5 / 2011-01-16 * Open a real socket to check for WebSocket usability, not just object detection * Catch server-side errors when handshaking with WebSockets ### 0.5.4 / 2010-12-19 * Add a `#callback` method to `Subscriptions` to detect when they become active * Add `:extensions` option to `RackAdapter` to make it easier to extend middleware * Detect secure WebSocket requests through the `HTTP_X_FORWARDED_PROTO` header * Handle socket errors when sending WebSocket messages from `NodeAdapter` * Use exponential backoff to reconnect client-side WebSockets to reduce CPU load ### 0.5.3 / 2010-10-21 * Improve detection of `wss:` requirement for secure WebSocket connections * Correctly use default ports (80,443) for server-side HTTP connections * Support legacy `application/x-www-form-urlencoded` POST requests * Delete unused Channel objects that have all their subscribers removed * Fix resend/reconnect logic in WebSocket transport * Keep client script in memory rather than reading it from disk every time * Prevent error-adding extensions from breaking the core protocol ### 0.5.2 / 2010-08-12 * Support draft-76 of the WebSocket protocol (FF4, Chrome 6) * Reduce `Connection::MAX_DELAY` to improve latency ### 0.5.1 / 2010-07-21 * Fix a publishing problem in Ruby `LocalTransport` ### 0.5.0 / 2010-07-17 * Handle multiple event listeners bound to a channel * Add extension system for adding domain-specific logic to the protocol * Improve handling of client reconnections if the server goes down * Change default polling interval to 0 (immediate reconnect) * Add support for WebSockets (draft75 only) as a network transport * Remove support for Ruby servers other than Thin * Make client and server compatible with CometD (1.x and 2.0) components * Improve clean-up of unused server-side connections * Change Node API for adding Faye service to an HTTP server ### 0.3.4 / 2010-06-20 * Stop local clients going into an infinite loop if a subscription block causes a reconnect ### 0.3.3 / 2010-06-07 * Bring Node APIs up to date with 0.1.97 * Catch `ECONNREFUSED` errors in Node clients to withstand server outages * Refactor the `Server` internals ### 0.3.2 / 2010-04-04 * Fix problems with JSON serialization when Prototype, MooTools present * Make the client reconnect if it doesn't hear from the server after a timeout * Stop JavaScript server returning `NaN` for `advice.interval` * Make Ruby server return an integer for `advice.interval` * Ensure EventMachine is running before handling messages * Handle `data` and `end` events properly in Node HTTP API * Switch to `application/json` for content types and stop using querystring format in POST bodies * Respond to any URL path under the mount point, not just the exact match ### 0.3.1 / 2010-03-09 * Pass client down through Rack stack as `env['faye.client']` * Refactor some JavaScript internals to mirror Ruby codebase ### 0.3.0 / 2010-03-01 * Add server-side clients for Node.js and Ruby environments * Clients support both HTTP and in-process transports * Fix ID generation in JavaScript version to 128-bit IDs * Fix bug in interpretation of `**` channel wildcard * Users don't have to call `#connect()` on clients any more * Fix timeout race conditions that were killing active connections * Support new Node APIs from 0.1.29. ### 0.2.2 / 2010-02-10 * Kick out requests with malformed JSON as 400s ### 0.2.1 / 2010-02-04 * Fix server-side flushing of callback-polling connections * Backend can be used cross-domain if running on Node or Thin ### 0.2.0 / 2010-02-02 * Port server to JavaScript with an adapter for Node.js * Support Thin's async responses in the Ruby version for complete non-blocking * Fix some minor client-side bugs in transport choice ### 0.1.1 / 2009-07-26 * Fix a broken client build ### 0.1.0 / 2009-06-15 * Ruby Bayeux server and Rack adapter * Internally evented using EventMachine, web frontend blocks * JavaScript client with `long-polling` and `callback-polling` faye-1.2.4/README.md0000644000175000017500000000300713425045757014473 0ustar utkarsh2102utkarsh2102# Faye Faye is a set of tools for simple publish-subscribe messaging between web clients. It ships with easy-to-use message routing servers for Node.js and Rack applications, and clients that can be used on the server and in the browser. * Documentation: http://faye.jcoglan.com * Mailing list: http://groups.google.com/group/faye-users * Bug tracker: http://github.com/faye/faye/issues * Source code: http://github.com/faye/faye ## License (The MIT License) Copyright (c) 2009-2017 James Coglan and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. faye-1.2.4/build/0000755000175000017500000000000013425045757014313 5ustar utkarsh2102utkarsh2102faye-1.2.4/build/client/0000755000175000017500000000000013425045757015571 5ustar utkarsh2102utkarsh2102faye-1.2.4/build/client/faye-browser-min.js0000644000175000017500000011177513425045757021331 0ustar utkarsh2102utkarsh2102var Faye=function(t){function e(i){if(n[i])return n[i].exports;var s=n[i]={exports:{},id:i,loaded:!1};return t[i].call(s.exports,s,s.exports,e),s.loaded=!0,s.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";var i=n(1),s=n(2),r={VERSION:i.VERSION,Client:n(4),Scheduler:n(32)};s.wrapper=r,t.exports=r},function(t){t.exports={VERSION:"1.2.4",BAYEUX_VERSION:"1.0",ID_LENGTH:160,JSONP_CALLBACK:"jsonpcallback",CONNECTION_TYPES:["long-polling","cross-origin-long-polling","callback-polling","websocket","eventsource","in-process"],MANDATORY_CONNECTION_TYPES:["long-polling","callback-polling","in-process"]}},function(t,e,n){"use strict";var i=n(3),s={LOG_LEVELS:{fatal:4,error:3,warn:2,info:1,debug:0},writeLog:function(t,e){var n=s.logger||(s.wrapper||s).logger;if(n){var r=Array.prototype.slice.apply(t),o="[Faye",c=this.className,a=r.shift().replace(/\?/g,function(){try{return i(r.shift())}catch(t){return"[Object]"}});c&&(o+="."+c),o+="] ","function"==typeof n[e]?n[e](o+a):"function"==typeof n&&n(o+a)}}};for(var r in s.LOG_LEVELS)(function(t){s[t]=function(){this.writeLog(arguments,t)}})(r);t.exports=s},function(t){"use strict";t.exports=function(t){return JSON.stringify(t,function(t,e){return this[t]instanceof Array?this[t]:e})}},function(t,e,n){(function(e){"use strict";var i=n(5),s=n(7),r=(n(9),n(10)),o=n(11),c=n(12),a=n(1),h=n(8),u=n(13),l=n(14),f=n(2),d=n(15),p=n(17),_=n(19),v=n(33),g=n(34),m=n(35),y=n(36),E=s({className:"Client",UNCONNECTED:1,CONNECTING:2,CONNECTED:3,DISCONNECTED:4,HANDSHAKE:"handshake",RETRY:"retry",NONE:"none",CONNECTION_TIMEOUT:60,DEFAULT_ENDPOINT:"/bayeux",INTERVAL:0,initialize:function(t,n){this.info("New client created for ?",t),n=n||{},u(n,["interval","timeout","endpoints","proxy","retry","scheduler","websocketExtensions","tls","ca"]),this._channels=new p.Set,this._dispatcher=_.create(this,t||this.DEFAULT_ENDPOINT,n),this._messageId=0,this._state=this.UNCONNECTED,this._responseCallbacks={},this._advice={reconnect:this.RETRY,interval:1e3*(n.interval||this.INTERVAL),timeout:1e3*(n.timeout||this.CONNECTION_TIMEOUT)},this._dispatcher.timeout=this._advice.timeout/1e3,this._dispatcher.bind("message",this._receiveMessage,this),c.Event&&void 0!==e.onbeforeunload&&c.Event.on(e,"beforeunload",function(){o.indexOf(this._dispatcher._disabled,"autodisconnect")<0&&this.disconnect()},this)},addWebsocketExtension:function(t){return this._dispatcher.addWebsocketExtension(t)},disable:function(t){return this._dispatcher.disable(t)},setHeader:function(t,e){return this._dispatcher.setHeader(t,e)},handshake:function(t,n){if(this._advice.reconnect!==this.NONE&&this._state===this.UNCONNECTED){this._state=this.CONNECTING;var s=this;this.info("Initiating handshake with ?",r.stringify(this._dispatcher.endpoint)),this._dispatcher.selectTransport(a.MANDATORY_CONNECTION_TYPES),this._sendMessage({channel:p.HANDSHAKE,version:a.BAYEUX_VERSION,supportedConnectionTypes:this._dispatcher.getConnectionTypes()},{},function(r){r.successful?(this._state=this.CONNECTED,this._dispatcher.clientId=r.clientId,this._dispatcher.selectTransport(r.supportedConnectionTypes),this.info("Handshake successful: ?",this._dispatcher.clientId),this.subscribe(this._channels.getKeys(),!0),t&&i(function(){t.call(n)})):(this.info("Handshake unsuccessful"),e.setTimeout(function(){s.handshake(t,n)},1e3*this._dispatcher.retry),this._state=this.UNCONNECTED)},this)}},connect:function(t,e){if(this._advice.reconnect!==this.NONE&&this._state!==this.DISCONNECTED){if(this._state===this.UNCONNECTED)return this.handshake(function(){this.connect(t,e)},this);this.callback(t,e),this._state===this.CONNECTED&&(this.info("Calling deferred actions for ?",this._dispatcher.clientId),this.setDeferredStatus("succeeded"),this.setDeferredStatus("unknown"),this._connectRequest||(this._connectRequest=!0,this.info("Initiating connection for ?",this._dispatcher.clientId),this._sendMessage({channel:p.CONNECT,clientId:this._dispatcher.clientId,connectionType:this._dispatcher.connectionType},{},this._cycleConnection,this)))}},disconnect:function(){if(this._state===this.CONNECTED){this._state=this.DISCONNECTED,this.info("Disconnecting ?",this._dispatcher.clientId);var t=new m;return this._sendMessage({channel:p.DISCONNECT,clientId:this._dispatcher.clientId},{},function(e){e.successful?(this._dispatcher.close(),t.setDeferredStatus("succeeded")):t.setDeferredStatus("failed",v.parse(e.error))},this),this.info("Clearing channel listeners for ?",this._dispatcher.clientId),this._channels=new p.Set,t}},subscribe:function(t,e,n){if(t instanceof Array)return o.map(t,function(t){return this.subscribe(t,e,n)},this);var i=new y(this,t,e,n),s=e===!0,r=this._channels.hasSubscription(t);return r&&!s?(this._channels.subscribe([t],i),i.setDeferredStatus("succeeded"),i):(this.connect(function(){this.info("Client ? attempting to subscribe to ?",this._dispatcher.clientId,t),s||this._channels.subscribe([t],i),this._sendMessage({channel:p.SUBSCRIBE,clientId:this._dispatcher.clientId,subscription:t},{},function(e){if(!e.successful)return i.setDeferredStatus("failed",v.parse(e.error)),this._channels.unsubscribe(t,i);var n=[].concat(e.subscription);this.info("Subscription acknowledged for ? to ?",this._dispatcher.clientId,n),i.setDeferredStatus("succeeded")},this)},this),i)},unsubscribe:function(t,e){if(t instanceof Array)return o.map(t,function(t){return this.unsubscribe(t,e)},this);var n=this._channels.unsubscribe(t,e);n&&this.connect(function(){this.info("Client ? attempting to unsubscribe from ?",this._dispatcher.clientId,t),this._sendMessage({channel:p.UNSUBSCRIBE,clientId:this._dispatcher.clientId,subscription:t},{},function(t){if(t.successful){var e=[].concat(t.subscription);this.info("Unsubscription acknowledged for ? from ?",this._dispatcher.clientId,e)}},this)},this)},publish:function(t,e,n){u(n||{},["attempts","deadline"]);var i=new m;return this.connect(function(){this.info("Client ? queueing published message to ?: ?",this._dispatcher.clientId,t,e),this._sendMessage({channel:t,data:e,clientId:this._dispatcher.clientId},n,function(t){t.successful?i.setDeferredStatus("succeeded"):i.setDeferredStatus("failed",v.parse(t.error))},this)},this),i},_sendMessage:function(t,e,n,i){t.id=this._generateMessageId();var s=this._advice.timeout?1.2*this._advice.timeout/1e3:1.2*this._dispatcher.retry;this.pipeThroughExtensions("outgoing",t,null,function(t){t&&(n&&(this._responseCallbacks[t.id]=[n,i]),this._dispatcher.sendMessage(t,s,e||{}))},this)},_generateMessageId:function(){return this._messageId+=1,this._messageId>=Math.pow(2,32)&&(this._messageId=0),this._messageId.toString(36)},_receiveMessage:function(t){var e,n=t.id;void 0!==t.successful&&(e=this._responseCallbacks[n],delete this._responseCallbacks[n]),this.pipeThroughExtensions("incoming",t,null,function(t){t&&(t.advice&&this._handleAdvice(t.advice),this._deliverMessage(t),e&&e[0].call(e[1],t))},this)},_handleAdvice:function(t){h(this._advice,t),this._dispatcher.timeout=this._advice.timeout/1e3,this._advice.reconnect===this.HANDSHAKE&&this._state!==this.DISCONNECTED&&(this._state=this.UNCONNECTED,this._dispatcher.clientId=null,this._cycleConnection())},_deliverMessage:function(t){t.channel&&void 0!==t.data&&(this.info("Client ? calling listeners for ? with ?",this._dispatcher.clientId,t.channel,t.data),this._channels.distributeMessage(t))},_cycleConnection:function(){this._connectRequest&&(this._connectRequest=null,this.info("Closed connection for ?",this._dispatcher.clientId));var t=this;e.setTimeout(function(){t.connect()},this._advice.interval)}});h(E.prototype,l),h(E.prototype,d),h(E.prototype,f),h(E.prototype,g),t.exports=E}).call(e,function(){return this}())},function(t,e,n){"use strict";function i(){if(a.length)throw a.shift()}function s(t){var e;e=c.length?c.pop():new r,e.task=t,o(e)}function r(){this.task=null}var o=n(6),c=[],a=[],h=o.makeRequestCallFromTimer(i);t.exports=s,r.prototype.call=function(){try{this.task.call()}catch(t){s.onerror?s.onerror(t):(a.push(t),h())}finally{this.task=null,c[c.length]=this}}},function(t,e){(function(e){"use strict";function n(t){c.length||(o(),a=!0),c[c.length]=t}function i(){for(;hu){for(var e=0,n=c.length-h;n>e;e++)c[e]=c[e+h];c.length-=h,h=0}}c.length=0,h=0,a=!1}function s(t){var e=1,n=new f(t),i=document.createTextNode("");return n.observe(i,{characterData:!0}),function(){e=-e,i.data=e}}function r(t){return function(){function e(){clearTimeout(n),clearInterval(i),t()}var n=setTimeout(e,0),i=setInterval(e,50)}}t.exports=n;var o,c=[],a=!1,h=0,u=1024,l="undefined"!=typeof e?e:self,f=l.MutationObserver||l.WebKitMutationObserver;o="function"==typeof f?s(i):r(i),n.requestFlush=o,n.makeRequestCallFromTimer=r}).call(e,function(){return this}())},function(t,e,n){"use strict";var i=n(8);t.exports=function(t,e){"function"!=typeof t&&(e=t,t=Object);var n=function(){return this.initialize?this.initialize.apply(this,arguments)||this:this},s=function(){};return s.prototype=t.prototype,n.prototype=new s,i(n.prototype,e),n}},function(t){"use strict";t.exports=function(t,e,n){if(!e)return t;for(var i in e)e.hasOwnProperty(i)&&(t.hasOwnProperty(i)&&n===!1||t[i]!==e[i]&&(t[i]=e[i]));return t}},function(t,e,n){"use strict";var i=n(5),s=0,r=1,o=2,c=function(t){return t},a=function(t){throw t},h=function(t){if(this._state=s,this._onFulfilled=[],this._onRejected=[],"function"==typeof t){var e=this;t(function(t){p(e,t)},function(t){v(e,t)})}};h.prototype.then=function(t,e){var n=new h;return u(this,t,n),l(this,e,n),n},h.prototype["catch"]=function(t){return this.then(null,t)};var u=function(t,e,n){"function"!=typeof e&&(e=c);var i=function(t){f(e,t,n)};t._state===s?t._onFulfilled.push(i):t._state===r&&i(t._value)},l=function(t,e,n){"function"!=typeof e&&(e=a);var i=function(t){f(e,t,n)};t._state===s?t._onRejected.push(i):t._state===o&&i(t._reason)},f=function(t,e,n){i(function(){d(t,e,n)})},d=function(t,e,n){var i;try{i=t(e)}catch(s){return v(n,s)}i===n?v(n,new TypeError("Recursive promise chain detected")):p(n,i)},p=function(t,e){var n,i,s=!1;try{if(n=typeof e,i=null!==e&&("function"===n||"object"===n)&&e.then,"function"!=typeof i)return _(t,e);i.call(e,function(e){s^(s=!0)&&p(t,e)},function(e){s^(s=!0)&&v(t,e)})}catch(r){if(!(s^(s=!0)))return;v(t,r)}},_=function(t,e){if(t._state===s){t._state=r,t._value=e,t._onRejected=[];for(var n,i=t._onFulfilled;n=i.shift();)n(e)}},v=function(t,e){if(t._state===s){t._state=o,t._reason=e,t._onFulfilled=[];for(var n,i=t._onRejected;n=i.shift();)n(e)}};h.resolve=function(t){return new h(function(e){e(t)})},h.reject=function(t){return new h(function(e,n){n(t)})},h.all=function(t){return new h(function(e,n){var i,s=[],r=t.length;if(0===r)return e(s);for(i=0;r>i;i++)(function(t,i){h.resolve(t).then(function(t){s[i]=t,0===--r&&e(s)},n)})(t[i],i)})},h.race=function(t){return new h(function(e,n){for(var i=0,s=t.length;s>i;i++)h.resolve(t[i]).then(e,n)})},h.deferred=h.pending=function(){var t={};return t.promise=new h(function(e,n){t.resolve=e,t.reject=n}),t},t.exports=h},function(t){"use strict";t.exports={isURI:function(t){return t&&t.protocol&&t.host&&t.path},isSameOrigin:function(t){return t.protocol===location.protocol&&t.hostname===location.hostname&&t.port===location.port},parse:function(t){if("string"!=typeof t)return t;var e,n,i,s,r,o,c={},a=function(e,n){t=t.replace(n,function(t){return c[e]=t,""}),c[e]=c[e]||""};for(a("protocol",/^[a-z]+\:/i),a("host",/^\/\/[^\/\?#]+/),/^\//.test(t)||c.host||(t=location.pathname.replace(/[^\/]*$/,"")+t),a("pathname",/^[^\?#]*/),a("search",/^\?[^#]*/),a("hash",/^#.*/),c.protocol=c.protocol||location.protocol,c.host?(c.host=c.host.substr(2),e=c.host.split(":"),c.hostname=e[0],c.port=e[1]||""):(c.host=location.host,c.hostname=location.hostname,c.port=location.port),c.pathname=c.pathname||"/",c.path=c.pathname+c.search,n=c.search.replace(/^\?/,""),i=n?n.split("&"):[],o={},s=0,r=i.length;r>s;s++)e=i[s].split("="),o[decodeURIComponent(e[0]||"")]=decodeURIComponent(e[1]||"");return c.query=o,c.href=this.stringify(c),c},stringify:function(t){var e=t.protocol+"//"+t.hostname;return t.port&&(e+=":"+t.port),e+=t.pathname+this.queryString(t.query)+(t.hash||"")},queryString:function(t){var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return 0===e.length?"":"?"+e.join("&")}}},function(t){"use strict";t.exports={commonElement:function(t,e){for(var n=0,i=t.length;i>n;n++)if(-1!==this.indexOf(e,t[n]))return t[n];return null},indexOf:function(t,e){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;i>n;n++)if(t[n]===e)return n;return-1},map:function(t,e,n){if(t.map)return t.map(e,n);var i=[];if(t instanceof Array)for(var s=0,r=t.length;r>s;s++)i.push(e.call(n||null,t[s],s));else for(var o in t)t.hasOwnProperty(o)&&i.push(e.call(n||null,o,t[o]));return i},filter:function(t,e,n){if(t.filter)return t.filter(e,n);for(var i=[],s=0,r=t.length;r>s;s++)e.call(n||null,t[s],s)&&i.push(t[s]);return i},asyncEach:function(t,e,n,i){var s=t.length,r=-1,o=0,c=!1,a=function(){return o-=1,r+=1,r===s?n&&n.call(i):void e(t[r],u)},h=function(){if(!c){for(c=!0;o>0;)a();c=!1}},u=function(){o+=1,h()};u()}}},function(t,e){(function(e){"use strict";var n={_registry:[],on:function(t,e,n,i){var s=function(){n.call(i)};t.addEventListener?t.addEventListener(e,s,!1):t.attachEvent("on"+e,s),this._registry.push({_element:t,_type:e,_callback:n,_context:i,_handler:s})},detach:function(t,e,n,i){for(var s,r=this._registry.length;r--;)s=this._registry[r],t&&t!==s._element||e&&e!==s._type||n&&n!==s._callback||i&&i!==s._context||(s._element.removeEventListener?s._element.removeEventListener(s._type,s._handler,!1):s._element.detachEvent("on"+s._type,s._handler),this._registry.splice(r,1),s=null)}};void 0!==e.onunload&&n.on(e,"unload",n.detach,n),t.exports={Event:n}}).call(e,function(){return this}())},function(t,e,n){"use strict";var i=n(11);t.exports=function(t,e){for(var n in t)if(i.indexOf(e,n)<0)throw new Error("Unrecognized option: "+n)}},function(t,e,n){(function(e){"use strict";var i=n(9);t.exports={then:function(t,e){var n=this;return this._promise||(this._promise=new i(function(t,e){n._resolve=t,n._reject=e})),0===arguments.length?this._promise:this._promise.then(t,e)},callback:function(t,e){return this.then(function(n){t.call(e,n)})},errback:function(t,e){return this.then(null,function(n){t.call(e,n)})},timeout:function(t,n){this.then();var i=this;this._timer=e.setTimeout(function(){i._reject(n)},1e3*t)},setDeferredStatus:function(t,n){this._timer&&e.clearTimeout(this._timer),this.then(),"succeeded"===t?this._resolve(n):"failed"===t?this._reject(n):delete this._promise}}}).call(e,function(){return this}())},function(t,e,n){"use strict";var i=n(8),s=n(16),r={countListeners:function(t){return this.listeners(t).length},bind:function(t,e,n){var i=Array.prototype.slice,s=function(){e.apply(n,i.call(arguments))};return this._listeners=this._listeners||[],this._listeners.push([t,e,n,s]),this.on(t,s)},unbind:function(t,e,n){this._listeners=this._listeners||[];for(var i,s=this._listeners.length;s--;)i=this._listeners[s],i[0]===t&&(!e||i[1]===e&&i[2]===n)&&(this._listeners.splice(s,1),this.removeListener(t,i[3]))}};i(r,s.prototype),r.trigger=r.emit,t.exports=r},function(t){function e(t,e){if(t.indexOf)return t.indexOf(e);for(var n=0;nr;r++)s[r].apply(this,n);return!0}return!1},n.prototype.addListener=function(t,e){if("function"!=typeof e)throw new Error("addListener only takes instances of Function");return this._events||(this._events={}),this.emit("newListener",t,e),this._events[t]?i(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(t,e){var n=this;return n.on(t,function i(){n.removeListener(t,i),e.apply(this,arguments)}),this},n.prototype.removeListener=function(t,n){if("function"!=typeof n)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[t])return this;var s=this._events[t];if(i(s)){var r=e(s,n);if(0>r)return this;s.splice(r,1),0==s.length&&delete this._events[t]}else this._events[t]===n&&delete this._events[t];return this},n.prototype.removeAllListeners=function(t){return 0===arguments.length?(this._events={},this):(t&&this._events&&this._events[t]&&(this._events[t]=null),this)},n.prototype.listeners=function(t){return this._events||(this._events={}),this._events[t]||(this._events[t]=[]),i(this._events[t])||(this._events[t]=[this._events[t]]),this._events[t]}},function(t,e,n){"use strict";var i=n(7),s=n(8),r=n(15),o=n(18),c=i({initialize:function(t){this.id=this.name=t},push:function(t){this.trigger("message",t)},isUnused:function(){return 0===this.countListeners("message")}});s(c.prototype,r),s(c,{HANDSHAKE:"/meta/handshake",CONNECT:"/meta/connect",SUBSCRIBE:"/meta/subscribe",UNSUBSCRIBE:"/meta/unsubscribe",DISCONNECT:"/meta/disconnect",META:"meta",SERVICE:"service",expand:function(t){var e=this.parse(t),n=["/**",t],i=e.slice();i[i.length-1]="*",n.push(this.unparse(i));for(var s=1,r=e.length;r>s;s++)i=e.slice(0,s),i.push("**"),n.push(this.unparse(i));return n},isValid:function(t){return o.CHANNEL_NAME.test(t)||o.CHANNEL_PATTERN.test(t)},parse:function(t){return this.isValid(t)?t.split("/").slice(1):null},unparse:function(t){return"/"+t.join("/")},isMeta:function(t){var e=this.parse(t);return e?e[0]===this.META:null},isService:function(t){var e=this.parse(t);return e?e[0]===this.SERVICE:null},isSubscribable:function(t){return this.isValid(t)?!this.isMeta(t)&&!this.isService(t):null},Set:i({initialize:function(){this._channels={}},getKeys:function(){var t=[];for(var e in this._channels)t.push(e);return t},remove:function(t){delete this._channels[t]},hasSubscription:function(t){return this._channels.hasOwnProperty(t)},subscribe:function(t,e){for(var n,i=0,s=t.length;s>i;i++){n=t[i];var r=this._channels[n]=this._channels[n]||new c(n);r.bind("message",e)}},unsubscribe:function(t,e){var n=this._channels[t];return n?(n.unbind("message",e),n.isUnused()?(this.remove(t),!0):!1):!1},distributeMessage:function(t){for(var e=c.expand(t.channel),n=0,i=e.length;i>n;n++){var s=this._channels[e[n]];s&&s.trigger("message",t)}}})}),t.exports=c},function(t){"use strict";t.exports={CHANNEL_NAME:/^\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+(\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+)*$/,CHANNEL_PATTERN:/^(\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+)*\/\*{1,2}$/,ERROR:/^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*(,(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*)$/,VERSION:/^([0-9])+(\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\-|\_))*)*$/}},function(t,e,n){(function(e){"use strict";var i=n(7),s=n(10),r=n(20),o=n(8),c=n(2),a=n(15),h=n(21),u=n(32),l=i({className:"Dispatcher",MAX_REQUEST_SIZE:2048,DEFAULT_RETRY:5,UP:1,DOWN:2,initialize:function(t,e,n){this._client=t,this.endpoint=s.parse(e),this._alternates=n.endpoints||{},this.cookies=r.CookieJar&&new r.CookieJar,this._disabled=[],this._envelopes={},this.headers={},this.retry=n.retry||this.DEFAULT_RETRY,this._scheduler=n.scheduler||u,this._state=0,this.transports={},this.wsExtensions=[],this.proxy=n.proxy||{},"string"==typeof this._proxy&&(this._proxy={origin:this._proxy});var i=n.websocketExtensions;if(i){i=[].concat(i);for(var o=0,c=i.length;c>o;o++)this.addWebsocketExtension(i[o])}this.tls=n.tls||{},this.tls.ca=this.tls.ca||n.ca;for(var a in this._alternates)this._alternates[a]=s.parse(this._alternates[a]);this.maxRequestSize=this.MAX_REQUEST_SIZE},endpointFor:function(t){return this._alternates[t]||this.endpoint},addWebsocketExtension:function(t){this.wsExtensions.push(t)},disable:function(t){this._disabled.push(t)},setHeader:function(t,e){this.headers[t]=e},close:function(){var t=this._transport;delete this._transport,t&&t.close()},getConnectionTypes:function(){return h.getConnectionTypes()},selectTransport:function(t){h.get(this,t,this._disabled,function(t){this.debug("Selected ? transport for ?",t.connectionType,s.stringify(t.endpoint)),t!==this._transport&&(this._transport&&this._transport.close(),this._transport=t,this.connectionType=t.connectionType)},this)},sendMessage:function(t,e,n){n=n||{};var i,s=t.id,r=n.attempts,o=n.deadline&&(new Date).getTime()+1e3*n.deadline,c=this._envelopes[s];c||(i=new this._scheduler(t,{timeout:e,interval:this.retry,attempts:r,deadline:o}),c=this._envelopes[s]={message:t,scheduler:i}),this._sendEnvelope(c)},_sendEnvelope:function(t){if(this._transport&&!t.request&&!t.timer){var n=t.message,i=t.scheduler,s=this;if(!i.isDeliverable())return i.abort(),void delete this._envelopes[n.id];t.timer=e.setTimeout(function(){s.handleError(n)},1e3*i.getTimeout()),i.send(),t.request=this._transport.sendMessage(n)}},handleResponse:function(t){var n=this._envelopes[t.id];void 0!==t.successful&&n&&(n.scheduler.succeed(),delete this._envelopes[t.id],e.clearTimeout(n.timer)),this.trigger("message",t),this._state!==this.UP&&(this._state=this.UP,this._client.trigger("transport:up"))},handleError:function(t,n){var i=this._envelopes[t.id],s=i&&i.request,r=this;if(s){s.then(function(t){t&&t.abort&&t.abort()});var o=i.scheduler;o.fail(),e.clearTimeout(i.timer),i.request=i.timer=null,n?this._sendEnvelope(i):i.timer=e.setTimeout(function(){i.timer=null,r._sendEnvelope(i)},1e3*o.getInterval()),this._state!==this.DOWN&&(this._state=this.DOWN,this._client.trigger("transport:down"))}}});l.create=function(t,e,n){return new l(t,e,n)},o(l.prototype,a),o(l.prototype,c),t.exports=l}).call(e,function(){return this}())},function(t){"use strict";t.exports={}},function(t,e,n){"use strict";var i=n(22);i.register("websocket",n(24)),i.register("eventsource",n(28)),i.register("long-polling",n(29)),i.register("cross-origin-long-polling",n(30)),i.register("callback-polling",n(31)),t.exports=i},function(t,e,n){"use strict";var i=n(7),s=n(20).Cookie,r=n(9),o=n(10),c=n(11),a=n(8),h=n(2),u=n(23),l=n(17),f=a(i({className:"Transport",DEFAULT_PORTS:{"http:":80,"https:":443,"ws:":80,"wss:":443},MAX_DELAY:0,batching:!0,initialize:function(t,e){this._dispatcher=t,this.endpoint=e,this._outbox=[],this._proxy=a({},this._dispatcher.proxy),this._proxy.origin||(this._proxy.origin=this._findProxy())},close:function(){},encode:function(){return""},sendMessage:function(t){return this.debug("Client ? sending message to ?: ?",this._dispatcher.clientId,o.stringify(this.endpoint),t),this.batching?(this._outbox.push(t),this._flushLargeBatch(),t.channel===l.HANDSHAKE?this._publish(.01):(t.channel===l.CONNECT&&(this._connectMessage=t),this._publish(this.MAX_DELAY))):r.resolve(this.request([t]))},_makePromise:function(){var t=this;this._requestPromise=this._requestPromise||new r(function(e){t._resolvePromise=e})},_publish:function(t){return this._makePromise(),this.addTimeout("publish",t,function(){this._flush(),delete this._requestPromise},this),this._requestPromise},_flush:function(){this.removeTimeout("publish"),this._outbox.length>1&&this._connectMessage&&(this._connectMessage.advice={timeout:0}),this._resolvePromise(this.request(this._outbox)),this._connectMessage=null,this._outbox=[]},_flushLargeBatch:function(){var t=this.encode(this._outbox);if(!(t.lengthe;e++)this._dispatcher.handleResponse(t[e])}},_handleError:function(t){t=[].concat(t),this.debug("Client ? failed to send to ? via ?: ?",this._dispatcher.clientId,o.stringify(this.endpoint),this.connectionType,t);for(var e=0,n=t.length;n>e;e++)this._dispatcher.handleError(t[e])},_getCookies:function(){var t=this._dispatcher.cookies,e=o.stringify(this.endpoint);return t?c.map(t.getCookiesSync(e),function(t){return t.cookieString()}).join("; "):""},_storeCookies:function(t){var e,n=this._dispatcher.cookies,i=o.stringify(this.endpoint);if(t&&n){t=[].concat(t);for(var r=0,c=t.length;c>r;r++)e=s.parse(t[r]),n.setCookieSync(e,i)}},_findProxy:function(){if("undefined"==typeof process)return void 0;var t=this.endpoint.protocol;if(!t)return void 0;var e,n,i=t.replace(/:$/,"").toLowerCase()+"_proxy",s=i.toUpperCase(),r=process.env;return"http_proxy"===i&&r.REQUEST_METHOD?(e=Object.keys(r).filter(function(t){return/^http_proxy$/i.test(t)}),1===e.length?e[0]===i&&void 0===r[s]&&(n=r[i]):e.length>1&&(n=r[i]),n=n||r["CGI_"+s]):(n=r[i]||r[s],n&&!r[i]&&console.warn("The environment variable "+s+" is discouraged. Use "+i+".")),n}}),{get:function(t,e,n,i,s){var r=t.endpoint;c.asyncEach(this._transports,function(r,o){var a=r[0],h=r[1],u=t.endpointFor(a);return c.indexOf(n,a)>=0?o():c.indexOf(e,a)<0?(h.isUsable(t,u,function(){}),o()):void h.isUsable(t,u,function(e){if(!e)return o();var n=h.hasOwnProperty("create")?h.create(t,u):new h(t,u);i.call(s,n)})},function(){throw new Error("Could not find a usable connection type for "+o.stringify(r))})},register:function(t,e){this._transports.push([t,e]),e.prototype.connectionType=t},getConnectionTypes:function(){return c.map(this._transports,function(t){return t[0]})},_transports:[]});a(f.prototype,h),a(f.prototype,u),t.exports=f},function(t,e){(function(e){"use strict";t.exports={addTimeout:function(t,n,i,s){if(this._timeouts=this._timeouts||{},!this._timeouts.hasOwnProperty(t)){var r=this;this._timeouts[t]=e.setTimeout(function(){delete r._timeouts[t],i.call(s)},1e3*n)}},removeTimeout:function(t){this._timeouts=this._timeouts||{};var n=this._timeouts[t];n&&(e.clearTimeout(n),delete this._timeouts[t])},removeAllTimeouts:function(){this._timeouts=this._timeouts||{};for(var t in this._timeouts)this.removeTimeout(t)}}}).call(e,function(){return this}())},function(t,e,n){(function(e){"use strict";var i=n(7),s=n(9),r=n(25),o=n(10),c=n(12),a=n(26),h=n(8),u=n(3),l=n(27),f=n(14),d=n(22),p=h(i(d,{UNCONNECTED:1,CONNECTING:2,CONNECTED:3,batching:!1,isUsable:function(t,e){this.callback(function(){t.call(e,!0)}),this.errback(function(){t.call(e,!1)}),this.connect()},request:function(t){this._pending=this._pending||new r;for(var e=0,n=t.length;n>e;e++)this._pending.add(t[e]);var i=this,o=new s(function(e){i.callback(function(n){n&&1===n.readyState&&(n.send(u(t)),e(n))}),i.connect()});return{abort:function(){o.then(function(t){t.close()})}}},connect:function(){if(!p._unloaded&&(this._state=this._state||this.UNCONNECTED,this._state===this.UNCONNECTED)){this._state=this.CONNECTING;var t=this._createSocket();if(!t)return this.setDeferredStatus("failed");var e=this;t.onopen=function(){t.headers&&e._storeCookies(t.headers["set-cookie"]),e._socket=t,e._state=e.CONNECTED,e._everConnected=!0,e._ping(),e.setDeferredStatus("succeeded",t)};var n=!1;t.onclose=t.onerror=function(){if(!n){n=!0;var i=e._state===e.CONNECTED;t.onopen=t.onclose=t.onerror=t.onmessage=null,delete e._socket,e._state=e.UNCONNECTED,e.removeTimeout("ping");var s=e._pending?e._pending.toArray():[];delete e._pending,i||e._everConnected?(e.setDeferredStatus("unknown"),e._handleError(s,i)):e.setDeferredStatus("failed")}},t.onmessage=function(t){var n;try{n=JSON.parse(t.data)}catch(i){}if(n){n=[].concat(n);for(var s=0,r=n.length;r>s;s++)void 0!==n[s].successful&&e._pending.remove(n[s]);e._receive(n)}}}},close:function(){this._socket&&this._socket.close()},_createSocket:function(){var t=p.getSocketUrl(this.endpoint),e=this._dispatcher.headers,n=this._dispatcher.wsExtensions,i=this._getCookies(),s=this._dispatcher.tls,r={extensions:n,headers:e,proxy:this._proxy,tls:s};return""!==i&&(r.headers.Cookie=i),l.create(t,[],r)},_ping:function(){this._socket&&1===this._socket.readyState&&(this._socket.send("[]"),this.addTimeout("ping",this._dispatcher.timeout/2,this._ping,this))}}),{PROTOCOLS:{"http:":"ws:","https:":"wss:"},create:function(t,e){var n=t.transports.websocket=t.transports.websocket||{};return n[e.href]=n[e.href]||new this(t,e),n[e.href]},getSocketUrl:function(t){return t=a(t),t.protocol=this.PROTOCOLS[t.protocol],o.stringify(t)},isUsable:function(t,e,n,i){this.create(t,e).isUsable(n,i)}});h(p.prototype,f),c.Event&&void 0!==e.onbeforeunload&&c.Event.on(e,"beforeunload",function(){p._unloaded=!0}),t.exports=p}).call(e,function(){return this}())},function(t,e,n){"use strict";var i=n(7);t.exports=i({initialize:function(){this._index={}},add:function(t){var e=void 0!==t.id?t.id:t;return this._index.hasOwnProperty(e)?!1:(this._index[e]=t,!0)},forEach:function(t,e){for(var n in this._index)this._index.hasOwnProperty(n)&&t.call(e,this._index[n])},isEmpty:function(){for(var t in this._index)if(this._index.hasOwnProperty(t))return!1;return!0},member:function(t){for(var e in this._index)if(this._index[e]===t)return!0;return!1},remove:function(t){var e=void 0!==t.id?t.id:t,n=this._index[e];return delete this._index[e],n},toArray:function(){var t=[];return this.forEach(function(e){t.push(e)}),t}})},function(t){"use strict";var e=function(t){var n,i,s;if(t instanceof Array){for(n=[],i=t.length;i--;)n[i]=e(t[i]);return n}if("object"==typeof t){n=null===t?null:{};for(s in t)n[s]=e(t[s]);return n}return t};t.exports=e},function(t,e){(function(e){"use strict";var n=e.MozWebSocket||e.WebSocket;t.exports={create:function(t){return"function"!=typeof n?null:new n(t)}}}).call(e,function(){return this}())},function(t,e,n){(function(e){"use strict";var i=n(7),s=n(10),r=n(26),o=n(8),c=n(14),a=n(22),h=n(29),u=o(i(a,{initialize:function(t,n){if(a.prototype.initialize.call(this,t,n),!e.EventSource)return this.setDeferredStatus("failed");this._xhr=new h(t,n),n=r(n),n.pathname+="/"+t.clientId;var i=new e.EventSource(s.stringify(n)),o=this;i.onopen=function(){o._everConnected=!0,o.setDeferredStatus("succeeded")},i.onerror=function(){o._everConnected?o._handleError([]):(o.setDeferredStatus("failed"),i.close())},i.onmessage=function(t){var e;try{e=JSON.parse(t.data)}catch(n){}e?o._receive(e):o._handleError([])},this._socket=i},close:function(){this._socket&&(this._socket.onopen=this._socket.onerror=this._socket.onmessage=null,this._socket.close(),delete this._socket)},isUsable:function(t,e){this.callback(function(){t.call(e,!0)}),this.errback(function(){t.call(e,!1)})},encode:function(t){return this._xhr.encode(t)},request:function(t){return this._xhr.request(t)}}),{isUsable:function(t,e,n,i){var s=t.clientId;return s?void h.isUsable(t,e,function(s){return s?void this.create(t,e).isUsable(n,i):n.call(i,!1)},this):n.call(i,!1)},create:function(t,e){var n=t.transports.eventsource=t.transports.eventsource||{},i=t.clientId,o=r(e);return o.pathname+="/"+(i||""),o=s.stringify(o),n[o]=n[o]||new this(t,e),n[o]}});o(u.prototype,c),t.exports=u}).call(e,function(){return this}())},function(t,e,n){(function(e){"use strict";var i=n(7),s=n(10),r=n(12),o=n(8),c=n(3),a=n(22),h=o(i(a,{encode:function(t){return c(t)},request:function(t){var n,i=this.endpoint.href,s=this;if(e.XMLHttpRequest)n=new XMLHttpRequest; else{if(!e.ActiveXObject)return this._handleError(t);n=new ActiveXObject("Microsoft.XMLHTTP")}n.open("POST",i,!0),n.setRequestHeader("Content-Type","application/json"),n.setRequestHeader("Pragma","no-cache"),n.setRequestHeader("X-Requested-With","XMLHttpRequest");var o=this._dispatcher.headers;for(var c in o)o.hasOwnProperty(c)&&n.setRequestHeader(c,o[c]);var a=function(){n.abort()};return void 0!==e.onbeforeunload&&r.Event.on(e,"beforeunload",a),n.onreadystatechange=function(){if(n&&4===n.readyState){var i=null,o=n.status,c=n.responseText,h=o>=200&&300>o||304===o||1223===o;if(void 0!==e.onbeforeunload&&r.Event.detach(e,"beforeunload",a),n.onreadystatechange=function(){},n=null,!h)return s._handleError(t);try{i=JSON.parse(c)}catch(u){}i?s._receive(i):s._handleError(t)}},n.send(this.encode(t)),n}}),{isUsable:function(t,e,n,i){var r="ReactNative"===navigator.product||s.isSameOrigin(e);n.call(i,r)}});t.exports=h}).call(e,function(){return this}())},function(t,e,n){(function(e){"use strict";var i=n(7),s=n(25),r=n(10),o=n(8),c=n(3),a=n(22),h=o(i(a,{encode:function(t){return"message="+encodeURIComponent(c(t))},request:function(t){var n,i=e.XDomainRequest?XDomainRequest:XMLHttpRequest,s=new i,o=++h._id,c=this._dispatcher.headers,a=this;if(s.open("POST",r.stringify(this.endpoint),!0),s.setRequestHeader){s.setRequestHeader("Pragma","no-cache");for(n in c)c.hasOwnProperty(n)&&s.setRequestHeader(n,c[n])}var u=function(){return s?(h._pending.remove(o),s.onload=s.onerror=s.ontimeout=s.onprogress=null,void(s=null)):!1};return s.onload=function(){var e;try{e=JSON.parse(s.responseText)}catch(n){}u(),e?a._receive(e):a._handleError(t)},s.onerror=s.ontimeout=function(){u(),a._handleError(t)},s.onprogress=function(){},i===e.XDomainRequest&&h._pending.add({id:o,xhr:s}),s.send(this.encode(t)),s}}),{_id:0,_pending:new s,isUsable:function(t,n,i,s){if(r.isSameOrigin(n))return i.call(s,!1);if(e.XDomainRequest)return i.call(s,n.protocol===location.protocol);if(e.XMLHttpRequest){var o=new XMLHttpRequest;return i.call(s,void 0!==o.withCredentials)}return i.call(s,!1)}});t.exports=h}).call(e,function(){return this}())},function(t,e,n){(function(e){"use strict";var i=n(7),s=n(10),r=n(26),o=n(8),c=n(3),a=n(22),h=o(i(a,{encode:function(t){var e=r(this.endpoint);return e.query.message=c(t),e.query.jsonp="__jsonp"+h._cbCount+"__",s.stringify(e)},request:function(t){var n=document.getElementsByTagName("head")[0],i=document.createElement("script"),o=h.getCallbackName(),a=r(this.endpoint),u=this;a.query.message=c(t),a.query.jsonp=o;var l=function(){if(!e[o])return!1;e[o]=void 0;try{delete e[o]}catch(t){}i.parentNode.removeChild(i)};return e[o]=function(t){l(),u._receive(t)},i.type="text/javascript",i.src=s.stringify(a),n.appendChild(i),i.onerror=function(){l(),u._handleError(t)},{abort:l}}}),{_cbCount:0,getCallbackName:function(){return this._cbCount+=1,"__jsonp"+this._cbCount+"__"},isUsable:function(t,e,n,i){n.call(i,!0)}});t.exports=h}).call(e,function(){return this}())},function(t,e,n){"use strict";var i=n(8),s=function(t,e){this.message=t,this.options=e,this.attempts=0};i(s.prototype,{getTimeout:function(){return this.options.timeout},getInterval:function(){return this.options.interval},isDeliverable:function(){var t=this.options.attempts,e=this.attempts,n=this.options.deadline,i=(new Date).getTime();return void 0!==t&&e>=t?!1:void 0!==n&&i>n?!1:!0},send:function(){this.attempts+=1},succeed:function(){},fail:function(){},abort:function(){}}),t.exports=s},function(t,e,n){"use strict";var i=n(7),s=n(18),r=i({initialize:function(t,e,n){this.code=t,this.params=Array.prototype.slice.call(e),this.message=n},toString:function(){return this.code+":"+this.params.join(",")+":"+this.message}});r.parse=function(t){if(t=t||"",!s.ERROR.test(t))return new r(null,[],t);var e=t.split(":"),n=parseInt(e[0]),i=e[1].split(","),t=e[2];return new r(n,i,t)};var o={versionMismatch:[300,"Version mismatch"],conntypeMismatch:[301,"Connection types not supported"],extMismatch:[302,"Extension mismatch"],badRequest:[400,"Bad request"],clientUnknown:[401,"Unknown client"],parameterMissing:[402,"Missing required parameter"],channelForbidden:[403,"Forbidden channel"],channelUnknown:[404,"Unknown channel"],channelInvalid:[405,"Invalid channel"],extUnknown:[406,"Unknown extension"],publishFailed:[407,"Failed to publish"],serverError:[500,"Internal server error"]};for(var c in o)(function(t){r[t]=function(){return new r(o[t][0],arguments,o[t][1]).toString()}})(c);t.exports=r},function(t,e,n){"use strict";var i=n(8),s=n(2),r={addExtension:function(t){this._extensions=this._extensions||[],this._extensions.push(t),t.added&&t.added(this)},removeExtension:function(t){if(this._extensions)for(var e=this._extensions.length;e--;)this._extensions[e]===t&&(this._extensions.splice(e,1),t.removed&&t.removed(this))},pipeThroughExtensions:function(t,e,n,i,s){if(this.debug("Passing through ? extensions: ?",t,e),!this._extensions)return i.call(s,e);var r=this._extensions.slice(),o=function(e){if(!e)return i.call(s,e);var c=r.shift();if(!c)return i.call(s,e);var a=c[t];return a?void(a.length>=3?c[t](e,n,o):c[t](e,o)):o(e)};o(e)}};i(r,s),t.exports=r},function(t,e,n){"use strict";var i=n(7),s=n(14);t.exports=i(s)},function(t,e,n){"use strict";var i=n(7),s=n(8),r=n(14),o=i({initialize:function(t,e,n,i){this._client=t,this._channels=e,this._callback=n,this._context=i,this._cancelled=!1},withChannel:function(t,e){return this._withChannel=[t,e],this},apply:function(t,e){var n=e[0];this._callback&&this._callback.call(this._context,n.data),this._withChannel&&this._withChannel[0].call(this._withChannel[1],n.channel,n.data)},cancel:function(){this._cancelled||(this._client.unsubscribe(this._channels,this),this._cancelled=!0)},unsubscribe:function(){this.cancel()}});s(o.prototype,r),t.exports=o}]); //# sourceMappingURL=faye-browser-min.js.mapfaye-1.2.4/build/client/faye-browser.js0000644000175000017500000026037613425045757020552 0ustar utkarsh2102utkarsh2102var Faye = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var constants = __webpack_require__(1), Logging = __webpack_require__(2); var Faye = { VERSION: constants.VERSION, Client: __webpack_require__(4), Scheduler: __webpack_require__(32) }; Logging.wrapper = Faye; module.exports = Faye; /***/ }, /* 1 */ /***/ function(module, exports) { module.exports = { VERSION: '1.2.4', BAYEUX_VERSION: '1.0', ID_LENGTH: 160, JSONP_CALLBACK: 'jsonpcallback', CONNECTION_TYPES: ['long-polling', 'cross-origin-long-polling', 'callback-polling', 'websocket', 'eventsource', 'in-process'], MANDATORY_CONNECTION_TYPES: ['long-polling', 'callback-polling', 'in-process'] }; /***/ }, /* 2 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var toJSON = __webpack_require__(3); var Logging = { LOG_LEVELS: { fatal: 4, error: 3, warn: 2, info: 1, debug: 0 }, writeLog: function(messageArgs, level) { var logger = Logging.logger || (Logging.wrapper || Logging).logger; if (!logger) return; var args = Array.prototype.slice.apply(messageArgs), banner = '[Faye', klass = this.className, message = args.shift().replace(/\?/g, function() { try { return toJSON(args.shift()); } catch (error) { return '[Object]'; } }); if (klass) banner += '.' + klass; banner += '] '; if (typeof logger[level] === 'function') logger[level](banner + message); else if (typeof logger === 'function') logger(banner + message); } }; for (var key in Logging.LOG_LEVELS) (function(level) { Logging[level] = function() { this.writeLog(arguments, level); }; })(key); module.exports = Logging; /***/ }, /* 3 */ /***/ function(module, exports) { 'use strict'; // http://assanka.net/content/tech/2009/09/02/json2-js-vs-prototype/ module.exports = function(object) { return JSON.stringify(object, function(key, value) { return (this[key] instanceof Array) ? this[key] : value; }); }; /***/ }, /* 4 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var asap = __webpack_require__(5), Class = __webpack_require__(7), Promise = __webpack_require__(9), URI = __webpack_require__(10), array = __webpack_require__(11), browser = __webpack_require__(12), constants = __webpack_require__(1), extend = __webpack_require__(8), validateOptions = __webpack_require__(13), Deferrable = __webpack_require__(14), Logging = __webpack_require__(2), Publisher = __webpack_require__(15), Channel = __webpack_require__(17), Dispatcher = __webpack_require__(19), Error = __webpack_require__(33), Extensible = __webpack_require__(34), Publication = __webpack_require__(35), Subscription = __webpack_require__(36); var Client = Class({ className: 'Client', UNCONNECTED: 1, CONNECTING: 2, CONNECTED: 3, DISCONNECTED: 4, HANDSHAKE: 'handshake', RETRY: 'retry', NONE: 'none', CONNECTION_TIMEOUT: 60, DEFAULT_ENDPOINT: '/bayeux', INTERVAL: 0, initialize: function(endpoint, options) { this.info('New client created for ?', endpoint); options = options || {}; validateOptions(options, ['interval', 'timeout', 'endpoints', 'proxy', 'retry', 'scheduler', 'websocketExtensions', 'tls', 'ca']); this._channels = new Channel.Set(); this._dispatcher = Dispatcher.create(this, endpoint || this.DEFAULT_ENDPOINT, options); this._messageId = 0; this._state = this.UNCONNECTED; this._responseCallbacks = {}; this._advice = { reconnect: this.RETRY, interval: 1000 * (options.interval || this.INTERVAL), timeout: 1000 * (options.timeout || this.CONNECTION_TIMEOUT) }; this._dispatcher.timeout = this._advice.timeout / 1000; this._dispatcher.bind('message', this._receiveMessage, this); if (browser.Event && global.onbeforeunload !== undefined) browser.Event.on(global, 'beforeunload', function() { if (array.indexOf(this._dispatcher._disabled, 'autodisconnect') < 0) this.disconnect(); }, this); }, addWebsocketExtension: function(extension) { return this._dispatcher.addWebsocketExtension(extension); }, disable: function(feature) { return this._dispatcher.disable(feature); }, setHeader: function(name, value) { return this._dispatcher.setHeader(name, value); }, // Request // MUST include: * channel // * version // * supportedConnectionTypes // MAY include: * minimumVersion // * ext // * id // // Success Response Failed Response // MUST include: * channel MUST include: * channel // * version * successful // * supportedConnectionTypes * error // * clientId MAY include: * supportedConnectionTypes // * successful * advice // MAY include: * minimumVersion * version // * advice * minimumVersion // * ext * ext // * id * id // * authSuccessful handshake: function(callback, context) { if (this._advice.reconnect === this.NONE) return; if (this._state !== this.UNCONNECTED) return; this._state = this.CONNECTING; var self = this; this.info('Initiating handshake with ?', URI.stringify(this._dispatcher.endpoint)); this._dispatcher.selectTransport(constants.MANDATORY_CONNECTION_TYPES); this._sendMessage({ channel: Channel.HANDSHAKE, version: constants.BAYEUX_VERSION, supportedConnectionTypes: this._dispatcher.getConnectionTypes() }, {}, function(response) { if (response.successful) { this._state = this.CONNECTED; this._dispatcher.clientId = response.clientId; this._dispatcher.selectTransport(response.supportedConnectionTypes); this.info('Handshake successful: ?', this._dispatcher.clientId); this.subscribe(this._channels.getKeys(), true); if (callback) asap(function() { callback.call(context) }); } else { this.info('Handshake unsuccessful'); global.setTimeout(function() { self.handshake(callback, context) }, this._dispatcher.retry * 1000); this._state = this.UNCONNECTED; } }, this); }, // Request Response // MUST include: * channel MUST include: * channel // * clientId * successful // * connectionType * clientId // MAY include: * ext MAY include: * error // * id * advice // * ext // * id // * timestamp connect: function(callback, context) { if (this._advice.reconnect === this.NONE) return; if (this._state === this.DISCONNECTED) return; if (this._state === this.UNCONNECTED) return this.handshake(function() { this.connect(callback, context) }, this); this.callback(callback, context); if (this._state !== this.CONNECTED) return; this.info('Calling deferred actions for ?', this._dispatcher.clientId); this.setDeferredStatus('succeeded'); this.setDeferredStatus('unknown'); if (this._connectRequest) return; this._connectRequest = true; this.info('Initiating connection for ?', this._dispatcher.clientId); this._sendMessage({ channel: Channel.CONNECT, clientId: this._dispatcher.clientId, connectionType: this._dispatcher.connectionType }, {}, this._cycleConnection, this); }, // Request Response // MUST include: * channel MUST include: * channel // * clientId * successful // MAY include: * ext * clientId // * id MAY include: * error // * ext // * id disconnect: function() { if (this._state !== this.CONNECTED) return; this._state = this.DISCONNECTED; this.info('Disconnecting ?', this._dispatcher.clientId); var promise = new Publication(); this._sendMessage({ channel: Channel.DISCONNECT, clientId: this._dispatcher.clientId }, {}, function(response) { if (response.successful) { this._dispatcher.close(); promise.setDeferredStatus('succeeded'); } else { promise.setDeferredStatus('failed', Error.parse(response.error)); } }, this); this.info('Clearing channel listeners for ?', this._dispatcher.clientId); this._channels = new Channel.Set(); return promise; }, // Request Response // MUST include: * channel MUST include: * channel // * clientId * successful // * subscription * clientId // MAY include: * ext * subscription // * id MAY include: * error // * advice // * ext // * id // * timestamp subscribe: function(channel, callback, context) { if (channel instanceof Array) return array.map(channel, function(c) { return this.subscribe(c, callback, context); }, this); var subscription = new Subscription(this, channel, callback, context), force = (callback === true), hasSubscribe = this._channels.hasSubscription(channel); if (hasSubscribe && !force) { this._channels.subscribe([channel], subscription); subscription.setDeferredStatus('succeeded'); return subscription; } this.connect(function() { this.info('Client ? attempting to subscribe to ?', this._dispatcher.clientId, channel); if (!force) this._channels.subscribe([channel], subscription); this._sendMessage({ channel: Channel.SUBSCRIBE, clientId: this._dispatcher.clientId, subscription: channel }, {}, function(response) { if (!response.successful) { subscription.setDeferredStatus('failed', Error.parse(response.error)); return this._channels.unsubscribe(channel, subscription); } var channels = [].concat(response.subscription); this.info('Subscription acknowledged for ? to ?', this._dispatcher.clientId, channels); subscription.setDeferredStatus('succeeded'); }, this); }, this); return subscription; }, // Request Response // MUST include: * channel MUST include: * channel // * clientId * successful // * subscription * clientId // MAY include: * ext * subscription // * id MAY include: * error // * advice // * ext // * id // * timestamp unsubscribe: function(channel, subscription) { if (channel instanceof Array) return array.map(channel, function(c) { return this.unsubscribe(c, subscription); }, this); var dead = this._channels.unsubscribe(channel, subscription); if (!dead) return; this.connect(function() { this.info('Client ? attempting to unsubscribe from ?', this._dispatcher.clientId, channel); this._sendMessage({ channel: Channel.UNSUBSCRIBE, clientId: this._dispatcher.clientId, subscription: channel }, {}, function(response) { if (!response.successful) return; var channels = [].concat(response.subscription); this.info('Unsubscription acknowledged for ? from ?', this._dispatcher.clientId, channels); }, this); }, this); }, // Request Response // MUST include: * channel MUST include: * channel // * data * successful // MAY include: * clientId MAY include: * id // * id * error // * ext * ext publish: function(channel, data, options) { validateOptions(options || {}, ['attempts', 'deadline']); var publication = new Publication(); this.connect(function() { this.info('Client ? queueing published message to ?: ?', this._dispatcher.clientId, channel, data); this._sendMessage({ channel: channel, data: data, clientId: this._dispatcher.clientId }, options, function(response) { if (response.successful) publication.setDeferredStatus('succeeded'); else publication.setDeferredStatus('failed', Error.parse(response.error)); }, this); }, this); return publication; }, _sendMessage: function(message, options, callback, context) { message.id = this._generateMessageId(); var timeout = this._advice.timeout ? 1.2 * this._advice.timeout / 1000 : 1.2 * this._dispatcher.retry; this.pipeThroughExtensions('outgoing', message, null, function(message) { if (!message) return; if (callback) this._responseCallbacks[message.id] = [callback, context]; this._dispatcher.sendMessage(message, timeout, options || {}); }, this); }, _generateMessageId: function() { this._messageId += 1; if (this._messageId >= Math.pow(2,32)) this._messageId = 0; return this._messageId.toString(36); }, _receiveMessage: function(message) { var id = message.id, callback; if (message.successful !== undefined) { callback = this._responseCallbacks[id]; delete this._responseCallbacks[id]; } this.pipeThroughExtensions('incoming', message, null, function(message) { if (!message) return; if (message.advice) this._handleAdvice(message.advice); this._deliverMessage(message); if (callback) callback[0].call(callback[1], message); }, this); }, _handleAdvice: function(advice) { extend(this._advice, advice); this._dispatcher.timeout = this._advice.timeout / 1000; if (this._advice.reconnect === this.HANDSHAKE && this._state !== this.DISCONNECTED) { this._state = this.UNCONNECTED; this._dispatcher.clientId = null; this._cycleConnection(); } }, _deliverMessage: function(message) { if (!message.channel || message.data === undefined) return; this.info('Client ? calling listeners for ? with ?', this._dispatcher.clientId, message.channel, message.data); this._channels.distributeMessage(message); }, _cycleConnection: function() { if (this._connectRequest) { this._connectRequest = null; this.info('Closed connection for ?', this._dispatcher.clientId); } var self = this; global.setTimeout(function() { self.connect() }, this._advice.interval); } }); extend(Client.prototype, Deferrable); extend(Client.prototype, Publisher); extend(Client.prototype, Logging); extend(Client.prototype, Extensible); module.exports = Client; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 5 */ /***/ function(module, exports, __webpack_require__) { "use strict"; // rawAsap provides everything we need except exception management. var rawAsap = __webpack_require__(6); // RawTasks are recycled to reduce GC churn. var freeTasks = []; // We queue errors to ensure they are thrown in right order (FIFO). // Array-as-queue is good enough here, since we are just dealing with exceptions. var pendingErrors = []; var requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError); function throwFirstError() { if (pendingErrors.length) { throw pendingErrors.shift(); } } /** * Calls a task as soon as possible after returning, in its own event, with priority * over other events like animation, reflow, and repaint. An error thrown from an * event will not interrupt, nor even substantially slow down the processing of * other events, but will be rather postponed to a lower priority event. * @param {{call}} task A callable object, typically a function that takes no * arguments. */ module.exports = asap; function asap(task) { var rawTask; if (freeTasks.length) { rawTask = freeTasks.pop(); } else { rawTask = new RawTask(); } rawTask.task = task; rawAsap(rawTask); } // We wrap tasks with recyclable task objects. A task object implements // `call`, just like a function. function RawTask() { this.task = null; } // The sole purpose of wrapping the task is to catch the exception and recycle // the task object after its single use. RawTask.prototype.call = function () { try { this.task.call(); } catch (error) { if (asap.onerror) { // This hook exists purely for testing purposes. // Its name will be periodically randomized to break any code that // depends on its existence. asap.onerror(error); } else { // In a web browser, exceptions are not fatal. However, to avoid // slowing down the queue of pending tasks, we rethrow the error in a // lower priority turn. pendingErrors.push(error); requestErrorThrow(); } } finally { this.task = null; freeTasks[freeTasks.length] = this; } }; /***/ }, /* 6 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {"use strict"; // Use the fastest means possible to execute a task in its own turn, with // priority over other events including IO, animation, reflow, and redraw // events in browsers. // // An exception thrown by a task will permanently interrupt the processing of // subsequent tasks. The higher level `asap` function ensures that if an // exception is thrown by a task, that the task queue will continue flushing as // soon as possible, but if you use `rawAsap` directly, you are responsible to // either ensure that no exceptions are thrown from your task, or to manually // call `rawAsap.requestFlush` if an exception is thrown. module.exports = rawAsap; function rawAsap(task) { if (!queue.length) { requestFlush(); flushing = true; } // Equivalent to push, but avoids a function call. queue[queue.length] = task; } var queue = []; // Once a flush has been requested, no further calls to `requestFlush` are // necessary until the next `flush` completes. var flushing = false; // `requestFlush` is an implementation-specific method that attempts to kick // off a `flush` event as quickly as possible. `flush` will attempt to exhaust // the event queue before yielding to the browser's own event loop. var requestFlush; // The position of the next task to execute in the task queue. This is // preserved between calls to `flush` so that it can be resumed if // a task throws an exception. var index = 0; // If a task schedules additional tasks recursively, the task queue can grow // unbounded. To prevent memory exhaustion, the task queue will periodically // truncate already-completed tasks. var capacity = 1024; // The flush function processes all tasks that have been scheduled with // `rawAsap` unless and until one of those tasks throws an exception. // If a task throws an exception, `flush` ensures that its state will remain // consistent and will resume where it left off when called again. // However, `flush` does not make any arrangements to be called again if an // exception is thrown. function flush() { while (index < queue.length) { var currentIndex = index; // Advance the index before calling the task. This ensures that we will // begin flushing on the next task the task throws an error. index = index + 1; queue[currentIndex].call(); // Prevent leaking memory for long chains of recursive calls to `asap`. // If we call `asap` within tasks scheduled by `asap`, the queue will // grow, but to avoid an O(n) walk for every task we execute, we don't // shift tasks off the queue after they have been executed. // Instead, we periodically shift 1024 tasks off the queue. if (index > capacity) { // Manually shift all values starting at the index back to the // beginning of the queue. for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { queue[scan] = queue[scan + index]; } queue.length -= index; index = 0; } } queue.length = 0; index = 0; flushing = false; } // `requestFlush` is implemented using a strategy based on data collected from // every available SauceLabs Selenium web driver worker at time of writing. // https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593 // Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that // have WebKitMutationObserver but not un-prefixed MutationObserver. // Must use `global` or `self` instead of `window` to work in both frames and web // workers. `global` is a provision of Browserify, Mr, Mrs, or Mop. /* globals self */ var scope = typeof global !== "undefined" ? global : self; var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; // MutationObservers are desirable because they have high priority and work // reliably everywhere they are implemented. // They are implemented in all modern browsers. // // - Android 4-4.3 // - Chrome 26-34 // - Firefox 14-29 // - Internet Explorer 11 // - iPad Safari 6-7.1 // - iPhone Safari 7-7.1 // - Safari 6-7 if (typeof BrowserMutationObserver === "function") { requestFlush = makeRequestCallFromMutationObserver(flush); // MessageChannels are desirable because they give direct access to the HTML // task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera // 11-12, and in web workers in many engines. // Although message channels yield to any queued rendering and IO tasks, they // would be better than imposing the 4ms delay of timers. // However, they do not work reliably in Internet Explorer or Safari. // Internet Explorer 10 is the only browser that has setImmediate but does // not have MutationObservers. // Although setImmediate yields to the browser's renderer, it would be // preferrable to falling back to setTimeout since it does not have // the minimum 4ms penalty. // Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and // Desktop to a lesser extent) that renders both setImmediate and // MessageChannel useless for the purposes of ASAP. // https://github.com/kriskowal/q/issues/396 // Timers are implemented universally. // We fall back to timers in workers in most engines, and in foreground // contexts in the following browsers. // However, note that even this simple case requires nuances to operate in a // broad spectrum of browsers. // // - Firefox 3-13 // - Internet Explorer 6-9 // - iPad Safari 4.3 // - Lynx 2.8.7 } else { requestFlush = makeRequestCallFromTimer(flush); } // `requestFlush` requests that the high priority event queue be flushed as // soon as possible. // This is useful to prevent an error thrown in a task from stalling the event // queue if the exception handled by Node.js’s // `process.on("uncaughtException")` or by a domain. rawAsap.requestFlush = requestFlush; // To request a high priority event, we induce a mutation observer by toggling // the text of a text node between "1" and "-1". function makeRequestCallFromMutationObserver(callback) { var toggle = 1; var observer = new BrowserMutationObserver(callback); var node = document.createTextNode(""); observer.observe(node, {characterData: true}); return function requestCall() { toggle = -toggle; node.data = toggle; }; } // The message channel technique was discovered by Malte Ubl and was the // original foundation for this library. // http://www.nonblocking.io/2011/06/windownexttick.html // Safari 6.0.5 (at least) intermittently fails to create message ports on a // page's first load. Thankfully, this version of Safari supports // MutationObservers, so we don't need to fall back in that case. // function makeRequestCallFromMessageChannel(callback) { // var channel = new MessageChannel(); // channel.port1.onmessage = callback; // return function requestCall() { // channel.port2.postMessage(0); // }; // } // For reasons explained above, we are also unable to use `setImmediate` // under any circumstances. // Even if we were, there is another bug in Internet Explorer 10. // It is not sufficient to assign `setImmediate` to `requestFlush` because // `setImmediate` must be called *by name* and therefore must be wrapped in a // closure. // Never forget. // function makeRequestCallFromSetImmediate(callback) { // return function requestCall() { // setImmediate(callback); // }; // } // Safari 6.0 has a problem where timers will get lost while the user is // scrolling. This problem does not impact ASAP because Safari 6.0 supports // mutation observers, so that implementation is used instead. // However, if we ever elect to use timers in Safari, the prevalent work-around // is to add a scroll event listener that calls for a flush. // `setTimeout` does not call the passed callback if the delay is less than // approximately 7 in web workers in Firefox 8 through 18, and sometimes not // even then. function makeRequestCallFromTimer(callback) { return function requestCall() { // We dispatch a timeout with a specified delay of 0 for engines that // can reliably accommodate that request. This will usually be snapped // to a 4 milisecond delay, but once we're flushing, there's no delay // between events. var timeoutHandle = setTimeout(handleTimer, 0); // However, since this timer gets frequently dropped in Firefox // workers, we enlist an interval handle that will try to fire // an event 20 times per second until it succeeds. var intervalHandle = setInterval(handleTimer, 50); function handleTimer() { // Whichever timer succeeds will cancel both timers and // execute the callback. clearTimeout(timeoutHandle); clearInterval(intervalHandle); callback(); } }; } // This is for `asap.js` only. // Its name will be periodically randomized to break any code that depends on // its existence. rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; // ASAP was originally a nextTick shim included in Q. This was factored out // into this ASAP package. It was later adapted to RSVP which made further // amendments. These decisions, particularly to marginalize MessageChannel and // to capture the MutationObserver implementation in a closure, were integrated // back into ASAP proper. // https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 7 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var extend = __webpack_require__(8); module.exports = function(parent, methods) { if (typeof parent !== 'function') { methods = parent; parent = Object; } var klass = function() { if (!this.initialize) return this; return this.initialize.apply(this, arguments) || this; }; var bridge = function() {}; bridge.prototype = parent.prototype; klass.prototype = new bridge(); extend(klass.prototype, methods); return klass; }; /***/ }, /* 8 */ /***/ function(module, exports) { 'use strict'; module.exports = function(dest, source, overwrite) { if (!source) return dest; for (var key in source) { if (!source.hasOwnProperty(key)) continue; if (dest.hasOwnProperty(key) && overwrite === false) continue; if (dest[key] !== source[key]) dest[key] = source[key]; } return dest; }; /***/ }, /* 9 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var asap = __webpack_require__(5); var PENDING = 0, FULFILLED = 1, REJECTED = 2; var RETURN = function(x) { return x }, THROW = function(x) { throw x }; var Promise = function(task) { this._state = PENDING; this._onFulfilled = []; this._onRejected = []; if (typeof task !== 'function') return; var self = this; task(function(value) { resolve(self, value) }, function(reason) { reject(self, reason) }); }; Promise.prototype.then = function(onFulfilled, onRejected) { var next = new Promise(); registerOnFulfilled(this, onFulfilled, next); registerOnRejected(this, onRejected, next); return next; }; Promise.prototype['catch'] = function(onRejected) { return this.then(null, onRejected); }; var registerOnFulfilled = function(promise, onFulfilled, next) { if (typeof onFulfilled !== 'function') onFulfilled = RETURN; var handler = function(value) { invoke(onFulfilled, value, next) }; if (promise._state === PENDING) { promise._onFulfilled.push(handler); } else if (promise._state === FULFILLED) { handler(promise._value); } }; var registerOnRejected = function(promise, onRejected, next) { if (typeof onRejected !== 'function') onRejected = THROW; var handler = function(reason) { invoke(onRejected, reason, next) }; if (promise._state === PENDING) { promise._onRejected.push(handler); } else if (promise._state === REJECTED) { handler(promise._reason); } }; var invoke = function(fn, value, next) { asap(function() { _invoke(fn, value, next) }); }; var _invoke = function(fn, value, next) { var outcome; try { outcome = fn(value); } catch (error) { return reject(next, error); } if (outcome === next) { reject(next, new TypeError('Recursive promise chain detected')); } else { resolve(next, outcome); } }; var resolve = function(promise, value) { var called = false, type, then; try { type = typeof value; then = value !== null && (type === 'function' || type === 'object') && value.then; if (typeof then !== 'function') return fulfill(promise, value); then.call(value, function(v) { if (!(called ^ (called = true))) return; resolve(promise, v); }, function(r) { if (!(called ^ (called = true))) return; reject(promise, r); }); } catch (error) { if (!(called ^ (called = true))) return; reject(promise, error); } }; var fulfill = function(promise, value) { if (promise._state !== PENDING) return; promise._state = FULFILLED; promise._value = value; promise._onRejected = []; var onFulfilled = promise._onFulfilled, fn; while (fn = onFulfilled.shift()) fn(value); }; var reject = function(promise, reason) { if (promise._state !== PENDING) return; promise._state = REJECTED; promise._reason = reason; promise._onFulfilled = []; var onRejected = promise._onRejected, fn; while (fn = onRejected.shift()) fn(reason); }; Promise.resolve = function(value) { return new Promise(function(resolve, reject) { resolve(value) }); }; Promise.reject = function(reason) { return new Promise(function(resolve, reject) { reject(reason) }); }; Promise.all = function(promises) { return new Promise(function(resolve, reject) { var list = [], n = promises.length, i; if (n === 0) return resolve(list); for (i = 0; i < n; i++) (function(promise, i) { Promise.resolve(promise).then(function(value) { list[i] = value; if (--n === 0) resolve(list); }, reject); })(promises[i], i); }); }; Promise.race = function(promises) { return new Promise(function(resolve, reject) { for (var i = 0, n = promises.length; i < n; i++) Promise.resolve(promises[i]).then(resolve, reject); }); }; Promise.deferred = Promise.pending = function() { var tuple = {}; tuple.promise = new Promise(function(resolve, reject) { tuple.resolve = resolve; tuple.reject = reject; }); return tuple; }; module.exports = Promise; /***/ }, /* 10 */ /***/ function(module, exports) { 'use strict'; module.exports = { isURI: function(uri) { return uri && uri.protocol && uri.host && uri.path; }, isSameOrigin: function(uri) { return uri.protocol === location.protocol && uri.hostname === location.hostname && uri.port === location.port; }, parse: function(url) { if (typeof url !== 'string') return url; var uri = {}, parts, query, pairs, i, n, data; var consume = function(name, pattern) { url = url.replace(pattern, function(match) { uri[name] = match; return ''; }); uri[name] = uri[name] || ''; }; consume('protocol', /^[a-z]+\:/i); consume('host', /^\/\/[^\/\?#]+/); if (!/^\//.test(url) && !uri.host) url = location.pathname.replace(/[^\/]*$/, '') + url; consume('pathname', /^[^\?#]*/); consume('search', /^\?[^#]*/); consume('hash', /^#.*/); uri.protocol = uri.protocol || location.protocol; if (uri.host) { uri.host = uri.host.substr(2); parts = uri.host.split(':'); uri.hostname = parts[0]; uri.port = parts[1] || ''; } else { uri.host = location.host; uri.hostname = location.hostname; uri.port = location.port; } uri.pathname = uri.pathname || '/'; uri.path = uri.pathname + uri.search; query = uri.search.replace(/^\?/, ''); pairs = query ? query.split('&') : []; data = {}; for (i = 0, n = pairs.length; i < n; i++) { parts = pairs[i].split('='); data[decodeURIComponent(parts[0] || '')] = decodeURIComponent(parts[1] || ''); } uri.query = data; uri.href = this.stringify(uri); return uri; }, stringify: function(uri) { var string = uri.protocol + '//' + uri.hostname; if (uri.port) string += ':' + uri.port; string += uri.pathname + this.queryString(uri.query) + (uri.hash || ''); return string; }, queryString: function(query) { var pairs = []; for (var key in query) { if (!query.hasOwnProperty(key)) continue; pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(query[key])); } if (pairs.length === 0) return ''; return '?' + pairs.join('&'); } }; /***/ }, /* 11 */ /***/ function(module, exports) { 'use strict'; module.exports = { commonElement: function(lista, listb) { for (var i = 0, n = lista.length; i < n; i++) { if (this.indexOf(listb, lista[i]) !== -1) return lista[i]; } return null; }, indexOf: function(list, needle) { if (list.indexOf) return list.indexOf(needle); for (var i = 0, n = list.length; i < n; i++) { if (list[i] === needle) return i; } return -1; }, map: function(object, callback, context) { if (object.map) return object.map(callback, context); var result = []; if (object instanceof Array) { for (var i = 0, n = object.length; i < n; i++) { result.push(callback.call(context || null, object[i], i)); } } else { for (var key in object) { if (!object.hasOwnProperty(key)) continue; result.push(callback.call(context || null, key, object[key])); } } return result; }, filter: function(array, callback, context) { if (array.filter) return array.filter(callback, context); var result = []; for (var i = 0, n = array.length; i < n; i++) { if (callback.call(context || null, array[i], i)) result.push(array[i]); } return result; }, asyncEach: function(list, iterator, callback, context) { var n = list.length, i = -1, calls = 0, looping = false; var iterate = function() { calls -= 1; i += 1; if (i === n) return callback && callback.call(context); iterator(list[i], resume); }; var loop = function() { if (looping) return; looping = true; while (calls > 0) iterate(); looping = false; }; var resume = function() { calls += 1; loop(); }; resume(); } }; /***/ }, /* 12 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var Event = { _registry: [], on: function(element, eventName, callback, context) { var wrapped = function() { callback.call(context) }; if (element.addEventListener) element.addEventListener(eventName, wrapped, false); else element.attachEvent('on' + eventName, wrapped); this._registry.push({ _element: element, _type: eventName, _callback: callback, _context: context, _handler: wrapped }); }, detach: function(element, eventName, callback, context) { var i = this._registry.length, register; while (i--) { register = this._registry[i]; if ((element && element !== register._element) || (eventName && eventName !== register._type) || (callback && callback !== register._callback) || (context && context !== register._context)) continue; if (register._element.removeEventListener) register._element.removeEventListener(register._type, register._handler, false); else register._element.detachEvent('on' + register._type, register._handler); this._registry.splice(i,1); register = null; } } }; if (global.onunload !== undefined) Event.on(global, 'unload', Event.detach, Event); module.exports = { Event: Event }; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 13 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var array = __webpack_require__(11); module.exports = function(options, validKeys) { for (var key in options) { if (array.indexOf(validKeys, key) < 0) throw new Error('Unrecognized option: ' + key); } }; /***/ }, /* 14 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var Promise = __webpack_require__(9); module.exports = { then: function(callback, errback) { var self = this; if (!this._promise) this._promise = new Promise(function(resolve, reject) { self._resolve = resolve; self._reject = reject; }); if (arguments.length === 0) return this._promise; else return this._promise.then(callback, errback); }, callback: function(callback, context) { return this.then(function(value) { callback.call(context, value) }); }, errback: function(callback, context) { return this.then(null, function(reason) { callback.call(context, reason) }); }, timeout: function(seconds, message) { this.then(); var self = this; this._timer = global.setTimeout(function() { self._reject(message); }, seconds * 1000); }, setDeferredStatus: function(status, value) { if (this._timer) global.clearTimeout(this._timer); this.then(); if (status === 'succeeded') this._resolve(value); else if (status === 'failed') this._reject(value); else delete this._promise; } }; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 15 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var extend = __webpack_require__(8), EventEmitter = __webpack_require__(16); var Publisher = { countListeners: function(eventType) { return this.listeners(eventType).length; }, bind: function(eventType, listener, context) { var slice = Array.prototype.slice, handler = function() { listener.apply(context, slice.call(arguments)) }; this._listeners = this._listeners || []; this._listeners.push([eventType, listener, context, handler]); return this.on(eventType, handler); }, unbind: function(eventType, listener, context) { this._listeners = this._listeners || []; var n = this._listeners.length, tuple; while (n--) { tuple = this._listeners[n]; if (tuple[0] !== eventType) continue; if (listener && (tuple[1] !== listener || tuple[2] !== context)) continue; this._listeners.splice(n, 1); this.removeListener(eventType, tuple[3]); } } }; extend(Publisher, EventEmitter.prototype); Publisher.trigger = Publisher.emit; module.exports = Publisher; /***/ }, /* 16 */ /***/ function(module, exports) { /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var isArray = typeof Array.isArray === 'function' ? Array.isArray : function (xs) { return Object.prototype.toString.call(xs) === '[object Array]' } ; function indexOf (xs, x) { if (xs.indexOf) return xs.indexOf(x); for (var i = 0; i < xs.length; i++) { if (x === xs[i]) return i; } return -1; } function EventEmitter() {} module.exports = EventEmitter; EventEmitter.prototype.emit = function(type) { // If there is no 'error' event listener then throw. if (type === 'error') { if (!this._events || !this._events.error || (isArray(this._events.error) && !this._events.error.length)) { if (arguments[1] instanceof Error) { throw arguments[1]; // Unhandled 'error' event } else { throw new Error("Uncaught, unspecified 'error' event."); } return false; } } if (!this._events) return false; var handler = this._events[type]; if (!handler) return false; if (typeof handler == 'function') { switch (arguments.length) { // fast cases case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; // slower default: var args = Array.prototype.slice.call(arguments, 1); handler.apply(this, args); } return true; } else if (isArray(handler)) { var args = Array.prototype.slice.call(arguments, 1); var listeners = handler.slice(); for (var i = 0, l = listeners.length; i < l; i++) { listeners[i].apply(this, args); } return true; } else { return false; } }; // EventEmitter is defined in src/node_events.cc // EventEmitter.prototype.emit() is also defined there. EventEmitter.prototype.addListener = function(type, listener) { if ('function' !== typeof listener) { throw new Error('addListener only takes instances of Function'); } if (!this._events) this._events = {}; // To avoid recursion in the case that type == "newListeners"! Before // adding it to the listeners, first emit "newListeners". this.emit('newListener', type, listener); if (!this._events[type]) { // Optimize the case of one listener. Don't need the extra array object. this._events[type] = listener; } else if (isArray(this._events[type])) { // If we've already got an array, just append. this._events[type].push(listener); } else { // Adding the second element, need to change to array. this._events[type] = [this._events[type], listener]; } return this; }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.once = function(type, listener) { var self = this; self.on(type, function g() { self.removeListener(type, g); listener.apply(this, arguments); }); return this; }; EventEmitter.prototype.removeListener = function(type, listener) { if ('function' !== typeof listener) { throw new Error('removeListener only takes instances of Function'); } // does not use listeners(), so no side effect of creating _events[type] if (!this._events || !this._events[type]) return this; var list = this._events[type]; if (isArray(list)) { var i = indexOf(list, listener); if (i < 0) return this; list.splice(i, 1); if (list.length == 0) delete this._events[type]; } else if (this._events[type] === listener) { delete this._events[type]; } return this; }; EventEmitter.prototype.removeAllListeners = function(type) { if (arguments.length === 0) { this._events = {}; return this; } // does not use listeners(), so no side effect of creating _events[type] if (type && this._events && this._events[type]) this._events[type] = null; return this; }; EventEmitter.prototype.listeners = function(type) { if (!this._events) this._events = {}; if (!this._events[type]) this._events[type] = []; if (!isArray(this._events[type])) { this._events[type] = [this._events[type]]; } return this._events[type]; }; /***/ }, /* 17 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var Class = __webpack_require__(7), extend = __webpack_require__(8), Publisher = __webpack_require__(15), Grammar = __webpack_require__(18); var Channel = Class({ initialize: function(name) { this.id = this.name = name; }, push: function(message) { this.trigger('message', message); }, isUnused: function() { return this.countListeners('message') === 0; } }); extend(Channel.prototype, Publisher); extend(Channel, { HANDSHAKE: '/meta/handshake', CONNECT: '/meta/connect', SUBSCRIBE: '/meta/subscribe', UNSUBSCRIBE: '/meta/unsubscribe', DISCONNECT: '/meta/disconnect', META: 'meta', SERVICE: 'service', expand: function(name) { var segments = this.parse(name), channels = ['/**', name]; var copy = segments.slice(); copy[copy.length - 1] = '*'; channels.push(this.unparse(copy)); for (var i = 1, n = segments.length; i < n; i++) { copy = segments.slice(0, i); copy.push('**'); channels.push(this.unparse(copy)); } return channels; }, isValid: function(name) { return Grammar.CHANNEL_NAME.test(name) || Grammar.CHANNEL_PATTERN.test(name); }, parse: function(name) { if (!this.isValid(name)) return null; return name.split('/').slice(1); }, unparse: function(segments) { return '/' + segments.join('/'); }, isMeta: function(name) { var segments = this.parse(name); return segments ? (segments[0] === this.META) : null; }, isService: function(name) { var segments = this.parse(name); return segments ? (segments[0] === this.SERVICE) : null; }, isSubscribable: function(name) { if (!this.isValid(name)) return null; return !this.isMeta(name) && !this.isService(name); }, Set: Class({ initialize: function() { this._channels = {}; }, getKeys: function() { var keys = []; for (var key in this._channels) keys.push(key); return keys; }, remove: function(name) { delete this._channels[name]; }, hasSubscription: function(name) { return this._channels.hasOwnProperty(name); }, subscribe: function(names, subscription) { var name; for (var i = 0, n = names.length; i < n; i++) { name = names[i]; var channel = this._channels[name] = this._channels[name] || new Channel(name); channel.bind('message', subscription); } }, unsubscribe: function(name, subscription) { var channel = this._channels[name]; if (!channel) return false; channel.unbind('message', subscription); if (channel.isUnused()) { this.remove(name); return true; } else { return false; } }, distributeMessage: function(message) { var channels = Channel.expand(message.channel); for (var i = 0, n = channels.length; i < n; i++) { var channel = this._channels[channels[i]]; if (channel) channel.trigger('message', message); } } }) }); module.exports = Channel; /***/ }, /* 18 */ /***/ function(module, exports) { 'use strict'; module.exports = { CHANNEL_NAME: /^\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+(\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+)*$/, CHANNEL_PATTERN: /^(\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+)*\/\*{1,2}$/, ERROR: /^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*(,(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*)$/, VERSION: /^([0-9])+(\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\-|\_))*)*$/ }; /***/ }, /* 19 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var Class = __webpack_require__(7), URI = __webpack_require__(10), cookies = __webpack_require__(20), extend = __webpack_require__(8), Logging = __webpack_require__(2), Publisher = __webpack_require__(15), Transport = __webpack_require__(21), Scheduler = __webpack_require__(32); var Dispatcher = Class({ className: 'Dispatcher', MAX_REQUEST_SIZE: 2048, DEFAULT_RETRY: 5, UP: 1, DOWN: 2, initialize: function(client, endpoint, options) { this._client = client; this.endpoint = URI.parse(endpoint); this._alternates = options.endpoints || {}; this.cookies = cookies.CookieJar && new cookies.CookieJar(); this._disabled = []; this._envelopes = {}; this.headers = {}; this.retry = options.retry || this.DEFAULT_RETRY; this._scheduler = options.scheduler || Scheduler; this._state = 0; this.transports = {}; this.wsExtensions = []; this.proxy = options.proxy || {}; if (typeof this._proxy === 'string') this._proxy = {origin: this._proxy}; var exts = options.websocketExtensions; if (exts) { exts = [].concat(exts); for (var i = 0, n = exts.length; i < n; i++) this.addWebsocketExtension(exts[i]); } this.tls = options.tls || {}; this.tls.ca = this.tls.ca || options.ca; for (var type in this._alternates) this._alternates[type] = URI.parse(this._alternates[type]); this.maxRequestSize = this.MAX_REQUEST_SIZE; }, endpointFor: function(connectionType) { return this._alternates[connectionType] || this.endpoint; }, addWebsocketExtension: function(extension) { this.wsExtensions.push(extension); }, disable: function(feature) { this._disabled.push(feature); }, setHeader: function(name, value) { this.headers[name] = value; }, close: function() { var transport = this._transport; delete this._transport; if (transport) transport.close(); }, getConnectionTypes: function() { return Transport.getConnectionTypes(); }, selectTransport: function(transportTypes) { Transport.get(this, transportTypes, this._disabled, function(transport) { this.debug('Selected ? transport for ?', transport.connectionType, URI.stringify(transport.endpoint)); if (transport === this._transport) return; if (this._transport) this._transport.close(); this._transport = transport; this.connectionType = transport.connectionType; }, this); }, sendMessage: function(message, timeout, options) { options = options || {}; var id = message.id, attempts = options.attempts, deadline = options.deadline && new Date().getTime() + (options.deadline * 1000), envelope = this._envelopes[id], scheduler; if (!envelope) { scheduler = new this._scheduler(message, {timeout: timeout, interval: this.retry, attempts: attempts, deadline: deadline}); envelope = this._envelopes[id] = {message: message, scheduler: scheduler}; } this._sendEnvelope(envelope); }, _sendEnvelope: function(envelope) { if (!this._transport) return; if (envelope.request || envelope.timer) return; var message = envelope.message, scheduler = envelope.scheduler, self = this; if (!scheduler.isDeliverable()) { scheduler.abort(); delete this._envelopes[message.id]; return; } envelope.timer = global.setTimeout(function() { self.handleError(message); }, scheduler.getTimeout() * 1000); scheduler.send(); envelope.request = this._transport.sendMessage(message); }, handleResponse: function(reply) { var envelope = this._envelopes[reply.id]; if (reply.successful !== undefined && envelope) { envelope.scheduler.succeed(); delete this._envelopes[reply.id]; global.clearTimeout(envelope.timer); } this.trigger('message', reply); if (this._state === this.UP) return; this._state = this.UP; this._client.trigger('transport:up'); }, handleError: function(message, immediate) { var envelope = this._envelopes[message.id], request = envelope && envelope.request, self = this; if (!request) return; request.then(function(req) { if (req && req.abort) req.abort(); }); var scheduler = envelope.scheduler; scheduler.fail(); global.clearTimeout(envelope.timer); envelope.request = envelope.timer = null; if (immediate) { this._sendEnvelope(envelope); } else { envelope.timer = global.setTimeout(function() { envelope.timer = null; self._sendEnvelope(envelope); }, scheduler.getInterval() * 1000); } if (this._state === this.DOWN) return; this._state = this.DOWN; this._client.trigger('transport:down'); } }); Dispatcher.create = function(client, endpoint, options) { return new Dispatcher(client, endpoint, options); }; extend(Dispatcher.prototype, Publisher); extend(Dispatcher.prototype, Logging); module.exports = Dispatcher; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 20 */ /***/ function(module, exports) { 'use strict'; module.exports = {}; /***/ }, /* 21 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var Transport = __webpack_require__(22); Transport.register('websocket', __webpack_require__(24)); Transport.register('eventsource', __webpack_require__(28)); Transport.register('long-polling', __webpack_require__(29)); Transport.register('cross-origin-long-polling', __webpack_require__(30)); Transport.register('callback-polling', __webpack_require__(31)); module.exports = Transport; /***/ }, /* 22 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var Class = __webpack_require__(7), Cookie = __webpack_require__(20).Cookie, Promise = __webpack_require__(9), URI = __webpack_require__(10), array = __webpack_require__(11), extend = __webpack_require__(8), Logging = __webpack_require__(2), Timeouts = __webpack_require__(23), Channel = __webpack_require__(17); var Transport = extend(Class({ className: 'Transport', DEFAULT_PORTS: {'http:': 80, 'https:': 443, 'ws:': 80, 'wss:': 443}, MAX_DELAY: 0, batching: true, initialize: function(dispatcher, endpoint) { this._dispatcher = dispatcher; this.endpoint = endpoint; this._outbox = []; this._proxy = extend({}, this._dispatcher.proxy); if (!this._proxy.origin) this._proxy.origin = this._findProxy(); }, close: function() {}, encode: function(messages) { return ''; }, sendMessage: function(message) { this.debug('Client ? sending message to ?: ?', this._dispatcher.clientId, URI.stringify(this.endpoint), message); if (!this.batching) return Promise.resolve(this.request([message])); this._outbox.push(message); this._flushLargeBatch(); if (message.channel === Channel.HANDSHAKE) return this._publish(0.01); if (message.channel === Channel.CONNECT) this._connectMessage = message; return this._publish(this.MAX_DELAY); }, _makePromise: function() { var self = this; this._requestPromise = this._requestPromise || new Promise(function(resolve) { self._resolvePromise = resolve; }); }, _publish: function(delay) { this._makePromise(); this.addTimeout('publish', delay, function() { this._flush(); delete this._requestPromise; }, this); return this._requestPromise; }, _flush: function() { this.removeTimeout('publish'); if (this._outbox.length > 1 && this._connectMessage) this._connectMessage.advice = {timeout: 0}; this._resolvePromise(this.request(this._outbox)); this._connectMessage = null; this._outbox = []; }, _flushLargeBatch: function() { var string = this.encode(this._outbox); if (string.length < this._dispatcher.maxRequestSize) return; var last = this._outbox.pop(); this._makePromise(); this._flush(); if (last) this._outbox.push(last); }, _receive: function(replies) { if (!replies) return; replies = [].concat(replies); this.debug('Client ? received from ? via ?: ?', this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, replies); for (var i = 0, n = replies.length; i < n; i++) this._dispatcher.handleResponse(replies[i]); }, _handleError: function(messages, immediate) { messages = [].concat(messages); this.debug('Client ? failed to send to ? via ?: ?', this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, messages); for (var i = 0, n = messages.length; i < n; i++) this._dispatcher.handleError(messages[i]); }, _getCookies: function() { var cookies = this._dispatcher.cookies, url = URI.stringify(this.endpoint); if (!cookies) return ''; return array.map(cookies.getCookiesSync(url), function(cookie) { return cookie.cookieString(); }).join('; '); }, _storeCookies: function(setCookie) { var cookies = this._dispatcher.cookies, url = URI.stringify(this.endpoint), cookie; if (!setCookie || !cookies) return; setCookie = [].concat(setCookie); for (var i = 0, n = setCookie.length; i < n; i++) { cookie = Cookie.parse(setCookie[i]); cookies.setCookieSync(cookie, url); } }, _findProxy: function() { if (typeof process === 'undefined') return undefined; var protocol = this.endpoint.protocol; if (!protocol) return undefined; var name = protocol.replace(/:$/, '').toLowerCase() + '_proxy', upcase = name.toUpperCase(), env = process.env, keys, proxy; if (name === 'http_proxy' && env.REQUEST_METHOD) { keys = Object.keys(env).filter(function(k) { return /^http_proxy$/i.test(k) }); if (keys.length === 1) { if (keys[0] === name && env[upcase] === undefined) proxy = env[name]; } else if (keys.length > 1) { proxy = env[name]; } proxy = proxy || env['CGI_' + upcase]; } else { proxy = env[name] || env[upcase]; if (proxy && !env[name]) console.warn('The environment variable ' + upcase + ' is discouraged. Use ' + name + '.'); } return proxy; } }), { get: function(dispatcher, allowed, disabled, callback, context) { var endpoint = dispatcher.endpoint; array.asyncEach(this._transports, function(pair, resume) { var connType = pair[0], klass = pair[1], connEndpoint = dispatcher.endpointFor(connType); if (array.indexOf(disabled, connType) >= 0) return resume(); if (array.indexOf(allowed, connType) < 0) { klass.isUsable(dispatcher, connEndpoint, function() {}); return resume(); } klass.isUsable(dispatcher, connEndpoint, function(isUsable) { if (!isUsable) return resume(); var transport = klass.hasOwnProperty('create') ? klass.create(dispatcher, connEndpoint) : new klass(dispatcher, connEndpoint); callback.call(context, transport); }); }, function() { throw new Error('Could not find a usable connection type for ' + URI.stringify(endpoint)); }); }, register: function(type, klass) { this._transports.push([type, klass]); klass.prototype.connectionType = type; }, getConnectionTypes: function() { return array.map(this._transports, function(t) { return t[0] }); }, _transports: [] }); extend(Transport.prototype, Logging); extend(Transport.prototype, Timeouts); module.exports = Transport; /***/ }, /* 23 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; module.exports = { addTimeout: function(name, delay, callback, context) { this._timeouts = this._timeouts || {}; if (this._timeouts.hasOwnProperty(name)) return; var self = this; this._timeouts[name] = global.setTimeout(function() { delete self._timeouts[name]; callback.call(context); }, 1000 * delay); }, removeTimeout: function(name) { this._timeouts = this._timeouts || {}; var timeout = this._timeouts[name]; if (!timeout) return; global.clearTimeout(timeout); delete this._timeouts[name]; }, removeAllTimeouts: function() { this._timeouts = this._timeouts || {}; for (var name in this._timeouts) this.removeTimeout(name); } }; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 24 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var Class = __webpack_require__(7), Promise = __webpack_require__(9), Set = __webpack_require__(25), URI = __webpack_require__(10), browser = __webpack_require__(12), copyObject = __webpack_require__(26), extend = __webpack_require__(8), toJSON = __webpack_require__(3), ws = __webpack_require__(27), Deferrable = __webpack_require__(14), Transport = __webpack_require__(22); var WebSocket = extend(Class(Transport, { UNCONNECTED: 1, CONNECTING: 2, CONNECTED: 3, batching: false, isUsable: function(callback, context) { this.callback(function() { callback.call(context, true) }); this.errback(function() { callback.call(context, false) }); this.connect(); }, request: function(messages) { this._pending = this._pending || new Set(); for (var i = 0, n = messages.length; i < n; i++) this._pending.add(messages[i]); var self = this; var promise = new Promise(function(resolve, reject) { self.callback(function(socket) { if (!socket || socket.readyState !== 1) return; socket.send(toJSON(messages)); resolve(socket); }); self.connect(); }); return { abort: function() { promise.then(function(ws) { ws.close() }) } }; }, connect: function() { if (WebSocket._unloaded) return; this._state = this._state || this.UNCONNECTED; if (this._state !== this.UNCONNECTED) return; this._state = this.CONNECTING; var socket = this._createSocket(); if (!socket) return this.setDeferredStatus('failed'); var self = this; socket.onopen = function() { if (socket.headers) self._storeCookies(socket.headers['set-cookie']); self._socket = socket; self._state = self.CONNECTED; self._everConnected = true; self._ping(); self.setDeferredStatus('succeeded', socket); }; var closed = false; socket.onclose = socket.onerror = function() { if (closed) return; closed = true; var wasConnected = (self._state === self.CONNECTED); socket.onopen = socket.onclose = socket.onerror = socket.onmessage = null; delete self._socket; self._state = self.UNCONNECTED; self.removeTimeout('ping'); var pending = self._pending ? self._pending.toArray() : []; delete self._pending; if (wasConnected || self._everConnected) { self.setDeferredStatus('unknown'); self._handleError(pending, wasConnected); } else { self.setDeferredStatus('failed'); } }; socket.onmessage = function(event) { var replies; try { replies = JSON.parse(event.data) } catch (error) {} if (!replies) return; replies = [].concat(replies); for (var i = 0, n = replies.length; i < n; i++) { if (replies[i].successful === undefined) continue; self._pending.remove(replies[i]); } self._receive(replies); }; }, close: function() { if (!this._socket) return; this._socket.close(); }, _createSocket: function() { var url = WebSocket.getSocketUrl(this.endpoint), headers = this._dispatcher.headers, extensions = this._dispatcher.wsExtensions, cookie = this._getCookies(), tls = this._dispatcher.tls, options = {extensions: extensions, headers: headers, proxy: this._proxy, tls: tls}; if (cookie !== '') options.headers['Cookie'] = cookie; return ws.create(url, [], options); }, _ping: function() { if (!this._socket || this._socket.readyState !== 1) return; this._socket.send('[]'); this.addTimeout('ping', this._dispatcher.timeout / 2, this._ping, this); } }), { PROTOCOLS: { 'http:': 'ws:', 'https:': 'wss:' }, create: function(dispatcher, endpoint) { var sockets = dispatcher.transports.websocket = dispatcher.transports.websocket || {}; sockets[endpoint.href] = sockets[endpoint.href] || new this(dispatcher, endpoint); return sockets[endpoint.href]; }, getSocketUrl: function(endpoint) { endpoint = copyObject(endpoint); endpoint.protocol = this.PROTOCOLS[endpoint.protocol]; return URI.stringify(endpoint); }, isUsable: function(dispatcher, endpoint, callback, context) { this.create(dispatcher, endpoint).isUsable(callback, context); } }); extend(WebSocket.prototype, Deferrable); if (browser.Event && global.onbeforeunload !== undefined) browser.Event.on(global, 'beforeunload', function() { WebSocket._unloaded = true }); module.exports = WebSocket; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 25 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var Class = __webpack_require__(7); module.exports = Class({ initialize: function() { this._index = {}; }, add: function(item) { var key = (item.id !== undefined) ? item.id : item; if (this._index.hasOwnProperty(key)) return false; this._index[key] = item; return true; }, forEach: function(block, context) { for (var key in this._index) { if (this._index.hasOwnProperty(key)) block.call(context, this._index[key]); } }, isEmpty: function() { for (var key in this._index) { if (this._index.hasOwnProperty(key)) return false; } return true; }, member: function(item) { for (var key in this._index) { if (this._index[key] === item) return true; } return false; }, remove: function(item) { var key = (item.id !== undefined) ? item.id : item; var removed = this._index[key]; delete this._index[key]; return removed; }, toArray: function() { var array = []; this.forEach(function(item) { array.push(item) }); return array; } }); /***/ }, /* 26 */ /***/ function(module, exports) { 'use strict'; var copyObject = function(object) { var clone, i, key; if (object instanceof Array) { clone = []; i = object.length; while (i--) clone[i] = copyObject(object[i]); return clone; } else if (typeof object === 'object') { clone = (object === null) ? null : {}; for (key in object) clone[key] = copyObject(object[key]); return clone; } else { return object; } }; module.exports = copyObject; /***/ }, /* 27 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var WS = global.MozWebSocket || global.WebSocket; module.exports = { create: function(url, protocols, options) { if (typeof WS !== 'function') return null; return new WS(url); } }; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 28 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var Class = __webpack_require__(7), URI = __webpack_require__(10), copyObject = __webpack_require__(26), extend = __webpack_require__(8), Deferrable = __webpack_require__(14), Transport = __webpack_require__(22), XHR = __webpack_require__(29); var EventSource = extend(Class(Transport, { initialize: function(dispatcher, endpoint) { Transport.prototype.initialize.call(this, dispatcher, endpoint); if (!global.EventSource) return this.setDeferredStatus('failed'); this._xhr = new XHR(dispatcher, endpoint); endpoint = copyObject(endpoint); endpoint.pathname += '/' + dispatcher.clientId; var socket = new global.EventSource(URI.stringify(endpoint)), self = this; socket.onopen = function() { self._everConnected = true; self.setDeferredStatus('succeeded'); }; socket.onerror = function() { if (self._everConnected) { self._handleError([]); } else { self.setDeferredStatus('failed'); socket.close(); } }; socket.onmessage = function(event) { var replies; try { replies = JSON.parse(event.data) } catch (error) {} if (replies) self._receive(replies); else self._handleError([]); }; this._socket = socket; }, close: function() { if (!this._socket) return; this._socket.onopen = this._socket.onerror = this._socket.onmessage = null; this._socket.close(); delete this._socket; }, isUsable: function(callback, context) { this.callback(function() { callback.call(context, true) }); this.errback(function() { callback.call(context, false) }); }, encode: function(messages) { return this._xhr.encode(messages); }, request: function(messages) { return this._xhr.request(messages); } }), { isUsable: function(dispatcher, endpoint, callback, context) { var id = dispatcher.clientId; if (!id) return callback.call(context, false); XHR.isUsable(dispatcher, endpoint, function(usable) { if (!usable) return callback.call(context, false); this.create(dispatcher, endpoint).isUsable(callback, context); }, this); }, create: function(dispatcher, endpoint) { var sockets = dispatcher.transports.eventsource = dispatcher.transports.eventsource || {}, id = dispatcher.clientId; var url = copyObject(endpoint); url.pathname += '/' + (id || ''); url = URI.stringify(url); sockets[url] = sockets[url] || new this(dispatcher, endpoint); return sockets[url]; } }); extend(EventSource.prototype, Deferrable); module.exports = EventSource; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 29 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var Class = __webpack_require__(7), URI = __webpack_require__(10), browser = __webpack_require__(12), extend = __webpack_require__(8), toJSON = __webpack_require__(3), Transport = __webpack_require__(22); var XHR = extend(Class(Transport, { encode: function(messages) { return toJSON(messages); }, request: function(messages) { var href = this.endpoint.href, self = this, xhr; // Prefer XMLHttpRequest over ActiveXObject if they both exist if (global.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else if (global.ActiveXObject) { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } else { return this._handleError(messages); } xhr.open('POST', href, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.setRequestHeader('Pragma', 'no-cache'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); var headers = this._dispatcher.headers; for (var key in headers) { if (!headers.hasOwnProperty(key)) continue; xhr.setRequestHeader(key, headers[key]); } var abort = function() { xhr.abort() }; if (global.onbeforeunload !== undefined) browser.Event.on(global, 'beforeunload', abort); xhr.onreadystatechange = function() { if (!xhr || xhr.readyState !== 4) return; var replies = null, status = xhr.status, text = xhr.responseText, successful = (status >= 200 && status < 300) || status === 304 || status === 1223; if (global.onbeforeunload !== undefined) browser.Event.detach(global, 'beforeunload', abort); xhr.onreadystatechange = function() {}; xhr = null; if (!successful) return self._handleError(messages); try { replies = JSON.parse(text); } catch (error) {} if (replies) self._receive(replies); else self._handleError(messages); }; xhr.send(this.encode(messages)); return xhr; } }), { isUsable: function(dispatcher, endpoint, callback, context) { var usable = (navigator.product === 'ReactNative') || URI.isSameOrigin(endpoint); callback.call(context, usable); } }); module.exports = XHR; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 30 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var Class = __webpack_require__(7), Set = __webpack_require__(25), URI = __webpack_require__(10), extend = __webpack_require__(8), toJSON = __webpack_require__(3), Transport = __webpack_require__(22); var CORS = extend(Class(Transport, { encode: function(messages) { return 'message=' + encodeURIComponent(toJSON(messages)); }, request: function(messages) { var xhrClass = global.XDomainRequest ? XDomainRequest : XMLHttpRequest, xhr = new xhrClass(), id = ++CORS._id, headers = this._dispatcher.headers, self = this, key; xhr.open('POST', URI.stringify(this.endpoint), true); if (xhr.setRequestHeader) { xhr.setRequestHeader('Pragma', 'no-cache'); for (key in headers) { if (!headers.hasOwnProperty(key)) continue; xhr.setRequestHeader(key, headers[key]); } } var cleanUp = function() { if (!xhr) return false; CORS._pending.remove(id); xhr.onload = xhr.onerror = xhr.ontimeout = xhr.onprogress = null; xhr = null; }; xhr.onload = function() { var replies; try { replies = JSON.parse(xhr.responseText) } catch (error) {} cleanUp(); if (replies) self._receive(replies); else self._handleError(messages); }; xhr.onerror = xhr.ontimeout = function() { cleanUp(); self._handleError(messages); }; xhr.onprogress = function() {}; if (xhrClass === global.XDomainRequest) CORS._pending.add({id: id, xhr: xhr}); xhr.send(this.encode(messages)); return xhr; } }), { _id: 0, _pending: new Set(), isUsable: function(dispatcher, endpoint, callback, context) { if (URI.isSameOrigin(endpoint)) return callback.call(context, false); if (global.XDomainRequest) return callback.call(context, endpoint.protocol === location.protocol); if (global.XMLHttpRequest) { var xhr = new XMLHttpRequest(); return callback.call(context, xhr.withCredentials !== undefined); } return callback.call(context, false); } }); module.exports = CORS; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 31 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var Class = __webpack_require__(7), URI = __webpack_require__(10), copyObject = __webpack_require__(26), extend = __webpack_require__(8), toJSON = __webpack_require__(3), Transport = __webpack_require__(22); var JSONP = extend(Class(Transport, { encode: function(messages) { var url = copyObject(this.endpoint); url.query.message = toJSON(messages); url.query.jsonp = '__jsonp' + JSONP._cbCount + '__'; return URI.stringify(url); }, request: function(messages) { var head = document.getElementsByTagName('head')[0], script = document.createElement('script'), callbackName = JSONP.getCallbackName(), endpoint = copyObject(this.endpoint), self = this; endpoint.query.message = toJSON(messages); endpoint.query.jsonp = callbackName; var cleanup = function() { if (!global[callbackName]) return false; global[callbackName] = undefined; try { delete global[callbackName] } catch (error) {} script.parentNode.removeChild(script); }; global[callbackName] = function(replies) { cleanup(); self._receive(replies); }; script.type = 'text/javascript'; script.src = URI.stringify(endpoint); head.appendChild(script); script.onerror = function() { cleanup(); self._handleError(messages); }; return {abort: cleanup}; } }), { _cbCount: 0, getCallbackName: function() { this._cbCount += 1; return '__jsonp' + this._cbCount + '__'; }, isUsable: function(dispatcher, endpoint, callback, context) { callback.call(context, true); } }); module.exports = JSONP; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 32 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var extend = __webpack_require__(8); var Scheduler = function(message, options) { this.message = message; this.options = options; this.attempts = 0; }; extend(Scheduler.prototype, { getTimeout: function() { return this.options.timeout; }, getInterval: function() { return this.options.interval; }, isDeliverable: function() { var attempts = this.options.attempts, made = this.attempts, deadline = this.options.deadline, now = new Date().getTime(); if (attempts !== undefined && made >= attempts) return false; if (deadline !== undefined && now > deadline) return false; return true; }, send: function() { this.attempts += 1; }, succeed: function() {}, fail: function() {}, abort: function() {} }); module.exports = Scheduler; /***/ }, /* 33 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var Class = __webpack_require__(7), Grammar = __webpack_require__(18); var Error = Class({ initialize: function(code, params, message) { this.code = code; this.params = Array.prototype.slice.call(params); this.message = message; }, toString: function() { return this.code + ':' + this.params.join(',') + ':' + this.message; } }); Error.parse = function(message) { message = message || ''; if (!Grammar.ERROR.test(message)) return new Error(null, [], message); var parts = message.split(':'), code = parseInt(parts[0]), params = parts[1].split(','), message = parts[2]; return new Error(code, params, message); }; // http://code.google.com/p/cometd/wiki/BayeuxCodes var errors = { versionMismatch: [300, 'Version mismatch'], conntypeMismatch: [301, 'Connection types not supported'], extMismatch: [302, 'Extension mismatch'], badRequest: [400, 'Bad request'], clientUnknown: [401, 'Unknown client'], parameterMissing: [402, 'Missing required parameter'], channelForbidden: [403, 'Forbidden channel'], channelUnknown: [404, 'Unknown channel'], channelInvalid: [405, 'Invalid channel'], extUnknown: [406, 'Unknown extension'], publishFailed: [407, 'Failed to publish'], serverError: [500, 'Internal server error'] }; for (var name in errors) (function(name) { Error[name] = function() { return new Error(errors[name][0], arguments, errors[name][1]).toString(); }; })(name); module.exports = Error; /***/ }, /* 34 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var extend = __webpack_require__(8), Logging = __webpack_require__(2); var Extensible = { addExtension: function(extension) { this._extensions = this._extensions || []; this._extensions.push(extension); if (extension.added) extension.added(this); }, removeExtension: function(extension) { if (!this._extensions) return; var i = this._extensions.length; while (i--) { if (this._extensions[i] !== extension) continue; this._extensions.splice(i,1); if (extension.removed) extension.removed(this); } }, pipeThroughExtensions: function(stage, message, request, callback, context) { this.debug('Passing through ? extensions: ?', stage, message); if (!this._extensions) return callback.call(context, message); var extensions = this._extensions.slice(); var pipe = function(message) { if (!message) return callback.call(context, message); var extension = extensions.shift(); if (!extension) return callback.call(context, message); var fn = extension[stage]; if (!fn) return pipe(message); if (fn.length >= 3) extension[stage](message, request, pipe); else extension[stage](message, pipe); }; pipe(message); } }; extend(Extensible, Logging); module.exports = Extensible; /***/ }, /* 35 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var Class = __webpack_require__(7), Deferrable = __webpack_require__(14); module.exports = Class(Deferrable); /***/ }, /* 36 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var Class = __webpack_require__(7), extend = __webpack_require__(8), Deferrable = __webpack_require__(14); var Subscription = Class({ initialize: function(client, channels, callback, context) { this._client = client; this._channels = channels; this._callback = callback; this._context = context; this._cancelled = false; }, withChannel: function(callback, context) { this._withChannel = [callback, context]; return this; }, apply: function(context, args) { var message = args[0]; if (this._callback) this._callback.call(this._context, message.data); if (this._withChannel) this._withChannel[0].call(this._withChannel[1], message.channel, message.data); }, cancel: function() { if (this._cancelled) return; this._client.unsubscribe(this._channels, this); this._cancelled = true; }, unsubscribe: function() { this.cancel(); } }); extend(Subscription.prototype, Deferrable); module.exports = Subscription; /***/ } /******/ ]); //# sourceMappingURL=faye-browser.js.mapfaye-1.2.4/build/client/faye-browser.js.map0000644000175000017500000031756513425045757021331 0ustar utkarsh2102utkarsh2102{"version":3,"sources":["webpack:///webpack/bootstrap 4a800f3df1972dc08ea2","webpack:///./src/faye_browser.js","webpack:///./src/util/constants.js","webpack:///./src/mixins/logging.js","webpack:///./src/util/to_json.js","webpack:///./src/protocol/client.js","webpack:///./~/asap/browser-asap.js","webpack:///./~/asap/browser-raw.js","webpack:///./src/util/class.js","webpack:///./src/util/extend.js","webpack:///./src/util/promise.js","webpack:///./src/util/uri.js","webpack:///./src/util/array.js","webpack:///./src/util/browser/event.js","webpack:///./src/util/validate_options.js","webpack:///./src/mixins/deferrable.js","webpack:///./src/mixins/publisher.js","webpack:///./src/util/event_emitter.js","webpack:///./src/protocol/channel.js","webpack:///./src/protocol/grammar.js","webpack:///./src/protocol/dispatcher.js","webpack:///./src/util/cookies/browser_cookies.js","webpack:///./src/transport/browser_transports.js","webpack:///./src/transport/transport.js","webpack:///./src/mixins/timeouts.js","webpack:///./src/transport/web_socket.js","webpack:///./src/util/set.js","webpack:///./src/util/copy_object.js","webpack:///./src/util/websocket/browser_websocket.js","webpack:///./src/transport/event_source.js","webpack:///./src/transport/xhr.js","webpack:///./src/transport/cors.js","webpack:///./src/transport/jsonp.js","webpack:///./src/protocol/scheduler.js","webpack:///./src/protocol/error.js","webpack:///./src/protocol/extensible.js","webpack:///./src/protocol/publication.js","webpack:///./src/protocol/subscription.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;;;;;ACdA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;ACTA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;;;;;;AC9CA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;;;;;;;ACRA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK,IAAI;;AAET;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,wCAAuC,yBAAyB;;AAEhE,QAAO;AACP;AACA,uCAAsC,oCAAoC;AAC1E;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yCAAwC,kCAAkC;;AAE1E;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK,IAAI;AACT,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK,IAAI;AACT;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAO,IAAI;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAO,IAAI;AACX;;AAEA;AACA;AACA,QAAO;AACP,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC;AACjC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAkE;AAClE,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC,iBAAiB;AACnD;AACA,EAAC;;AAED;AACA;AACA;AACA;;AAEA;;;;;;;;ACjYA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;;;;;;ACjEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAgE,kBAAkB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9NA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACXA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA0B,WAAW;AACrC,2BAA0B;;AAE1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0BAAyB,uBAAuB;AAChD,0BAAyB,uBAAuB;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kCAAiC;;AAEjC;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,mCAAkC;;AAElC;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA,oBAAmB,2BAA2B;AAC9C;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iDAAgD,iBAAiB;AACjE;;AAEA;AACA,iDAAgD,iBAAiB;AACjE;;AAEA;AACA;AACA;;AAEA;;AAEA,gBAAe,OAAO;AACtB;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL,IAAG;AACH;;AAEA;AACA;AACA,yCAAwC,OAAO;AAC/C;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;;;;;;;AChKA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,iBAAgB;;AAEhB;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kCAAiC,OAAO;AACxC;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AClFA;;AAEA;AACA;AACA,sCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,qCAAoC,OAAO;AAC3C;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA,yCAAwC,OAAO;AAC/C;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,sCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzEA;;AAEA;AACA;;AAEA;AACA,+BAA8B;;AAE9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;ACjDA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACTA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,uCAAsC,gCAAgC;AACtE,IAAG;;AAEH;AACA,8CAA6C,iCAAiC;AAC9E,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/CA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,+BAA8B;;AAE9B;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,eAAe;AAClC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA2B;AAC3B,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA,0CAAyC,OAAO;AAChD;AACA;AACA;;AAEA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1KA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yCAAwC,OAAO;AAC/C;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,wCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;;AAEL;AACA;;AAEA,2CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA,IAAG;AACH,EAAC;;AAED;;;;;;;ACnIA;;AAEA;AACA;AACA,qFAAoF,IAAI;AACxF;AACA;AACA;;;;;;;ACPA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAwB;AACxB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yDAAwD;;AAExD;AACA;AACA;AACA,uCAAsC,OAAO;AAC7C;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iDAAgD,+EAA+E;AAC/H,0CAAyC;AACzC;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACxLA;;AAEA;;;;;;;ACFA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACVA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA8B;AAC9B,mBAAkB,mDAAmD;AACrE;;AAEA;;AAEA;AACA;AACA;AACA;AACA,iCAAgC;;AAEhC;AACA;AACA,IAAG;;AAEH,uBAAsB;;AAEtB;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;;AAEA;AACA,sCAAqC;;AAErC;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA,wCAAuC,OAAO;AAC9C;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA,yCAAwC,OAAO;AAC/C;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK,SAAS;AACd,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0CAAyC,OAAO;AAChD;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mDAAkD,iCAAiC;AACnF;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;AACD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,+DAA8D;AAC9D;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA,qDAAoD,cAAc;AAClE,IAAG;;AAEH;AACA,EAAC;;AAED;AACA;;AAEA;;;;;;;AClNA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;;;;;;;ACzBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,+BAA8B,+BAA+B;AAC7D,8BAA6B,gCAAgC;AAC7D;AACA,IAAG;;AAEH;AACA;AACA,yCAAwC,OAAO;;AAE/C;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;;AAEL;AACA,0BAAyB,4BAA4B,aAAa;AAClE;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,YAAW,mCAAmC;;AAE9C;;AAEA;;AAEA,0CAAyC,OAAO;AAChD;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,uBAAsB;;AAEtB;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,EAAC;AACD;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA,wDAAuD,6BAA6B;;AAEpF;;;;;;;;AChKA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,kCAAiC,mBAAmB;AACpD;AACA;AACA,EAAC;;;;;;;ACjDD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;;;;;;;AClBA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACTA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,mCAAmC;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,+BAA8B,+BAA+B;AAC7D,8BAA6B,gCAAgC;AAC7D,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA,EAAC;AACD;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA,8FAA6F;AAC7F;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;;;;;;;;AChGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,6BAA4B;AAC5B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;;;;;;;;ACjFA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,yCAAyC;;AAEpD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,0BAAyB,iBAAiB;;AAE1C;AACA;AACA;AACA,EAAC;AACD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;;;;;;;ACnFA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,8BAA8B;AACzC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,aAAY;AACZ;AACA,EAAC;AACD;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;AAED;;;;;;;;AC/DA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH,yBAAwB;;AAExB,sBAAqB;;AAErB;AACA,EAAC;;AAED;;;;;;;AC7CA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;;;;;;ACtDA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;AC9CA;;AAEA;AACA;;AAEA;;;;;;;ACLA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;AAED;;AAEA","file":"faye-browser.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4a800f3df1972dc08ea2","'use strict';\n\nvar constants = require('./util/constants'),\n Logging = require('./mixins/logging');\n\nvar Faye = {\n VERSION: constants.VERSION,\n\n Client: require('./protocol/client'),\n Scheduler: require('./protocol/scheduler')\n};\n\nLogging.wrapper = Faye;\n\nmodule.exports = Faye;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/faye_browser.js\n// module id = 0\n// module chunks = 0","module.exports = {\n VERSION: '1.2.4',\n\n BAYEUX_VERSION: '1.0',\n ID_LENGTH: 160,\n JSONP_CALLBACK: 'jsonpcallback',\n CONNECTION_TYPES: ['long-polling', 'cross-origin-long-polling', 'callback-polling', 'websocket', 'eventsource', 'in-process'],\n\n MANDATORY_CONNECTION_TYPES: ['long-polling', 'callback-polling', 'in-process']\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/constants.js\n// module id = 1\n// module chunks = 0","'use strict';\n\nvar toJSON = require('../util/to_json');\n\nvar Logging = {\n LOG_LEVELS: {\n fatal: 4,\n error: 3,\n warn: 2,\n info: 1,\n debug: 0\n },\n\n writeLog: function(messageArgs, level) {\n var logger = Logging.logger || (Logging.wrapper || Logging).logger;\n if (!logger) return;\n\n var args = Array.prototype.slice.apply(messageArgs),\n banner = '[Faye',\n klass = this.className,\n\n message = args.shift().replace(/\\?/g, function() {\n try {\n return toJSON(args.shift());\n } catch (error) {\n return '[Object]';\n }\n });\n\n if (klass) banner += '.' + klass;\n banner += '] ';\n\n if (typeof logger[level] === 'function')\n logger[level](banner + message);\n else if (typeof logger === 'function')\n logger(banner + message);\n }\n};\n\nfor (var key in Logging.LOG_LEVELS)\n (function(level) {\n Logging[level] = function() {\n this.writeLog(arguments, level);\n };\n })(key);\n\nmodule.exports = Logging;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mixins/logging.js\n// module id = 2\n// module chunks = 0","'use strict';\n\n// http://assanka.net/content/tech/2009/09/02/json2-js-vs-prototype/\n\nmodule.exports = function(object) {\n return JSON.stringify(object, function(key, value) {\n return (this[key] instanceof Array) ? this[key] : value;\n });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/to_json.js\n// module id = 3\n// module chunks = 0","'use strict';\n\nvar asap = require('asap'),\n Class = require('../util/class'),\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n browser = require('../util/browser'),\n constants = require('../util/constants'),\n extend = require('../util/extend'),\n validateOptions = require('../util/validate_options'),\n Deferrable = require('../mixins/deferrable'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Channel = require('./channel'),\n Dispatcher = require('./dispatcher'),\n Error = require('./error'),\n Extensible = require('./extensible'),\n Publication = require('./publication'),\n Subscription = require('./subscription');\n\nvar Client = Class({ className: 'Client',\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n DISCONNECTED: 4,\n\n HANDSHAKE: 'handshake',\n RETRY: 'retry',\n NONE: 'none',\n\n CONNECTION_TIMEOUT: 60,\n\n DEFAULT_ENDPOINT: '/bayeux',\n INTERVAL: 0,\n\n initialize: function(endpoint, options) {\n this.info('New client created for ?', endpoint);\n options = options || {};\n\n validateOptions(options, ['interval', 'timeout', 'endpoints', 'proxy', 'retry', 'scheduler', 'websocketExtensions', 'tls', 'ca']);\n\n this._channels = new Channel.Set();\n this._dispatcher = Dispatcher.create(this, endpoint || this.DEFAULT_ENDPOINT, options);\n\n this._messageId = 0;\n this._state = this.UNCONNECTED;\n\n this._responseCallbacks = {};\n\n this._advice = {\n reconnect: this.RETRY,\n interval: 1000 * (options.interval || this.INTERVAL),\n timeout: 1000 * (options.timeout || this.CONNECTION_TIMEOUT)\n };\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n this._dispatcher.bind('message', this._receiveMessage, this);\n\n if (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() {\n if (array.indexOf(this._dispatcher._disabled, 'autodisconnect') < 0)\n this.disconnect();\n }, this);\n },\n\n addWebsocketExtension: function(extension) {\n return this._dispatcher.addWebsocketExtension(extension);\n },\n\n disable: function(feature) {\n return this._dispatcher.disable(feature);\n },\n\n setHeader: function(name, value) {\n return this._dispatcher.setHeader(name, value);\n },\n\n // Request\n // MUST include: * channel\n // * version\n // * supportedConnectionTypes\n // MAY include: * minimumVersion\n // * ext\n // * id\n //\n // Success Response Failed Response\n // MUST include: * channel MUST include: * channel\n // * version * successful\n // * supportedConnectionTypes * error\n // * clientId MAY include: * supportedConnectionTypes\n // * successful * advice\n // MAY include: * minimumVersion * version\n // * advice * minimumVersion\n // * ext * ext\n // * id * id\n // * authSuccessful\n handshake: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state !== this.UNCONNECTED) return;\n\n this._state = this.CONNECTING;\n var self = this;\n\n this.info('Initiating handshake with ?', URI.stringify(this._dispatcher.endpoint));\n this._dispatcher.selectTransport(constants.MANDATORY_CONNECTION_TYPES);\n\n this._sendMessage({\n channel: Channel.HANDSHAKE,\n version: constants.BAYEUX_VERSION,\n supportedConnectionTypes: this._dispatcher.getConnectionTypes()\n\n }, {}, function(response) {\n\n if (response.successful) {\n this._state = this.CONNECTED;\n this._dispatcher.clientId = response.clientId;\n\n this._dispatcher.selectTransport(response.supportedConnectionTypes);\n\n this.info('Handshake successful: ?', this._dispatcher.clientId);\n\n this.subscribe(this._channels.getKeys(), true);\n if (callback) asap(function() { callback.call(context) });\n\n } else {\n this.info('Handshake unsuccessful');\n global.setTimeout(function() { self.handshake(callback, context) }, this._dispatcher.retry * 1000);\n this._state = this.UNCONNECTED;\n }\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * connectionType * clientId\n // MAY include: * ext MAY include: * error\n // * id * advice\n // * ext\n // * id\n // * timestamp\n connect: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state === this.DISCONNECTED) return;\n\n if (this._state === this.UNCONNECTED)\n return this.handshake(function() { this.connect(callback, context) }, this);\n\n this.callback(callback, context);\n if (this._state !== this.CONNECTED) return;\n\n this.info('Calling deferred actions for ?', this._dispatcher.clientId);\n this.setDeferredStatus('succeeded');\n this.setDeferredStatus('unknown');\n\n if (this._connectRequest) return;\n this._connectRequest = true;\n\n this.info('Initiating connection for ?', this._dispatcher.clientId);\n\n this._sendMessage({\n channel: Channel.CONNECT,\n clientId: this._dispatcher.clientId,\n connectionType: this._dispatcher.connectionType\n\n }, {}, this._cycleConnection, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // MAY include: * ext * clientId\n // * id MAY include: * error\n // * ext\n // * id\n disconnect: function() {\n if (this._state !== this.CONNECTED) return;\n this._state = this.DISCONNECTED;\n\n this.info('Disconnecting ?', this._dispatcher.clientId);\n var promise = new Publication();\n\n this._sendMessage({\n channel: Channel.DISCONNECT,\n clientId: this._dispatcher.clientId\n\n }, {}, function(response) {\n if (response.successful) {\n this._dispatcher.close();\n promise.setDeferredStatus('succeeded');\n } else {\n promise.setDeferredStatus('failed', Error.parse(response.error));\n }\n }, this);\n\n this.info('Clearing channel listeners for ?', this._dispatcher.clientId);\n this._channels = new Channel.Set();\n\n return promise;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n subscribe: function(channel, callback, context) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.subscribe(c, callback, context);\n }, this);\n\n var subscription = new Subscription(this, channel, callback, context),\n force = (callback === true),\n hasSubscribe = this._channels.hasSubscription(channel);\n\n if (hasSubscribe && !force) {\n this._channels.subscribe([channel], subscription);\n subscription.setDeferredStatus('succeeded');\n return subscription;\n }\n\n this.connect(function() {\n this.info('Client ? attempting to subscribe to ?', this._dispatcher.clientId, channel);\n if (!force) this._channels.subscribe([channel], subscription);\n\n this._sendMessage({\n channel: Channel.SUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) {\n subscription.setDeferredStatus('failed', Error.parse(response.error));\n return this._channels.unsubscribe(channel, subscription);\n }\n\n var channels = [].concat(response.subscription);\n this.info('Subscription acknowledged for ? to ?', this._dispatcher.clientId, channels);\n subscription.setDeferredStatus('succeeded');\n }, this);\n }, this);\n\n return subscription;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n unsubscribe: function(channel, subscription) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.unsubscribe(c, subscription);\n }, this);\n\n var dead = this._channels.unsubscribe(channel, subscription);\n if (!dead) return;\n\n this.connect(function() {\n this.info('Client ? attempting to unsubscribe from ?', this._dispatcher.clientId, channel);\n\n this._sendMessage({\n channel: Channel.UNSUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) return;\n\n var channels = [].concat(response.subscription);\n this.info('Unsubscription acknowledged for ? from ?', this._dispatcher.clientId, channels);\n }, this);\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * data * successful\n // MAY include: * clientId MAY include: * id\n // * id * error\n // * ext * ext\n publish: function(channel, data, options) {\n validateOptions(options || {}, ['attempts', 'deadline']);\n var publication = new Publication();\n\n this.connect(function() {\n this.info('Client ? queueing published message to ?: ?', this._dispatcher.clientId, channel, data);\n\n this._sendMessage({\n channel: channel,\n data: data,\n clientId: this._dispatcher.clientId\n\n }, options, function(response) {\n if (response.successful)\n publication.setDeferredStatus('succeeded');\n else\n publication.setDeferredStatus('failed', Error.parse(response.error));\n }, this);\n }, this);\n\n return publication;\n },\n\n _sendMessage: function(message, options, callback, context) {\n message.id = this._generateMessageId();\n\n var timeout = this._advice.timeout\n ? 1.2 * this._advice.timeout / 1000\n : 1.2 * this._dispatcher.retry;\n\n this.pipeThroughExtensions('outgoing', message, null, function(message) {\n if (!message) return;\n if (callback) this._responseCallbacks[message.id] = [callback, context];\n this._dispatcher.sendMessage(message, timeout, options || {});\n }, this);\n },\n\n _generateMessageId: function() {\n this._messageId += 1;\n if (this._messageId >= Math.pow(2,32)) this._messageId = 0;\n return this._messageId.toString(36);\n },\n\n _receiveMessage: function(message) {\n var id = message.id, callback;\n\n if (message.successful !== undefined) {\n callback = this._responseCallbacks[id];\n delete this._responseCallbacks[id];\n }\n\n this.pipeThroughExtensions('incoming', message, null, function(message) {\n if (!message) return;\n if (message.advice) this._handleAdvice(message.advice);\n this._deliverMessage(message);\n if (callback) callback[0].call(callback[1], message);\n }, this);\n },\n\n _handleAdvice: function(advice) {\n extend(this._advice, advice);\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n if (this._advice.reconnect === this.HANDSHAKE && this._state !== this.DISCONNECTED) {\n this._state = this.UNCONNECTED;\n this._dispatcher.clientId = null;\n this._cycleConnection();\n }\n },\n\n _deliverMessage: function(message) {\n if (!message.channel || message.data === undefined) return;\n this.info('Client ? calling listeners for ? with ?', this._dispatcher.clientId, message.channel, message.data);\n this._channels.distributeMessage(message);\n },\n\n _cycleConnection: function() {\n if (this._connectRequest) {\n this._connectRequest = null;\n this.info('Closed connection for ?', this._dispatcher.clientId);\n }\n var self = this;\n global.setTimeout(function() { self.connect() }, this._advice.interval);\n }\n});\n\nextend(Client.prototype, Deferrable);\nextend(Client.prototype, Publisher);\nextend(Client.prototype, Logging);\nextend(Client.prototype, Extensible);\n\nmodule.exports = Client;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/client.js\n// module id = 4\n// module chunks = 0","\"use strict\";\n\n// rawAsap provides everything we need except exception management.\nvar rawAsap = require(\"./raw\");\n// RawTasks are recycled to reduce GC churn.\nvar freeTasks = [];\n// We queue errors to ensure they are thrown in right order (FIFO).\n// Array-as-queue is good enough here, since we are just dealing with exceptions.\nvar pendingErrors = [];\nvar requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);\n\nfunction throwFirstError() {\n if (pendingErrors.length) {\n throw pendingErrors.shift();\n }\n}\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with priority\n * over other events like animation, reflow, and repaint. An error thrown from an\n * event will not interrupt, nor even substantially slow down the processing of\n * other events, but will be rather postponed to a lower priority event.\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n var rawTask;\n if (freeTasks.length) {\n rawTask = freeTasks.pop();\n } else {\n rawTask = new RawTask();\n }\n rawTask.task = task;\n rawAsap(rawTask);\n}\n\n// We wrap tasks with recyclable task objects. A task object implements\n// `call`, just like a function.\nfunction RawTask() {\n this.task = null;\n}\n\n// The sole purpose of wrapping the task is to catch the exception and recycle\n// the task object after its single use.\nRawTask.prototype.call = function () {\n try {\n this.task.call();\n } catch (error) {\n if (asap.onerror) {\n // This hook exists purely for testing purposes.\n // Its name will be periodically randomized to break any code that\n // depends on its existence.\n asap.onerror(error);\n } else {\n // In a web browser, exceptions are not fatal. However, to avoid\n // slowing down the queue of pending tasks, we rethrow the error in a\n // lower priority turn.\n pendingErrors.push(error);\n requestErrorThrow();\n }\n } finally {\n this.task = null;\n freeTasks[freeTasks.length] = this;\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/asap/browser-asap.js\n// module id = 5\n// module chunks = 0","\"use strict\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n if (!queue.length) {\n requestFlush();\n flushing = true;\n }\n // Equivalent to push, but avoids a function call.\n queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n while (index < queue.length) {\n var currentIndex = index;\n // Advance the index before calling the task. This ensures that we will\n // begin flushing on the next task the task throws an error.\n index = index + 1;\n queue[currentIndex].call();\n // Prevent leaking memory for long chains of recursive calls to `asap`.\n // If we call `asap` within tasks scheduled by `asap`, the queue will\n // grow, but to avoid an O(n) walk for every task we execute, we don't\n // shift tasks off the queue after they have been executed.\n // Instead, we periodically shift 1024 tasks off the queue.\n if (index > capacity) {\n // Manually shift all values starting at the index back to the\n // beginning of the queue.\n for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n queue[scan] = queue[scan + index];\n }\n queue.length -= index;\n index = 0;\n }\n }\n queue.length = 0;\n index = 0;\n flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n var toggle = 1;\n var observer = new BrowserMutationObserver(callback);\n var node = document.createTextNode(\"\");\n observer.observe(node, {characterData: true});\n return function requestCall() {\n toggle = -toggle;\n node.data = toggle;\n };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n// var channel = new MessageChannel();\n// channel.port1.onmessage = callback;\n// return function requestCall() {\n// channel.port2.postMessage(0);\n// };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n// return function requestCall() {\n// setImmediate(callback);\n// };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n return function requestCall() {\n // We dispatch a timeout with a specified delay of 0 for engines that\n // can reliably accommodate that request. This will usually be snapped\n // to a 4 milisecond delay, but once we're flushing, there's no delay\n // between events.\n var timeoutHandle = setTimeout(handleTimer, 0);\n // However, since this timer gets frequently dropped in Firefox\n // workers, we enlist an interval handle that will try to fire\n // an event 20 times per second until it succeeds.\n var intervalHandle = setInterval(handleTimer, 50);\n\n function handleTimer() {\n // Whichever timer succeeds will cancel both timers and\n // execute the callback.\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n callback();\n }\n };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/asap/browser-raw.js\n// module id = 6\n// module chunks = 0","'use strict';\n\nvar extend = require('./extend');\n\nmodule.exports = function(parent, methods) {\n if (typeof parent !== 'function') {\n methods = parent;\n parent = Object;\n }\n\n var klass = function() {\n if (!this.initialize) return this;\n return this.initialize.apply(this, arguments) || this;\n };\n\n var bridge = function() {};\n bridge.prototype = parent.prototype;\n\n klass.prototype = new bridge();\n extend(klass.prototype, methods);\n\n return klass;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/class.js\n// module id = 7\n// module chunks = 0","'use strict';\n\nmodule.exports = function(dest, source, overwrite) {\n if (!source) return dest;\n for (var key in source) {\n if (!source.hasOwnProperty(key)) continue;\n if (dest.hasOwnProperty(key) && overwrite === false) continue;\n if (dest[key] !== source[key])\n dest[key] = source[key];\n }\n return dest;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/extend.js\n// module id = 8\n// module chunks = 0","'use strict';\n\nvar asap = require('asap');\n\nvar PENDING = 0,\n FULFILLED = 1,\n REJECTED = 2;\n\nvar RETURN = function(x) { return x },\n THROW = function(x) { throw x };\n\nvar Promise = function(task) {\n this._state = PENDING;\n this._onFulfilled = [];\n this._onRejected = [];\n\n if (typeof task !== 'function') return;\n var self = this;\n\n task(function(value) { resolve(self, value) },\n function(reason) { reject(self, reason) });\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n var next = new Promise();\n registerOnFulfilled(this, onFulfilled, next);\n registerOnRejected(this, onRejected, next);\n return next;\n};\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nvar registerOnFulfilled = function(promise, onFulfilled, next) {\n if (typeof onFulfilled !== 'function') onFulfilled = RETURN;\n var handler = function(value) { invoke(onFulfilled, value, next) };\n\n if (promise._state === PENDING) {\n promise._onFulfilled.push(handler);\n } else if (promise._state === FULFILLED) {\n handler(promise._value);\n }\n};\n\nvar registerOnRejected = function(promise, onRejected, next) {\n if (typeof onRejected !== 'function') onRejected = THROW;\n var handler = function(reason) { invoke(onRejected, reason, next) };\n\n if (promise._state === PENDING) {\n promise._onRejected.push(handler);\n } else if (promise._state === REJECTED) {\n handler(promise._reason);\n }\n};\n\nvar invoke = function(fn, value, next) {\n asap(function() { _invoke(fn, value, next) });\n};\n\nvar _invoke = function(fn, value, next) {\n var outcome;\n\n try {\n outcome = fn(value);\n } catch (error) {\n return reject(next, error);\n }\n\n if (outcome === next) {\n reject(next, new TypeError('Recursive promise chain detected'));\n } else {\n resolve(next, outcome);\n }\n};\n\nvar resolve = function(promise, value) {\n var called = false, type, then;\n\n try {\n type = typeof value;\n then = value !== null && (type === 'function' || type === 'object') && value.then;\n\n if (typeof then !== 'function') return fulfill(promise, value);\n\n then.call(value, function(v) {\n if (!(called ^ (called = true))) return;\n resolve(promise, v);\n }, function(r) {\n if (!(called ^ (called = true))) return;\n reject(promise, r);\n });\n } catch (error) {\n if (!(called ^ (called = true))) return;\n reject(promise, error);\n }\n};\n\nvar fulfill = function(promise, value) {\n if (promise._state !== PENDING) return;\n\n promise._state = FULFILLED;\n promise._value = value;\n promise._onRejected = [];\n\n var onFulfilled = promise._onFulfilled, fn;\n while (fn = onFulfilled.shift()) fn(value);\n};\n\nvar reject = function(promise, reason) {\n if (promise._state !== PENDING) return;\n\n promise._state = REJECTED;\n promise._reason = reason;\n promise._onFulfilled = [];\n\n var onRejected = promise._onRejected, fn;\n while (fn = onRejected.shift()) fn(reason);\n};\n\nPromise.resolve = function(value) {\n return new Promise(function(resolve, reject) { resolve(value) });\n};\n\nPromise.reject = function(reason) {\n return new Promise(function(resolve, reject) { reject(reason) });\n};\n\nPromise.all = function(promises) {\n return new Promise(function(resolve, reject) {\n var list = [], n = promises.length, i;\n\n if (n === 0) return resolve(list);\n\n for (i = 0; i < n; i++) (function(promise, i) {\n Promise.resolve(promise).then(function(value) {\n list[i] = value;\n if (--n === 0) resolve(list);\n }, reject);\n })(promises[i], i);\n });\n};\n\nPromise.race = function(promises) {\n return new Promise(function(resolve, reject) {\n for (var i = 0, n = promises.length; i < n; i++)\n Promise.resolve(promises[i]).then(resolve, reject);\n });\n};\n\nPromise.deferred = Promise.pending = function() {\n var tuple = {};\n\n tuple.promise = new Promise(function(resolve, reject) {\n tuple.resolve = resolve;\n tuple.reject = reject;\n });\n return tuple;\n};\n\nmodule.exports = Promise;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/promise.js\n// module id = 9\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n isURI: function(uri) {\n return uri && uri.protocol && uri.host && uri.path;\n },\n\n isSameOrigin: function(uri) {\n return uri.protocol === location.protocol &&\n uri.hostname === location.hostname &&\n uri.port === location.port;\n },\n\n parse: function(url) {\n if (typeof url !== 'string') return url;\n var uri = {}, parts, query, pairs, i, n, data;\n\n var consume = function(name, pattern) {\n url = url.replace(pattern, function(match) {\n uri[name] = match;\n return '';\n });\n uri[name] = uri[name] || '';\n };\n\n consume('protocol', /^[a-z]+\\:/i);\n consume('host', /^\\/\\/[^\\/\\?#]+/);\n\n if (!/^\\//.test(url) && !uri.host)\n url = location.pathname.replace(/[^\\/]*$/, '') + url;\n\n consume('pathname', /^[^\\?#]*/);\n consume('search', /^\\?[^#]*/);\n consume('hash', /^#.*/);\n\n uri.protocol = uri.protocol || location.protocol;\n\n if (uri.host) {\n uri.host = uri.host.substr(2);\n parts = uri.host.split(':');\n uri.hostname = parts[0];\n uri.port = parts[1] || '';\n } else {\n uri.host = location.host;\n uri.hostname = location.hostname;\n uri.port = location.port;\n }\n\n uri.pathname = uri.pathname || '/';\n uri.path = uri.pathname + uri.search;\n\n query = uri.search.replace(/^\\?/, '');\n pairs = query ? query.split('&') : [];\n data = {};\n\n for (i = 0, n = pairs.length; i < n; i++) {\n parts = pairs[i].split('=');\n data[decodeURIComponent(parts[0] || '')] = decodeURIComponent(parts[1] || '');\n }\n\n uri.query = data;\n\n uri.href = this.stringify(uri);\n return uri;\n },\n\n stringify: function(uri) {\n var string = uri.protocol + '//' + uri.hostname;\n if (uri.port) string += ':' + uri.port;\n string += uri.pathname + this.queryString(uri.query) + (uri.hash || '');\n return string;\n },\n\n queryString: function(query) {\n var pairs = [];\n for (var key in query) {\n if (!query.hasOwnProperty(key)) continue;\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(query[key]));\n }\n if (pairs.length === 0) return '';\n return '?' + pairs.join('&');\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/uri.js\n// module id = 10\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n commonElement: function(lista, listb) {\n for (var i = 0, n = lista.length; i < n; i++) {\n if (this.indexOf(listb, lista[i]) !== -1)\n return lista[i];\n }\n return null;\n },\n\n indexOf: function(list, needle) {\n if (list.indexOf) return list.indexOf(needle);\n\n for (var i = 0, n = list.length; i < n; i++) {\n if (list[i] === needle) return i;\n }\n return -1;\n },\n\n map: function(object, callback, context) {\n if (object.map) return object.map(callback, context);\n var result = [];\n\n if (object instanceof Array) {\n for (var i = 0, n = object.length; i < n; i++) {\n result.push(callback.call(context || null, object[i], i));\n }\n } else {\n for (var key in object) {\n if (!object.hasOwnProperty(key)) continue;\n result.push(callback.call(context || null, key, object[key]));\n }\n }\n return result;\n },\n\n filter: function(array, callback, context) {\n if (array.filter) return array.filter(callback, context);\n var result = [];\n for (var i = 0, n = array.length; i < n; i++) {\n if (callback.call(context || null, array[i], i))\n result.push(array[i]);\n }\n return result;\n },\n\n asyncEach: function(list, iterator, callback, context) {\n var n = list.length,\n i = -1,\n calls = 0,\n looping = false;\n\n var iterate = function() {\n calls -= 1;\n i += 1;\n if (i === n) return callback && callback.call(context);\n iterator(list[i], resume);\n };\n\n var loop = function() {\n if (looping) return;\n looping = true;\n while (calls > 0) iterate();\n looping = false;\n };\n\n var resume = function() {\n calls += 1;\n loop();\n };\n resume();\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/array.js\n// module id = 11\n// module chunks = 0","'use strict';\n\nvar Event = {\n _registry: [],\n\n on: function(element, eventName, callback, context) {\n var wrapped = function() { callback.call(context) };\n\n if (element.addEventListener)\n element.addEventListener(eventName, wrapped, false);\n else\n element.attachEvent('on' + eventName, wrapped);\n\n this._registry.push({\n _element: element,\n _type: eventName,\n _callback: callback,\n _context: context,\n _handler: wrapped\n });\n },\n\n detach: function(element, eventName, callback, context) {\n var i = this._registry.length, register;\n while (i--) {\n register = this._registry[i];\n\n if ((element && element !== register._element) ||\n (eventName && eventName !== register._type) ||\n (callback && callback !== register._callback) ||\n (context && context !== register._context))\n continue;\n\n if (register._element.removeEventListener)\n register._element.removeEventListener(register._type, register._handler, false);\n else\n register._element.detachEvent('on' + register._type, register._handler);\n\n this._registry.splice(i,1);\n register = null;\n }\n }\n};\n\nif (global.onunload !== undefined)\n Event.on(global, 'unload', Event.detach, Event);\n\nmodule.exports = {\n Event: Event\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/browser/event.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nvar array = require('./array');\n\nmodule.exports = function(options, validKeys) {\n for (var key in options) {\n if (array.indexOf(validKeys, key) < 0)\n throw new Error('Unrecognized option: ' + key);\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/validate_options.js\n// module id = 13\n// module chunks = 0","'use strict';\n\nvar Promise = require('../util/promise');\n\nmodule.exports = {\n then: function(callback, errback) {\n var self = this;\n if (!this._promise)\n this._promise = new Promise(function(resolve, reject) {\n self._resolve = resolve;\n self._reject = reject;\n });\n\n if (arguments.length === 0)\n return this._promise;\n else\n return this._promise.then(callback, errback);\n },\n\n callback: function(callback, context) {\n return this.then(function(value) { callback.call(context, value) });\n },\n\n errback: function(callback, context) {\n return this.then(null, function(reason) { callback.call(context, reason) });\n },\n\n timeout: function(seconds, message) {\n this.then();\n var self = this;\n this._timer = global.setTimeout(function() {\n self._reject(message);\n }, seconds * 1000);\n },\n\n setDeferredStatus: function(status, value) {\n if (this._timer) global.clearTimeout(this._timer);\n\n this.then();\n\n if (status === 'succeeded')\n this._resolve(value);\n else if (status === 'failed')\n this._reject(value);\n else\n delete this._promise;\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mixins/deferrable.js\n// module id = 14\n// module chunks = 0","'use strict';\n\nvar extend = require('../util/extend'),\n EventEmitter = require('../util/event_emitter');\n\nvar Publisher = {\n countListeners: function(eventType) {\n return this.listeners(eventType).length;\n },\n\n bind: function(eventType, listener, context) {\n var slice = Array.prototype.slice,\n handler = function() { listener.apply(context, slice.call(arguments)) };\n\n this._listeners = this._listeners || [];\n this._listeners.push([eventType, listener, context, handler]);\n return this.on(eventType, handler);\n },\n\n unbind: function(eventType, listener, context) {\n this._listeners = this._listeners || [];\n var n = this._listeners.length, tuple;\n\n while (n--) {\n tuple = this._listeners[n];\n if (tuple[0] !== eventType) continue;\n if (listener && (tuple[1] !== listener || tuple[2] !== context)) continue;\n this._listeners.splice(n, 1);\n this.removeListener(eventType, tuple[3]);\n }\n }\n};\n\nextend(Publisher, EventEmitter.prototype);\nPublisher.trigger = Publisher.emit;\n\nmodule.exports = Publisher;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mixins/publisher.js\n// module id = 15\n// module chunks = 0","/*\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nvar isArray = typeof Array.isArray === 'function'\n ? Array.isArray\n : function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]'\n }\n;\nfunction indexOf (xs, x) {\n if (xs.indexOf) return xs.indexOf(x);\n for (var i = 0; i < xs.length; i++) {\n if (x === xs[i]) return i;\n }\n return -1;\n}\n\nfunction EventEmitter() {}\nmodule.exports = EventEmitter;\n\nEventEmitter.prototype.emit = function(type) {\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events || !this._events.error ||\n (isArray(this._events.error) && !this._events.error.length))\n {\n if (arguments[1] instanceof Error) {\n throw arguments[1]; // Unhandled 'error' event\n } else {\n throw new Error(\"Uncaught, unspecified 'error' event.\");\n }\n return false;\n }\n }\n\n if (!this._events) return false;\n var handler = this._events[type];\n if (!handler) return false;\n\n if (typeof handler == 'function') {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n var args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n return true;\n\n } else if (isArray(handler)) {\n var args = Array.prototype.slice.call(arguments, 1);\n\n var listeners = handler.slice();\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i].apply(this, args);\n }\n return true;\n\n } else {\n return false;\n }\n};\n\n// EventEmitter is defined in src/node_events.cc\n// EventEmitter.prototype.emit() is also defined there.\nEventEmitter.prototype.addListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('addListener only takes instances of Function');\n }\n\n if (!this._events) this._events = {};\n\n // To avoid recursion in the case that type == \"newListeners\"! Before\n // adding it to the listeners, first emit \"newListeners\".\n this.emit('newListener', type, listener);\n\n if (!this._events[type]) {\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n } else if (isArray(this._events[type])) {\n // If we've already got an array, just append.\n this._events[type].push(listener);\n } else {\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n var self = this;\n self.on(type, function g() {\n self.removeListener(type, g);\n listener.apply(this, arguments);\n });\n\n return this;\n};\n\nEventEmitter.prototype.removeListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('removeListener only takes instances of Function');\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (!this._events || !this._events[type]) return this;\n\n var list = this._events[type];\n\n if (isArray(list)) {\n var i = indexOf(list, listener);\n if (i < 0) return this;\n list.splice(i, 1);\n if (list.length == 0)\n delete this._events[type];\n } else if (this._events[type] === listener) {\n delete this._events[type];\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n if (arguments.length === 0) {\n this._events = {};\n return this;\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (type && this._events && this._events[type]) this._events[type] = null;\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n if (!this._events) this._events = {};\n if (!this._events[type]) this._events[type] = [];\n if (!isArray(this._events[type])) {\n this._events[type] = [this._events[type]];\n }\n return this._events[type];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/event_emitter.js\n// module id = 16\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Publisher = require('../mixins/publisher'),\n Grammar = require('./grammar');\n\nvar Channel = Class({\n initialize: function(name) {\n this.id = this.name = name;\n },\n\n push: function(message) {\n this.trigger('message', message);\n },\n\n isUnused: function() {\n return this.countListeners('message') === 0;\n }\n});\n\nextend(Channel.prototype, Publisher);\n\nextend(Channel, {\n HANDSHAKE: '/meta/handshake',\n CONNECT: '/meta/connect',\n SUBSCRIBE: '/meta/subscribe',\n UNSUBSCRIBE: '/meta/unsubscribe',\n DISCONNECT: '/meta/disconnect',\n\n META: 'meta',\n SERVICE: 'service',\n\n expand: function(name) {\n var segments = this.parse(name),\n channels = ['/**', name];\n\n var copy = segments.slice();\n copy[copy.length - 1] = '*';\n channels.push(this.unparse(copy));\n\n for (var i = 1, n = segments.length; i < n; i++) {\n copy = segments.slice(0, i);\n copy.push('**');\n channels.push(this.unparse(copy));\n }\n\n return channels;\n },\n\n isValid: function(name) {\n return Grammar.CHANNEL_NAME.test(name) ||\n Grammar.CHANNEL_PATTERN.test(name);\n },\n\n parse: function(name) {\n if (!this.isValid(name)) return null;\n return name.split('/').slice(1);\n },\n\n unparse: function(segments) {\n return '/' + segments.join('/');\n },\n\n isMeta: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.META) : null;\n },\n\n isService: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.SERVICE) : null;\n },\n\n isSubscribable: function(name) {\n if (!this.isValid(name)) return null;\n return !this.isMeta(name) && !this.isService(name);\n },\n\n Set: Class({\n initialize: function() {\n this._channels = {};\n },\n\n getKeys: function() {\n var keys = [];\n for (var key in this._channels) keys.push(key);\n return keys;\n },\n\n remove: function(name) {\n delete this._channels[name];\n },\n\n hasSubscription: function(name) {\n return this._channels.hasOwnProperty(name);\n },\n\n subscribe: function(names, subscription) {\n var name;\n for (var i = 0, n = names.length; i < n; i++) {\n name = names[i];\n var channel = this._channels[name] = this._channels[name] || new Channel(name);\n channel.bind('message', subscription);\n }\n },\n\n unsubscribe: function(name, subscription) {\n var channel = this._channels[name];\n if (!channel) return false;\n channel.unbind('message', subscription);\n\n if (channel.isUnused()) {\n this.remove(name);\n return true;\n } else {\n return false;\n }\n },\n\n distributeMessage: function(message) {\n var channels = Channel.expand(message.channel);\n\n for (var i = 0, n = channels.length; i < n; i++) {\n var channel = this._channels[channels[i]];\n if (channel) channel.trigger('message', message);\n }\n }\n })\n});\n\nmodule.exports = Channel;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/channel.js\n// module id = 17\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n CHANNEL_NAME: /^\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*$/,\n CHANNEL_PATTERN: /^(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*\\/\\*{1,2}$/,\n ERROR: /^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*(,(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)$/,\n VERSION: /^([0-9])+(\\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\\-|\\_))*)*$/\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/grammar.js\n// module id = 18\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n cookies = require('../util/cookies'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Transport = require('../transport'),\n Scheduler = require('./scheduler');\n\nvar Dispatcher = Class({ className: 'Dispatcher',\n MAX_REQUEST_SIZE: 2048,\n DEFAULT_RETRY: 5,\n\n UP: 1,\n DOWN: 2,\n\n initialize: function(client, endpoint, options) {\n this._client = client;\n this.endpoint = URI.parse(endpoint);\n this._alternates = options.endpoints || {};\n\n this.cookies = cookies.CookieJar && new cookies.CookieJar();\n this._disabled = [];\n this._envelopes = {};\n this.headers = {};\n this.retry = options.retry || this.DEFAULT_RETRY;\n this._scheduler = options.scheduler || Scheduler;\n this._state = 0;\n this.transports = {};\n this.wsExtensions = [];\n\n this.proxy = options.proxy || {};\n if (typeof this._proxy === 'string') this._proxy = {origin: this._proxy};\n\n var exts = options.websocketExtensions;\n if (exts) {\n exts = [].concat(exts);\n for (var i = 0, n = exts.length; i < n; i++)\n this.addWebsocketExtension(exts[i]);\n }\n\n this.tls = options.tls || {};\n this.tls.ca = this.tls.ca || options.ca;\n\n for (var type in this._alternates)\n this._alternates[type] = URI.parse(this._alternates[type]);\n\n this.maxRequestSize = this.MAX_REQUEST_SIZE;\n },\n\n endpointFor: function(connectionType) {\n return this._alternates[connectionType] || this.endpoint;\n },\n\n addWebsocketExtension: function(extension) {\n this.wsExtensions.push(extension);\n },\n\n disable: function(feature) {\n this._disabled.push(feature);\n },\n\n setHeader: function(name, value) {\n this.headers[name] = value;\n },\n\n close: function() {\n var transport = this._transport;\n delete this._transport;\n if (transport) transport.close();\n },\n\n getConnectionTypes: function() {\n return Transport.getConnectionTypes();\n },\n\n selectTransport: function(transportTypes) {\n Transport.get(this, transportTypes, this._disabled, function(transport) {\n this.debug('Selected ? transport for ?', transport.connectionType, URI.stringify(transport.endpoint));\n\n if (transport === this._transport) return;\n if (this._transport) this._transport.close();\n\n this._transport = transport;\n this.connectionType = transport.connectionType;\n }, this);\n },\n\n sendMessage: function(message, timeout, options) {\n options = options || {};\n\n var id = message.id,\n attempts = options.attempts,\n deadline = options.deadline && new Date().getTime() + (options.deadline * 1000),\n envelope = this._envelopes[id],\n scheduler;\n\n if (!envelope) {\n scheduler = new this._scheduler(message, {timeout: timeout, interval: this.retry, attempts: attempts, deadline: deadline});\n envelope = this._envelopes[id] = {message: message, scheduler: scheduler};\n }\n\n this._sendEnvelope(envelope);\n },\n\n _sendEnvelope: function(envelope) {\n if (!this._transport) return;\n if (envelope.request || envelope.timer) return;\n\n var message = envelope.message,\n scheduler = envelope.scheduler,\n self = this;\n\n if (!scheduler.isDeliverable()) {\n scheduler.abort();\n delete this._envelopes[message.id];\n return;\n }\n\n envelope.timer = global.setTimeout(function() {\n self.handleError(message);\n }, scheduler.getTimeout() * 1000);\n\n scheduler.send();\n envelope.request = this._transport.sendMessage(message);\n },\n\n handleResponse: function(reply) {\n var envelope = this._envelopes[reply.id];\n\n if (reply.successful !== undefined && envelope) {\n envelope.scheduler.succeed();\n delete this._envelopes[reply.id];\n global.clearTimeout(envelope.timer);\n }\n\n this.trigger('message', reply);\n\n if (this._state === this.UP) return;\n this._state = this.UP;\n this._client.trigger('transport:up');\n },\n\n handleError: function(message, immediate) {\n var envelope = this._envelopes[message.id],\n request = envelope && envelope.request,\n self = this;\n\n if (!request) return;\n\n request.then(function(req) {\n if (req && req.abort) req.abort();\n });\n\n var scheduler = envelope.scheduler;\n scheduler.fail();\n\n global.clearTimeout(envelope.timer);\n envelope.request = envelope.timer = null;\n\n if (immediate) {\n this._sendEnvelope(envelope);\n } else {\n envelope.timer = global.setTimeout(function() {\n envelope.timer = null;\n self._sendEnvelope(envelope);\n }, scheduler.getInterval() * 1000);\n }\n\n if (this._state === this.DOWN) return;\n this._state = this.DOWN;\n this._client.trigger('transport:down');\n }\n});\n\nDispatcher.create = function(client, endpoint, options) {\n return new Dispatcher(client, endpoint, options);\n};\n\nextend(Dispatcher.prototype, Publisher);\nextend(Dispatcher.prototype, Logging);\n\nmodule.exports = Dispatcher;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/dispatcher.js\n// module id = 19\n// module chunks = 0","'use strict';\n\nmodule.exports = {};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/cookies/browser_cookies.js\n// module id = 20\n// module chunks = 0","'use strict';\n\nvar Transport = require('./transport');\n\nTransport.register('websocket', require('./web_socket'));\nTransport.register('eventsource', require('./event_source'));\nTransport.register('long-polling', require('./xhr'));\nTransport.register('cross-origin-long-polling', require('./cors'));\nTransport.register('callback-polling', require('./jsonp'));\n\nmodule.exports = Transport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/browser_transports.js\n// module id = 21\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Cookie = require('../util/cookies').Cookie,\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Timeouts = require('../mixins/timeouts'),\n Channel = require('../protocol/channel');\n\nvar Transport = extend(Class({ className: 'Transport',\n DEFAULT_PORTS: {'http:': 80, 'https:': 443, 'ws:': 80, 'wss:': 443},\n MAX_DELAY: 0,\n\n batching: true,\n\n initialize: function(dispatcher, endpoint) {\n this._dispatcher = dispatcher;\n this.endpoint = endpoint;\n this._outbox = [];\n this._proxy = extend({}, this._dispatcher.proxy);\n\n if (!this._proxy.origin)\n this._proxy.origin = this._findProxy();\n },\n\n close: function() {},\n\n encode: function(messages) {\n return '';\n },\n\n sendMessage: function(message) {\n this.debug('Client ? sending message to ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), message);\n\n if (!this.batching) return Promise.resolve(this.request([message]));\n\n this._outbox.push(message);\n this._flushLargeBatch();\n\n if (message.channel === Channel.HANDSHAKE)\n return this._publish(0.01);\n\n if (message.channel === Channel.CONNECT)\n this._connectMessage = message;\n\n return this._publish(this.MAX_DELAY);\n },\n\n _makePromise: function() {\n var self = this;\n\n this._requestPromise = this._requestPromise || new Promise(function(resolve) {\n self._resolvePromise = resolve;\n });\n },\n\n _publish: function(delay) {\n this._makePromise();\n\n this.addTimeout('publish', delay, function() {\n this._flush();\n delete this._requestPromise;\n }, this);\n\n return this._requestPromise;\n },\n\n _flush: function() {\n this.removeTimeout('publish');\n\n if (this._outbox.length > 1 && this._connectMessage)\n this._connectMessage.advice = {timeout: 0};\n\n this._resolvePromise(this.request(this._outbox));\n\n this._connectMessage = null;\n this._outbox = [];\n },\n\n _flushLargeBatch: function() {\n var string = this.encode(this._outbox);\n if (string.length < this._dispatcher.maxRequestSize) return;\n var last = this._outbox.pop();\n\n this._makePromise();\n this._flush();\n\n if (last) this._outbox.push(last);\n },\n\n _receive: function(replies) {\n if (!replies) return;\n replies = [].concat(replies);\n\n this.debug('Client ? received from ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, replies);\n\n for (var i = 0, n = replies.length; i < n; i++)\n this._dispatcher.handleResponse(replies[i]);\n },\n\n _handleError: function(messages, immediate) {\n messages = [].concat(messages);\n\n this.debug('Client ? failed to send to ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, messages);\n\n for (var i = 0, n = messages.length; i < n; i++)\n this._dispatcher.handleError(messages[i]);\n },\n\n _getCookies: function() {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint);\n\n if (!cookies) return '';\n\n return array.map(cookies.getCookiesSync(url), function(cookie) {\n return cookie.cookieString();\n }).join('; ');\n },\n\n _storeCookies: function(setCookie) {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint),\n cookie;\n\n if (!setCookie || !cookies) return;\n setCookie = [].concat(setCookie);\n\n for (var i = 0, n = setCookie.length; i < n; i++) {\n cookie = Cookie.parse(setCookie[i]);\n cookies.setCookieSync(cookie, url);\n }\n },\n\n _findProxy: function() {\n if (typeof process === 'undefined') return undefined;\n\n var protocol = this.endpoint.protocol;\n if (!protocol) return undefined;\n\n var name = protocol.replace(/:$/, '').toLowerCase() + '_proxy',\n upcase = name.toUpperCase(),\n env = process.env,\n keys, proxy;\n\n if (name === 'http_proxy' && env.REQUEST_METHOD) {\n keys = Object.keys(env).filter(function(k) { return /^http_proxy$/i.test(k) });\n if (keys.length === 1) {\n if (keys[0] === name && env[upcase] === undefined)\n proxy = env[name];\n } else if (keys.length > 1) {\n proxy = env[name];\n }\n proxy = proxy || env['CGI_' + upcase];\n } else {\n proxy = env[name] || env[upcase];\n if (proxy && !env[name])\n console.warn('The environment variable ' + upcase +\n ' is discouraged. Use ' + name + '.');\n }\n return proxy;\n }\n\n}), {\n get: function(dispatcher, allowed, disabled, callback, context) {\n var endpoint = dispatcher.endpoint;\n\n array.asyncEach(this._transports, function(pair, resume) {\n var connType = pair[0], klass = pair[1],\n connEndpoint = dispatcher.endpointFor(connType);\n\n if (array.indexOf(disabled, connType) >= 0)\n return resume();\n\n if (array.indexOf(allowed, connType) < 0) {\n klass.isUsable(dispatcher, connEndpoint, function() {});\n return resume();\n }\n\n klass.isUsable(dispatcher, connEndpoint, function(isUsable) {\n if (!isUsable) return resume();\n var transport = klass.hasOwnProperty('create') ? klass.create(dispatcher, connEndpoint) : new klass(dispatcher, connEndpoint);\n callback.call(context, transport);\n });\n }, function() {\n throw new Error('Could not find a usable connection type for ' + URI.stringify(endpoint));\n });\n },\n\n register: function(type, klass) {\n this._transports.push([type, klass]);\n klass.prototype.connectionType = type;\n },\n\n getConnectionTypes: function() {\n return array.map(this._transports, function(t) { return t[0] });\n },\n\n _transports: []\n});\n\nextend(Transport.prototype, Logging);\nextend(Transport.prototype, Timeouts);\n\nmodule.exports = Transport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/transport.js\n// module id = 22\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n addTimeout: function(name, delay, callback, context) {\n this._timeouts = this._timeouts || {};\n if (this._timeouts.hasOwnProperty(name)) return;\n var self = this;\n this._timeouts[name] = global.setTimeout(function() {\n delete self._timeouts[name];\n callback.call(context);\n }, 1000 * delay);\n },\n\n removeTimeout: function(name) {\n this._timeouts = this._timeouts || {};\n var timeout = this._timeouts[name];\n if (!timeout) return;\n global.clearTimeout(timeout);\n delete this._timeouts[name];\n },\n\n removeAllTimeouts: function() {\n this._timeouts = this._timeouts || {};\n for (var name in this._timeouts) this.removeTimeout(name);\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mixins/timeouts.js\n// module id = 23\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Promise = require('../util/promise'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n ws = require('../util/websocket'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport');\n\nvar WebSocket = extend(Class(Transport, {\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n\n batching: false,\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n this.connect();\n },\n\n request: function(messages) {\n this._pending = this._pending || new Set();\n for (var i = 0, n = messages.length; i < n; i++) this._pending.add(messages[i]);\n\n var self = this;\n\n var promise = new Promise(function(resolve, reject) {\n self.callback(function(socket) {\n if (!socket || socket.readyState !== 1) return;\n socket.send(toJSON(messages));\n resolve(socket);\n });\n\n self.connect();\n });\n\n return {\n abort: function() { promise.then(function(ws) { ws.close() }) }\n };\n },\n\n connect: function() {\n if (WebSocket._unloaded) return;\n\n this._state = this._state || this.UNCONNECTED;\n if (this._state !== this.UNCONNECTED) return;\n this._state = this.CONNECTING;\n\n var socket = this._createSocket();\n if (!socket) return this.setDeferredStatus('failed');\n\n var self = this;\n\n socket.onopen = function() {\n if (socket.headers) self._storeCookies(socket.headers['set-cookie']);\n self._socket = socket;\n self._state = self.CONNECTED;\n self._everConnected = true;\n self._ping();\n self.setDeferredStatus('succeeded', socket);\n };\n\n var closed = false;\n socket.onclose = socket.onerror = function() {\n if (closed) return;\n closed = true;\n\n var wasConnected = (self._state === self.CONNECTED);\n socket.onopen = socket.onclose = socket.onerror = socket.onmessage = null;\n\n delete self._socket;\n self._state = self.UNCONNECTED;\n self.removeTimeout('ping');\n\n var pending = self._pending ? self._pending.toArray() : [];\n delete self._pending;\n\n if (wasConnected || self._everConnected) {\n self.setDeferredStatus('unknown');\n self._handleError(pending, wasConnected);\n } else {\n self.setDeferredStatus('failed');\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (!replies) return;\n\n replies = [].concat(replies);\n\n for (var i = 0, n = replies.length; i < n; i++) {\n if (replies[i].successful === undefined) continue;\n self._pending.remove(replies[i]);\n }\n self._receive(replies);\n };\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.close();\n },\n\n _createSocket: function() {\n var url = WebSocket.getSocketUrl(this.endpoint),\n headers = this._dispatcher.headers,\n extensions = this._dispatcher.wsExtensions,\n cookie = this._getCookies(),\n tls = this._dispatcher.tls,\n options = {extensions: extensions, headers: headers, proxy: this._proxy, tls: tls};\n\n if (cookie !== '') options.headers['Cookie'] = cookie;\n\n return ws.create(url, [], options);\n },\n\n _ping: function() {\n if (!this._socket || this._socket.readyState !== 1) return;\n this._socket.send('[]');\n this.addTimeout('ping', this._dispatcher.timeout / 2, this._ping, this);\n }\n\n}), {\n PROTOCOLS: {\n 'http:': 'ws:',\n 'https:': 'wss:'\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.websocket = dispatcher.transports.websocket || {};\n sockets[endpoint.href] = sockets[endpoint.href] || new this(dispatcher, endpoint);\n return sockets[endpoint.href];\n },\n\n getSocketUrl: function(endpoint) {\n endpoint = copyObject(endpoint);\n endpoint.protocol = this.PROTOCOLS[endpoint.protocol];\n return URI.stringify(endpoint);\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }\n});\n\nextend(WebSocket.prototype, Deferrable);\n\nif (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() { WebSocket._unloaded = true });\n\nmodule.exports = WebSocket;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/web_socket.js\n// module id = 24\n// module chunks = 0","'use strict';\n\nvar Class = require('./class');\n\nmodule.exports = Class({\n initialize: function() {\n this._index = {};\n },\n\n add: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n if (this._index.hasOwnProperty(key)) return false;\n this._index[key] = item;\n return true;\n },\n\n forEach: function(block, context) {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key))\n block.call(context, this._index[key]);\n }\n },\n\n isEmpty: function() {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key)) return false;\n }\n return true;\n },\n\n member: function(item) {\n for (var key in this._index) {\n if (this._index[key] === item) return true;\n }\n return false;\n },\n\n remove: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n var removed = this._index[key];\n delete this._index[key];\n return removed;\n },\n\n toArray: function() {\n var array = [];\n this.forEach(function(item) { array.push(item) });\n return array;\n }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/set.js\n// module id = 25\n// module chunks = 0","'use strict';\n\nvar copyObject = function(object) {\n var clone, i, key;\n if (object instanceof Array) {\n clone = [];\n i = object.length;\n while (i--) clone[i] = copyObject(object[i]);\n return clone;\n } else if (typeof object === 'object') {\n clone = (object === null) ? null : {};\n for (key in object) clone[key] = copyObject(object[key]);\n return clone;\n } else {\n return object;\n }\n};\n\nmodule.exports = copyObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/copy_object.js\n// module id = 26\n// module chunks = 0","'use strict';\n\nvar WS = global.MozWebSocket || global.WebSocket;\n\nmodule.exports = {\n create: function(url, protocols, options) {\n if (typeof WS !== 'function') return null;\n return new WS(url);\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/websocket/browser_websocket.js\n// module id = 27\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport'),\n XHR = require('./xhr');\n\nvar EventSource = extend(Class(Transport, {\n initialize: function(dispatcher, endpoint) {\n Transport.prototype.initialize.call(this, dispatcher, endpoint);\n if (!global.EventSource) return this.setDeferredStatus('failed');\n\n this._xhr = new XHR(dispatcher, endpoint);\n\n endpoint = copyObject(endpoint);\n endpoint.pathname += '/' + dispatcher.clientId;\n\n var socket = new global.EventSource(URI.stringify(endpoint)),\n self = this;\n\n socket.onopen = function() {\n self._everConnected = true;\n self.setDeferredStatus('succeeded');\n };\n\n socket.onerror = function() {\n if (self._everConnected) {\n self._handleError([]);\n } else {\n self.setDeferredStatus('failed');\n socket.close();\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError([]);\n };\n\n this._socket = socket;\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.onopen = this._socket.onerror = this._socket.onmessage = null;\n this._socket.close();\n delete this._socket;\n },\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n },\n\n encode: function(messages) {\n return this._xhr.encode(messages);\n },\n\n request: function(messages) {\n return this._xhr.request(messages);\n }\n\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var id = dispatcher.clientId;\n if (!id) return callback.call(context, false);\n\n XHR.isUsable(dispatcher, endpoint, function(usable) {\n if (!usable) return callback.call(context, false);\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }, this);\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.eventsource = dispatcher.transports.eventsource || {},\n id = dispatcher.clientId;\n\n var url = copyObject(endpoint);\n url.pathname += '/' + (id || '');\n url = URI.stringify(url);\n\n sockets[url] = sockets[url] || new this(dispatcher, endpoint);\n return sockets[url];\n }\n});\n\nextend(EventSource.prototype, Deferrable);\n\nmodule.exports = EventSource;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/event_source.js\n// module id = 28\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar XHR = extend(Class(Transport, {\n encode: function(messages) {\n return toJSON(messages);\n },\n\n request: function(messages) {\n var href = this.endpoint.href,\n self = this,\n xhr;\n\n // Prefer XMLHttpRequest over ActiveXObject if they both exist\n if (global.XMLHttpRequest) {\n xhr = new XMLHttpRequest();\n } else if (global.ActiveXObject) {\n xhr = new ActiveXObject('Microsoft.XMLHTTP');\n } else {\n return this._handleError(messages);\n }\n\n xhr.open('POST', href, true);\n xhr.setRequestHeader('Content-Type', 'application/json');\n xhr.setRequestHeader('Pragma', 'no-cache');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n var headers = this._dispatcher.headers;\n for (var key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n\n var abort = function() { xhr.abort() };\n if (global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {\n if (!xhr || xhr.readyState !== 4) return;\n\n var replies = null,\n status = xhr.status,\n text = xhr.responseText,\n successful = (status >= 200 && status < 300) || status === 304 || status === 1223;\n\n if (global.onbeforeunload !== undefined)\n browser.Event.detach(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {};\n xhr = null;\n\n if (!successful) return self._handleError(messages);\n\n try {\n replies = JSON.parse(text);\n } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var usable = (navigator.product === 'ReactNative')\n || URI.isSameOrigin(endpoint);\n\n callback.call(context, usable);\n }\n});\n\nmodule.exports = XHR;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/xhr.js\n// module id = 29\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar CORS = extend(Class(Transport, {\n encode: function(messages) {\n return 'message=' + encodeURIComponent(toJSON(messages));\n },\n\n request: function(messages) {\n var xhrClass = global.XDomainRequest ? XDomainRequest : XMLHttpRequest,\n xhr = new xhrClass(),\n id = ++CORS._id,\n headers = this._dispatcher.headers,\n self = this,\n key;\n\n xhr.open('POST', URI.stringify(this.endpoint), true);\n\n if (xhr.setRequestHeader) {\n xhr.setRequestHeader('Pragma', 'no-cache');\n for (key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n\n var cleanUp = function() {\n if (!xhr) return false;\n CORS._pending.remove(id);\n xhr.onload = xhr.onerror = xhr.ontimeout = xhr.onprogress = null;\n xhr = null;\n };\n\n xhr.onload = function() {\n var replies;\n try { replies = JSON.parse(xhr.responseText) } catch (error) {}\n\n cleanUp();\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.onerror = xhr.ontimeout = function() {\n cleanUp();\n self._handleError(messages);\n };\n\n xhr.onprogress = function() {};\n\n if (xhrClass === global.XDomainRequest)\n CORS._pending.add({id: id, xhr: xhr});\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n _id: 0,\n _pending: new Set(),\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n if (URI.isSameOrigin(endpoint))\n return callback.call(context, false);\n\n if (global.XDomainRequest)\n return callback.call(context, endpoint.protocol === location.protocol);\n\n if (global.XMLHttpRequest) {\n var xhr = new XMLHttpRequest();\n return callback.call(context, xhr.withCredentials !== undefined);\n }\n return callback.call(context, false);\n }\n});\n\nmodule.exports = CORS;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/cors.js\n// module id = 30\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar JSONP = extend(Class(Transport, {\n encode: function(messages) {\n var url = copyObject(this.endpoint);\n url.query.message = toJSON(messages);\n url.query.jsonp = '__jsonp' + JSONP._cbCount + '__';\n return URI.stringify(url);\n },\n\n request: function(messages) {\n var head = document.getElementsByTagName('head')[0],\n script = document.createElement('script'),\n callbackName = JSONP.getCallbackName(),\n endpoint = copyObject(this.endpoint),\n self = this;\n\n endpoint.query.message = toJSON(messages);\n endpoint.query.jsonp = callbackName;\n\n var cleanup = function() {\n if (!global[callbackName]) return false;\n global[callbackName] = undefined;\n try { delete global[callbackName] } catch (error) {}\n script.parentNode.removeChild(script);\n };\n\n global[callbackName] = function(replies) {\n cleanup();\n self._receive(replies);\n };\n\n script.type = 'text/javascript';\n script.src = URI.stringify(endpoint);\n head.appendChild(script);\n\n script.onerror = function() {\n cleanup();\n self._handleError(messages);\n };\n\n return {abort: cleanup};\n }\n}), {\n _cbCount: 0,\n\n getCallbackName: function() {\n this._cbCount += 1;\n return '__jsonp' + this._cbCount + '__';\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n callback.call(context, true);\n }\n});\n\nmodule.exports = JSONP;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/jsonp.js\n// module id = 31\n// module chunks = 0","'use strict';\n\nvar extend = require('../util/extend');\n\nvar Scheduler = function(message, options) {\n this.message = message;\n this.options = options;\n this.attempts = 0;\n};\n\nextend(Scheduler.prototype, {\n getTimeout: function() {\n return this.options.timeout;\n },\n\n getInterval: function() {\n return this.options.interval;\n },\n\n isDeliverable: function() {\n var attempts = this.options.attempts,\n made = this.attempts,\n deadline = this.options.deadline,\n now = new Date().getTime();\n\n if (attempts !== undefined && made >= attempts)\n return false;\n\n if (deadline !== undefined && now > deadline)\n return false;\n\n return true;\n },\n\n send: function() {\n this.attempts += 1;\n },\n\n succeed: function() {},\n\n fail: function() {},\n\n abort: function() {}\n});\n\nmodule.exports = Scheduler;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/scheduler.js\n// module id = 32\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Grammar = require('./grammar');\n\nvar Error = Class({\n initialize: function(code, params, message) {\n this.code = code;\n this.params = Array.prototype.slice.call(params);\n this.message = message;\n },\n\n toString: function() {\n return this.code + ':' +\n this.params.join(',') + ':' +\n this.message;\n }\n});\n\nError.parse = function(message) {\n message = message || '';\n if (!Grammar.ERROR.test(message)) return new Error(null, [], message);\n\n var parts = message.split(':'),\n code = parseInt(parts[0]),\n params = parts[1].split(','),\n message = parts[2];\n\n return new Error(code, params, message);\n};\n\n// http://code.google.com/p/cometd/wiki/BayeuxCodes\nvar errors = {\n versionMismatch: [300, 'Version mismatch'],\n conntypeMismatch: [301, 'Connection types not supported'],\n extMismatch: [302, 'Extension mismatch'],\n badRequest: [400, 'Bad request'],\n clientUnknown: [401, 'Unknown client'],\n parameterMissing: [402, 'Missing required parameter'],\n channelForbidden: [403, 'Forbidden channel'],\n channelUnknown: [404, 'Unknown channel'],\n channelInvalid: [405, 'Invalid channel'],\n extUnknown: [406, 'Unknown extension'],\n publishFailed: [407, 'Failed to publish'],\n serverError: [500, 'Internal server error']\n};\n\nfor (var name in errors)\n (function(name) {\n Error[name] = function() {\n return new Error(errors[name][0], arguments, errors[name][1]).toString();\n };\n })(name);\n\nmodule.exports = Error;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/error.js\n// module id = 33\n// module chunks = 0","'use strict';\n\nvar extend = require('../util/extend'),\n Logging = require('../mixins/logging');\n\nvar Extensible = {\n addExtension: function(extension) {\n this._extensions = this._extensions || [];\n this._extensions.push(extension);\n if (extension.added) extension.added(this);\n },\n\n removeExtension: function(extension) {\n if (!this._extensions) return;\n var i = this._extensions.length;\n while (i--) {\n if (this._extensions[i] !== extension) continue;\n this._extensions.splice(i,1);\n if (extension.removed) extension.removed(this);\n }\n },\n\n pipeThroughExtensions: function(stage, message, request, callback, context) {\n this.debug('Passing through ? extensions: ?', stage, message);\n\n if (!this._extensions) return callback.call(context, message);\n var extensions = this._extensions.slice();\n\n var pipe = function(message) {\n if (!message) return callback.call(context, message);\n\n var extension = extensions.shift();\n if (!extension) return callback.call(context, message);\n\n var fn = extension[stage];\n if (!fn) return pipe(message);\n\n if (fn.length >= 3) extension[stage](message, request, pipe);\n else extension[stage](message, pipe);\n };\n pipe(message);\n }\n};\n\nextend(Extensible, Logging);\n\nmodule.exports = Extensible;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/extensible.js\n// module id = 34\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Deferrable = require('../mixins/deferrable');\n\nmodule.exports = Class(Deferrable);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/publication.js\n// module id = 35\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable');\n\nvar Subscription = Class({\n initialize: function(client, channels, callback, context) {\n this._client = client;\n this._channels = channels;\n this._callback = callback;\n this._context = context;\n this._cancelled = false;\n },\n\n withChannel: function(callback, context) {\n this._withChannel = [callback, context];\n return this;\n },\n\n apply: function(context, args) {\n var message = args[0];\n\n if (this._callback)\n this._callback.call(this._context, message.data);\n\n if (this._withChannel)\n this._withChannel[0].call(this._withChannel[1], message.channel, message.data);\n },\n\n cancel: function() {\n if (this._cancelled) return;\n this._client.unsubscribe(this._channels, this);\n this._cancelled = true;\n },\n\n unsubscribe: function() {\n this.cancel();\n }\n});\n\nextend(Subscription.prototype, Deferrable);\n\nmodule.exports = Subscription;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/subscription.js\n// module id = 36\n// module chunks = 0"],"sourceRoot":""}faye-1.2.4/build/client/faye-browser-min.js.map0000644000175000017500000045253513425045757022107 0ustar utkarsh2102utkarsh2102{"version":3,"file":"faye-browser.js","sources":["webpack:///webpack/bootstrap 4a800f3df1972dc08ea2","webpack:///./src/faye_browser.js","webpack:///./src/util/constants.js","webpack:///./src/mixins/logging.js","webpack:///./src/util/to_json.js","webpack:///./src/protocol/client.js","webpack:///./~/asap/browser-asap.js","webpack:///./~/asap/browser-raw.js","webpack:///./src/util/class.js","webpack:///./src/util/extend.js","webpack:///./src/util/promise.js","webpack:///./src/util/uri.js","webpack:///./src/util/array.js","webpack:///./src/util/browser/event.js","webpack:///./src/util/validate_options.js","webpack:///./src/mixins/deferrable.js","webpack:///./src/mixins/publisher.js","webpack:///./src/util/event_emitter.js","webpack:///./src/protocol/channel.js","webpack:///./src/protocol/grammar.js","webpack:///./src/protocol/dispatcher.js","webpack:///./src/util/cookies/browser_cookies.js","webpack:///./src/transport/browser_transports.js","webpack:///./src/transport/transport.js","webpack:///./src/mixins/timeouts.js","webpack:///./src/transport/web_socket.js","webpack:///./src/util/set.js","webpack:///./src/util/copy_object.js","webpack:///./src/util/websocket/browser_websocket.js","webpack:///./src/transport/event_source.js","webpack:///./src/transport/xhr.js","webpack:///./src/transport/cors.js","webpack:///./src/transport/jsonp.js","webpack:///./src/protocol/scheduler.js","webpack:///./src/protocol/error.js","webpack:///./src/protocol/extensible.js","webpack:///./src/protocol/publication.js","webpack:///./src/protocol/subscription.js"],"names":["__webpack_require__","moduleId","installedModules","exports","module","id","loaded","modules","call","m","c","p","constants","Logging","Faye","VERSION","Client","Scheduler","wrapper","BAYEUX_VERSION","ID_LENGTH","JSONP_CALLBACK","CONNECTION_TYPES","MANDATORY_CONNECTION_TYPES","toJSON","LOG_LEVELS","fatal","error","warn","info","debug","writeLog","messageArgs","level","logger","args","Array","prototype","slice","apply","banner","klass","this","className","message","shift","replace","key","arguments","object","JSON","stringify","value","global","asap","Class","URI","array","browser","extend","validateOptions","Deferrable","Publisher","Channel","Dispatcher","Error","Extensible","Publication","Subscription","UNCONNECTED","CONNECTING","CONNECTED","DISCONNECTED","HANDSHAKE","RETRY","NONE","CONNECTION_TIMEOUT","DEFAULT_ENDPOINT","INTERVAL","initialize","endpoint","options","_channels","Set","_dispatcher","create","_messageId","_state","_responseCallbacks","_advice","reconnect","interval","timeout","bind","_receiveMessage","Event","undefined","onbeforeunload","on","indexOf","_disabled","disconnect","addWebsocketExtension","extension","disable","feature","setHeader","name","handshake","callback","context","self","selectTransport","_sendMessage","channel","version","supportedConnectionTypes","getConnectionTypes","response","successful","clientId","subscribe","getKeys","setTimeout","retry","connect","setDeferredStatus","_connectRequest","CONNECT","connectionType","_cycleConnection","promise","DISCONNECT","close","parse","map","subscription","force","hasSubscribe","hasSubscription","SUBSCRIBE","unsubscribe","channels","concat","dead","UNSUBSCRIBE","publish","data","publication","_generateMessageId","pipeThroughExtensions","sendMessage","Math","pow","toString","advice","_handleAdvice","_deliverMessage","distributeMessage","throwFirstError","pendingErrors","length","task","rawTask","freeTasks","pop","RawTask","rawAsap","requestErrorThrow","makeRequestCallFromTimer","onerror","push","queue","requestFlush","flushing","flush","index","currentIndex","capacity","scan","newLength","makeRequestCallFromMutationObserver","toggle","observer","BrowserMutationObserver","node","document","createTextNode","observe","characterData","handleTimer","clearTimeout","timeoutHandle","clearInterval","intervalHandle","setInterval","scope","MutationObserver","WebKitMutationObserver","parent","methods","Object","bridge","dest","source","overwrite","hasOwnProperty","PENDING","FULFILLED","REJECTED","RETURN","x","THROW","Promise","_onFulfilled","_onRejected","resolve","reason","reject","then","onFulfilled","onRejected","next","registerOnFulfilled","registerOnRejected","handler","invoke","_value","_reason","fn","_invoke","outcome","TypeError","type","called","fulfill","v","r","all","promises","i","list","n","race","deferred","pending","tuple","isURI","uri","protocol","host","path","isSameOrigin","location","hostname","port","url","parts","query","pairs","consume","pattern","match","test","pathname","substr","split","search","decodeURIComponent","href","string","queryString","hash","encodeURIComponent","join","commonElement","lista","listb","needle","result","filter","asyncEach","iterator","calls","looping","iterate","resume","loop","_registry","element","eventName","wrapped","addEventListener","attachEvent","_element","_type","_callback","_context","_handler","detach","register","removeEventListener","detachEvent","splice","onunload","validKeys","errback","_promise","_resolve","_reject","seconds","_timer","status","EventEmitter","countListeners","eventType","listeners","listener","_listeners","unbind","removeListener","trigger","emit","xs","isArray","_events","l","addListener","once","g","removeAllListeners","Grammar","isUnused","META","SERVICE","expand","segments","copy","unparse","isValid","CHANNEL_NAME","CHANNEL_PATTERN","isMeta","isService","isSubscribable","keys","remove","names","ERROR","cookies","Transport","MAX_REQUEST_SIZE","DEFAULT_RETRY","UP","DOWN","client","_client","_alternates","endpoints","CookieJar","_envelopes","headers","_scheduler","scheduler","transports","wsExtensions","proxy","_proxy","origin","exts","websocketExtensions","tls","ca","maxRequestSize","endpointFor","transport","_transport","transportTypes","get","attempts","deadline","Date","getTime","envelope","_sendEnvelope","request","timer","isDeliverable","abort","handleError","getTimeout","send","handleResponse","reply","succeed","immediate","req","fail","getInterval","Cookie","Timeouts","DEFAULT_PORTS","http:","https:","ws:","wss:","MAX_DELAY","batching","dispatcher","_outbox","_findProxy","encode","_flushLargeBatch","_publish","_connectMessage","_makePromise","_requestPromise","_resolvePromise","delay","addTimeout","_flush","removeTimeout","last","_receive","replies","_handleError","messages","_getCookies","getCookiesSync","cookie","cookieString","_storeCookies","setCookie","setCookieSync","process","toLowerCase","upcase","toUpperCase","env","REQUEST_METHOD","k","console","allowed","disabled","_transports","pair","connType","connEndpoint","isUsable","t","_timeouts","removeAllTimeouts","copyObject","ws","WebSocket","_pending","add","socket","readyState","_unloaded","_createSocket","onopen","_socket","_everConnected","_ping","closed","onclose","wasConnected","onmessage","toArray","event","getSocketUrl","extensions","PROTOCOLS","sockets","websocket","_index","item","forEach","block","isEmpty","member","removed","clone","WS","MozWebSocket","XHR","EventSource","_xhr","usable","eventsource","xhr","XMLHttpRequest","ActiveXObject","open","setRequestHeader","onreadystatechange","text","responseText","navigator","product","CORS","xhrClass","XDomainRequest","_id","cleanUp","onload","ontimeout","onprogress","withCredentials","JSONP","jsonp","_cbCount","head","getElementsByTagName","script","createElement","callbackName","getCallbackName","cleanup","parentNode","removeChild","src","appendChild","made","now","code","params","parseInt","errors","versionMismatch","conntypeMismatch","extMismatch","badRequest","clientUnknown","parameterMissing","channelForbidden","channelUnknown","channelInvalid","extUnknown","publishFailed","serverError","addExtension","_extensions","added","removeExtension","stage","pipe","_cancelled","withChannel","_withChannel","cancel"],"mappings":"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A;;AAEA;AACA;AACA;AACA,IAAG;AACH;;;;;;;ACRA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK,IAAI;;AAET;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,wCAAuC,yBAAyB;;AAEhE,QAAO;AACP;AACA,uCAAsC,oCAAoC;AAC1E;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yCAAwC,kCAAkC;;AAE1E;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK,IAAI;AACT,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK,IAAI;AACT;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAO,IAAI;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAO,IAAI;AACX;;AAEA;AACA;AACA,QAAO;AACP,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC;AACjC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAkE;AAClE,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC,iBAAiB;AACnD;AACA,EAAC;;AAED;AACA;AACA;AACA;;AAEA;;;;;;;;ACjYA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;;;;;;ACjEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAgE,kBAAkB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9NA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACXA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA0B,WAAW;AACrC,2BAA0B;;AAE1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0BAAyB,uBAAuB;AAChD,0BAAyB,uBAAuB;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kCAAiC;;AAEjC;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,mCAAkC;;AAElC;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA,oBAAmB,2BAA2B;AAC9C;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iDAAgD,iBAAiB;AACjE;;AAEA;AACA,iDAAgD,iBAAiB;AACjE;;AAEA;AACA;AACA;;AAEA;;AAEA,gBAAe,OAAO;AACtB;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL,IAAG;AACH;;AAEA;AACA;AACA,yCAAwC,OAAO;AAC/C;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;;;;;;;AChKA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,iBAAgB;;AAEhB;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kCAAiC,OAAO;AACxC;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AClFA;;AAEA;AACA;AACA,sCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,qCAAoC,OAAO;AAC3C;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA,yCAAwC,OAAO;AAC/C;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,sCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzEA;;AAEA;AACA;;AAEA;AACA,+BAA8B;;AAE9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;ACjDA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACTA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,uCAAsC,gCAAgC;AACtE,IAAG;;AAEH;AACA,8CAA6C,iCAAiC;AAC9E,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/CA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,+BAA8B;;AAE9B;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,eAAe;AAClC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA2B;AAC3B,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA,0CAAyC,OAAO;AAChD;AACA;AACA;;AAEA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1KA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yCAAwC,OAAO;AAC/C;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,wCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;;AAEL;AACA;;AAEA,2CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA,IAAG;AACH,EAAC;;AAED;;;;;;;ACnIA;;AAEA;AACA;AACA,qFAAoF,IAAI;AACxF;AACA;AACA;;;;;;;ACPA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAwB;AACxB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yDAAwD;;AAExD;AACA;AACA;AACA,uCAAsC,OAAO;AAC7C;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iDAAgD,+EAA+E;AAC/H,0CAAyC;AACzC;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACxLA;;AAEA;;;;;;;ACFA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACVA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA8B;AAC9B,mBAAkB,mDAAmD;AACrE;;AAEA;;AAEA;AACA;AACA;AACA;AACA,iCAAgC;;AAEhC;AACA;AACA,IAAG;;AAEH,uBAAsB;;AAEtB;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;;AAEA;AACA,sCAAqC;;AAErC;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA,wCAAuC,OAAO;AAC9C;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA,yCAAwC,OAAO;AAC/C;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK,SAAS;AACd,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0CAAyC,OAAO;AAChD;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mDAAkD,iCAAiC;AACnF;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;AACD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,+DAA8D;AAC9D;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA,qDAAoD,cAAc;AAClE,IAAG;;AAEH;AACA,EAAC;;AAED;AACA;;AAEA;;;;;;;AClNA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;;;;;;;ACzBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,+BAA8B,+BAA+B;AAC7D,8BAA6B,gCAAgC;AAC7D;AACA,IAAG;;AAEH;AACA;AACA,yCAAwC,OAAO;;AAE/C;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;;AAEL;AACA,0BAAyB,4BAA4B,aAAa;AAClE;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,YAAW,mCAAmC;;AAE9C;;AAEA;;AAEA,0CAAyC,OAAO;AAChD;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,uBAAsB;;AAEtB;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,EAAC;AACD;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA,wDAAuD,6BAA6B;;AAEpF;;;;;;;;AChKA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,kCAAiC,mBAAmB;AACpD;AACA;AACA,EAAC;;;;;;;ACjDD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;;;;;;;AClBA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACTA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,mCAAmC;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,+BAA8B,+BAA+B;AAC7D,8BAA6B,gCAAgC;AAC7D,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA,EAAC;AACD;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA,8FAA6F;AAC7F;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;;;;;;;;AChGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,6BAA4B;AAC5B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;;;;;;;;ACjFA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,yCAAyC;;AAEpD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,0BAAyB,iBAAiB;;AAE1C;AACA;AACA;AACA,EAAC;AACD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;;;;;;;ACnFA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,8BAA8B;AACzC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,aAAY;AACZ;AACA,EAAC;AACD;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;AAED;;;;;;;;AC/DA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH,yBAAwB;;AAExB,sBAAqB;;AAErB;AACA,EAAC;;AAED;;;;;;;AC7CA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;;;;;;ACtDA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;AC9CA;;AAEA;AACA;;AAEA;;;;;;;ACLA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;AAED;;AAEA","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4a800f3df1972dc08ea2","'use strict';\n\nvar constants = require('./util/constants'),\n Logging = require('./mixins/logging');\n\nvar Faye = {\n VERSION: constants.VERSION,\n\n Client: require('./protocol/client'),\n Scheduler: require('./protocol/scheduler')\n};\n\nLogging.wrapper = Faye;\n\nmodule.exports = Faye;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/faye_browser.js\n// module id = 0\n// module chunks = 0","module.exports = {\n VERSION: '1.2.4',\n\n BAYEUX_VERSION: '1.0',\n ID_LENGTH: 160,\n JSONP_CALLBACK: 'jsonpcallback',\n CONNECTION_TYPES: ['long-polling', 'cross-origin-long-polling', 'callback-polling', 'websocket', 'eventsource', 'in-process'],\n\n MANDATORY_CONNECTION_TYPES: ['long-polling', 'callback-polling', 'in-process']\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/constants.js\n// module id = 1\n// module chunks = 0","'use strict';\n\nvar toJSON = require('../util/to_json');\n\nvar Logging = {\n LOG_LEVELS: {\n fatal: 4,\n error: 3,\n warn: 2,\n info: 1,\n debug: 0\n },\n\n writeLog: function(messageArgs, level) {\n var logger = Logging.logger || (Logging.wrapper || Logging).logger;\n if (!logger) return;\n\n var args = Array.prototype.slice.apply(messageArgs),\n banner = '[Faye',\n klass = this.className,\n\n message = args.shift().replace(/\\?/g, function() {\n try {\n return toJSON(args.shift());\n } catch (error) {\n return '[Object]';\n }\n });\n\n if (klass) banner += '.' + klass;\n banner += '] ';\n\n if (typeof logger[level] === 'function')\n logger[level](banner + message);\n else if (typeof logger === 'function')\n logger(banner + message);\n }\n};\n\nfor (var key in Logging.LOG_LEVELS)\n (function(level) {\n Logging[level] = function() {\n this.writeLog(arguments, level);\n };\n })(key);\n\nmodule.exports = Logging;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mixins/logging.js\n// module id = 2\n// module chunks = 0","'use strict';\n\n// http://assanka.net/content/tech/2009/09/02/json2-js-vs-prototype/\n\nmodule.exports = function(object) {\n return JSON.stringify(object, function(key, value) {\n return (this[key] instanceof Array) ? this[key] : value;\n });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/to_json.js\n// module id = 3\n// module chunks = 0","'use strict';\n\nvar asap = require('asap'),\n Class = require('../util/class'),\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n browser = require('../util/browser'),\n constants = require('../util/constants'),\n extend = require('../util/extend'),\n validateOptions = require('../util/validate_options'),\n Deferrable = require('../mixins/deferrable'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Channel = require('./channel'),\n Dispatcher = require('./dispatcher'),\n Error = require('./error'),\n Extensible = require('./extensible'),\n Publication = require('./publication'),\n Subscription = require('./subscription');\n\nvar Client = Class({ className: 'Client',\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n DISCONNECTED: 4,\n\n HANDSHAKE: 'handshake',\n RETRY: 'retry',\n NONE: 'none',\n\n CONNECTION_TIMEOUT: 60,\n\n DEFAULT_ENDPOINT: '/bayeux',\n INTERVAL: 0,\n\n initialize: function(endpoint, options) {\n this.info('New client created for ?', endpoint);\n options = options || {};\n\n validateOptions(options, ['interval', 'timeout', 'endpoints', 'proxy', 'retry', 'scheduler', 'websocketExtensions', 'tls', 'ca']);\n\n this._channels = new Channel.Set();\n this._dispatcher = Dispatcher.create(this, endpoint || this.DEFAULT_ENDPOINT, options);\n\n this._messageId = 0;\n this._state = this.UNCONNECTED;\n\n this._responseCallbacks = {};\n\n this._advice = {\n reconnect: this.RETRY,\n interval: 1000 * (options.interval || this.INTERVAL),\n timeout: 1000 * (options.timeout || this.CONNECTION_TIMEOUT)\n };\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n this._dispatcher.bind('message', this._receiveMessage, this);\n\n if (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() {\n if (array.indexOf(this._dispatcher._disabled, 'autodisconnect') < 0)\n this.disconnect();\n }, this);\n },\n\n addWebsocketExtension: function(extension) {\n return this._dispatcher.addWebsocketExtension(extension);\n },\n\n disable: function(feature) {\n return this._dispatcher.disable(feature);\n },\n\n setHeader: function(name, value) {\n return this._dispatcher.setHeader(name, value);\n },\n\n // Request\n // MUST include: * channel\n // * version\n // * supportedConnectionTypes\n // MAY include: * minimumVersion\n // * ext\n // * id\n //\n // Success Response Failed Response\n // MUST include: * channel MUST include: * channel\n // * version * successful\n // * supportedConnectionTypes * error\n // * clientId MAY include: * supportedConnectionTypes\n // * successful * advice\n // MAY include: * minimumVersion * version\n // * advice * minimumVersion\n // * ext * ext\n // * id * id\n // * authSuccessful\n handshake: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state !== this.UNCONNECTED) return;\n\n this._state = this.CONNECTING;\n var self = this;\n\n this.info('Initiating handshake with ?', URI.stringify(this._dispatcher.endpoint));\n this._dispatcher.selectTransport(constants.MANDATORY_CONNECTION_TYPES);\n\n this._sendMessage({\n channel: Channel.HANDSHAKE,\n version: constants.BAYEUX_VERSION,\n supportedConnectionTypes: this._dispatcher.getConnectionTypes()\n\n }, {}, function(response) {\n\n if (response.successful) {\n this._state = this.CONNECTED;\n this._dispatcher.clientId = response.clientId;\n\n this._dispatcher.selectTransport(response.supportedConnectionTypes);\n\n this.info('Handshake successful: ?', this._dispatcher.clientId);\n\n this.subscribe(this._channels.getKeys(), true);\n if (callback) asap(function() { callback.call(context) });\n\n } else {\n this.info('Handshake unsuccessful');\n global.setTimeout(function() { self.handshake(callback, context) }, this._dispatcher.retry * 1000);\n this._state = this.UNCONNECTED;\n }\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * connectionType * clientId\n // MAY include: * ext MAY include: * error\n // * id * advice\n // * ext\n // * id\n // * timestamp\n connect: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state === this.DISCONNECTED) return;\n\n if (this._state === this.UNCONNECTED)\n return this.handshake(function() { this.connect(callback, context) }, this);\n\n this.callback(callback, context);\n if (this._state !== this.CONNECTED) return;\n\n this.info('Calling deferred actions for ?', this._dispatcher.clientId);\n this.setDeferredStatus('succeeded');\n this.setDeferredStatus('unknown');\n\n if (this._connectRequest) return;\n this._connectRequest = true;\n\n this.info('Initiating connection for ?', this._dispatcher.clientId);\n\n this._sendMessage({\n channel: Channel.CONNECT,\n clientId: this._dispatcher.clientId,\n connectionType: this._dispatcher.connectionType\n\n }, {}, this._cycleConnection, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // MAY include: * ext * clientId\n // * id MAY include: * error\n // * ext\n // * id\n disconnect: function() {\n if (this._state !== this.CONNECTED) return;\n this._state = this.DISCONNECTED;\n\n this.info('Disconnecting ?', this._dispatcher.clientId);\n var promise = new Publication();\n\n this._sendMessage({\n channel: Channel.DISCONNECT,\n clientId: this._dispatcher.clientId\n\n }, {}, function(response) {\n if (response.successful) {\n this._dispatcher.close();\n promise.setDeferredStatus('succeeded');\n } else {\n promise.setDeferredStatus('failed', Error.parse(response.error));\n }\n }, this);\n\n this.info('Clearing channel listeners for ?', this._dispatcher.clientId);\n this._channels = new Channel.Set();\n\n return promise;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n subscribe: function(channel, callback, context) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.subscribe(c, callback, context);\n }, this);\n\n var subscription = new Subscription(this, channel, callback, context),\n force = (callback === true),\n hasSubscribe = this._channels.hasSubscription(channel);\n\n if (hasSubscribe && !force) {\n this._channels.subscribe([channel], subscription);\n subscription.setDeferredStatus('succeeded');\n return subscription;\n }\n\n this.connect(function() {\n this.info('Client ? attempting to subscribe to ?', this._dispatcher.clientId, channel);\n if (!force) this._channels.subscribe([channel], subscription);\n\n this._sendMessage({\n channel: Channel.SUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) {\n subscription.setDeferredStatus('failed', Error.parse(response.error));\n return this._channels.unsubscribe(channel, subscription);\n }\n\n var channels = [].concat(response.subscription);\n this.info('Subscription acknowledged for ? to ?', this._dispatcher.clientId, channels);\n subscription.setDeferredStatus('succeeded');\n }, this);\n }, this);\n\n return subscription;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n unsubscribe: function(channel, subscription) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.unsubscribe(c, subscription);\n }, this);\n\n var dead = this._channels.unsubscribe(channel, subscription);\n if (!dead) return;\n\n this.connect(function() {\n this.info('Client ? attempting to unsubscribe from ?', this._dispatcher.clientId, channel);\n\n this._sendMessage({\n channel: Channel.UNSUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) return;\n\n var channels = [].concat(response.subscription);\n this.info('Unsubscription acknowledged for ? from ?', this._dispatcher.clientId, channels);\n }, this);\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * data * successful\n // MAY include: * clientId MAY include: * id\n // * id * error\n // * ext * ext\n publish: function(channel, data, options) {\n validateOptions(options || {}, ['attempts', 'deadline']);\n var publication = new Publication();\n\n this.connect(function() {\n this.info('Client ? queueing published message to ?: ?', this._dispatcher.clientId, channel, data);\n\n this._sendMessage({\n channel: channel,\n data: data,\n clientId: this._dispatcher.clientId\n\n }, options, function(response) {\n if (response.successful)\n publication.setDeferredStatus('succeeded');\n else\n publication.setDeferredStatus('failed', Error.parse(response.error));\n }, this);\n }, this);\n\n return publication;\n },\n\n _sendMessage: function(message, options, callback, context) {\n message.id = this._generateMessageId();\n\n var timeout = this._advice.timeout\n ? 1.2 * this._advice.timeout / 1000\n : 1.2 * this._dispatcher.retry;\n\n this.pipeThroughExtensions('outgoing', message, null, function(message) {\n if (!message) return;\n if (callback) this._responseCallbacks[message.id] = [callback, context];\n this._dispatcher.sendMessage(message, timeout, options || {});\n }, this);\n },\n\n _generateMessageId: function() {\n this._messageId += 1;\n if (this._messageId >= Math.pow(2,32)) this._messageId = 0;\n return this._messageId.toString(36);\n },\n\n _receiveMessage: function(message) {\n var id = message.id, callback;\n\n if (message.successful !== undefined) {\n callback = this._responseCallbacks[id];\n delete this._responseCallbacks[id];\n }\n\n this.pipeThroughExtensions('incoming', message, null, function(message) {\n if (!message) return;\n if (message.advice) this._handleAdvice(message.advice);\n this._deliverMessage(message);\n if (callback) callback[0].call(callback[1], message);\n }, this);\n },\n\n _handleAdvice: function(advice) {\n extend(this._advice, advice);\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n if (this._advice.reconnect === this.HANDSHAKE && this._state !== this.DISCONNECTED) {\n this._state = this.UNCONNECTED;\n this._dispatcher.clientId = null;\n this._cycleConnection();\n }\n },\n\n _deliverMessage: function(message) {\n if (!message.channel || message.data === undefined) return;\n this.info('Client ? calling listeners for ? with ?', this._dispatcher.clientId, message.channel, message.data);\n this._channels.distributeMessage(message);\n },\n\n _cycleConnection: function() {\n if (this._connectRequest) {\n this._connectRequest = null;\n this.info('Closed connection for ?', this._dispatcher.clientId);\n }\n var self = this;\n global.setTimeout(function() { self.connect() }, this._advice.interval);\n }\n});\n\nextend(Client.prototype, Deferrable);\nextend(Client.prototype, Publisher);\nextend(Client.prototype, Logging);\nextend(Client.prototype, Extensible);\n\nmodule.exports = Client;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/client.js\n// module id = 4\n// module chunks = 0","\"use strict\";\n\n// rawAsap provides everything we need except exception management.\nvar rawAsap = require(\"./raw\");\n// RawTasks are recycled to reduce GC churn.\nvar freeTasks = [];\n// We queue errors to ensure they are thrown in right order (FIFO).\n// Array-as-queue is good enough here, since we are just dealing with exceptions.\nvar pendingErrors = [];\nvar requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);\n\nfunction throwFirstError() {\n if (pendingErrors.length) {\n throw pendingErrors.shift();\n }\n}\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with priority\n * over other events like animation, reflow, and repaint. An error thrown from an\n * event will not interrupt, nor even substantially slow down the processing of\n * other events, but will be rather postponed to a lower priority event.\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n var rawTask;\n if (freeTasks.length) {\n rawTask = freeTasks.pop();\n } else {\n rawTask = new RawTask();\n }\n rawTask.task = task;\n rawAsap(rawTask);\n}\n\n// We wrap tasks with recyclable task objects. A task object implements\n// `call`, just like a function.\nfunction RawTask() {\n this.task = null;\n}\n\n// The sole purpose of wrapping the task is to catch the exception and recycle\n// the task object after its single use.\nRawTask.prototype.call = function () {\n try {\n this.task.call();\n } catch (error) {\n if (asap.onerror) {\n // This hook exists purely for testing purposes.\n // Its name will be periodically randomized to break any code that\n // depends on its existence.\n asap.onerror(error);\n } else {\n // In a web browser, exceptions are not fatal. However, to avoid\n // slowing down the queue of pending tasks, we rethrow the error in a\n // lower priority turn.\n pendingErrors.push(error);\n requestErrorThrow();\n }\n } finally {\n this.task = null;\n freeTasks[freeTasks.length] = this;\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/asap/browser-asap.js\n// module id = 5\n// module chunks = 0","\"use strict\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n if (!queue.length) {\n requestFlush();\n flushing = true;\n }\n // Equivalent to push, but avoids a function call.\n queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n while (index < queue.length) {\n var currentIndex = index;\n // Advance the index before calling the task. This ensures that we will\n // begin flushing on the next task the task throws an error.\n index = index + 1;\n queue[currentIndex].call();\n // Prevent leaking memory for long chains of recursive calls to `asap`.\n // If we call `asap` within tasks scheduled by `asap`, the queue will\n // grow, but to avoid an O(n) walk for every task we execute, we don't\n // shift tasks off the queue after they have been executed.\n // Instead, we periodically shift 1024 tasks off the queue.\n if (index > capacity) {\n // Manually shift all values starting at the index back to the\n // beginning of the queue.\n for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n queue[scan] = queue[scan + index];\n }\n queue.length -= index;\n index = 0;\n }\n }\n queue.length = 0;\n index = 0;\n flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n var toggle = 1;\n var observer = new BrowserMutationObserver(callback);\n var node = document.createTextNode(\"\");\n observer.observe(node, {characterData: true});\n return function requestCall() {\n toggle = -toggle;\n node.data = toggle;\n };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n// var channel = new MessageChannel();\n// channel.port1.onmessage = callback;\n// return function requestCall() {\n// channel.port2.postMessage(0);\n// };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n// return function requestCall() {\n// setImmediate(callback);\n// };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n return function requestCall() {\n // We dispatch a timeout with a specified delay of 0 for engines that\n // can reliably accommodate that request. This will usually be snapped\n // to a 4 milisecond delay, but once we're flushing, there's no delay\n // between events.\n var timeoutHandle = setTimeout(handleTimer, 0);\n // However, since this timer gets frequently dropped in Firefox\n // workers, we enlist an interval handle that will try to fire\n // an event 20 times per second until it succeeds.\n var intervalHandle = setInterval(handleTimer, 50);\n\n function handleTimer() {\n // Whichever timer succeeds will cancel both timers and\n // execute the callback.\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n callback();\n }\n };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/asap/browser-raw.js\n// module id = 6\n// module chunks = 0","'use strict';\n\nvar extend = require('./extend');\n\nmodule.exports = function(parent, methods) {\n if (typeof parent !== 'function') {\n methods = parent;\n parent = Object;\n }\n\n var klass = function() {\n if (!this.initialize) return this;\n return this.initialize.apply(this, arguments) || this;\n };\n\n var bridge = function() {};\n bridge.prototype = parent.prototype;\n\n klass.prototype = new bridge();\n extend(klass.prototype, methods);\n\n return klass;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/class.js\n// module id = 7\n// module chunks = 0","'use strict';\n\nmodule.exports = function(dest, source, overwrite) {\n if (!source) return dest;\n for (var key in source) {\n if (!source.hasOwnProperty(key)) continue;\n if (dest.hasOwnProperty(key) && overwrite === false) continue;\n if (dest[key] !== source[key])\n dest[key] = source[key];\n }\n return dest;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/extend.js\n// module id = 8\n// module chunks = 0","'use strict';\n\nvar asap = require('asap');\n\nvar PENDING = 0,\n FULFILLED = 1,\n REJECTED = 2;\n\nvar RETURN = function(x) { return x },\n THROW = function(x) { throw x };\n\nvar Promise = function(task) {\n this._state = PENDING;\n this._onFulfilled = [];\n this._onRejected = [];\n\n if (typeof task !== 'function') return;\n var self = this;\n\n task(function(value) { resolve(self, value) },\n function(reason) { reject(self, reason) });\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n var next = new Promise();\n registerOnFulfilled(this, onFulfilled, next);\n registerOnRejected(this, onRejected, next);\n return next;\n};\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nvar registerOnFulfilled = function(promise, onFulfilled, next) {\n if (typeof onFulfilled !== 'function') onFulfilled = RETURN;\n var handler = function(value) { invoke(onFulfilled, value, next) };\n\n if (promise._state === PENDING) {\n promise._onFulfilled.push(handler);\n } else if (promise._state === FULFILLED) {\n handler(promise._value);\n }\n};\n\nvar registerOnRejected = function(promise, onRejected, next) {\n if (typeof onRejected !== 'function') onRejected = THROW;\n var handler = function(reason) { invoke(onRejected, reason, next) };\n\n if (promise._state === PENDING) {\n promise._onRejected.push(handler);\n } else if (promise._state === REJECTED) {\n handler(promise._reason);\n }\n};\n\nvar invoke = function(fn, value, next) {\n asap(function() { _invoke(fn, value, next) });\n};\n\nvar _invoke = function(fn, value, next) {\n var outcome;\n\n try {\n outcome = fn(value);\n } catch (error) {\n return reject(next, error);\n }\n\n if (outcome === next) {\n reject(next, new TypeError('Recursive promise chain detected'));\n } else {\n resolve(next, outcome);\n }\n};\n\nvar resolve = function(promise, value) {\n var called = false, type, then;\n\n try {\n type = typeof value;\n then = value !== null && (type === 'function' || type === 'object') && value.then;\n\n if (typeof then !== 'function') return fulfill(promise, value);\n\n then.call(value, function(v) {\n if (!(called ^ (called = true))) return;\n resolve(promise, v);\n }, function(r) {\n if (!(called ^ (called = true))) return;\n reject(promise, r);\n });\n } catch (error) {\n if (!(called ^ (called = true))) return;\n reject(promise, error);\n }\n};\n\nvar fulfill = function(promise, value) {\n if (promise._state !== PENDING) return;\n\n promise._state = FULFILLED;\n promise._value = value;\n promise._onRejected = [];\n\n var onFulfilled = promise._onFulfilled, fn;\n while (fn = onFulfilled.shift()) fn(value);\n};\n\nvar reject = function(promise, reason) {\n if (promise._state !== PENDING) return;\n\n promise._state = REJECTED;\n promise._reason = reason;\n promise._onFulfilled = [];\n\n var onRejected = promise._onRejected, fn;\n while (fn = onRejected.shift()) fn(reason);\n};\n\nPromise.resolve = function(value) {\n return new Promise(function(resolve, reject) { resolve(value) });\n};\n\nPromise.reject = function(reason) {\n return new Promise(function(resolve, reject) { reject(reason) });\n};\n\nPromise.all = function(promises) {\n return new Promise(function(resolve, reject) {\n var list = [], n = promises.length, i;\n\n if (n === 0) return resolve(list);\n\n for (i = 0; i < n; i++) (function(promise, i) {\n Promise.resolve(promise).then(function(value) {\n list[i] = value;\n if (--n === 0) resolve(list);\n }, reject);\n })(promises[i], i);\n });\n};\n\nPromise.race = function(promises) {\n return new Promise(function(resolve, reject) {\n for (var i = 0, n = promises.length; i < n; i++)\n Promise.resolve(promises[i]).then(resolve, reject);\n });\n};\n\nPromise.deferred = Promise.pending = function() {\n var tuple = {};\n\n tuple.promise = new Promise(function(resolve, reject) {\n tuple.resolve = resolve;\n tuple.reject = reject;\n });\n return tuple;\n};\n\nmodule.exports = Promise;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/promise.js\n// module id = 9\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n isURI: function(uri) {\n return uri && uri.protocol && uri.host && uri.path;\n },\n\n isSameOrigin: function(uri) {\n return uri.protocol === location.protocol &&\n uri.hostname === location.hostname &&\n uri.port === location.port;\n },\n\n parse: function(url) {\n if (typeof url !== 'string') return url;\n var uri = {}, parts, query, pairs, i, n, data;\n\n var consume = function(name, pattern) {\n url = url.replace(pattern, function(match) {\n uri[name] = match;\n return '';\n });\n uri[name] = uri[name] || '';\n };\n\n consume('protocol', /^[a-z]+\\:/i);\n consume('host', /^\\/\\/[^\\/\\?#]+/);\n\n if (!/^\\//.test(url) && !uri.host)\n url = location.pathname.replace(/[^\\/]*$/, '') + url;\n\n consume('pathname', /^[^\\?#]*/);\n consume('search', /^\\?[^#]*/);\n consume('hash', /^#.*/);\n\n uri.protocol = uri.protocol || location.protocol;\n\n if (uri.host) {\n uri.host = uri.host.substr(2);\n parts = uri.host.split(':');\n uri.hostname = parts[0];\n uri.port = parts[1] || '';\n } else {\n uri.host = location.host;\n uri.hostname = location.hostname;\n uri.port = location.port;\n }\n\n uri.pathname = uri.pathname || '/';\n uri.path = uri.pathname + uri.search;\n\n query = uri.search.replace(/^\\?/, '');\n pairs = query ? query.split('&') : [];\n data = {};\n\n for (i = 0, n = pairs.length; i < n; i++) {\n parts = pairs[i].split('=');\n data[decodeURIComponent(parts[0] || '')] = decodeURIComponent(parts[1] || '');\n }\n\n uri.query = data;\n\n uri.href = this.stringify(uri);\n return uri;\n },\n\n stringify: function(uri) {\n var string = uri.protocol + '//' + uri.hostname;\n if (uri.port) string += ':' + uri.port;\n string += uri.pathname + this.queryString(uri.query) + (uri.hash || '');\n return string;\n },\n\n queryString: function(query) {\n var pairs = [];\n for (var key in query) {\n if (!query.hasOwnProperty(key)) continue;\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(query[key]));\n }\n if (pairs.length === 0) return '';\n return '?' + pairs.join('&');\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/uri.js\n// module id = 10\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n commonElement: function(lista, listb) {\n for (var i = 0, n = lista.length; i < n; i++) {\n if (this.indexOf(listb, lista[i]) !== -1)\n return lista[i];\n }\n return null;\n },\n\n indexOf: function(list, needle) {\n if (list.indexOf) return list.indexOf(needle);\n\n for (var i = 0, n = list.length; i < n; i++) {\n if (list[i] === needle) return i;\n }\n return -1;\n },\n\n map: function(object, callback, context) {\n if (object.map) return object.map(callback, context);\n var result = [];\n\n if (object instanceof Array) {\n for (var i = 0, n = object.length; i < n; i++) {\n result.push(callback.call(context || null, object[i], i));\n }\n } else {\n for (var key in object) {\n if (!object.hasOwnProperty(key)) continue;\n result.push(callback.call(context || null, key, object[key]));\n }\n }\n return result;\n },\n\n filter: function(array, callback, context) {\n if (array.filter) return array.filter(callback, context);\n var result = [];\n for (var i = 0, n = array.length; i < n; i++) {\n if (callback.call(context || null, array[i], i))\n result.push(array[i]);\n }\n return result;\n },\n\n asyncEach: function(list, iterator, callback, context) {\n var n = list.length,\n i = -1,\n calls = 0,\n looping = false;\n\n var iterate = function() {\n calls -= 1;\n i += 1;\n if (i === n) return callback && callback.call(context);\n iterator(list[i], resume);\n };\n\n var loop = function() {\n if (looping) return;\n looping = true;\n while (calls > 0) iterate();\n looping = false;\n };\n\n var resume = function() {\n calls += 1;\n loop();\n };\n resume();\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/array.js\n// module id = 11\n// module chunks = 0","'use strict';\n\nvar Event = {\n _registry: [],\n\n on: function(element, eventName, callback, context) {\n var wrapped = function() { callback.call(context) };\n\n if (element.addEventListener)\n element.addEventListener(eventName, wrapped, false);\n else\n element.attachEvent('on' + eventName, wrapped);\n\n this._registry.push({\n _element: element,\n _type: eventName,\n _callback: callback,\n _context: context,\n _handler: wrapped\n });\n },\n\n detach: function(element, eventName, callback, context) {\n var i = this._registry.length, register;\n while (i--) {\n register = this._registry[i];\n\n if ((element && element !== register._element) ||\n (eventName && eventName !== register._type) ||\n (callback && callback !== register._callback) ||\n (context && context !== register._context))\n continue;\n\n if (register._element.removeEventListener)\n register._element.removeEventListener(register._type, register._handler, false);\n else\n register._element.detachEvent('on' + register._type, register._handler);\n\n this._registry.splice(i,1);\n register = null;\n }\n }\n};\n\nif (global.onunload !== undefined)\n Event.on(global, 'unload', Event.detach, Event);\n\nmodule.exports = {\n Event: Event\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/browser/event.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nvar array = require('./array');\n\nmodule.exports = function(options, validKeys) {\n for (var key in options) {\n if (array.indexOf(validKeys, key) < 0)\n throw new Error('Unrecognized option: ' + key);\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/validate_options.js\n// module id = 13\n// module chunks = 0","'use strict';\n\nvar Promise = require('../util/promise');\n\nmodule.exports = {\n then: function(callback, errback) {\n var self = this;\n if (!this._promise)\n this._promise = new Promise(function(resolve, reject) {\n self._resolve = resolve;\n self._reject = reject;\n });\n\n if (arguments.length === 0)\n return this._promise;\n else\n return this._promise.then(callback, errback);\n },\n\n callback: function(callback, context) {\n return this.then(function(value) { callback.call(context, value) });\n },\n\n errback: function(callback, context) {\n return this.then(null, function(reason) { callback.call(context, reason) });\n },\n\n timeout: function(seconds, message) {\n this.then();\n var self = this;\n this._timer = global.setTimeout(function() {\n self._reject(message);\n }, seconds * 1000);\n },\n\n setDeferredStatus: function(status, value) {\n if (this._timer) global.clearTimeout(this._timer);\n\n this.then();\n\n if (status === 'succeeded')\n this._resolve(value);\n else if (status === 'failed')\n this._reject(value);\n else\n delete this._promise;\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mixins/deferrable.js\n// module id = 14\n// module chunks = 0","'use strict';\n\nvar extend = require('../util/extend'),\n EventEmitter = require('../util/event_emitter');\n\nvar Publisher = {\n countListeners: function(eventType) {\n return this.listeners(eventType).length;\n },\n\n bind: function(eventType, listener, context) {\n var slice = Array.prototype.slice,\n handler = function() { listener.apply(context, slice.call(arguments)) };\n\n this._listeners = this._listeners || [];\n this._listeners.push([eventType, listener, context, handler]);\n return this.on(eventType, handler);\n },\n\n unbind: function(eventType, listener, context) {\n this._listeners = this._listeners || [];\n var n = this._listeners.length, tuple;\n\n while (n--) {\n tuple = this._listeners[n];\n if (tuple[0] !== eventType) continue;\n if (listener && (tuple[1] !== listener || tuple[2] !== context)) continue;\n this._listeners.splice(n, 1);\n this.removeListener(eventType, tuple[3]);\n }\n }\n};\n\nextend(Publisher, EventEmitter.prototype);\nPublisher.trigger = Publisher.emit;\n\nmodule.exports = Publisher;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mixins/publisher.js\n// module id = 15\n// module chunks = 0","/*\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nvar isArray = typeof Array.isArray === 'function'\n ? Array.isArray\n : function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]'\n }\n;\nfunction indexOf (xs, x) {\n if (xs.indexOf) return xs.indexOf(x);\n for (var i = 0; i < xs.length; i++) {\n if (x === xs[i]) return i;\n }\n return -1;\n}\n\nfunction EventEmitter() {}\nmodule.exports = EventEmitter;\n\nEventEmitter.prototype.emit = function(type) {\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events || !this._events.error ||\n (isArray(this._events.error) && !this._events.error.length))\n {\n if (arguments[1] instanceof Error) {\n throw arguments[1]; // Unhandled 'error' event\n } else {\n throw new Error(\"Uncaught, unspecified 'error' event.\");\n }\n return false;\n }\n }\n\n if (!this._events) return false;\n var handler = this._events[type];\n if (!handler) return false;\n\n if (typeof handler == 'function') {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n var args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n return true;\n\n } else if (isArray(handler)) {\n var args = Array.prototype.slice.call(arguments, 1);\n\n var listeners = handler.slice();\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i].apply(this, args);\n }\n return true;\n\n } else {\n return false;\n }\n};\n\n// EventEmitter is defined in src/node_events.cc\n// EventEmitter.prototype.emit() is also defined there.\nEventEmitter.prototype.addListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('addListener only takes instances of Function');\n }\n\n if (!this._events) this._events = {};\n\n // To avoid recursion in the case that type == \"newListeners\"! Before\n // adding it to the listeners, first emit \"newListeners\".\n this.emit('newListener', type, listener);\n\n if (!this._events[type]) {\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n } else if (isArray(this._events[type])) {\n // If we've already got an array, just append.\n this._events[type].push(listener);\n } else {\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n var self = this;\n self.on(type, function g() {\n self.removeListener(type, g);\n listener.apply(this, arguments);\n });\n\n return this;\n};\n\nEventEmitter.prototype.removeListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('removeListener only takes instances of Function');\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (!this._events || !this._events[type]) return this;\n\n var list = this._events[type];\n\n if (isArray(list)) {\n var i = indexOf(list, listener);\n if (i < 0) return this;\n list.splice(i, 1);\n if (list.length == 0)\n delete this._events[type];\n } else if (this._events[type] === listener) {\n delete this._events[type];\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n if (arguments.length === 0) {\n this._events = {};\n return this;\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (type && this._events && this._events[type]) this._events[type] = null;\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n if (!this._events) this._events = {};\n if (!this._events[type]) this._events[type] = [];\n if (!isArray(this._events[type])) {\n this._events[type] = [this._events[type]];\n }\n return this._events[type];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/event_emitter.js\n// module id = 16\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Publisher = require('../mixins/publisher'),\n Grammar = require('./grammar');\n\nvar Channel = Class({\n initialize: function(name) {\n this.id = this.name = name;\n },\n\n push: function(message) {\n this.trigger('message', message);\n },\n\n isUnused: function() {\n return this.countListeners('message') === 0;\n }\n});\n\nextend(Channel.prototype, Publisher);\n\nextend(Channel, {\n HANDSHAKE: '/meta/handshake',\n CONNECT: '/meta/connect',\n SUBSCRIBE: '/meta/subscribe',\n UNSUBSCRIBE: '/meta/unsubscribe',\n DISCONNECT: '/meta/disconnect',\n\n META: 'meta',\n SERVICE: 'service',\n\n expand: function(name) {\n var segments = this.parse(name),\n channels = ['/**', name];\n\n var copy = segments.slice();\n copy[copy.length - 1] = '*';\n channels.push(this.unparse(copy));\n\n for (var i = 1, n = segments.length; i < n; i++) {\n copy = segments.slice(0, i);\n copy.push('**');\n channels.push(this.unparse(copy));\n }\n\n return channels;\n },\n\n isValid: function(name) {\n return Grammar.CHANNEL_NAME.test(name) ||\n Grammar.CHANNEL_PATTERN.test(name);\n },\n\n parse: function(name) {\n if (!this.isValid(name)) return null;\n return name.split('/').slice(1);\n },\n\n unparse: function(segments) {\n return '/' + segments.join('/');\n },\n\n isMeta: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.META) : null;\n },\n\n isService: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.SERVICE) : null;\n },\n\n isSubscribable: function(name) {\n if (!this.isValid(name)) return null;\n return !this.isMeta(name) && !this.isService(name);\n },\n\n Set: Class({\n initialize: function() {\n this._channels = {};\n },\n\n getKeys: function() {\n var keys = [];\n for (var key in this._channels) keys.push(key);\n return keys;\n },\n\n remove: function(name) {\n delete this._channels[name];\n },\n\n hasSubscription: function(name) {\n return this._channels.hasOwnProperty(name);\n },\n\n subscribe: function(names, subscription) {\n var name;\n for (var i = 0, n = names.length; i < n; i++) {\n name = names[i];\n var channel = this._channels[name] = this._channels[name] || new Channel(name);\n channel.bind('message', subscription);\n }\n },\n\n unsubscribe: function(name, subscription) {\n var channel = this._channels[name];\n if (!channel) return false;\n channel.unbind('message', subscription);\n\n if (channel.isUnused()) {\n this.remove(name);\n return true;\n } else {\n return false;\n }\n },\n\n distributeMessage: function(message) {\n var channels = Channel.expand(message.channel);\n\n for (var i = 0, n = channels.length; i < n; i++) {\n var channel = this._channels[channels[i]];\n if (channel) channel.trigger('message', message);\n }\n }\n })\n});\n\nmodule.exports = Channel;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/channel.js\n// module id = 17\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n CHANNEL_NAME: /^\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*$/,\n CHANNEL_PATTERN: /^(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*\\/\\*{1,2}$/,\n ERROR: /^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*(,(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)$/,\n VERSION: /^([0-9])+(\\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\\-|\\_))*)*$/\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/grammar.js\n// module id = 18\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n cookies = require('../util/cookies'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Transport = require('../transport'),\n Scheduler = require('./scheduler');\n\nvar Dispatcher = Class({ className: 'Dispatcher',\n MAX_REQUEST_SIZE: 2048,\n DEFAULT_RETRY: 5,\n\n UP: 1,\n DOWN: 2,\n\n initialize: function(client, endpoint, options) {\n this._client = client;\n this.endpoint = URI.parse(endpoint);\n this._alternates = options.endpoints || {};\n\n this.cookies = cookies.CookieJar && new cookies.CookieJar();\n this._disabled = [];\n this._envelopes = {};\n this.headers = {};\n this.retry = options.retry || this.DEFAULT_RETRY;\n this._scheduler = options.scheduler || Scheduler;\n this._state = 0;\n this.transports = {};\n this.wsExtensions = [];\n\n this.proxy = options.proxy || {};\n if (typeof this._proxy === 'string') this._proxy = {origin: this._proxy};\n\n var exts = options.websocketExtensions;\n if (exts) {\n exts = [].concat(exts);\n for (var i = 0, n = exts.length; i < n; i++)\n this.addWebsocketExtension(exts[i]);\n }\n\n this.tls = options.tls || {};\n this.tls.ca = this.tls.ca || options.ca;\n\n for (var type in this._alternates)\n this._alternates[type] = URI.parse(this._alternates[type]);\n\n this.maxRequestSize = this.MAX_REQUEST_SIZE;\n },\n\n endpointFor: function(connectionType) {\n return this._alternates[connectionType] || this.endpoint;\n },\n\n addWebsocketExtension: function(extension) {\n this.wsExtensions.push(extension);\n },\n\n disable: function(feature) {\n this._disabled.push(feature);\n },\n\n setHeader: function(name, value) {\n this.headers[name] = value;\n },\n\n close: function() {\n var transport = this._transport;\n delete this._transport;\n if (transport) transport.close();\n },\n\n getConnectionTypes: function() {\n return Transport.getConnectionTypes();\n },\n\n selectTransport: function(transportTypes) {\n Transport.get(this, transportTypes, this._disabled, function(transport) {\n this.debug('Selected ? transport for ?', transport.connectionType, URI.stringify(transport.endpoint));\n\n if (transport === this._transport) return;\n if (this._transport) this._transport.close();\n\n this._transport = transport;\n this.connectionType = transport.connectionType;\n }, this);\n },\n\n sendMessage: function(message, timeout, options) {\n options = options || {};\n\n var id = message.id,\n attempts = options.attempts,\n deadline = options.deadline && new Date().getTime() + (options.deadline * 1000),\n envelope = this._envelopes[id],\n scheduler;\n\n if (!envelope) {\n scheduler = new this._scheduler(message, {timeout: timeout, interval: this.retry, attempts: attempts, deadline: deadline});\n envelope = this._envelopes[id] = {message: message, scheduler: scheduler};\n }\n\n this._sendEnvelope(envelope);\n },\n\n _sendEnvelope: function(envelope) {\n if (!this._transport) return;\n if (envelope.request || envelope.timer) return;\n\n var message = envelope.message,\n scheduler = envelope.scheduler,\n self = this;\n\n if (!scheduler.isDeliverable()) {\n scheduler.abort();\n delete this._envelopes[message.id];\n return;\n }\n\n envelope.timer = global.setTimeout(function() {\n self.handleError(message);\n }, scheduler.getTimeout() * 1000);\n\n scheduler.send();\n envelope.request = this._transport.sendMessage(message);\n },\n\n handleResponse: function(reply) {\n var envelope = this._envelopes[reply.id];\n\n if (reply.successful !== undefined && envelope) {\n envelope.scheduler.succeed();\n delete this._envelopes[reply.id];\n global.clearTimeout(envelope.timer);\n }\n\n this.trigger('message', reply);\n\n if (this._state === this.UP) return;\n this._state = this.UP;\n this._client.trigger('transport:up');\n },\n\n handleError: function(message, immediate) {\n var envelope = this._envelopes[message.id],\n request = envelope && envelope.request,\n self = this;\n\n if (!request) return;\n\n request.then(function(req) {\n if (req && req.abort) req.abort();\n });\n\n var scheduler = envelope.scheduler;\n scheduler.fail();\n\n global.clearTimeout(envelope.timer);\n envelope.request = envelope.timer = null;\n\n if (immediate) {\n this._sendEnvelope(envelope);\n } else {\n envelope.timer = global.setTimeout(function() {\n envelope.timer = null;\n self._sendEnvelope(envelope);\n }, scheduler.getInterval() * 1000);\n }\n\n if (this._state === this.DOWN) return;\n this._state = this.DOWN;\n this._client.trigger('transport:down');\n }\n});\n\nDispatcher.create = function(client, endpoint, options) {\n return new Dispatcher(client, endpoint, options);\n};\n\nextend(Dispatcher.prototype, Publisher);\nextend(Dispatcher.prototype, Logging);\n\nmodule.exports = Dispatcher;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/dispatcher.js\n// module id = 19\n// module chunks = 0","'use strict';\n\nmodule.exports = {};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/cookies/browser_cookies.js\n// module id = 20\n// module chunks = 0","'use strict';\n\nvar Transport = require('./transport');\n\nTransport.register('websocket', require('./web_socket'));\nTransport.register('eventsource', require('./event_source'));\nTransport.register('long-polling', require('./xhr'));\nTransport.register('cross-origin-long-polling', require('./cors'));\nTransport.register('callback-polling', require('./jsonp'));\n\nmodule.exports = Transport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/browser_transports.js\n// module id = 21\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Cookie = require('../util/cookies').Cookie,\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Timeouts = require('../mixins/timeouts'),\n Channel = require('../protocol/channel');\n\nvar Transport = extend(Class({ className: 'Transport',\n DEFAULT_PORTS: {'http:': 80, 'https:': 443, 'ws:': 80, 'wss:': 443},\n MAX_DELAY: 0,\n\n batching: true,\n\n initialize: function(dispatcher, endpoint) {\n this._dispatcher = dispatcher;\n this.endpoint = endpoint;\n this._outbox = [];\n this._proxy = extend({}, this._dispatcher.proxy);\n\n if (!this._proxy.origin)\n this._proxy.origin = this._findProxy();\n },\n\n close: function() {},\n\n encode: function(messages) {\n return '';\n },\n\n sendMessage: function(message) {\n this.debug('Client ? sending message to ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), message);\n\n if (!this.batching) return Promise.resolve(this.request([message]));\n\n this._outbox.push(message);\n this._flushLargeBatch();\n\n if (message.channel === Channel.HANDSHAKE)\n return this._publish(0.01);\n\n if (message.channel === Channel.CONNECT)\n this._connectMessage = message;\n\n return this._publish(this.MAX_DELAY);\n },\n\n _makePromise: function() {\n var self = this;\n\n this._requestPromise = this._requestPromise || new Promise(function(resolve) {\n self._resolvePromise = resolve;\n });\n },\n\n _publish: function(delay) {\n this._makePromise();\n\n this.addTimeout('publish', delay, function() {\n this._flush();\n delete this._requestPromise;\n }, this);\n\n return this._requestPromise;\n },\n\n _flush: function() {\n this.removeTimeout('publish');\n\n if (this._outbox.length > 1 && this._connectMessage)\n this._connectMessage.advice = {timeout: 0};\n\n this._resolvePromise(this.request(this._outbox));\n\n this._connectMessage = null;\n this._outbox = [];\n },\n\n _flushLargeBatch: function() {\n var string = this.encode(this._outbox);\n if (string.length < this._dispatcher.maxRequestSize) return;\n var last = this._outbox.pop();\n\n this._makePromise();\n this._flush();\n\n if (last) this._outbox.push(last);\n },\n\n _receive: function(replies) {\n if (!replies) return;\n replies = [].concat(replies);\n\n this.debug('Client ? received from ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, replies);\n\n for (var i = 0, n = replies.length; i < n; i++)\n this._dispatcher.handleResponse(replies[i]);\n },\n\n _handleError: function(messages, immediate) {\n messages = [].concat(messages);\n\n this.debug('Client ? failed to send to ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, messages);\n\n for (var i = 0, n = messages.length; i < n; i++)\n this._dispatcher.handleError(messages[i]);\n },\n\n _getCookies: function() {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint);\n\n if (!cookies) return '';\n\n return array.map(cookies.getCookiesSync(url), function(cookie) {\n return cookie.cookieString();\n }).join('; ');\n },\n\n _storeCookies: function(setCookie) {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint),\n cookie;\n\n if (!setCookie || !cookies) return;\n setCookie = [].concat(setCookie);\n\n for (var i = 0, n = setCookie.length; i < n; i++) {\n cookie = Cookie.parse(setCookie[i]);\n cookies.setCookieSync(cookie, url);\n }\n },\n\n _findProxy: function() {\n if (typeof process === 'undefined') return undefined;\n\n var protocol = this.endpoint.protocol;\n if (!protocol) return undefined;\n\n var name = protocol.replace(/:$/, '').toLowerCase() + '_proxy',\n upcase = name.toUpperCase(),\n env = process.env,\n keys, proxy;\n\n if (name === 'http_proxy' && env.REQUEST_METHOD) {\n keys = Object.keys(env).filter(function(k) { return /^http_proxy$/i.test(k) });\n if (keys.length === 1) {\n if (keys[0] === name && env[upcase] === undefined)\n proxy = env[name];\n } else if (keys.length > 1) {\n proxy = env[name];\n }\n proxy = proxy || env['CGI_' + upcase];\n } else {\n proxy = env[name] || env[upcase];\n if (proxy && !env[name])\n console.warn('The environment variable ' + upcase +\n ' is discouraged. Use ' + name + '.');\n }\n return proxy;\n }\n\n}), {\n get: function(dispatcher, allowed, disabled, callback, context) {\n var endpoint = dispatcher.endpoint;\n\n array.asyncEach(this._transports, function(pair, resume) {\n var connType = pair[0], klass = pair[1],\n connEndpoint = dispatcher.endpointFor(connType);\n\n if (array.indexOf(disabled, connType) >= 0)\n return resume();\n\n if (array.indexOf(allowed, connType) < 0) {\n klass.isUsable(dispatcher, connEndpoint, function() {});\n return resume();\n }\n\n klass.isUsable(dispatcher, connEndpoint, function(isUsable) {\n if (!isUsable) return resume();\n var transport = klass.hasOwnProperty('create') ? klass.create(dispatcher, connEndpoint) : new klass(dispatcher, connEndpoint);\n callback.call(context, transport);\n });\n }, function() {\n throw new Error('Could not find a usable connection type for ' + URI.stringify(endpoint));\n });\n },\n\n register: function(type, klass) {\n this._transports.push([type, klass]);\n klass.prototype.connectionType = type;\n },\n\n getConnectionTypes: function() {\n return array.map(this._transports, function(t) { return t[0] });\n },\n\n _transports: []\n});\n\nextend(Transport.prototype, Logging);\nextend(Transport.prototype, Timeouts);\n\nmodule.exports = Transport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/transport.js\n// module id = 22\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n addTimeout: function(name, delay, callback, context) {\n this._timeouts = this._timeouts || {};\n if (this._timeouts.hasOwnProperty(name)) return;\n var self = this;\n this._timeouts[name] = global.setTimeout(function() {\n delete self._timeouts[name];\n callback.call(context);\n }, 1000 * delay);\n },\n\n removeTimeout: function(name) {\n this._timeouts = this._timeouts || {};\n var timeout = this._timeouts[name];\n if (!timeout) return;\n global.clearTimeout(timeout);\n delete this._timeouts[name];\n },\n\n removeAllTimeouts: function() {\n this._timeouts = this._timeouts || {};\n for (var name in this._timeouts) this.removeTimeout(name);\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mixins/timeouts.js\n// module id = 23\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Promise = require('../util/promise'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n ws = require('../util/websocket'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport');\n\nvar WebSocket = extend(Class(Transport, {\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n\n batching: false,\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n this.connect();\n },\n\n request: function(messages) {\n this._pending = this._pending || new Set();\n for (var i = 0, n = messages.length; i < n; i++) this._pending.add(messages[i]);\n\n var self = this;\n\n var promise = new Promise(function(resolve, reject) {\n self.callback(function(socket) {\n if (!socket || socket.readyState !== 1) return;\n socket.send(toJSON(messages));\n resolve(socket);\n });\n\n self.connect();\n });\n\n return {\n abort: function() { promise.then(function(ws) { ws.close() }) }\n };\n },\n\n connect: function() {\n if (WebSocket._unloaded) return;\n\n this._state = this._state || this.UNCONNECTED;\n if (this._state !== this.UNCONNECTED) return;\n this._state = this.CONNECTING;\n\n var socket = this._createSocket();\n if (!socket) return this.setDeferredStatus('failed');\n\n var self = this;\n\n socket.onopen = function() {\n if (socket.headers) self._storeCookies(socket.headers['set-cookie']);\n self._socket = socket;\n self._state = self.CONNECTED;\n self._everConnected = true;\n self._ping();\n self.setDeferredStatus('succeeded', socket);\n };\n\n var closed = false;\n socket.onclose = socket.onerror = function() {\n if (closed) return;\n closed = true;\n\n var wasConnected = (self._state === self.CONNECTED);\n socket.onopen = socket.onclose = socket.onerror = socket.onmessage = null;\n\n delete self._socket;\n self._state = self.UNCONNECTED;\n self.removeTimeout('ping');\n\n var pending = self._pending ? self._pending.toArray() : [];\n delete self._pending;\n\n if (wasConnected || self._everConnected) {\n self.setDeferredStatus('unknown');\n self._handleError(pending, wasConnected);\n } else {\n self.setDeferredStatus('failed');\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (!replies) return;\n\n replies = [].concat(replies);\n\n for (var i = 0, n = replies.length; i < n; i++) {\n if (replies[i].successful === undefined) continue;\n self._pending.remove(replies[i]);\n }\n self._receive(replies);\n };\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.close();\n },\n\n _createSocket: function() {\n var url = WebSocket.getSocketUrl(this.endpoint),\n headers = this._dispatcher.headers,\n extensions = this._dispatcher.wsExtensions,\n cookie = this._getCookies(),\n tls = this._dispatcher.tls,\n options = {extensions: extensions, headers: headers, proxy: this._proxy, tls: tls};\n\n if (cookie !== '') options.headers['Cookie'] = cookie;\n\n return ws.create(url, [], options);\n },\n\n _ping: function() {\n if (!this._socket || this._socket.readyState !== 1) return;\n this._socket.send('[]');\n this.addTimeout('ping', this._dispatcher.timeout / 2, this._ping, this);\n }\n\n}), {\n PROTOCOLS: {\n 'http:': 'ws:',\n 'https:': 'wss:'\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.websocket = dispatcher.transports.websocket || {};\n sockets[endpoint.href] = sockets[endpoint.href] || new this(dispatcher, endpoint);\n return sockets[endpoint.href];\n },\n\n getSocketUrl: function(endpoint) {\n endpoint = copyObject(endpoint);\n endpoint.protocol = this.PROTOCOLS[endpoint.protocol];\n return URI.stringify(endpoint);\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }\n});\n\nextend(WebSocket.prototype, Deferrable);\n\nif (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() { WebSocket._unloaded = true });\n\nmodule.exports = WebSocket;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/web_socket.js\n// module id = 24\n// module chunks = 0","'use strict';\n\nvar Class = require('./class');\n\nmodule.exports = Class({\n initialize: function() {\n this._index = {};\n },\n\n add: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n if (this._index.hasOwnProperty(key)) return false;\n this._index[key] = item;\n return true;\n },\n\n forEach: function(block, context) {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key))\n block.call(context, this._index[key]);\n }\n },\n\n isEmpty: function() {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key)) return false;\n }\n return true;\n },\n\n member: function(item) {\n for (var key in this._index) {\n if (this._index[key] === item) return true;\n }\n return false;\n },\n\n remove: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n var removed = this._index[key];\n delete this._index[key];\n return removed;\n },\n\n toArray: function() {\n var array = [];\n this.forEach(function(item) { array.push(item) });\n return array;\n }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/set.js\n// module id = 25\n// module chunks = 0","'use strict';\n\nvar copyObject = function(object) {\n var clone, i, key;\n if (object instanceof Array) {\n clone = [];\n i = object.length;\n while (i--) clone[i] = copyObject(object[i]);\n return clone;\n } else if (typeof object === 'object') {\n clone = (object === null) ? null : {};\n for (key in object) clone[key] = copyObject(object[key]);\n return clone;\n } else {\n return object;\n }\n};\n\nmodule.exports = copyObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/copy_object.js\n// module id = 26\n// module chunks = 0","'use strict';\n\nvar WS = global.MozWebSocket || global.WebSocket;\n\nmodule.exports = {\n create: function(url, protocols, options) {\n if (typeof WS !== 'function') return null;\n return new WS(url);\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/util/websocket/browser_websocket.js\n// module id = 27\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport'),\n XHR = require('./xhr');\n\nvar EventSource = extend(Class(Transport, {\n initialize: function(dispatcher, endpoint) {\n Transport.prototype.initialize.call(this, dispatcher, endpoint);\n if (!global.EventSource) return this.setDeferredStatus('failed');\n\n this._xhr = new XHR(dispatcher, endpoint);\n\n endpoint = copyObject(endpoint);\n endpoint.pathname += '/' + dispatcher.clientId;\n\n var socket = new global.EventSource(URI.stringify(endpoint)),\n self = this;\n\n socket.onopen = function() {\n self._everConnected = true;\n self.setDeferredStatus('succeeded');\n };\n\n socket.onerror = function() {\n if (self._everConnected) {\n self._handleError([]);\n } else {\n self.setDeferredStatus('failed');\n socket.close();\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError([]);\n };\n\n this._socket = socket;\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.onopen = this._socket.onerror = this._socket.onmessage = null;\n this._socket.close();\n delete this._socket;\n },\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n },\n\n encode: function(messages) {\n return this._xhr.encode(messages);\n },\n\n request: function(messages) {\n return this._xhr.request(messages);\n }\n\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var id = dispatcher.clientId;\n if (!id) return callback.call(context, false);\n\n XHR.isUsable(dispatcher, endpoint, function(usable) {\n if (!usable) return callback.call(context, false);\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }, this);\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.eventsource = dispatcher.transports.eventsource || {},\n id = dispatcher.clientId;\n\n var url = copyObject(endpoint);\n url.pathname += '/' + (id || '');\n url = URI.stringify(url);\n\n sockets[url] = sockets[url] || new this(dispatcher, endpoint);\n return sockets[url];\n }\n});\n\nextend(EventSource.prototype, Deferrable);\n\nmodule.exports = EventSource;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/event_source.js\n// module id = 28\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar XHR = extend(Class(Transport, {\n encode: function(messages) {\n return toJSON(messages);\n },\n\n request: function(messages) {\n var href = this.endpoint.href,\n self = this,\n xhr;\n\n // Prefer XMLHttpRequest over ActiveXObject if they both exist\n if (global.XMLHttpRequest) {\n xhr = new XMLHttpRequest();\n } else if (global.ActiveXObject) {\n xhr = new ActiveXObject('Microsoft.XMLHTTP');\n } else {\n return this._handleError(messages);\n }\n\n xhr.open('POST', href, true);\n xhr.setRequestHeader('Content-Type', 'application/json');\n xhr.setRequestHeader('Pragma', 'no-cache');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n var headers = this._dispatcher.headers;\n for (var key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n\n var abort = function() { xhr.abort() };\n if (global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {\n if (!xhr || xhr.readyState !== 4) return;\n\n var replies = null,\n status = xhr.status,\n text = xhr.responseText,\n successful = (status >= 200 && status < 300) || status === 304 || status === 1223;\n\n if (global.onbeforeunload !== undefined)\n browser.Event.detach(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {};\n xhr = null;\n\n if (!successful) return self._handleError(messages);\n\n try {\n replies = JSON.parse(text);\n } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var usable = (navigator.product === 'ReactNative')\n || URI.isSameOrigin(endpoint);\n\n callback.call(context, usable);\n }\n});\n\nmodule.exports = XHR;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/xhr.js\n// module id = 29\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar CORS = extend(Class(Transport, {\n encode: function(messages) {\n return 'message=' + encodeURIComponent(toJSON(messages));\n },\n\n request: function(messages) {\n var xhrClass = global.XDomainRequest ? XDomainRequest : XMLHttpRequest,\n xhr = new xhrClass(),\n id = ++CORS._id,\n headers = this._dispatcher.headers,\n self = this,\n key;\n\n xhr.open('POST', URI.stringify(this.endpoint), true);\n\n if (xhr.setRequestHeader) {\n xhr.setRequestHeader('Pragma', 'no-cache');\n for (key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n\n var cleanUp = function() {\n if (!xhr) return false;\n CORS._pending.remove(id);\n xhr.onload = xhr.onerror = xhr.ontimeout = xhr.onprogress = null;\n xhr = null;\n };\n\n xhr.onload = function() {\n var replies;\n try { replies = JSON.parse(xhr.responseText) } catch (error) {}\n\n cleanUp();\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.onerror = xhr.ontimeout = function() {\n cleanUp();\n self._handleError(messages);\n };\n\n xhr.onprogress = function() {};\n\n if (xhrClass === global.XDomainRequest)\n CORS._pending.add({id: id, xhr: xhr});\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n _id: 0,\n _pending: new Set(),\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n if (URI.isSameOrigin(endpoint))\n return callback.call(context, false);\n\n if (global.XDomainRequest)\n return callback.call(context, endpoint.protocol === location.protocol);\n\n if (global.XMLHttpRequest) {\n var xhr = new XMLHttpRequest();\n return callback.call(context, xhr.withCredentials !== undefined);\n }\n return callback.call(context, false);\n }\n});\n\nmodule.exports = CORS;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/cors.js\n// module id = 30\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar JSONP = extend(Class(Transport, {\n encode: function(messages) {\n var url = copyObject(this.endpoint);\n url.query.message = toJSON(messages);\n url.query.jsonp = '__jsonp' + JSONP._cbCount + '__';\n return URI.stringify(url);\n },\n\n request: function(messages) {\n var head = document.getElementsByTagName('head')[0],\n script = document.createElement('script'),\n callbackName = JSONP.getCallbackName(),\n endpoint = copyObject(this.endpoint),\n self = this;\n\n endpoint.query.message = toJSON(messages);\n endpoint.query.jsonp = callbackName;\n\n var cleanup = function() {\n if (!global[callbackName]) return false;\n global[callbackName] = undefined;\n try { delete global[callbackName] } catch (error) {}\n script.parentNode.removeChild(script);\n };\n\n global[callbackName] = function(replies) {\n cleanup();\n self._receive(replies);\n };\n\n script.type = 'text/javascript';\n script.src = URI.stringify(endpoint);\n head.appendChild(script);\n\n script.onerror = function() {\n cleanup();\n self._handleError(messages);\n };\n\n return {abort: cleanup};\n }\n}), {\n _cbCount: 0,\n\n getCallbackName: function() {\n this._cbCount += 1;\n return '__jsonp' + this._cbCount + '__';\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n callback.call(context, true);\n }\n});\n\nmodule.exports = JSONP;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/transport/jsonp.js\n// module id = 31\n// module chunks = 0","'use strict';\n\nvar extend = require('../util/extend');\n\nvar Scheduler = function(message, options) {\n this.message = message;\n this.options = options;\n this.attempts = 0;\n};\n\nextend(Scheduler.prototype, {\n getTimeout: function() {\n return this.options.timeout;\n },\n\n getInterval: function() {\n return this.options.interval;\n },\n\n isDeliverable: function() {\n var attempts = this.options.attempts,\n made = this.attempts,\n deadline = this.options.deadline,\n now = new Date().getTime();\n\n if (attempts !== undefined && made >= attempts)\n return false;\n\n if (deadline !== undefined && now > deadline)\n return false;\n\n return true;\n },\n\n send: function() {\n this.attempts += 1;\n },\n\n succeed: function() {},\n\n fail: function() {},\n\n abort: function() {}\n});\n\nmodule.exports = Scheduler;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/scheduler.js\n// module id = 32\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Grammar = require('./grammar');\n\nvar Error = Class({\n initialize: function(code, params, message) {\n this.code = code;\n this.params = Array.prototype.slice.call(params);\n this.message = message;\n },\n\n toString: function() {\n return this.code + ':' +\n this.params.join(',') + ':' +\n this.message;\n }\n});\n\nError.parse = function(message) {\n message = message || '';\n if (!Grammar.ERROR.test(message)) return new Error(null, [], message);\n\n var parts = message.split(':'),\n code = parseInt(parts[0]),\n params = parts[1].split(','),\n message = parts[2];\n\n return new Error(code, params, message);\n};\n\n// http://code.google.com/p/cometd/wiki/BayeuxCodes\nvar errors = {\n versionMismatch: [300, 'Version mismatch'],\n conntypeMismatch: [301, 'Connection types not supported'],\n extMismatch: [302, 'Extension mismatch'],\n badRequest: [400, 'Bad request'],\n clientUnknown: [401, 'Unknown client'],\n parameterMissing: [402, 'Missing required parameter'],\n channelForbidden: [403, 'Forbidden channel'],\n channelUnknown: [404, 'Unknown channel'],\n channelInvalid: [405, 'Invalid channel'],\n extUnknown: [406, 'Unknown extension'],\n publishFailed: [407, 'Failed to publish'],\n serverError: [500, 'Internal server error']\n};\n\nfor (var name in errors)\n (function(name) {\n Error[name] = function() {\n return new Error(errors[name][0], arguments, errors[name][1]).toString();\n };\n })(name);\n\nmodule.exports = Error;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/error.js\n// module id = 33\n// module chunks = 0","'use strict';\n\nvar extend = require('../util/extend'),\n Logging = require('../mixins/logging');\n\nvar Extensible = {\n addExtension: function(extension) {\n this._extensions = this._extensions || [];\n this._extensions.push(extension);\n if (extension.added) extension.added(this);\n },\n\n removeExtension: function(extension) {\n if (!this._extensions) return;\n var i = this._extensions.length;\n while (i--) {\n if (this._extensions[i] !== extension) continue;\n this._extensions.splice(i,1);\n if (extension.removed) extension.removed(this);\n }\n },\n\n pipeThroughExtensions: function(stage, message, request, callback, context) {\n this.debug('Passing through ? extensions: ?', stage, message);\n\n if (!this._extensions) return callback.call(context, message);\n var extensions = this._extensions.slice();\n\n var pipe = function(message) {\n if (!message) return callback.call(context, message);\n\n var extension = extensions.shift();\n if (!extension) return callback.call(context, message);\n\n var fn = extension[stage];\n if (!fn) return pipe(message);\n\n if (fn.length >= 3) extension[stage](message, request, pipe);\n else extension[stage](message, pipe);\n };\n pipe(message);\n }\n};\n\nextend(Extensible, Logging);\n\nmodule.exports = Extensible;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/extensible.js\n// module id = 34\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n Deferrable = require('../mixins/deferrable');\n\nmodule.exports = Class(Deferrable);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/publication.js\n// module id = 35\n// module chunks = 0","'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable');\n\nvar Subscription = Class({\n initialize: function(client, channels, callback, context) {\n this._client = client;\n this._channels = channels;\n this._callback = callback;\n this._context = context;\n this._cancelled = false;\n },\n\n withChannel: function(callback, context) {\n this._withChannel = [callback, context];\n return this;\n },\n\n apply: function(context, args) {\n var message = args[0];\n\n if (this._callback)\n this._callback.call(this._context, message.data);\n\n if (this._withChannel)\n this._withChannel[0].call(this._withChannel[1], message.channel, message.data);\n },\n\n cancel: function() {\n if (this._cancelled) return;\n this._client.unsubscribe(this._channels, this);\n this._cancelled = true;\n },\n\n unsubscribe: function() {\n this.cancel();\n }\n});\n\nextend(Subscription.prototype, Deferrable);\n\nmodule.exports = Subscription;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/protocol/subscription.js\n// module id = 36\n// module chunks = 0"]}faye-1.2.4/faye.gemspec0000644000175000017500000001506313425045757015512 0ustar utkarsh2102utkarsh2102######################################################### # This file has been automatically generated by gem2tgz # ######################################################### # -*- encoding: utf-8 -*- # stub: faye 1.2.4 ruby lib Gem::Specification.new do |s| s.name = "faye".freeze s.version = "1.2.4" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] s.authors = ["James Coglan".freeze] s.date = "2017-01-28" s.email = "jcoglan@gmail.com".freeze s.extra_rdoc_files = ["README.md".freeze] s.files = ["CHANGELOG.md".freeze, "README.md".freeze, "build/client/faye-browser-min.js".freeze, "build/client/faye-browser-min.js.map".freeze, "build/client/faye-browser.js".freeze, "build/client/faye-browser.js.map".freeze, "lib/faye.rb".freeze, "lib/faye/adapters/rack_adapter.rb".freeze, "lib/faye/adapters/static_server.rb".freeze, "lib/faye/engines/connection.rb".freeze, "lib/faye/engines/memory.rb".freeze, "lib/faye/engines/proxy.rb".freeze, "lib/faye/error.rb".freeze, "lib/faye/mixins/deferrable.rb".freeze, "lib/faye/mixins/logging.rb".freeze, "lib/faye/mixins/publisher.rb".freeze, "lib/faye/mixins/timeouts.rb".freeze, "lib/faye/protocol/channel.rb".freeze, "lib/faye/protocol/client.rb".freeze, "lib/faye/protocol/dispatcher.rb".freeze, "lib/faye/protocol/extensible.rb".freeze, "lib/faye/protocol/grammar.rb".freeze, "lib/faye/protocol/publication.rb".freeze, "lib/faye/protocol/scheduler.rb".freeze, "lib/faye/protocol/server.rb".freeze, "lib/faye/protocol/socket.rb".freeze, "lib/faye/protocol/subscription.rb".freeze, "lib/faye/transport/http.rb".freeze, "lib/faye/transport/local.rb".freeze, "lib/faye/transport/transport.rb".freeze, "lib/faye/transport/web_socket.rb".freeze, "lib/faye/util/namespace.rb".freeze] s.homepage = "https://faye.jcoglan.com".freeze s.licenses = ["MIT".freeze] s.rdoc_options = ["--main".freeze, "README.md".freeze, "--markup".freeze, "markdown".freeze] s.rubygems_version = "2.7.6".freeze s.summary = "Simple pub/sub messaging for the web".freeze if s.respond_to? :specification_version then s.specification_version = 4 if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then s.add_development_dependency(%q.freeze, ["~> 3.0.0"]) s.add_development_dependency(%q.freeze, ["~> 0.11.0"]) s.add_runtime_dependency(%q.freeze, [">= 0.3.0"]) s.add_runtime_dependency(%q.freeze, [">= 0.3.0"]) s.add_runtime_dependency(%q.freeze, [">= 0.12.0"]) s.add_runtime_dependency(%q.freeze, [">= 0.9.1"]) s.add_development_dependency(%q.freeze, [">= 0"]) s.add_development_dependency(%q.freeze, ["~> 3.1.0"]) s.add_runtime_dependency(%q.freeze, [">= 1.0.0"]) s.add_development_dependency(%q.freeze, [">= 4.0.0"]) s.add_development_dependency(%q.freeze, [">= 0.1.0"]) s.add_development_dependency(%q.freeze, [">= 2.0.0"]) s.add_runtime_dependency(%q.freeze, [">= 1.0.0"]) s.add_development_dependency(%q.freeze, ["~> 0.4.0"]) s.add_development_dependency(%q.freeze, [">= 0"]) s.add_development_dependency(%q.freeze, ["~> 4.4.0"]) s.add_development_dependency(%q.freeze, [">= 0"]) s.add_development_dependency(%q.freeze, ["~> 2.99.0"]) s.add_development_dependency(%q.freeze, [">= 0.2.0"]) s.add_development_dependency(%q.freeze, ["~> 3.2.0"]) s.add_development_dependency(%q.freeze, [">= 0"]) s.add_development_dependency(%q.freeze, [">= 0"]) s.add_development_dependency(%q.freeze, [">= 1.2.0"]) s.add_runtime_dependency(%q.freeze, [">= 0.5.1"]) else s.add_dependency(%q.freeze, ["~> 3.0.0"]) s.add_dependency(%q.freeze, ["~> 0.11.0"]) s.add_dependency(%q.freeze, [">= 0.3.0"]) s.add_dependency(%q.freeze, [">= 0.3.0"]) s.add_dependency(%q.freeze, [">= 0.12.0"]) s.add_dependency(%q.freeze, [">= 0.9.1"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, ["~> 3.1.0"]) s.add_dependency(%q.freeze, [">= 1.0.0"]) s.add_dependency(%q.freeze, [">= 4.0.0"]) s.add_dependency(%q.freeze, [">= 0.1.0"]) s.add_dependency(%q.freeze, [">= 2.0.0"]) s.add_dependency(%q.freeze, [">= 1.0.0"]) s.add_dependency(%q.freeze, ["~> 0.4.0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, ["~> 4.4.0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, ["~> 2.99.0"]) s.add_dependency(%q.freeze, [">= 0.2.0"]) s.add_dependency(%q.freeze, ["~> 3.2.0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, [">= 1.2.0"]) s.add_dependency(%q.freeze, [">= 0.5.1"]) end else s.add_dependency(%q.freeze, ["~> 3.0.0"]) s.add_dependency(%q.freeze, ["~> 0.11.0"]) s.add_dependency(%q.freeze, [">= 0.3.0"]) s.add_dependency(%q.freeze, [">= 0.3.0"]) s.add_dependency(%q.freeze, [">= 0.12.0"]) s.add_dependency(%q.freeze, [">= 0.9.1"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, ["~> 3.1.0"]) s.add_dependency(%q.freeze, [">= 1.0.0"]) s.add_dependency(%q.freeze, [">= 4.0.0"]) s.add_dependency(%q.freeze, [">= 0.1.0"]) s.add_dependency(%q.freeze, [">= 2.0.0"]) s.add_dependency(%q.freeze, [">= 1.0.0"]) s.add_dependency(%q.freeze, ["~> 0.4.0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, ["~> 4.4.0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, ["~> 2.99.0"]) s.add_dependency(%q.freeze, [">= 0.2.0"]) s.add_dependency(%q.freeze, ["~> 3.2.0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, [">= 1.2.0"]) s.add_dependency(%q.freeze, [">= 0.5.1"]) end end