js-request-manager
Version:
JS Request Manager is a library for creating an sdk library for your server (API). The API type doesn't matter, whether it's REST or RPC
176 lines (143 loc) • 4.91 kB
JavaScript
//
import SendRequestClass from "./Class/SendRequestClass";
import RequestClass from "./Class/RequestClass";
//
import {isString, isFunction, isLiteralObject} from './Helper/Helper';
import * as ConfigDefault from "./Helper/ConfigDefault";
//
import AxiosRequestClient from "./RequestClient/AxiosRequestClient";
import FetchRequestClient from "./RequestClient/FetchRequestClient";
/**
* @typedef {Function} RequestSchemaFunction
* @return {RequestClass}
*/
/**
* @typedef {Object.<string, RequestSchemaFunction|RequestSchemaStr>} RequestSchemaStr
*/
/**
* @param {RequestSchemaStr} schema
* @param {Object} cnf
* @param {Object} cnf.hostSchema
* @param {Object} cnf.RequestPrepare
* @param {Object} cnf.ResponsePrepare
* @param {Object} cnf.Hook
* @param {Object} cnf.RequestClient
*/
const RequestManager = (schema, cnf = {}) => {
const cache = {};
const RequestSchema = schema;
// config
const Config = {
hostSchema : Object.assign(ConfigDefault.HostSchema, cnf.hostSchema),
RequestPrepare : Object.assign(ConfigDefault.RequestPrepare, cnf.RequestPrepare),
ResponsePrepare : Object.assign(ConfigDefault.ResponsePrepare, cnf.ResponsePrepare),
Hook : Object.assign(ConfigDefault.Hook, cnf.Hook),
};
let defaultRequestClient = AxiosRequestClient;
if(cnf.RequestClient && cnf.RequestClient.name){
switch (cnf.RequestClient.name){
case 'AXIOS': defaultRequestClient = AxiosRequestClient; break;
case 'FETCH': defaultRequestClient = FetchRequestClient; break;
}
}
const RequestClient = Object.assign(defaultRequestClient, (cnf.RequestClient || {}) );
const SendRequest = new SendRequestClass(RequestClient, Config);
//
const mergeRequestClassAndRequestSettings = (requestClass, userRequestSettings) => {
if(!userRequestSettings) {
return requestClass;
}
//
const requestClassObj = requestClass.toObject();
return new RequestClass(Object.assign({}, requestClassObj, userRequestSettings));
}
const cacheCreate = (RequestClass) => {
// Cache get
const cacheInfo = RequestClass.getCache()
let cacheKey = false;
switch (true) {
case isString(cacheInfo):
cacheKey = cacheInfo;
break;
case isFunction(cacheInfo):
cacheKey = cacheInfo(RequestClass);
break;
}
// TODO: use Request Name
if(cacheKey && cache[cacheKey]) {
let promise = new Promise(function(promiseResolve, promiseReject) {
// WARNING - не менять данный объект
promiseResolve(cache[cacheKey]);
});
promise.abort = function(){};
//
return { getCache: promise};
}
if(cacheKey) {
return {
setCache(result) {
cache[cacheKey] = result;
},
rejectCache() {
delete cache[cacheKey];
}
}
}
return {};
}
const requestPrepare = (request) => {
for(let key in request) {
if ( isLiteralObject(request[key]) ) {
request[key] = requestPrepare(request[key]);
}
else if ( isFunction(request[key]) ) {
//
const func = request[key];
// request[key] = function (data, options = { fileName: null, cache:null, errorMessage:null }) {
request[key] = function (requestData, userRequestSettings) {
const requestClass = func(requestData);
const mergeRequestClass = mergeRequestClassAndRequestSettings(requestClass, userRequestSettings);
const cache = cacheCreate(mergeRequestClass)
if(cache.getCache) {
return cache.getCache();
}
// send request
const requestPromise = SendRequest.send(mergeRequestClass);
if(cache.setCache) {
requestPromise.then(
(result) => { cache.setCache(result); },
(error) => { cache.rejectCache(); }
);
return
}
try {
Config.Hook.RequestPromise(requestPromise, mergeRequestClass);
} catch (e){
console.error(e);
}
return requestPromise;
};
}
}
return request;
};
const request = RequestSchema;
requestPrepare(request);
/**
* for send custom user request
* @param {String} type
* @param {String} url
* @param {{get: {Object}, post: {Object}}}params
* @param {Object} options
* @return {Promise<*>}
*/
request.send = async function (type, url, params, options = {}) {
return SendRequest.send(
new RequestClass(
Object.assign({type, url, params}, options)
)
);
};
return request;
};
export default RequestManager;