123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- const b64 = require('base64-js');
- function arrayToB64(array) {
- return b64
- .fromByteArray(array)
- .replace(/\+/g, '-')
- .replace(/\//g, '_')
- .replace(/=/g, '');
- }
- function b64ToArray(str) {
- return b64.toByteArray(str + '==='.slice((str.length + 3) % 4));
- }
- function loadShim(polyfill) {
- return new Promise((resolve, reject) => {
- const shim = document.createElement('script');
- shim.src = polyfill;
- shim.addEventListener('load', () => resolve(true));
- shim.addEventListener('error', () => resolve(false));
- document.head.appendChild(shim);
- });
- }
- async function canHasSend() {
- try {
- const key = await window.crypto.subtle.generateKey(
- {
- name: 'AES-GCM',
- length: 128
- },
- true,
- ['encrypt', 'decrypt']
- );
- await window.crypto.subtle.encrypt(
- {
- name: 'AES-GCM',
- iv: window.crypto.getRandomValues(new Uint8Array(12)),
- tagLength: 128
- },
- key,
- new ArrayBuffer(8)
- );
- await window.crypto.subtle.importKey(
- 'raw',
- window.crypto.getRandomValues(new Uint8Array(16)),
- 'PBKDF2',
- false,
- ['deriveKey']
- );
- await window.crypto.subtle.importKey(
- 'raw',
- window.crypto.getRandomValues(new Uint8Array(16)),
- 'HKDF',
- false,
- ['deriveKey']
- );
- return true;
- } catch (err) {
- console.error(err);
- return false;
- }
- }
- function isFile(id) {
- return /^[0-9a-fA-F]{10}$/.test(id);
- }
- function copyToClipboard(str) {
- const aux = document.createElement('input');
- aux.setAttribute('value', str);
- aux.contentEditable = true;
- aux.readOnly = true;
- document.body.appendChild(aux);
- if (navigator.userAgent.match(/iphone|ipad|ipod/i)) {
- const range = document.createRange();
- range.selectNodeContents(aux);
- const sel = window.getSelection();
- sel.removeAllRanges();
- sel.addRange(range);
- aux.setSelectionRange(0, str.length);
- } else {
- aux.select();
- }
- const result = document.execCommand('copy');
- document.body.removeChild(aux);
- return result;
- }
- const LOCALIZE_NUMBERS = !!(
- typeof Intl === 'object' &&
- Intl &&
- typeof Intl.NumberFormat === 'function' &&
- typeof navigator === 'object'
- );
- const UNITS = ['B', 'kB', 'MB', 'GB'];
- function bytes(num) {
- if (num < 1) {
- return '0B';
- }
- const exponent = Math.min(Math.floor(Math.log10(num) / 3), UNITS.length - 1);
- const n = Number(num / Math.pow(1000, exponent));
- let nStr = n.toFixed(1);
- if (LOCALIZE_NUMBERS) {
- try {
- const locale = document.querySelector('html').lang;
- nStr = n.toLocaleString(locale, {
- minimumFractionDigits: 1,
- maximumFractionDigits: 1
- });
- } catch (e) {
-
- }
- }
- return `${nStr}${UNITS[exponent]}`;
- }
- function percent(ratio) {
- if (LOCALIZE_NUMBERS) {
- try {
- const locale = document.querySelector('html').lang;
- return ratio.toLocaleString(locale, { style: 'percent' });
- } catch (e) {
-
- }
- }
- return `${Math.floor(ratio * 100)}%`;
- }
- function number(n) {
- if (LOCALIZE_NUMBERS) {
- const locale = document.querySelector('html').lang;
- return n.toLocaleString(locale);
- }
- return n.toString();
- }
- function allowedCopy() {
- const support = !!document.queryCommandSupported;
- return support ? document.queryCommandSupported('copy') : false;
- }
- function delay(delay = 100) {
- return new Promise(resolve => setTimeout(resolve, delay));
- }
- function fadeOut(selector) {
- const classes = document.querySelector(selector).classList;
- classes.remove('effect--fadeIn');
- classes.add('effect--fadeOut');
- return delay(300);
- }
- function openLinksInNewTab(links, should = true) {
- links = links || Array.from(document.querySelectorAll('a:not([target])'));
- if (should) {
- links.forEach(l => {
- l.setAttribute('target', '_blank');
- l.setAttribute('rel', 'noopener noreferrer');
- });
- } else {
- links.forEach(l => {
- l.removeAttribute('target');
- l.removeAttribute('rel');
- });
- }
- return links;
- }
- module.exports = {
- fadeOut,
- delay,
- allowedCopy,
- bytes,
- percent,
- number,
- copyToClipboard,
- arrayToB64,
- b64ToArray,
- loadShim,
- canHasSend,
- isFile,
- openLinksInNewTab
- };
|