[6a3a178] | 1 | 'use strict';
|
---|
| 2 |
|
---|
| 3 | var inherits = require('inherits')
|
---|
| 4 | , EventEmitter = require('events').EventEmitter
|
---|
| 5 | ;
|
---|
| 6 |
|
---|
| 7 | var debug = function() {};
|
---|
| 8 | if (process.env.NODE_ENV !== 'production') {
|
---|
| 9 | debug = require('debug')('sockjs-client:receiver:xhr');
|
---|
| 10 | }
|
---|
| 11 |
|
---|
| 12 | function XhrReceiver(url, AjaxObject) {
|
---|
| 13 | debug(url);
|
---|
| 14 | EventEmitter.call(this);
|
---|
| 15 | var self = this;
|
---|
| 16 |
|
---|
| 17 | this.bufferPosition = 0;
|
---|
| 18 |
|
---|
| 19 | this.xo = new AjaxObject('POST', url, null);
|
---|
| 20 | this.xo.on('chunk', this._chunkHandler.bind(this));
|
---|
| 21 | this.xo.once('finish', function(status, text) {
|
---|
| 22 | debug('finish', status, text);
|
---|
| 23 | self._chunkHandler(status, text);
|
---|
| 24 | self.xo = null;
|
---|
| 25 | var reason = status === 200 ? 'network' : 'permanent';
|
---|
| 26 | debug('close', reason);
|
---|
| 27 | self.emit('close', null, reason);
|
---|
| 28 | self._cleanup();
|
---|
| 29 | });
|
---|
| 30 | }
|
---|
| 31 |
|
---|
| 32 | inherits(XhrReceiver, EventEmitter);
|
---|
| 33 |
|
---|
| 34 | XhrReceiver.prototype._chunkHandler = function(status, text) {
|
---|
| 35 | debug('_chunkHandler', status);
|
---|
| 36 | if (status !== 200 || !text) {
|
---|
| 37 | return;
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | for (var idx = -1; ; this.bufferPosition += idx + 1) {
|
---|
| 41 | var buf = text.slice(this.bufferPosition);
|
---|
| 42 | idx = buf.indexOf('\n');
|
---|
| 43 | if (idx === -1) {
|
---|
| 44 | break;
|
---|
| 45 | }
|
---|
| 46 | var msg = buf.slice(0, idx);
|
---|
| 47 | if (msg) {
|
---|
| 48 | debug('message', msg);
|
---|
| 49 | this.emit('message', msg);
|
---|
| 50 | }
|
---|
| 51 | }
|
---|
| 52 | };
|
---|
| 53 |
|
---|
| 54 | XhrReceiver.prototype._cleanup = function() {
|
---|
| 55 | debug('_cleanup');
|
---|
| 56 | this.removeAllListeners();
|
---|
| 57 | };
|
---|
| 58 |
|
---|
| 59 | XhrReceiver.prototype.abort = function() {
|
---|
| 60 | debug('abort');
|
---|
| 61 | if (this.xo) {
|
---|
| 62 | this.xo.close();
|
---|
| 63 | debug('close');
|
---|
| 64 | this.emit('close', null, 'user');
|
---|
| 65 | this.xo = null;
|
---|
| 66 | }
|
---|
| 67 | this._cleanup();
|
---|
| 68 | };
|
---|
| 69 |
|
---|
| 70 | module.exports = XhrReceiver;
|
---|