@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
37 lines (36 loc) • 1.21 kB
JavaScript
export const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';
export const random = (bytes) => crypto.getRandomValues(new Uint8Array(bytes));
export const customRandom = (alphabet, defaultSize, getRandom) => {
const mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1;
const step = -~((1.6 * mask * defaultSize) / alphabet.length);
return (size = defaultSize) => {
let id = '';
while (true) {
const bytes = getRandom(step);
let j = step;
while (j--) {
id += alphabet[bytes[j] & mask] || '';
if (id.length === size) {
return id;
}
}
}
};
};
export const customAlphabet = (alphabet, size = 21) => customRandom(alphabet, size, random);
export const nanoid = (size = 21) => crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {
byte &= 63;
if (byte < 36) {
id += byte.toString(36);
}
else if (byte < 62) {
id += (byte - 26).toString(36).toUpperCase();
}
else if (byte > 62) {
id += '-';
}
else {
id += '_';
}
return id;
}, '');