@rapidimages/storage-api-client
Version:
storage api client
184 lines (167 loc) • 21.5 kB
JavaScript
import once from 'once';
function progress (files) {
let offset = 0;
const offsets = files.map(x => {
offset += x.size;
return {
name: x.name,
offset: offset
}
});
return onProgress
function onProgress (e) {
const percentage = (e.loaded / e.total) * 100;
const file =
offsets.filter(x => e.loaded <= x.offset)[0] || offsets.slice(-1)[0];
return {
percentage: percentage,
total: e.total,
loaded: e.loaded,
totalMB: (e.total / 1e6).toFixed(2) + ' MB',
uploadedMB: (e.loaded / 1e6).toFixed(2) + ' MB',
file: file ? file.name : ''
}
}
}
function onProgress (e) {
const percentage = (e.loaded / e.total) * 100;
return {
file: e.file,
total: e.total,
loaded: e.loaded,
percentage
}
}
var defaults = opts =>
Object.assign(
{
onUploadProgress () {},
onHashProgress () {},
onUnknown () {},
onRequest () {}
},
opts
);
var browserDebug = name => (...args) => {
const filter = window.localStorage.getItem('debug') || '';
if (filter === '*' || filter.indexOf(name) !== -1) {
console.log.apply(console, [name + ':'].concat(args));
}
};
var rushaString = () => window.atob('LyohIHJ1c2hhIDIwMTgtMDItMTkgKi8KCihmdW5jdGlvbiBlKHQscil7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZT09PSJvYmplY3QiKW1vZHVsZS5leHBvcnRzPXIoKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKWRlZmluZShbXSxyKTtlbHNlIGlmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCIpZXhwb3J0c1siUnVzaGEiXT1yKCk7ZWxzZSB0WyJSdXNoYSJdPXIoKX0pKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCI/c2VsZjp0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIHIobil7aWYodFtuXSl7cmV0dXJuIHRbbl0uZXhwb3J0c312YXIgYT10W25dPXtpOm4sbDpmYWxzZSxleHBvcnRzOnt9fTtlW25dLmNhbGwoYS5leHBvcnRzLGEsYS5leHBvcnRzLHIpO2EubD10cnVlO3JldHVybiBhLmV4cG9ydHN9ci5tPWU7ci5jPXQ7ci5kPWZ1bmN0aW9uKGUsdCxuKXtpZighci5vKGUsdCkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsZ2V0Om59KX19O3Iubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24gdCgpe3JldHVybiBlWyJkZWZhdWx0Il19OmZ1bmN0aW9uIHQoKXtyZXR1cm4gZX07ci5kKHQsImEiLHQpO3JldHVybiB0fTtyLm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9O3IucD0iIjtyZXR1cm4gcihyLnM9Myl9KFtmdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19dmFyIGE9cig1KTt2YXIgaT1yKDEpLG89aS50b0hleCxzPWkuY2VpbEhlYXBTaXplO3ZhciBmPXIoNik7dmFyIHU9ZnVuY3Rpb24oZSl7Zm9yKGUrPTk7ZSU2ND4wO2UrPTEpe31yZXR1cm4gZX07dmFyIGM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1uZXcgVWludDhBcnJheShlLmJ1ZmZlcik7dmFyIG49dCU0LGE9dC1uO3N3aXRjaChuKXtjYXNlIDA6clthKzNdPTA7Y2FzZSAxOnJbYSsyXT0wO2Nhc2UgMjpyW2ErMV09MDtjYXNlIDM6clthKzBdPTB9Zm9yKHZhciBpPSh0Pj4yKSsxO2k8ZS5sZW5ndGg7aSsrKXtlW2ldPTB9fTt2YXIgaD1mdW5jdGlvbihlLHQscil7ZVt0Pj4yXXw9MTI4PDwyNC0odCU0PDwzKTtlWygodD4+MikrMiZ+MTUpKzE0XT1yLygxPDwyOSl8MDtlWygodD4+MikrMiZ+MTUpKzE1XT1yPDwzfTt2YXIgcD1mdW5jdGlvbihlLHQpe3ZhciByPW5ldyBJbnQzMkFycmF5KGUsdCszMjAsNSk7dmFyIG49bmV3IEludDMyQXJyYXkoNSk7dmFyIGE9bmV3IERhdGFWaWV3KG4uYnVmZmVyKTthLnNldEludDMyKDAsclswXSxmYWxzZSk7YS5zZXRJbnQzMig0LHJbMV0sZmFsc2UpO2Euc2V0SW50MzIoOCxyWzJdLGZhbHNlKTthLnNldEludDMyKDEyLHJbM10sZmFsc2UpO2Euc2V0SW50MzIoMTYscls0XSxmYWxzZSk7cmV0dXJuIG59O3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSk7dD10fHw2NCoxMDI0O2lmKHQlNjQ+MCl7dGhyb3cgbmV3IEVycm9yKCJDaHVuayBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxMjggYml0Iil9dGhpcy5fb2Zmc2V0PTA7dGhpcy5fbWF4Q2h1bmtMZW49dDt0aGlzLl9wYWRNYXhDaHVua0xlbj11KHQpO3RoaXMuX2hlYXA9bmV3IEFycmF5QnVmZmVyKHModGhpcy5fcGFkTWF4Q2h1bmtMZW4rMzIwKzIwKSk7dGhpcy5faDMyPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hlYXApO3RoaXMuX2g4PW5ldyBJbnQ4QXJyYXkodGhpcy5faGVhcCk7dGhpcy5fY29yZT1uZXcgYSh7SW50MzJBcnJheTpJbnQzMkFycmF5fSx7fSx0aGlzLl9oZWFwKX1lLnByb3RvdHlwZS5faW5pdFN0YXRlPWZ1bmN0aW9uIGUodCxyKXt0aGlzLl9vZmZzZXQ9MDt2YXIgbj1uZXcgSW50MzJBcnJheSh0LHIrMzIwLDUpO25bMF09MTczMjU4NDE5MztuWzFdPS0yNzE3MzM4Nzk7blsyXT0tMTczMjU4NDE5NDtuWzNdPTI3MTczMzg3ODtuWzRdPS0xMDA5NTg5Nzc2fTtlLnByb3RvdHlwZS5fcGFkQ2h1bms9ZnVuY3Rpb24gZSh0LHIpe3ZhciBuPXUodCk7dmFyIGE9bmV3IEludDMyQXJyYXkodGhpcy5faGVhcCwwLG4+PjIpO2MoYSx0KTtoKGEsdCxyKTtyZXR1cm4gbn07ZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uIGUodCxyLG4sYSl7Zih0LHRoaXMuX2g4LHRoaXMuX2gzMixyLG4sYXx8MCl9O2UucHJvdG90eXBlLl9jb3JlQ2FsbD1mdW5jdGlvbiBlKHQscixuLGEsaSl7dmFyIG89bjt0aGlzLl93cml0ZSh0LHIsbik7aWYoaSl7bz10aGlzLl9wYWRDaHVuayhuLGEpfXRoaXMuX2NvcmUuaGFzaChvLHRoaXMuX3BhZE1heENodW5rTGVuKX07ZS5wcm90b3R5cGUucmF3RGlnZXN0PWZ1bmN0aW9uIGUodCl7dmFyIHI9dC5ieXRlTGVuZ3RofHx0Lmxlbmd0aHx8dC5zaXplfHwwO3RoaXMuX2luaXRTdGF0ZSh0aGlzLl9oZWFwLHRoaXMuX3BhZE1heENodW5rTGVuKTt2YXIgbj0wLGE9dGhpcy5fbWF4Q2h1bmtMZW47Zm9yKG49MDtyPm4rYTtuKz1hKXt0aGlzLl9jb3JlQ2FsbCh0LG4sYSxyLGZhbHNlKX10aGlzLl9jb3JlQ2FsbCh0LG4sci1uLHIsdHJ1ZSk7cmV0dXJuIHAodGhpcy5faGVhcCx0aGlzLl9wYWRNYXhDaHVua0xlbil9O2UucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbiBlKHQpe3JldHVybiBvKHRoaXMucmF3RGlnZXN0KHQpLmJ1ZmZlcil9O2UucHJvdG90eXBlLmRpZ2VzdEZyb21TdHJpbmc9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdGhpcy5kaWdlc3QodCl9O2UucHJvdG90eXBlLmRpZ2VzdEZyb21CdWZmZXI9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdGhpcy5kaWdlc3QodCl9O2UucHJvdG90eXBlLmRpZ2VzdEZyb21BcnJheUJ1ZmZlcj1mdW5jdGlvbiBlKHQpe3JldHVybiB0aGlzLmRpZ2VzdCh0KX07ZS5wcm90b3R5cGUucmVzZXRTdGF0ZT1mdW5jdGlvbiBlKCl7dGhpcy5faW5pdFN0YXRlKHRoaXMuX2hlYXAsdGhpcy5fcGFkTWF4Q2h1bmtMZW4pO3JldHVybiB0aGlzfTtlLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24gZSh0KXt2YXIgcj0wO3ZhciBuPXQuYnl0ZUxlbmd0aHx8dC5sZW5ndGh8fHQuc2l6ZXx8MDt2YXIgYT10aGlzLl9vZmZzZXQldGhpcy5fbWF4Q2h1bmtMZW47dmFyIGk9dm9pZCAwO3RoaXMuX29mZnNldCs9bjt3aGlsZShyPG4pe2k9TWF0aC5taW4obi1yLHRoaXMuX21heENodW5rTGVuLWEpO3RoaXMuX3dyaXRlKHQscixpLGEpO2ErPWk7cis9aTtpZihhPT09dGhpcy5fbWF4Q2h1bmtMZW4pe3RoaXMuX2NvcmUuaGFzaCh0aGlzLl9tYXhDaHVua0xlbix0aGlzLl9wYWRNYXhDaHVua0xlbik7YT0wfX1yZXR1cm4gdGhpc307ZS5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24gZSgpe3ZhciB0PXRoaXMuX29mZnNldCV0aGlzLl9tYXhDaHVua0xlbjt2YXIgcj12b2lkIDA7aWYoIXQpe3ZhciBuPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hlYXAsdGhpcy5fcGFkTWF4Q2h1bmtMZW4rMzIwLDUpO3I9bi5idWZmZXIuc2xpY2Uobi5ieXRlT2Zmc2V0LG4uYnl0ZU9mZnNldCtuLmJ5dGVMZW5ndGgpfWVsc2V7cj10aGlzLl9oZWFwLnNsaWNlKDApfXJldHVybntvZmZzZXQ6dGhpcy5fb2Zmc2V0LGhlYXA6cn19O2UucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uIGUodCl7dGhpcy5fb2Zmc2V0PXQub2Zmc2V0O2lmKHQuaGVhcC5ieXRlTGVuZ3RoPT09MjApe3ZhciByPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hlYXAsdGhpcy5fcGFkTWF4Q2h1bmtMZW4rMzIwLDUpO3Iuc2V0KG5ldyBJbnQzMkFycmF5KHQuaGVhcCkpfWVsc2V7dGhpcy5faDMyLnNldChuZXcgSW50MzJBcnJheSh0LmhlYXApKX1yZXR1cm4gdGhpc307ZS5wcm90b3R5cGUucmF3RW5kPWZ1bmN0aW9uIGUoKXt2YXIgdD10aGlzLl9vZmZzZXQ7dmFyIHI9dCV0aGlzLl9tYXhDaHVua0xlbjt2YXIgbj10aGlzLl9wYWRDaHVuayhyLHQpO3RoaXMuX2NvcmUuaGFzaChuLHRoaXMuX3BhZE1heENodW5rTGVuKTt2YXIgYT1wKHRoaXMuX2hlYXAsdGhpcy5fcGFkTWF4Q2h1bmtMZW4pO3RoaXMuX2luaXRTdGF0ZSh0aGlzLl9oZWFwLHRoaXMuX3BhZE1heENodW5rTGVuKTtyZXR1cm4gYX07ZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uIGUoKXtyZXR1cm4gbyh0aGlzLnJhd0VuZCgpLmJ1ZmZlcil9O3JldHVybiBlfSgpO2UuZXhwb3J0cz1sO2UuZXhwb3J0cy5fY29yZT1hfSxmdW5jdGlvbihlLHQpe3ZhciByPW5ldyBBcnJheSgyNTYpO2Zvcih2YXIgbj0wO248MjU2O24rKyl7cltuXT0objwxNj8iMCI6IiIpK24udG9TdHJpbmcoMTYpfWUuZXhwb3J0cy50b0hleD1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVWludDhBcnJheShlKTt2YXIgbj1uZXcgQXJyYXkoZS5ieXRlTGVuZ3RoKTtmb3IodmFyIGE9MDthPG4ubGVuZ3RoO2ErKyl7blthXT1yW3RbYV1dfXJldHVybiBuLmpvaW4oIiIpfTtlLmV4cG9ydHMuY2VpbEhlYXBTaXplPWZ1bmN0aW9uKGUpe3ZhciB0PTA7aWYoZTw9NjU1MzYpcmV0dXJuIDY1NTM2O2lmKGU8MTY3NzcyMTYpe2Zvcih0PTE7dDxlO3Q9dDw8MSl7fX1lbHNle2Zvcih0PTE2Nzc3MjE2O3Q8ZTt0Kz0xNjc3NzIxNil7fX1yZXR1cm4gdH07ZS5leHBvcnRzLmlzRGVkaWNhdGVkV29ya2VyU2NvcGU9ZnVuY3Rpb24oZSl7dmFyIHQ9Ildvcmtlckdsb2JhbFNjb3BlImluIGUmJmUgaW5zdGFuY2VvZiBlLldvcmtlckdsb2JhbFNjb3BlO3ZhciByPSJTaGFyZWRXb3JrZXJHbG9iYWxTY29wZSJpbiBlJiZlIGluc3RhbmNlb2YgZS5TaGFyZWRXb3JrZXJHbG9iYWxTY29wZTt2YXIgbj0iU2VydmljZVdvcmtlckdsb2JhbFNjb3BlImluIGUmJmUgaW5zdGFuY2VvZiBlLlNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTtyZXR1cm4gdCYmIXImJiFufX0sZnVuY3Rpb24oZSx0LHIpe2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPXIoMCk7dmFyIHQ9ZnVuY3Rpb24oZSx0LHIpe3RyeXtyZXR1cm4gcihudWxsLGUuZGlnZXN0KHQpKX1jYXRjaChlKXtyZXR1cm4gcihlKX19O3ZhciBuPWZ1bmN0aW9uKGUsdCxyLGEsaSl7dmFyIG89bmV3IHNlbGYuRmlsZVJlYWRlcjtvLm9ubG9hZGVuZD1mdW5jdGlvbiBzKCl7aWYoby5lcnJvcil7cmV0dXJuIGkoby5lcnJvcil9dmFyIGY9by5yZXN1bHQ7dCs9by5yZXN1bHQuYnl0ZUxlbmd0aDt0cnl7ZS5hcHBlbmQoZil9Y2F0Y2goZSl7aShlKTtyZXR1cm59aWYodDxhLnNpemUpe24oZSx0LHIsYSxpKX1lbHNle2kobnVsbCxlLmVuZCgpKX19O28ucmVhZEFzQXJyYXlCdWZmZXIoYS5zbGljZSh0LHQrcikpfTt2YXIgYT10cnVlO3NlbGYub25tZXNzYWdlPWZ1bmN0aW9uKHIpe2lmKCFhKXtyZXR1cm59dmFyIGk9ci5kYXRhLmRhdGEsbz1yLmRhdGEuZmlsZSxzPXIuZGF0YS5pZDtpZih0eXBlb2Ygcz09PSJ1bmRlZmluZWQiKXJldHVybjtpZighbyYmIWkpcmV0dXJuO3ZhciBmPXIuZGF0YS5ibG9ja1NpemV8fDQqMTAyNCoxMDI0O3ZhciB1PW5ldyBlKGYpO3UucmVzZXRTdGF0ZSgpO3ZhciBjPWZ1bmN0aW9uKGUsdCl7aWYoIWUpe3NlbGYucG9zdE1lc3NhZ2Uoe2lkOnMsaGFzaDp0fSl9ZWxzZXtzZWxmLnBvc3RNZXNzYWdlKHtpZDpzLGVycm9yOmUubmFtZX0pfX07aWYoaSl0KHUsaSxjKTtpZihvKW4odSwwLGYsbyxjKX07cmV0dXJuIGZ1bmN0aW9uKCl7YT1mYWxzZX19fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig0KTt2YXIgYT1yKDApO3ZhciBpPXIoNyk7dmFyIG89cigyKTt2YXIgcz1yKDEpLGY9cy5pc0RlZGljYXRlZFdvcmtlclNjb3BlO3ZhciB1PXR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCImJmYoc2VsZik7YS5kaXNhYmxlV29ya2VyQmVoYXZpb3VyPXU/bygpOmZ1bmN0aW9uKCl7fTthLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbigpe3ZhciBlPW4oMik7dmFyIHQ9ZS50ZXJtaW5hdGU7ZS50ZXJtaW5hdGU9ZnVuY3Rpb24oKXtVUkwucmV2b2tlT2JqZWN0VVJMKGUub2JqZWN0VVJMKTt0LmNhbGwoZSl9O3JldHVybiBlfTthLmNyZWF0ZUhhc2g9aTtlLmV4cG9ydHM9YX0sZnVuY3Rpb24oZSx0LHIpe2Z1bmN0aW9uIG4oZSl7dmFyIHQ9e307ZnVuY3Rpb24gcihuKXtpZih0W25dKXJldHVybiB0W25dLmV4cG9ydHM7dmFyIGE9dFtuXT17aTpuLGw6ZmFsc2UsZXhwb3J0czp7fX07ZVtuXS5jYWxsKGEuZXhwb3J0cyxhLGEuZXhwb3J0cyxyKTthLmw9dHJ1ZTtyZXR1cm4gYS5leHBvcnRzfXIubT1lO3IuYz10O3IuaT1mdW5jdGlvbihlKXtyZXR1cm4gZX07ci5kPWZ1bmN0aW9uKGUsdCxuKXtpZighci5vKGUsdCkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsZ2V0Om59KX19O3Iucj1mdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KX07ci5uPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbiB0KCl7cmV0dXJuIGVbImRlZmF1bHQiXX06ZnVuY3Rpb24gdCgpe3JldHVybiBlfTtyLmQodCwiYSIsdCk7cmV0dXJuIHR9O3Iubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX07ci5wPSIvIjtyLm9lPWZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSk7dGhyb3cgZX07dmFyIG49cihyLnM9RU5UUllfTU9EVUxFKTtyZXR1cm4gbi5kZWZhdWx0fHxufXZhciBhPSJbXFwufFxcLXxcXCt8XFx3fC98QF0rIjt2YXIgaT0iXFwoKC9cXCouKj9cXCovKT9zPy4qPygiK2ErIikuKj9cXCkiO2Z1bmN0aW9uIG8oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UoL1suPyorXiRbXF1cXCgpe318LV0vZywiXFwkJiIpfWZ1bmN0aW9uIHMoZSx0LG4pe3ZhciBzPXt9O3Nbbl09W107dmFyIGY9dC50b1N0cmluZygpO3ZhciB1PWYubWF0Y2goL15mdW5jdGlvblxzP1woXHcrLFxzKlx3KyxccyooXHcrKVwpLyk7aWYoIXUpcmV0dXJuIHM7dmFyIGM9dVsxXTt2YXIgaD1uZXcgUmVnRXhwKCIoXFxcXG58XFxXKSIrbyhjKStpLCJnIik7dmFyIHA7d2hpbGUocD1oLmV4ZWMoZikpe2lmKHBbM109PT0iZGxsLXJlZmVyZW5jZSIpY29udGludWU7c1tuXS5wdXNoKHBbM10pfWg9bmV3IFJlZ0V4cCgiXFwoIitvKGMpKydcXCgiKGRsbC1yZWZlcmVuY2VcXHMoJythKycpKSJcXClcXCknK2ksImciKTt3aGlsZShwPWguZXhlYyhmKSl7aWYoIWVbcFsyXV0pe3Nbbl0ucHVzaChwWzFdKTtlW3BbMl1dPXIocFsxXSkubX1zW3BbMl1dPXNbcFsyXV18fFtdO3NbcFsyXV0ucHVzaChwWzRdKX1yZXR1cm4gc31mdW5jdGlvbiBmKGUpe3ZhciB0PU9iamVjdC5rZXlzKGUpO3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LHIpe3JldHVybiB0fHxlW3JdLmxlbmd0aD4wfSxmYWxzZSl9ZnVuY3Rpb24gdShlLHQpe3ZhciByPXttYWluOlt0XX07dmFyIG49e21haW46W119O3ZhciBhPXttYWluOnt9fTt3aGlsZShmKHIpKXt2YXIgaT1PYmplY3Qua2V5cyhyKTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIHU9aVtvXTt2YXIgYz1yW3VdO3ZhciBoPWMucG9wKCk7YVt1XT1hW3VdfHx7fTtpZihhW3VdW2hdfHwhZVt1XVtoXSljb250aW51ZTthW3VdW2hdPXRydWU7blt1XT1uW3VdfHxbXTtuW3VdLnB1c2goaCk7dmFyIHA9cyhlLGVbdV1baF0sdSk7dmFyIGw9T2JqZWN0LmtleXMocCk7Zm9yKHZhciB2PTA7djxsLmxlbmd0aDt2Kyspe3JbbFt2XV09cltsW3ZdXXx8W107cltsW3ZdXT1yW2xbdl1dLmNvbmNhdChwW2xbdl1dKX19fXJldHVybiBufWUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIGE9e21haW46ci5tfTt2YXIgaT10LmFsbD97bWFpbjpPYmplY3Qua2V5cyhhKX06dShhLGUpO3ZhciBvPSIiO09iamVjdC5rZXlzKGkpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZSE9PSJtYWluIn0pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9MDt3aGlsZShpW2VdW3RdKXt0Kyt9aVtlXS5wdXNoKHQpO2FbZV1bdF09IihmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsgbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fOyB9KSI7bz1vKyJ2YXIgIitlKyIgPSAoIituLnRvU3RyaW5nKCkucmVwbGFjZSgiRU5UUllfTU9EVUxFIixKU09OLnN0cmluZ2lmeSh0KSkrIikoeyIraVtlXS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIiIrSlNPTi5zdHJpbmdpZnkodCkrIjogIithW2VdW3RdLnRvU3RyaW5nKCl9KS5qb2luKCIsIikrIn0pO1xuIn0pO289bysiKCIrbi50b1N0cmluZygpLnJlcGxhY2UoIkVOVFJZX01PRFVMRSIsSlNPTi5zdHJpbmdpZnkoZSkpKyIpKHsiK2kubWFpbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIiIrSlNPTi5zdHJpbmdpZnkoZSkrIjogIithLm1haW5bZV0udG9TdHJpbmcoKX0pLmpvaW4oIiwiKSsifSkoc2VsZik7Ijt2YXIgcz1uZXcgd2luZG93LkJsb2IoW29dLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSk7aWYodC5iYXJlKXtyZXR1cm4gc312YXIgZj13aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMfHx3aW5kb3cubW96VVJMfHx3aW5kb3cubXNVUkw7dmFyIGM9Zi5jcmVhdGVPYmplY3RVUkwocyk7dmFyIGg9bmV3IHdpbmRvdy5Xb3JrZXIoYyk7aC5vYmplY3RVUkw9YztyZXR1cm4gaH19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uIGUodCxyLG4peyJ1c2UgYXNtIjt2YXIgYT1uZXcgdC5JbnQzMkFycmF5KG4pO2Z1bmN0aW9uIGkoZSx0KXtlPWV8MDt0PXR8MDt2YXIgcj0wLG49MCxpPTAsbz0wLHM9MCxmPTAsdT0wLGM9MCxoPTAscD0wLGw9MCx2PTAsZD0wLHk9MDtpPWFbdCszMjA+PjJdfDA7cz1hW3QrMzI0Pj4yXXwwO3U9YVt0KzMyOD4+Ml18MDtoPWFbdCszMzI+PjJdfDA7bD1hW3QrMzM2Pj4yXXwwO2ZvcihyPTA7KHJ8MCk8KGV8MCk7cj1yKzY0fDApe289aTtmPXM7Yz11O3A9aDt2PWw7Zm9yKG49MDsobnwwKTw2NDtuPW4rNHwwKXt5PWFbcituPj4yXXwwO2Q9KChpPDw1fGk+Pj4yNykrKHMmdXx+cyZoKXwwKSsoKHkrbHwwKSsxNTE4NTAwMjQ5fDApfDA7bD1oO2g9dTt1PXM8PDMwfHM+Pj4yO3M9aTtpPWQ7YVtlK24+PjJdPXl9Zm9yKG49ZSs2NHwwOyhufDApPChlKzgwfDApO249bis0fDApe3k9KGFbbi0xMj4+Ml1eYVtuLTMyPj4yXV5hW24tNTY+PjJdXmFbbi02ND4+Ml0pPDwxfChhW24tMTI+PjJdXmFbbi0zMj4+Ml1eYVtuLTU2Pj4yXV5hW24tNjQ+PjJdKT4+PjMxO2Q9KChpPDw1fGk+Pj4yNykrKHMmdXx+cyZoKXwwKSsoKHkrbHwwKSsxNTE4NTAwMjQ5fDApfDA7bD1oO2g9dTt1PXM8PDMwfHM+Pj4yO3M9aTtpPWQ7YVtuPj4yXT15fWZvcihuPWUrODB8MDsobnwwKTwoZSsxNjB8MCk7bj1uKzR8MCl7eT0oYVtuLTEyPj4yXV5hW24tMzI+PjJdXmFbbi01Nj4+Ml1eYVtuLTY0Pj4yXSk8PDF8KGFbbi0xMj4+Ml1eYVtuLTMyPj4yXV5hW24tNTY+PjJdXmFbbi02ND4+Ml0pPj4+MzE7ZD0oKGk8PDV8aT4+PjI3KSsoc151XmgpfDApKygoeStsfDApKzE4NTk3NzUzOTN8MCl8MDtsPWg7aD11O3U9czw8MzB8cz4+PjI7cz1pO2k9ZDthW24+PjJdPXl9Zm9yKG49ZSsxNjB8MDsobnwwKTwoZSsyNDB8MCk7bj1uKzR8MCl7eT0oYVtuLTEyPj4yXV5hW24tMzI+PjJdXmFbbi01Nj4+Ml1eYVtuLTY0Pj4yXSk8PDF8KGFbbi0xMj4+Ml1eYVtuLTMyPj4yXV5hW24tNTY+PjJdXmFbbi02ND4+Ml0pPj4+MzE7ZD0oKGk8PDV8aT4+PjI3KSsocyZ1fHMmaHx1JmgpfDApKygoeStsfDApLTE4OTQwMDc1ODh8MCl8MDtsPWg7aD11O3U9czw8MzB8cz4+PjI7cz1pO2k9ZDthW24+PjJdPXl9Zm9yKG49ZSsyNDB8MDsobnwwKTwoZSszMjB8MCk7bj1uKzR8MCl7eT0oYVtuLTEyPj4yXV5hW24tMzI+PjJdXmFbbi01Nj4+Ml1eYVtuLTY0Pj4yXSk8PDF8KGFbbi0xMj4+Ml1eYVtuLTMyPj4yXV5hW24tNTY+PjJdXmFbbi02ND4+Ml0pPj4+MzE7ZD0oKGk8PDV8aT4+PjI3KSsoc151XmgpfDApKygoeStsfDApLTg5OTQ5NzUxNHwwKXwwO2w9aDtoPXU7dT1zPDwzMHxzPj4+MjtzPWk7aT1kO2Fbbj4+Ml09eX1pPWkrb3wwO3M9cytmfDA7dT11K2N8MDtoPWgrcHwwO2w9bCt2fDB9YVt0KzMyMD4+Ml09aTthW3QrMzI0Pj4yXT1zO2FbdCszMjg+PjJdPXU7YVt0KzMzMj4+Ml09aDthW3QrMzM2Pj4yXT1sfXJldHVybntoYXNoOml9fX0sZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzO3ZhciBuPXZvaWQgMDtpZih0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiJiZ0eXBlb2Ygc2VsZi5GaWxlUmVhZGVyU3luYyE9PSJ1bmRlZmluZWQiKXtuPW5ldyBzZWxmLkZpbGVSZWFkZXJTeW5jfXZhciBhPWZ1bmN0aW9uKGUsdCxyLG4sYSxpKXt2YXIgbz12b2lkIDAscz1pJTQsZj0oYStzKSU0LHU9YS1mO3N3aXRjaChzKXtjYXNlIDA6dFtpXT1lLmNoYXJDb2RlQXQobiszKTtjYXNlIDE6dFtpKzEtKHM8PDEpfDBdPWUuY2hhckNvZGVBdChuKzIpO2Nhc2UgMjp0W2krMi0oczw8MSl8MF09ZS5jaGFyQ29kZUF0KG4rMSk7Y2FzZSAzOnRbaSszLShzPDwxKXwwXT1lLmNoYXJDb2RlQXQobil9aWYoYTxmKyg0LXMpKXtyZXR1cm59Zm9yKG89NC1zO288dTtvPW8rNHwwKXtyW2krbz4+Ml09ZS5jaGFyQ29kZUF0KG4rbyk8PDI0fGUuY2hhckNvZGVBdChuK28rMSk8PDE2fGUuY2hhckNvZGVBdChuK28rMik8PDh8ZS5jaGFyQ29kZUF0KG4rbyszKX1zd2l0Y2goZil7Y2FzZSAzOnRbaSt1KzF8MF09ZS5jaGFyQ29kZUF0KG4rdSsyKTtjYXNlIDI6dFtpK3UrMnwwXT1lLmNoYXJDb2RlQXQobit1KzEpO2Nhc2UgMTp0W2krdSszfDBdPWUuY2hhckNvZGVBdChuK3UpfX07dmFyIGk9ZnVuY3Rpb24oZSx0LHIsbixhLGkpe3ZhciBvPXZvaWQgMCxzPWklNCxmPShhK3MpJTQsdT1hLWY7c3dpdGNoKHMpe2Nhc2UgMDp0W2ldPWVbbiszXTtjYXNlIDE6dFtpKzEtKHM8PDEpfDBdPWVbbisyXTtjYXNlIDI6dFtpKzItKHM8PDEpfDBdPWVbbisxXTtjYXNlIDM6dFtpKzMtKHM8PDEpfDBdPWVbbl19aWYoYTxmKyg0LXMpKXtyZXR1cm59Zm9yKG89NC1zO288dTtvPW8rNHwwKXtyW2krbz4+MnwwXT1lW24rb108PDI0fGVbbitvKzFdPDwxNnxlW24rbysyXTw8OHxlW24rbyszXX1zd2l0Y2goZil7Y2FzZSAzOnRbaSt1KzF8MF09ZVtuK3UrMl07Y2FzZSAyOnRbaSt1KzJ8MF09ZVtuK3UrMV07Y2FzZSAxOnRbaSt1KzN8MF09ZVtuK3VdfX07dmFyIG89ZnVuY3Rpb24oZSx0LHIsYSxpLG8pe3ZhciBzPXZvaWQgMCxmPW8lNCx1PShpK2YpJTQsYz1pLXU7dmFyIGg9bmV3IFVpbnQ4QXJyYXkobi5yZWFkQXNBcnJheUJ1ZmZlcihlLnNsaWNlKGEsYStpKSkpO3N3aXRjaChmKXtjYXNlIDA6dFtvXT1oWzNdO2Nhc2UgMTp0W28rMS0oZjw8MSl8MF09aFsyXTtjYXNlIDI6dFtvKzItKGY8PDEpfDBdPWhbMV07Y2FzZSAzOnRbbyszLShmPDwxKXwwXT1oWzBdfWlmKGk8dSsoNC1mKSl7cmV0dXJufWZvcihzPTQtZjtzPGM7cz1zKzR8MCl7cltvK3M+PjJ8MF09aFtzXTw8MjR8aFtzKzFdPDwxNnxoW3MrMl08PDh8aFtzKzNdfXN3aXRjaCh1KXtjYXNlIDM6dFtvK2MrMXwwXT1oW2MrMl07Y2FzZSAyOnRbbytjKzJ8MF09aFtjKzFdO2Nhc2UgMTp0W28rYyszfDBdPWhbY119fTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scyxmLHUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpe3JldHVybiBhKGUsdCxuLHMsZix1KX1pZihlIGluc3RhbmNlb2YgQXJyYXkpe3JldHVybiBpKGUsdCxuLHMsZix1KX1pZihyJiZyLkJ1ZmZlciYmci5CdWZmZXIuaXNCdWZmZXIoZSkpe3JldHVybiBpKGUsdCxuLHMsZix1KX1pZihlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe3JldHVybiBpKG5ldyBVaW50OEFycmF5KGUpLHQsbixzLGYsdSl9aWYoZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7cmV0dXJuIGkobmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCksdCxuLHMsZix1KX1pZihlIGluc3RhbmNlb2YgQmxvYil7cmV0dXJuIG8oZSx0LG4scyxmLHUpfXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgZGF0YSB0eXBlLiIpfX0sZnVuY3Rpb24oZSx0LHIpe2Z1bmN0aW9uIG4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fXZhciBhPXIoMCk7dmFyIGk9cigxKSxvPWkudG9IZXg7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7bih0aGlzLGUpO3RoaXMuX3J1c2hhPW5ldyBhO3RoaXMuX3J1c2hhLnJlc2V0U3RhdGUoKX1lLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24gZSh0KXt0aGlzLl9ydXNoYS5hcHBlbmQodCk7cmV0dXJuIHRoaXN9O2UucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbiBlKHQpe3ZhciBlPXRoaXMuX3J1c2hhLnJhd0VuZCgpLmJ1ZmZlcjtpZighdCl7cmV0dXJuIGV9aWYodD09PSJoZXgiKXtyZXR1cm4gbyhlKX10aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIGRpZ2VzdCBlbmNvZGluZyIpfTtyZXR1cm4gZX0oKTtlLmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHN9fV0pfSk7');
const debug = browserDebug('@rapidimages/storage-api-client');
const rusha = rushaString();
var browser = (url = '') => {
return { upload }
function upload (files, opts) {
const { onUploadProgress, onHashProgress, onUnknown, onRequest } = defaults(
opts
);
files = [].slice.call(files);
return new Promise((resolve, reject) => {
if (!files.length) reject(new Error('no files specified'));
getKeys(files, onHashProgress, (err, keys) => {
if (err) return reject(err)
getUnknownKeys(url, keys, (err, unknown) => {
if (err) return reject(err)
onUnknown(unknown);
const form = new window.FormData();
files.forEach(file => {
if (unknown[file.name]) {
form.append(file.name, file);
} else {
debug(`file ${file.name} already known sending details only`);
form.append(
file.name,
JSON.stringify({
name: file.name,
key: keys[file.name],
size: file.size
})
);
}
});
const progress$1 = progress(files.filter(x => unknown[x.name]));
const request = new window.XMLHttpRequest();
onRequest(request);
request.upload.addEventListener('progress', e =>
onUploadProgress(progress$1(e))
);
request.upload.addEventListener('error', err => reject(err));
request.addEventListener('load', e => resolve(request.responseText));
request.open('POST', `${url}/upload`);
request.send(form);
});
});
})
}
};
function getKeys (files, onHashProgress, cb) {
cb = once(cb);
let loaded = 0;
const keys = {};
files.forEach(file => {
progress(file.name);
const worker = createWorker(rusha);
worker.addEventListener('message', e => {
keys[e.data.id] = e.data.hash;
worker.revoke();
done(file.name);
});
worker.postMessage({ id: file.name, file });
});
function progress (file) {
onHashProgress(
onProgress({
file,
total: files.length,
loaded: loaded
})
);
}
function done (file) {
loaded++;
progress(file);
if (loaded === files.length) {
debug('gettings keys for files %o got %o', files, keys);
cb(null, keys);
}
}
}
function getUnknownKeys (url, details, cb) {
cb = once(cb);
const keys = Object.keys(details).map(x => details[x]);
window
.fetch(`${url}/unknown`, {
method: 'POST',
credentials: 'same-origin',
redirect: 'manual',
body: JSON.stringify(keys)
})
.then(checkStatus)
.then(res => res.json())
.then(data => {
const unknown = {};
data.forEach(key => {
const file = Object.keys(details).filter(x => details[x] === key)[0];
unknown[file] = key;
});
debug('checking unknown %j and got %j', keys, unknown);
cb(null, unknown);
})
.catch(cb);
}
function createWorker (src) {
const URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
const blob = new window.Blob([src], { type: 'text/javascript' });
const workerUrl = URL.createObjectURL(blob);
const worker = new window.Worker(workerUrl);
worker.revoke = () => URL.revokeObjectURL(workerUrl);
return worker
}
function checkStatus (res) {
return res.status === 200
? Promise.resolve(res)
: res.text().then(text => Promise.reject(text))
}
export default browser;