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.
29 lines
1.4 KiB
29 lines
1.4 KiB
import validate from './validate.js'; |
|
/** |
|
* Convert array of 16 byte values to UUID string format of the form: |
|
* XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX |
|
*/ |
|
|
|
const byteToHex = []; |
|
|
|
for (let i = 0; i < 256; ++i) { |
|
byteToHex.push((i + 0x100).toString(16).substr(1)); |
|
} |
|
|
|
function stringify(arr, offset = 0) { |
|
// Note: Be careful editing this code! It's been tuned for performance |
|
// and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 |
|
const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one |
|
// of the following: |
|
// - One or more input array values don't map to a hex octet (leading to |
|
// "undefined" in the uuid) |
|
// - Invalid input values for the RFC `version` or `variant` fields |
|
|
|
if (!validate(uuid)) { |
|
throw TypeError('Stringified UUID is invalid'); |
|
} |
|
|
|
return uuid; |
|
} |
|
|
|
export default stringify; |