You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.6 KiB
64 lines
1.6 KiB
import stringify from './stringify.js'; |
|
import parse from './parse.js'; |
|
|
|
function stringToBytes(str) { |
|
str = unescape(encodeURIComponent(str)); // UTF8 escape |
|
|
|
var bytes = []; |
|
|
|
for (var i = 0; i < str.length; ++i) { |
|
bytes.push(str.charCodeAt(i)); |
|
} |
|
|
|
return bytes; |
|
} |
|
|
|
export var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; |
|
export var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; |
|
export default function (name, version, hashfunc) { |
|
function generateUUID(value, namespace, buf, offset) { |
|
if (typeof value === 'string') { |
|
value = stringToBytes(value); |
|
} |
|
|
|
if (typeof namespace === 'string') { |
|
namespace = parse(namespace); |
|
} |
|
|
|
if (namespace.length !== 16) { |
|
throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); |
|
} // Compute hash of namespace and value, Per 4.3 |
|
// Future: Use spread syntax when supported on all platforms, e.g. `bytes = |
|
// hashfunc([...namespace, ... value])` |
|
|
|
|
|
var bytes = new Uint8Array(16 + value.length); |
|
bytes.set(namespace); |
|
bytes.set(value, namespace.length); |
|
bytes = hashfunc(bytes); |
|
bytes[6] = bytes[6] & 0x0f | version; |
|
bytes[8] = bytes[8] & 0x3f | 0x80; |
|
|
|
if (buf) { |
|
offset = offset || 0; |
|
|
|
for (var i = 0; i < 16; ++i) { |
|
buf[offset + i] = bytes[i]; |
|
} |
|
|
|
return buf; |
|
} |
|
|
|
return stringify(bytes); |
|
} // Function#name is not settable on some platforms (#270) |
|
|
|
|
|
try { |
|
generateUUID.name = name; // eslint-disable-next-line no-empty |
|
} catch (err) {} // For CommonJS default export support |
|
|
|
|
|
generateUUID.DNS = DNS; |
|
generateUUID.URL = URL; |
|
return generateUUID; |
|
} |