v5.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. var sha1 = require('./lib/sha1-browser');
  2. var bytesToUuid = require('./lib/bytesToUuid');
  3. function uuidToBytes(uuid) {
  4. // Note: We assume we're being passed a valid uuid string
  5. var bytes = [];
  6. uuid.replace(/[a-fA-F0-9]{2}/g, function(hex) {
  7. bytes.push(parseInt(hex, 16));
  8. });
  9. return bytes;
  10. }
  11. function stringToBytes(str) {
  12. str = unescape(encodeURIComponent(str)); // UTF8 escape
  13. var bytes = new Array(str.length);
  14. for (var i = 0; i < str.length; i++) {
  15. bytes[i] = str.charCodeAt(i);
  16. }
  17. return bytes;
  18. }
  19. function v5(name, namespace, buf, offset) {
  20. if (typeof(name) == 'string') name = stringToBytes(name);
  21. if (typeof(namespace) == 'string') namespace = uuidToBytes(namespace);
  22. if (!Array.isArray(name)) throw TypeError('name must be an array of bytes');
  23. if (!Array.isArray(namespace) || namespace.length != 16) throw TypeError('namespace must be uuid string or an Array of 16 byte values');
  24. // Per 4.3
  25. var bytes = sha1(namespace.concat(name));
  26. bytes[6] = (bytes[6] & 0x0f) | 0x50;
  27. bytes[8] = (bytes[8] & 0x3f) | 0x80;
  28. return buf || bytesToUuid(bytes);
  29. }
  30. // Pre-defined namespaces, per Appendix C
  31. v5.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
  32. v5.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
  33. module.exports = v5;