fluro
Version:
Promise based HTTP Fluro client for the browser and node.js
199 lines (164 loc) • 5.62 kB
JavaScript
import axios from 'axios';
import _ from 'lodash';
import {
cacheAdapterEnhancer,
throttleAdapterEnhancer,
Cache,
} from 'axios-extensions';
const CancelToken = axios.CancelToken;
///////////////////////////////////////
/**
* Creates a new FluroAPI instance.
* This module is a wrapper around the <a href="https://www.npmjs.com/package/axios">axios</a> package. It aims to make it easier for you to connect with and consume endpoints from the
* Fluro REST API for more information about the available endpoints see <a href="https://developer.fluro.io">Fluro REST API Documentation</a>
*
* @constructor
* @param {FluroCore} fluro A reference to the parent instance of the FluroCore module. The FluroAPI module is usually created by a FluroCore instance that passes itself in as the first argument.
*
* @example
* //Make a request to get the current user session
* fluro.api.get('/session')
* .then(function (response) {
* console.log(response);
* })
* .catch(function (error) {
* console.log(error);
* });
*/
var FluroAPI = function(fluro) {
///////////////////////////////////////
// //Cache Defaults
// var FIVE_MINUTES = 1000 * 60 * 5;
// var CAPACITY = 100;
// { maxAge: FIVE_MINUTES, max: 100 }
/**
* The default cache to use when requests are made from this instance
* @type {LRUCache}
* @access private
*/
var defaultCache;
if (process.browser) {
defaultCache = fluro.cache.get('api');
}
///////////////////////////////////////
var service = axios.create({
adapter: throttleAdapterEnhancer(cacheAdapterEnhancer(axios.defaults.adapter, { defaultCache: defaultCache }))
});
///////////////////////////////////////
service.defaults.baseURL = fluro.apiURL;
service.defaults.headers.common.Accept = 'application/json';
service.defaults.withCredentials = fluro.withCredentials;
/////////////////////////////////////////////////////
service.interceptors.response.use(function(response) {
return response;
}, function(err) {
if (axios.isCancel(err)) {
console.log('Request cancelled');
return Promise.reject(err);
}
//Get the response status
var status = _.get(err, 'response.status') || err.status;
//Check the status
switch (status) {
case 401:
//Ignore and allow fluro.auth to handle it
break;
case 502:
// case 503:
case 504:
//Retry
//Try it again
console.log(`fluro.api > ${status} connection error retrying`)
return fluro.api.request(err.config);
break;
default:
//Some other error
console.log('fluro.api > connection error', status, err.config.url);
break;
}
/////////////////////////////////////////////////////
return Promise.reject(err);
})
/**
* @name FluroAPI.get
* @description Makes a get http request to the Fluro REST API
* @function
* @param {String} path The Fluro API endpoint to request
* @param {Object} config Optional parameters for the request
* @example
* //Make a request to get the current user session
* fluro.api.get('/content/article', {
* params:{
* select:'title created',
* limit:10,
* simple:true,
* }
* })
* .then(function (response) {
* console.log(response);
* })
* .catch(function (error) {
* console.log(error);
* });
*/
/**
* @name FluroAPI.post
* @description Makes a post http request to the Fluro REST API
* @function
* @param {String} path The Fluro API endpoint to request
* @param {Object} config Optional parameters for the request
* @example
*
* fluro.api.post('/content/article', {title:'my new article', ...}, {
* //headers and other things
* })
* .then(function (response) {
* console.log(response);
* })
* .catch(function (error) {
* console.log(error);
* });
*/
/**
* @name FluroAPI.put
* @description Makes a put http request to the Fluro REST API
* @function
* @param {String} path The Fluro API endpoint to request
* @param {Object} config Optional parameters for the request
* @example
*
* fluro.api.put('/content/article/5ca3d64dd2bb085eb9d450db', {title:'my new article', ...}, {
* //headers and other things
* })
* .then(function (response) {
* console.log(response);
* })
* .catch(function (error) {
* console.log(error);
* });
*/
/**
* @name FluroAPI.delete
* @description Makes a delete http request to the Fluro REST API
* @function
* @param {String} path The Fluro API endpoint to request
* @param {Object} config Optional parameters for the request
* @example
*
* fluro.api.delete('/content/article/5ca3d64dd2bb085eb9d450db')
* .then(function (response) {
* console.log(response);
* })
* .catch(function (error) {
* console.log(error);
* });
*/
service.CancelToken = CancelToken;
///////////////////////////////////////
return service;
}
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
export { CancelToken as CancelToken };
export default FluroAPI;