simple-pure-utils
Version:
Funciones puras para manipulación de objetos, arreglos, promesas y observables
81 lines • 7.24 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.reoderPushId = exports.generatePushId = void 0;
const bignum_1 = require("./pushid/bignum");
/**ASCII ordered base64 */
const system = (0, bignum_1.createBase)('-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz');
const ranLen = 8;
const pushIdLen = 8 + 8 + ranLen;
const minPushId = (0, bignum_1.minValue)(pushIdLen, system);
function timestampToChars() {
return (0, bignum_1.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
*/
function generatePushId() {
const timestamp = timestampToChars();
if (timestamp != lastTimestamp) {
lastTimestamp = timestamp;
lastConsec = 0;
}
else {
lastConsec += 1;
}
return timestamp + (0, bignum_1.toBaseN)(lastConsec, 8, system) + (0, bignum_1.random)(ranLen, system);
}
exports.generatePushId = generatePushId;
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
*/
function reoderPushId(minValue, maxValue) {
minValue = minValue !== null && minValue !== void 0 ? minValue : minPushId;
maxValue = maxValue !== null && maxValue !== void 0 ? maxValue : generatePushId();
minValue = (0, bignum_1.zeroPad)(minValue, Math.max(minValue.length, maxValue.length), system);
maxValue = (0, bignum_1.zeroPad)(maxValue, Math.max(minValue.length, maxValue.length), system);
const mid = (0, bignum_1.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 + (0, bignum_1.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) + (0, bignum_1.random)(randCount, system);
return ret;
}
exports.reoderPushId = reoderPushId;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaGlkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1c2hpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0Q0FBb0g7QUFHcEgsMEJBQTBCO0FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUEsbUJBQVUsRUFBQyxrRUFBa0UsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNqQixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFBLGlCQUFRLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRTlDLFNBQVMsZ0JBQWdCO0lBQ3JCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxJQUFJLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBQ3ZDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVuQjs7R0FFRztBQUNILFNBQWdCLGNBQWM7SUFDMUIsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUNyQyxJQUFJLFNBQVMsSUFBSSxhQUFhLEVBQUU7UUFDNUIsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUMxQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0tBQ2xCO1NBQ0k7UUFDRCxVQUFVLElBQUksQ0FBQyxDQUFDO0tBQ25CO0lBRUQsT0FBTyxTQUFTLEdBQUcsSUFBQSxnQkFBTyxFQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBQSxlQUFNLEVBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFYRCx3Q0FXQztBQUVELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxH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
;