info-iframe.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. 'use strict';
  2. var EventEmitter = require('events').EventEmitter
  3. , inherits = require('inherits')
  4. , utils = require('./utils/event')
  5. , IframeTransport = require('./transport/iframe')
  6. , InfoReceiverIframe = require('./info-iframe-receiver')
  7. ;
  8. var debug = function() {};
  9. if (process.env.NODE_ENV !== 'production') {
  10. debug = require('debug')('sockjs-client:info-iframe');
  11. }
  12. function InfoIframe(baseUrl, url) {
  13. var self = this;
  14. EventEmitter.call(this);
  15. var go = function() {
  16. var ifr = self.ifr = new IframeTransport(InfoReceiverIframe.transportName, url, baseUrl);
  17. ifr.once('message', function(msg) {
  18. if (msg) {
  19. var d;
  20. try {
  21. d = JSON.parse(msg);
  22. } catch (e) {
  23. debug('bad json', msg);
  24. self.emit('finish');
  25. self.close();
  26. return;
  27. }
  28. var info = d[0], rtt = d[1];
  29. self.emit('finish', info, rtt);
  30. }
  31. self.close();
  32. });
  33. ifr.once('close', function() {
  34. self.emit('finish');
  35. self.close();
  36. });
  37. };
  38. // TODO this seems the same as the 'needBody' from transports
  39. if (!global.document.body) {
  40. utils.attachEvent('load', go);
  41. } else {
  42. go();
  43. }
  44. }
  45. inherits(InfoIframe, EventEmitter);
  46. InfoIframe.enabled = function() {
  47. return IframeTransport.enabled();
  48. };
  49. InfoIframe.prototype.close = function() {
  50. if (this.ifr) {
  51. this.ifr.close();
  52. }
  53. this.removeAllListeners();
  54. this.ifr = null;
  55. };
  56. module.exports = InfoIframe;