mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-10 01:56:16 -08:00
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.
44 lines
1.3 KiB
TypeScript
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();
|
|
}
|