[6a3a178] | 1 | 'use strict';
|
---|
| 2 |
|
---|
| 3 | var inherits = require('inherits')
|
---|
| 4 | , iframeUtils = require('../../utils/iframe')
|
---|
| 5 | , urlUtils = require('../../utils/url')
|
---|
| 6 | , EventEmitter = require('events').EventEmitter
|
---|
| 7 | , random = require('../../utils/random')
|
---|
| 8 | ;
|
---|
| 9 |
|
---|
| 10 | var debug = function() {};
|
---|
| 11 | if (process.env.NODE_ENV !== 'production') {
|
---|
| 12 | debug = require('debug')('sockjs-client:receiver:htmlfile');
|
---|
| 13 | }
|
---|
| 14 |
|
---|
| 15 | function HtmlfileReceiver(url) {
|
---|
| 16 | debug(url);
|
---|
| 17 | EventEmitter.call(this);
|
---|
| 18 | var self = this;
|
---|
| 19 | iframeUtils.polluteGlobalNamespace();
|
---|
| 20 |
|
---|
| 21 | this.id = 'a' + random.string(6);
|
---|
| 22 | url = urlUtils.addQuery(url, 'c=' + decodeURIComponent(iframeUtils.WPrefix + '.' + this.id));
|
---|
| 23 |
|
---|
| 24 | debug('using htmlfile', HtmlfileReceiver.htmlfileEnabled);
|
---|
| 25 | var constructFunc = HtmlfileReceiver.htmlfileEnabled ?
|
---|
| 26 | iframeUtils.createHtmlfile : iframeUtils.createIframe;
|
---|
| 27 |
|
---|
| 28 | global[iframeUtils.WPrefix][this.id] = {
|
---|
| 29 | start: function() {
|
---|
| 30 | debug('start');
|
---|
| 31 | self.iframeObj.loaded();
|
---|
| 32 | }
|
---|
| 33 | , message: function(data) {
|
---|
| 34 | debug('message', data);
|
---|
| 35 | self.emit('message', data);
|
---|
| 36 | }
|
---|
| 37 | , stop: function() {
|
---|
| 38 | debug('stop');
|
---|
| 39 | self._cleanup();
|
---|
| 40 | self._close('network');
|
---|
| 41 | }
|
---|
| 42 | };
|
---|
| 43 | this.iframeObj = constructFunc(url, function() {
|
---|
| 44 | debug('callback');
|
---|
| 45 | self._cleanup();
|
---|
| 46 | self._close('permanent');
|
---|
| 47 | });
|
---|
| 48 | }
|
---|
| 49 |
|
---|
| 50 | inherits(HtmlfileReceiver, EventEmitter);
|
---|
| 51 |
|
---|
| 52 | HtmlfileReceiver.prototype.abort = function() {
|
---|
| 53 | debug('abort');
|
---|
| 54 | this._cleanup();
|
---|
| 55 | this._close('user');
|
---|
| 56 | };
|
---|
| 57 |
|
---|
| 58 | HtmlfileReceiver.prototype._cleanup = function() {
|
---|
| 59 | debug('_cleanup');
|
---|
| 60 | if (this.iframeObj) {
|
---|
| 61 | this.iframeObj.cleanup();
|
---|
| 62 | this.iframeObj = null;
|
---|
| 63 | }
|
---|
| 64 | delete global[iframeUtils.WPrefix][this.id];
|
---|
| 65 | };
|
---|
| 66 |
|
---|
| 67 | HtmlfileReceiver.prototype._close = function(reason) {
|
---|
| 68 | debug('_close', reason);
|
---|
| 69 | this.emit('close', null, reason);
|
---|
| 70 | this.removeAllListeners();
|
---|
| 71 | };
|
---|
| 72 |
|
---|
| 73 | HtmlfileReceiver.htmlfileEnabled = false;
|
---|
| 74 |
|
---|
| 75 | // obfuscate to avoid firewalls
|
---|
| 76 | var axo = ['Active'].concat('Object').join('X');
|
---|
| 77 | if (axo in global) {
|
---|
| 78 | try {
|
---|
| 79 | HtmlfileReceiver.htmlfileEnabled = !!new global[axo]('htmlfile');
|
---|
| 80 | } catch (x) {
|
---|
| 81 | // intentionally empty
|
---|
| 82 | }
|
---|
| 83 | }
|
---|
| 84 |
|
---|
| 85 | HtmlfileReceiver.enabled = HtmlfileReceiver.htmlfileEnabled || iframeUtils.iframeEnabled;
|
---|
| 86 |
|
---|
| 87 | module.exports = HtmlfileReceiver;
|
---|