71 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
var inherits = require('inherits')
 | 
						|
  , EventEmitter = require('events').EventEmitter
 | 
						|
  ;
 | 
						|
 | 
						|
var debug = function() {};
 | 
						|
if (process.env.NODE_ENV !== 'production') {
 | 
						|
  debug = require('debug')('sockjs-client:receiver:xhr');
 | 
						|
}
 | 
						|
 | 
						|
function XhrReceiver(url, AjaxObject) {
 | 
						|
  debug(url);
 | 
						|
  EventEmitter.call(this);
 | 
						|
  var self = this;
 | 
						|
 | 
						|
  this.bufferPosition = 0;
 | 
						|
 | 
						|
  this.xo = new AjaxObject('POST', url, null);
 | 
						|
  this.xo.on('chunk', this._chunkHandler.bind(this));
 | 
						|
  this.xo.once('finish', function(status, text) {
 | 
						|
    debug('finish', status, text);
 | 
						|
    self._chunkHandler(status, text);
 | 
						|
    self.xo = null;
 | 
						|
    var reason = status === 200 ? 'network' : 'permanent';
 | 
						|
    debug('close', reason);
 | 
						|
    self.emit('close', null, reason);
 | 
						|
    self._cleanup();
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
inherits(XhrReceiver, EventEmitter);
 | 
						|
 | 
						|
XhrReceiver.prototype._chunkHandler = function(status, text) {
 | 
						|
  debug('_chunkHandler', status);
 | 
						|
  if (status !== 200 || !text) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  for (var idx = -1; ; this.bufferPosition += idx + 1) {
 | 
						|
    var buf = text.slice(this.bufferPosition);
 | 
						|
    idx = buf.indexOf('\n');
 | 
						|
    if (idx === -1) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    var msg = buf.slice(0, idx);
 | 
						|
    if (msg) {
 | 
						|
      debug('message', msg);
 | 
						|
      this.emit('message', msg);
 | 
						|
    }
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
XhrReceiver.prototype._cleanup = function() {
 | 
						|
  debug('_cleanup');
 | 
						|
  this.removeAllListeners();
 | 
						|
};
 | 
						|
 | 
						|
XhrReceiver.prototype.abort = function() {
 | 
						|
  debug('abort');
 | 
						|
  if (this.xo) {
 | 
						|
    this.xo.close();
 | 
						|
    debug('close');
 | 
						|
    this.emit('close', null, 'user');
 | 
						|
    this.xo = null;
 | 
						|
  }
 | 
						|
  this._cleanup();
 | 
						|
};
 | 
						|
 | 
						|
module.exports = XhrReceiver;
 |