2021-07-09 03:49:18 +02:00
|
|
|
import * as crypto from "crypto";
|
|
|
|
import { promisify } from "util";
|
|
|
|
|
|
|
|
const AsciiRange = {
|
|
|
|
/** space */
|
|
|
|
min: 32,
|
|
|
|
/** childe mark ~ */
|
|
|
|
max: 126,
|
|
|
|
}
|
|
|
|
|
2021-07-11 06:16:21 +02:00
|
|
|
export async function generatePassword(length: number): Promise<string> {
|
2021-07-09 03:49:18 +02:00
|
|
|
let result = "";
|
|
|
|
while (true) {
|
2021-07-11 06:16:21 +02:00
|
|
|
const bytes = await promisify(crypto.randomBytes)(length * 2);
|
2021-07-09 03:49:18 +02:00
|
|
|
const byteArray = Array.from(bytes);
|
|
|
|
const filtered = byteArray.filter(isInAsciiRange);
|
|
|
|
result += String.fromCharCode(...filtered);
|
2021-07-11 06:16:21 +02:00
|
|
|
if (result.length >= length) {
|
|
|
|
result = result.slice(0, length);
|
2021-07-09 03:49:18 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
function isInAsciiRange(value: number) {
|
|
|
|
return AsciiRange.min <= value && value <= AsciiRange.max;
|
|
|
|
}
|