UNPKG

@fmal/http-service

Version:

A HTTP service - orignally @cerebral/http

119 lines (106 loc) 3.94 kB
import request from './request'; import { urlEncode, mergeWith, createResponse } from './utils'; import FileUpload from './fileUpload'; import DEFAULT_OPTIONS from './DEFAULT_OPTIONS'; export { default as HttpServiceError } from './HttpServiceError'; export default function HttpServiceFactory(passedOptions) { var moduleOptions = mergeWith({}, DEFAULT_OPTIONS); if (typeof passedOptions === 'function') { moduleOptions = passedOptions(moduleOptions); } else if (passedOptions) { moduleOptions = mergeWith(passedOptions, DEFAULT_OPTIONS); } var requests = {}; function createAbortablePromise(url, cb) { return new Promise(function (resolve, reject) { requests[url] = { resolve: resolve, reject: reject, // eslint-disable-next-line standard/no-callback-literal xhr: cb(function (payload) { delete requests[url]; resolve(payload); }, function (error) { delete requests[url]; reject(error); }) }; }); } function requestService(options) { options = mergeWith(options, moduleOptions); if (options.onProgress) { options.onProgress = this.context.resolve.value(options.onProgress); } options.method = options.method.toUpperCase(); return createAbortablePromise(options.url, function (resolve, reject) { return request(options, createResponse(options, resolve, reject)); }); } return { request: requestService, get: function get(url, passedQuery, options) { if (options === void 0) { options = {}; } var query = passedQuery || options.query; options.url = query && Object.keys(query).length ? url + '?' + urlEncode(query) : url; options.method = 'GET'; return requestService.call(this, options); }, post: function post(url, body, options) { if (options === void 0) { options = {}; } options.url = options.query && Object.keys(options.query).length ? url + '?' + urlEncode(options.query) : url; options.method = 'POST'; options.body = body; return requestService.call(this, options); }, put: function put(url, body, options) { if (options === void 0) { options = {}; } options.url = options.query && Object.keys(options.query).length ? url + '?' + urlEncode(options.query) : url; options.method = 'PUT'; options.body = body; return requestService.call(this, options); }, patch: function patch(url, body, options) { if (options === void 0) { options = {}; } options.url = options.query && Object.keys(options.query).length ? url + '?' + urlEncode(options.query) : url; options.method = 'PATCH'; options.body = body; return requestService.call(this, options); }, delete: function _delete(url, query, options) { if (options === void 0) { options = {}; } options.url = options.query && Object.keys(options.query).length ? url + '?' + urlEncode(options.query) : url; options.method = 'DELETE'; return requestService.call(this, options); }, updateOptions: function updateOptions(newOptions) { moduleOptions = mergeWith(newOptions, moduleOptions); }, abort: function abort(regexp) { var matchingUrls = Object.keys(requests).filter(function (url) { return Boolean(url.match(new RegExp(regexp))); }); matchingUrls.forEach(function (url) { requests[url].xhr.abort(); }); }, uploadFile: function uploadFile(url, files, options) { if (options === void 0) { options = {}; } options.url = moduleOptions.baseUrl + url; options.onProgress = typeof options.onProgress === 'string' ? this.context.controller.getSequence(options.onProgress) : options.onProgress; return new FileUpload(options).send(files); } }; }