lib/assets/javascripts/websocket_rails/http_connection.js.coffee
###
HTTP Interface for the WebSocketRails client.
###
class WebSocketRails.HttpConnection extends WebSocketRails.AbstractConnection
connection_type: 'http'
_httpFactories: -> [
-> new XDomainRequest(),
-> new XMLHttpRequest(),
-> new ActiveXObject("Msxml2.XMLHTTP"),
-> new ActiveXObject("Msxml3.XMLHTTP"),
-> new ActiveXObject("Microsoft.XMLHTTP")
]
constructor: (url, @dispatcher) ->
super
@_url = "http://#{url}"
@_conn = @_createXMLHttpObject()
@last_pos = 0
try
@_conn.onreadystatechange = => @_parse_stream()
@_conn.addEventListener("load", @on_close, false)
catch e
@_conn.onprogress = => @_parse_stream()
@_conn.onload = @on_close
# set this as 3 always for parse_stream as the object does not have this property at all
@_conn.readyState = 3
@_conn.open "GET", @_url, true
@_conn.send()
close: ->
@_conn.abort()
send_event: (event) ->
super
@_post_data event.serialize()
_post_data: (payload) ->
$.ajax @_url,
type: 'POST'
data:
client_id: @connection_id
data: payload
success: ->
_createXMLHttpObject: ->
xmlhttp = false
factories = @_httpFactories()
for factory in factories
try
xmlhttp = factory()
catch e
continue
break
xmlhttp
_parse_stream: ->
if @_conn.readyState == 3
data = @_conn.responseText.substring @last_pos
@last_pos = @_conn.responseText.length
data = data.replace( /\]\]\[\[/g, "],[" )
try
event_data = JSON.parse data
@on_message(event_data)
catch e
# just ignore if it cannot be parsed, probably whitespace