utils.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import _ from 'lodash';
  2. import baseX from 'base-x';
  3. import PAKO from 'pako';
  4. import {Buffer} from 'safe-buffer';
  5. import sjclWrapper from './sjclWrapper';
  6. export const pako = PAKO;
  7. const BASE58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
  8. const bs58 = baseX(BASE58);
  9. export function sleep(ms) {
  10. return new Promise(resolve => setTimeout(resolve, ms));
  11. }
  12. export function stringToHex(str) {
  13. return Buffer.from(str).toString('hex');
  14. }
  15. export function hexToString(str) {
  16. return Buffer.from(str, 'hex').toString();
  17. }
  18. export function randomArray(len) {
  19. const a = new Uint8Array(len);
  20. window.crypto.getRandomValues(a);
  21. return a;
  22. }
  23. export function randomHexString(len) {
  24. return Buffer.from(randomArray(len)).toString('hex');
  25. }
  26. export function formatDate(d, format) {
  27. if (!format)
  28. format = 'normal';
  29. switch (format) {
  30. case 'normal':
  31. return `${d.getDate().toString().padStart(2, '0')}.${(d.getMonth() + 1).toString().padStart(2, '0')}.${d.getFullYear()} ` +
  32. `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}`;
  33. case 'coDate':
  34. return `${d.getFullYear()}-${(d.getMonth() + 1).toString().padStart(2, '0')}-${d.getDate().toString().padStart(2, '0')}`;
  35. }
  36. }
  37. export function fallbackCopyTextToClipboard(text) {
  38. let textArea = document.createElement('textarea');
  39. textArea.value = text;
  40. document.body.appendChild(textArea);
  41. textArea.focus();
  42. textArea.select();
  43. let result = false;
  44. try {
  45. result = document.execCommand('copy');
  46. } catch (e) {
  47. //
  48. }
  49. document.body.removeChild(textArea);
  50. return result;
  51. }
  52. export async function copyTextToClipboard(text) {
  53. if (!navigator.clipboard) {
  54. return fallbackCopyTextToClipboard(text);
  55. }
  56. let result = false;
  57. try {
  58. await navigator.clipboard.writeText(text);
  59. result = true;
  60. } catch (e) {
  61. //
  62. }
  63. return result;
  64. }
  65. export function toBase58(data) {
  66. return bs58.encode(Buffer.from(data));
  67. }
  68. export function fromBase58(data) {
  69. return bs58.decode(data);
  70. }
  71. //base-x слишком тормозит, используем sjcl
  72. export function toBase64(data) {
  73. return sjclWrapper.codec.base64.fromBits(
  74. sjclWrapper.codec.bytes.toBits(Buffer.from(data))
  75. );
  76. }
  77. //base-x слишком тормозит, используем sjcl
  78. export function fromBase64(data) {
  79. return Buffer.from(sjclWrapper.codec.bytes.fromBits(
  80. sjclWrapper.codec.base64.toBits(data)
  81. ));
  82. }
  83. export function getObjDiff(oldObj, newObj) {
  84. const result = {__isDiff: true, change: {}, add: {}, del: []};
  85. for (const key of Object.keys(oldObj)) {
  86. if (newObj.hasOwnProperty(key)) {
  87. if (!_.isEqual(oldObj[key], newObj[key])) {
  88. if (_.isObject(oldObj[key]) && _.isObject(newObj[key])) {
  89. result.change[key] = getObjDiff(oldObj[key], newObj[key]);
  90. } else {
  91. result.change[key] = _.cloneDeep(newObj[key]);
  92. }
  93. }
  94. } else {
  95. result.del.push(key);
  96. }
  97. }
  98. for (const key of Object.keys(newObj)) {
  99. if (!oldObj.hasOwnProperty(key)) {
  100. result.add[key] = _.cloneDeep(newObj[key]);
  101. }
  102. }
  103. return result;
  104. }
  105. export function isEmptyObjDiff(diff) {
  106. return (!_.isObject(diff) || !diff.__isDiff ||
  107. (!Object.keys(diff.change).length &&
  108. !Object.keys(diff.add).length &&
  109. !diff.del.length
  110. )
  111. );
  112. }
  113. export function applyObjDiff(obj, diff, isAddChanged) {
  114. const result = _.cloneDeep(obj);
  115. if (!diff.__isDiff)
  116. return result;
  117. const change = diff.change;
  118. for (const key of Object.keys(change)) {
  119. if (result.hasOwnProperty(key)) {
  120. if (_.isObject(change[key])) {
  121. result[key] = applyObjDiff(result[key], change[key], isAddChanged);
  122. } else {
  123. result[key] = _.cloneDeep(change[key]);
  124. }
  125. } else if (isAddChanged) {
  126. result[key] = _.cloneDeep(change[key]);
  127. }
  128. }
  129. for (const key of Object.keys(diff.add)) {
  130. result[key] = _.cloneDeep(diff.add[key]);
  131. }
  132. for (const key of diff.del) {
  133. delete result[key];
  134. }
  135. return result;
  136. }