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