node-red-contrib-password-g.../lib/PasswordGenerator.ts

28 lines
750 B
TypeScript
Raw Normal View History

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;
}