UNPKG

hsd

Version:
117 lines (84 loc) 2.05 kB
'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);