Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Partial-Bug: #1436688 Change-Id: Idaef4d71d88b82bef5c3ca2982458cdad5bf6c85
- Loading branch information
1 parent
0e1753c
commit 51fefc5
Showing
1 changed file
with
233 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,233 @@ | ||
/* | ||
* UUID-js: A js library to generate and parse UUIDs, TimeUUIDs and generate | ||
* TimeUUID based on dates for range selections. | ||
* @see http://www.ietf.org/rfc/rfc4122.txt | ||
**/ | ||
|
||
function UUIDjs() { | ||
}; | ||
|
||
UUIDjs.maxFromBits = function(bits) { | ||
return Math.pow(2, bits); | ||
}; | ||
|
||
UUIDjs.limitUI04 = UUIDjs.maxFromBits(4); | ||
UUIDjs.limitUI06 = UUIDjs.maxFromBits(6); | ||
UUIDjs.limitUI08 = UUIDjs.maxFromBits(8); | ||
UUIDjs.limitUI12 = UUIDjs.maxFromBits(12); | ||
UUIDjs.limitUI14 = UUIDjs.maxFromBits(14); | ||
UUIDjs.limitUI16 = UUIDjs.maxFromBits(16); | ||
UUIDjs.limitUI32 = UUIDjs.maxFromBits(32); | ||
UUIDjs.limitUI40 = UUIDjs.maxFromBits(40); | ||
UUIDjs.limitUI48 = UUIDjs.maxFromBits(48); | ||
|
||
UUIDjs.randomUI04 = function() { | ||
return Math.round(Math.random() * UUIDjs.limitUI04); | ||
}; | ||
UUIDjs.randomUI06 = function() { | ||
return Math.round(Math.random() * UUIDjs.limitUI06); | ||
}; | ||
UUIDjs.randomUI08 = function() { | ||
return Math.round(Math.random() * UUIDjs.limitUI08); | ||
}; | ||
UUIDjs.randomUI12 = function() { | ||
return Math.round(Math.random() * UUIDjs.limitUI12); | ||
}; | ||
UUIDjs.randomUI14 = function() { | ||
return Math.round(Math.random() * UUIDjs.limitUI14); | ||
}; | ||
UUIDjs.randomUI16 = function() { | ||
return Math.round(Math.random() * UUIDjs.limitUI16); | ||
}; | ||
UUIDjs.randomUI32 = function() { | ||
return Math.round(Math.random() * UUIDjs.limitUI32); | ||
}; | ||
UUIDjs.randomUI40 = function() { | ||
return (0 | Math.random() * (1 << 30)) + (0 | Math.random() * (1 << 40 - 30)) * (1 << 30); | ||
}; | ||
UUIDjs.randomUI48 = function() { | ||
return (0 | Math.random() * (1 << 30)) + (0 | Math.random() * (1 << 48 - 30)) * (1 << 30); | ||
}; | ||
|
||
UUIDjs.paddedString = function(string, length, z) { | ||
string = String(string); | ||
z = (!z) ? '0' : z; | ||
var i = length - string.length; | ||
for (; i > 0; i >>>= 1, z += z) { | ||
if (i & 1) { | ||
string = z + string; | ||
} | ||
} | ||
return string; | ||
}; | ||
|
||
UUIDjs.prototype.fromParts = function(timeLow, timeMid, timeHiAndVersion, clockSeqHiAndReserved, clockSeqLow, node) { | ||
this.version = (timeHiAndVersion >> 12) & 0xF; | ||
this.hex = UUIDjs.paddedString(timeLow.toString(16), 8) | ||
+ '-' | ||
+ UUIDjs.paddedString(timeMid.toString(16), 4) | ||
+ '-' | ||
+ UUIDjs.paddedString(timeHiAndVersion.toString(16), 4) | ||
+ '-' | ||
+ UUIDjs.paddedString(clockSeqHiAndReserved.toString(16), 2) | ||
+ UUIDjs.paddedString(clockSeqLow.toString(16), 2) | ||
+ '-' | ||
+ UUIDjs.paddedString(node.toString(16), 12); | ||
return this; | ||
}; | ||
|
||
UUIDjs.prototype.toString = function() { | ||
return this.hex; | ||
}; | ||
UUIDjs.prototype.toURN = function() { | ||
return 'urn:uuid:' + this.hex; | ||
}; | ||
|
||
UUIDjs.prototype.toBytes = function() { | ||
var parts = this.hex.split('-'); | ||
var ints = []; | ||
var intPos = 0; | ||
for (var i = 0; i < parts.length; i++) { | ||
for (var j = 0; j < parts[i].length; j+=2) { | ||
ints[intPos++] = parseInt(parts[i].substr(j, 2), 16); | ||
} | ||
} | ||
return ints; | ||
}; | ||
|
||
UUIDjs.prototype.equals = function(uuid) { | ||
if (!(uuid instanceof UUID)) { | ||
return false; | ||
} | ||
if (this.hex !== uuid.hex) { | ||
return false; | ||
} | ||
return true; | ||
}; | ||
|
||
UUIDjs.getTimeFieldValues = function(time) { | ||
var ts = time - Date.UTC(1582, 9, 15); | ||
var hm = ((ts / 0x100000000) * 10000) & 0xFFFFFFF; | ||
return { low: ((ts & 0xFFFFFFF) * 10000) % 0x100000000, | ||
mid: hm & 0xFFFF, hi: hm >>> 16, timestamp: ts }; | ||
}; | ||
|
||
UUIDjs._create4 = function() { | ||
return new UUIDjs().fromParts( | ||
UUIDjs.randomUI32(), | ||
UUIDjs.randomUI16(), | ||
0x4000 | UUIDjs.randomUI12(), | ||
0x80 | UUIDjs.randomUI06(), | ||
UUIDjs.randomUI08(), | ||
UUIDjs.randomUI48() | ||
); | ||
}; | ||
|
||
UUIDjs._create1 = function() { | ||
var now = new Date().getTime(); | ||
var sequence = UUIDjs.randomUI14(); | ||
var node = (UUIDjs.randomUI08() | 1) * 0x10000000000 + UUIDjs.randomUI40(); | ||
var tick = UUIDjs.randomUI04(); | ||
var timestamp = 0; | ||
var timestampRatio = 1/4; | ||
|
||
if (now != timestamp) { | ||
if (now < timestamp) { | ||
sequence++; | ||
} | ||
timestamp = now; | ||
tick = UUIDjs.randomUI04(); | ||
} else if (Math.random() < timestampRatio && tick < 9984) { | ||
tick += 1 + UUIDjs.randomUI04(); | ||
} else { | ||
sequence++; | ||
} | ||
|
||
var tf = UUIDjs.getTimeFieldValues(timestamp); | ||
var tl = tf.low + tick; | ||
var thav = (tf.hi & 0xFFF) | 0x1000; | ||
|
||
sequence &= 0x3FFF; | ||
var cshar = (sequence >>> 8) | 0x80; | ||
var csl = sequence & 0xFF; | ||
|
||
return new UUIDjs().fromParts(tl, tf.mid, thav, cshar, csl, node); | ||
}; | ||
|
||
UUIDjs.create = function(version) { | ||
version = version || 4; | ||
return this['_create' + version](); | ||
}; | ||
|
||
UUIDjs.fromTime = function(time, last) { | ||
last = (!last) ? false : last; | ||
var tf = UUIDjs.getTimeFieldValues(time); | ||
var tl = tf.low; | ||
var thav = (tf.hi & 0xFFF) | 0x1000; // set version '0001' | ||
if (last === false) { | ||
return new UUIDjs().fromParts(tl, tf.mid, thav, 0, 0, 0); | ||
} else { | ||
return new UUIDjs().fromParts(tl, tf.mid, thav, 0x80 | UUIDjs.limitUI06, UUIDjs.limitUI08 - 1, UUIDjs.limitUI48 - 1); | ||
} | ||
}; | ||
|
||
UUIDjs.firstFromTime = function(time) { | ||
return UUIDjs.fromTime(time, false); | ||
}; | ||
UUIDjs.lastFromTime = function(time) { | ||
return UUIDjs.fromTime(time, true); | ||
}; | ||
|
||
UUIDjs.fromURN = function(strId) { | ||
var r, p = /^(?:urn:uuid:|\{)?([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{2})([0-9a-f]{2})-([0-9a-f]{12})(?:\})?$/i; | ||
if ((r = p.exec(strId))) { | ||
return new UUIDjs().fromParts(parseInt(r[1], 16), parseInt(r[2], 16), | ||
parseInt(r[3], 16), parseInt(r[4], 16), | ||
parseInt(r[5], 16), parseInt(r[6], 16)); | ||
} | ||
return null; | ||
}; | ||
|
||
UUIDjs.fromBytes = function(ints) { | ||
if (ints.length < 5) { | ||
return null; | ||
} | ||
var str = ''; | ||
var pos = 0; | ||
var parts = [4, 2, 2, 2, 6]; | ||
for (var i = 0; i < parts.length; i++) { | ||
for (var j = 0; j < parts[i]; j++) { | ||
var octet = ints[pos++].toString(16); | ||
if (octet.length == 1) { | ||
octet = '0' + octet; | ||
} | ||
str += octet; | ||
} | ||
if (parts[i] !== 6) { | ||
str += '-'; | ||
} | ||
} | ||
return UUIDjs.fromURN(str); | ||
}; | ||
|
||
UUIDjs.fromBinary = function(binary) { | ||
var ints = []; | ||
for (var i = 0; i < binary.length; i++) { | ||
ints[i] = binary.charCodeAt(i); | ||
if (ints[i] > 255 || ints[i] < 0) { | ||
throw new Error('Unexpected byte in binary data.'); | ||
} | ||
} | ||
return UUIDjs.fromBytes(ints); | ||
}; | ||
|
||
// Aliases to support legacy code. Do not use these when writing new code as | ||
// they may be removed in future versions! | ||
UUIDjs.new = function() { | ||
return this.create(4); | ||
}; | ||
UUIDjs.newTS = function() { | ||
return this.create(1); | ||
}; | ||
|
||
//module.exports = UUIDjs; |