58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import { InvalidArgumentError } from '@ai-sdk/provider';
|
|
|
|
/**
|
|
* Creates an ID generator.
|
|
* The total length of the ID is the sum of the prefix, separator, and random part length.
|
|
* Not cryptographically secure.
|
|
*
|
|
* @param alphabet - The alphabet to use for the ID. Default: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
|
|
* @param prefix - The prefix of the ID to generate. Optional.
|
|
* @param separator - The separator between the prefix and the random part of the ID. Default: '-'.
|
|
* @param size - The size of the random part of the ID to generate. Default: 16.
|
|
*/
|
|
export const createIdGenerator = ({
|
|
prefix,
|
|
size = 16,
|
|
alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
|
|
separator = '-',
|
|
}: {
|
|
prefix?: string;
|
|
separator?: string;
|
|
size?: number;
|
|
alphabet?: string;
|
|
} = {}): IdGenerator => {
|
|
const generator = () => {
|
|
const alphabetLength = alphabet.length;
|
|
const chars = new Array(size);
|
|
for (let i = 0; i < size; i++) {
|
|
chars[i] = alphabet[(Math.random() * alphabetLength) | 0];
|
|
}
|
|
return chars.join('');
|
|
};
|
|
|
|
if (prefix == null) {
|
|
return generator;
|
|
}
|
|
|
|
// check that the prefix is not part of the alphabet (otherwise prefix checking can fail randomly)
|
|
if (alphabet.includes(separator)) {
|
|
throw new InvalidArgumentError({
|
|
argument: 'separator',
|
|
message: `The separator "${separator}" must not be part of the alphabet "${alphabet}".`,
|
|
});
|
|
}
|
|
|
|
return () => `${prefix}${separator}${generator()}`;
|
|
};
|
|
|
|
/**
|
|
* A function that generates an ID.
|
|
*/
|
|
export type IdGenerator = () => string;
|
|
|
|
/**
|
|
* Generates a 16-character random string to use for IDs.
|
|
* Not cryptographically secure.
|
|
*/
|
|
export const generateId = createIdGenerator();
|