{"version":3,"sources":["components/download.js"],"names":["dmx","Component","initialData","progress","position","total","percent","lastError","status","message","attributes","timeout","type","Number","default","url","String","filename","methods","abort","this","download","events","done","Event","error","start","ProgressEvent","render","node","xhr","XMLHttpRequest","addEventListener","onload","bind","onabort","onerror","ontimeout","onprogress","update","props","_url","trigger","cors","open","responseType","send","a","document","createElement","href","replace","rel","target","dispatchEvent","MouseEvent","reset","set","response","getFilename","header","getResponseHeader","match","blob","URL","createObjectURL","setTimeout","revokeObjectURL","statusText","event","loaded","lengthComputable","Math","ceil","e","data","dispatch","requestAnimationFrame"],"mappings":"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","file":"../dmxDownload/dmxDownload.js","sourcesContent":["dmx.Component('download', {\r\n\r\n initialData: {\r\n progress: {\r\n position: 0,\r\n total: 0,\r\n percent: 0\r\n },\r\n\r\n lastError: {\r\n status: 0,\r\n message: ''\r\n }\r\n },\r\n\r\n attributes: {\r\n timeout: {\r\n type: Number,\r\n default: 0\r\n },\r\n\r\n url: {\r\n type: String,\r\n default: ''\r\n },\r\n\r\n filename: {\r\n type: String,\r\n default: ''\r\n },\r\n },\r\n\r\n methods: {\r\n abort: function() {\r\n this.abort();\r\n },\r\n\r\n download: function(url) {\r\n this.download(url);\r\n },\r\n },\r\n\r\n events: {\r\n done: Event,\r\n error: Event,\r\n start: Event,\r\n progress: ProgressEvent,\r\n },\r\n\r\n render: function(node) {\r\n this.xhr = new XMLHttpRequest();\r\n this.xhr.addEventListener('load', this.onload.bind(this));\r\n this.xhr.addEventListener('abort', this.onabort.bind(this));\r\n this.xhr.addEventListener('error', this.onerror.bind(this));\r\n this.xhr.addEventListener('timeout', this.ontimeout.bind(this));\r\n this.xhr.addEventListener('progress', this.onprogress.bind(this));\r\n },\r\n\r\n update: function(props) {\r\n },\r\n\r\n abort: function() {\r\n this.xhr.abort();\r\n },\r\n\r\n download: function(_url) {\r\n this.url = _url || this.props.url;\r\n\r\n this.xhr.abort();\r\n\r\n this.trigger('start');\r\n\r\n if (this.cors(this.url)) {\r\n this.xhr.open('GET', this.url);\r\n this.xhr.responseType = 'blob';\r\n this.xhr.send();\r\n } else {\r\n var a = document.createElement('a');\r\n a.href = this.url;\r\n a.download = this.props.filename || this.url.replace(/.*\\//, '').replace(/\\?.*/, '') || 'download';\r\n a.rel = 'noopener';\r\n a.target = '_blank';\r\n a.dispatchEvent(new MouseEvent('click'));\r\n }\r\n },\r\n\r\n reset: function() {\r\n this.set({\r\n progress: {\r\n position: 0,\r\n total: 0,\r\n percent: 0\r\n },\r\n error: {\r\n status: 0,\r\n message: '',\r\n response: null\r\n }\r\n });\r\n },\r\n\r\n getFilename: function() {\r\n var header = this.xhr.getResponseHeader('Content-Disposition');\r\n var match = header && header.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/);\r\n return this.props.filename || (match && match[1] ? match[1].replace(/['\"]/g, '') : false) || this.url.replace(/.*\\//, '').replace(/\\?.*/, '') || 'download';\r\n },\r\n\r\n onload: function() {\r\n this.reset();\r\n this.trigger('done');\r\n\r\n if (this.xhr.status >= 200 && this.xhr.status < 300) {\r\n var blob = this.xhr.response;\r\n var a = document.createElement('a');\r\n a.href = URL.createObjectURL(blob);\r\n a.download = this.getFilename();\r\n a.rel = 'noopener';\r\n \r\n setTimeout(function () { URL.revokeObjectURL(a.href); }, 4E4);\r\n setTimeout(function () { a.dispatchEvent(new MouseEvent('click')); }, 0);\r\n } else {\r\n this.set('error', {\r\n status: this.xhr.status,\r\n message: this.xhr.statusText\r\n });\r\n this.trigger('error');\r\n }\r\n },\r\n\r\n onabort: function() {\r\n this.reset();\r\n this.trigger('done');\r\n },\r\n\r\n onerror: function() {\r\n this.reset();\r\n this.set('error', {\r\n status: 0,\r\n message: 'Failed to download'\r\n });\r\n this.trigger('error');\r\n this.trigger('done');\r\n },\r\n\r\n ontimeout: function() {\r\n this.reset();\r\n this.set('error', {\r\n status: 0,\r\n message: 'Download timeout'\r\n });\r\n this.trigger('error');\r\n this.trigger('done');\r\n },\r\n\r\n onprogress: function(event) {\r\n var position = event.loaded || event.position;\r\n var percent = event.lengthComputable ? Math.ceil(event.loaded / event.total * 100) : 0;\r\n\r\n this.set('progress', {\r\n position: position,\r\n total: event.total,\r\n percent: percent\r\n });\r\n\r\n this.trigger('progress', {\r\n lengthComputable: event.lengthComputable,\r\n loaded: position,\r\n total: event.total\r\n });\r\n },\r\n\r\n cors: function(url) {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('HEAD', url, false);\r\n try { xhr.send(); } catch (e) {}\r\n return xhr.status >= 200 && xhr.status < 300;\r\n },\r\n\r\n trigger: function(event, data) {\r\n var dispatch = this.dispatchEvent.bind(this);\r\n requestAnimationFrame(function() {\r\n dispatch(event, data);\r\n });\r\n }\r\n\r\n});"]}