eddystone-uid
Version:
Eddystone UID convertor
51 lines (41 loc) • 1.26 kB
JavaScript
;
var uuid = require('node-uuid');
var regexps = {
uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
fqdn: /^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}$/i
};
function truncatFQDN(name) {
var crypto = require('crypto');
var sha = crypto.createHash('sha1');
sha.update(name);
return sha.digest('hex').slice(0, 10);
}
function elideUUID(name) {
var id = name.split('-');
return id[0] + id[4];
}
module.exports = {
toBeaconId: function (iid, type) {
if (iid && iid.length !== 6) {
throw new Error('Invalid Beacond(Instance) ID for eddystone. ' + iid);
} else if (!iid){
// generate random iid if iid has an invalid format
iid = (Math.random().toString(36) + '00000000000000000').slice(2, 6 + 2);
}
var buf = new Buffer(iid, 'binary');
return (type === 'buf') ? buf : buf.toString('hex');
},
toNamespace: function (name) {
var namespace;
if (regexps.uuid.test(name)) {
namespace = elideUUID(name);
} else if (regexps.fqdn.test(name)) {
namespace = truncatFQDN(name);
} else {
// if name is unknown type or undefined it is using
// auto generated uuid
namespace = elideUUID(uuid.v1());
}
return namespace;
}
};