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.

66 lines
2.0KB

  1. import makeArvadosRequest from 'make-arvados-request';
  2. function rdvHash(serviceId, locator) {
  3. let blockHash = /^[0-9a-f]{32}/.exec(locator);
  4. if (!blockHash)
  5. throw Error('Invalid locator');
  6. if (typeof(serviceId) !== 'string')
  7. throw Error('Invalid service ID');
  8. let res = CryptoJS.MD5(serviceId + blockHash).toString();
  9. return res;
  10. }
  11. function wbDownloadFile(arvHost, arvToken,
  12. manifestReader, path) {
  13. const file = manifestReader.getFile(path);
  14. const name = path.split('/').reverse()[0];
  15. const blockRefs = file[0];
  16. let services;
  17. let prom = makeArvadosRequest(arvHost, arvToken,
  18. '/arvados/v1/keep_services/accessible');
  19. prom = prom.then(xhr => (services = xhr.response['items']));
  20. const blocks = [];
  21. for (let i = 0; i < blockRefs.length; i++) {
  22. prom = prom.then(() => {
  23. const [ locator, position, size ] = blockRefs[i];
  24. const weights = services.map(s => rdvHash(s['uuid'], locator));
  25. const order = Object.keys(services).sort((a, b) => weights[b].localeCompare(weights[a]));
  26. const orderedServices = order.map(i => services[i]);
  27. let k = 0;
  28. const cb = () => {
  29. if (k >= orderedServices.length)
  30. throw Error('Block not found');
  31. const svc = orderedServices[k];
  32. k++;
  33. let prom_1 = makeArvadosRequest(svc.service_host +
  34. ':' + svc.service_port, arvToken,
  35. '/' + locator, { 'useSsl': svc.service_ssl_flag,
  36. 'responseType': 'arraybuffer' });
  37. //prom_1 = prom_1.then(xhr => xhr.response);
  38. prom_1 = prom_1.catch(cb);
  39. return prom_1;
  40. };
  41. return cb().then(xhr => (blocks.append(xhr.response.slice(position, size))));
  42. });
  43. }
  44. prom = prom.then(() => {
  45. const blob = new Blob(blocks);
  46. const url = window.URL.createObjectURL(blob);
  47. const a = document.createElement('a');
  48. a.href = url;
  49. a.download = name;
  50. });
  51. }
  52. export default wbDownloadFile;