@iimm/shared
Version:
shared utils on browser and react env
64 lines (63 loc) • 2.12 kB
JavaScript
/** 返回1个加了指定盐的内容加密器 */
export var byteEncoder = function byteEncoder() {
var salt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
var EncodeURIComponent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var textToChars = function textToChars(text) {
return text.split("").map(function (c) {
return c.charCodeAt(0);
});
};
var byteHex = function byteHex(n) {
return ("0" + Number(n).toString(16)).slice(-2);
};
var applySaltToChar = function applySaltToChar(code) {
return (
// eslint-disable-next-line no-bitwise
textToChars(salt).reduce(function (a, b) {
return a ^ b;
}, code)
);
};
return function (content) {
var txt = typeof content === "string" ? content : JSON.stringify(content);
if (EncodeURIComponent) {
txt = encodeURIComponent(txt);
}
return txt.split("").map(textToChars).map(applySaltToChar).map(byteHex).join("");
};
};
/** 使用指定盐解密(解密后会尝试JSON.parse) */
export var byteDecoder = function byteDecoder() {
var salt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
var EncodeURIComponent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var textToChars = function textToChars(text) {
return text.split("").map(function (c) {
return c.charCodeAt(0);
});
};
var applySaltToChar = function applySaltToChar(code) {
return (
// eslint-disable-next-line no-bitwise
textToChars(salt).reduce(function (a, b) {
return a ^ b;
}, code)
);
};
return function (encodedContent) {
var text = encodedContent.match(/.{1,2}/g).map(function (hex) {
return parseInt(hex, 16);
}).map(applySaltToChar).map(function (charCode) {
return String.fromCharCode(charCode);
}).join("");
var res = text;
if (EncodeURIComponent) {
res = decodeURIComponent(text);
}
try {
var obj = JSON.parse(res);
return obj;
} catch (error) {
return res;
}
};
};