IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
3.2KB

  1. //
  2. // Copyright (C) Stanislaw Adaszewski, 2020
  3. // Contact: s.adaszewski@gmail.com
  4. // Website: https://adared.ch/wba
  5. // License: GNU Affero General Public License, Version 3
  6. //
  7. import { h, Component } from 'preact';
  8. import makeArvadosRequest from 'make-arvados-request';
  9. function downloadFile(arvHost, arvToken, file) {
  10. const blockRefs = file[0];
  11. let prom = makeArvadosRequest(arvHost, arvToken,
  12. '/arvados/v1/keep_services');
  13. let proxy;
  14. prom = prom.then(xhr => {
  15. const services = xhr.response['items'];
  16. const proxies = services.filter(svc => (svc.service_type === 'proxy'));
  17. const n = Math.floor(Math.random() * proxies.length);
  18. proxy = proxies[n];
  19. });
  20. const blocks = [];
  21. for (let i = 0; i < blockRefs.length; i++) {
  22. let locator, start, end;
  23. prom = prom.then(() => {
  24. [ locator, start, end ] = blockRefs[i];
  25. return makeArvadosRequest(
  26. proxy.service_host + ':' + proxy.service_port,
  27. arvToken, '/' + locator,
  28. { 'useSsl': proxy.service_ssl_flag,
  29. 'responseType': 'arraybuffer' }
  30. );
  31. });
  32. prom = prom.then(xhr => blocks.push(xhr.response.slice(start, end)));
  33. }
  34. prom = prom.then(() => {
  35. const url = URL.createObjectURL(new Blob(blocks));
  36. const totalSize = blocks.reduce((a, b) => a.length + b.length);
  37. const big = new Uint8Array(totalSize);
  38. for (let i = 0, pos = 0; i < blocks.length; i++) {
  39. big.set(blocks[i], pos);
  40. pos += blocks[i].length;
  41. }
  42. // papayaContainers[0].startPapaya();
  43. const poll = () => {
  44. setTimeout(() => {
  45. console.log('Polling Papaya startup...')
  46. if (window.papaya && window.papaya.Container) { // window.papayaContainers && window.papayaContainers[0]) {
  47. console.log('Great, Papaya started!');
  48. papaya.Container.startPapaya();
  49. //papaya.Container.addImage(0, big.buffer);
  50. document.body.id = "bod";
  51. document.body.style.background = "#555";
  52. papaya.Container.addViewer("bod", {
  53. 'binaryImages': [ big.buffer ],
  54. 'noNewFiles': true,
  55. });
  56. } else
  57. poll();
  58. }, 1000);
  59. };
  60. //setTimeout(poll, 10000);
  61. poll();
  62. });
  63. }
  64. class WBImageViewerPage extends Component {
  65. componentDidMount() {
  66. const { blobUrl, app } = this.props;
  67. const { arvHost, arvToken } = app.state;
  68. let prom = new Promise((accept, reject) => {
  69. const xhr = new XMLHttpRequest();
  70. xhr.open('GET', blobUrl);
  71. xhr.onreadystatechange = () => {
  72. if (xhr.readyState !== 4) return;
  73. if (xhr.status !== 200) reject(xhr);
  74. else accept(xhr);
  75. };
  76. xhr.responseType = 'blob';
  77. xhr.send();
  78. });
  79. prom = prom.then(xhr => xhr.response.text());
  80. prom = prom.then(data => {
  81. data = JSON.parse(data);
  82. downloadFile(arvHost, arvToken, data.file);
  83. });
  84. }
  85. render() {
  86. return (
  87. <div>
  88. <script language="javascript" src="/js/papaya.js"></script>
  89. <div id="papaya" style="width: auto; height: 100%; margin: 0;"></div>
  90. </div>
  91. );
  92. }
  93. }
  94. export default WBImageViewerPage;