|
import {random} from 'lodash'; |
|
|
|
|
|
const USABLE_CHARACTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
|
const ID_LENGTH = 4; |
|
|
|
export function isValidRoomID(id: string | null | undefined): boolean { |
|
if (id == null) { |
|
return false; |
|
} |
|
if (id.length !== ID_LENGTH) { |
|
return false; |
|
} |
|
return isValidPartialRoomID(id); |
|
} |
|
|
|
export function isValidPartialRoomID(roomID: string): boolean { |
|
return ( |
|
roomID.length <= ID_LENGTH && |
|
roomID.split('').every((char) => USABLE_CHARACTERS.includes(char)) |
|
); |
|
} |
|
|
|
export default function generateNewRoomID(): string { |
|
return Array.from( |
|
{length: ID_LENGTH}, |
|
() => USABLE_CHARACTERS[random(USABLE_CHARACTERS.length - 1)], |
|
).join(''); |
|
} |
|
|
|
export function getSequentialRoomIDForTestingGenerator(): () => string { |
|
let counter = 0; |
|
|
|
return function generateNextRoomID(): string { |
|
const counterInBase: string = Number(counter) |
|
.toString(USABLE_CHARACTERS.length) |
|
.padStart(ID_LENGTH, '0'); |
|
|
|
if (counterInBase.length > ID_LENGTH) { |
|
throw new Error( |
|
'Ran out of unique room IDs from the sequential generator', |
|
); |
|
} |
|
|
|
const result = counterInBase |
|
.split('') |
|
.map( |
|
(digit) => USABLE_CHARACTERS[parseInt(digit, USABLE_CHARACTERS.length)], |
|
) |
|
.join(''); |
|
|
|
counter++; |
|
|
|
return result; |
|
}; |
|
} |
|
|