You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.2 KiB
88 lines
2.2 KiB
'use strict';
|
|
|
|
var inherits = require('inherits')
|
|
, iframeUtils = require('../../utils/iframe')
|
|
, urlUtils = require('../../utils/url')
|
|
, EventEmitter = require('events').EventEmitter
|
|
, random = require('../../utils/random')
|
|
;
|
|
|
|
var debug = function() {};
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
debug = require('debug')('sockjs-client:receiver:htmlfile');
|
|
}
|
|
|
|
function HtmlfileReceiver(url) {
|
|
debug(url);
|
|
EventEmitter.call(this);
|
|
var self = this;
|
|
iframeUtils.polluteGlobalNamespace();
|
|
|
|
this.id = 'a' + random.string(6);
|
|
url = urlUtils.addQuery(url, 'c=' + decodeURIComponent(iframeUtils.WPrefix + '.' + this.id));
|
|
|
|
debug('using htmlfile', HtmlfileReceiver.htmlfileEnabled);
|
|
var constructFunc = HtmlfileReceiver.htmlfileEnabled ?
|
|
iframeUtils.createHtmlfile : iframeUtils.createIframe;
|
|
|
|
global[iframeUtils.WPrefix][this.id] = {
|
|
start: function() {
|
|
debug('start');
|
|
self.iframeObj.loaded();
|
|
}
|
|
, message: function(data) {
|
|
debug('message', data);
|
|
self.emit('message', data);
|
|
}
|
|
, stop: function() {
|
|
debug('stop');
|
|
self._cleanup();
|
|
self._close('network');
|
|
}
|
|
};
|
|
this.iframeObj = constructFunc(url, function() {
|
|
debug('callback');
|
|
self._cleanup();
|
|
self._close('permanent');
|
|
});
|
|
}
|
|
|
|
inherits(HtmlfileReceiver, EventEmitter);
|
|
|
|
HtmlfileReceiver.prototype.abort = function() {
|
|
debug('abort');
|
|
this._cleanup();
|
|
this._close('user');
|
|
};
|
|
|
|
HtmlfileReceiver.prototype._cleanup = function() {
|
|
debug('_cleanup');
|
|
if (this.iframeObj) {
|
|
this.iframeObj.cleanup();
|
|
this.iframeObj = null;
|
|
}
|
|
delete global[iframeUtils.WPrefix][this.id];
|
|
};
|
|
|
|
HtmlfileReceiver.prototype._close = function(reason) {
|
|
debug('_close', reason);
|
|
this.emit('close', null, reason);
|
|
this.removeAllListeners();
|
|
};
|
|
|
|
HtmlfileReceiver.htmlfileEnabled = false;
|
|
|
|
// obfuscate to avoid firewalls
|
|
var axo = ['Active'].concat('Object').join('X');
|
|
if (axo in global) {
|
|
try {
|
|
HtmlfileReceiver.htmlfileEnabled = !!new global[axo]('htmlfile');
|
|
} catch (x) {
|
|
// intentionally empty
|
|
}
|
|
}
|
|
|
|
HtmlfileReceiver.enabled = HtmlfileReceiver.htmlfileEnabled || iframeUtils.iframeEnabled;
|
|
|
|
module.exports = HtmlfileReceiver;
|