Files
iptvnator/libs/shared/interfaces/src/lib/random-id.util.ts
T
4gray 1ab82b04a1 refactor(deps): drop uuid for a shared crypto-based id helper (#1266)
Supersedes #1252 and #872. uuid 14 is ESM-only, apps/web/jest.config.ts only
kept v9 working by mapping `^uuid$` at a `wrapper.mjs` that v14 no longer
ships, and the specifier also has to be synced in
libs/shared/m3u-utils/package.json or @nx/dependency-checks fails lint.

All four call sites only used `v4()`, so the dependency goes away instead.
`createRandomId()` prefers `crypto.randomUUID()` and falls back to building the
same v4 shape from `crypto.getRandomValues()` — that fallback is load-bearing,
because randomUUID is only exposed in secure contexts and the self-hosted PWA
is regularly served over plain http on a LAN address. getRandomValues stays
available there, and it is what uuid's own v4 used.

`@types/uuid` goes too; it only existed for the untyped v9 package.
2026-07-26 22:27:31 +02:00

44 lines
1.3 KiB
TypeScript

/**
* Random RFC 4122 v4 identifier used for playlist `_id` values, shared by the
* renderer, the Electron backend and the web backend. Pure function — no
* Angular/Node dependencies.
*
* `crypto.randomUUID()` is only exposed in secure contexts, and the
* self-hosted PWA is regularly served over plain http on a LAN address. So the
* fallback builds the same v4 shape from `crypto.getRandomValues()`, which
* insecure contexts do expose. This mirrors what `uuid`'s `v4()` did before it
* was dropped as a dependency.
*/
const HEX_BY_BYTE = Array.from({ length: 256 }, (_unused, byte) =>
byte.toString(16).padStart(2, '0')
);
function randomUuidFromBytes(): string {
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
// Version 4 and the RFC 4122 variant bits.
bytes[6] = (bytes[6] & 0x0f) | 0x40;
bytes[8] = (bytes[8] & 0x3f) | 0x80;
const hex = Array.from(bytes, (byte) => HEX_BY_BYTE[byte]);
return [
hex.slice(0, 4).join(''),
hex.slice(4, 6).join(''),
hex.slice(6, 8).join(''),
hex.slice(8, 10).join(''),
hex.slice(10, 16).join(''),
].join('-');
}
/** Returns a lowercase RFC 4122 v4 UUID. */
export function createRandomId(): string {
if (typeof crypto.randomUUID === 'function') {
return crypto.randomUUID();
}
return randomUuidFromBytes();
}