116 lines
2 KiB
JavaScript
116 lines
2 KiB
JavaScript
'use strict';
|
|
|
|
const assert = require('bsert');
|
|
const sha3 = require('bcrypto/lib/sha3');
|
|
const data = require('./lockup.json');
|
|
|
|
/*
|
|
* Constants
|
|
*/
|
|
|
|
const ZERO_HASH = sha3.zero.toString('hex');
|
|
|
|
/**
|
|
* Locked up
|
|
*/
|
|
|
|
class LockedUp {
|
|
constructor(data) {
|
|
const meta = data[ZERO_HASH];
|
|
|
|
this.data = data;
|
|
this.size = meta[0];
|
|
}
|
|
|
|
has(hash) {
|
|
assert(Buffer.isBuffer(hash) && hash.length === 32);
|
|
|
|
const hex = hash.toString('hex');
|
|
const item = this.data[hex];
|
|
|
|
if (!item)
|
|
return false;
|
|
|
|
return Array.isArray(item);
|
|
}
|
|
|
|
get(hash) {
|
|
assert(Buffer.isBuffer(hash) && hash.length === 32);
|
|
|
|
const hex = hash.toString('hex');
|
|
const item = this.data[hex];
|
|
|
|
if (!item || !Array.isArray(item))
|
|
return null;
|
|
|
|
const target = item[0];
|
|
const flags = item[1];
|
|
const index = target.indexOf('.');
|
|
|
|
assert(index !== -1);
|
|
|
|
const root = (flags & 1) !== 0;
|
|
const custom = (flags & 2) !== 0;
|
|
const name = target.substring(0, index);
|
|
|
|
return {
|
|
name,
|
|
hash,
|
|
target,
|
|
root,
|
|
custom
|
|
};
|
|
}
|
|
|
|
hasByName(name) {
|
|
assert(typeof name === 'string');
|
|
|
|
if (name.length === 0 || name.length > 63)
|
|
return false;
|
|
|
|
return this.has(hashName(name));
|
|
}
|
|
|
|
getByName(name) {
|
|
assert(typeof name === 'string');
|
|
|
|
if (name.length === 0 || name.length > 63)
|
|
return null;
|
|
|
|
return this.get(hashName(name));
|
|
}
|
|
|
|
*entries() {
|
|
const keys = Object.keys(this.data);
|
|
|
|
for (const key of keys) {
|
|
const hash = Buffer.from(key, 'hex');
|
|
|
|
yield [hash, this.get(hash)];
|
|
}
|
|
}
|
|
|
|
*keys() {
|
|
const keys = Object.keys(this.data);
|
|
|
|
for (const key of keys)
|
|
yield Buffer.from(key, 'hex');
|
|
}
|
|
|
|
*values() {
|
|
for (const [, item] of this.entries())
|
|
yield item;
|
|
}
|
|
|
|
[Symbol.iterator]() {
|
|
return this.entries();
|
|
}
|
|
}
|
|
|
|
function hashName(name) {
|
|
const raw = Buffer.from(name.toLowerCase(), 'ascii');
|
|
return sha3.digest(raw);
|
|
}
|
|
|
|
exports.LockedUp = LockedUp;
|
|
exports.locked = new LockedUp(data);
|