UNPKG

@fmal/http-service

Version:

A HTTP service - orignally @cerebral/http

95 lines (78 loc) 2.78 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = _default; var _utils = require("./utils"); var _HttpServiceError = _interopRequireDefault(require("./HttpServiceError")); function parseResponse(xhr) { try { return { status: xhr.status, result: JSON.parse(xhr.responseText) }; } catch (e) { throw new _HttpServiceError.default(xhr.status, (0, _utils.getAllResponseHeaders)(xhr), xhr.responseText, e.message); } } function _default(options) { if (!options.url) { console.warn('upload-controller: you must provide a url'); return; } this.isAborted = false; this.xhr = new XMLHttpRequest(); this.abort = function () { this.isAborted = true; this.xhr && this.xhr.abort(); }; this.send = function (files) { var fileUpload = this; var xhr = this.xhr; fileUpload.isAborted = false; return new Promise(function (resolve, reject) { if (files && (files instanceof FileList || files.length || files instanceof File)) { var formData = new FormData(); if (files instanceof FileList || files.length) { for (var i = 0; i < files.length; i++) { formData.append(options.name || 'files', files[i]); } } else { formData.append(options.name || 'files', files); } if (options.data) { Object.keys(options.data).forEach(function (paramKey) { formData.append(paramKey, options.data[paramKey]); }); } xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status < 300) { resolve(parseResponse(xhr)); } else if (xhr.readyState === 4) { var response = parseResponse(xhr); response.isAborted = fileUpload.isAborted; reject(new _HttpServiceError.default(xhr.status, (0, _utils.getAllResponseHeaders)(xhr), xhr.responseText, null)); } }; xhr.open('POST', options.url, true); if (options.headers) { Object.keys(options.headers).forEach(function (key) { xhr.setRequestHeader(key, options.headers[key]); }); } xhr.upload.onprogress = function (e) { if (options.onProgress) { var percentComplete = e.loaded / e.total * 100; options.onProgress({ progress: +percentComplete.toFixed(0) }); } }; xhr.send(formData); } else { /* eslint-disable-next-line prefer-promise-reject-errors */ reject('Not an instance of a File, File[] or FileList'); } }); }; } module.exports = exports.default;