forked from projectmoon/tenebrous-dicebot
88 lines
2.2 KiB
JavaScript
88 lines
2.2 KiB
JavaScript
|
'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;
|