laravel-crypton
Version:
Helper for laravel crypton for request response encryption
112 lines (90 loc) • 2.91 kB
JavaScript
import Encrypter from "./encrypter";
/**
* 1. Crypton(key).request().encrypt(axios);
* 2. Crypton(key).response().encrypt(axios);
* 3. Crypton(key).both().encrypt(axios); -> Crypton(key).encrypt(axios);
* 4. cryptonite.request().clear(axios);
* 5. cryptonite.response().clear(axios);
* 6. cryptonite.both().clear(axios); -> cryptonite.clear(axios);
*/
const handleError = (error) => {
Promise.reject(error);
}
class Applyer {
constructor() {
this.apply = [];
}
request() {
this.apply.push('request');
return this;
}
response() {
this.apply.push('response');
return this;
}
both() {
this.apply = ['request', 'response'];
return this;
}
}
class CryptonClearer extends Applyer {
constructor(instances, axios) {
super();
this.interceptorInstances = instances;
this.axios = axios;
}
clear() {
this.both();
this.apply.forEach((item) => {
if (this.interceptorInstances[item] !== undefined) {
this.axios.interceptors[item].eject(this.interceptorInstances[item]);
}
});
}
}
class CryptonHandler extends Applyer {
constructor(key = null) {
super();
if (key) {
this.key = key;
this.encrypter = new Encrypter(key);
this.headers = {
request: 'x-request-encrypted',
response: 'x-response-encrypted'
};
}
this.interceptorInstances = {};
}
encrypt(axios) {
if (! this.key) {
throw new Error('Cannot encrypt');
}
if (this.apply.length <= 0) {
this.both();
}
this.interceptorInstances.request = axios.interceptors.request.use((config) => {
this.apply.forEach((item) => {
config.headers[this.headers[item]] = 1;
});
if (this.apply.indexOf('request') >= 0) {
config.data = { payload: this.encrypter.encrypt(config.data) };
}
return config;
}, handleError);
if (this.apply.indexOf('response') >= 0) {
this.interceptorInstances.response = axios.interceptors.response.use((response) => {
if (response.config.headers[this.headers.response] !== undefined) {
if (response.data.payload !== undefined) {
response.data = this.encrypter.decrypt(response.data.payload);
}
}
return response;
});
}
return new CryptonClearer(this.interceptorInstances, axios);
}
}
const Crypton = (key = null) => {
return new CryptonHandler(key);
}
export default Crypton;