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