UNPKG

simple-pure-utils

Version:

Funciones puras para manipulación de objetos, arreglos, promesas y observables

76 lines 6.96 kB
import { createBase, random, toBaseN, minValue, midpoint, zeroPad } from "./pushid/bignum"; /**ASCII ordered base64 */ const system = createBase('-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'); const ranLen = 8; const pushIdLen = 8 + 8 + ranLen; const minPushId = minValue(pushIdLen, system); function timestampToChars() { return toBaseN(new Date().getTime(), 8, system); } let lastTimestamp = timestampToChars(); let lastConsec = 0; /**Genera un id único y ordenado cronológicamente en el lado del cliente de tal manera que sea posible * reordenarlos en el lado del cliente, note que debido al reordenamiento los ids son de longitud variable */ export function generatePushId() { const timestamp = timestampToChars(); if (timestamp != lastTimestamp) { lastTimestamp = timestamp; lastConsec = 0; } else { lastConsec += 1; } return timestamp + toBaseN(lastConsec, 8, system) + random(ranLen, system); } const max = (a, b) => a > b ? a : b; const min = (a, b) => a < b ? a : b; function delta(a, b) { if (a.length != 1 || b.length != 1) throw new Error(); return a.charCodeAt(0) - b.charCodeAt(0); } function avg(a, b) { if (a.length != 1 || b.length != 1) throw new Error(); return String.fromCharCode((a.charCodeAt(0) + b.charCodeAt(0)) / 2); } /**Obtiene un pushId entre @param minValue y @param maxValue con la mayor cantidad de digitos aleatorios posible, esto permite * reordenar ids en el lado del cliente */ export function reoderPushId(minValue, maxValue) { minValue = minValue !== null && minValue !== void 0 ? minValue : minPushId; maxValue = maxValue !== null && maxValue !== void 0 ? maxValue : generatePushId(); minValue = zeroPad(minValue, Math.max(minValue.length, maxValue.length), system); maxValue = zeroPad(maxValue, Math.max(minValue.length, maxValue.length), system); const mid = midpoint(minValue, maxValue, system); //La parte que no sea necesaria para el orden la volvemos a poner aleatoria, para que no haya colisiones si //2 clientes reordenan a la misma posición: let i = 0; let gtMin = false; let ltMax = false; for (; i < mid.length; i++) { const curr = mid[i]; const min = minValue[i]; const max = maxValue[i]; if (curr > min) { gtMin = true; } if (curr < max) { ltMax = true; } if (gtMin && ltMax) { break; } } if (!gtMin || !ltMax) { //No hay espacio para reordenar, se tiene que aumentar la longitud: return minValue + random(ranLen, system); } const orderCount = i + 1; //Mantiene un minimo de caracteres aleatorios para evitar colisiones entre clientes reordenando a la misma posición const randCount = Math.max(mid.length - orderCount, ranLen); const ret = mid.substr(0, orderCount) + random(randCount, system); return ret; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaGlkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1c2hpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBWSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHcEgsMEJBQTBCO0FBQzFCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNqQixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNsQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRTlDLFNBQVMsZ0JBQWdCO0lBQ3JCLE9BQU8sT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxJQUFJLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBQ3ZDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVuQjs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjO0lBQzFCLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDckMsSUFBSSxTQUFTLElBQUksYUFBYSxFQUFFO1FBQzVCLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDMUIsVUFBVSxHQUFHLENBQUMsQ0FBQztLQUNsQjtTQUNJO1FBQ0QsVUFBVSxJQUFJLENBQUMsQ0FBQztLQUNuQjtJQUVELE9BQU8sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELE1BQU0sR0FBRyxHQUFH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