Skip to content

Commit

Permalink
Support tracking of websocket opening. Pass native XHR constants onto…
Browse files Browse the repository at this point in the history
… created functions.
  • Loading branch information
zackbloom committed Sep 23, 2013
1 parent 8ac5f53 commit d856e90
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 27 deletions.
48 changes: 39 additions & 9 deletions pace.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -192,13 +192,19 @@ class Events

_XMLHttpRequest = window.XMLHttpRequest
_XDomainRequest = window.XDomainRequest
_WebSocket = window.WebSocket

extendNative = (to, from) ->
for key, val of from::
if not to[key]? and typeof val isnt 'function'
to[key] = val

# We should only ever instantiate one of these
class RequestIntercept extends Events
constructor: ->
super

monitor = (req) =>
monitorXHR = (req) =>
_open = req.open
req.open = (type, url, async) =>
@trigger 'request', {type, url, request: req}
Expand All @@ -208,33 +214,49 @@ class RequestIntercept extends Events
window.XMLHttpRequest = ->
req = new _XMLHttpRequest

monitor req
monitorXHR req

req

extendNative window.XMLHttpRequest, _XMLHttpRequest

if _XDomainRequest?
window.XDomainRequest = ->
req = new _XDomainRequest

monitor req
monitorXHR req

req

extendNative window.XDomainRequest, _XDomainRequest

if _WebSocket?
window.WebSocket = (url, protocols) =>
req = new _WebSocket(url, protocols)

@trigger 'request', {type: 'socket', url, protocols, request: req}

req

extendNative window.WebSocket, _WebSocket

intercept = new RequestIntercept

class AjaxMonitor
constructor: ->
@elements = []

intercept.on 'request', ({request}) =>
@watch request
intercept.on 'request', => @watch arguments...

watch: (request) ->
tracker = new RequestTracker(request)
watch: ({type, request}) ->
if type is 'socket'
tracker = new SocketRequestTracker(request)
else
tracker = new XHRRequestTracker(request)

@elements.push tracker

class RequestTracker
class XHRRequestTracker
constructor: (request) ->
@progress = 0

Expand Down Expand Up @@ -268,7 +290,7 @@ class RequestTracker
_onprogress?(arguments...)

for handler in ['onload', 'onabort', 'ontimeout', 'onerror']
do =>
do (handler) =>
fn = request[handler]
request[handler] = =>
@progress = 100
Expand All @@ -285,6 +307,14 @@ class RequestTracker

_onreadystatechange?(arguments...)

class SocketRequestTracker
constructor: (request) ->
@progress = 0

for event in ['error', 'open']
request.addEventListener event, =>
@progress = 100

class ElementMonitor
constructor: (options={}) ->
@elements = []
Expand Down
88 changes: 71 additions & 17 deletions pace.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit d856e90

Please sign in to comment.