index.js 4.5 KB

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