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!
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.0KB

  1. import { h, Component } from 'preact';
  2. import makeArvadosRequest from 'make-arvados-request';
  3. class WBDownloadPage extends Component {
  4. componentDidMount() {
  5. const { app, blocksBlobUrl } = this.props;
  6. const { arvHost, arvToken } = app.state;
  7. let prom = new Promise((accept, reject) => {
  8. const xhr = new XMLHttpRequest();
  9. xhr.open('GET', blocksBlobUrl);
  10. xhr.onreadystatechange = () => {
  11. if (xhr.readyState !== 4)
  12. return;
  13. if (xhr.status !== 200)
  14. reject(xhr);
  15. else
  16. accept(xhr);
  17. };
  18. xhr.responseType = 'blob';
  19. xhr.send();
  20. });
  21. prom = prom.then(xhr => xhr.response.text());
  22. let name, file;
  23. const { streamSaver, location } = window;
  24. streamSaver.mitm = location.protocol + '//' +
  25. location.hostname + (location.port ?
  26. ':' + location.port : '') + '/mitm.html';
  27. let fileStream;
  28. let writer;
  29. let done = false;
  30. prom = prom.then(text => {
  31. let _;
  32. [ _, _, name, file ] = JSON.parse(text);
  33. fileStream = streamSaver.createWriteStream(name, {
  34. size: file[1]
  35. });
  36. writer = fileStream.getWriter();
  37. window.onunload = () => {
  38. writer.abort()
  39. };
  40. window.onbeforeunload = evt => {
  41. if (!done) {
  42. evt.returnValue = `Are you sure you want to leave?`;
  43. }
  44. };
  45. const filters = [
  46. ['service_type', '=', 'proxy']
  47. ];
  48. return makeArvadosRequest(arvHost, arvToken,
  49. '/arvados/v1/keep_services?filters=' +
  50. encodeURIComponent(JSON.stringify(filters)));
  51. });
  52. prom = prom.then(xhr => {
  53. const services = xhr.response.items;
  54. const i = Math.floor(Math.random() * services.length);
  55. const proxy = services[i];
  56. let prom_1 = new Promise(accept => accept());
  57. for (let k = 0; k < file[0].length; k++) {
  58. const loc = file[0][k];
  59. prom_1 = prom_1.then(() => makeArvadosRequest(
  60. proxy.service_host + ':' + proxy.service_port,
  61. arvToken,
  62. '/' + loc[0],
  63. { 'useSsl': proxy.service_ssl_flag,
  64. 'responseType': 'arraybuffer' }
  65. ));
  66. prom_1 = prom_1.then(xhr_1 => {
  67. const blk = xhr_1.response.slice(loc[1], loc[2]);
  68. // const r = new Response(blk);
  69. // r.body.pipeTo(fileStream);
  70. writer.write(new Uint8Array(blk));
  71. });
  72. }
  73. return prom_1;
  74. });
  75. prom = prom.then(() => {
  76. writer.close();
  77. done = true;
  78. });
  79. }
  80. render() {
  81. return (
  82. <div class="container-fluid">
  83. <div class="card my-3">
  84. <div class="card-body">
  85. Downloading, please wait...
  86. </div>
  87. </div>
  88. <div class="alert alert-danger" role="alert">
  89. Do not close this window until the download is finished.
  90. </div>
  91. </div>
  92. );
  93. }
  94. }
  95. export default WBDownloadPage;