randomcryp
Version:
A cryptographically secure, feature rich, zero dependency and browser friendly random number generator library.
122 lines (113 loc) • 2.88 kB
JavaScript
// src/lib/uSafeInt.ts
var POW_2_37 = Math.pow(2, 37);
var POW_2_21 = Math.pow(2, 21);
var POW_2_5 = Math.pow(2, 5);
var uSafeInt = () => {
const [num1, num2, num3, num4] = crypto.getRandomValues(new Uint16Array(4));
return num1 * POW_2_37 + num2 * POW_2_21 + num3 * POW_2_5 + (num4 & POW_2_5 - 1);
};
// src/lib/bool.ts
var bool = () => uSafeInt() % 2 === 0;
// src/lib/float.ts
var POW_2_53 = Math.pow(2, 53);
var float = () => uSafeInt() / POW_2_53;
// src/lib/choice.ts
var choice = (choices) => {
if (choices.length === 0)
return;
return choices[Math.floor(float() * choices.length)];
};
// src/lib/hex.ts
var digits = "0123456789abcdef";
var hex = (length = 8, prefix = false) => {
const randArr = crypto.getRandomValues(new Uint8Array(Math.ceil(length / 2)));
const hexArr = new Array(randArr.length);
for (let i = 0, j = 0;i < length; i++, j = Math.floor(i / 2)) {
if (i % 2 === 0) {
hexArr[i] = digits[randArr[j] >> 4];
} else {
hexArr[i] = digits[randArr[j] & 15];
}
}
if (prefix)
return "0x" + hexArr.join("");
return hexArr.join("");
};
// src/lib/safeInt.ts
var POW_2_372 = Math.pow(2, 37);
var POW_2_212 = Math.pow(2, 21);
var POW_2_52 = Math.pow(2, 5);
var safeInt = () => {
const [num1, num2, num3, num4] = crypto.getRandomValues(new Uint16Array(4));
return ((num4 & POW_2_52) < 1 ? 1 : -1) * (num1 * POW_2_372 + num2 * POW_2_212 + num3 * POW_2_52 + (num4 & POW_2_52 - 1));
};
// src/lib/ifloat.ts
var ifloat = () => safeInt() / Number.MAX_SAFE_INTEGER;
// src/lib/percentage.ts
var percentage = (input) => {
if (input < 0 || input > 100) {
throw new RangeError("input value should be between 0 and 100");
}
return float() * 100 < input;
};
// src/lib/rangeInt.ts
var rangeInt = (min, max) => {
if (min > max) {
throw new RangeError("min must be less than or equal to max");
}
return min + Math.floor(float() * (max - min + 1));
};
// src/lib/range.ts
var range = (min, max) => {
if (min > max) {
throw new RangeError("min must be less than or equal to max");
}
return min + float() * (max - min);
};
// src/lib/shuffle.ts
function shuffle(input) {
const array = Array.from(input);
for (let i = array.length - 1;i > 0; i--) {
const pick = Math.floor(float() * (i + 1));
const temp = array[i];
array[i] = array[pick];
array[pick] = temp;
}
return typeof input === "string" ? array.join("") : array;
}
// src/index.ts
var src_default = {
bool,
boolean: bool,
choice,
float,
hex,
ifloat,
percentage,
pick: choice,
randInt: rangeInt,
random: float,
range,
rangeInt,
safeInt,
shuffle,
uSafeInt
};
export {
uSafeInt,
shuffle,
safeInt,
rangeInt,
range,
float as random,
rangeInt as randInt,
choice as pick,
percentage,
ifloat,
hex,
float,
src_default as default,
choice,
bool as boolean,
bool
};