index.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. window.exports = {};
  2. window.exports.require = function(id, callback) {
  3. if (!/^[a-zA-Z0-9_-]+$/.test(id)) {
  4. throw new Error("Invalid module '" + id + "'.");
  5. }
  6. var base = window.location.href || '';
  7. base = base.split('?')[0].split('#')[0];
  8. const index = base.lastIndexOf('/');
  9. base = index > 0 ? base.substring(0, index + 1) : base;
  10. base = base.lastIndexOf('/') === base.length - 1 ? base : base + '/';
  11. var url = base + id + '.js';
  12. var document = window.document;
  13. var scripts = document.head.getElementsByTagName('script');
  14. for (var i = 0; i < scripts.length; i++) {
  15. if (url === scripts[i].getAttribute('src')) {
  16. throw new Error("Duplicate import of '" + url + "'.");
  17. }
  18. }
  19. var script = document.createElement('script');
  20. script.setAttribute('id', id);
  21. script.setAttribute('type', 'module');
  22. /* eslint-disable no-use-before-define */
  23. var loadHandler = function() {
  24. script.removeEventListener('load', loadHandler);
  25. script.removeEventListener('error', errorHandler);
  26. callback();
  27. };
  28. var errorHandler = function(e) {
  29. script.removeEventListener('load', loadHandler);
  30. script.removeEventListener('error', errorHandler);
  31. callback(null, new Error("The script '" + e.target.src + "' failed to load."));
  32. };
  33. /* eslint-enable no-use-before-define */
  34. script.addEventListener('load', loadHandler, false);
  35. script.addEventListener('error', errorHandler, false);
  36. script.setAttribute('src', url);
  37. document.head.appendChild(script);
  38. };
  39. window.exports.preload = function(callback) {
  40. var modules = [
  41. ['view'],
  42. ['json', 'xml', 'protobuf', 'hdf5', 'grapher', 'browser'],
  43. ['base', 'text', 'flatbuffers', 'flexbuffers', 'zip', 'tar', 'python']
  44. ];
  45. var next = function() {
  46. if (modules.length === 0) {
  47. callback();
  48. } else {
  49. var ids = modules.pop();
  50. /* eslint-disable no-loop-func */
  51. var resolved = ids.length;
  52. for (var i = 0; i < ids.length; i++) {
  53. window.exports.require(ids[i], function(module, error) {
  54. if (error) {
  55. callback(null, error);
  56. } else {
  57. resolved--;
  58. if (resolved === 0) {
  59. next();
  60. }
  61. }
  62. });
  63. }
  64. /* eslint-enable no-loop-func */
  65. }
  66. };
  67. next();
  68. };
  69. window.exports.terminate = function(message) {
  70. var document = window.document;
  71. document.getElementById('message-text').innerText = message;
  72. var button = document.getElementById('message-button');
  73. button.style.display = 'none';
  74. button.onclick = null;
  75. document.body.setAttribute('class', 'welcome message');
  76. if (window.__view__) {
  77. /* eslint-disable no-unused-vars */
  78. try {
  79. window.__view__.show('welcome message');
  80. } catch (error) {
  81. // continue regardless of error
  82. }
  83. /* eslint-enable no-unused-vars */
  84. }
  85. };
  86. window.addEventListener('error', function (event) {
  87. var error = event instanceof window.ErrorEvent && event.error && event.error instanceof Error ? event.error : new Error(event && event.message ? event.message : JSON.stringify(event));
  88. window.exports.terminate(error.message);
  89. });
  90. window.addEventListener('load', function() {
  91. if (typeof Symbol !== 'function' || typeof Symbol.asyncIterator !== 'symbol' ||
  92. typeof BigInt !== 'function' || typeof BigInt.asIntN !== 'function' || typeof BigInt.asUintN !== 'function' || typeof DataView.prototype.getBigInt64 !== 'function') {
  93. throw new Error('Please update your browser to use this application.');
  94. }
  95. var ua = window.navigator.userAgent;
  96. var chrome = ua.match(/Chrom(e|ium)\/([0-9]+)\./);
  97. var safari = ua.match(/Version\/(\d+)\.(\d+).*Safari/);
  98. var firefox = ua.match(/Firefox\/([0-9]+)\./);
  99. if ((Array.isArray(chrome) && parseInt(chrome[2], 10) < 86) ||
  100. (Array.isArray(safari) && (parseInt(safari[1], 10) < 16 || (parseInt(safari[1], 10) === 16 && parseInt(safari[2], 10) < 4))) ||
  101. (Array.isArray(firefox) && parseInt(firefox[1], 10) < 114)) {
  102. throw new Error('Please update your browser to use this application.');
  103. }
  104. window.exports.preload(function(value, error) {
  105. if (error) {
  106. window.exports.terminate(error.message);
  107. } else {
  108. var host = new window.exports.browser.Host();
  109. window.__view__ = new window.exports.view.View(host);
  110. window.__view__.start();
  111. }
  112. });
  113. });