yakmesh 2.8.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +637 -0
- package/CONTRIBUTING.md +42 -0
- package/Caddyfile +77 -0
- package/README.md +119 -29
- package/adapters/adapter-mlv-bible/README.md +124 -0
- package/adapters/adapter-mlv-bible/index.js +400 -0
- package/adapters/chat-mod-adapter.js +532 -0
- package/adapters/content-adapter.js +273 -0
- package/content/api.js +50 -41
- package/content/index.js +2 -2
- package/content/store.js +355 -173
- package/dashboard/index.html +19 -3
- package/database/replication.js +117 -37
- package/docs/CRYPTO-AGILITY.md +204 -0
- package/docs/MTLS-RESEARCH.md +367 -0
- package/docs/NAMCHE-SPEC.md +681 -0
- package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
- package/docs/PRECISION-DISCLOSURE.md +96 -0
- package/docs/README.md +76 -0
- package/docs/ROADMAP-2.4.0.md +447 -0
- package/docs/ROADMAP-2.5.0.md +244 -0
- package/docs/SECURITY-AUDIT-REPORT.md +306 -0
- package/docs/SST-INTEGRATION.md +712 -0
- package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
- package/docs/TERNARY-AUDIT-REPORT.md +247 -0
- package/docs/TME-FAQ.md +221 -0
- package/docs/WHITEPAPER.md +623 -0
- package/docs/adapters.html +1001 -0
- package/docs/advanced-systems.html +1045 -0
- package/docs/annex.html +1046 -0
- package/docs/api.html +970 -0
- package/docs/business/response-templates.md +160 -0
- package/docs/c2c.html +1225 -0
- package/docs/cli.html +1332 -0
- package/docs/configuration.html +1248 -0
- package/docs/darshan.html +1085 -0
- package/docs/dharma.html +966 -0
- package/docs/docs-bundle.html +1075 -0
- package/docs/docs.css +3120 -0
- package/docs/docs.js +556 -0
- package/docs/doko.html +969 -0
- package/docs/geo-proof.html +858 -0
- package/docs/getting-started.html +840 -0
- package/docs/gumba-tutorial.html +1144 -0
- package/docs/gumba.html +1098 -0
- package/docs/index.html +914 -0
- package/docs/jhilke.html +1312 -0
- package/docs/karma.html +1100 -0
- package/docs/katha.html +1037 -0
- package/docs/lama.html +978 -0
- package/docs/mandala.html +1067 -0
- package/docs/mani.html +964 -0
- package/docs/mantra.html +967 -0
- package/docs/mesh.html +1409 -0
- package/docs/nakpak.html +869 -0
- package/docs/namche.html +928 -0
- package/docs/nav-order.json +53 -0
- package/docs/prahari.html +1043 -0
- package/docs/prism-bash.min.js +1 -0
- package/docs/prism-javascript.min.js +1 -0
- package/docs/prism-json.min.js +1 -0
- package/docs/prism-tomorrow.min.css +1 -0
- package/docs/prism.min.js +1 -0
- package/docs/privacy.html +699 -0
- package/docs/quick-reference.html +1181 -0
- package/docs/sakshi.html +1402 -0
- package/docs/sandboxing.md +386 -0
- package/docs/seva.html +911 -0
- package/docs/sherpa.html +871 -0
- package/docs/studio.html +860 -0
- package/docs/stupa.html +995 -0
- package/docs/tailwind.min.css +2 -0
- package/docs/tattva.html +1332 -0
- package/docs/terms.html +686 -0
- package/docs/time-server-deployment.md +166 -0
- package/docs/time-sources.html +1392 -0
- package/docs/tivra.html +1127 -0
- package/docs/trademark-policy.html +686 -0
- package/docs/tribhuj.html +1183 -0
- package/docs/trust-security.html +1029 -0
- package/docs/tutorials/backup-recovery.html +654 -0
- package/docs/tutorials/dashboard.html +604 -0
- package/docs/tutorials/domain-setup.html +605 -0
- package/docs/tutorials/host-website.html +456 -0
- package/docs/tutorials/mesh-network.html +505 -0
- package/docs/tutorials/mobile-access.html +445 -0
- package/docs/tutorials/privacy.html +467 -0
- package/docs/tutorials/raspberry-pi.html +600 -0
- package/docs/tutorials/security-basics.html +539 -0
- package/docs/tutorials/share-files.html +431 -0
- package/docs/tutorials/troubleshooting.html +637 -0
- package/docs/tutorials/trust-karma.html +419 -0
- package/docs/tutorials/yak-protocol.html +456 -0
- package/docs/tutorials.html +1034 -0
- package/docs/vani.html +1270 -0
- package/docs/webserver.html +809 -0
- package/docs/yak-protocol.html +940 -0
- package/docs/yak-timeserver-design.md +475 -0
- package/docs/yakapp.html +1015 -0
- package/docs/ypc27.html +1069 -0
- package/docs/yurt.html +1344 -0
- package/embedded-docs/bundle.js +334 -74
- package/gossip/protocol.js +247 -27
- package/identity/key-resolver.js +262 -0
- package/identity/machine-seed.js +632 -0
- package/identity/node-key.js +669 -368
- package/identity/tribhuj-ratchet.js +506 -0
- package/knowledge-base.js +37 -8
- package/launcher/yakmesh.bat +62 -0
- package/launcher/yakmesh.sh +70 -0
- package/mesh/annex.js +462 -108
- package/mesh/beacon-broadcast.js +113 -1
- package/mesh/darshan.js +1718 -0
- package/mesh/gumba.js +1567 -0
- package/mesh/jhilke.js +651 -0
- package/mesh/katha.js +1012 -0
- package/mesh/nakpak-routing.js +8 -5
- package/mesh/network.js +724 -34
- package/mesh/pulse-sync.js +4 -1
- package/mesh/rate-limiter.js +127 -15
- package/mesh/seva.js +526 -0
- package/mesh/sherpa-discovery.js +89 -8
- package/mesh/sybil-defense.js +19 -5
- package/mesh/temporal-encoder.js +4 -3
- package/mesh/vani.js +1364 -0
- package/mesh/yurt.js +1340 -0
- package/models/entropy-sentinel.onnx +0 -0
- package/models/karma-trust.onnx +0 -0
- package/models/manifest.json +43 -0
- package/models/sakshi-anomaly.onnx +0 -0
- package/oracle/code-proof-protocol.js +7 -6
- package/oracle/codebase-lock.js +257 -28
- package/oracle/index.js +74 -15
- package/oracle/ma902-snmp.js +678 -0
- package/oracle/module-sealer.js +5 -3
- package/oracle/network-identity.js +16 -0
- package/oracle/packet-checksum.js +201 -0
- package/oracle/sst.js +579 -0
- package/oracle/ternary-144t.js +714 -0
- package/oracle/ternary-ml.js +481 -0
- package/oracle/time-api.js +239 -0
- package/oracle/time-source.js +137 -47
- package/oracle/validation-oracle-hardened.js +1111 -1071
- package/oracle/validation-oracle.js +4 -2
- package/oracle/ypc27.js +211 -0
- package/package.json +20 -3
- package/protocol/yak-handler.js +35 -9
- package/protocol/yak-protocol.js +28 -13
- package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
- package/reference/cpp/yakmesh_ypc27.cpp +179 -0
- package/sbom.json +87 -0
- package/scripts/security-audit.mjs +264 -0
- package/scripts/update-docs-nav.js +194 -0
- package/scripts/update-docs-sidebar.cjs +164 -0
- package/security/crypto-config.js +4 -3
- package/security/dharma-moderation.js +517 -0
- package/security/doko-identity.js +193 -143
- package/security/domain-consensus.js +86 -85
- package/security/fs-hardening.js +620 -0
- package/security/hardware-attestation.js +5 -3
- package/security/hybrid-trust.js +227 -87
- package/security/karma-rate-limiter.js +692 -0
- package/security/khata-protocol.js +22 -21
- package/security/khata-trust-integration.js +277 -150
- package/security/memory-safety.js +635 -0
- package/security/mesh-auth.js +11 -10
- package/security/mesh-revocation.js +373 -5
- package/security/namche-gateway.js +298 -69
- package/security/sakshi.js +460 -3
- package/security/sangha.js +770 -0
- package/security/secure-config.js +473 -0
- package/security/silicon-parity.js +13 -10
- package/security/steadywatch.js +1142 -0
- package/security/strike-system.js +32 -3
- package/security/temporal-signing.js +488 -0
- package/security/trit-commitment.js +464 -0
- package/server/crypto/annex.js +247 -0
- package/server/darshan-api.js +343 -0
- package/server/index.js +3259 -362
- package/server/komm-api.js +668 -0
- package/utils/accel.js +2273 -0
- package/utils/ternary-id.js +79 -0
- package/utils/verify-worker.js +57 -0
- package/webserver/index.js +95 -5
- package/assets/yakmesh-logo.png +0 -0
- package/assets/yakmesh-logo.svg +0 -80
- package/assets/yakmesh-logo2.png +0 -0
- package/assets/yakmesh-logo2sm.png +0 -0
- package/assets/ymsm.png +0 -0
- package/website/assets/silhouettes/adapters.svg +0 -107
- package/website/assets/silhouettes/api-endpoints.svg +0 -115
- package/website/assets/silhouettes/atomic-clock.svg +0 -83
- package/website/assets/silhouettes/base-camp.svg +0 -81
- package/website/assets/silhouettes/bridge.svg +0 -69
- package/website/assets/silhouettes/docs-bundle.svg +0 -113
- package/website/assets/silhouettes/doko-basket.svg +0 -70
- package/website/assets/silhouettes/fortress.svg +0 -93
- package/website/assets/silhouettes/gateway.svg +0 -54
- package/website/assets/silhouettes/gears.svg +0 -93
- package/website/assets/silhouettes/globe-satellite.svg +0 -67
- package/website/assets/silhouettes/karma-wheel.svg +0 -137
- package/website/assets/silhouettes/lama-council.svg +0 -141
- package/website/assets/silhouettes/mandala-network.svg +0 -169
- package/website/assets/silhouettes/mani-stones.svg +0 -149
- package/website/assets/silhouettes/mantra-wheel.svg +0 -116
- package/website/assets/silhouettes/mesh-nodes.svg +0 -113
- package/website/assets/silhouettes/nakpak.svg +0 -56
- package/website/assets/silhouettes/peak-lightning.svg +0 -73
- package/website/assets/silhouettes/sherpa.svg +0 -69
- package/website/assets/silhouettes/stupa-tower.svg +0 -119
- package/website/assets/silhouettes/tattva-eye.svg +0 -78
- package/website/assets/silhouettes/terminal.svg +0 -74
- package/website/assets/silhouettes/webserver.svg +0 -145
- package/website/assets/silhouettes/yak.svg +0 -78
- package/website/assets/yakmesh-logo.png +0 -0
- package/website/assets/yakmesh-logo.webp +0 -0
- package/website/assets/yakmesh-logo128x140.webp +0 -0
- package/website/assets/yakmesh-logo2.png +0 -0
- package/website/assets/yakmesh-logo2.svg +0 -51
- package/website/assets/yakmesh-logo40x44.webp +0 -0
- package/website/assets/yakmesh.gif +0 -0
- package/website/assets/yakmesh.ico +0 -0
- package/website/assets/yakmesh.jpg +0 -0
- package/website/assets/yakmesh.pdf +0 -0
- package/website/assets/yakmesh.png +0 -0
- package/website/assets/yakmesh.svg +0 -70
- package/website/assets/yakmesh128.webp +0 -0
- package/website/assets/yakmesh32.png +0 -0
- package/website/assets/yakmesh32.svg +0 -65
- package/website/assets/yakmesh32o.ico +0 -2
- package/website/assets/yakmesh32o.svg +0 -65
- package/website/assets/yakmesh32o.svgz +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KeyResolver — Unified public key resolution for the YAKMESH mesh
|
|
3
|
+
*
|
|
4
|
+
* Consolidates the 5+ scattered key lookup mechanisms into a single
|
|
5
|
+
* resolution cascade ordered by trust and speed:
|
|
6
|
+
*
|
|
7
|
+
* 1. Local identity (self — instant, maximum trust)
|
|
8
|
+
* 2. Explicit registrations (manual or handshake — high trust)
|
|
9
|
+
* 3. NamcheGateway DOKO cache (7-gate verified — cryptographic trust)
|
|
10
|
+
* 4. Network peer map (WS handshake — connection trust)
|
|
11
|
+
* 5. SHERPA registry (discovery beacons — medium trust)
|
|
12
|
+
*
|
|
13
|
+
* Philosophy:
|
|
14
|
+
* - No gatekeeping: resolving a key never blocks actions
|
|
15
|
+
* - No weighting: a resolved key is equally valid regardless of source
|
|
16
|
+
* - Transparent: callers can inspect resolution source via resolveWithMeta()
|
|
17
|
+
*
|
|
18
|
+
* @module identity/key-resolver
|
|
19
|
+
* @version 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { createLogger } from '../utils/logger.js';
|
|
23
|
+
|
|
24
|
+
const log = createLogger('identity:key-resolver');
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Resolution source descriptors, ordered by trust
|
|
28
|
+
*/
|
|
29
|
+
export const KEY_SOURCE = Object.freeze({
|
|
30
|
+
SELF: 'self', // Our own keypair
|
|
31
|
+
REGISTERED: 'registered', // Explicitly registered (handshake, auth, etc.)
|
|
32
|
+
DOKO: 'doko', // Resolved from DOKO cache (NamcheGateway)
|
|
33
|
+
PEER: 'peer', // Connected WS peer identity
|
|
34
|
+
SHERPA: 'sherpa', // SHERPA discovery beacon
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Unified public key resolver
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const resolver = new KeyResolver({ identity: nodeIdentity });
|
|
42
|
+
* resolver.attachNamche(namcheGateway);
|
|
43
|
+
* resolver.attachNetwork(network);
|
|
44
|
+
*
|
|
45
|
+
* const pubkey = resolver.resolve('node-abc-123');
|
|
46
|
+
*/
|
|
47
|
+
export class KeyResolver {
|
|
48
|
+
/**
|
|
49
|
+
* @param {Object} options
|
|
50
|
+
* @param {Object} options.identity - NodeIdentity instance (for self-resolution)
|
|
51
|
+
* @param {number} [options.cacheSize=5000] - Max registered key entries
|
|
52
|
+
*/
|
|
53
|
+
constructor(options = {}) {
|
|
54
|
+
this.identity = options.identity || null;
|
|
55
|
+
this.maxSize = options.cacheSize || 5000;
|
|
56
|
+
|
|
57
|
+
// Registered keys: id → { publicKey, source, registeredAt }
|
|
58
|
+
this.registry = new Map();
|
|
59
|
+
|
|
60
|
+
// External sources (attached lazily as subsystems come online)
|
|
61
|
+
this._namche = null; // NamcheGateway
|
|
62
|
+
this._network = null; // mesh/network.js
|
|
63
|
+
this._sherpa = null; // SHERPA discovery
|
|
64
|
+
|
|
65
|
+
this.stats = {
|
|
66
|
+
resolvedSelf: 0,
|
|
67
|
+
resolvedRegistry: 0,
|
|
68
|
+
resolvedDoko: 0,
|
|
69
|
+
resolvedPeer: 0,
|
|
70
|
+
resolvedSherpa: 0,
|
|
71
|
+
misses: 0,
|
|
72
|
+
registrations: 0,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
77
|
+
// Lazy attachment (subsystems start at different times)
|
|
78
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
79
|
+
|
|
80
|
+
/** Attach NamcheGateway for DOKO-cache resolution */
|
|
81
|
+
attachNamche(namcheGateway) {
|
|
82
|
+
this._namche = namcheGateway;
|
|
83
|
+
log.debug('KeyResolver: NamcheGateway attached');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Attach mesh network for peer resolution */
|
|
87
|
+
attachNetwork(network) {
|
|
88
|
+
this._network = network;
|
|
89
|
+
log.debug('KeyResolver: Network attached');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Attach SHERPA discovery for beacon-based resolution */
|
|
93
|
+
attachSherpa(sherpa) {
|
|
94
|
+
this._sherpa = sherpa;
|
|
95
|
+
log.debug('KeyResolver: SHERPA attached');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
99
|
+
// Registration (feed keys from any source)
|
|
100
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Register a public key from any source
|
|
104
|
+
*
|
|
105
|
+
* @param {string} id - nodeId or dokoId
|
|
106
|
+
* @param {string} publicKey - Hex-encoded public key
|
|
107
|
+
* @param {string} [source='registered'] - Resolution source tag
|
|
108
|
+
*/
|
|
109
|
+
register(id, publicKey, source = KEY_SOURCE.REGISTERED) {
|
|
110
|
+
if (!id || !publicKey) return;
|
|
111
|
+
|
|
112
|
+
// Evict oldest if at capacity
|
|
113
|
+
if (this.registry.size >= this.maxSize && !this.registry.has(id)) {
|
|
114
|
+
const oldestKey = this.registry.keys().next().value;
|
|
115
|
+
this.registry.delete(oldestKey);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
this.registry.set(id, {
|
|
119
|
+
publicKey,
|
|
120
|
+
source,
|
|
121
|
+
registeredAt: Date.now(),
|
|
122
|
+
});
|
|
123
|
+
this.stats.registrations++;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
127
|
+
// Resolution (synchronous cascade)
|
|
128
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Resolve a public key by nodeId or dokoId
|
|
132
|
+
*
|
|
133
|
+
* Returns the hex-encoded public key, or null if not found.
|
|
134
|
+
* Searches all available sources in trust-priority order.
|
|
135
|
+
*
|
|
136
|
+
* @param {string} id - nodeId or dokoId to look up
|
|
137
|
+
* @returns {string|null} Public key (hex) or null
|
|
138
|
+
*/
|
|
139
|
+
resolve(id) {
|
|
140
|
+
if (!id) return null;
|
|
141
|
+
|
|
142
|
+
// 1. Self
|
|
143
|
+
if (this.identity) {
|
|
144
|
+
const selfId = this.identity.identity?.nodeId || this.identity.nodeId;
|
|
145
|
+
const selfDokoId = this.identity.identity?.dokoId || this.identity.dokoId;
|
|
146
|
+
if (id === selfId || id === selfDokoId) {
|
|
147
|
+
this.stats.resolvedSelf++;
|
|
148
|
+
return this.identity.identity?.publicKey || this.identity.publicKey;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// 2. Explicit registry
|
|
153
|
+
const registered = this.registry.get(id);
|
|
154
|
+
if (registered) {
|
|
155
|
+
this.stats.resolvedRegistry++;
|
|
156
|
+
return registered.publicKey;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// 3. NamcheGateway DOKO cache
|
|
160
|
+
if (this._namche) {
|
|
161
|
+
const doko = this._namche.lookupByNodeId(id) || this._namche.lookupByHash(id);
|
|
162
|
+
if (doko?.publicKey) {
|
|
163
|
+
this.stats.resolvedDoko++;
|
|
164
|
+
// Cache for future fast lookup
|
|
165
|
+
this.register(id, doko.publicKey, KEY_SOURCE.DOKO);
|
|
166
|
+
return doko.publicKey;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// 4. Network peer map
|
|
171
|
+
if (this._network) {
|
|
172
|
+
const peers = this._network.peers || this._network._peers;
|
|
173
|
+
if (peers) {
|
|
174
|
+
const peer = peers.get?.(id);
|
|
175
|
+
if (peer?.identity?.publicKey) {
|
|
176
|
+
this.stats.resolvedPeer++;
|
|
177
|
+
this.register(id, peer.identity.publicKey, KEY_SOURCE.PEER);
|
|
178
|
+
return peer.identity.publicKey;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Also check relay peer keys
|
|
182
|
+
const relayKey = this._network._relayPeerKeys?.get?.(id);
|
|
183
|
+
if (relayKey) {
|
|
184
|
+
this.stats.resolvedPeer++;
|
|
185
|
+
this.register(id, relayKey, KEY_SOURCE.PEER);
|
|
186
|
+
return relayKey;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// 5. SHERPA registry
|
|
191
|
+
if (this._sherpa) {
|
|
192
|
+
const beacon = this._sherpa.registry?.get?.(id);
|
|
193
|
+
if (beacon?.publicKey) {
|
|
194
|
+
this.stats.resolvedSherpa++;
|
|
195
|
+
this.register(id, beacon.publicKey, KEY_SOURCE.SHERPA);
|
|
196
|
+
return beacon.publicKey;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
this.stats.misses++;
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Resolve with full metadata (source, registration time, etc.)
|
|
206
|
+
*
|
|
207
|
+
* @param {string} id - nodeId or dokoId
|
|
208
|
+
* @returns {{ publicKey: string, source: string, registeredAt: number }|null}
|
|
209
|
+
*/
|
|
210
|
+
resolveWithMeta(id) {
|
|
211
|
+
if (!id) return null;
|
|
212
|
+
|
|
213
|
+
// Self
|
|
214
|
+
if (this.identity) {
|
|
215
|
+
const selfId = this.identity.identity?.nodeId || this.identity.nodeId;
|
|
216
|
+
const selfDokoId = this.identity.identity?.dokoId || this.identity.dokoId;
|
|
217
|
+
if (id === selfId || id === selfDokoId) {
|
|
218
|
+
return {
|
|
219
|
+
publicKey: this.identity.identity?.publicKey || this.identity.publicKey,
|
|
220
|
+
source: KEY_SOURCE.SELF,
|
|
221
|
+
registeredAt: 0,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Check registry (includes keys cached from DOKO/peer/sherpa lookups)
|
|
227
|
+
const registered = this.registry.get(id);
|
|
228
|
+
if (registered) return registered;
|
|
229
|
+
|
|
230
|
+
// Try live lookup (which also caches the result)
|
|
231
|
+
const key = this.resolve(id);
|
|
232
|
+
if (key) {
|
|
233
|
+
return this.registry.get(id) || { publicKey: key, source: 'unknown', registeredAt: Date.now() };
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Check if a key is known (without returning it)
|
|
241
|
+
* @param {string} id - nodeId or dokoId
|
|
242
|
+
* @returns {boolean}
|
|
243
|
+
*/
|
|
244
|
+
has(id) {
|
|
245
|
+
return this.resolve(id) !== null;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Get resolver statistics
|
|
250
|
+
*/
|
|
251
|
+
getStats() {
|
|
252
|
+
return {
|
|
253
|
+
...this.stats,
|
|
254
|
+
registrySize: this.registry.size,
|
|
255
|
+
hasNamche: this._namche !== null,
|
|
256
|
+
hasNetwork: this._network !== null,
|
|
257
|
+
hasSherpa: this._sherpa !== null,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export default KeyResolver;
|