UNPKG

@livechat/file-upload

Version:

Simple promisified XHR file upload with cancellation

2 lines (1 loc) 1.05 kB
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):e.FileUpload=o()}(this,function(){"use strict";var u="UPLOAD_FAILED";return function(e,a,o){var n=void 0===o?{}:o,d=n.headers,r=n.method,i=void 0===r?"POST":r,s=n.onProgress,t=n.withCredentials,c=void 0!==t&&t,f=new XMLHttpRequest;return{promise:new Promise(function(n,r){var o,t;"function"==typeof s&&(f.upload.onprogress=function(e){s(e.loaded/e.total)}),f.onload=function(){var e;try{e=JSON.parse(f.response)}catch(o){e=f.response}if(f.status<200||300<=f.status){var o=Error("Upload failed.");o.code=u,o.response=e,r(o)}else n(e)},f.onerror=function(){var e=Error("Upload failed.");e.code=u,r(e)},f.onabort=function(){var e=Error("Upload canceled.");e.code="UPLOAD_CANCELED",r(e)},f.open(i,e),f.withCredentials=c,d&&Object.keys(d).forEach(function(e){return f.setRequestHeader(e,d[e])}),f.send((o=a,t=new FormData,Object.keys(o).forEach(function(e){return t.append(e,o[e])}),t))}),cancel:function(){f.abort()}}}});