| '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; |