UNPKG

3.06 kBJavaScriptView Raw
1// Load modules
2
3var Crypto = require('crypto');
4
5
6// Declare internals
7
8var internals = {};
9
10
11// Portions based on node-uuid - https://github.com/broofa/node-uuid - Copyright (c) 2010-2012 Robert Kieffer - MIT License
12
13internals.byteToHex = [];
14
15
16internals.buildCache = function () {
17
18 for (var i = 0; i < 256; ++i) {
19 var hex = (i < 16 ? '0' : '') + i.toString(16);
20 internals.byteToHex[i] = hex;
21 }
22};
23
24internals.buildCache();
25
26
27exports.generate = function () {
28
29 var rand = Crypto.randomBytes(10);
30
31 rand[6] = (rand[6] & 0x0f) | 0x40; // Per RFC 4122 (4.4) - set bits for version and `clock_seq_hi_and_reserved`
32 rand[8] = (rand[8] & 0x3f) | 0x80;
33
34 var b = internals.byteToHex;
35 var id = b[rand[0]] + b[rand[1]] + b[rand[2]] + b[rand[3]] + '-' +
36 b[rand[4]] + b[rand[5]] + '-' +
37 b[rand[6]] + b[rand[7]] + '-' +
38 b[rand[8]] + b[rand[9]] + '-';
39
40 var distributedRandom3B = function () {
41
42 var bytes = '';
43
44 while (!bytes) { // This can theoretically loop forever if the machine random device generates garbage
45 var rand = Crypto.randomBytes(3);
46 var value = (rand[0] << 16) | (rand[1] << 8) | rand[2];
47 if (value >= 10000000) {
48 continue;
49 }
50
51 bytes = internals.byteToHex[rand[0]] + internals.byteToHex[rand[1]] + internals.byteToHex[rand[2]];
52 }
53
54 return bytes;
55 };
56
57 id += distributedRandom3B();
58 id += distributedRandom3B();
59
60 return id;
61};
62
63
64exports.criteria = function (id) {
65
66 if (!id.match(/^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$/)) {
67 return null;
68 }
69
70 var parse = function (from, to) {
71
72 var hex = id.slice(from, to);
73 var value = parseInt(hex, 16);
74
75 if (value >= 10000000) {
76 return null;
77 }
78
79 var set = value.toString().split('');
80 for (var i = 0, il = set.length; i < il; ++i) {
81 set[i] = parseInt(set[i], 10);
82 }
83
84 for (i = 0, il = 7 - set.length; i < il; ++i) {
85 set.unshift(0);
86 }
87
88 return set;
89 };
90
91 var set1 = parse(24, 30);
92 var set2 = parse(30);
93
94 if (set1 === null ||
95 set2 === null) {
96
97 return null;
98 }
99
100 var criteria = {
101 $id: id,
102 random: {
103 a: (set1[0] * 10) + set1[1] + 1,
104 b: (set1[1] * 10) + set1[2] + 1,
105 c: (set1[2] * 10) + set1[3] + 1,
106 d: (set1[3] * 10) + set1[4] + 1,
107 e: (set1[4] * 10) + set1[5] + 1,
108 f: (set1[5] * 10) + set1[6] + 1,
109 g: (set1[6] * 10) + set2[0] + 1,
110 h: (set2[0] * 10) + set2[1] + 1,
111 i: (set2[1] * 10) + set2[2] + 1,
112 j: (set2[2] * 10) + set2[3] + 1,
113 k: (set2[3] * 10) + set2[4] + 1,
114 l: (set2[4] * 10) + set2[5] + 1,
115 m: (set2[5] * 10) + set2[6] + 1,
116 n: (set2[6] * 10) + set1[0] + 1
117 }
118 };
119
120 return criteria;
121};
122
123