192 lines
5.1 KiB
JavaScript
192 lines
5.1 KiB
JavaScript
import _ from 'lodash';
|
|
import baseX from 'base-x';
|
|
import PAKO from 'pako';
|
|
import {Buffer} from 'safe-buffer';
|
|
import sjclWrapper from './sjclWrapper';
|
|
|
|
export const pako = PAKO;
|
|
|
|
const BASE58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
const bs58 = baseX(BASE58);
|
|
|
|
export function sleep(ms) {
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
}
|
|
|
|
export function stringToHex(str) {
|
|
return Buffer.from(str).toString('hex');
|
|
}
|
|
|
|
export function hexToString(str) {
|
|
return Buffer.from(str, 'hex').toString();
|
|
}
|
|
|
|
export function randomArray(len) {
|
|
const a = new Uint8Array(len);
|
|
window.crypto.getRandomValues(a);
|
|
return a;
|
|
}
|
|
|
|
export function randomHexString(len) {
|
|
return Buffer.from(randomArray(len)).toString('hex');
|
|
}
|
|
|
|
export function formatDate(d, format) {
|
|
if (!format)
|
|
format = 'normal';
|
|
|
|
switch (format) {
|
|
case 'normal':
|
|
return `${d.getDate().toString().padStart(2, '0')}.${(d.getMonth() + 1).toString().padStart(2, '0')}.${d.getFullYear()} ` +
|
|
`${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}`;
|
|
case 'coDate':
|
|
return `${d.getFullYear()}-${(d.getMonth() + 1).toString().padStart(2, '0')}-${d.getDate().toString().padStart(2, '0')}`;
|
|
case 'noDate':
|
|
return `${d.getDate().toString().padStart(2, '0')}.${(d.getMonth() + 1).toString().padStart(2, '0')}.${d.getFullYear()}`;
|
|
}
|
|
|
|
}
|
|
|
|
export function fallbackCopyTextToClipboard(text) {
|
|
let textArea = document.createElement('textarea');
|
|
textArea.value = text;
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
let result = false;
|
|
try {
|
|
result = document.execCommand('copy');
|
|
} catch (e) {
|
|
//
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
return result;
|
|
}
|
|
|
|
export async function copyTextToClipboard(text) {
|
|
if (!navigator.clipboard) {
|
|
return fallbackCopyTextToClipboard(text);
|
|
}
|
|
|
|
let result = false;
|
|
try {
|
|
await navigator.clipboard.writeText(text);
|
|
result = true;
|
|
} catch (e) {
|
|
//
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function toBase58(data) {
|
|
return bs58.encode(Buffer.from(data));
|
|
}
|
|
|
|
export function fromBase58(data) {
|
|
return bs58.decode(data);
|
|
}
|
|
|
|
//base-x слишком тормозит, используем sjcl
|
|
export function toBase64(data) {
|
|
return sjclWrapper.codec.base64.fromBits(
|
|
sjclWrapper.codec.bytes.toBits(Buffer.from(data))
|
|
);
|
|
}
|
|
|
|
//base-x слишком тормозит, используем sjcl
|
|
export function fromBase64(data) {
|
|
return Buffer.from(sjclWrapper.codec.bytes.fromBits(
|
|
sjclWrapper.codec.base64.toBits(data)
|
|
));
|
|
}
|
|
|
|
export function getObjDiff(oldObj, newObj) {
|
|
const result = {__isDiff: true, change: {}, add: {}, del: []};
|
|
|
|
for (const key of Object.keys(oldObj)) {
|
|
if (newObj.hasOwnProperty(key)) {
|
|
if (!_.isEqual(oldObj[key], newObj[key])) {
|
|
if (_.isObject(oldObj[key]) && _.isObject(newObj[key])) {
|
|
result.change[key] = getObjDiff(oldObj[key], newObj[key]);
|
|
} else {
|
|
result.change[key] = _.cloneDeep(newObj[key]);
|
|
}
|
|
}
|
|
} else {
|
|
result.del.push(key);
|
|
}
|
|
}
|
|
|
|
for (const key of Object.keys(newObj)) {
|
|
if (!oldObj.hasOwnProperty(key)) {
|
|
result.add[key] = _.cloneDeep(newObj[key]);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function isEmptyObjDiff(diff) {
|
|
return (!_.isObject(diff) || !diff.__isDiff ||
|
|
(!Object.keys(diff.change).length &&
|
|
!Object.keys(diff.add).length &&
|
|
!diff.del.length
|
|
)
|
|
);
|
|
}
|
|
|
|
export function applyObjDiff(obj, diff, isAddChanged) {
|
|
const result = _.cloneDeep(obj);
|
|
if (!diff.__isDiff)
|
|
return result;
|
|
|
|
const change = diff.change;
|
|
for (const key of Object.keys(change)) {
|
|
if (result.hasOwnProperty(key)) {
|
|
if (_.isObject(change[key])) {
|
|
result[key] = applyObjDiff(result[key], change[key], isAddChanged);
|
|
} else {
|
|
result[key] = _.cloneDeep(change[key]);
|
|
}
|
|
} else if (isAddChanged) {
|
|
result[key] = _.cloneDeep(change[key]);
|
|
}
|
|
}
|
|
|
|
for (const key of Object.keys(diff.add)) {
|
|
result[key] = _.cloneDeep(diff.add[key]);
|
|
}
|
|
|
|
for (const key of diff.del) {
|
|
delete result[key];
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function parseQuery(str) {
|
|
if (typeof str != 'string' || str.length == 0)
|
|
return {};
|
|
let s = str.split('&');
|
|
let s_length = s.length;
|
|
let bit, query = {}, first, second;
|
|
|
|
for (let i = 0; i < s_length; i++) {
|
|
bit = s[i].split('=');
|
|
first = decodeURIComponent(bit[0]);
|
|
if (first.length == 0)
|
|
continue;
|
|
second = decodeURIComponent(bit[1]);
|
|
if (typeof query[first] == 'undefined')
|
|
query[first] = second;
|
|
else
|
|
if (query[first] instanceof Array)
|
|
query[first].push(second);
|
|
else
|
|
query[first] = [query[first], second];
|
|
}
|
|
return query;
|
|
} |