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