simple-pure-utils
Version:
Funciones puras para manipulación de objetos, arreglos, promesas y observables
76 lines • 6.96 kB
JavaScript
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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