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