|
|
- 'use strict';
-
- var EventEmitter = require('events').EventEmitter
- , inherits = require('inherits')
- , eventUtils = require('../../utils/event')
- , browser = require('../../utils/browser')
- , urlUtils = require('../../utils/url')
- ;
-
- var debug = function() {};
- if (process.env.NODE_ENV !== 'production') {
- debug = require('debug')('sockjs-client:sender:xdr');
- }
-
- // References:
- // http://ajaxian.com/archives/100-line-ajax-wrapper
- // http://msdn.microsoft.com/en-us/library/cc288060(v=VS.85).aspx
-
- function XDRObject(method, url, payload) {
- debug(method, url);
- var self = this;
- EventEmitter.call(this);
-
- setTimeout(function() {
- self._start(method, url, payload);
- }, 0);
- }
-
- inherits(XDRObject, EventEmitter);
-
- XDRObject.prototype._start = function(method, url, payload) {
- debug('_start');
- var self = this;
- var xdr = new global.XDomainRequest();
- // IE caches even POSTs
- url = urlUtils.addQuery(url, 't=' + (+new Date()));
-
- xdr.onerror = function() {
- debug('onerror');
- self._error();
- };
- xdr.ontimeout = function() {
- debug('ontimeout');
- self._error();
- };
- xdr.onprogress = function() {
- debug('progress', xdr.responseText);
- self.emit('chunk', 200, xdr.responseText);
- };
- xdr.onload = function() {
- debug('load');
- self.emit('finish', 200, xdr.responseText);
- self._cleanup(false);
- };
- this.xdr = xdr;
- this.unloadRef = eventUtils.unloadAdd(function() {
- self._cleanup(true);
- });
- try {
- // Fails with AccessDenied if port number is bogus
- this.xdr.open(method, url);
- if (this.timeout) {
- this.xdr.timeout = this.timeout;
- }
- this.xdr.send(payload);
- } catch (x) {
- this._error();
- }
- };
-
- XDRObject.prototype._error = function() {
- this.emit('finish', 0, '');
- this._cleanup(false);
- };
-
- XDRObject.prototype._cleanup = function(abort) {
- debug('cleanup', abort);
- if (!this.xdr) {
- return;
- }
- this.removeAllListeners();
- eventUtils.unloadDel(this.unloadRef);
-
- this.xdr.ontimeout = this.xdr.onerror = this.xdr.onprogress = this.xdr.onload = null;
- if (abort) {
- try {
- this.xdr.abort();
- } catch (x) {
- // intentionally empty
- }
- }
- this.unloadRef = this.xdr = null;
- };
-
- XDRObject.prototype.close = function() {
- debug('close');
- this._cleanup(true);
- };
-
- // IE 8/9 if the request target uses the same scheme - #79
- XDRObject.enabled = !!(global.XDomainRequest && browser.hasDomain());
-
- module.exports = XDRObject;
|