104 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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;
 |