@highway1/core 0.1.46 → 0.1.48

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/identity/keys.ts","../src/identity/did.ts","../src/identity/signer.ts","../src/utils/logger.ts","../src/transport/node.ts","../src/discovery/agent-card-types.ts","../src/discovery/agent-card.ts","../src/discovery/agent-card-schema.ts","../src/discovery/agent-card-encoder.ts","../src/discovery/search-index.ts","../src/discovery/capability-matcher.ts","../src/discovery/semantic-search.ts","../src/discovery/dht.ts","../src/messaging/envelope.ts","../src/messaging/codec.ts","../src/messaging/router.ts","../src/trust/trust-score.ts","../src/trust/interaction-history.ts","../src/trust/endorsement.ts","../src/trust/sybil-defense.ts","../src/trust/index.ts"],"names":["LogLevel","cborEncode","cborDecode","logger","uint8ArrayToString","uint8ArrayFromString","data","Level"],"mappings":"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","file":"index.js","sourcesContent":["export class ClawiverseError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: unknown\n ) {\n super(message);\n this.name = 'ClawiverseError';\n }\n}\n\nexport class IdentityError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'IDENTITY_ERROR', details);\n this.name = 'IdentityError';\n }\n}\n\nexport class TransportError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'TRANSPORT_ERROR', details);\n this.name = 'TransportError';\n }\n}\n\nexport class DiscoveryError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'DISCOVERY_ERROR', details);\n this.name = 'DiscoveryError';\n }\n}\n\nexport class MessagingError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'MESSAGING_ERROR', details);\n this.name = 'MessagingError';\n }\n}\n","import * as ed25519 from '@noble/ed25519';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface KeyPair {\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n}\n\n/**\n * Generate a new Ed25519 key pair\n */\nexport async function generateKeyPair(): Promise<KeyPair> {\n try {\n const privateKey = ed25519.utils.randomPrivateKey();\n const publicKey = await ed25519.getPublicKeyAsync(privateKey);\n\n return {\n publicKey,\n privateKey,\n };\n } catch (error) {\n throw new IdentityError('Failed to generate key pair', error);\n }\n}\n\n/**\n * Sign a message with a private key\n */\nexport async function sign(\n message: Uint8Array,\n privateKey: Uint8Array\n): Promise<Uint8Array> {\n try {\n return await ed25519.signAsync(message, privateKey);\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signature\n */\nexport async function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array\n): Promise<boolean> {\n try {\n return await ed25519.verifyAsync(signature, message, publicKey);\n } catch (error) {\n throw new IdentityError('Failed to verify signature', error);\n }\n}\n\n/**\n * Export key pair to JSON format\n */\nexport function exportKeyPair(keyPair: KeyPair): {\n publicKey: string;\n privateKey: string;\n} {\n return {\n publicKey: Buffer.from(keyPair.publicKey).toString('hex'),\n privateKey: Buffer.from(keyPair.privateKey).toString('hex'),\n };\n}\n\n/**\n * Import key pair from JSON format\n */\nexport function importKeyPair(exported: {\n publicKey: string;\n privateKey: string;\n}): KeyPair {\n return {\n publicKey: new Uint8Array(Buffer.from(exported.publicKey, 'hex')),\n privateKey: new Uint8Array(Buffer.from(exported.privateKey, 'hex')),\n };\n}\n","import { base58btc } from 'multiformats/bases/base58';\nimport { IdentityError } from '../utils/errors.js';\n\n/**\n * Derive a did:clawiverse DID from a public key\n * Format: did:clawiverse:<base58btc-encoded-pubkey>\n */\nexport function deriveDID(publicKey: Uint8Array): string {\n try {\n const encoded = base58btc.encode(publicKey);\n return `did:clawiverse:${encoded}`;\n } catch (error) {\n throw new IdentityError('Failed to derive DID', error);\n }\n}\n\n/**\n * Extract public key from a did:clawiverse DID\n */\nexport function extractPublicKey(did: string): Uint8Array {\n if (!did.startsWith('did:clawiverse:')) {\n throw new IdentityError('Invalid DID format: must start with did:clawiverse:');\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n return base58btc.decode(encoded);\n } catch (error) {\n throw new IdentityError('Failed to extract public key from DID', error);\n }\n}\n\n/**\n * Validate a did:clawiverse DID format\n */\nexport function validateDID(did: string): boolean {\n if (!did.startsWith('did:clawiverse:')) {\n return false;\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n base58btc.decode(encoded);\n return true;\n } catch {\n return false;\n }\n}\n","import { sign, verify } from './keys.js';\nimport { deriveDID } from './did.js';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface SignedMessage {\n payload: Uint8Array;\n signature: Uint8Array;\n signer: string; // DID\n}\n\n/**\n * Sign a message and return a signed message object\n */\nexport async function signMessage(\n payload: Uint8Array,\n privateKey: Uint8Array,\n publicKey: Uint8Array\n): Promise<SignedMessage> {\n try {\n const signature = await sign(payload, privateKey);\n const signer = deriveDID(publicKey);\n\n return {\n payload,\n signature,\n signer,\n };\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signed message\n */\nexport async function verifyMessage(\n signedMessage: SignedMessage,\n expectedPublicKey: Uint8Array\n): Promise<boolean> {\n try {\n const expectedDID = deriveDID(expectedPublicKey);\n\n if (signedMessage.signer !== expectedDID) {\n return false;\n }\n\n return await verify(\n signedMessage.signature,\n signedMessage.payload,\n expectedPublicKey\n );\n } catch (error) {\n throw new IdentityError('Failed to verify message', error);\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport class Logger {\n private level: LogLevel;\n private prefix: string;\n\n constructor(prefix: string, level: LogLevel = LogLevel.INFO) {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG:`, message, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.info(`[${this.prefix}] INFO:`, message, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN:`, message, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR:`, message, ...args);\n }\n }\n}\n\nexport const createLogger = (prefix: string, level?: LogLevel): Logger => {\n return new Logger(prefix, level);\n};\n","import { createLibp2p, Libp2p } from 'libp2p';\nimport { tcp } from '@libp2p/tcp';\nimport { noise } from '@chainsafe/libp2p-noise';\nimport { mplex } from '@libp2p/mplex';\nimport { kadDHT, passthroughMapper } from '@libp2p/kad-dht';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { identify } from '@libp2p/identify';\nimport { ping } from '@libp2p/ping';\nimport {\n circuitRelayTransport,\n circuitRelayServer,\n} from '@libp2p/circuit-relay-v2';\nimport { createLogger } from '../utils/logger.js';\nimport { TransportError } from '../utils/errors.js';\nimport type { KeyPair } from '../identity/keys.js';\nimport type { PrivateKey } from '@libp2p/interface';\n\nconst logger = createLogger('transport');\n\nexport interface TransportConfig {\n keyPair?: KeyPair;\n listenAddresses?: string[];\n bootstrapPeers?: string[];\n enableDHT?: boolean;\n /** Run as a relay server so NAT'd agents can receive messages through this node */\n enableRelay?: boolean;\n /** Reserve a relay slot on bootstrap nodes so others can reach us (only needed for hw1 join) */\n reserveRelaySlot?: boolean;\n /** Enable mDNS local peer discovery (default: false) */\n enableMDNS?: boolean;\n /** libp2p PrivateKey for persistent PeerID (from @libp2p/crypto) */\n privateKey?: PrivateKey;\n}\n\nexport interface ClawiverseNode {\n libp2p: Libp2p;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n getMultiaddrs: () => string[];\n getPeerId: () => string;\n}\n\n/**\n * Create a Clawiverse transport node with libp2p\n */\nexport async function createNode(\n config: TransportConfig\n): Promise<ClawiverseNode> {\n try {\n const {\n listenAddresses = ['/ip4/0.0.0.0/tcp/0'],\n bootstrapPeers = [],\n enableDHT = true,\n enableRelay = false,\n reserveRelaySlot = false,\n enableMDNS = false,\n privateKey,\n } = config;\n\n // Reserve relay slots by adding p2p-circuit listen addresses (for hw1 join)\n const relayListenAddrs = reserveRelaySlot\n ? bootstrapPeers.map((peer) => `${peer}/p2p-circuit`)\n : [];\n\n const libp2pConfig: any = {\n addresses: {\n listen: [...listenAddresses, ...relayListenAddrs],\n },\n ...(privateKey ? { privateKey } : {}),\n transports: [\n tcp(),\n circuitRelayTransport(),\n ],\n connectionEncrypters: [noise()],\n streamMuxers: [mplex()],\n connectionManager: {\n minConnections: bootstrapPeers.length > 0 ? 1 : 0,\n maxConnections: 50,\n },\n services: {\n identify: identify(),\n ping: ping(),\n },\n };\n\n if (enableRelay) {\n libp2pConfig.services.relay = circuitRelayServer({\n reservations: {\n maxReservations: 100, // Allow up to 100 concurrent relay reservations\n },\n });\n }\n\n if (enableDHT) {\n libp2pConfig.services.dht = kadDHT({\n clientMode: false,\n peerInfoMapper: passthroughMapper,\n validators: {\n clawiverse: async () => {},\n },\n selectors: {\n clawiverse: () => 0,\n },\n // Optimize for small networks: reduce replication factor and query timeout\n kBucketSize: 20, // Default K=20, keep for compatibility\n querySelfInterval: 30000, // Self-query every 30 seconds (libp2p default)\n // Allow queries to complete faster in small networks\n allowQueryWithZeroPeers: true,\n });\n }\n\n const peerDiscovery: any[] = [];\n if (bootstrapPeers.length > 0) peerDiscovery.push(bootstrap({ list: bootstrapPeers }));\n if (enableMDNS) {\n const { mdns } = await import('@libp2p/mdns');\n peerDiscovery.push(mdns());\n }\n if (peerDiscovery.length > 0) libp2pConfig.peerDiscovery = peerDiscovery;\n\n const libp2p = await createLibp2p(libp2pConfig);\n\n logger.info('Libp2p node created', {\n listenAddresses: libp2pConfig.addresses.listen,\n reserveRelaySlot,\n });\n\n return {\n libp2p,\n start: async () => {\n await libp2p.start();\n logger.info('Node started', {\n peerId: libp2p.peerId.toString(),\n addresses: libp2p.getMultiaddrs().map((ma) => ma.toString()),\n relay: enableRelay,\n reserveRelaySlot,\n });\n },\n stop: async () => {\n await libp2p.stop();\n logger.info('Node stopped');\n },\n getMultiaddrs: () => {\n return libp2p.getMultiaddrs().map((ma) => ma.toString());\n },\n getPeerId: () => {\n return libp2p.peerId.toString();\n },\n };\n } catch (error) {\n throw new TransportError('Failed to create transport node', error);\n }\n}\n","/**\n * Enhanced Agent Card Types for Phase 2\n *\n * Adds structured capabilities, JSON-LD support, and trust metrics\n */\n\nimport type { TrustScore } from '../trust/trust-score.js';\n\n/**\n * Capability Parameter Definition\n */\nexport interface CapabilityParameter {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n required: boolean;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\n/**\n * Structured Capability Definition\n */\nexport interface Capability {\n '@type'?: string; // JSON-LD type (e.g., \"TranslationService\")\n id: string; // Unique capability ID\n name: string; // Human-readable name\n description: string;\n parameters?: CapabilityParameter[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Enhanced Agent Card with JSON-LD support\n */\nexport interface AgentCard {\n '@context'?: string[]; // JSON-LD context\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: Capability[]; // Changed from string[] to Capability[]\n endpoints: string[];\n peerId?: string;\n trust?: TrustScore; // Trust metrics\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Legacy Agent Card (Phase 1 compatibility)\n */\nexport interface LegacyAgentCard {\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: string[]; // Flat string array\n endpoints: string[];\n peerId?: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Check if card is legacy format\n */\nexport function isLegacyCard(card: AgentCard | LegacyAgentCard): card is LegacyAgentCard {\n return Array.isArray(card.capabilities) &&\n card.capabilities.length > 0 &&\n typeof card.capabilities[0] === 'string';\n}\n\n/**\n * Convert legacy card to new format\n */\nexport function upgradeLegacyCard(legacy: LegacyAgentCard): AgentCard {\n return {\n ...legacy,\n capabilities: legacy.capabilities.map(cap => ({\n id: cap,\n name: cap,\n description: `Capability: ${cap}`,\n })),\n };\n}\n\n/**\n * Convert new card to legacy format (for backward compatibility)\n */\nexport function downgradeToLegacyCard(card: AgentCard): LegacyAgentCard {\n const { '@context': _, trust: __, ...rest } = card;\n return {\n ...rest,\n capabilities: card.capabilities.map(cap => cap.id),\n };\n}\n","import Ajv, { JSONSchemaType } from 'ajv';\nimport { DiscoveryError } from '../utils/errors.js';\n\n// Re-export Phase 2 types\nexport type { AgentCard, Capability, CapabilityParameter, LegacyAgentCard } from './agent-card-types.js';\nexport { isLegacyCard, upgradeLegacyCard, downgradeToLegacyCard } from './agent-card-types.js';\n\n// Import for internal use\nimport type { AgentCard, Capability, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard } from './agent-card-types.js';\n\n// Legacy schema for backward compatibility\nconst legacyAgentCardSchema: JSONSchemaType<Omit<LegacyAgentCard, 'signature'>> = {\n type: 'object',\n properties: {\n did: { type: 'string', pattern: '^did:clawiverse:[1-9A-HJ-NP-Za-km-z]+$' },\n name: { type: 'string', minLength: 1, maxLength: 100 },\n description: { type: 'string', maxLength: 500 },\n version: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$' },\n capabilities: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 50,\n },\n endpoints: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 10,\n },\n peerId: { type: 'string', nullable: true },\n metadata: {\n type: 'object',\n nullable: true,\n required: [],\n },\n timestamp: { type: 'number' },\n },\n required: ['did', 'name', 'description', 'version', 'capabilities', 'endpoints', 'timestamp'],\n additionalProperties: false,\n};\n\nconst ajv = new Ajv();\nconst validateLegacySchema = ajv.compile(legacyAgentCardSchema);\n\n/**\n * Create a new Agent Card (Phase 2 format with structured capabilities)\n */\nexport function createAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: Capability[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<AgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create a legacy Agent Card (Phase 1 format with string capabilities)\n * For backward compatibility\n */\nexport function createLegacyAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: string[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<LegacyAgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Validate an Agent Card structure (supports both Phase 1 and Phase 2 formats)\n */\nexport function validateAgentCard(card: unknown): card is AgentCard | LegacyAgentCard {\n if (typeof card !== 'object' || card === null) {\n return false;\n }\n\n const c = card as Partial<AgentCard | LegacyAgentCard>;\n\n // Check signature exists\n if (typeof c.signature !== 'string') {\n return false;\n }\n\n // Check if it's legacy format\n if (isLegacyCard(c as any)) {\n return validateLegacySchema(c);\n }\n\n // Phase 2 format - basic validation\n // (Full JSON-LD validation would be more complex)\n return (\n typeof c.did === 'string' &&\n typeof c.name === 'string' &&\n typeof c.description === 'string' &&\n typeof c.version === 'string' &&\n Array.isArray(c.capabilities) &&\n Array.isArray(c.endpoints) &&\n typeof c.timestamp === 'number'\n );\n}\n\n/**\n * Sign an Agent Card\n */\nexport async function signAgentCard(\n card: Omit<AgentCard, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<AgentCard> {\n try {\n const cardJson = JSON.stringify(card);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signature = await signFn(cardBytes);\n\n return {\n ...card,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new DiscoveryError('Failed to sign Agent Card', error);\n }\n}\n\n/**\n * Verify an Agent Card signature\n */\nexport async function verifyAgentCard(\n card: AgentCard,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...cardWithoutSig } = card;\n const cardJson = JSON.stringify(cardWithoutSig);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, cardBytes);\n } catch (error) {\n throw new DiscoveryError('Failed to verify Agent Card', error);\n }\n}\n\n/**\n * Check if an Agent Card matches a capability query\n * Supports both Phase 1 (string[]) and Phase 2 (Capability[]) formats\n */\nexport function matchesCapability(\n card: AgentCard | LegacyAgentCard,\n capability: string\n): boolean {\n if (isLegacyCard(card)) {\n return card.capabilities.some((cap) =>\n cap.toLowerCase().includes(capability.toLowerCase())\n );\n }\n\n return card.capabilities.some((cap) =>\n cap.id.toLowerCase().includes(capability.toLowerCase()) ||\n cap.name.toLowerCase().includes(capability.toLowerCase()) ||\n cap.description.toLowerCase().includes(capability.toLowerCase())\n );\n}\n","/**\n * JSON-LD Schema Definitions for Agent Cards\n *\n * Defines the Clawiverse vocabulary and integrates with Schema.org\n * for semantic interoperability.\n */\n\nexport const CLAWIVERSE_CONTEXT = 'https://clawiverse.org/context/v1';\nexport const SCHEMA_ORG_CONTEXT = 'https://schema.org';\n\n/**\n * Clawiverse JSON-LD Context\n * Defines the vocabulary for Agent Cards and Capabilities\n */\nexport const clawiverseContext = {\n '@context': {\n '@vocab': CLAWIVERSE_CONTEXT,\n 'schema': SCHEMA_ORG_CONTEXT,\n 'AgentCard': 'schema:SoftwareApplication',\n 'Capability': 'schema:Action',\n 'did': '@id',\n 'name': 'schema:name',\n 'description': 'schema:description',\n 'version': 'schema:softwareVersion',\n 'capabilities': {\n '@id': 'schema:potentialAction',\n '@type': '@id',\n '@container': '@list'\n },\n 'endpoints': {\n '@id': 'schema:url',\n '@container': '@list'\n },\n 'peerId': 'clawiverse:peerId',\n 'trust': 'clawiverse:trustScore',\n 'metadata': 'schema:additionalProperty',\n 'timestamp': 'schema:dateModified',\n 'signature': 'clawiverse:signature',\n 'parameters': {\n '@id': 'schema:object',\n '@container': '@list'\n }\n }\n};\n\n/**\n * Capability Type Definitions\n * Common capability types with semantic meaning\n */\nexport const CapabilityTypes = {\n TRANSLATION: 'TranslationService',\n CODE_REVIEW: 'CodeReviewService',\n DATA_ANALYSIS: 'DataAnalysisService',\n TEXT_GENERATION: 'TextGenerationService',\n IMAGE_GENERATION: 'ImageGenerationService',\n SEARCH: 'SearchService',\n COMPUTATION: 'ComputationService',\n STORAGE: 'StorageService',\n MESSAGING: 'MessagingService',\n AUTHENTICATION: 'AuthenticationService',\n} as const;\n\n/**\n * Parameter Type Definitions\n */\nexport const ParameterTypes = {\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n OBJECT: 'object',\n ARRAY: 'array',\n} as const;\n\n/**\n * Get JSON-LD context for Agent Card\n */\nexport function getAgentCardContext(): string[] {\n return [SCHEMA_ORG_CONTEXT, CLAWIVERSE_CONTEXT];\n}\n\n/**\n * Validate JSON-LD context\n */\nexport function isValidContext(context: unknown): boolean {\n if (!Array.isArray(context)) return false;\n return context.every(c => typeof c === 'string');\n}\n","/**\n * Agent Card Encoder - Dual Encoding Support\n *\n * Provides bidirectional conversion between:\n * - CBOR (compact binary) for DHT storage\n * - JSON-LD (semantic) for Web publishing\n */\n\nimport { encode as cborEncode, decode as cborDecode } from 'cbor-x';\nimport type { AgentCard, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard, upgradeLegacyCard } from './agent-card-types.js';\nimport { getAgentCardContext } from './agent-card-schema.js';\nimport { DiscoveryError } from '../utils/errors.js';\n\n/**\n * Encode Agent Card as CBOR for DHT storage\n */\nexport function encodeForDHT(card: AgentCard): Uint8Array {\n try {\n // Remove JSON-LD context for compact storage\n const { '@context': _, ...cardWithoutContext } = card;\n return cborEncode(cardWithoutContext);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as CBOR', error);\n }\n}\n\n/**\n * Encode Agent Card as JSON-LD for Web publishing\n */\nexport function encodeForWeb(card: AgentCard): string {\n try {\n // Ensure JSON-LD context is present\n const cardWithContext: AgentCard = {\n '@context': card['@context'] || getAgentCardContext(),\n ...card,\n };\n return JSON.stringify(cardWithContext, null, 2);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as JSON-LD', error);\n }\n}\n\n/**\n * Decode Agent Card from CBOR\n */\nexport function decodeFromCBOR(data: Uint8Array): AgentCard {\n try {\n const decoded = cborDecode(data) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from CBOR', error);\n }\n}\n\n/**\n * Decode Agent Card from JSON-LD\n */\nexport function decodeFromJSON(json: string): AgentCard {\n try {\n const decoded = JSON.parse(json) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from JSON', error);\n }\n}\n\n/**\n * Auto-detect format and decode\n */\nexport function decodeAgentCard(data: Uint8Array | string): AgentCard {\n if (typeof data === 'string') {\n return decodeFromJSON(data);\n }\n\n // Try CBOR first, fallback to JSON if it looks like text\n try {\n return decodeFromCBOR(data);\n } catch {\n // Check if it's actually JSON text\n const text = new TextDecoder().decode(data);\n if (text.trim().startsWith('{')) {\n return decodeFromJSON(text);\n }\n throw new DiscoveryError('Unable to decode Agent Card: unknown format');\n }\n}\n\n/**\n * Calculate encoded size for comparison\n */\nexport function getEncodedSize(card: AgentCard): { cbor: number; json: number } {\n return {\n cbor: encodeForDHT(card).length,\n json: encodeForWeb(card).length,\n };\n}\n","/**\n * Search Index for Agent Discovery\n *\n * Maintains a local index of discovered agents for fast semantic search\n */\n\nimport lunr from 'lunr';\nimport Fuse from 'fuse.js';\nimport type { AgentCard } from './agent-card-types.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('search-index');\n\n/**\n * Semantic Query Interface\n */\nexport interface SemanticQuery {\n text?: string; // Natural language: \"translate Japanese\"\n capability?: string; // Structured: \"translate\"\n filters?: {\n language?: string;\n minTrustScore?: number;\n maxCost?: number;\n tags?: string[];\n };\n limit?: number;\n}\n\n/**\n * Search Result with Score\n */\nexport interface SearchResult {\n card: AgentCard;\n score: number;\n}\n\n/**\n * Search Index Implementation\n */\nexport class SearchIndex {\n private cards = new Map<string, AgentCard>();\n private lunrIndex?: lunr.Index;\n private fuse?: Fuse<AgentCard>;\n private needsRebuild = false;\n\n /**\n * Add or update an Agent Card in the index\n */\n indexAgentCard(card: AgentCard): void {\n this.cards.set(card.did, card);\n this.needsRebuild = true;\n logger.debug('Indexed Agent Card', { did: card.did, capabilities: card.capabilities.length });\n }\n\n /**\n * Remove an Agent Card from the index\n */\n removeAgentCard(did: string): void {\n this.cards.delete(did);\n this.needsRebuild = true;\n logger.debug('Removed Agent Card from index', { did });\n }\n\n /**\n * Search for agents matching a query\n */\n search(query: SemanticQuery): SearchResult[] {\n if (this.needsRebuild) {\n this.rebuild();\n }\n\n let results: SearchResult[] = [];\n\n // Text search using Lunr\n if (query.text && this.lunrIndex) {\n results = this.searchByText(query.text);\n }\n // Capability search using Fuse\n else if (query.capability && this.fuse) {\n results = this.searchByCapability(query.capability);\n }\n // No query - return all\n else {\n results = Array.from(this.cards.values()).map(card => ({\n card,\n score: 1.0,\n }));\n }\n\n // Apply filters\n if (query.filters) {\n results = this.applyFilters(results, query.filters);\n }\n\n // Sort by score (descending)\n results.sort((a, b) => b.score - a.score);\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n logger.debug('Search completed', { query, results: results.length });\n return results;\n }\n\n /**\n * Get all indexed cards\n */\n getAllCards(): AgentCard[] {\n return Array.from(this.cards.values());\n }\n\n /**\n * Clear the index\n */\n clear(): void {\n this.cards.clear();\n this.lunrIndex = undefined;\n this.fuse = undefined;\n this.needsRebuild = false;\n logger.info('Search index cleared');\n }\n\n /**\n * Get index size\n */\n size(): number {\n return this.cards.size;\n }\n\n /**\n * Rebuild search indexes\n */\n private rebuild(): void {\n logger.info('Rebuilding search indexes', { cards: this.cards.size });\n\n const cards = Array.from(this.cards.values());\n\n // Build Lunr index for full-text search\n this.lunrIndex = lunr(function (this: lunr.Builder) {\n this.ref('did');\n this.field('name', { boost: 10 });\n this.field('description', { boost: 5 });\n this.field('capabilities');\n\n for (const card of cards) {\n this.add({\n did: card.did,\n name: card.name,\n description: card.description,\n capabilities: card.capabilities\n .map((cap: any) => `${cap.name} ${cap.description}`)\n .join(' '),\n });\n }\n });\n\n // Build Fuse index for fuzzy matching\n this.fuse = new Fuse(Array.from(this.cards.values()), {\n keys: [\n { name: 'name', weight: 0.3 },\n { name: 'description', weight: 0.2 },\n { name: 'capabilities.name', weight: 0.3 },\n { name: 'capabilities.description', weight: 0.2 },\n ],\n threshold: 0.4,\n includeScore: true,\n });\n\n this.needsRebuild = false;\n logger.info('Search indexes rebuilt');\n }\n\n /**\n * Search by text using Lunr\n */\n private searchByText(text: string): SearchResult[] {\n if (!this.lunrIndex) return [];\n\n const lunrResults = this.lunrIndex.search(text);\n return lunrResults.map(result => ({\n card: this.cards.get(result.ref)!,\n score: result.score,\n }));\n }\n\n /**\n * Search by capability using Fuse\n */\n private searchByCapability(capability: string): SearchResult[] {\n if (!this.fuse) return [];\n\n const fuseResults = this.fuse.search(capability);\n return fuseResults.map(result => ({\n card: result.item,\n score: 1 - (result.score || 0), // Fuse score is distance, convert to similarity\n }));\n }\n\n /**\n * Apply filters to search results\n */\n private applyFilters(\n results: SearchResult[],\n filters: NonNullable<SemanticQuery['filters']>\n ): SearchResult[] {\n return results.filter(result => {\n const { card } = result;\n\n // Trust score filter\n if (filters.minTrustScore !== undefined && card.trust) {\n const overallTrust =\n card.trust.interactionScore * 0.4 +\n Math.min(card.trust.endorsements / 10, 1) * 0.2 +\n card.trust.completionRate * 0.2 +\n card.trust.uptime * 0.2;\n\n if (overallTrust < filters.minTrustScore) {\n return false;\n }\n }\n\n // Language filter (check capability metadata)\n if (filters.language) {\n const hasLanguage = card.capabilities.some(\n cap => {\n const metadata = cap.metadata as Record<string, any> | undefined;\n if (!metadata) return false;\n return metadata.language === filters.language ||\n (Array.isArray(metadata.languages) && metadata.languages.includes(filters.language));\n }\n );\n if (!hasLanguage) return false;\n }\n\n // Tags filter\n if (filters.tags && filters.tags.length > 0) {\n const cardTags = Array.isArray(card.metadata?.tags) ? (card.metadata.tags as string[]) : [];\n const hasAllTags = filters.tags.every(tag => cardTags.includes(tag));\n if (!hasAllTags) return false;\n }\n\n return true;\n });\n }\n}\n","/**\n * Capability Matcher\n *\n * Matches semantic queries against agent capabilities\n */\n\nimport type { Capability } from './agent-card-types.js';\nimport type { SemanticQuery } from './search-index.js';\n\n/**\n * Capability Matcher\n */\nexport class CapabilityMatcher {\n /**\n * Match a query against a capability\n * Returns a score between 0 and 1\n */\n match(query: SemanticQuery, capability: Capability): number {\n let score = 0;\n let weights = 0;\n\n // Exact capability ID match\n if (query.capability && capability.id === query.capability) {\n return 1.0;\n }\n\n // Fuzzy capability name match\n if (query.capability) {\n const nameScore = this.fuzzyMatch(query.capability, capability.name);\n score += nameScore * 0.4;\n weights += 0.4;\n }\n\n // Text keyword match\n if (query.text) {\n const keywords = this.extractKeywords(query.text);\n const keywordScore = this.matchKeywords(keywords, capability);\n score += keywordScore * 0.4;\n weights += 0.4;\n }\n\n // Type hierarchy match\n if (query.capability && capability['@type']) {\n const typeScore = this.matchesType(query.capability, capability['@type']) ? 0.6 : 0;\n score += typeScore * 0.2;\n weights += 0.2;\n }\n\n return weights > 0 ? score / weights : 0;\n }\n\n /**\n * Extract keywords from natural language text\n */\n extractKeywords(text: string): string[] {\n // Remove common stop words\n const stopWords = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been',\n 'to', 'from', 'in', 'on', 'at', 'by', 'for', 'with', 'about',\n 'can', 'could', 'should', 'would', 'will', 'do', 'does', 'did',\n 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her',\n ]);\n\n return text\n .toLowerCase()\n .split(/\\W+/)\n .filter(word => word.length > 2 && !stopWords.has(word));\n }\n\n /**\n * Match keywords against capability\n */\n matchKeywords(keywords: string[], capability: Capability): number {\n if (keywords.length === 0) return 0;\n\n const capText = `${capability.name} ${capability.description}`.toLowerCase();\n const matches = keywords.filter(keyword => capText.includes(keyword));\n\n return matches.length / keywords.length;\n }\n\n /**\n * Check if query matches capability type hierarchy\n */\n matchesType(query: string, type: string): boolean {\n const queryLower = query.toLowerCase();\n const typeLower = type.toLowerCase();\n\n // Direct match\n if (typeLower.includes(queryLower)) return true;\n\n // Common type mappings\n const typeMap: Record<string, string[]> = {\n translate: ['translation', 'translationservice'],\n review: ['codereview', 'reviewservice'],\n analyze: ['analysis', 'dataanalysis'],\n generate: ['generation', 'textgeneration', 'imagegeneration'],\n search: ['searchservice', 'query'],\n compute: ['computation', 'computationservice'],\n store: ['storage', 'storageservice'],\n message: ['messaging', 'messagingservice'],\n auth: ['authentication', 'authenticationservice'],\n };\n\n for (const [key, values] of Object.entries(typeMap)) {\n if (queryLower.includes(key) && values.some(v => typeLower.includes(v))) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Fuzzy string matching using Levenshtein distance\n */\n private fuzzyMatch(query: string, target: string): number {\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n // Exact match\n if (queryLower === targetLower) return 1.0;\n\n // Substring match\n if (targetLower.includes(queryLower)) return 0.8;\n if (queryLower.includes(targetLower)) return 0.7;\n\n // Levenshtein distance\n const distance = this.levenshteinDistance(queryLower, targetLower);\n const maxLen = Math.max(queryLower.length, targetLower.length);\n const similarity = 1 - distance / maxLen;\n\n // Only return positive scores for reasonable similarity\n return similarity > 0.5 ? similarity * 0.6 : 0;\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n }\n}\n","/**\n * Semantic Search Engine\n *\n * Provides intelligent agent discovery through semantic search\n * with local-first strategy and network fallback\n */\n\nimport type { AgentCard } from './agent-card-types.js';\nimport { SearchIndex } from './search-index.js';\nimport type { SemanticQuery, SearchResult } from './search-index.js';\nimport { CapabilityMatcher } from './capability-matcher.js';\nimport type { DHTOperations } from './dht.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('semantic-search');\n\n/**\n * Semantic Search Engine\n */\nexport class SemanticSearchEngine {\n private index: SearchIndex;\n private matcher: CapabilityMatcher;\n\n constructor(private dht?: DHTOperations) {\n this.index = new SearchIndex();\n this.matcher = new CapabilityMatcher();\n }\n\n /**\n * Main search interface\n * Local-first with network fallback\n */\n async search(query: SemanticQuery): Promise<AgentCard[]> {\n logger.info('Searching for agents', { query });\n\n // 1. Search local index\n const localResults = this.index.search(query);\n logger.debug('Local search results', { count: localResults.length });\n\n // 2. If insufficient results, query network\n const limit = query.limit || 10;\n if (localResults.length < limit && this.dht) {\n logger.debug('Insufficient local results, querying network');\n const networkResults = await this.searchNetwork(query);\n return this.mergeResults(localResults, networkResults, limit);\n }\n\n return localResults.map(r => r.card);\n }\n\n /**\n * Index an Agent Card for local search\n */\n indexAgentCard(card: AgentCard): void {\n this.index.indexAgentCard(card);\n }\n\n /**\n * Remove an Agent Card from local index\n */\n removeAgentCard(did: string): void {\n this.index.removeAgentCard(did);\n }\n\n /**\n * Get all indexed cards\n */\n getAllIndexedCards(): AgentCard[] {\n return this.index.getAllCards();\n }\n\n /**\n * Clear local index\n */\n clearIndex(): void {\n this.index.clear();\n }\n\n /**\n * Get index size\n */\n getIndexSize(): number {\n return this.index.size();\n }\n\n /**\n * Search network via DHT\n */\n private async searchNetwork(query: SemanticQuery): Promise<SearchResult[]> {\n if (!this.dht) {\n return [];\n }\n\n try {\n // For now, use capability-based DHT query\n // In future, implement distributed semantic search overlay\n const capability = query.capability || this.extractPrimaryCapability(query.text);\n\n if (!capability) {\n logger.debug('No capability extracted from query, skipping network search');\n return [];\n }\n\n const cards = await this.dht.queryByCapability(capability);\n logger.debug('Network search results', { count: cards.length });\n\n // Score network results\n return cards.map(card => {\n const score = this.scoreCard(card, query);\n return { card, score };\n });\n } catch (error) {\n logger.error('Network search failed', { error });\n return [];\n }\n }\n\n /**\n * Merge local and network results, removing duplicates\n */\n private mergeResults(\n local: SearchResult[],\n network: SearchResult[],\n limit: number\n ): AgentCard[] {\n const seen = new Set<string>();\n const merged: SearchResult[] = [];\n\n // Add local results first (they're already scored and sorted)\n for (const result of local) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n }\n }\n\n // Add network results\n for (const result of network) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n\n // Also index for future searches\n this.index.indexAgentCard(result.card);\n }\n }\n\n // Sort by score and apply limit\n merged.sort((a, b) => b.score - a.score);\n return merged.slice(0, limit).map(r => r.card);\n }\n\n /**\n * Score a card against a query\n */\n private scoreCard(card: AgentCard, query: SemanticQuery): number {\n let totalScore = 0;\n let count = 0;\n\n for (const capability of card.capabilities) {\n const score = this.matcher.match(query, capability);\n if (score > 0) {\n totalScore += score;\n count++;\n }\n }\n\n // Average score across matching capabilities\n const avgScore = count > 0 ? totalScore / count : 0;\n\n // Boost by trust score if available\n if (card.trust) {\n const trustBoost = card.trust.interactionScore * 0.2;\n return Math.min(avgScore + trustBoost, 1.0);\n }\n\n return avgScore;\n }\n\n /**\n * Extract primary capability from natural language text\n */\n private extractPrimaryCapability(text?: string): string | undefined {\n if (!text) return undefined;\n\n const keywords = this.matcher.extractKeywords(text);\n\n // Common capability keywords\n const capabilityKeywords = [\n 'translate', 'translation',\n 'review', 'code',\n 'analyze', 'analysis',\n 'generate', 'generation',\n 'search', 'query',\n 'compute', 'calculation',\n 'store', 'storage',\n 'message', 'messaging',\n 'auth', 'authentication',\n ];\n\n // Find first matching keyword\n for (const keyword of keywords) {\n if (capabilityKeywords.includes(keyword)) {\n return keyword;\n }\n }\n\n // Return first keyword as fallback\n return keywords[0];\n }\n}\n\n/**\n * Create a semantic search engine\n */\nexport function createSemanticSearch(dht?: DHTOperations): SemanticSearchEngine {\n return new SemanticSearchEngine(dht);\n}\n","import type { Libp2p } from 'libp2p';\nimport type { AgentCard } from './agent-card.js';\nimport { createLogger } from '../utils/logger.js';\nimport { DiscoveryError } from '../utils/errors.js';\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string';\nimport { encodeForDHT, decodeFromCBOR } from './agent-card-encoder.js';\nimport { createSemanticSearch } from './semantic-search.js';\nimport type { SemanticQuery } from './search-index.js';\n\nconst logger = createLogger('dht');\n\nexport interface ResolvedDID {\n peerId: string;\n multiaddrs: string[];\n}\n\ninterface CachedPeerInfo {\n peerId: string;\n multiaddrs: string[];\n timestamp: number;\n}\n\nconst peerCache = new Map<string, CachedPeerInfo>();\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\nexport interface DHTOperations {\n publishAgentCard: (card: AgentCard) => Promise<void>;\n queryAgentCard: (did: string) => Promise<AgentCard | null>;\n queryByCapability: (capability: string) => Promise<AgentCard[]>;\n searchSemantic: (query: SemanticQuery) => Promise<AgentCard[]>;\n resolveDID: (did: string) => Promise<ResolvedDID | null>;\n queryRelayPeers: () => Promise<string[]>;\n}\n\n/** Extract a DHT value from a get() event, handling both VALUE and PEER_RESPONSE */\nfunction extractValue(event: any): Uint8Array | null {\n if (event.name === 'VALUE' && event.value) return event.value;\n if (event.name === 'PEER_RESPONSE' && event.value) return event.value;\n return null;\n}\n\n/** Normalize capability name for use as a DHT key segment */\nfunction capKey(cap: string): string {\n return cap.toLowerCase().replace(/[^a-z0-9_-]/g, '_');\n}\n\n/** Read a DID list stored at a DHT key (newline-separated) */\nasync function readDIDList(dht: any, key: Uint8Array): Promise<string[]> {\n try {\n for await (const event of dht.get(key, { signal: AbortSignal.timeout(30000) })) {\n const raw = extractValue(event);\n if (raw) {\n const text = uint8ArrayToString(raw);\n return text.split('\\n').filter(Boolean);\n }\n }\n } catch {\n // key not found or timeout\n }\n return [];\n}\n\n/** Write a DID list to a DHT key (newline-separated), deduplicating */\nasync function writeDIDList(dht: any, key: Uint8Array, dids: string[]): Promise<void> {\n const value = uint8ArrayFromString([...new Set(dids)].join('\\n'));\n // Retry up to 3 times with 30s timeout each\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n for await (const _ of dht.put(key, value, { signal: AbortSignal.timeout(30000) })) { /* consume */ }\n return; // Success\n } catch (e: any) {\n if (e?.name === 'AbortError' && attempt < 3) {\n logger.debug(`DHT put timeout, retrying (${attempt}/3)...`);\n continue;\n }\n if (e?.name !== 'AbortError') throw e;\n }\n }\n}\n\n/**\n * Create DHT operations for a libp2p node\n */\nexport function createDHTOperations(libp2p: Libp2p): DHTOperations {\n const operations: DHTOperations = {} as DHTOperations;\n const searchEngine = createSemanticSearch(operations);\n\n return Object.assign(operations, {\n publishAgentCard: async (card: AgentCard) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n // 1. Store Agent Card under /clawiverse/agent/<did>\n const agentKey = uint8ArrayFromString(`/clawiverse/agent/${card.did}`);\n // Retry up to 3 times with 30s timeout each\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n for await (const _ of dht.put(agentKey, encodeForDHT(card), { signal: AbortSignal.timeout(30000) })) { /* consume */ }\n break; // Success\n } catch (e: any) {\n if (e?.name === 'AbortError' && attempt < 3) {\n logger.debug(`DHT put agent card timeout, retrying (${attempt}/3)...`);\n continue;\n }\n logger.warn('DHT put agent card failed (non-fatal)', { error: (e as Error).message });\n break;\n }\n }\n\n // 2. For each capability, append this DID to /clawiverse/cap/<capability>\n // Skip capability indexing in slow networks - rely on local index and semantic search instead\n const caps: string[] = (card.capabilities ?? []).flatMap((c: any) => {\n if (typeof c === 'string') return [c];\n return [c.name, c.id].filter((v): v is string => typeof v === 'string' && v.length > 0);\n });\n\n // Always index under the special \"all\" key so name/description search works\n caps.push('__all__');\n\n // Keep indexing lightweight, but preserve relay discovery path.\n const importantCaps = ['__all__'];\n if (caps.some((cap) => capKey(cap) === 'relay')) {\n importantCaps.push('relay');\n }\n await Promise.all(importantCaps.map(async (cap) => {\n const capKeyStr = `/clawiverse/cap/${capKey(cap)}`;\n const capDHTKey = uint8ArrayFromString(capKeyStr);\n try {\n const existing = await readDIDList(dht, capDHTKey);\n if (!existing.includes(card.did)) {\n await writeDIDList(dht, capDHTKey, [...existing, card.did]);\n logger.debug('Indexed capability in DHT', { cap: capKey(cap), did: card.did });\n }\n } catch (e: any) {\n logger.warn('Failed to index capability (non-fatal)', { cap: capKey(cap), error: (e as Error).message });\n }\n }));\n\n // 3. Index locally for fast in-process search\n searchEngine.indexAgentCard(card);\n\n logger.info('Published Agent Card to DHT', { did: card.did });\n } catch (error) {\n // DHT publish failure is non-fatal - local index is still available\n logger.warn('Failed to publish Agent Card to DHT (non-fatal)', { error: (error as Error).message });\n // Still index locally even if DHT fails\n searchEngine.indexAgentCard(card);\n }\n },\n\n queryAgentCard: async (did: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n searchEngine.indexAgentCard(card);\n logger.debug('Found Agent Card in DHT', { did });\n return card;\n }\n }\n\n logger.debug('Agent Card not found in DHT', { did });\n return null;\n } catch (error) {\n logger.warn('Failed to query Agent Card', { did, error });\n return null;\n }\n },\n\n queryByCapability: async (capability: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n\n // 1. Check local index first\n const local = searchEngine.getAllIndexedCards().filter(card =>\n card.capabilities.some((cap: any) => {\n const name = typeof cap === 'string' ? cap : cap.name;\n return name?.toLowerCase().includes(capability.toLowerCase());\n })\n );\n if (local.length > 0) return local;\n\n // 2. Fall back to DHT capability index\n if (!dht) return [];\n\n const capDHTKey = uint8ArrayFromString(`/clawiverse/cap/${capKey(capability)}`);\n const dids = await readDIDList(dht, capDHTKey);\n logger.debug('DHT capability index', { capability, dids });\n\n // Fetch each Agent Card in parallel\n const cards = await Promise.all(\n dids.map(async (did) => {\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n try {\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n searchEngine.indexAgentCard(card);\n return card;\n }\n }\n } catch { /* skip unreachable */ }\n return null;\n })\n );\n\n return cards.filter((c): c is AgentCard => c !== null);\n } catch (error) {\n throw new DiscoveryError('Failed to query by capability', error);\n }\n },\n\n searchSemantic: async (query: SemanticQuery) => {\n try {\n // Always pull from DHT __all__ index to discover remote nodes\n const dht = (libp2p as any).services?.dht;\n if (dht) {\n const allKey = uint8ArrayFromString('/clawiverse/cap/__all__');\n const dids = await readDIDList(dht, allKey);\n logger.debug('DHT __all__ index', { count: dids.length });\n\n await Promise.all(\n dids.map(async (did) => {\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n try {\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n searchEngine.indexAgentCard(decodeFromCBOR(raw));\n break;\n }\n }\n } catch { /* skip */ }\n })\n );\n }\n\n return searchEngine.search(query);\n } catch (error) {\n throw new DiscoveryError('Failed to perform semantic search', error);\n }\n },\n\n queryRelayPeers: async (): Promise<string[]> => {\n const dht = (libp2p as any).services?.dht;\n if (!dht) return [];\n const capDHTKey = uint8ArrayFromString('/clawiverse/cap/relay');\n const dids = await readDIDList(dht, capDHTKey);\n const addrs: string[] = [];\n await Promise.all(dids.map(async (did) => {\n const card = await operations.queryAgentCard(did);\n if (card?.endpoints) {\n addrs.push(...card.endpoints.filter((e: string) => !e.includes('/p2p-circuit/')));\n }\n }));\n return addrs;\n },\n\n resolveDID: async (did: string) => {\n try {\n // Check cache first\n const cached = peerCache.get(did);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n logger.debug('Using cached peer info', { did });\n return { peerId: cached.peerId, multiaddrs: cached.multiaddrs };\n }\n\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n if (card.peerId) {\n logger.debug('Resolved DID to peer', { did, peerId: card.peerId });\n const result = { peerId: card.peerId, multiaddrs: card.endpoints || [] };\n\n // Cache the result\n peerCache.set(did, {\n peerId: result.peerId,\n multiaddrs: result.multiaddrs,\n timestamp: Date.now()\n });\n\n return result;\n }\n logger.warn('Agent Card found but has no peerId', { did });\n return null;\n }\n }\n\n logger.debug('DID not found in DHT', { did });\n return null;\n } catch (error) {\n logger.warn('Failed to resolve DID', { did, error });\n return null;\n }\n },\n });\n}\n","import { MessagingError } from '../utils/errors.js';\n\nexport interface MessageEnvelope {\n id: string;\n from: string; // DID\n to: string; // DID\n type: 'request' | 'response' | 'notification';\n protocol: string;\n payload: unknown;\n timestamp: number;\n signature: string;\n replyTo?: string; // For responses, the ID of the request\n}\n\n/**\n * Create a message envelope\n */\nexport function createEnvelope(\n from: string,\n to: string,\n type: 'request' | 'response' | 'notification',\n protocol: string,\n payload: unknown,\n replyTo?: string\n): Omit<MessageEnvelope, 'signature'> {\n return {\n id: generateMessageId(),\n from,\n to,\n type,\n protocol,\n payload,\n timestamp: Date.now(),\n replyTo,\n };\n}\n\n/**\n * Sign a message envelope\n */\nexport async function signEnvelope(\n envelope: Omit<MessageEnvelope, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<MessageEnvelope> {\n try {\n const envelopeJson = JSON.stringify(envelope);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signature = await signFn(envelopeBytes);\n\n return {\n ...envelope,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new MessagingError('Failed to sign envelope', error);\n }\n}\n\n/**\n * Verify a message envelope signature\n */\nexport async function verifyEnvelope(\n envelope: MessageEnvelope,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const envelopeJson = JSON.stringify(envelopeWithoutSig);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, envelopeBytes);\n } catch (error) {\n throw new MessagingError('Failed to verify envelope', error);\n }\n}\n\n/**\n * Validate message envelope structure\n */\nexport function validateEnvelope(msg: unknown): msg is MessageEnvelope {\n if (typeof msg !== 'object' || msg === null) {\n return false;\n }\n\n const m = msg as Partial<MessageEnvelope>;\n\n return (\n typeof m.id === 'string' &&\n typeof m.from === 'string' &&\n m.from.startsWith('did:clawiverse:') &&\n typeof m.to === 'string' &&\n m.to.startsWith('did:clawiverse:') &&\n (m.type === 'request' || m.type === 'response' || m.type === 'notification') &&\n typeof m.protocol === 'string' &&\n m.payload !== undefined &&\n typeof m.timestamp === 'number' &&\n typeof m.signature === 'string'\n );\n}\n\n/**\n * Generate a unique message ID\n */\nfunction generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n","import { encode, decode } from 'cbor-x';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessagingError } from '../utils/errors.js';\n\n/**\n * Encode a message envelope to CBOR\n */\nexport function encodeMessage(envelope: MessageEnvelope): Uint8Array {\n try {\n return encode(envelope);\n } catch (error) {\n throw new MessagingError('Failed to encode message', error);\n }\n}\n\n/**\n * Decode a CBOR message to envelope\n */\nexport function decodeMessage(data: Uint8Array): MessageEnvelope {\n try {\n return decode(data) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message', error);\n }\n}\n\n/**\n * Encode message to JSON (for debugging/logging)\n */\nexport function encodeMessageJSON(envelope: MessageEnvelope): string {\n try {\n return JSON.stringify(envelope, null, 2);\n } catch (error) {\n throw new MessagingError('Failed to encode message to JSON', error);\n }\n}\n\n/**\n * Decode JSON message to envelope\n */\nexport function decodeMessageJSON(json: string): MessageEnvelope {\n try {\n return JSON.parse(json) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message from JSON', error);\n }\n}\n","import type { Libp2p } from 'libp2p';\nimport { peerIdFromString } from '@libp2p/peer-id';\nimport { multiaddr } from '@multiformats/multiaddr';\nimport type { MessageEnvelope } from './envelope.js';\nimport type { DHTOperations } from '../discovery/dht.js';\nimport { encodeMessage, decodeMessage } from './codec.js';\nimport { validateEnvelope, verifyEnvelope } from './envelope.js';\nimport { createLogger } from '../utils/logger.js';\nimport { MessagingError } from '../utils/errors.js';\nimport { extractPublicKey } from '../identity/did.js';\nimport { verify } from '../identity/keys.js';\n\nconst logger = createLogger('router');\n\n/** Helper to efficiently concatenate Uint8Array chunks */\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n if (arrays.length === 0) return new Uint8Array(0);\n if (arrays.length === 1) return arrays[0];\n\n const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\nexport type MessageHandler = (\n envelope: MessageEnvelope\n) => Promise<MessageEnvelope | void>;\n\nexport interface PeerHint {\n peerId: string;\n multiaddrs: string[];\n}\n\nexport interface MessageRouter {\n registerHandler: (protocol: string, handler: MessageHandler) => void;\n unregisterHandler: (protocol: string) => void;\n registerCatchAllHandler: (handler: MessageHandler) => void;\n sendMessage: (envelope: MessageEnvelope, peerHint?: PeerHint) => Promise<MessageEnvelope | void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\n\n/**\n * Create a message router for a libp2p node.\n * When dht is provided, sendMessage can resolve DIDs to peer addresses via DHT lookup.\n * When relayPeers is provided, sendMessage will attempt relay fallback if direct dial fails.\n */\nexport function createMessageRouter(\n libp2p: Libp2p,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>,\n dht?: DHTOperations,\n relayPeers?: string[]\n): MessageRouter {\n const handlers = new Map<string, MessageHandler>();\n let catchAllHandler: MessageHandler | undefined;\n const PROTOCOL_PREFIX = '/clawiverse/msg/1.0.0';\n\n return {\n registerHandler: (protocol: string, handler: MessageHandler) => {\n handlers.set(protocol, handler);\n logger.info('Registered message handler', { protocol });\n },\n\n unregisterHandler: (protocol: string) => {\n handlers.delete(protocol);\n logger.info('Unregistered message handler', { protocol });\n },\n\n registerCatchAllHandler: (handler: MessageHandler) => {\n catchAllHandler = handler;\n logger.info('Registered catch-all message handler');\n },\n\n sendMessage: async (envelope: MessageEnvelope, peerHint?: PeerHint) => {\n try {\n if (!validateEnvelope(envelope)) {\n throw new MessagingError('Invalid message envelope');\n }\n\n // Resolve peer: try peerHint first, then DHT\n let targetPeerIdStr: string | undefined;\n let targetMultiaddrs: string[] = [];\n\n if (peerHint) {\n targetPeerIdStr = peerHint.peerId;\n targetMultiaddrs = peerHint.multiaddrs;\n logger.info('Using peer hint for direct addressing', { peerId: targetPeerIdStr });\n } else if (dht) {\n const resolved = await dht.resolveDID(envelope.to);\n if (resolved) {\n targetPeerIdStr = resolved.peerId;\n targetMultiaddrs = resolved.multiaddrs;\n }\n }\n\n if (!targetPeerIdStr) {\n throw new MessagingError(\n `Cannot resolve recipient: ${envelope.to} — provide peerHint or ensure agent is in DHT`\n );\n }\n\n const targetPeerId = peerIdFromString(targetPeerIdStr);\n\n if (targetMultiaddrs.length > 0) {\n const mas = targetMultiaddrs.map((a) => multiaddr(a));\n await libp2p.peerStore.merge(targetPeerId, { multiaddrs: mas });\n }\n\n logger.info('Dialing peer for message delivery', {\n peerId: targetPeerIdStr,\n multiaddrs: targetMultiaddrs,\n });\n\n let stream: any;\n const DIAL_TIMEOUT = 3000; // 3 seconds per attempt\n\n // Separate relay addrs from direct addrs\n const relayMultiaddrs = targetMultiaddrs.filter((a) => a.includes('/p2p-circuit/'));\n const directMultiaddrs = targetMultiaddrs.filter((a) => !a.includes('/p2p-circuit/'));\n\n // Try direct addresses in parallel\n if (directMultiaddrs.length > 0) {\n const directDialPromises = directMultiaddrs.map(async (addr) => {\n try {\n const conn = await libp2p.dial(multiaddr(addr), {\n signal: AbortSignal.timeout(DIAL_TIMEOUT)\n });\n const s = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('Direct dial succeeded', { addr });\n return s;\n } catch {\n return null;\n }\n });\n\n stream = await Promise.race(\n directDialPromises.map(p => p.then(s => s || Promise.reject()))\n ).catch(() => undefined);\n }\n\n let lastError: unknown;\n\n // Fall back to relay: try all relay addresses in parallel\n if (!stream) {\n const allRelayAddrs = [\n ...relayMultiaddrs,\n ...(relayPeers ?? []).map((r) => buildCircuitRelayAddr(r, targetPeerIdStr!)),\n ];\n // Deduplicate\n const uniqueRelayAddrs = [...new Set(allRelayAddrs)];\n\n if (uniqueRelayAddrs.length > 0) {\n const relayDialPromises = uniqueRelayAddrs.map(async (addr) => {\n try {\n const conn = await libp2p.dial(multiaddr(addr), {\n signal: AbortSignal.timeout(DIAL_TIMEOUT)\n });\n logger.info('Relay connection established', { addr });\n const s = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('Relay stream opened', { addr });\n return s;\n } catch (relayErr) {\n logger.warn('Relay dial failed', { addr, error: (relayErr as Error).message });\n lastError = relayErr;\n return null;\n }\n });\n\n stream = await Promise.race(\n relayDialPromises.map(p => p.then(s => s || Promise.reject()))\n ).catch(() => undefined);\n }\n }\n\n // Last resort: query DHT for relay-capable peers\n if (!stream && dht && 'queryRelayPeers' in dht) {\n const discoveredRelays = await (dht as any).queryRelayPeers();\n for (const relayAddr of discoveredRelays) {\n const circuitAddr = buildCircuitRelayAddr(relayAddr, targetPeerIdStr!);\n try {\n const conn = await libp2p.dial(multiaddr(circuitAddr));\n stream = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('DHT-discovered relay succeeded', { relayAddr });\n break;\n } catch (e) {\n logger.warn('DHT relay failed', { relayAddr, error: (e as Error).message });\n lastError = e;\n }\n }\n }\n\n if (!stream) {\n throw lastError ?? new MessagingError('All dial attempts failed (including DHT-discovered relays)');\n }\n\n const encoded = encodeMessage(envelope);\n await stream.sink(\n (async function* () {\n yield encoded;\n })()\n );\n\n logger.info('Message sent over libp2p stream', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n });\n\n // If this is a request, wait for response\n if (envelope.type === 'request') {\n logger.debug('Waiting for response to request', { id: envelope.id });\n\n try {\n // Add timeout to prevent infinite blocking\n const RESPONSE_TIMEOUT = 5000; // 5 seconds\n\n const responsePromise = (async () => {\n const responseChunks: Uint8Array[] = [];\n for await (const chunk of stream.source) {\n responseChunks.push(chunk.subarray());\n }\n\n if (responseChunks.length > 0) {\n const responseData = concatUint8Arrays(responseChunks);\n const responseEnvelope = decodeMessage(responseData);\n logger.info('Received response', {\n id: responseEnvelope.id,\n replyTo: responseEnvelope.replyTo,\n });\n\n return responseEnvelope;\n } else {\n logger.warn('No response received for request', { id: envelope.id });\n return undefined;\n }\n })();\n\n const timeoutPromise = new Promise<undefined>((resolve) => {\n setTimeout(() => {\n logger.warn('Response timeout', { id: envelope.id, timeout: RESPONSE_TIMEOUT });\n resolve(undefined);\n }, RESPONSE_TIMEOUT);\n });\n\n const response = await Promise.race([responsePromise, timeoutPromise]);\n return response;\n } catch (error) {\n logger.warn('Error reading response', { error });\n return undefined;\n }\n }\n\n return undefined;\n } catch (error) {\n if (error instanceof MessagingError) throw error;\n throw new MessagingError('Failed to send message', error);\n }\n },\n\n start: async () => {\n await libp2p.handle(PROTOCOL_PREFIX, async ({ stream }) => {\n try {\n await handleIncomingStream(stream, handlers, catchAllHandler, verifyFn);\n } catch (error) {\n logger.error('Error handling incoming stream', error);\n }\n }, { runOnLimitedConnection: true });\n\n logger.info('Message router started');\n },\n\n stop: async () => {\n await libp2p.unhandle(PROTOCOL_PREFIX);\n handlers.clear();\n catchAllHandler = undefined;\n logger.info('Message router stopped');\n },\n };\n}\n\nfunction buildCircuitRelayAddr(relayAddr: string, targetPeerId: string): string {\n return `${relayAddr}/p2p-circuit/p2p/${targetPeerId}`;\n}\n\nasync function handleIncomingStream(\n stream: any,\n handlers: Map<string, MessageHandler>,\n catchAllHandler: MessageHandler | undefined,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<void> {\n try {\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream.source) {\n chunks.push(chunk.subarray());\n }\n\n const data = concatUint8Arrays(chunks);\n const envelope = decodeMessage(data);\n\n if (!validateEnvelope(envelope)) {\n logger.warn('Received invalid message envelope');\n return;\n }\n\n // Verify signature against sender DID embedded public key.\n const isValidSignature = await verifyEnvelope(envelope, async (signature, data) => {\n const senderPublicKey = extractPublicKey(envelope.from);\n return verify(signature, data, senderPublicKey);\n });\n if (!isValidSignature) {\n logger.warn('Received message with invalid signature', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n\n // Optional caller-supplied verification hook (e.g. policy checks).\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const dataBytes = new TextEncoder().encode(JSON.stringify(envelopeWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const hookValid = await verifyFn(signatureBytes, dataBytes);\n if (!hookValid) {\n logger.warn('Message rejected by custom verifier', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n } catch (error) {\n logger.warn('Custom verification hook failed', {\n id: envelope.id,\n from: envelope.from,\n error: (error as Error).message,\n });\n return;\n }\n\n logger.info('Received message', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n payload: envelope.payload,\n });\n\n const handler = handlers.get(envelope.protocol);\n let response: MessageEnvelope | void = undefined;\n\n if (handler) {\n response = await handler(envelope);\n } else if (catchAllHandler) {\n logger.debug('Using catch-all handler for protocol', { protocol: envelope.protocol });\n response = await catchAllHandler(envelope);\n } else {\n logger.warn('No handler for protocol', { protocol: envelope.protocol });\n }\n\n // Send response back if handler returned one\n if (response) {\n const encoded = encodeMessage(response);\n logger.info('Sending response back to sender', {\n responseId: response.id,\n replyTo: response.replyTo,\n size: encoded.length\n });\n\n await stream.sink(\n (async function* () {\n yield encoded;\n })()\n );\n }\n } catch (error) {\n logger.error('Error handling incoming message', error);\n }\n}\n","/**\n * Trust Score System\n *\n * Tracks agent reputation based on interactions, endorsements,\n * and network behavior.\n */\n\n/**\n * Trust Score Metrics\n */\nexport interface TrustScore {\n interactionScore: number; // 0-1, based on successful interactions\n endorsements: number; // Count of endorsements\n completionRate: number; // % of completed tasks (0-1)\n responseTime: number; // Average response time (ms)\n uptime: number; // % of time online last 30 days (0-1)\n lastUpdated: number; // Timestamp\n}\n\n/**\n * Interaction Record\n */\nexport interface Interaction {\n agentDid: string;\n timestamp: number;\n type: 'message' | 'task' | 'query';\n success: boolean;\n responseTime: number;\n rating?: number; // 1-5 stars (optional user rating)\n feedback?: string;\n}\n\n/**\n * Interaction Statistics\n */\nexport interface InteractionStats {\n totalInteractions: number;\n successRate: number;\n avgResponseTime: number;\n lastInteraction: number;\n}\n\n/**\n * Trust Metrics Calculator\n */\nexport class TrustMetrics {\n /**\n * Calculate trust score from interaction history\n */\n calculateScore(stats: InteractionStats, endorsements: number, uptime: number): TrustScore {\n // Interaction score: weighted by success rate and volume\n const volumeWeight = Math.min(stats.totalInteractions / 100, 1); // Cap at 100 interactions\n const interactionScore = stats.successRate * volumeWeight;\n\n // Completion rate is same as success rate for now\n const completionRate = stats.successRate;\n\n return {\n interactionScore,\n endorsements,\n completionRate,\n responseTime: stats.avgResponseTime,\n uptime,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Calculate overall trust level (0-1)\n */\n calculateOverallTrust(score: TrustScore): number {\n // Weighted average of different factors\n const weights = {\n interaction: 0.4,\n endorsement: 0.2,\n completion: 0.2,\n uptime: 0.2,\n };\n\n const endorsementScore = Math.min(score.endorsements / 10, 1); // Cap at 10 endorsements\n\n return (\n score.interactionScore * weights.interaction +\n endorsementScore * weights.endorsement +\n score.completionRate * weights.completion +\n score.uptime * weights.uptime\n );\n }\n\n /**\n * Get trust level category\n */\n getTrustLevel(score: TrustScore): 'new' | 'low' | 'medium' | 'high' | 'trusted' {\n const overall = this.calculateOverallTrust(score);\n\n if (score.interactionScore === 0) return 'new';\n if (overall < 0.3) return 'low';\n if (overall < 0.6) return 'medium';\n if (overall < 0.8) return 'high';\n return 'trusted';\n }\n\n /**\n * Check if agent should be rate limited\n */\n shouldRateLimit(score: TrustScore, agentAge: number): boolean {\n const overall = this.calculateOverallTrust(score);\n const ONE_DAY = 24 * 60 * 60 * 1000;\n\n // New agents (< 24 hours) with low trust\n if (agentAge < ONE_DAY && overall < 0.3) {\n return true;\n }\n\n // Very low trust regardless of age\n if (overall < 0.1) {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * Default trust score for new agents\n */\nexport function createDefaultTrustScore(): TrustScore {\n return {\n interactionScore: 0,\n endorsements: 0,\n completionRate: 0,\n responseTime: 0,\n uptime: 1.0, // Assume online initially\n lastUpdated: Date.now(),\n };\n}\n","/**\n * Interaction History Tracker\n *\n * Records and queries agent interaction history for trust scoring\n */\n\nimport { Level } from 'level';\nimport type { Interaction, InteractionStats } from './trust-score.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('interaction-history');\n\n/**\n * Interaction History Manager\n */\nexport class InteractionHistory {\n private db: Level<string, Interaction>;\n\n constructor(dbPath: string) {\n this.db = new Level(dbPath, { valueEncoding: 'json' });\n }\n\n /**\n * Open database connection\n */\n async open(): Promise<void> {\n await this.db.open();\n logger.info('Interaction history database opened', { path: this.db.location });\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n await this.db.close();\n logger.info('Interaction history database closed');\n }\n\n /**\n * Record an interaction\n */\n async record(interaction: Interaction): Promise<void> {\n const key = `interaction:${interaction.agentDid}:${interaction.timestamp}`;\n await this.db.put(key, interaction);\n logger.debug('Recorded interaction', { agentDid: interaction.agentDid, type: interaction.type });\n }\n\n /**\n * Get interaction history for an agent\n */\n async getHistory(agentDid: string, limit = 100): Promise<Interaction[]> {\n const interactions: Interaction[] = [];\n const prefix = `interaction:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n limit,\n reverse: true, // Most recent first\n })) {\n interactions.push(value);\n }\n } catch (error) {\n logger.error('Failed to get interaction history', { agentDid, error });\n }\n\n return interactions;\n }\n\n /**\n * Get interaction statistics for an agent\n */\n async getStats(agentDid: string): Promise<InteractionStats> {\n const history = await this.getHistory(agentDid, 1000); // Last 1000 interactions\n\n if (history.length === 0) {\n return {\n totalInteractions: 0,\n successRate: 0,\n avgResponseTime: 0,\n lastInteraction: 0,\n };\n }\n\n const successCount = history.filter(i => i.success).length;\n const totalResponseTime = history.reduce((sum, i) => sum + i.responseTime, 0);\n\n return {\n totalInteractions: history.length,\n successRate: successCount / history.length,\n avgResponseTime: totalResponseTime / history.length,\n lastInteraction: history[0].timestamp,\n };\n }\n\n /**\n * Get all agents with interaction history\n */\n async getAllAgents(): Promise<string[]> {\n const agents = new Set<string>();\n\n try {\n for await (const [key] of this.db.iterator()) {\n const match = key.match(/^interaction:([^:]+):/);\n if (match) {\n agents.add(match[1]);\n }\n }\n } catch (error) {\n logger.error('Failed to get all agents', { error });\n }\n\n return Array.from(agents);\n }\n\n /**\n * Delete all interactions for an agent\n */\n async deleteAgent(agentDid: string): Promise<void> {\n const prefix = `interaction:${agentDid}:`;\n const keysToDelete: string[] = [];\n\n for await (const [key] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n keysToDelete.push(key);\n }\n\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Deleted interaction history', { agentDid, count: keysToDelete.length });\n }\n\n /**\n * Clean up old interactions (older than 90 days)\n */\n async cleanup(maxAge = 90 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - maxAge;\n const keysToDelete: string[] = [];\n\n for await (const [key, value] of this.db.iterator()) {\n if (value.timestamp < cutoff) {\n keysToDelete.push(key);\n }\n }\n\n if (keysToDelete.length > 0) {\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Cleaned up old interactions', { count: keysToDelete.length });\n }\n\n return keysToDelete.length;\n }\n}\n","/**\n * Endorsement System\n *\n * Allows agents to endorse each other, building a web of trust\n */\n\nimport type { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('endorsement');\n\n/**\n * Endorsement Record\n */\nexport interface Endorsement {\n from: string; // Endorser DID\n to: string; // Endorsed agent DID\n score: number; // 0-1\n reason: string;\n timestamp: number;\n signature: string; // Signed by endorser\n}\n\n/**\n * Sign function type\n */\nexport type SignFunction = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Verify function type\n */\nexport type VerifyFunction = (signature: Uint8Array, data: Uint8Array, publicKey: Uint8Array) => Promise<boolean>;\n\n/**\n * Endorsement Manager\n */\nexport class EndorsementManager {\n constructor(\n private db: Level<string, Endorsement>,\n private getPublicKey: (did: string) => Promise<Uint8Array>\n ) {}\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n if (score < 0 || score > 1) {\n throw new Error('Score must be between 0 and 1');\n }\n\n const endorsement: Omit<Endorsement, 'signature'> = {\n from: fromDid,\n to: toDid,\n score,\n reason,\n timestamp: Date.now(),\n };\n\n // Sign the endorsement\n const data = new TextEncoder().encode(JSON.stringify(endorsement));\n const signatureBytes = await signFn(data);\n const signature = Buffer.from(signatureBytes).toString('hex');\n\n const signedEndorsement: Endorsement = {\n ...endorsement,\n signature,\n };\n\n logger.info('Created endorsement', { from: fromDid, to: toDid, score });\n return signedEndorsement;\n }\n\n /**\n * Verify endorsement signature\n */\n async verify(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n try {\n const { signature, ...endorsementWithoutSig } = endorsement;\n const data = new TextEncoder().encode(JSON.stringify(endorsementWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const publicKey = await this.getPublicKey(endorsement.from);\n\n return await verifyFn(signatureBytes, data, publicKey);\n } catch (error) {\n logger.error('Failed to verify endorsement', { error });\n return false;\n }\n }\n\n /**\n * Publish endorsement to local database\n */\n async publish(endorsement: Endorsement): Promise<void> {\n const key = `endorsement:${endorsement.to}:${endorsement.from}`;\n await this.db.put(key, endorsement);\n logger.info('Published endorsement', { from: endorsement.from, to: endorsement.to });\n }\n\n /**\n * Get all endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n const prefix = `endorsement:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n endorsements.push(value);\n }\n } catch (error) {\n logger.error('Failed to get endorsements', { agentDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Get endorsements given by an agent\n */\n async getEndorsementsBy(fromDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n\n try {\n for await (const [_, value] of this.db.iterator()) {\n if (value.from === fromDid) {\n endorsements.push(value);\n }\n }\n } catch (error) {\n logger.error('Failed to get endorsements by agent', { fromDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Calculate average endorsement score\n */\n async getAverageScore(agentDid: string): Promise<number> {\n const endorsements = await this.getEndorsements(agentDid);\n\n if (endorsements.length === 0) {\n return 0;\n }\n\n const totalScore = endorsements.reduce((sum, e) => sum + e.score, 0);\n return totalScore / endorsements.length;\n }\n\n /**\n * Delete an endorsement\n */\n async deleteEndorsement(fromDid: string, toDid: string): Promise<void> {\n const key = `endorsement:${toDid}:${fromDid}`;\n await this.db.del(key);\n logger.info('Deleted endorsement', { from: fromDid, to: toDid });\n }\n}\n","/**\n * Sybil Defense Mechanisms\n *\n * Protects the network from Sybil attacks through:\n * - Entry cost (Hashcash challenges)\n * - Progressive trust (rate limiting for new agents)\n * - DHT region protection (prefer established peers)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nconst logger = createLogger('sybil-defense');\n\n/**\n * Hashcash Challenge\n */\nexport interface Challenge {\n did: string;\n difficulty: number; // Number of leading zero bits required\n nonce: string;\n timestamp: number;\n}\n\n/**\n * Challenge Solution\n */\nexport interface ChallengeSolution {\n challenge: Challenge;\n solution: string; // Nonce that produces required hash\n}\n\n/**\n * Rate Limit Record\n */\ninterface RateLimitRecord {\n did: string;\n requests: number[]; // Timestamps of requests\n firstSeen: number;\n}\n\n/**\n * Peer Trust Level\n */\nexport type PeerTrustLevel = 'new' | 'established' | 'trusted';\n\n/**\n * Sybil Defense Manager\n */\nexport class SybilDefense {\n private rateLimits = new Map<string, RateLimitRecord>();\n private peerFirstSeen = new Map<string, number>();\n private readonly NEW_AGENT_WINDOW = 24 * 60 * 60 * 1000; // 24 hours\n private readonly RATE_LIMIT_WINDOW = 60 * 60 * 1000; // 1 hour\n private readonly MAX_REQUESTS_NEW = 10; // Max requests per hour for new agents\n private readonly ESTABLISHED_THRESHOLD = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n /**\n * Generate a Hashcash challenge for a new DID\n */\n generateChallenge(did: string, difficulty = 20): Challenge {\n const nonce = this.generateNonce();\n return {\n did,\n difficulty,\n nonce,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Verify a Hashcash challenge solution\n */\n verifyChallenge(solution: ChallengeSolution): boolean {\n const { challenge, solution: solutionNonce } = solution;\n\n // Check challenge is not too old (valid for 1 hour)\n if (Date.now() - challenge.timestamp > 60 * 60 * 1000) {\n logger.warn('Challenge expired', { did: challenge.did });\n return false;\n }\n\n // Compute hash\n const data = `${challenge.did}:${challenge.nonce}:${solutionNonce}`;\n const hash = sha256(new TextEncoder().encode(data));\n\n // Check leading zeros\n const leadingZeros = this.countLeadingZeroBits(hash);\n const valid = leadingZeros >= challenge.difficulty;\n\n if (valid) {\n logger.info('Challenge verified', { did: challenge.did, leadingZeros });\n } else {\n logger.warn('Challenge failed', { did: challenge.did, leadingZeros, required: challenge.difficulty });\n }\n\n return valid;\n }\n\n /**\n * Check if an agent should be rate limited\n */\n isRateLimited(did: string): boolean {\n const record = this.rateLimits.get(did);\n if (!record) {\n return false;\n }\n\n const now = Date.now();\n const agentAge = now - record.firstSeen;\n\n // Only rate limit new agents\n if (agentAge > this.NEW_AGENT_WINDOW) {\n return false;\n }\n\n // Count recent requests\n const recentRequests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n return recentRequests.length >= this.MAX_REQUESTS_NEW;\n }\n\n /**\n * Record a request from an agent\n */\n recordRequest(did: string): void {\n const now = Date.now();\n let record = this.rateLimits.get(did);\n\n if (!record) {\n record = {\n did,\n requests: [],\n firstSeen: now,\n };\n this.rateLimits.set(did, record);\n }\n\n // Add request timestamp\n record.requests.push(now);\n\n // Clean up old requests\n record.requests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n logger.debug('Recorded request', { did, count: record.requests.length });\n }\n\n /**\n * Get peer trust level based on age\n */\n getPeerTrustLevel(peerId: string): PeerTrustLevel {\n const firstSeen = this.peerFirstSeen.get(peerId);\n if (!firstSeen) {\n return 'new';\n }\n\n const age = Date.now() - firstSeen;\n\n if (age < this.NEW_AGENT_WINDOW) {\n return 'new';\n } else if (age < this.ESTABLISHED_THRESHOLD) {\n return 'established';\n } else {\n return 'trusted';\n }\n }\n\n /**\n * Record first seen time for a peer\n */\n recordPeerSeen(peerId: string): void {\n if (!this.peerFirstSeen.has(peerId)) {\n this.peerFirstSeen.set(peerId, Date.now());\n logger.debug('Recorded new peer', { peerId });\n }\n }\n\n /**\n * Clean up old records\n */\n cleanup(): void {\n const now = Date.now();\n const cutoff = now - this.NEW_AGENT_WINDOW;\n\n // Clean up rate limits for old agents\n for (const [did, record] of this.rateLimits.entries()) {\n if (record.firstSeen < cutoff) {\n this.rateLimits.delete(did);\n }\n }\n\n logger.info('Cleaned up Sybil defense records', {\n rateLimits: this.rateLimits.size,\n peers: this.peerFirstSeen.size,\n });\n }\n\n /**\n * Generate a random nonce\n */\n private generateNonce(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n }\n\n /**\n * Count leading zero bits in a hash\n */\n private countLeadingZeroBits(hash: Uint8Array): number {\n let count = 0;\n for (const byte of hash) {\n if (byte === 0) {\n count += 8;\n } else {\n // Count leading zeros in this byte\n let b = byte;\n while ((b & 0x80) === 0) {\n count++;\n b <<= 1;\n }\n break;\n }\n }\n return count;\n }\n}\n","/**\n * Trust System - Main Export\n *\n * Combines all trust components into a unified interface\n */\n\nexport * from './trust-score.js';\nexport * from './interaction-history.js';\nexport * from './endorsement.js';\nexport * from './sybil-defense.js';\n\nimport { Level } from 'level';\nimport { TrustMetrics } from './trust-score.js';\nimport type { TrustScore, Interaction } from './trust-score.js';\nimport { InteractionHistory } from './interaction-history.js';\nimport { EndorsementManager } from './endorsement.js';\nimport type { Endorsement, SignFunction, VerifyFunction } from './endorsement.js';\nimport { SybilDefense } from './sybil-defense.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('trust-system');\n\n/**\n * Trust System Configuration\n */\nexport interface TrustSystemConfig {\n dbPath: string;\n getPublicKey: (did: string) => Promise<Uint8Array>;\n}\n\n/**\n * Unified Trust System\n */\nexport class TrustSystem {\n private metrics: TrustMetrics;\n private history: InteractionHistory;\n private endorsements: EndorsementManager;\n private sybilDefense: SybilDefense;\n private trustCache = new Map<string, { score: TrustScore; timestamp: number }>();\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: TrustSystemConfig) {\n this.metrics = new TrustMetrics();\n this.history = new InteractionHistory(`${config.dbPath}/interactions`);\n\n const endorsementDb = new Level<string, Endorsement>(`${config.dbPath}/endorsements`, {\n valueEncoding: 'json',\n });\n this.endorsements = new EndorsementManager(endorsementDb, config.getPublicKey);\n this.sybilDefense = new SybilDefense();\n }\n\n /**\n * Initialize the trust system\n */\n async start(): Promise<void> {\n await this.history.open();\n logger.info('Trust system started');\n }\n\n /**\n * Shutdown the trust system\n */\n async stop(): Promise<void> {\n await this.history.close();\n logger.info('Trust system stopped');\n }\n\n /**\n * Record an interaction\n */\n async recordInteraction(interaction: Interaction): Promise<void> {\n await this.history.record(interaction);\n this.sybilDefense.recordRequest(interaction.agentDid);\n\n // Invalidate cache\n this.trustCache.delete(interaction.agentDid);\n }\n\n /**\n * Get trust score for an agent\n */\n async getTrustScore(agentDid: string): Promise<TrustScore> {\n // Check cache\n const cached = this.trustCache.get(agentDid);\n if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {\n return cached.score;\n }\n\n // Calculate fresh score\n const stats = await this.history.getStats(agentDid);\n const endorsementList = await this.endorsements.getEndorsements(agentDid);\n const uptime = 1.0; // TODO: Implement uptime tracking\n\n const score = this.metrics.calculateScore(stats, endorsementList.length, uptime);\n\n // Cache result\n this.trustCache.set(agentDid, { score, timestamp: Date.now() });\n\n return score;\n }\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n const endorsement = await this.endorsements.endorse(fromDid, toDid, score, reason, signFn);\n await this.endorsements.publish(endorsement);\n\n // Invalidate cache\n this.trustCache.delete(toDid);\n\n return endorsement;\n }\n\n /**\n * Get endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n return this.endorsements.getEndorsements(agentDid);\n }\n\n /**\n * Verify an endorsement\n */\n async verifyEndorsement(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n return this.endorsements.verify(endorsement, verifyFn);\n }\n\n /**\n * Check if agent should be rate limited\n */\n isRateLimited(agentDid: string): boolean {\n return this.sybilDefense.isRateLimited(agentDid);\n }\n\n /**\n * Generate Sybil defense challenge\n */\n generateChallenge(did: string, difficulty?: number) {\n return this.sybilDefense.generateChallenge(did, difficulty);\n }\n\n /**\n * Verify Sybil defense challenge\n */\n verifyChallenge(solution: any): boolean {\n return this.sybilDefense.verifyChallenge(solution);\n }\n\n /**\n * Get peer trust level\n */\n getPeerTrustLevel(peerId: string) {\n return this.sybilDefense.getPeerTrustLevel(peerId);\n }\n\n /**\n * Record peer seen\n */\n recordPeerSeen(peerId: string): void {\n this.sybilDefense.recordPeerSeen(peerId);\n }\n\n /**\n * Get interaction history\n */\n async getHistory(agentDid: string, limit?: number): Promise<Interaction[]> {\n return this.history.getHistory(agentDid, limit);\n }\n\n /**\n * Clean up old data\n */\n async cleanup(): Promise<void> {\n await this.history.cleanup();\n this.sybilDefense.cleanup();\n this.trustCache.clear();\n logger.info('Trust system cleanup completed');\n }\n}\n\n/**\n * Create a trust system instance\n */\nexport function createTrustSystem(config: TrustSystemConfig): TrustSystem {\n return new TrustSystem(config);\n}\n"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js","../src/index.ts","../src/identity/keys.ts","../src/utils/errors.ts","../src/identity/did.ts","../src/identity/signer.ts","../src/transport/node.ts","../../../node_modules/.pnpm/@libp2p+websockets@10.1.5/node_modules/@libp2p/websockets/src/index.ts","../../../node_modules/.pnpm/@libp2p+interface@3.1.0/node_modules/@libp2p/interface/src/index.ts","../../../node_modules/.pnpm/@libp2p+interface@3.1.0/node_modules/@libp2p/interface/src/errors.ts","../../../node_modules/.pnpm/@libp2p+interface@3.1.0/node_modules/@libp2p/interface/src/events.ts","../../../node_modules/.pnpm/@libp2p+interface@3.1.0/node_modules/@libp2p/interface/src/transport.ts","../../../node_modules/.pnpm/main-event@1.0.1/node_modules/main-event/src/index.ts","../../../node_modules/.pnpm/main-event@1.0.1/node_modules/main-event/src/events.ts","../../../node_modules/.pnpm/@multiformats+multiaddr-matcher@3.0.1/node_modules/@multiformats/multiaddr-matcher/src/index.ts","../../../node_modules/.pnpm/@multiformats+multiaddr-matcher@3.0.1/node_modules/@multiformats/multiaddr-matcher/src/utils.ts","../../../node_modules/.pnpm/@multiformats+multiaddr-to-uri@12.0.0/node_modules/@multiformats/multiaddr-to-uri/src/index.ts","../../../node_modules/.pnpm/p-event@7.1.0/node_modules/p-event/index.js","../../../node_modules/.pnpm/p-timeout@7.0.1/node_modules/p-timeout/index.js","../../../node_modules/.pnpm/progress-events@1.0.1/node_modules/progress-events/src/index.ts","../../../node_modules/.pnpm/@libp2p+websockets@10.1.5/node_modules/@libp2p/websockets/src/listener.ts","../../../node_modules/.pnpm/uint8arraylist@2.4.8/node_modules/uint8arraylist/src/index.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/multiaddr/get-net-config.ts","../../../node_modules/.pnpm/@chainsafe+is-ip@2.1.0/node_modules/@chainsafe/is-ip/src/is-ip.node.ts","../../../node_modules/.pnpm/it-pushable@3.2.3/node_modules/it-pushable/src/index.ts","../../../node_modules/.pnpm/p-defer@4.0.1/node_modules/p-defer/index.js","../../../node_modules/.pnpm/it-pushable@3.2.3/node_modules/it-pushable/src/fifo.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/debounce.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/errors.ts","../../../node_modules/.pnpm/race-signal@2.0.0/node_modules/race-signal/src/index.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/abstract-message-stream.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/abstract-multiaddr-connection.ts","../../../node_modules/.pnpm/any-signal@4.2.0/node_modules/any-signal/src/index.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/get-thin-waist-addresses.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/link-local-ip.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/multiaddr/utils.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/ip-port-to-multiaddr.ts","../../../node_modules/.pnpm/@libp2p+utils@7.0.12/node_modules/@libp2p/utils/src/repeating-task.ts","../../../node_modules/.pnpm/@libp2p+websockets@10.1.5/node_modules/@libp2p/websockets/src/utils.ts","../../../node_modules/.pnpm/@libp2p+websockets@10.1.5/node_modules/@libp2p/websockets/src/websocket-to-conn.ts","../src/utils/logger.ts","../src/discovery/agent-card.ts","../src/discovery/agent-card-types.ts","../src/discovery/agent-card-schema.ts","../src/discovery/agent-card-encoder.ts","../src/discovery/dht.ts","../src/discovery/semantic-search.ts","../src/discovery/search-index.ts","../src/discovery/capability-matcher.ts","../src/messaging/envelope.ts","../src/messaging/codec.ts","../src/messaging/router.ts","../src/messaging/types.ts","../src/messaging/storage.ts","../src/messaging/queue.ts","../src/messaging/defense.ts","../src/messaging/rate-limiter.ts","../src/trust/index.ts","../src/trust/trust-score.ts","../src/trust/interaction-history.ts","../src/trust/endorsement.ts","../src/trust/sybil-defense.ts"],"names":["code","FaultTolerance","nodeSetMaxListeners","value","CODE_TCP","CODE_DNS","CODE_DNSADDR","CODE_DNS4","CODE_DNS6","CODE_TLS","CODE_IP6","event","pushable","options","_pushable","err","signal","multiaddr","ws","uint8ArrayFromString","WebSockets","LogLevel","cborEncode","cborDecode","logger","uint8ArrayToString","data","Level"],"mappings":"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","file":"index.js","sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Clawiverse Core - Main Export\n */\n\n// Identity\nexport * from './identity/keys.js';\nexport * from './identity/did.js';\nexport * from './identity/signer.js';\n\n// Transport\nexport * from './transport/node.js';\n\n// Discovery\nexport * from './discovery/agent-card.js';\nexport * from './discovery/agent-card-types.js';\nexport * from './discovery/agent-card-schema.js';\nexport * from './discovery/agent-card-encoder.js';\nexport * from './discovery/dht.js';\nexport * from './discovery/search-index.js';\nexport * from './discovery/capability-matcher.js';\nexport * from './discovery/semantic-search.js';\n\n// Messaging\nexport * from './messaging/envelope.js';\nexport * from './messaging/codec.js';\nexport * from './messaging/router.js';\nexport * from './messaging/types.js';\nexport * from './messaging/storage.js';\nexport * from './messaging/queue.js';\nexport * from './messaging/defense.js';\nexport * from './messaging/rate-limiter.js';\n\n// Trust (Phase 2)\nexport * from './trust/index.js';\n\n// Utils\nexport * from './utils/logger.js';\nexport * from './utils/errors.js';\n","import * as ed25519 from '@noble/ed25519';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface KeyPair {\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n}\n\n/**\n * Generate a new Ed25519 key pair\n */\nexport async function generateKeyPair(): Promise<KeyPair> {\n try {\n const privateKey = ed25519.utils.randomPrivateKey();\n const publicKey = await ed25519.getPublicKeyAsync(privateKey);\n\n return {\n publicKey,\n privateKey,\n };\n } catch (error) {\n throw new IdentityError('Failed to generate key pair', error);\n }\n}\n\n/**\n * Sign a message with a private key\n */\nexport async function sign(\n message: Uint8Array,\n privateKey: Uint8Array\n): Promise<Uint8Array> {\n try {\n return await ed25519.signAsync(message, privateKey);\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signature\n */\nexport async function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array\n): Promise<boolean> {\n try {\n return await ed25519.verifyAsync(signature, message, publicKey);\n } catch (error) {\n throw new IdentityError('Failed to verify signature', error);\n }\n}\n\n/**\n * Export key pair to JSON format\n */\nexport function exportKeyPair(keyPair: KeyPair): {\n publicKey: string;\n privateKey: string;\n} {\n return {\n publicKey: Buffer.from(keyPair.publicKey).toString('hex'),\n privateKey: Buffer.from(keyPair.privateKey).toString('hex'),\n };\n}\n\n/**\n * Import key pair from JSON format\n */\nexport function importKeyPair(exported: {\n publicKey: string;\n privateKey: string;\n}): KeyPair {\n return {\n publicKey: new Uint8Array(Buffer.from(exported.publicKey, 'hex')),\n privateKey: new Uint8Array(Buffer.from(exported.privateKey, 'hex')),\n };\n}\n","export class ClawiverseError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: unknown\n ) {\n super(message);\n this.name = 'ClawiverseError';\n }\n}\n\nexport class IdentityError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'IDENTITY_ERROR', details);\n this.name = 'IdentityError';\n }\n}\n\nexport class TransportError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'TRANSPORT_ERROR', details);\n this.name = 'TransportError';\n }\n}\n\nexport class DiscoveryError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'DISCOVERY_ERROR', details);\n this.name = 'DiscoveryError';\n }\n}\n\nexport class MessagingError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'MESSAGING_ERROR', details);\n this.name = 'MessagingError';\n }\n}\n","import { base58btc } from 'multiformats/bases/base58';\nimport { IdentityError } from '../utils/errors.js';\n\n/**\n * Derive a did:clawiverse DID from a public key\n * Format: did:clawiverse:<base58btc-encoded-pubkey>\n */\nexport function deriveDID(publicKey: Uint8Array): string {\n try {\n const encoded = base58btc.encode(publicKey);\n return `did:clawiverse:${encoded}`;\n } catch (error) {\n throw new IdentityError('Failed to derive DID', error);\n }\n}\n\n/**\n * Extract public key from a did:clawiverse DID\n */\nexport function extractPublicKey(did: string): Uint8Array {\n if (!did.startsWith('did:clawiverse:')) {\n throw new IdentityError('Invalid DID format: must start with did:clawiverse:');\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n return base58btc.decode(encoded);\n } catch (error) {\n throw new IdentityError('Failed to extract public key from DID', error);\n }\n}\n\n/**\n * Validate a did:clawiverse DID format\n */\nexport function validateDID(did: string): boolean {\n if (!did.startsWith('did:clawiverse:')) {\n return false;\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n base58btc.decode(encoded);\n return true;\n } catch {\n return false;\n }\n}\n","import { sign, verify } from './keys.js';\nimport { deriveDID } from './did.js';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface SignedMessage {\n payload: Uint8Array;\n signature: Uint8Array;\n signer: string; // DID\n}\n\n/**\n * Sign a message and return a signed message object\n */\nexport async function signMessage(\n payload: Uint8Array,\n privateKey: Uint8Array,\n publicKey: Uint8Array\n): Promise<SignedMessage> {\n try {\n const signature = await sign(payload, privateKey);\n const signer = deriveDID(publicKey);\n\n return {\n payload,\n signature,\n signer,\n };\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signed message\n */\nexport async function verifyMessage(\n signedMessage: SignedMessage,\n expectedPublicKey: Uint8Array\n): Promise<boolean> {\n try {\n const expectedDID = deriveDID(expectedPublicKey);\n\n if (signedMessage.signer !== expectedDID) {\n return false;\n }\n\n return await verify(\n signedMessage.signature,\n signedMessage.payload,\n expectedPublicKey\n );\n } catch (error) {\n throw new IdentityError('Failed to verify message', error);\n }\n}\n","import { createLibp2p, Libp2p } from 'libp2p';\nimport { tcp } from '@libp2p/tcp';\nimport { webSockets } from '@libp2p/websockets';\nimport { noise } from '@chainsafe/libp2p-noise';\nimport { mplex } from '@libp2p/mplex';\nimport { kadDHT, passthroughMapper } from '@libp2p/kad-dht';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { identify } from '@libp2p/identify';\nimport { ping } from '@libp2p/ping';\nimport {\n circuitRelayTransport,\n circuitRelayServer,\n} from '@libp2p/circuit-relay-v2';\nimport { createLogger } from '../utils/logger.js';\nimport { TransportError } from '../utils/errors.js';\nimport type { KeyPair } from '../identity/keys.js';\nimport type { PrivateKey } from '@libp2p/interface';\n\nconst logger = createLogger('transport');\n\nexport interface TransportConfig {\n keyPair?: KeyPair;\n listenAddresses?: string[];\n bootstrapPeers?: string[];\n enableDHT?: boolean;\n /** Run as a relay server so NAT'd agents can receive messages through this node */\n enableRelay?: boolean;\n /** Reserve a relay slot on bootstrap nodes so others can reach us (only needed for hw1 join) */\n reserveRelaySlot?: boolean;\n /** Enable mDNS local peer discovery (default: false) */\n enableMDNS?: boolean;\n /** libp2p PrivateKey for persistent PeerID (from @libp2p/crypto) */\n privateKey?: PrivateKey;\n}\n\nexport interface ClawiverseNode {\n libp2p: Libp2p;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n getMultiaddrs: () => string[];\n getPeerId: () => string;\n}\n\n/**\n * Create a Clawiverse transport node with libp2p\n */\nexport async function createNode(\n config: TransportConfig\n): Promise<ClawiverseNode> {\n try {\n const {\n listenAddresses = ['/ip4/0.0.0.0/tcp/0', '/ip4/0.0.0.0/tcp/0/ws'], // CVP-0010 §5: Add WebSocket listener\n bootstrapPeers = [],\n enableDHT = true,\n enableRelay = false,\n reserveRelaySlot = false,\n enableMDNS = false,\n privateKey,\n } = config;\n\n // Reserve relay slots by adding p2p-circuit listen addresses (for hw1 join)\n const relayListenAddrs = reserveRelaySlot\n ? bootstrapPeers.map((peer) => `${peer}/p2p-circuit`)\n : [];\n\n const libp2pConfig: any = {\n addresses: {\n listen: [...listenAddresses, ...relayListenAddrs],\n },\n ...(privateKey ? { privateKey } : {}),\n transports: [\n tcp(),\n webSockets(), // CVP-0010 §5: WebSocket for firewall traversal\n circuitRelayTransport(),\n ],\n connectionEncrypters: [noise()],\n streamMuxers: [mplex()],\n connectionManager: {\n minConnections: bootstrapPeers.length > 0 ? 1 : 0,\n maxConnections: 50,\n },\n services: {\n identify: identify(),\n ping: ping(),\n },\n };\n\n if (enableRelay) {\n libp2pConfig.services.relay = circuitRelayServer({\n reservations: {\n maxReservations: 100, // Allow up to 100 concurrent relay reservations\n },\n });\n }\n\n if (enableDHT) {\n libp2pConfig.services.dht = kadDHT({\n clientMode: false,\n peerInfoMapper: passthroughMapper,\n validators: {\n clawiverse: async () => {},\n },\n selectors: {\n clawiverse: () => 0,\n },\n // Optimize for small networks: reduce replication factor and query timeout\n kBucketSize: 20, // Default K=20, keep for compatibility\n querySelfInterval: 30000, // Self-query every 30 seconds (libp2p default)\n // Allow queries to complete faster in small networks\n allowQueryWithZeroPeers: true,\n });\n }\n\n const peerDiscovery: any[] = [];\n if (bootstrapPeers.length > 0) peerDiscovery.push(bootstrap({ list: bootstrapPeers }));\n if (enableMDNS) {\n const { mdns } = await import('@libp2p/mdns');\n peerDiscovery.push(mdns());\n }\n if (peerDiscovery.length > 0) libp2pConfig.peerDiscovery = peerDiscovery;\n\n const libp2p = await createLibp2p(libp2pConfig);\n\n logger.info('Libp2p node created', {\n listenAddresses: libp2pConfig.addresses.listen,\n reserveRelaySlot,\n });\n\n return {\n libp2p,\n start: async () => {\n await libp2p.start();\n logger.info('Node started', {\n peerId: libp2p.peerId.toString(),\n addresses: libp2p.getMultiaddrs().map((ma) => ma.toString()),\n relay: enableRelay,\n reserveRelaySlot,\n });\n },\n stop: async () => {\n await libp2p.stop();\n logger.info('Node stopped');\n },\n getMultiaddrs: () => {\n return libp2p.getMultiaddrs().map((ma) => ma.toString());\n },\n getPeerId: () => {\n return libp2p.peerId.toString();\n },\n };\n } catch (error) {\n throw new TransportError('Failed to create transport node', error);\n }\n}\n","/**\n * @packageDocumentation\n *\n * A [libp2p transport](https://docs.libp2p.io/concepts/transports/overview/) based on [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API).\n *\n * @example\n *\n * ```TypeScript\n * import { createLibp2p } from 'libp2p'\n * import { webSockets } from '@libp2p/websockets'\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const node = await createLibp2p({\n * transports: [\n * webSockets()\n * ]\n * //... other config\n * })\n * await node.start()\n *\n * const ma = multiaddr('/dns4/example.com/tcp/9090/tls/ws')\n * await node.dial(ma)\n * ```\n */\n\nimport { transportSymbol, serviceCapabilities, ConnectionFailedError } from '@libp2p/interface'\nimport { WebSockets as WebSocketsMatcher, WebSocketsSecure } from '@multiformats/multiaddr-matcher'\nimport { multiaddrToUri as toUri } from '@multiformats/multiaddr-to-uri'\nimport { pEvent } from 'p-event'\nimport { CustomProgressEvent } from 'progress-events'\nimport { createListener } from './listener.js'\nimport { webSocketToMaConn } from './websocket-to-conn.js'\nimport type { Transport, CreateListenerOptions, DialTransportOptions, Listener, AbortOptions, ComponentLogger, Logger, Connection, OutboundConnectionUpgradeEvents, Metrics, CounterGroup, Libp2pEvents } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { TypedEventTarget } from 'main-event'\nimport type http from 'node:http'\nimport type https from 'node:https'\nimport type { ProgressEvent } from 'progress-events'\n\nexport interface WebSocketsInit extends AbortOptions {\n /**\n * Options used to create the HTTP server\n */\n http?: http.ServerOptions\n\n /**\n * Options used to create the HTTPs server. `options.http` will be used if\n * unspecified.\n */\n https?: https.ServerOptions\n\n /**\n * How large the outgoing [bufferedAmount](https://websockets.spec.whatwg.org/#dom-websocket-bufferedamount)\n * property of incoming and outgoing websockets is allowed to get in bytes.\n *\n * If this limit is exceeded, backpressure will be applied to the writer.\n *\n * @default 4_194_304\n */\n maxBufferedAmount?: number\n\n /**\n * If the [bufferedAmount](https://websockets.spec.whatwg.org/#dom-websocket-bufferedamount)\n * property of a WebSocket exceeds `maxBufferedAmount`, poll the field every\n * this number of ms to see if the socket can accept new data.\n *\n * @default 500\n */\n bufferedAmountPollInterval?: number\n}\n\nexport interface WebSocketsComponents {\n logger: ComponentLogger\n events: TypedEventTarget<Libp2pEvents>\n metrics?: Metrics\n}\n\nexport interface WebSocketsMetrics {\n dialerEvents: CounterGroup\n}\n\nexport type WebSocketsDialEvents =\n OutboundConnectionUpgradeEvents |\n ProgressEvent<'websockets:open-connection'>\n\nclass WebSockets implements Transport<WebSocketsDialEvents> {\n private readonly log: Logger\n private readonly init: WebSocketsInit\n private readonly logger: ComponentLogger\n private readonly metrics?: WebSocketsMetrics\n private readonly components: WebSocketsComponents\n\n constructor (components: WebSocketsComponents, init: WebSocketsInit = {}) {\n this.log = components.logger.forComponent('libp2p:websockets')\n this.logger = components.logger\n this.components = components\n this.init = init\n\n if (components.metrics != null) {\n this.metrics = {\n dialerEvents: components.metrics.registerCounterGroup('libp2p_websockets_dialer_events_total', {\n label: 'event',\n help: 'Total count of WebSockets dialer events by type'\n })\n }\n }\n }\n\n readonly [transportSymbol] = true\n\n readonly [Symbol.toStringTag] = '@libp2p/websockets'\n\n readonly [serviceCapabilities]: string[] = [\n '@libp2p/transport'\n ]\n\n async dial (ma: Multiaddr, options: DialTransportOptions<WebSocketsDialEvents>): Promise<Connection> {\n this.log('dialing %s', ma)\n options = options ?? {}\n\n const maConn = webSocketToMaConn({\n websocket: await this._connect(ma, options),\n remoteAddr: ma,\n metrics: this.metrics?.dialerEvents,\n direction: 'outbound',\n log: this.components.logger.forComponent('libp2p:websockets:connection'),\n maxBufferedAmount: this.init.maxBufferedAmount,\n bufferedAmountPollInterval: this.init.bufferedAmountPollInterval\n })\n this.log('new outbound connection %s', maConn.remoteAddr)\n\n const conn = await options.upgrader.upgradeOutbound(maConn, options)\n this.log('outbound connection %s upgraded', maConn.remoteAddr)\n return conn\n }\n\n async _connect (ma: Multiaddr, options: DialTransportOptions<WebSocketsDialEvents>): Promise<WebSocket> {\n options?.signal?.throwIfAborted()\n\n const uri = toUri(ma)\n this.log('create websocket connection to %s', uri)\n const websocket = new WebSocket(uri)\n websocket.binaryType = 'arraybuffer'\n\n try {\n options.onProgress?.(new CustomProgressEvent('websockets:open-connection'))\n await pEvent(websocket, 'open', options)\n } catch (err: any) {\n if (options.signal?.aborted) {\n this.metrics?.dialerEvents.increment({ abort: true })\n throw new ConnectionFailedError(`Could not connect to ${uri}`)\n } else {\n this.metrics?.dialerEvents.increment({ error: true })\n }\n\n try {\n websocket.close()\n } catch {}\n\n throw err\n }\n\n this.log('connected %s', ma)\n this.metrics?.dialerEvents.increment({ connect: true })\n return websocket\n }\n\n /**\n * Creates a WebSockets listener. The provided `handler` function will be called\n * anytime a new incoming Connection has been successfully upgraded via\n * `upgrader.upgradeInbound`\n */\n createListener (options: CreateListenerOptions): Listener {\n return createListener({\n logger: this.logger,\n events: this.components.events,\n metrics: this.components.metrics\n }, {\n ...this.init,\n ...options\n })\n }\n\n listenFilter (multiaddrs: Multiaddr[]): Multiaddr[] {\n return multiaddrs.filter(ma => WebSocketsMatcher.exactMatch(ma) || WebSocketsSecure.exactMatch(ma))\n }\n\n dialFilter (multiaddrs: Multiaddr[]): Multiaddr[] {\n return this.listenFilter(multiaddrs)\n }\n}\n\nexport function webSockets (init: WebSocketsInit = {}): (components: WebSocketsComponents) => Transport {\n return (components) => {\n return new WebSockets(components, init)\n }\n}\n","/**\n * @packageDocumentation\n *\n * Exports a `Libp2p` type for modules to use as a type argument.\n *\n * @example\n *\n * ```typescript\n * import type { Libp2p } from '@libp2p/interface'\n *\n * function doSomethingWithLibp2p (node: Libp2p) {\n * // ...\n * }\n * ```\n */\n\nimport type { Connection, NewStreamOptions } from './connection.js'\nimport type { ContentRouting } from './content-routing.js'\nimport type { Ed25519PublicKey, PublicKey, RSAPublicKey, Secp256k1PublicKey } from './keys.js'\nimport type { Metrics } from './metrics.js'\nimport type { Ed25519PeerId, PeerId, RSAPeerId, Secp256k1PeerId, URLPeerId } from './peer-id.js'\nimport type { PeerInfo } from './peer-info.js'\nimport type { PeerRouting } from './peer-routing.js'\nimport type { Address, Peer, PeerStore } from './peer-store.js'\nimport type { Startable } from './startable.js'\nimport type { StreamHandler, StreamHandlerOptions, StreamMiddleware } from './stream-handler.js'\nimport type { Stream } from './stream.js'\nimport type { Topology } from './topology.js'\nimport type { Listener, OutboundConnectionUpgradeEvents } from './transport.js'\nimport type { DNS } from '@multiformats/dns'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { TypedEventTarget } from 'main-event'\nimport type { ProgressOptions, ProgressEvent } from 'progress-events'\n\n/**\n * Used by the connection manager to sort addresses into order before dialling\n */\nexport interface AddressSorter {\n (a: Address, b: Address): -1 | 0 | 1\n}\n\n/**\n * Event detail emitted when peer data changes\n */\nexport interface PeerUpdate {\n peer: Peer\n previous?: Peer\n}\n\n/**\n * Peer data signed by the remote Peer's public key\n */\nexport interface SignedPeerRecord {\n addresses: Multiaddr[]\n seq: bigint\n}\n\n/**\n * A certificate that can be used to secure connections\n */\nexport interface TLSCertificate {\n /**\n * The private key that corresponds to the certificate in PEM format\n */\n key: string\n\n /**\n * The certificate chain in PEM format\n */\n cert: string\n}\n\n/**\n * Data returned from a successful identify response\n */\nexport interface IdentifyResult {\n /**\n * The remote Peer's PeerId\n */\n peerId: PeerId\n\n /**\n * The unsigned addresses they are listening on. Note - any multiaddrs present\n * in the signed peer record should be preferred to the value here.\n */\n listenAddrs: Multiaddr[]\n\n /**\n * The protocols the remote peer supports\n */\n protocols: string[]\n\n /**\n * The remote protocol version\n */\n protocolVersion?: string\n\n /**\n * The remote agent version\n */\n agentVersion?: string\n\n /**\n * The public key part of the remote PeerId - this is only useful for older\n * RSA-based PeerIds, the more modern Ed25519 and secp256k1 types have the\n * public key embedded in them\n */\n publicKey?: Uint8Array\n\n /**\n * If set this is the address that the remote peer saw the identify request\n * originate from\n */\n observedAddr?: Multiaddr\n\n /**\n * If sent by the remote peer this is the deserialized signed peer record\n */\n signedPeerRecord?: SignedPeerRecord\n\n /**\n * The connection that the identify protocol ran over\n */\n connection: Connection\n}\n\n/**\n * Logger component for libp2p\n */\nexport interface Logger {\n /**\n * Log a message\n */\n (formatter: any, ...args: any[]): void\n\n /**\n * Log an error message\n */\n error(formatter: any, ...args: any[]): void\n\n /**\n * Log a trace message\n */\n trace(formatter: any, ...args: any[]): void\n\n /**\n * `true` if this logger is enabled\n */\n enabled: boolean\n\n /**\n * Create a logger scoped below this one\n *\n * @example\n *\n * ```ts\n * import { defaultLogger } from '@libp2p/logger'\n *\n * const log = defaultLogger().forComponent('foo')\n *\n * log('hello')\n * // foo hello\n *\n * const subLog = log.newScope('bar')\n *\n * subLog('hello')\n * // foo:bar hello\n * ```\n */\n newScope(name: string): Logger\n}\n\n/**\n * Peer logger component for libp2p. This can be used to create loggers that are\n * scoped to individual system components or services.\n *\n * To see logs, run your app with `DEBUG` set as an env var or for browsers, in\n * `localStorage`:\n *\n * ```console\n * $ DEBUG=libp2p* node index.js\n * libp2p:my-service hello +0ms\n * ```\n */\nexport interface ComponentLogger {\n /**\n * Returns a logger for the specified component.\n *\n * @example\n *\n * ```TypeScript\n * import { ComponentLogger, Logger } from '@libp2p/interface'\n *\n * interface MyServiceComponents {\n * logger: ComponentLogger\n * }\n *\n * class MyService {\n * private readonly log: Logger\n *\n * constructor (components) {\n * this.log = components.logger.forComponent('libp2p:my-service')\n *\n * this.log('hello')\n * // logs:\n * // libp2p:my-service hello +0ms\n * }\n * }\n * ```\n */\n forComponent(name: string): Logger\n}\n\nexport interface MultiaddrResolveOptions extends AbortOptions, LoggerOptions {\n /**\n * An optional DNS resolver\n */\n dns?: DNS\n}\n\n/**\n * `MultiaddrResolver`s perform resolution of multiaddr components that require\n * translation by external systems (for example DNSADDR to TXT records).\n */\nexport interface MultiaddrResolver {\n /**\n * Returns true if this resolver can resolve components of this multiaddr\n */\n canResolve (address: Multiaddr): boolean\n\n /**\n * Returns one or more multiaddrs with components resolved to other values\n */\n resolve (address: Multiaddr, options: MultiaddrResolveOptions): Promise<Multiaddr[]>\n}\n\n/**\n * Once you have a libp2p instance, you can listen to several events it emits,\n * so that you can be notified of relevant network events.\n *\n * Event names are `noun:verb` so the first part is the name of the object\n * being acted on and the second is the action.\n */\nexport interface Libp2pEvents<T extends ServiceMap = ServiceMap> {\n /**\n * This event is dispatched when a new network peer is discovered.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.addEventListener('peer:discovery', (event) => {\n * const peerInfo = event.detail\n * // ...\n * })\n * ```\n */\n 'peer:discovery': CustomEvent<PeerInfo>\n\n /**\n * This event will be triggered any time a new peer connects.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.addEventListener('peer:connect', (event) => {\n * const peerId = event.detail\n * // ...\n * })\n * ```\n */\n 'peer:connect': CustomEvent<PeerId>\n\n /**\n * This event will be triggered any time we are disconnected from another\n * peer, regardless of the circumstances of that disconnection. If we happen\n * to have multiple connections to a peer, this event will **only** be\n * triggered when the last connection is closed.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.addEventListener('peer:disconnect', (event) => {\n * const peerId = event.detail\n * // ...\n * })\n * ```\n */\n 'peer:disconnect': CustomEvent<PeerId>\n\n /**\n * When a peer tagged with `keep-alive` disconnects, we will make multiple\n * attempts to reconnect to it with a backoff factor (see the connection\n * manager settings for details). If these all fail, the `keep-alive` tag will\n * be removed and this event will be emitted.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.addEventListener('peer:reconnect-failure', (event) => {\n * const peerId = event.detail\n * // ...\n * })\n * ```\n */\n 'peer:reconnect-failure': CustomEvent<PeerId>\n\n /**\n * This event is dispatched after a remote peer has successfully responded to\n * the identify protocol. Note that for this to be emitted, both peers must\n * have an identify service configured.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.addEventListener('peer:identify', (event) => {\n * const identifyResult = event.detail\n * // ...\n * })\n * ```\n */\n 'peer:identify': CustomEvent<IdentifyResult>\n\n /**\n * This event is dispatched when the peer store data for a peer has been\n * updated - e.g. their multiaddrs, protocols etc have changed.\n *\n * If they were previously known to this node, the old peer data will be\n * set in the `previous` field.\n *\n * This may be in response to the identify protocol running, a manual\n * update or some other event.\n */\n 'peer:update': CustomEvent<PeerUpdate>\n\n /**\n * This event is dispatched when the current node's peer record changes -\n * for example a transport started listening on a new address or a new\n * protocol handler was registered.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.addEventListener('self:peer:update', (event) => {\n * const { peer } = event.detail\n * // ...\n * })\n * ```\n */\n 'self:peer:update': CustomEvent<PeerUpdate>\n\n /**\n * This event is dispatched when a transport begins listening on a new address\n */\n 'transport:listening': CustomEvent<Listener>\n\n /**\n * This event is dispatched when a transport stops listening on an address\n */\n 'transport:close': CustomEvent<Listener>\n\n /**\n * This event is dispatched when the connection manager has more than the\n * configured allowable max connections and has closed some connections to\n * bring the node back under the limit.\n */\n 'connection:prune': CustomEvent<Connection[]>\n\n /**\n * This event notifies listeners when new incoming or outgoing connections\n * are opened.\n */\n 'connection:open': CustomEvent<Connection>\n\n /**\n * This event notifies listeners when incoming or outgoing connections are\n * closed.\n */\n 'connection:close': CustomEvent<Connection>\n\n /**\n * This event notifies listeners that a TLS certificate is available for use\n */\n 'certificate:provision': CustomEvent<TLSCertificate>\n\n /**\n * This event notifies listeners that a new TLS certificate is available for\n * use. Any previous certificate may no longer be valid.\n */\n 'certificate:renew': CustomEvent<TLSCertificate>\n\n /**\n * This event notifies listeners that the node has started\n *\n * ```TypeScript\n * libp2p.addEventListener('start', (event) => {\n * console.info(libp2p.isStarted()) // true\n * })\n * ```\n */\n start: CustomEvent<Libp2p<T>>\n\n /**\n * This event notifies listeners that the node has stopped\n *\n * ```TypeScript\n * libp2p.addEventListener('stop', (event) => {\n * console.info(libp2p.isStarted()) // false\n * })\n * ```\n */\n stop: CustomEvent<Libp2p<T>>\n}\n\n/**\n * A map of user defined services available on the libp2p node via the\n * `services` key\n *\n * @example\n *\n * ```TypeScript\n * const node = await createLibp2p({\n * // ...other options\n * services: {\n * myService: myService({\n * // ...service options\n * })\n * }\n * })\n *\n * // invoke methods on the service\n * node.services.myService.anOperation()\n * ```\n */\nexport type ServiceMap = Record<string, unknown>\n\nexport type PendingDialStatus = 'queued' | 'active' | 'error' | 'success'\n\n/**\n * An item in the dial queue\n */\nexport interface PendingDial {\n /**\n * A unique identifier for this dial\n */\n id: string\n\n /**\n * The current status of the dial\n */\n status: PendingDialStatus\n\n /**\n * If known, this is the peer id that libp2p expects to be dialling\n */\n peerId?: PeerId\n\n /**\n * The list of multiaddrs that will be dialled. The returned connection will\n * use the first address that succeeds, all other dials part of this pending\n * dial will be cancelled.\n */\n multiaddrs: Multiaddr[]\n}\n\nexport type Libp2pStatus = 'starting' | 'started' | 'stopping' | 'stopped'\n\nexport interface IsDialableOptions extends AbortOptions {\n /**\n * If the dial attempt would open a protocol, and the multiaddr being dialed\n * is a circuit relay address, passing true here would cause the test to fail\n * because that protocol would not be allowed to run over a data/time limited\n * connection.\n */\n runOnLimitedConnection?: boolean\n}\n\nexport type TransportManagerDialProgressEvents =\n ProgressEvent<'transport-manager:selected-transport', string>\n\nexport type OpenConnectionProgressEvents =\n TransportManagerDialProgressEvents |\n ProgressEvent<'dial-queue:already-connected'> |\n ProgressEvent<'dial-queue:already-in-dial-queue'> |\n ProgressEvent<'dial-queue:add-to-dial-queue'> |\n ProgressEvent<'dial-queue:start-dial'> |\n ProgressEvent<'dial-queue:calculated-addresses', Address[]> |\n OutboundConnectionUpgradeEvents\n\nexport interface DialOptions extends AbortOptions, ProgressOptions {\n /**\n * If true, open a new connection to the remote even if one already exists\n */\n force?: boolean\n}\n\nexport interface DialProtocolOptions extends NewStreamOptions {\n\n}\n\n/**\n * Libp2p nodes implement this interface.\n */\nexport interface Libp2p<T extends ServiceMap = ServiceMap> extends Startable, TypedEventTarget<Libp2pEvents<T>> {\n /**\n * The PeerId is a unique identifier for a node on the network.\n *\n * It is the hash of an RSA public key or, for Ed25519 or secp256k1 keys,\n * the key itself.\n *\n * @example\n *\n * ```TypeScript\n * console.info(libp2p.peerId)\n * // PeerId(12D3Foo...)\n * ````\n */\n peerId: PeerId\n\n /**\n * The peer store holds information we know about other peers on the network.\n * - multiaddrs, supported protocols, etc.\n *\n * @example\n *\n * ```TypeScript\n * const peer = await libp2p.peerStore.get(peerId)\n * console.info(peer)\n * // { id: PeerId(12D3Foo...), addresses: [] ... }\n * ```\n */\n peerStore: PeerStore\n\n /**\n * The peer routing subsystem allows the user to find peers on the network\n * or to find peers close to binary keys.\n *\n * @example\n *\n * ```TypeScript\n * const peerInfo = await libp2p.peerRouting.findPeer(peerId)\n * console.info(peerInfo)\n * // { id: PeerId(12D3Foo...), multiaddrs: [] ... }\n * ```\n *\n * @example\n *\n * ```TypeScript\n * for await (const peerInfo of libp2p.peerRouting.getClosestPeers(key)) {\n * console.info(peerInfo)\n * // { id: PeerId(12D3Foo...), multiaddrs: [] ... }\n * }\n * ```\n */\n peerRouting: PeerRouting\n\n /**\n * The content routing subsystem allows the user to find providers for content,\n * let the network know they are providers for content, and get/put values to\n * the DHT.\n *\n * @example\n *\n * ```TypeScript\n * for await (const peerInfo of libp2p.contentRouting.findProviders(cid)) {\n * console.info(peerInfo)\n * // { id: PeerId(12D3Foo...), multiaddrs: [] ... }\n * }\n * ```\n */\n contentRouting: ContentRouting\n\n /**\n * The metrics subsystem allows recording values to assess the health/performance\n * of the running node.\n *\n * @example\n *\n * ```TypeScript\n * const metric = libp2p.metrics.registerMetric({\n * 'my-metric'\n * })\n *\n * // later\n * metric.update(5)\n * ```\n */\n metrics?: Metrics\n\n /**\n * The logger used by this libp2p node\n */\n logger: ComponentLogger\n\n /**\n * The current status of the libp2p node\n */\n status: Libp2pStatus\n\n /**\n * Get a deduplicated list of peer advertising multiaddrs by concatenating\n * the listen addresses used by transports with any configured\n * announce addresses as well as observed addresses reported by peers.\n *\n * If Announce addrs are specified, configured listen addresses will be\n * ignored though observed addresses will still be included.\n *\n * @example\n *\n * ```TypeScript\n * const listenMa = libp2p.getMultiaddrs()\n * // [ <Multiaddr 047f00000106f9ba - /ip4/127.0.0.1/tcp/63930> ]\n * ```\n */\n getMultiaddrs(): Multiaddr[]\n\n /**\n * Returns a list of supported protocols\n *\n * @example\n *\n * ```TypeScript\n * const protocols = libp2p.getProtocols()\n * // [ '/ipfs/ping/1.0.0', '/ipfs/id/1.0.0' ]\n * ```\n */\n getProtocols(): string[]\n\n /**\n * Return a list of all connections this node has open, optionally filtering\n * by a PeerId\n *\n * @example\n *\n * ```TypeScript\n * for (const connection of libp2p.getConnections()) {\n * console.log(peerId, connection.remoteAddr.toString())\n * // Logs the PeerId string and the observed remote multiaddr of each Connection\n * }\n * ```\n */\n getConnections(peerId?: PeerId): Connection[]\n\n /**\n * Return the list of dials currently in progress or queued to start\n *\n * @example\n *\n * ```TypeScript\n * for (const pendingDial of libp2p.getDialQueue()) {\n * console.log(pendingDial)\n * }\n * ```\n */\n getDialQueue(): PendingDial[]\n\n /**\n * Return a list of all peers we currently have a connection open to\n */\n getPeers(): PeerId[]\n\n /**\n * Dials to the provided peer. If successful, the known metadata of the\n * peer will be added to the nodes `peerStore`.\n *\n * If a PeerId is passed as the first argument, the peer will need to have known multiaddrs for it in the PeerStore.\n *\n * @example\n *\n * ```TypeScript\n * const conn = await libp2p.dial(remotePeerId)\n *\n * // create a new stream within the connection\n * const stream = await conn.newStream(['/echo/1.1.0', '/echo/1.0.0'])\n *\n * // protocol negotiated: 'echo/1.0.0' means that the other party only supports the older version\n *\n * // ...\n * await conn.close()\n * ```\n */\n dial(peer: PeerId | Multiaddr | Multiaddr[], options?: DialOptions): Promise<Connection>\n\n /**\n * Dials to the provided peer and tries to handshake with the given protocols in order.\n * If successful, the known metadata of the peer will be added to the nodes `peerStore`,\n * and the `MuxedStream` will be returned together with the successful negotiated protocol.\n *\n * @example\n *\n * ```TypeScript\n * import { pipe } from 'it-pipe'\n *\n * const { stream, protocol } = await libp2p.dialProtocol(remotePeerId, protocols)\n *\n * // Use this new stream like any other duplex stream\n * pipe([1, 2, 3], stream, consume)\n * ```\n */\n dialProtocol(peer: PeerId | Multiaddr | Multiaddr[], protocols: string | string[], options?: DialProtocolOptions): Promise<Stream>\n\n /**\n * Attempts to gracefully close an open connection to the given peer. If the\n * connection is not closed in the grace period, it will be forcefully closed.\n *\n * An AbortSignal can optionally be passed to control when the connection is\n * forcefully closed.\n *\n * @example\n *\n * ```TypeScript\n * await libp2p.hangUp(remotePeerId)\n * ```\n */\n hangUp(peer: PeerId | Multiaddr, options?: AbortOptions): Promise<void>\n\n /**\n * Sets up [multistream-select routing](https://github.com/multiformats/multistream-select) of protocols to their application handlers. Whenever a stream is opened on one of the provided protocols, the handler will be called. `handle` must be called in order to register a handler and support for a given protocol. This also informs other peers of the protocols you support.\n *\n * `libp2p.handle(protocols, handler, options)`\n *\n * In the event of a new handler for the same protocol being added and error\n * will be thrown. Pass `force: true` to override this.\n *\n * @example\n *\n * ```TypeScript\n * const handler = ({ connection, stream, protocol }) => {\n * // use stream or connection according to the needs\n * }\n *\n * libp2p.handle('/echo/1.0.0', handler, {\n * maxInboundStreams: 5,\n * maxOutboundStreams: 5\n * })\n * ```\n */\n handle(protocol: string | string[], handler: StreamHandler, options?: StreamHandlerOptions): Promise<void>\n\n /**\n * Removes the handler for each protocol. The protocol\n * will no longer be supported on streams.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.unhandle(['/echo/1.0.0'])\n * ```\n */\n unhandle(protocols: string[] | string, options?: AbortOptions): Promise<void>\n\n /**\n * Register a topology to be informed when peers are encountered that\n * support the specified protocol\n *\n * @example\n *\n * ```TypeScript\n * const id = await libp2p.register('/echo/1.0.0', {\n * onConnect: (peer, connection) => {\n * // handle connect\n * },\n * onDisconnect: (peer, connection) => {\n * // handle disconnect\n * }\n * })\n * ```\n */\n register(protocol: string, topology: Topology, options?: AbortOptions): Promise<string>\n\n /**\n * Unregister topology to no longer be informed when peers connect or\n * disconnect.\n *\n * @example\n *\n * ```TypeScript\n * const id = await libp2p.register(...)\n *\n * libp2p.unregister(id)\n * ```\n */\n unregister(id: string): void\n\n /**\n * Registers one or more middleware implementations that will be invoked for\n * incoming and outgoing protocol streams that match the passed protocol.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.use('/my/protocol/1.0.0', (stream, connection, next) => {\n * // do something with stream and/or connection\n * next(stream, connection)\n * })\n * ```\n */\n use (protocol: string, middleware: StreamMiddleware | StreamMiddleware[]): void\n\n /**\n * Deregisters all middleware for the passed protocol.\n *\n * @example\n *\n * ```TypeScript\n * libp2p.unuse('/my/protocol/1.0.0')\n * // any previously registered middleware will no longer be invoked\n * ```\n */\n unuse (protocol: string): void\n\n /**\n * Returns the public key for the passed PeerId. If the PeerId is of the 'RSA'\n * type this may mean searching the routing if the peer's key is not present\n * in the peer store.\n */\n getPublicKey(peer: Ed25519PeerId, options?: AbortOptions): Promise<Ed25519PublicKey>\n getPublicKey(peer: Secp256k1PeerId, options?: AbortOptions): Promise<Secp256k1PublicKey>\n getPublicKey(peer: RSAPeerId, options?: AbortOptions): Promise<RSAPublicKey>\n getPublicKey(peer: URLPeerId, options?: AbortOptions): Promise<never>\n getPublicKey(peer: PeerId, options?: AbortOptions): Promise<PublicKey>\n\n /**\n * Given the current node configuration, returns a promise of `true` or\n * `false` if the node would attempt to dial the passed multiaddr.\n *\n * This means a relevant transport is configured, and the connection gater\n * would not block the dial attempt.\n *\n * This may involve resolving DNS addresses so you should pass an AbortSignal.\n */\n isDialable(multiaddr: Multiaddr | Multiaddr[], options?: IsDialableOptions): Promise<boolean>\n\n /**\n * A set of user defined services\n */\n services: T\n}\n\n/**\n * Metadata about the current node\n */\nexport interface NodeInfo {\n /**\n * The implementation name\n */\n name: string\n\n /**\n * The implementation version\n */\n version: string\n\n /**\n * A string that contains information about the implementation and runtime\n */\n userAgent: string\n}\n\n/**\n * An object that contains an AbortSignal as\n * the optional `signal` property.\n *\n * @example\n *\n * ```TypeScript\n * const controller = new AbortController()\n *\n * aLongRunningOperation({\n * signal: controller.signal\n * })\n *\n * // later\n *\n * controller.abort()\n */\nexport interface AbortOptions {\n signal?: AbortSignal\n}\n\n/**\n * An object that contains a Logger as the `log` property.\n */\nexport interface LoggerOptions {\n log: Logger\n}\n\n/**\n * An object that includes a trace object that is passed onwards.\n *\n * This is used by metrics method tracing to link function calls together.\n */\nexport interface TraceOptions {\n trace?: any\n}\n\n/**\n * A signal that needs to be cleared when no longer in use\n */\nexport interface ClearableSignal extends AbortSignal {\n clear(): void\n}\n\n/**\n * When a routing operation involves reading values, these options allow\n * controlling where the values are read from. By default libp2p will check\n * local caches but may not use the network if a valid local value is found,\n * these options allow tuning that behavior.\n */\nexport interface RoutingOptions extends AbortOptions, ProgressOptions, TraceOptions {\n /**\n * Pass `false` to not use the network\n *\n * @default true\n */\n useNetwork?: boolean\n\n /**\n * Pass `false` to not use cached values\n *\n * @default true\n */\n useCache?: boolean\n}\n\n/**\n * This symbol is used by libp2p services to define the capabilities they can\n * provide to other libp2p services.\n *\n * The service should define a property with this symbol as the key and the\n * value should be a string array of provided capabilities.\n */\nexport const serviceCapabilities = Symbol.for('@libp2p/service-capabilities')\n\n/**\n * This symbol is used by libp2p services to define the capabilities they\n * require from other libp2p services.\n *\n * The service should define a property with this symbol as the key and the\n * value should be a string array of required capabilities.\n */\nexport const serviceDependencies = Symbol.for('@libp2p/service-dependencies')\n\nexport * from './connection.js'\nexport * from './connection-encrypter.js'\nexport * from './connection-gater.js'\nexport * from './connection-protector.js'\nexport * from './content-routing.js'\nexport * from './errors.js'\nexport * from './events.js'\nexport * from './keys.js'\nexport * from './message-stream.js'\nexport * from './metrics.js'\nexport * from './multiaddr-connection.js'\nexport * from './peer-discovery.js'\nexport * from './peer-id.js'\nexport * from './peer-info.js'\nexport * from './peer-routing.js'\nexport * from './peer-store.js'\nexport * from './record.js'\nexport * from './startable.js'\nexport * from './stream-handler.js'\nexport * from './stream-muxer.js'\nexport * from './stream.js'\nexport * from './topology.js'\nexport * from './transport.js'\n\nexport * from 'main-event'\n","/**\n * When this error is thrown it means an operation was aborted,\n * usually in response to the `abort` event being emitted by an\n * AbortSignal.\n */\nexport class AbortError extends Error {\n static name = 'AbortError'\n\n constructor (message: string = 'The operation was aborted') {\n super(message)\n this.name = 'AbortError'\n }\n}\n\n/**\n * Thrown when a remote Peer ID does not match the expected one\n */\nexport class UnexpectedPeerError extends Error {\n static name = 'UnexpectedPeerError'\n\n constructor (message = 'Unexpected Peer') {\n super(message)\n this.name = 'UnexpectedPeerError'\n }\n}\n\n/**\n * Thrown when a crypto exchange fails\n */\nexport class InvalidCryptoExchangeError extends Error {\n static name = 'InvalidCryptoExchangeError'\n\n constructor (message = 'Invalid crypto exchange') {\n super(message)\n this.name = 'InvalidCryptoExchangeError'\n }\n}\n\n/**\n * Thrown when invalid parameters are passed to a function or method call\n */\nexport class InvalidParametersError extends Error {\n static name = 'InvalidParametersError'\n\n constructor (message = 'Invalid parameters') {\n super(message)\n this.name = 'InvalidParametersError'\n }\n}\n\n/**\n * Thrown when a public key is invalid\n */\nexport class InvalidPublicKeyError extends Error {\n static name = 'InvalidPublicKeyError'\n\n constructor (message = 'Invalid public key') {\n super(message)\n this.name = 'InvalidPublicKeyError'\n }\n}\n\n/**\n * Thrown when a private key is invalid\n */\nexport class InvalidPrivateKeyError extends Error {\n static name = 'InvalidPrivateKeyError'\n\n constructor (message = 'Invalid private key') {\n super(message)\n this.name = 'InvalidPrivateKeyError'\n }\n}\n\n/**\n * Thrown when a operation is unsupported\n */\nexport class UnsupportedOperationError extends Error {\n static name = 'UnsupportedOperationError'\n\n constructor (message = 'Unsupported operation') {\n super(message)\n this.name = 'UnsupportedOperationError'\n }\n}\n\n/**\n * Thrown when a connection is closing\n */\nexport class ConnectionClosingError extends Error {\n static name = 'ConnectionClosingError'\n\n constructor (message = 'The connection is closing') {\n super(message)\n this.name = 'ConnectionClosingError'\n }\n}\n\n/**\n * Thrown when a connection is closed\n */\nexport class ConnectionClosedError extends Error {\n static name = 'ConnectionClosedError'\n\n constructor (message = 'The connection is closed') {\n super(message)\n this.name = 'ConnectionClosedError'\n }\n}\n\n/**\n * Thrown when a connection fails\n */\nexport class ConnectionFailedError extends Error {\n static name = 'ConnectionFailedError'\n\n constructor (message = 'Connection failed') {\n super(message)\n this.name = 'ConnectionFailedError'\n }\n}\n\n/**\n * Thrown when the muxer is closed and an attempt to open a stream occurs\n */\nexport class MuxerClosedError extends Error {\n static name = 'MuxerClosedError'\n\n constructor (message = 'The muxer is closed') {\n super(message)\n this.name = 'MuxerClosedError'\n }\n}\n\n/**\n * Thrown when a protocol stream is reset by the remote muxer\n */\nexport class StreamResetError extends Error {\n static name = 'StreamResetError'\n\n constructor (message = 'The stream has been reset') {\n super(message)\n this.name = 'StreamResetError'\n }\n}\n\n/**\n * Thrown when a protocol stream is aborted locally\n */\nexport class StreamAbortedError extends Error {\n static name = 'StreamAbortedError'\n\n constructor (message = 'The stream has been aborted') {\n super(message)\n this.name = 'StreamAbortedError'\n }\n}\n\n/**\n * Thrown when a stream is in an invalid state\n */\nexport class StreamStateError extends Error {\n static name = 'StreamStateError'\n\n constructor (message = 'The stream is in an invalid state') {\n super(message)\n this.name = 'StreamStateError'\n }\n}\n\n/**\n * Thrown when a stream buffer is full\n */\nexport class StreamBufferError extends Error {\n static name = 'StreamBufferError'\n\n constructor (message = 'The stream buffer was full') {\n super(message)\n this.name = 'StreamBufferError'\n }\n}\n\n/**\n * Thrown when a value could not be found\n */\nexport class NotFoundError extends Error {\n static name = 'NotFoundError'\n\n constructor (message = 'Not found') {\n super(message)\n this.name = 'NotFoundError'\n }\n}\n\n/**\n * Thrown when an invalid peer ID is encountered\n */\nexport class InvalidPeerIdError extends Error {\n static name = 'InvalidPeerIdError'\n\n constructor (message = 'Invalid PeerID') {\n super(message)\n this.name = 'InvalidPeerIdError'\n }\n}\n\n/**\n * Thrown when an invalid multiaddr is encountered\n */\nexport class InvalidMultiaddrError extends Error {\n static name = 'InvalidMultiaddrError'\n\n constructor (message = 'Invalid multiaddr') {\n super(message)\n this.name = 'InvalidMultiaddrError'\n }\n}\n\n/**\n * Thrown when an invalid CID is encountered\n */\nexport class InvalidCIDError extends Error {\n static name = 'InvalidCIDError'\n\n constructor (message = 'Invalid CID') {\n super(message)\n this.name = 'InvalidCIDError'\n }\n}\n\n/**\n * Thrown when an invalid multihash is encountered\n */\nexport class InvalidMultihashError extends Error {\n static name = 'InvalidMultihashError'\n\n constructor (message = 'Invalid Multihash') {\n super(message)\n this.name = 'InvalidMultihashError'\n }\n}\n\n/**\n * Thrown when a protocol is not supported\n */\nexport class UnsupportedProtocolError extends Error {\n static name = 'UnsupportedProtocolError'\n\n constructor (message = 'Unsupported protocol error') {\n super(message)\n this.name = 'UnsupportedProtocolError'\n }\n}\n\n/**\n * An invalid or malformed message was encountered during a protocol exchange\n */\nexport class InvalidMessageError extends Error {\n static name = 'InvalidMessageError'\n\n constructor (message = 'Invalid message') {\n super(message)\n this.name = 'InvalidMessageError'\n }\n}\n\n/**\n * Thrown when a remote peer sends a structurally valid message that does not\n * comply with the protocol\n */\nexport class ProtocolError extends Error {\n static name = 'ProtocolError'\n\n constructor (message = 'Protocol error') {\n super(message)\n this.name = 'ProtocolError'\n }\n}\n\n/**\n * Throw when an operation times out\n */\nexport class TimeoutError extends Error {\n static name = 'TimeoutError'\n\n constructor (message = 'Timed out') {\n super(message)\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Thrown when a startable component is interacted with but it has not been\n * started yet\n */\nexport class NotStartedError extends Error {\n static name = 'NotStartedError'\n\n constructor (message = 'Not started') {\n super(message)\n this.name = 'NotStartedError'\n }\n}\n\n/**\n * Thrown when a component is started that has already been started\n */\nexport class AlreadyStartedError extends Error {\n static name = 'AlreadyStartedError'\n\n constructor (message = 'Already started') {\n super(message)\n this.name = 'AlreadyStartedError'\n }\n}\n\n/**\n * Thrown when dialing an address failed\n */\nexport class DialError extends Error {\n static name = 'DialError'\n\n constructor (message = 'Dial error') {\n super(message)\n this.name = 'DialError'\n }\n}\n\n/**\n * Thrown when listening on an address failed\n */\nexport class ListenError extends Error {\n static name = 'ListenError'\n\n constructor (message = 'Listen error') {\n super(message)\n this.name = 'ListenError'\n }\n}\n\n/**\n * This error is thrown when a limited connection is encountered, i.e. if the\n * user tried to open a stream on a connection for a protocol that is not\n * configured to run over limited connections.\n */\nexport class LimitedConnectionError extends Error {\n static name = 'LimitedConnectionError'\n\n constructor (message = 'Limited connection') {\n super(message)\n this.name = 'LimitedConnectionError'\n }\n}\n\n/**\n * This error is thrown where there are too many inbound protocols streams open\n */\nexport class TooManyInboundProtocolStreamsError extends Error {\n static name = 'TooManyInboundProtocolStreamsError'\n\n constructor (message = 'Too many inbound protocol streams') {\n super(message)\n this.name = 'TooManyInboundProtocolStreamsError'\n }\n}\n\n/**\n * This error is thrown where there are too many outbound protocols streams open\n */\nexport class TooManyOutboundProtocolStreamsError extends Error {\n static name = 'TooManyOutboundProtocolStreamsError'\n\n constructor (message = 'Too many outbound protocol streams') {\n super(message)\n this.name = 'TooManyOutboundProtocolStreamsError'\n }\n}\n\n/**\n * Thrown when an attempt to operate on an unsupported key was made\n */\nexport class UnsupportedKeyTypeError extends Error {\n static name = 'UnsupportedKeyTypeError'\n\n constructor (message = 'Unsupported key type') {\n super(message)\n this.name = 'UnsupportedKeyTypeError'\n }\n}\n\n/**\n * Thrown when an operation has not been implemented\n */\nexport class NotImplementedError extends Error {\n static name = 'NotImplementedError'\n\n constructor (message = 'Not implemented') {\n super(message)\n this.name = 'NotImplementedError'\n }\n}\n","import type { Uint8ArrayList } from 'uint8arraylist'\n\n/**\n * A custom implementation of MessageEvent as the Undici version does too much\n * validation in it's constructor so is very slow.\n */\nexport class StreamMessageEvent extends Event {\n public data: Uint8Array | Uint8ArrayList\n\n constructor (data: Uint8Array | Uint8ArrayList, eventInitDict?: EventInit) {\n super('message', eventInitDict)\n\n this.data = data\n }\n}\n\n/**\n * An event dispatched when the stream is closed. The `error` property can be\n * inspected to discover if the closing was graceful or not, and the `remote`\n * property shows which end of the stream initiated the closure\n */\nexport class StreamCloseEvent extends Event {\n public error?: Error\n public local?: boolean\n\n constructor (local?: boolean, error?: Error, eventInitDict?: EventInit) {\n super('close', eventInitDict)\n\n this.error = error\n this.local = local\n }\n}\n\nexport class StreamAbortEvent extends StreamCloseEvent {\n constructor (error: Error, eventInitDict?: EventInit) {\n super(true, error, eventInitDict)\n }\n}\n\nexport class StreamResetEvent extends StreamCloseEvent {\n constructor (error: Error, eventInitDict?: EventInit) {\n super(false, error, eventInitDict)\n }\n}\n","import type { AbortOptions, ClearableSignal, ConnectionEncrypter, MultiaddrConnection, Connection, ConnectionLimits, StreamMuxerFactory, PeerId } from './index.js'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { TypedEventTarget } from 'main-event'\nimport type { ProgressOptions, ProgressEvent } from 'progress-events'\n\nexport interface ListenerEvents {\n /**\n * This event signals to the transport manager that the listening addresses\n * have changed and may be emitted at any point and/or multiple times\n */\n listening: CustomEvent\n\n /**\n * Emitted if listening on an address failed\n */\n error: CustomEvent<Error>\n\n /**\n * Emitted when the listener has been shut down, has no open connections and\n * will no longer accept new connections\n */\n close: CustomEvent\n}\n\nexport interface Listener extends TypedEventTarget<ListenerEvents> {\n /**\n * Start a listener\n */\n listen(multiaddr: Multiaddr): Promise<void>\n\n /**\n * Get listen addresses\n */\n getAddrs(): Multiaddr[]\n\n /**\n * Close listener\n *\n * @returns {Promise<void>}\n */\n close(): Promise<void>\n\n /**\n * Allows transports to amend announce addresses - to add certificate hashes\n * or other metadata that cannot be known before runtime\n */\n updateAnnounceAddrs(addrs: Multiaddr[]): void\n}\n\nexport const transportSymbol = Symbol.for('@libp2p/transport')\n\n/**\n * A filter that acts on a list of multiaddrs\n */\nexport interface MultiaddrFilter {\n (multiaddrs: Multiaddr[]): Multiaddr[]\n}\n\nexport interface CreateListenerOptions {\n /**\n * The upgrader turns a MultiaddrConnection into a Connection and notifies\n * other libp2p components about a new incoming connection.\n */\n upgrader: Upgrader\n}\n\nexport interface DialTransportOptions<DialEvents extends ProgressEvent = ProgressEvent> extends Required<AbortOptions>, ProgressOptions<DialEvents> {\n /**\n * The upgrader turns a MultiaddrConnection into a Connection which should be\n * returned by the transport's dial method\n */\n upgrader: Upgrader\n}\n\n/**\n * A libp2p transport offers dial and listen methods to establish connections.\n */\nexport interface Transport<DialEvents extends ProgressEvent = ProgressEvent> {\n /**\n * Used to identify the transport\n */\n [Symbol.toStringTag]: string\n\n /**\n * Used by the isTransport function\n */\n [transportSymbol]: true\n\n /**\n * Dial a given multiaddr.\n */\n dial(ma: Multiaddr, options: DialTransportOptions<DialEvents>): Promise<Connection>\n\n /**\n * Create transport listeners.\n */\n createListener(options: CreateListenerOptions): Listener\n\n /**\n * Takes a list of `Multiaddr`s and returns only addresses that are valid for\n * the transport to listen on\n */\n listenFilter: MultiaddrFilter\n\n /**\n * Takes a list of `Multiaddr`s and returns only addresses that are valid for\n * the transport to dial\n */\n dialFilter: MultiaddrFilter\n}\n\n/**\n * Used to disambiguate transport implementations\n */\nexport function isTransport (other?: any): other is Transport {\n return other != null && Boolean(other[transportSymbol])\n}\n\n/**\n * Enum Transport Manager Fault Tolerance values\n */\nexport enum FaultTolerance {\n /**\n * should be used for failing in any listen circumstance\n */\n FATAL_ALL = 0,\n\n /**\n * should be used for not failing when not listening\n */\n NO_FATAL\n}\n\n/**\n * Options accepted by the upgrader during connection establishment\n */\nexport interface UpgraderOptions<ConnectionUpgradeEvents extends ProgressEvent = ProgressEvent> extends ProgressOptions<ConnectionUpgradeEvents>, Required<AbortOptions> {\n /**\n * If true no connection protection will be performed on the connection.\n */\n skipProtection?: boolean\n\n /**\n * By default a stream muxer protocol will be negotiated via multi-stream\n * select after an encryption protocol has been agreed on.\n *\n * If a transport provides it's own stream muxing facility pass a muxer\n * factory instance here to skip muxer negotiation.\n */\n muxerFactory?: StreamMuxerFactory\n\n /**\n * If the connection is to have limits applied to it, pass them here\n */\n limits?: ConnectionLimits\n\n /**\n * Multi-stream select is a initiator/responder protocol. By default a\n * connection returned from `upgrader.upgradeOutbound` will be the initiator\n * and one returned from `upgrader.upgradeInbound` will be the responder.\n *\n * Pass a value here to override the default.\n */\n initiator?: boolean\n}\n\n/**\n * Options accepted by the upgrader during connection establishment\n */\nexport interface UpgraderWithoutEncryptionOptions extends UpgraderOptions {\n /**\n * If true the invoking transport is expected to implement it's own encryption\n * and an encryption protocol will not attempted to be negotiated via\n * multi-stream select\n */\n skipEncryption: true\n\n /**\n * If `skipEncryption` is true, a remote PeerId must be supplied\n */\n remotePeer: PeerId\n}\n\nexport type InboundConnectionUpgradeEvents =\nProgressEvent<'upgrader:encrypt-inbound-connection'> |\nProgressEvent<'upgrader:multiplex-inbound-connection'>\n\nexport type OutboundConnectionUpgradeEvents =\nProgressEvent<'upgrader:encrypt-outbound-connection'> |\nProgressEvent<'upgrader:multiplex-outbound-connection'>\n\nexport interface Upgrader {\n /**\n * Upgrades an outbound connection created by the `dial` method of a transport\n */\n upgradeOutbound(maConn: MultiaddrConnection, opts: UpgraderOptions<OutboundConnectionUpgradeEvents>): Promise<Connection>\n upgradeOutbound(maConn: MultiaddrConnection, opts: UpgraderWithoutEncryptionOptions): Promise<Connection>\n\n /**\n * Upgrades an inbound connection received by a transport listener and\n * notifies other libp2p components about the new connection\n */\n upgradeInbound(maConn: MultiaddrConnection, opts: UpgraderOptions<InboundConnectionUpgradeEvents>): Promise<void>\n upgradeInbound(maConn: MultiaddrConnection, opts: UpgraderWithoutEncryptionOptions): Promise<void>\n\n /**\n * Used by transports that perform part of the upgrade process themselves and\n * do some async work. This allows configuring inbound upgrade timeouts from a\n * single location.\n *\n * Regular transports should just pass the signal from their shutdown\n * controller to `upgradeInbound`.\n */\n createInboundAbortSignal (signal: AbortSignal): ClearableSignal\n\n /**\n * Returns configured stream muxers\n */\n getStreamMuxers (): Map<string, StreamMuxerFactory>\n\n /**\n * Returns configured connection encrypters\n */\n getConnectionEncrypters (): Map<string, ConnectionEncrypter>\n}\n","/**\n * @packageDocumentation\n *\n * Adds types to the EventTarget class.\n *\n * Hopefully this won't be necessary\n * forever:\n *\n * - https://github.com/microsoft/TypeScript/issues/28357\n * - https://github.com/microsoft/TypeScript/issues/43477\n * - https://github.com/microsoft/TypeScript/issues/299\n * - https://www.npmjs.com/package/typed-events\n * - https://www.npmjs.com/package/typed-event-emitter\n * - https://www.npmjs.com/package/typed-event-target\n * - etc\n *\n * In addition to types, a `safeDispatchEvent` method is available which\n * prevents dispatching events that aren't in the event map, and a\n * `listenerCount` method which reports the number of listeners that are\n * currently registered for a given event.\n *\n * @example\n *\n * ```ts\n * import { TypedEventEmitter } from 'main-event'\n * import type { TypedEventTarget } from 'main-event'\n *\n * interface EventTypes {\n * 'test': CustomEvent<string>\n * }\n *\n * const target = new TypedEventEmitter<EventTypes>()\n *\n * // it's a regular EventTarget\n * console.info(target instanceof EventTarget) // true\n *\n * // register listeners normally\n * target.addEventListener('test', (evt) => {\n * // evt is CustomEvent<string>\n * })\n *\n * // @ts-expect-error 'derp' is not in the event map\n * target.addEventListener('derp', () => {})\n *\n * // use normal dispatchEvent method\n * target.dispatchEvent(new CustomEvent('test', {\n * detail: 'hello'\n * }))\n *\n * // use type safe dispatch method\n * target.safeDispatchEvent('test', {\n * detail: 'world'\n * })\n *\n * // report listener count\n * console.info(target.listenerCount('test')) // 0\n *\n * // event emitters can be used purely as interfaces too\n * function acceptTarget (target: TypedEventTarget<EventTypes>) {\n * // ...\n * }\n * ```\n */\n\nimport { setMaxListeners } from './events.js'\n\nexport interface EventCallback<EventType> { (evt: EventType): void }\nexport interface EventObject<EventType> { handleEvent: EventCallback<EventType> }\nexport type EventHandler<EventType> = EventCallback<EventType> | EventObject<EventType>\n\ninterface Listener {\n once: boolean\n callback: any\n}\n\n/**\n *\n */\nexport interface TypedEventTarget <EventMap extends Record<string, any>> extends EventTarget {\n addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void\n\n listenerCount (type: string): number\n\n removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void\n\n removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void\n\n safeDispatchEvent<Detail>(type: keyof EventMap, detail?: CustomEventInit<Detail>): boolean\n}\n\n/**\n * An implementation of a typed event target\n */\nexport class TypedEventEmitter<EventMap extends Record<string, any>> extends EventTarget implements TypedEventTarget<EventMap> {\n readonly #listeners = new Map<any, Listener[]>()\n\n constructor () {\n super()\n\n // silence MaxListenersExceededWarning warning on Node.js, this is a red\n // herring almost all of the time\n setMaxListeners(Infinity, this)\n }\n\n listenerCount (type: string): number {\n const listeners = this.#listeners.get(type)\n\n if (listeners == null) {\n return 0\n }\n\n return listeners.length\n }\n\n addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void\n addEventListener (type: string, listener: EventHandler<Event>, options?: boolean | AddEventListenerOptions): void {\n super.addEventListener(type, listener, options)\n\n let list = this.#listeners.get(type)\n\n if (list == null) {\n list = []\n this.#listeners.set(type, list)\n }\n\n list.push({\n callback: listener,\n once: (options !== true && options !== false && options?.once) ?? false\n })\n }\n\n removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void\n removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void {\n super.removeEventListener(type.toString(), listener ?? null, options)\n\n let list = this.#listeners.get(type)\n\n if (list == null) {\n return\n }\n\n list = list.filter(({ callback }) => callback !== listener)\n this.#listeners.set(type, list)\n }\n\n dispatchEvent (event: Event): boolean {\n const result = super.dispatchEvent(event)\n\n let list = this.#listeners.get(event.type)\n\n if (list == null) {\n return result\n }\n\n list = list.filter(({ once }) => !once)\n this.#listeners.set(event.type, list)\n\n return result\n }\n\n safeDispatchEvent<Detail>(type: keyof EventMap, detail: CustomEventInit<Detail> = {}): boolean {\n return this.dispatchEvent(new CustomEvent<Detail>(type as string, detail))\n }\n}\n\nexport { setMaxListeners }\n","import { setMaxListeners as nodeSetMaxListeners } from 'node:events'\n\n/**\n * Create a setMaxListeners that doesn't break browser usage\n */\nexport const setMaxListeners: typeof nodeSetMaxListeners = (n, ...eventTargets) => {\n try {\n nodeSetMaxListeners(n, ...eventTargets)\n } catch {\n // swallow error, gulp\n }\n}\n","/**\n * @packageDocumentation\n *\n * This module exports various matchers that can be used to infer the type of a\n * passed multiaddr.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS } from '@multiformats/multiaddr-matcher'\n *\n * const ma = multiaddr('/dnsaddr/example.org')\n *\n * DNS.matches(ma) // true - this is a multiaddr with a DNS address at the start\n * ```\n *\n * @example\n *\n * The default matching behaviour ignores any subsequent tuples in the multiaddr.\n * If you want stricter matching you can use `.exactMatch`:\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS, Circuit } from '@multiformats/multiaddr-matcher'\n *\n * const ma = multiaddr('/dnsaddr/example.org/p2p/QmFoo/p2p-circuit/p2p/QmBar')\n *\n * DNS.exactMatch(ma) // false - this address has extra tuples after the DNS component\n * Circuit.matches(ma) // true\n * Circuit.exactMatch(ma) // true - the extra tuples are circuit relay related\n * ```\n */\n\nimport { CODE_P2P, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, CODE_DNS, CODE_IP4, CODE_IP6, CODE_TCP, CODE_UDP, CODE_QUIC, CODE_QUIC_V1, CODE_WS, CODE_WSS, CODE_TLS, CODE_SNI, CODE_WEBRTC_DIRECT, CODE_CERTHASH, CODE_WEBTRANSPORT, CODE_P2P_CIRCUIT, CODE_WEBRTC, CODE_HTTP, CODE_UNIX, CODE_HTTPS, CODE_MEMORY, CODE_IP6ZONE, CODE_IPCIDR } from '@multiformats/multiaddr'\nimport { and, or, optional, fmt, code, value, not } from './utils.js'\nimport type { Multiaddr, Component } from '@multiformats/multiaddr'\n\n/**\n * A matcher accepts multiaddr components and either fails to match and returns\n * false or returns a sublist of unmatched components\n */\nexport interface Matcher {\n match(parts: Component[]): Component[] | false\n}\n\n/**\n * A MultiaddrMatcher allows interpreting a multiaddr as a certain type of\n * multiaddr\n */\nexport interface MultiaddrMatcher {\n /**\n * The matchers that make up this MultiaddrMatcher - useful if you want to\n * make your own custom matchers\n */\n matchers: Matcher[]\n\n /**\n * Returns true if the passed multiaddr can be treated as this type of\n * multiaddr\n */\n matches(ma?: Multiaddr): boolean\n\n /**\n * Returns true if the passed multiaddr terminates as this type of\n * multiaddr\n */\n exactMatch(ma?: Multiaddr): boolean\n}\n\n/**\n * Matches PeerId addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { PEER_ID } from '@multiformats/multiaddr-matcher'\n *\n * PEER_ID.matches(multiaddr('/p2p/Qmfoo')) // true\n * PEER_ID.matches(multiaddr('/ipfs/Qmfoo')) // true\n * ```\n */\nconst _PEER_ID = value(CODE_P2P)\n\nexport const PEER_ID = fmt(_PEER_ID)\n\n/**\n * DNS matchers\n */\nconst _DNS4 = value(CODE_DNS4)\nconst _DNS6 = value(CODE_DNS6)\nconst _DNSADDR = value(CODE_DNSADDR)\nconst _DNS = value(CODE_DNS)\n\n/**\n * Matches dns4 addresses.\n *\n * Use {@link DNS DNS} instead to match any type of DNS address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS4 } from '@multiformats/multiaddr-matcher'\n *\n * DNS4.matches(multiaddr('/dns4/example.org')) // true\n * ```\n */\nexport const DNS4 = fmt(_DNS4, optional(value(CODE_P2P)))\n\n/**\n * Matches dns6 addresses.\n *\n * Use {@link DNS DNS} instead to match any type of DNS address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS6 } from '@multiformats/multiaddr-matcher'\n *\n * DNS6.matches(multiaddr('/dns6/example.org')) // true\n * ```\n */\nexport const DNS6 = fmt(_DNS6, optional(value(CODE_P2P)))\n\n/**\n * Matches dnsaddr addresses.\n *\n * Use {@link DNS DNS} instead to match any type of DNS address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNSADDR } from '@multiformats/multiaddr-matcher'\n *\n * DNSADDR.matches(multiaddr('/dnsaddr/example.org')) // true\n * DNSADDR.matches(multiaddr('/dnsaddr/example.org/p2p/Qmfoo')) // true\n * ```\n */\nexport const DNSADDR = fmt(_DNSADDR, optional(value(CODE_P2P)))\n\n/**\n * Matches any dns address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS } from '@multiformats/multiaddr-matcher'\n *\n * DNS.matches(multiaddr('/dnsaddr/example.org')) // true\n * DNS.matches(multiaddr('/dns4/example.org')) // true\n * DNS.matches(multiaddr('/dns6/example.org')) // true\n * DNS.matches(multiaddr('/dns6/example.org/p2p/Qmfoo')) // true\n * ```\n */\nexport const DNS = fmt(or(_DNS, _DNSADDR, _DNS4, _DNS6), optional(value(CODE_P2P)))\n\nconst _IP4 = and(\n value(CODE_IP4),\n optional(value(CODE_IPCIDR))\n)\nconst _IP6 = and(\n optional(value(CODE_IP6ZONE)),\n value(CODE_IP6),\n optional(value(CODE_IPCIDR))\n)\nconst _IP = or(_IP4, _IP6)\n\nconst _IP_OR_DOMAIN = or(_IP, _DNS, _DNS4, _DNS6, _DNSADDR)\n\n/**\n * A matcher for addresses that start with IP or DNS tuples.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { IP_OR_DOMAIN } from '@multiformats/multiaddr-matcher'\n *\n * IP_OR_DOMAIN.matches(multiaddr('/ip4/123.123.123.123')) // true\n * IP_OR_DOMAIN.matches(multiaddr('/ip4/123.123.123.123/p2p/QmFoo')) // true\n * IP_OR_DOMAIN.matches(multiaddr('/dns/example.com/p2p/QmFoo')) // true\n * IP_OR_DOMAIN.matches(multiaddr('/p2p/QmFoo')) // false\n * ```\n */\nexport const IP_OR_DOMAIN = fmt(or(_IP, and(or(_DNS, _DNSADDR, _DNS4, _DNS6), optional(value(CODE_P2P)))))\n\n/**\n * Matches ip4 addresses.\n *\n * Use {@link IP IP} instead to match any ip4/ip6 address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { IP4 } from '@multiformats/multiaddr-matcher'\n *\n * const ma = multiaddr('/ip4/123.123.123.123')\n *\n * IP4.matches(ma) // true\n * ```\n */\nexport const IP4 = fmt(_IP4)\n\n/**\n * Matches ip6 addresses.\n *\n * Use {@link IP IP} instead to match any ip4/ip6 address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { IP6 } from '@multiformats/multiaddr-matcher'\n *\n * const ma = multiaddr('/ip6/fe80::1cc1:a3b8:322f:cf22')\n *\n * IP6.matches(ma) // true\n * ```\n */\nexport const IP6 = fmt(_IP6)\n\n/**\n * Matches ip4 or ip6 addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { IP } from '@multiformats/multiaddr-matcher'\n *\n * IP.matches(multiaddr('/ip4/123.123.123.123')) // true\n * IP.matches(multiaddr('/ip6/fe80::1cc1:a3b8:322f:cf22')) // true\n * ```\n */\nexport const IP = fmt(_IP)\n\nconst _TCP = and(_IP_OR_DOMAIN, value(CODE_TCP))\nconst _UDP = and(_IP_OR_DOMAIN, value(CODE_UDP))\n\n/**\n * Matches TCP addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { TCP } from '@multiformats/multiaddr-matcher'\n *\n * TCP.matches(multiaddr('/ip4/123.123.123.123/tcp/1234')) // true\n * ```\n */\nexport const TCP = fmt(and(_TCP, optional(value(CODE_P2P))))\n\n/**\n * Matches UDP addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { UDP } from '@multiformats/multiaddr-matcher'\n *\n * UDP.matches(multiaddr('/ip4/123.123.123.123/udp/1234')) // true\n * ```\n */\nexport const UDP = fmt(_UDP)\n\nconst _QUIC = and(_UDP, code(CODE_QUIC), optional(value(CODE_P2P)))\nconst _QUIC_V1 = and(_UDP, code(CODE_QUIC_V1), optional(value(CODE_P2P)))\n\nconst QUIC_V0_OR_V1 = or(_QUIC, _QUIC_V1)\n\n/**\n * Matches QUIC addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { QUIC } from '@multiformats/multiaddr-matcher'\n *\n * QUIC.matches(multiaddr('/ip4/123.123.123.123/udp/1234/quic')) // true\n * ```\n */\nexport const QUIC = fmt(_QUIC)\n\n/**\n * Matches QUICv1 addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { QUIC_V1 } from '@multiformats/multiaddr-matcher'\n *\n * QUIC_V1.matches(multiaddr('/ip4/123.123.123.123/udp/1234/quic-v1')) // true\n * ```\n */\nexport const QUIC_V1 = fmt(_QUIC_V1)\n\nconst _WEB = or(\n _IP_OR_DOMAIN,\n _TCP,\n _UDP,\n _QUIC,\n _QUIC_V1\n)\n\nconst _WebSockets = or(\n and(_WEB, code(CODE_WS), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches WebSocket addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebSockets } from '@multiformats/multiaddr-matcher'\n *\n * WebSockets.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/ws')) // true\n * ```\n */\nexport const WebSockets = fmt(_WebSockets)\n\nconst _WebSocketsSecure = or(\n and(_WEB, code(CODE_WSS), optional(value(CODE_P2P))),\n and(_WEB, code(CODE_TLS), optional(value(CODE_SNI)), code(CODE_WS), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches secure WebSocket addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebSocketsSecure } from '@multiformats/multiaddr-matcher'\n *\n * WebSocketsSecure.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/wss')) // true\n * ```\n */\nexport const WebSocketsSecure = fmt(_WebSocketsSecure)\n\nconst _WebRTCDirect = and(_UDP, code(CODE_WEBRTC_DIRECT), optional(value(CODE_CERTHASH)), optional(value(CODE_CERTHASH)), optional(value(CODE_P2P)))\n\n/**\n * Matches WebRTC-direct addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebRTCDirect } from '@multiformats/multiaddr-matcher'\n *\n * WebRTCDirect.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/p2p/QmFoo/webrtc-direct/certhash/u....')) // true\n * ```\n */\nexport const WebRTCDirect = fmt(_WebRTCDirect)\n\nconst _WebTransport = and(_QUIC_V1, code(CODE_WEBTRANSPORT), optional(value(CODE_CERTHASH)), optional(value(CODE_CERTHASH)), optional(value(CODE_P2P)))\n\n/**\n * Matches WebTransport addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebRTCDirect } from '@multiformats/multiaddr-matcher'\n *\n * WebRTCDirect.matches(multiaddr('/ip4/123.123.123.123/udp/1234/quic-v1/webtransport/certhash/u..../certhash/u..../p2p/QmFoo')) // true\n * ```\n */\nexport const WebTransport = fmt(_WebTransport)\n\nconst _P2P = or(\n _WebSockets,\n _WebSocketsSecure,\n and(_TCP, optional(value(CODE_P2P))),\n and(QUIC_V0_OR_V1, optional(value(CODE_P2P))),\n and(_IP_OR_DOMAIN, optional(value(CODE_P2P))),\n _WebRTCDirect,\n _WebTransport,\n value(CODE_P2P)\n)\n\n/**\n * Matches peer addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { P2P } from '@multiformats/multiaddr-matcher'\n *\n * P2P.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/p2p/QmFoo')) // true\n * ```\n */\nexport const P2P = fmt(_P2P)\n\nconst _Circuit = and(optional(_P2P), code(CODE_P2P_CIRCUIT), not(code(CODE_WEBRTC)), optional(value(CODE_P2P)))\n\n/**\n * Matches circuit relay addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { Circuit } from '@multiformats/multiaddr-matcher'\n *\n * Circuit.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/p2p/QmRelay/p2p-circuit/p2p/QmTarget')) // true\n * ```\n */\nexport const Circuit = fmt(_Circuit)\n\nconst _WebRTC = or(\n and(_P2P, code(CODE_P2P_CIRCUIT), code(CODE_WEBRTC), optional(value(CODE_P2P))),\n and(_P2P, code(CODE_WEBRTC), optional(value(CODE_P2P))),\n and(code(CODE_WEBRTC), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches WebRTC addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebRTC } from '@multiformats/multiaddr-matcher'\n *\n * WebRTC.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/p2p/QmRelay/p2p-circuit/webrtc/p2p/QmTarget')) // true\n * ```\n */\nexport const WebRTC = fmt(_WebRTC)\n\nconst _HTTP = or(\n and(_IP_OR_DOMAIN, value(CODE_TCP), code(CODE_HTTP), optional(value(CODE_P2P))),\n and(_IP_OR_DOMAIN, code(CODE_HTTP), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches HTTP addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { HTTP } from '@multiformats/multiaddr-matcher'\n *\n * HTTP.matches(multiaddr('/dns/example.org/http')) // true\n * ```\n */\nexport const HTTP = fmt(_HTTP)\n\nconst _HTTPS = and(_IP_OR_DOMAIN, or(\n and(value(CODE_TCP, '443'), code(CODE_HTTP)),\n and(value(CODE_TCP), code(CODE_HTTPS)),\n and(value(CODE_TCP), code(CODE_TLS), code(CODE_HTTP)),\n and(code(CODE_TLS), code(CODE_HTTP)),\n code(CODE_TLS),\n code(CODE_HTTPS)\n),\noptional(value(CODE_P2P))\n)\n\n/**\n * Matches HTTPS addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { HTTP } from '@multiformats/multiaddr-matcher'\n *\n * HTTP.matches(multiaddr('/dns/example.org/tls/http')) // true\n * ```\n */\nexport const HTTPS = fmt(_HTTPS)\n\nconst _Memory = or(\n and(value(CODE_MEMORY), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches Memory addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { Memory } from '@multiformats/multiaddr-matcher'\n *\n * Memory.matches(multiaddr('/memory/0xDEADBEEF')) // true\n * ```\n */\nexport const Memory = fmt(_Memory)\n\nconst _Unix = or(\n and(value(CODE_UNIX), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches Unix addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { Unix } from '@multiformats/multiaddr-matcher'\n *\n * Unix.matches(multiaddr('/unix/%2Fpath%2Fto%2Funix.socket')) // true\n * ```\n */\nexport const Unix = fmt(_Unix)\n","import type { Matcher, MultiaddrMatcher } from './index.js'\nimport type { Multiaddr, Component } from '@multiformats/multiaddr'\n\n/**\n * Matches a multiaddr component with the specified code but no value\n */\nexport const code = (code: number): Matcher => {\n return {\n match: (vals) => {\n const component = vals[0]\n\n if (component == null) {\n return false\n }\n\n if (component.code !== code) {\n return false\n }\n\n if (component.value != null) {\n return false\n }\n\n return vals.slice(1)\n }\n }\n}\n\n/**\n * Matches a multiaddr component with the specified code and value. If the value\n * is omitted any non-undefined value is matched.\n */\nexport const value = (code: number, value?: string): Matcher => {\n return {\n match: (vals) => {\n const component = vals[0]\n\n if (component?.code !== code) {\n return false\n }\n\n if (component.value == null) {\n return false\n }\n\n if (value != null && component.value !== value) {\n return false\n }\n\n return vals.slice(1)\n }\n }\n}\n\n/**\n * Matches a multiaddr component with the specified code and value. If the value\n * is omitted any non-undefined value is matched.\n */\nexport const not = (matcher: Matcher): Matcher => {\n return {\n match: (vals) => {\n const result = matcher.match(vals)\n\n if (result === false) {\n return vals\n }\n\n return false\n }\n }\n}\n\n/**\n * An optional matcher\n */\nexport const optional = (matcher: Matcher): Matcher => {\n return {\n match: (vals) => {\n const result = matcher.match(vals)\n\n if (result === false) {\n return vals\n }\n\n return result\n }\n }\n}\n\n/**\n * Matches any one of the passed matches\n */\nexport const or = (...matchers: Matcher[]): Matcher => {\n return {\n match: (vals) => {\n let matches: Component[] | undefined\n\n for (const matcher of matchers) {\n const result = matcher.match(vals)\n\n // no match\n if (result === false) {\n continue\n }\n\n // choose greediest matcher\n if (matches == null || result.length < matches.length) {\n matches = result\n }\n }\n\n if (matches == null) {\n return false\n }\n\n return matches\n }\n }\n}\n\n/**\n * Matches all of the passed matchers\n */\nexport const and = (...matchers: Matcher[]): Matcher => {\n return {\n match: (vals) => {\n for (const matcher of matchers) {\n // pass what's left of the array\n const result = matcher.match(vals)\n\n // no match\n if (result === false) {\n return false\n }\n\n vals = result\n }\n\n return vals\n }\n }\n}\n\n/**\n * Create a multiaddr matcher from the passed component matchers\n */\nexport function fmt (...matchers: Matcher[]): MultiaddrMatcher {\n function match (ma?: Multiaddr): Component[] | false {\n if (ma == null) {\n return false\n }\n\n let parts = ma.getComponents()\n\n for (const matcher of matchers) {\n const result = matcher.match(parts)\n\n if (result === false) {\n return false\n }\n\n parts = result\n }\n\n return parts\n }\n\n function matches (ma?: Multiaddr): boolean {\n const result = match(ma)\n\n return result !== false\n }\n\n function exactMatch (ma?: Multiaddr): boolean {\n const result = match(ma)\n\n if (result === false) {\n return false\n }\n\n return result.length === 0\n }\n\n return {\n matchers,\n matches,\n exactMatch\n }\n}\n","/**\n * @packageDocumentation\n *\n * This module allows easy conversion of Multiaddrs to string URIs.\n *\n * @example Converting multiaddrs to string URIs\n *\n * ```js\n * import { multiaddrToUri } from '@multiformats/multiaddr-to-uri'\n *\n * console.log(multiaddrToUri('/dnsaddr/protocol.ai/https'))\n * // -> https://protocol.ai\n *\n * console.log(multiaddrToUri('/ip4/127.0.0.1/tcp/8080'))\n * // -> http://127.0.0.1:8080\n *\n * console.log(multiaddrToUri('/ip4/127.0.0.1/tcp/8080', { assumeHttp: false }))\n * // -> tcp://127.0.0.1:8080\n * ```\n *\n * Note:\n *\n * - When `/tcp` is the last (terminating) protocol HTTP is assumed by default (implicit `assumeHttp: true`)\n * - this means produced URIs will start with `http://` instead of `tcp://`\n * - passing `{ assumeHttp: false }` disables this behavior\n * - Might be lossy - e.g. a DNSv6 multiaddr\n * - Can throw if the passed multiaddr:\n * - is not a valid multiaddr\n * - is not supported as a URI e.g. circuit\n */\n\nimport { CODE_TCP, CODE_DNS, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, multiaddr, CODE_TLS, CODE_IP6 } from '@multiformats/multiaddr'\nimport type { Component, Multiaddr } from '@multiformats/multiaddr'\n\nexport interface MultiaddrToUriOpts {\n assumeHttp?: boolean\n}\n\nconst ASSUME_HTTP_CODES = [\n CODE_TCP,\n CODE_DNS,\n CODE_DNSADDR,\n CODE_DNS4,\n CODE_DNS6\n]\n\ninterface Interpreter {\n (head: Component, rest: Component[]): string | undefined\n}\n\nfunction extractSNI (ma: Component[]): string | undefined {\n return extractTuple('sni', ma)?.value\n}\n\nfunction extractPort (ma: Component[]): string {\n const port = extractTuple('tcp', ma)?.value\n\n if (port == null) {\n return ''\n }\n\n return `:${port}`\n}\n\nfunction extractTuple (name: string, ma: Component[]): Component | undefined {\n return ma.find(component => component.name === name)\n}\n\nfunction hasTLS (ma: Component[]): boolean {\n return ma.some(({ code }) => code === CODE_TLS)\n}\n\nfunction interpretNext (head: Component, rest: Component[]): string | undefined {\n const interpreter = interpreters[head.name]\n if (interpreter == null) {\n throw new Error(`Can't interpret protocol ${head.name}`)\n }\n const restVal = interpreter(head, rest)\n if (head.code === CODE_IP6) {\n return `[${restVal}]`\n }\n return restVal\n}\n\nconst interpreters: Record<string, Interpreter> = {\n ip4: (head, rest) => head.value,\n ip6: (head, rest) => {\n if (rest.length === 0) {\n return head.value\n }\n return `[${head.value}]`\n },\n tcp: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return `tcp://${interpretNext(tail, rest)}:${head.value}`\n },\n udp: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return `udp://${interpretNext(tail, rest)}:${head.value}`\n },\n dnsaddr: (head, rest) => head.value,\n dns4: (head, rest) => head.value,\n dns6: (head, rest) => head.value,\n dns: (head, rest) => head.value,\n ipfs: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return `${interpretNext(tail, rest)}`\n },\n p2p: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return `${interpretNext(tail, rest)}`\n },\n http: (head, rest) => {\n const maHasTLS = hasTLS(rest)\n const sni = extractSNI(rest)\n const port = extractPort(rest)\n if (maHasTLS && sni != null) {\n return `https://${sni}${port}`\n }\n const protocol = maHasTLS ? 'https://' : 'http://'\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n let baseVal = interpretNext(tail, rest)\n // We are reinterpreting the base as http, so we need to remove the tcp:// if it's there\n baseVal = baseVal?.replace('tcp://', '')\n return `${protocol}${baseVal}`\n },\n 'http-path': (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n const baseVal = interpretNext(tail, rest)\n const decodedValue = decodeURIComponent(head.value ?? '')\n return `${baseVal}${decodedValue}`\n },\n tls: (head, rest) => {\n // Noop, the parent context knows that it's tls. We don't need to do\n // anything here\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return interpretNext(tail, rest)\n },\n sni: (head, rest) => {\n // Noop, the parent context uses the sni information, we don't need to do\n // anything here\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return interpretNext(tail, rest)\n },\n https: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n let baseVal = interpretNext(tail, rest)\n // We are reinterpreting the base as http, so we need to remove the tcp:// if it's there\n baseVal = baseVal?.replace('tcp://', '')\n return `https://${baseVal}`\n },\n ws: (head, rest) => {\n const maHasTLS = hasTLS(rest)\n const sni = extractSNI(rest)\n const port = extractPort(rest)\n if (maHasTLS && sni != null) {\n return `wss://${sni}${port}`\n }\n const protocol = maHasTLS ? 'wss://' : 'ws://'\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n let baseVal = interpretNext(tail, rest)\n // We are reinterpreting the base, so we need to remove the tcp:// if it's there\n baseVal = baseVal?.replace('tcp://', '')\n return `${protocol}${baseVal}`\n },\n wss: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n let baseVal = interpretNext(tail, rest)\n // We are reinterpreting the base as http, so we need to remove the tcp:// if it's there\n baseVal = baseVal?.replace('tcp://', '')\n return `wss://${baseVal}`\n }\n}\n\nexport function multiaddrToUri (input: Multiaddr | string | Uint8Array, opts?: MultiaddrToUriOpts): string {\n const ma = multiaddr(input)\n const components = ma.getComponents()\n const head = components.pop()\n if (head == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n\n const interpreter = interpreters[head.name]\n\n if (interpreter == null) {\n throw new Error(`No interpreter found for ${head.name}`)\n }\n\n let uri = interpreter(head, components) ?? ''\n\n if (opts?.assumeHttp !== false && ASSUME_HTTP_CODES.includes(head.code)) {\n // strip any declared protocol\n uri = uri.replace(/^.*:\\/\\//, '')\n\n if (head.value === '443') {\n uri = `https://${uri}`\n } else {\n uri = `http://${uri}`\n }\n }\n\n if (uri.startsWith('http://') || uri.startsWith('https://') || uri.startsWith('ws://') || uri.startsWith('wss://')) {\n // this will strip default ports while keeping paths intact\n uri = new URL(uri).toString()\n\n // strip trailing slash, e.g. http://127.0.0.1/ -> http://127.0.0.1\n if (uri.endsWith('/')) {\n uri = uri.substring(0, uri.length - 1)\n }\n }\n\n return uri\n}\n","import pTimeout from 'p-timeout';\n\nconst normalizeEmitter = emitter => {\n\tconst addListener = emitter.addEventListener || emitter.on || emitter.addListener;\n\tconst removeListener = emitter.removeEventListener || emitter.off || emitter.removeListener;\n\n\tif (!addListener || !removeListener) {\n\t\tthrow new TypeError('Emitter is not compatible');\n\t}\n\n\treturn {\n\t\taddListener: addListener.bind(emitter),\n\t\tremoveListener: removeListener.bind(emitter),\n\t};\n};\n\nexport function pEventMultiple(emitter, event, options) {\n\tlet cancel;\n\tconst returnValue = new Promise((resolve, reject) => {\n\t\toptions = {\n\t\t\trejectionEvents: ['error'],\n\t\t\tmultiArgs: false,\n\t\t\trejectionMultiArgs: false,\n\t\t\tresolveImmediately: false,\n\t\t\t...options,\n\t\t};\n\n\t\tif (!(options.count >= 0 && (options.count === Number.POSITIVE_INFINITY || Number.isInteger(options.count)))) {\n\t\t\tthrow new TypeError('The `count` option should be at least 0 or more');\n\t\t}\n\n\t\toptions.signal?.throwIfAborted();\n\n\t\t// Allow multiple events\n\t\tconst events = [event].flat();\n\n\t\tconst items = [];\n\t\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\t\tconst onItem = async (...arguments_) => {\n\t\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\t\tif (options.filter) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titems.push(value);\n\n\t\t\tif (options.count === items.length) {\n\t\t\t\tcancel();\n\t\t\t\tresolve(items);\n\t\t\t}\n\t\t};\n\n\t\tconst rejectHandler = (...arguments_) => {\n\t\t\tcancel();\n\t\t\treject(options.rejectionMultiArgs ? arguments_ : arguments_[0]);\n\t\t};\n\n\t\tcancel = () => {\n\t\t\tfor (const event of events) {\n\t\t\t\tremoveListener(event, onItem);\n\t\t\t}\n\n\t\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t\t// Only remove rejection handler if we actually registered it\n\t\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfor (const event of events) {\n\t\t\taddListener(event, onItem);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t// Skip registering rejection handler if we're already listening to this event\n\t\t\t// as the main event takes priority (as documented)\n\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\taddListener(rejectionEvent, rejectHandler);\n\t\t\t}\n\t\t}\n\n\t\tif (options.signal) {\n\t\t\toptions.signal.addEventListener('abort', () => {\n\t\t\t\trejectHandler(options.signal.reason);\n\t\t\t}, {once: true});\n\t\t}\n\n\t\tif (options.resolveImmediately) {\n\t\t\tresolve(items);\n\t\t}\n\t});\n\n\treturnValue.cancel = cancel;\n\n\tif (typeof options.timeout === 'number') {\n\t\tconst timeout = pTimeout(returnValue, {milliseconds: options.timeout});\n\t\t// When cancelling, also clear the timeout timer\n\t\ttimeout.cancel = () => {\n\t\t\tcancel();\n\t\t\ttimeout.clear();\n\t\t};\n\n\t\treturn timeout;\n\t}\n\n\treturn returnValue;\n}\n\nexport function pEvent(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\toptions = {\n\t\t...options,\n\t\tcount: 1,\n\t\tresolveImmediately: false,\n\t};\n\n\tconst arrayPromise = pEventMultiple(emitter, event, options);\n\tconst promise = arrayPromise.then(array => array[0]); // eslint-disable-line promise/prefer-await-to-then\n\tpromise.cancel = arrayPromise.cancel;\n\n\treturn promise;\n}\n\nexport function pEventIterator(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\t// Allow multiple events\n\tconst events = [event].flat();\n\n\toptions = {\n\t\trejectionEvents: ['error'],\n\t\tresolutionEvents: [],\n\t\tlimit: Number.POSITIVE_INFINITY,\n\t\tmultiArgs: false,\n\t\trejectionMultiArgs: false,\n\t\t...options,\n\t};\n\n\tconst {limit} = options;\n\tconst isValidLimit = limit >= 0 && (limit === Number.POSITIVE_INFINITY || Number.isInteger(limit));\n\tif (!isValidLimit) {\n\t\tthrow new TypeError('The `limit` option should be a non-negative integer or Infinity');\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tif (limit === 0) {\n\t\t// Return an empty async iterator to avoid any further cost\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tasync next() {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\tlet isDone = false;\n\tlet error;\n\tlet hasPendingError = false;\n\tconst nextQueue = [];\n\tconst valueQueue = [];\n\tlet eventCount = 0;\n\tlet isLimitReached = false;\n\n\tconst valueHandler = (...arguments_) => {\n\t\teventCount++;\n\t\tisLimitReached = eventCount === limit;\n\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\n\t\t\tresolve({done: false, value});\n\n\t\t\tif (isLimitReached) {\n\t\t\t\tcancel();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueQueue.push(value);\n\n\t\tif (isLimitReached) {\n\t\t\tcancel();\n\t\t}\n\t};\n\n\tconst cancel = () => {\n\t\tisDone = true;\n\n\t\tfor (const event of events) {\n\t\t\tremoveListener(event, valueHandler);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t}\n\n\t\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\t\tremoveListener(resolutionEvent, resolveHandler);\n\t\t}\n\n\t\twhile (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value: undefined});\n\t\t}\n\t};\n\n\tconst rejectHandler = (...arguments_) => {\n\t\terror = options.rejectionMultiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {reject} = nextQueue.shift();\n\t\t\treject(error);\n\t\t} else {\n\t\t\thasPendingError = true;\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tconst resolveHandler = async (...arguments_) => {\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (options.filter) {\n\t\t\ttry {\n\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (filterError) {\n\t\t\t\tcancel();\n\t\t\t\tif (nextQueue.length > 0) {\n\t\t\t\t\tconst {reject} = nextQueue.shift();\n\t\t\t\t\treject(filterError);\n\t\t\t\t} else {\n\t\t\t\t\t// Store error for next iterator call\n\t\t\t\t\thasPendingError = true;\n\t\t\t\t\terror = filterError;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value});\n\t\t} else {\n\t\t\tvalueQueue.push(value);\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tfor (const event of events) {\n\t\taddListener(event, valueHandler);\n\t}\n\n\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\taddListener(rejectionEvent, rejectHandler);\n\t}\n\n\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\taddListener(resolutionEvent, resolveHandler);\n\t}\n\n\tif (options.signal) {\n\t\toptions.signal.addEventListener('abort', () => {\n\t\t\trejectHandler(options.signal.reason);\n\t\t}, {once: true});\n\t}\n\n\treturn {\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t\tasync next() {\n\t\t\tif (valueQueue.length > 0) {\n\t\t\t\tconst value = valueQueue.shift();\n\t\t\t\treturn {\n\t\t\t\t\tdone: isDone && valueQueue.length === 0 && !isLimitReached,\n\t\t\t\t\tvalue,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (hasPendingError) {\n\t\t\t\thasPendingError = false;\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (isDone) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnextQueue.push({resolve, reject});\n\t\t\t});\n\t\t},\n\t\tasync return(value) {\n\t\t\tcancel();\n\t\t\treturn {\n\t\t\t\tdone: isDone,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport {TimeoutError} from 'p-timeout';\n","export class TimeoutError extends Error {\n\tname = 'TimeoutError';\n\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tError.captureStackTrace?.(this, TimeoutError);\n\t}\n}\n\nconst getAbortedReason = signal => signal.reason ?? new DOMException('This operation was aborted.', 'AbortError');\n\nexport default function pTimeout(promise, options) {\n\tconst {\n\t\tmilliseconds,\n\t\tfallback,\n\t\tmessage,\n\t\tcustomTimers = {setTimeout, clearTimeout},\n\t\tsignal,\n\t} = options;\n\n\tlet timer;\n\tlet abortHandler;\n\n\tconst wrappedPromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {\n\t\t\tthrow new TypeError(`Expected \\`milliseconds\\` to be a positive number, got \\`${milliseconds}\\``);\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\treject(getAbortedReason(signal));\n\t\t\treturn;\n\t\t}\n\n\t\tif (signal) {\n\t\t\tabortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\t// Use .then() instead of async IIFE to preserve stack traces\n\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\tpromise.then(resolve, reject);\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We create the error outside of `setTimeout` to preserve the stack trace.\n\t\tconst timeoutError = new TimeoutError();\n\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\ttimer = customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (fallback) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\tif (message === false) {\n\t\t\t\tresolve();\n\t\t\t} else if (message instanceof Error) {\n\t\t\t\treject(message);\n\t\t\t} else {\n\t\t\t\ttimeoutError.message = message ?? `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\t\treject(timeoutError);\n\t\t\t}\n\t\t}, milliseconds);\n\t});\n\n\t// eslint-disable-next-line promise/prefer-await-to-then\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t\tif (abortHandler && signal) {\n\t\t\tsignal.removeEventListener('abort', abortHandler);\n\t\t}\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n","/**\n * Progress events are emitted during long running operations\n */\nexport interface ProgressEvent<T extends string = any, D = unknown> {\n /**\n * The event type\n */\n type: T\n\n /**\n * Context-specific event information\n */\n detail: D\n}\n\n/**\n * An implementation of the ProgressEvent interface, this is essentially\n * a typed `CustomEvent` with a `type` property that lets us disambiguate\n * events passed to `progress` callbacks.\n */\nexport class CustomProgressEvent<D = unknown, T extends string = any> extends Event implements ProgressEvent<T, D> {\n public type: T\n public detail: D\n\n constructor (type: T, detail?: D) {\n super(type)\n\n this.type = type\n // @ts-expect-error detail may be undefined\n this.detail = detail\n }\n}\n\n/**\n * Define an `onProgress` callback that can be invoked with `ProgressEvent`s\n *\n * @example\n *\n * ```typescript\n * type MyOperationProgressEvents =\n * ProgressEvent<'operation:start'> |\n * ProgressEvent<'operation:success', Result> |\n * ProgressEvent<'operation:error', Error>\n *\n * export interface MyOperationOptions extends ProgressOptions<MyOperationProgressEvents> {\n * // define options here\n * }\n * ```\n */\nexport interface ProgressOptions<Event extends ProgressEvent = any> {\n onProgress?: (evt: Event) => void\n}\n","import http from 'node:http'\nimport https from 'node:https'\nimport net from 'node:net'\nimport { getNetConfig, getThinWaistAddresses, ipPortToMultiaddr as toMultiaddr } from '@libp2p/utils'\nimport { multiaddr } from '@multiformats/multiaddr'\nimport { WebSockets, WebSocketsSecure } from '@multiformats/multiaddr-matcher'\nimport { TypedEventEmitter, setMaxListeners } from 'main-event'\nimport { pEvent } from 'p-event'\nimport * as ws from 'ws'\nimport { toWebSocket } from './utils.ts'\nimport { webSocketToMaConn } from './websocket-to-conn.js'\nimport type { ComponentLogger, Logger, Listener, ListenerEvents, CreateListenerOptions, CounterGroup, MetricGroup, Metrics, TLSCertificate, Libp2pEvents, Upgrader, MultiaddrConnection } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { TypedEventTarget } from 'main-event'\nimport type { EventEmitter } from 'node:events'\nimport type { Server } from 'node:http'\nimport type { Duplex } from 'node:stream'\nimport type tls from 'node:tls'\n\nexport interface WebSocketListenerComponents {\n logger: ComponentLogger\n events: TypedEventTarget<Libp2pEvents>\n metrics?: Metrics\n}\n\nexport interface WebSocketListenerInit extends CreateListenerOptions {\n server?: Server\n cert?: string\n key?: string\n http?: http.ServerOptions\n https?: http.ServerOptions\n maxBufferedAmount?: number\n bufferedAmountPollInterval?: number\n}\n\nexport interface WebSocketListenerMetrics {\n status?: MetricGroup\n errors?: CounterGroup\n events?: CounterGroup\n}\n\nexport class WebSocketListener extends TypedEventEmitter<ListenerEvents> implements Listener {\n private components: WebSocketListenerComponents\n private readonly log: Logger\n private readonly server: net.Server\n private readonly wsServer: ws.WebSocketServer\n private readonly metrics: WebSocketListenerMetrics\n private readonly sockets: Set<net.Socket>\n private readonly upgrader: Upgrader\n private readonly httpOptions?: http.ServerOptions\n private readonly httpsOptions?: https.ServerOptions\n private readonly shutdownController: AbortController\n private http?: http.Server\n private https?: https.Server\n private addr?: string\n private listeningMultiaddr?: Multiaddr\n private maxBufferedAmount?: number\n private bufferedAmountPollInterval?: number\n\n constructor (components: WebSocketListenerComponents, init: WebSocketListenerInit) {\n super()\n\n this.components = components\n this.log = components.logger.forComponent('libp2p:websockets:listener')\n this.upgrader = init.upgrader\n this.httpOptions = init.http\n this.httpsOptions = init.https ?? init.http\n this.maxBufferedAmount = init.maxBufferedAmount\n this.bufferedAmountPollInterval = init.bufferedAmountPollInterval\n this.sockets = new Set()\n this.shutdownController = new AbortController()\n setMaxListeners(Infinity, this.shutdownController.signal)\n\n this.wsServer = new ws.WebSocketServer({\n noServer: true\n })\n this.wsServer.addListener('connection', this.onWsServerConnection.bind(this))\n\n components.metrics?.registerMetricGroup('libp2p_websockets_inbound_connections_total', {\n label: 'address',\n help: 'Current active connections in WebSocket listener',\n calculate: () => {\n if (this.addr == null) {\n return {}\n }\n\n return {\n [this.addr]: this.sockets.size\n }\n }\n })\n\n this.metrics = {\n status: components.metrics?.registerMetricGroup('libp2p_websockets_listener_status_info', {\n label: 'address',\n help: 'Current status of the WebSocket listener socket'\n }),\n errors: components.metrics?.registerMetricGroup('libp2p_websockets_listener_errors_total', {\n label: 'address',\n help: 'Total count of WebSocket listener errors by type'\n }),\n events: components.metrics?.registerMetricGroup('libp2p_websockets_listener_events_total', {\n label: 'address',\n help: 'Total count of WebSocket listener events by type'\n })\n }\n\n this.server = net.createServer({\n pauseOnConnect: true\n }, (socket) => {\n this.onSocketConnection(socket)\n .catch(err => {\n this.log.error('error handling socket - %e', err)\n socket.destroy()\n })\n })\n\n components.events.addEventListener('certificate:provision', this.onCertificateProvision.bind(this))\n components.events.addEventListener('certificate:renew', this.onCertificateRenew.bind(this))\n }\n\n async onSocketConnection (socket: net.Socket): Promise<void> {\n this.metrics.events?.increment({ [`${this.addr} connection`]: true })\n\n let buffer = socket.read(1)\n\n if (buffer == null) {\n await pEvent(socket, 'readable')\n buffer = socket.read(1)\n }\n\n // determine if this is an HTTP(s) request\n const byte = buffer[0]\n let server: EventEmitter | undefined = this.http\n\n // https://github.com/mscdex/httpolyglot/blob/1c6c4af65f4cf95a32c918d0fdcc532e0c095740/lib/index.js#L92\n if (byte < 32 || byte >= 127) {\n server = this.https\n }\n\n if (server == null) {\n this.log.error('no appropriate listener configured for byte %d', byte)\n socket.destroy()\n return\n }\n\n // store the socket so we can close it when the listener closes\n this.sockets.add(socket)\n\n socket.on('close', () => {\n this.metrics.events?.increment({ [`${this.addr} close`]: true })\n this.sockets.delete(socket)\n })\n\n socket.on('error', (err) => {\n this.log.error('socket error - %e', err)\n this.metrics.events?.increment({ [`${this.addr} error`]: true })\n socket.destroy()\n })\n\n socket.once('timeout', () => {\n this.metrics.events?.increment({ [`${this.addr} timeout`]: true })\n })\n\n socket.once('end', () => {\n this.metrics.events?.increment({ [`${this.addr} end`]: true })\n })\n\n // re-queue first data chunk\n socket.unshift(buffer)\n\n // hand the socket off to the appropriate server\n server.emit('connection', socket)\n }\n\n onWsServerConnection (socket: ws.WebSocket, req: http.IncomingMessage): void {\n let addr: string | ws.AddressInfo | null\n socket.binaryType = 'arraybuffer'\n\n try {\n addr = this.server.address()\n\n if (typeof addr === 'string') {\n throw new Error('Cannot listen on unix sockets')\n }\n\n if (addr == null) {\n throw new Error('Server was closing or not running')\n }\n } catch (err: any) {\n this.log.error('error obtaining remote socket address - %e', err)\n req.destroy(err)\n socket.close()\n return\n }\n\n let maConn: MultiaddrConnection\n\n try {\n maConn = webSocketToMaConn({\n websocket: toWebSocket(socket),\n remoteAddr: toMultiaddr(req.socket.remoteAddress ?? '0.0.0.0', req.socket.remotePort ?? 0).encapsulate('/ws'),\n metrics: this.metrics?.events,\n metricPrefix: `${this.addr} `,\n direction: 'inbound',\n log: this.components.logger.forComponent('libp2p:websockets:connection'),\n maxBufferedAmount: this.maxBufferedAmount,\n bufferedAmountPollInterval: this.bufferedAmountPollInterval\n })\n } catch (err: any) {\n this.log.error('inbound connection failed - %e', err)\n this.metrics.errors?.increment({ [`${this.addr} inbound_to_connection`]: true })\n socket.close()\n return\n }\n\n this.log('new inbound connection %s', maConn.remoteAddr)\n\n this.upgrader.upgradeInbound(maConn, {\n signal: this.shutdownController.signal\n })\n .catch(async err => {\n this.log.error('inbound connection failed to upgrade - %e', err)\n this.metrics.errors?.increment({ [`${this.addr} inbound_upgrade`]: true })\n\n maConn.close()\n })\n }\n\n onUpgrade (req: http.IncomingMessage, socket: Duplex, head: Buffer): void {\n this.wsServer.handleUpgrade(req, socket, head, this.onWsServerConnection.bind(this))\n }\n\n onTLSClientError (err: Error, socket: tls.TLSSocket): void {\n this.log.error('TLS client error - %e', err)\n socket.destroy()\n }\n\n async listen (ma: Multiaddr): Promise<void> {\n if (WebSockets.exactMatch(ma)) {\n this.http = http.createServer(this.httpOptions ?? {}, this.httpRequestHandler.bind(this))\n this.http.addListener('upgrade', this.onUpgrade.bind(this))\n } else if (WebSocketsSecure.exactMatch(ma)) {\n this.https = https.createServer(this.httpsOptions ?? {}, this.httpRequestHandler.bind(this))\n this.https.addListener('upgrade', this.onUpgrade.bind(this))\n this.https.addListener('tlsClientError', this.onTLSClientError.bind(this))\n }\n\n const config = getNetConfig(ma)\n this.addr = `${config.host}:${config.port}`\n\n this.server.listen({\n ...config,\n ipv6Only: config.type === 'ip6'\n })\n\n await new Promise<void>((resolve, reject) => {\n const onListening = (): void => {\n removeListeners()\n resolve()\n }\n const onError = (err: Error): void => {\n this.metrics.errors?.increment({ [`${this.addr} listen_error`]: true })\n removeListeners()\n reject(err)\n }\n const onDrop = (): void => {\n this.metrics.events?.increment({ [`${this.addr} drop`]: true })\n }\n const removeListeners = (): void => {\n this.server.removeListener('listening', onListening)\n this.server.removeListener('error', onError)\n this.server.removeListener('drop', onDrop)\n }\n\n this.server.addListener('listening', onListening)\n this.server.addListener('error', onError)\n this.server.addListener('drop', onDrop)\n })\n\n this.listeningMultiaddr = ma\n this.safeDispatchEvent('listening')\n }\n\n onCertificateProvision (event: CustomEvent<TLSCertificate>): void {\n if (this.https != null) {\n this.log('auto-tls certificate found but already listening on https')\n return\n }\n\n this.log('auto-tls certificate found, starting https server')\n this.https = https.createServer({\n ...this.httpsOptions,\n ...event.detail\n }, this.httpRequestHandler.bind(this))\n this.https.addListener('upgrade', this.onUpgrade.bind(this))\n this.https.addListener('tlsClientError', this.onTLSClientError.bind(this))\n\n this.safeDispatchEvent('listening')\n }\n\n onCertificateRenew (event: CustomEvent<TLSCertificate>): void {\n // stop accepting new connections\n this.https?.close()\n\n this.log('auto-tls certificate renewed, restarting https server')\n this.https = https.createServer({\n ...this.httpsOptions,\n ...event.detail\n }, this.httpRequestHandler.bind(this))\n this.https.addListener('upgrade', this.onUpgrade.bind(this))\n this.https.addListener('tlsClientError', this.onTLSClientError.bind(this))\n }\n\n async close (): Promise<void> {\n this.server.close()\n this.http?.close()\n this.https?.close()\n this.wsServer.close()\n\n // close all connections, must be done after closing the server to prevent\n // race conditions where a new connection is accepted while we are closing\n // the existing ones\n this.http?.closeAllConnections()\n this.https?.closeAllConnections()\n\n ;[...this.sockets].forEach(socket => {\n socket.destroy()\n })\n\n // abort and in-flight connection upgrades\n this.shutdownController.abort()\n\n const events = [\n pEvent(this.server, 'close'),\n pEvent(this.wsServer, 'close')\n ]\n\n if (this.http != null) {\n events.push(pEvent(this.http, 'close'))\n }\n\n if (this.https != null) {\n events.push(pEvent(this.https, 'close'))\n }\n\n await Promise.all(events)\n\n this.safeDispatchEvent('close')\n }\n\n getAddrs (): Multiaddr[] {\n const address = this.server.address()\n\n if (address == null) {\n return []\n }\n\n if (typeof address === 'string') {\n return [multiaddr(`/unix/${encodeURIComponent(address)}/ws`)]\n }\n\n const multiaddrs: Multiaddr[] = getThinWaistAddresses(this.listeningMultiaddr, address.port)\n const insecureMultiaddrs: Multiaddr[] = []\n\n if (this.http != null) {\n multiaddrs.forEach(ma => {\n insecureMultiaddrs.push(ma.encapsulate('/ws'))\n })\n }\n\n const secureMultiaddrs: Multiaddr[] = []\n\n if (this.https != null) {\n multiaddrs.forEach(ma => {\n secureMultiaddrs.push(ma.encapsulate('/tls/ws'))\n })\n }\n\n return [\n ...insecureMultiaddrs,\n ...secureMultiaddrs\n ]\n }\n\n updateAnnounceAddrs (): void {\n\n }\n\n private httpRequestHandler (req: http.IncomingMessage, res: http.ServerResponse): void {\n res.writeHead(400)\n res.write('Only WebSocket connections are supported')\n res.end()\n }\n}\n\nexport function createListener (components: WebSocketListenerComponents, init: WebSocketListenerInit): Listener {\n return new WebSocketListener(components, init)\n}\n","/**\n * @packageDocumentation\n *\n * A class that lets you do operations over a list of Uint8Arrays without\n * copying them.\n *\n * ```js\n * import { Uint8ArrayList } from 'uint8arraylist'\n *\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray()\n * // -> Uint8Array([0, 1, 2, 3, 4, 5])\n *\n * list.consume(3)\n * list.subarray()\n * // -> Uint8Array([3, 4, 5])\n *\n * // you can also iterate over the list\n * for (const buf of list) {\n * // ..do something with `buf`\n * }\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ## Converting Uint8ArrayLists to Uint8Arrays\n *\n * There are two ways to turn a `Uint8ArrayList` into a `Uint8Array` - `.slice` and `.subarray` and one way to turn a `Uint8ArrayList` into a `Uint8ArrayList` with different contents - `.sublist`.\n *\n * ### slice\n *\n * Slice follows the same semantics as [Uint8Array.slice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice) in that it creates a new `Uint8Array` and copies bytes into it using an optional offset & length.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.slice(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ### subarray\n *\n * Subarray attempts to follow the same semantics as [Uint8Array.subarray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray) with one important different - this is a no-copy operation, unless the requested bytes span two internal buffers in which case it is a copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0]) - no-copy\n *\n * list.subarray(2, 5)\n * // -> Uint8Array([2, 3, 4]) - copy\n * ```\n *\n * ### sublist\n *\n * Sublist creates and returns a new `Uint8ArrayList` that shares the underlying buffers with the original so is always a no-copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.sublist(0, 1)\n * // -> Uint8ArrayList([0]) - no-copy\n *\n * list.sublist(2, 5)\n * // -> Uint8ArrayList([2], [3, 4]) - no-copy\n * ```\n *\n * ## Inspiration\n *\n * Borrows liberally from [bl](https://www.npmjs.com/package/bl) but only uses native JS types.\n */\nimport { allocUnsafe, alloc } from 'uint8arrays/alloc'\nimport { concat } from 'uint8arrays/concat'\nimport { equals } from 'uint8arrays/equals'\n\nconst symbol = Symbol.for('@achingbrain/uint8arraylist')\n\nexport type Appendable = Uint8ArrayList | Uint8Array\n\nfunction findBufAndOffset (bufs: Uint8Array[], index: number): { buf: Uint8Array, index: number } {\n if (index == null || index < 0) {\n throw new RangeError('index is out of bounds')\n }\n\n let offset = 0\n\n for (const buf of bufs) {\n const bufEnd = offset + buf.byteLength\n\n if (index < bufEnd) {\n return {\n buf,\n index: index - offset\n }\n }\n\n offset = bufEnd\n }\n\n throw new RangeError('index is out of bounds')\n}\n\n/**\n * Check if object is a CID instance\n *\n * @example\n *\n * ```js\n * import { isUint8ArrayList, Uint8ArrayList } from 'uint8arraylist'\n *\n * isUint8ArrayList(true) // false\n * isUint8ArrayList([]) // false\n * isUint8ArrayList(new Uint8ArrayList()) // true\n * ```\n */\nexport function isUint8ArrayList (value: any): value is Uint8ArrayList {\n return Boolean(value?.[symbol])\n}\n\nexport class Uint8ArrayList implements Iterable<Uint8Array> {\n private bufs: Uint8Array[]\n public length: number\n public readonly [symbol] = true\n\n constructor (...data: Appendable[]) {\n this.bufs = []\n this.length = 0\n\n if (data.length > 0) {\n this.appendAll(data)\n }\n }\n\n * [Symbol.iterator] (): Iterator<Uint8Array> {\n yield * this.bufs\n }\n\n get byteLength (): number {\n return this.length\n }\n\n /**\n * Add one or more `bufs` to the end of this Uint8ArrayList\n */\n append (...bufs: Appendable[]): void {\n this.appendAll(bufs)\n }\n\n /**\n * Add all `bufs` to the end of this Uint8ArrayList\n */\n appendAll (bufs: Appendable[]): void {\n let length = 0\n\n for (const buf of bufs) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.push(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n this.bufs.push(...buf.bufs)\n } else {\n throw new Error('Could not append value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Add one or more `bufs` to the start of this Uint8ArrayList\n */\n prepend (...bufs: Appendable[]): void {\n this.prependAll(bufs)\n }\n\n /**\n * Add all `bufs` to the start of this Uint8ArrayList\n */\n prependAll (bufs: Appendable[]): void {\n let length = 0\n\n for (const buf of bufs.reverse()) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.unshift(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n this.bufs.unshift(...buf.bufs)\n } else {\n throw new Error('Could not prepend value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Read the value at `index`\n */\n get (index: number): number {\n const res = findBufAndOffset(this.bufs, index)\n\n return res.buf[res.index]\n }\n\n /**\n * Set the value at `index` to `value`\n */\n set (index: number, value: number): void {\n const res = findBufAndOffset(this.bufs, index)\n\n res.buf[res.index] = value\n }\n\n /**\n * Copy bytes from `buf` to the index specified by `offset`\n */\n write (buf: Appendable, offset: number = 0): void {\n if (buf instanceof Uint8Array) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf[i])\n }\n } else if (isUint8ArrayList(buf)) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf.get(i))\n }\n } else {\n throw new Error('Could not write value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n /**\n * Remove bytes from the front of the pool\n */\n consume (bytes: number): void {\n // first, normalize the argument, in accordance with how Buffer does it\n bytes = Math.trunc(bytes)\n\n // do nothing if not a positive number\n if (Number.isNaN(bytes) || bytes <= 0) {\n return\n }\n\n // if consuming all bytes, skip iterating\n if (bytes === this.byteLength) {\n this.bufs = []\n this.length = 0\n return\n }\n\n while (this.bufs.length > 0) {\n if (bytes >= this.bufs[0].byteLength) {\n bytes -= this.bufs[0].byteLength\n this.length -= this.bufs[0].byteLength\n this.bufs.shift()\n } else {\n this.bufs[0] = this.bufs[0].subarray(bytes)\n this.length -= bytes\n break\n }\n }\n }\n\n /**\n * Extracts a section of an array and returns a new array.\n *\n * This is a copy operation as it is with Uint8Arrays and Arrays\n * - note this is different to the behaviour of Node Buffers.\n */\n slice (beginInclusive?: number, endExclusive?: number): Uint8Array {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a alloc from the given start and end element index.\n *\n * In the best case where the data extracted comes from a single Uint8Array\n * internally this is a no-copy operation otherwise it is a copy operation.\n */\n subarray (beginInclusive?: number, endExclusive?: number): Uint8Array {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n if (bufs.length === 1) {\n return bufs[0]\n }\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a allocList from the given start and end element index.\n *\n * This is a no-copy operation.\n */\n sublist (beginInclusive?: number, endExclusive?: number): Uint8ArrayList {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n const list = new Uint8ArrayList()\n list.length = length\n // don't loop, just set the bufs\n list.bufs = [...bufs]\n\n return list\n }\n\n private _subList (beginInclusive?: number, endExclusive?: number): { bufs: Uint8Array[], length: number } {\n beginInclusive = beginInclusive ?? 0\n endExclusive = endExclusive ?? this.length\n\n if (beginInclusive < 0) {\n beginInclusive = this.length + beginInclusive\n }\n\n if (endExclusive < 0) {\n endExclusive = this.length + endExclusive\n }\n\n if (beginInclusive < 0 || endExclusive > this.length) {\n throw new RangeError('index is out of bounds')\n }\n\n if (beginInclusive === endExclusive) {\n return { bufs: [], length: 0 }\n }\n\n if (beginInclusive === 0 && endExclusive === this.length) {\n return { bufs: this.bufs, length: this.length }\n }\n\n const bufs: Uint8Array[] = []\n let offset = 0\n\n for (let i = 0; i < this.bufs.length; i++) {\n const buf = this.bufs[i]\n const bufStart = offset\n const bufEnd = bufStart + buf.byteLength\n\n // for next loop\n offset = bufEnd\n\n if (beginInclusive >= bufEnd) {\n // start after this buf\n continue\n }\n\n const sliceStartInBuf = beginInclusive >= bufStart && beginInclusive < bufEnd\n const sliceEndsInBuf = endExclusive > bufStart && endExclusive <= bufEnd\n\n if (sliceStartInBuf && sliceEndsInBuf) {\n // slice is wholly contained within this buffer\n if (beginInclusive === bufStart && endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n const start = beginInclusive - bufStart\n bufs.push(buf.subarray(start, start + (endExclusive - beginInclusive)))\n break\n }\n\n if (sliceStartInBuf) {\n // slice starts in this buffer\n if (beginInclusive === 0) {\n // requested whole buffer\n bufs.push(buf)\n continue\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(beginInclusive - bufStart))\n continue\n }\n\n if (sliceEndsInBuf) {\n if (endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(0, endExclusive - bufStart))\n break\n }\n\n // slice started before this buffer and ends after it\n bufs.push(buf)\n }\n\n return { bufs, length: endExclusive - beginInclusive }\n }\n\n indexOf (search: Uint8ArrayList | Uint8Array, offset: number = 0): number {\n if (!isUint8ArrayList(search) && !(search instanceof Uint8Array)) {\n throw new TypeError('The \"value\" argument must be a Uint8ArrayList or Uint8Array')\n }\n\n const needle = search instanceof Uint8Array ? search : search.subarray()\n\n offset = Number(offset ?? 0)\n\n if (isNaN(offset)) {\n offset = 0\n }\n\n if (offset < 0) {\n offset = this.length + offset\n }\n\n if (offset < 0) {\n offset = 0\n }\n\n if (search.length === 0) {\n return offset > this.length ? this.length : offset\n }\n\n // https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm\n const M: number = needle.byteLength\n\n if (M === 0) {\n throw new TypeError('search must be at least 1 byte long')\n }\n\n // radix\n const radix: number = 256\n const rightmostPositions: Int32Array = new Int32Array(radix)\n\n // position of the rightmost occurrence of the byte c in the pattern\n for (let c: number = 0; c < radix; c++) {\n // -1 for bytes not in pattern\n rightmostPositions[c] = -1\n }\n\n for (let j = 0; j < M; j++) {\n // rightmost position for bytes in pattern\n rightmostPositions[needle[j]] = j\n }\n\n // Return offset of first match, -1 if no match\n const right = rightmostPositions\n const lastIndex = this.byteLength - needle.byteLength\n const lastPatIndex = needle.byteLength - 1\n let skip: number\n\n for (let i = offset; i <= lastIndex; i += skip) {\n skip = 0\n\n for (let j = lastPatIndex; j >= 0; j--) {\n const char: number = this.get(i + j)\n\n if (needle[j] !== char) {\n skip = Math.max(1, j - right[char])\n break\n }\n }\n\n if (skip === 0) {\n return i\n }\n }\n\n return -1\n }\n\n getInt8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt8(0)\n }\n\n setInt8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getInt16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt16(0, littleEndian)\n }\n\n setInt16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getInt32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt32(0, littleEndian)\n }\n\n setInt32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigInt64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigInt64(0, littleEndian)\n }\n\n setBigInt64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigInt64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint8(0)\n }\n\n setUint8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getUint16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint16(0, littleEndian)\n }\n\n setUint16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint32(0, littleEndian)\n }\n\n setUint32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigUint64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigUint64(0, littleEndian)\n }\n\n setBigUint64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigUint64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat32(0, littleEndian)\n }\n\n setFloat32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat64 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat64(0, littleEndian)\n }\n\n setFloat64 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n equals (other: any): other is Uint8ArrayList {\n if (other == null) {\n return false\n }\n\n if (!(other instanceof Uint8ArrayList)) {\n return false\n }\n\n if (other.bufs.length !== this.bufs.length) {\n return false\n }\n\n for (let i = 0; i < this.bufs.length; i++) {\n if (!equals(this.bufs[i], other.bufs[i])) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Create a Uint8ArrayList from a pre-existing list of Uint8Arrays. Use this\n * method if you know the total size of all the Uint8Arrays ahead of time.\n */\n static fromUint8Arrays (bufs: Uint8Array[], length?: number): Uint8ArrayList {\n const list = new Uint8ArrayList()\n list.bufs = bufs\n\n if (length == null) {\n length = bufs.reduce((acc, curr) => acc + curr.byteLength, 0)\n }\n\n list.length = length\n\n return list\n }\n}\n\n/*\nfunction indexOf (needle: Uint8Array, haystack: Uint8Array, offset = 0) {\n for (let i = offset; i < haystack.byteLength; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (haystack[i + j] !== needle[j]) {\n break\n }\n\n if (j === needle.byteLength -1) {\n return i\n }\n }\n\n if (haystack.byteLength - i < needle.byteLength) {\n break\n }\n }\n\n return -1\n}\n*/\n","import { InvalidParametersError } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nexport interface IP4NetConfig {\n type: 'ip4'\n host: string\n protocol?: 'tcp' | 'udp'\n port?: number\n cidr?: number\n sni?: string\n}\n\nexport interface IP6NetConfig {\n type: 'ip6'\n host: string\n protocol?: 'tcp' | 'udp'\n port?: number\n zone?: string\n cidr?: string\n sni?: string\n}\n\nexport interface DNSNetConfig {\n type: 'dns'\n host: string\n protocol?: 'tcp' | 'udp'\n port: number\n cidr?: number\n}\n\nexport interface DNS4NetConfig {\n type: 'dns4'\n host: string\n protocol?: 'tcp' | 'udp'\n port: number\n cidr?: number\n}\n\nexport interface DNS6NetConfig {\n type: 'dns6'\n host: string\n protocol?: 'tcp' | 'udp'\n port: number\n cidr?: number\n}\n\nexport interface DNSAddrNetConfig {\n type: 'dnsaddr'\n host: string\n protocol?: 'tcp' | 'udp'\n port: number\n cidr?: number\n}\n\nexport type NetConfig = IP4NetConfig | IP6NetConfig | DNSNetConfig | DNS4NetConfig | DNS6NetConfig | DNSAddrNetConfig\n\n/**\n * Returns host/port/etc information for multiaddrs, if it is available.\n *\n * It will throw if the passed multiaddr does not start with a network address,\n * e.g. a IPv4, IPv6, DNS, DNS4, DNS6 or DNSADDR address\n */\nexport function getNetConfig (ma: Multiaddr): NetConfig {\n const components = ma.getComponents()\n const config: any = {}\n let index = 0\n\n if (components[index]?.name === 'ip6zone') {\n config.zone = `${components[index].value}`\n index++\n }\n\n if (components[index].name === 'ip4' || components[index].name === 'ip6') {\n config.type = components[index].name\n config.host = components[index].value\n index++\n } else if (components[index].name === 'dns' || components[index].name === 'dns4' || components[index].name === 'dns6') {\n config.type = components[index].name\n config.host = components[index].value\n index++\n } else if (components[index].name === 'dnsaddr') {\n config.type = components[index].name\n config.host = `_dnsaddr.${components[index].value}`\n index++\n }\n\n if (components[index]?.name === 'tcp' || components[index]?.name === 'udp') {\n config.protocol = components[index].name === 'tcp' ? 'tcp' : 'udp'\n config.port = parseInt(`${components[index].value}`)\n index++\n }\n\n if (components[index]?.name === 'ipcidr') {\n if (config.type === 'ip4') {\n config.cidr = parseInt(`${components[index].value}`)\n } else if (config.type === 'ip6') {\n config.cidr = `${components[index].value}`\n }\n index++\n }\n\n if (config.type == null || config.host == null) {\n throw new InvalidParametersError(`Multiaddr ${ma} was not an IPv4, IPv6, DNS, DNS4, DNS6 or DNSADDR address`)\n }\n\n if (components[index]?.name === 'tls' && components[index + 1]?.name === 'sni') {\n config.sni = components[index + 1].value\n index += 2\n }\n\n return config\n}\n","import { isIPv4, isIPv6, isIP as ipVersion } from \"node:net\";\n\nexport { isIPv4, isIPv6, ipVersion };\n\n/** Check if `input` is IPv4 or IPv6. */\nexport function isIP(input: string): boolean {\n return Boolean(ipVersion(input));\n}\n","/**\n * @packageDocumentation\n *\n * An iterable that you can push values into.\n *\n * @example\n *\n * ```js\n * import { pushable } from 'it-pushable'\n *\n * const source = pushable()\n *\n * setTimeout(() => source.push('hello'), 100)\n * setTimeout(() => source.push('world'), 200)\n * setTimeout(() => source.end(), 300)\n *\n * const start = Date.now()\n *\n * for await (const value of source) {\n * console.log(`got \"${value}\" after ${Date.now() - start}ms`)\n * }\n * console.log(`done after ${Date.now() - start}ms`)\n *\n * // Output:\n * // got \"hello\" after 105ms\n * // got \"world\" after 207ms\n * // done after 309ms\n * ```\n *\n * @example\n *\n * ```js\n * import { pushableV } from 'it-pushable'\n * import all from 'it-all'\n *\n * const source = pushableV()\n *\n * source.push(1)\n * source.push(2)\n * source.push(3)\n * source.end()\n *\n * console.info(await all(source))\n *\n * // Output:\n * // [ [1, 2, 3] ]\n * ```\n */\n\nimport deferred from 'p-defer'\nimport { FIFO, type Next } from './fifo.js'\n\nexport class AbortError extends Error {\n type: string\n code: string\n\n constructor (message?: string, code?: string) {\n super(message ?? 'The operation was aborted')\n this.type = 'aborted'\n this.code = code ?? 'ABORT_ERR'\n }\n}\n\nexport interface AbortOptions {\n signal?: AbortSignal\n}\n\ninterface BasePushable<T> {\n /**\n * End the iterable after all values in the buffer (if any) have been yielded. If an\n * error is passed the buffer is cleared immediately and the next iteration will\n * throw the passed error\n */\n end(err?: Error): this\n\n /**\n * Push a value into the iterable. Values are yielded from the iterable in the order\n * they are pushed. Values not yet consumed from the iterable are buffered.\n */\n push(value: T): this\n\n /**\n * Returns a promise that resolves when the underlying queue becomes empty (e.g.\n * this.readableLength === 0).\n *\n * If an AbortSignal is passed as an option and that signal aborts, it only\n * causes the returned promise to reject - it does not end the pushable.\n */\n onEmpty(options?: AbortOptions): Promise<void>\n\n /**\n * This property contains the number of bytes (or objects) in the queue ready to be read.\n *\n * If `objectMode` is true, this is the number of objects in the queue, if false it's the\n * total number of bytes in the queue.\n */\n readableLength: number\n}\n\n/**\n * An iterable that you can push values into.\n */\nexport interface Pushable<T, R = void, N = unknown> extends AsyncGenerator<T, R, N>, BasePushable<T> {}\n\n/**\n * Similar to `pushable`, except it yields multiple buffered chunks at a time. All values yielded from the iterable will be arrays.\n */\nexport interface PushableV<T, R = void, N = unknown> extends AsyncGenerator<T[], R, N>, BasePushable<T> {}\n\nexport interface Options {\n /**\n * A boolean value that means non-`Uint8Array`s will be passed to `.push`, default: `false`\n */\n objectMode?: boolean\n\n /**\n * A function called after *all* values have been yielded from the iterator (including\n * buffered values). In the case when the iterator is ended with an error it will be\n * passed the error as a parameter.\n */\n onEnd?(err?: Error): void\n}\n\nexport interface DoneResult { done: true }\nexport interface ValueResult<T> { done: false, value: T }\nexport type NextResult<T> = ValueResult<T> | DoneResult\n\ninterface getNext<T, V = T> { (buffer: FIFO<T>): NextResult<V> }\n\nexport interface ObjectPushableOptions extends Options {\n objectMode: true\n}\n\nexport interface BytePushableOptions extends Options {\n objectMode?: false\n}\n\n/**\n * Create a new async iterable. The values yielded from calls to `.next()`\n * or when used in a `for await of`loop are \"pushed\" into the iterable.\n * Returns an async iterable object with additional methods.\n */\nexport function pushable<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): Pushable<T>\nexport function pushable<T> (options: ObjectPushableOptions): Pushable<T>\nexport function pushable<T> (options: Options = {}): Pushable<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T> => {\n const next: Next<T> | undefined = buffer.shift()\n\n if (next == null) {\n return { done: true }\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n return {\n done: next.done === true,\n // @ts-expect-error if done is false, value will be present\n value: next.value\n }\n }\n\n return _pushable<T, T, Pushable<T>>(getNext, options)\n}\n\nexport function pushableV<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): PushableV<T>\nexport function pushableV<T> (options: ObjectPushableOptions): PushableV<T>\nexport function pushableV<T> (options: Options = {}): PushableV<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T[]> => {\n let next: Next<T> | undefined\n const values: T[] = []\n\n while (!buffer.isEmpty()) {\n next = buffer.shift()\n\n if (next == null) {\n break\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n if (next.done === false) {\n // @ts-expect-error if done is false value should be pushed\n values.push(next.value)\n }\n }\n\n if (next == null) {\n return { done: true }\n }\n\n return {\n done: next.done === true,\n value: values\n }\n }\n\n return _pushable<T, T[], PushableV<T>>(getNext, options)\n}\n\nfunction _pushable<PushType, ValueType, ReturnType> (getNext: getNext<PushType, ValueType>, options?: Options): ReturnType {\n options = options ?? {}\n let onEnd = options.onEnd\n let buffer = new FIFO<PushType>()\n let pushable: any\n let onNext: ((next: Next<PushType>) => ReturnType) | null\n let ended: boolean\n let drain = deferred()\n\n const waitNext = async (): Promise<NextResult<ValueType>> => {\n try {\n if (!buffer.isEmpty()) {\n return getNext(buffer)\n }\n\n if (ended) {\n return { done: true }\n }\n\n return await new Promise<NextResult<ValueType>>((resolve, reject) => {\n onNext = (next: Next<PushType>) => {\n onNext = null\n buffer.push(next)\n\n try {\n resolve(getNext(buffer))\n } catch (err) {\n reject(err)\n }\n\n return pushable\n }\n })\n } finally {\n if (buffer.isEmpty()) {\n // settle promise in the microtask queue to give consumers a chance to\n // await after calling .push\n queueMicrotask(() => {\n drain.resolve()\n drain = deferred()\n })\n }\n }\n }\n\n const bufferNext = (next: Next<PushType>): ReturnType => {\n if (onNext != null) {\n return onNext(next)\n }\n\n buffer.push(next)\n return pushable\n }\n\n const bufferError = (err: Error): ReturnType => {\n buffer = new FIFO()\n\n if (onNext != null) {\n return onNext({ error: err })\n }\n\n buffer.push({ error: err })\n return pushable\n }\n\n const push = (value: PushType): ReturnType => {\n if (ended) {\n return pushable\n }\n\n // @ts-expect-error `byteLength` is not declared on PushType\n if (options?.objectMode !== true && value?.byteLength == null) {\n throw new Error('objectMode was not true but tried to push non-Uint8Array value')\n }\n\n return bufferNext({ done: false, value })\n }\n const end = (err?: Error): ReturnType => {\n if (ended) return pushable\n ended = true\n\n return (err != null) ? bufferError(err) : bufferNext({ done: true })\n }\n const _return = (): DoneResult => {\n buffer = new FIFO()\n end()\n\n return { done: true }\n }\n const _throw = (err: Error): DoneResult => {\n end(err)\n\n return { done: true }\n }\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next: waitNext,\n return: _return,\n throw: _throw,\n push,\n end,\n get readableLength (): number {\n return buffer.size\n },\n onEmpty: async (options?: AbortOptions) => {\n const signal = options?.signal\n signal?.throwIfAborted()\n\n if (buffer.isEmpty()) {\n return\n }\n\n let cancel: Promise<void> | undefined\n let listener: (() => void) | undefined\n\n if (signal != null) {\n cancel = new Promise((resolve, reject) => {\n listener = () => {\n reject(new AbortError())\n }\n\n signal.addEventListener('abort', listener)\n })\n }\n\n try {\n await Promise.race([\n drain.promise,\n cancel\n ])\n } finally {\n if (listener != null && signal != null) {\n signal?.removeEventListener('abort', listener)\n }\n }\n }\n }\n\n if (onEnd == null) {\n return pushable\n }\n\n const _pushable = pushable\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next () {\n return _pushable.next()\n },\n throw (err: Error) {\n _pushable.throw(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return { done: true }\n },\n return () {\n _pushable.return()\n\n if (onEnd != null) {\n onEnd()\n onEnd = undefined\n }\n\n return { done: true }\n },\n push,\n end (err: Error) {\n _pushable.end(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return pushable\n },\n get readableLength () {\n return _pushable.readableLength\n },\n onEmpty: (opts?: AbortOptions) => {\n return _pushable.onEmpty(opts)\n }\n }\n\n return pushable\n}\n","export default function pDefer() {\n\tconst deferred = {};\n\n\tdeferred.promise = new Promise((resolve, reject) => {\n\t\tdeferred.resolve = resolve;\n\t\tdeferred.reject = reject;\n\t});\n\n\treturn deferred;\n}\n","// ported from https://www.npmjs.com/package/fast-fifo\n\nexport interface Next<T> {\n done?: boolean\n error?: Error\n value?: T\n}\n\nclass FixedFIFO<T> {\n public buffer: Array<Next<T> | undefined>\n private readonly mask: number\n private top: number\n private btm: number\n public next: FixedFIFO<T> | null\n\n constructor (hwm: number) {\n if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) {\n throw new Error('Max size for a FixedFIFO should be a power of two')\n }\n\n this.buffer = new Array(hwm)\n this.mask = hwm - 1\n this.top = 0\n this.btm = 0\n this.next = null\n }\n\n push (data: Next<T>): boolean {\n if (this.buffer[this.top] !== undefined) {\n return false\n }\n\n this.buffer[this.top] = data\n this.top = (this.top + 1) & this.mask\n\n return true\n }\n\n shift (): Next<T> | undefined {\n const last = this.buffer[this.btm]\n\n if (last === undefined) {\n return undefined\n }\n\n this.buffer[this.btm] = undefined\n this.btm = (this.btm + 1) & this.mask\n return last\n }\n\n isEmpty (): boolean {\n return this.buffer[this.btm] === undefined\n }\n}\n\nexport interface FIFOOptions {\n /**\n * When the queue reaches this size, it will be split into head/tail parts\n */\n splitLimit?: number\n}\n\nexport class FIFO<T> {\n public size: number\n private readonly hwm: number\n private head: FixedFIFO<T>\n private tail: FixedFIFO<T>\n\n constructor (options: FIFOOptions = {}) {\n this.hwm = options.splitLimit ?? 16\n this.head = new FixedFIFO<T>(this.hwm)\n this.tail = this.head\n this.size = 0\n }\n\n calculateSize (obj: any): number {\n if (obj?.byteLength != null) {\n return obj.byteLength\n }\n\n return 1\n }\n\n push (val: Next<T>): void {\n if (val?.value != null) {\n this.size += this.calculateSize(val.value)\n }\n\n if (!this.head.push(val)) {\n const prev = this.head\n this.head = prev.next = new FixedFIFO<T>(2 * this.head.buffer.length)\n this.head.push(val)\n }\n }\n\n shift (): Next<T> | undefined {\n let val = this.tail.shift()\n\n if (val === undefined && (this.tail.next != null)) {\n const next = this.tail.next\n this.tail.next = null\n this.tail = next\n val = this.tail.shift()\n }\n\n if (val?.value != null) {\n this.size -= this.calculateSize(val.value)\n }\n\n return val\n }\n\n isEmpty (): boolean {\n return this.head.isEmpty()\n }\n}\n","import type { Startable } from '@libp2p/interface'\n\nexport interface DebouncedFunction extends Startable {\n (): void\n}\n\n/**\n * Returns a function wrapper that will only call the passed function once\n *\n * Important - the passed function should not throw or reject\n */\nexport function debounce (func: () => void | Promise<void>, wait: number): DebouncedFunction {\n let timeout: ReturnType<typeof setTimeout> | undefined\n\n const output = function (): void {\n const later = function (): void {\n timeout = undefined\n void func()\n }\n\n clearTimeout(timeout)\n timeout = setTimeout(later, wait)\n }\n output.start = (): void => {}\n output.stop = (): void => {\n clearTimeout(timeout)\n }\n\n return output\n}\n","import type { RateLimiterResult } from './rate-limiter.js'\n\n/**\n * A rate limit was hit\n */\nexport class RateLimitError extends Error {\n remainingPoints: number\n msBeforeNext: number\n consumedPoints: number\n isFirstInDuration: boolean\n\n constructor (message = 'Rate limit exceeded', props: RateLimiterResult) {\n super(message)\n this.name = 'RateLimitError'\n this.remainingPoints = props.remainingPoints\n this.msBeforeNext = props.msBeforeNext\n this.consumedPoints = props.consumedPoints\n this.isFirstInDuration = props.isFirstInDuration\n }\n}\n\nexport class QueueFullError extends Error {\n static name = 'QueueFullError'\n\n constructor (message: string = 'The queue was full') {\n super(message)\n this.name = 'QueueFullError'\n }\n}\n\nexport class UnexpectedEOFError extends Error {\n static name = 'UnexpectedEOFError'\n name = 'UnexpectedEOFError'\n}\n\nexport class MaxEarlyStreamsError extends Error {\n static name = 'MaxEarlyStreamsError'\n name = 'MaxEarlyStreamsError'\n}\n\nexport class StreamClosedError extends Error {\n static name = 'StreamClosedError'\n name = 'StreamClosedError'\n}\n","/**\n * @packageDocumentation\n *\n * Pass a promise and an abort signal and await the result.\n *\n * @example Basic usage\n *\n * ```ts\n * import { raceSignal } from 'race-signal'\n *\n * const controller = new AbortController()\n *\n * const promise = new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve('a value')\n * }, 1000)\n * })\n *\n * setTimeout(() => {\n * controller.abort()\n * }, 500)\n *\n * // throws an AbortError\n * const resolve = await raceSignal(promise, controller.signal)\n * ```\n *\n * @example Overriding errors\n *\n * By default the thrown error is the `.reason` property of the signal but it's\n * possible to override this behaviour with the `translateError` option:\n *\n * ```ts\n * import { raceSignal } from 'race-signal'\n *\n * const controller = new AbortController()\n *\n * const promise = new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve('a value')\n * }, 1000)\n * })\n *\n * setTimeout(() => {\n * controller.abort()\n * }, 500)\n *\n * // throws `Error('Oh no!')`\n * const resolve = await raceSignal(promise, controller.signal, {\n * translateError: (signal) => {\n * // use `signal`, or don't\n * return new Error('Oh no!')\n * }\n * })\n * ```\n */\n\nexport interface RaceSignalOptions {\n /**\n * By default the rejection reason will be taken from the `.reason` field of\n * the aborted signal.\n *\n * Passing a function here allows overriding the default error.\n */\n translateError?(signal: AbortSignal): Error\n}\n\nfunction defaultTranslate (signal: AbortSignal): Error {\n return signal.reason\n}\n\n/**\n * Race a promise against an abort signal\n */\nexport async function raceSignal <T> (promise: Promise<T>, signal?: AbortSignal, opts?: RaceSignalOptions): Promise<T> {\n if (signal == null) {\n return promise\n }\n\n const translateError = opts?.translateError ?? defaultTranslate\n\n if (signal.aborted) {\n // the passed promise may yet resolve or reject but the use has signalled\n // they are no longer interested so smother the error\n promise.catch(() => {})\n return Promise.reject(translateError(signal))\n }\n\n let listener\n\n try {\n return await Promise.race([\n promise,\n new Promise<T>((resolve, reject) => {\n listener = () => {\n reject(translateError(signal))\n }\n signal.addEventListener('abort', listener)\n })\n ])\n } finally {\n if (listener != null) {\n signal.removeEventListener('abort', listener)\n }\n }\n}\n","import { StreamResetError, TypedEventEmitter, StreamMessageEvent, StreamBufferError, StreamResetEvent, StreamAbortEvent, StreamCloseEvent, StreamStateError } from '@libp2p/interface'\nimport { pushable } from 'it-pushable'\nimport { raceSignal } from 'race-signal'\nimport { Uint8ArrayList } from 'uint8arraylist'\nimport { StreamClosedError } from './errors.ts'\nimport type { MessageStreamEvents, MessageStreamStatus, MessageStream, AbortOptions, MessageStreamTimeline, MessageStreamDirection, EventHandler, StreamOptions, MessageStreamReadStatus, MessageStreamWriteStatus } from '@libp2p/interface'\nimport type { Logger } from '@libp2p/logger'\n\nconst DEFAULT_MAX_READ_BUFFER_LENGTH = Math.pow(2, 20) * 4 // 4MB\n\nexport interface MessageStreamInit extends StreamOptions {\n /**\n * A Logger implementation used to log stream-specific information\n */\n log: Logger\n\n /**\n * The stream direction\n */\n direction?: MessageStreamDirection\n\n /**\n * By default all available bytes are passed to the `sendData` method of\n * extending classes, if smaller chunks are required, pass a value here.\n */\n maxMessageSize?: number\n}\n\nexport interface SendResult {\n /**\n * The number of bytes from the passed buffer that were sent\n */\n sentBytes: number\n\n /**\n * If the underlying resource can accept more data immediately. If `true`,\n * `sent` must equal the `.byteLength` of the buffer passed to `sendData`.\n */\n canSendMore: boolean\n}\n\nexport abstract class AbstractMessageStream<Timeline extends MessageStreamTimeline = MessageStreamTimeline> extends TypedEventEmitter<MessageStreamEvents> implements MessageStream {\n public status: MessageStreamStatus\n public readonly timeline: Timeline\n public inactivityTimeout: number\n public maxReadBufferLength: number\n public maxWriteBufferLength?: number\n public readonly log: Logger\n public direction: MessageStreamDirection\n public maxMessageSize?: number\n\n public readStatus: MessageStreamReadStatus\n public writeStatus: MessageStreamWriteStatus\n public remoteReadStatus: MessageStreamReadStatus\n public remoteWriteStatus: MessageStreamWriteStatus\n\n public writableNeedsDrain: boolean\n\n /**\n * Any data stored here is emitted before any new incoming data.\n *\n * This is used when the stream is paused or if data is pushed onto the stream\n */\n protected readonly readBuffer: Uint8ArrayList\n protected readonly writeBuffer: Uint8ArrayList\n protected sendingData: boolean\n\n private onDrainPromise?: PromiseWithResolvers<void>\n\n constructor (init: MessageStreamInit) {\n super()\n\n this.status = 'open'\n this.log = init.log\n this.direction = init.direction ?? 'outbound'\n this.inactivityTimeout = init.inactivityTimeout ?? 120_000\n this.maxReadBufferLength = init.maxReadBufferLength ?? DEFAULT_MAX_READ_BUFFER_LENGTH\n this.maxWriteBufferLength = init.maxWriteBufferLength\n this.maxMessageSize = init.maxMessageSize\n this.readBuffer = new Uint8ArrayList()\n this.writeBuffer = new Uint8ArrayList()\n\n this.readStatus = 'readable'\n this.remoteReadStatus = 'readable'\n this.writeStatus = 'writable'\n this.remoteWriteStatus = 'writable'\n this.sendingData = false\n this.writableNeedsDrain = false\n\n // @ts-expect-error type could have required fields other than 'open'\n this.timeline = {\n open: Date.now()\n }\n\n this.processSendQueue = this.processSendQueue.bind(this)\n\n const continueSendingOnDrain = (): void => {\n if (this.writableNeedsDrain) {\n this.log.trace('drain event received, continue sending data')\n this.writableNeedsDrain = false\n this.processSendQueue()\n }\n\n this.onDrainPromise?.resolve()\n }\n this.addEventListener('drain', continueSendingOnDrain)\n\n const rejectOnDrainOnClose = (evt: StreamCloseEvent): void => {\n this.onDrainPromise?.reject(evt.error ?? new StreamClosedError())\n }\n this.addEventListener('close', rejectOnDrainOnClose)\n }\n\n get readBufferLength (): number {\n return this.readBuffer.byteLength\n }\n\n get writeBufferLength (): number {\n return this.writeBuffer.byteLength\n }\n\n async onDrain (options?: AbortOptions): Promise<void> {\n if (this.writableNeedsDrain !== true) {\n return Promise.resolve()\n }\n\n if (this.onDrainPromise == null) {\n this.onDrainPromise = Promise.withResolvers()\n }\n\n return raceSignal(this.onDrainPromise.promise, options?.signal)\n }\n\n async * [Symbol.asyncIterator] (): AsyncGenerator<Uint8Array | Uint8ArrayList> {\n if (this.readStatus !== 'readable' && this.readStatus !== 'paused') {\n return\n }\n\n const output = pushable<Uint8Array | Uint8ArrayList>()\n\n const streamAsyncIterableOnMessageListener = (evt: StreamMessageEvent): void => {\n output.push(evt.data)\n }\n this.addEventListener('message', streamAsyncIterableOnMessageListener)\n\n const streamAsyncIterableOnCloseListener = (evt: StreamCloseEvent): void => {\n output.end(evt.error)\n }\n this.addEventListener('close', streamAsyncIterableOnCloseListener)\n\n const streamAsyncIterableOnRemoteCloseWriteListener = (): void => {\n output.end()\n }\n this.addEventListener('remoteCloseWrite', streamAsyncIterableOnRemoteCloseWriteListener)\n\n try {\n yield * output\n } finally {\n this.removeEventListener('message', streamAsyncIterableOnMessageListener)\n this.removeEventListener('close', streamAsyncIterableOnCloseListener)\n this.removeEventListener('remoteCloseWrite', streamAsyncIterableOnRemoteCloseWriteListener)\n }\n }\n\n isReadable (): boolean {\n return this.status === 'open'\n }\n\n send (data: Uint8Array | Uint8ArrayList): boolean {\n if (this.writeStatus === 'closed' || this.writeStatus === 'closing') {\n throw new StreamStateError(`Cannot write to a stream that is ${this.writeStatus}`)\n }\n\n this.log.trace('append %d bytes to write buffer', data.byteLength)\n this.writeBuffer.append(data)\n\n return this.processSendQueue()\n }\n\n /**\n * Close immediately for reading and writing and send a reset message (local\n * error)\n */\n abort (err: Error): void {\n if (this.status === 'aborted' || this.status === 'reset' || this.status === 'closed') {\n return\n }\n\n this.log.error('abort with error - %e', err)\n\n this.status = 'aborted'\n\n // throw away unread data\n if (this.readBuffer.byteLength > 0) {\n this.readBuffer.consume(this.readBuffer.byteLength)\n }\n\n // throw away unsent data\n if (this.writeBuffer.byteLength > 0) {\n this.writeBuffer.consume(this.writeBuffer.byteLength)\n this.safeDispatchEvent('idle')\n }\n\n this.writeStatus = 'closed'\n this.remoteWriteStatus = 'closed'\n\n this.readStatus = 'closed'\n this.remoteReadStatus = 'closed'\n this.timeline.close = Date.now()\n\n try {\n this.sendReset(err)\n } catch (err: any) {\n this.log('failed to send reset to remote - %e', err)\n }\n\n this.dispatchEvent(new StreamAbortEvent(err))\n }\n\n pause (): void {\n if (this.readStatus === 'closed' || this.readStatus === 'closing') {\n throw new StreamStateError('Cannot pause a stream that is closing/closed')\n }\n\n if (this.readStatus === 'paused') {\n return\n }\n\n this.readStatus = 'paused'\n this.sendPause()\n }\n\n resume (): void {\n if (this.readStatus === 'closed' || this.readStatus === 'closing') {\n throw new StreamStateError('Cannot resume a stream that is closing/closed')\n }\n\n if (this.readStatus === 'readable') {\n return\n }\n\n this.readStatus = 'readable'\n // emit any data that accumulated while we were paused\n this.dispatchReadBuffer()\n this.sendResume()\n }\n\n push (data: Uint8Array | Uint8ArrayList): void {\n if (this.readStatus === 'closed' || this.readStatus === 'closing') {\n throw new StreamStateError(`Cannot push data onto a stream that is ${this.readStatus}`)\n }\n\n if (data.byteLength === 0) {\n return\n }\n\n this.readBuffer.append(data)\n\n if (this.readStatus === 'paused' || this.listenerCount('message') === 0) {\n // abort if the read buffer is too large\n this.checkReadBufferLength()\n\n return\n }\n\n // TODO: use a microtask instead?\n setTimeout(() => {\n this.dispatchReadBuffer()\n }, 0)\n }\n\n unshift (data: Uint8Array | Uint8ArrayList): void {\n if (this.readStatus === 'closed' || this.readStatus === 'closing') {\n throw new StreamStateError(`Cannot push data onto a stream that is ${this.readStatus}`)\n }\n\n if (data.byteLength === 0) {\n return\n }\n\n this.readBuffer.prepend(data)\n\n if (this.readStatus === 'paused' || this.listenerCount('message') === 0) {\n // abort if the read buffer is too large\n this.checkReadBufferLength()\n\n return\n }\n\n // TODO: use a microtask instead?\n setTimeout(() => {\n this.dispatchReadBuffer()\n }, 0)\n }\n\n /**\n * When an extending class reads data from it's implementation-specific source,\n * call this method to allow the stream consumer to read the data.\n */\n onData (data: Uint8Array | Uint8ArrayList): void {\n if (data.byteLength === 0) {\n // this.log('ignoring empty data')\n return\n }\n\n // discard the data if our readable end is closed\n if (this.readStatus === 'closing' || this.readStatus === 'closed') {\n this.log('ignoring data - read status %s', this.readStatus)\n return\n }\n\n this.readBuffer.append(data)\n this.dispatchReadBuffer()\n }\n\n addEventListener<K extends keyof MessageStreamEvents>(type: K, listener: EventHandler<MessageStreamEvents[K]> | null, options?: boolean | AddEventListenerOptions): void\n addEventListener (type: string, listener: EventHandler<Event>, options?: boolean | AddEventListenerOptions): void\n addEventListener (...args: any[]): void {\n // @ts-expect-error cannot ensure args has enough members\n super.addEventListener.apply(this, args)\n\n // if a 'message' listener is being added and we have queued data, dispatch\n // the data\n if (args[0] === 'message' && this.readBuffer.byteLength > 0) {\n // event listeners can be added in constructors and often use object\n // properties - if this the case we can access a class member before it\n // has been initialized so dispatch the message in the microtask queue\n queueMicrotask(() => {\n this.dispatchReadBuffer()\n })\n }\n }\n\n /**\n * Receive a reset message - close immediately for reading and writing (remote\n * error)\n */\n onRemoteReset (): void {\n this.log('remote reset')\n\n this.status = 'reset'\n this.writeStatus = 'closed'\n this.remoteWriteStatus = 'closed'\n this.remoteReadStatus = 'closed'\n this.timeline.close = Date.now()\n\n if (this.readBuffer.byteLength === 0) {\n this.readStatus = 'closed'\n }\n\n const err = new StreamResetError()\n this.dispatchEvent(new StreamResetEvent(err))\n }\n\n /**\n * The underlying resource or transport this stream uses has closed - it is\n * not possible to send any more messages though any data still in the read\n * buffer may still be read\n */\n onTransportClosed (err?: Error): void {\n this.log('transport closed')\n\n if (this.readStatus === 'readable' && this.readBuffer.byteLength === 0) {\n this.log('close readable end after transport closed and read buffer is empty')\n this.readStatus = 'closed'\n }\n\n if (this.remoteReadStatus !== 'closed') {\n this.remoteReadStatus = 'closed'\n }\n\n if (this.remoteWriteStatus !== 'closed') {\n this.remoteWriteStatus = 'closed'\n }\n\n if (this.writeStatus !== 'closed') {\n this.writeStatus = 'closed'\n }\n\n if (err != null) {\n this.abort(err)\n } else {\n if (this.status === 'open' || this.status === 'closing') {\n this.timeline.close = Date.now()\n this.status = 'closed'\n this.writeStatus = 'closed'\n this.remoteWriteStatus = 'closed'\n this.remoteReadStatus = 'closed'\n this.dispatchEvent(new StreamCloseEvent())\n }\n }\n }\n\n /**\n * Called by extending classes when the remote closes its writable end\n */\n onRemoteCloseWrite (): void {\n if (this.remoteWriteStatus === 'closed') {\n return\n }\n\n this.log.trace('on remote close write')\n\n this.remoteWriteStatus = 'closed'\n\n this.safeDispatchEvent('remoteCloseWrite')\n\n if (this.writeStatus === 'closed') {\n this.onTransportClosed()\n }\n }\n\n /**\n * Called by extending classes when the remote closes its readable end\n */\n onRemoteCloseRead (): void {\n this.log.trace('on remote close read')\n\n this.remoteReadStatus = 'closed'\n\n // throw away any unsent bytes if the remote closes it's readable end\n if (this.writeBuffer.byteLength > 0) {\n this.writeBuffer.consume(this.writeBuffer.byteLength)\n this.safeDispatchEvent('idle')\n }\n }\n\n protected processSendQueue (): boolean {\n // bail if the underlying transport is full\n if (this.writableNeedsDrain) {\n this.log.trace('not processing send queue as drain is required')\n this.checkWriteBufferLength()\n\n return false\n }\n\n // bail if there is no data to send\n if (this.writeBuffer.byteLength === 0) {\n this.log.trace('not processing send queue as no bytes to send')\n return true\n }\n\n // bail if we are already sending data\n if (this.sendingData) {\n this.log.trace('not processing send queue as already sending data')\n return true\n }\n\n this.sendingData = true\n\n this.log.trace('processing send queue with %d queued bytes', this.writeBuffer.byteLength)\n\n try {\n let canSendMore = true\n const totalBytes = this.writeBuffer.byteLength\n let sentBytes = 0\n\n // send as much data as possible while we have data to send and the\n // underlying muxer can still accept data\n while (this.writeBuffer.byteLength > 0) {\n const end = Math.min(this.maxMessageSize ?? this.writeBuffer.byteLength, this.writeBuffer.byteLength)\n\n // this can happen if a subclass changes the max message size dynamically\n if (end === 0) {\n canSendMore = false\n break\n }\n\n // chunk to send to the remote end\n const toSend = this.writeBuffer.sublist(0, end)\n\n // copy toSend in case the extending class modifies the list\n const willSend = new Uint8ArrayList(toSend)\n\n this.writeBuffer.consume(toSend.byteLength)\n\n // sending data can cause buffers to fill up, events to be emitted and\n // this method to be invoked again\n const sendResult = this.sendData(toSend)\n canSendMore = sendResult.canSendMore\n sentBytes += sendResult.sentBytes\n\n if (sendResult.sentBytes !== willSend.byteLength) {\n willSend.consume(sendResult.sentBytes)\n this.writeBuffer.prepend(willSend)\n }\n\n if (!canSendMore) {\n break\n }\n }\n\n if (!canSendMore) {\n this.log.trace('sent %d/%d bytes, pausing sending because underlying stream is full, %d bytes left in the write buffer', sentBytes, totalBytes, this.writeBuffer.byteLength)\n this.writableNeedsDrain = true\n this.checkWriteBufferLength()\n }\n\n // we processed all bytes in the queue, resolve the write queue idle promise\n if (this.writeBuffer.byteLength === 0) {\n this.safeDispatchEvent('idle')\n }\n\n return canSendMore\n } finally {\n this.sendingData = false\n }\n }\n\n protected dispatchReadBuffer (): void {\n try {\n if (this.listenerCount('message') === 0) {\n this.log.trace('not dispatching pause buffer as there are no listeners for the message event')\n return\n }\n\n if (this.readBuffer.byteLength === 0) {\n this.log.trace('not dispatching pause buffer as there is no data to dispatch')\n return\n }\n\n if (this.readStatus === 'paused') {\n this.log.trace('not dispatching pause buffer we are paused')\n return\n }\n\n // discard the pause buffer if our readable end is closed\n if (this.readStatus === 'closing' || this.readStatus === 'closed') {\n this.log('dropping %d bytes because the readable end is %s', this.readBuffer.byteLength, this.readStatus)\n this.readBuffer.consume(this.readBuffer.byteLength)\n return\n }\n\n const buf = this.readBuffer.sublist()\n this.readBuffer.consume(buf.byteLength)\n\n this.dispatchEvent(new StreamMessageEvent(buf))\n } finally {\n if (this.readBuffer.byteLength === 0 && this.remoteWriteStatus === 'closed') {\n this.log('close readable end after dispatching read buffer and remote writable end is closed')\n this.readStatus = 'closed'\n }\n\n // abort if we failed to consume the read buffer and it is too large\n this.checkReadBufferLength()\n }\n }\n\n private checkReadBufferLength (): void {\n if (this.readBuffer.byteLength > this.maxReadBufferLength) {\n this.abort(new StreamBufferError(`Read buffer length of ${this.readBuffer.byteLength} exceeded limit of ${this.maxReadBufferLength}, read status is ${this.readStatus}`))\n }\n }\n\n private checkWriteBufferLength (): void {\n if (this.maxWriteBufferLength == null) {\n return\n }\n\n if (this.writeBuffer.byteLength > this.maxWriteBufferLength) {\n this.abort(new StreamBufferError(`Write buffer length of ${this.writeBuffer.byteLength} exceeded limit of ${this.maxWriteBufferLength}, write status is ${this.writeStatus}`))\n }\n }\n\n public onMuxerNeedsDrain (): void {\n this.writableNeedsDrain = true\n }\n\n public onMuxerDrain (): void {\n this.safeDispatchEvent('drain')\n }\n\n /**\n * Send a data message to the remote end of the stream. Implementations of\n * this method should return the number of bytes from the passed buffer that\n * were sent successfully and if the underlying resource can accept more data.\n *\n * The implementation should always attempt to send the maximum amount of data\n * possible.\n *\n * Returning a result that means the data was only partially sent but that the\n * underlying resource can accept more data is invalid.\n */\n abstract sendData (data: Uint8ArrayList): SendResult\n\n /**\n * Send a reset message to the remote end of the stream\n */\n abstract sendReset (err: Error): void\n\n /**\n * If supported, instruct the remote end of the stream to temporarily stop\n * sending data messages\n */\n abstract sendPause (): void\n\n /**\n * If supported, inform the remote end of the stream they may resume sending\n * data messages\n */\n abstract sendResume (): void\n\n /**\n * Stop accepting new data to send and return a promise that resolves when any\n * unsent data has been written into the underlying resource.\n */\n abstract close (options?: AbortOptions): Promise<void>\n}\n","import { pEvent } from 'p-event'\nimport { AbstractMessageStream } from './abstract-message-stream.ts'\nimport type { MessageStreamInit } from './abstract-message-stream.ts'\nimport type { CounterGroup, Logger, MultiaddrConnection, MessageStreamDirection, AbortOptions } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nexport interface AbstractMultiaddrConnectionInit extends Omit<MessageStreamInit, 'log'> {\n remoteAddr: Multiaddr\n direction: MessageStreamDirection\n log: Logger\n inactivityTimeout?: number\n localAddr?: Multiaddr\n metricPrefix?: string\n metrics?: CounterGroup\n}\n\nexport abstract class AbstractMultiaddrConnection extends AbstractMessageStream implements MultiaddrConnection {\n public remoteAddr: Multiaddr\n\n private metricPrefix: string\n private metrics?: CounterGroup\n\n constructor (init: AbstractMultiaddrConnectionInit) {\n super(init)\n\n this.metricPrefix = init.metricPrefix ?? ''\n this.metrics = init.metrics\n this.remoteAddr = init.remoteAddr\n\n this.addEventListener('close', (evt) => {\n this.metrics?.increment({ [`${this.metricPrefix}end`]: true })\n\n if (evt.error != null) {\n if (evt.local) {\n this.metrics?.increment({ [`${this.metricPrefix}abort`]: true })\n } else {\n this.metrics?.increment({ [`${this.metricPrefix}reset`]: true })\n }\n } else {\n if (evt.local) {\n this.metrics?.increment({ [`${this.metricPrefix}_local_close`]: true })\n } else {\n this.metrics?.increment({ [`${this.metricPrefix}_remote_close`]: true })\n }\n }\n })\n }\n\n async close (options?: AbortOptions): Promise<void> {\n if (this.status !== 'open') {\n return\n }\n\n this.status = 'closing'\n this.writeStatus = 'closing'\n this.remoteWriteStatus = 'closing'\n this.remoteReadStatus = 'closing'\n\n // if we are currently sending data, wait for all the data to be written\n // into the underlying transport\n if (this.sendingData || this.writeBuffer.byteLength > 0) {\n this.log('waiting for write queue to become idle before closing writable end of stream, %d unsent bytes', this.writeBuffer.byteLength)\n await pEvent(this, 'idle', {\n ...options,\n rejectionEvents: [\n 'close'\n ]\n })\n }\n\n // now that the underlying transport has all the data, if the buffer is full\n // wait for it to be emptied\n if (this.writableNeedsDrain) {\n this.log('waiting for write queue to drain before closing writable end of stream, %d unsent bytes', this.writeBuffer.byteLength)\n await pEvent(this, 'drain', {\n ...options,\n rejectionEvents: [\n 'close'\n ]\n })\n }\n\n await this.sendClose(options)\n\n this.onTransportClosed()\n }\n\n /**\n * Wait for any unsent data to be written to the underlying resource, then\n * close the resource and resolve the returned promise\n */\n abstract sendClose (options?: AbortOptions): Promise<void>\n}\n","/**\n * @packageDocumentation\n *\n * Similar to [AbortSignal.any](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static)\n * except the returned promise has a `.clear` method that removes all event\n * listeners added to passed signals preventing memory leaks.\n *\n * At the time of writing at least, `AbortSignal.any` leaks memory in Node.js\n * and Deno environments:\n *\n * - https://github.com/nodejs/node/issues/54614\n * - https://github.com/denoland/deno/issues/24842\n *\n * @example\n *\n * ```js\n * import { anySignal } from 'any-signal'\n *\n * const userController = new AbortController()\n *\n * // Abort after 1 second\n * const timeoutSignal = AbortSignal.timeout(1000)\n *\n * const combinedSignal = anySignal([userController.signal, timeoutSignal])\n * combinedSignal.addEventListener('abort', () => console.log('Abort!'))\n *\n * try {\n * // The user or the timeout can now abort the action\n * await performSomeAction({ signal: combinedSignal })\n * } finally {\n * // Clear will clean up internal event handlers\n * combinedSignal.clear()\n * }\n * ```\n */\n\nexport interface ClearableSignal extends AbortSignal {\n clear(): void\n}\n\n/**\n * Takes an array of AbortSignals and returns a single signal.\n * If any signals are aborted, the returned signal will be aborted.\n */\nexport function anySignal (signals: Array<AbortSignal | undefined | null>): ClearableSignal {\n const controller = new globalThis.AbortController()\n\n function onAbort (): void {\n const reason = signals\n .filter(s => s?.aborted === true)\n .map(s => s?.reason)\n .pop()\n\n controller.abort(reason)\n\n for (const signal of signals) {\n if (signal?.removeEventListener != null) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n }\n\n for (const signal of signals) {\n if (signal?.aborted === true) {\n onAbort()\n break\n }\n\n if (signal?.addEventListener != null) {\n signal.addEventListener('abort', onAbort)\n }\n }\n\n function clear (): void {\n for (const signal of signals) {\n if (signal?.removeEventListener != null) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n }\n\n const signal = controller.signal as ClearableSignal\n signal.clear = clear\n\n return signal\n}\n","import os from 'node:os'\nimport { isLinkLocalIp } from './link-local-ip.js'\nimport { getNetConfig } from './multiaddr/get-net-config.ts'\nimport { netConfigToMultiaddr } from './multiaddr/utils.ts'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nconst FAMILIES = { 4: 'IPv4', 6: 'IPv6' }\n\nfunction isWildcard (ip: string): boolean {\n return ['0.0.0.0', '::'].includes(ip)\n}\n\nfunction getNetworkAddrs (family: 4 | 6): string[] {\n const addresses: string[] = []\n const networks = os.networkInterfaces()\n\n for (const [, netAddrs] of Object.entries(networks)) {\n if (netAddrs != null) {\n for (const netAddr of netAddrs) {\n if (isLinkLocalIp(netAddr.address)) {\n continue\n }\n\n if (netAddr.family === FAMILIES[family]) {\n addresses.push(netAddr.address)\n }\n }\n }\n }\n\n return addresses\n}\n\n/**\n * Get all thin waist addresses on the current host that match the family of the\n * passed multiaddr and optionally override the port.\n *\n * Wildcard IP4/6 addresses will be expanded into all available interfaces.\n */\nexport function getThinWaistAddresses (ma?: Multiaddr, port?: number | string): Multiaddr[] {\n if (ma == null) {\n return []\n }\n\n const config = getNetConfig(ma)\n\n if ((config.type === 'ip4' || config.type === 'ip6') && isWildcard(config.host)) {\n return getNetworkAddrs(config.type === 'ip4' ? 4 : 6)\n .map(host => netConfigToMultiaddr(config, port, host))\n }\n\n return [\n netConfigToMultiaddr(config, port)\n ]\n}\n","export function isLinkLocalIp (ip: string): boolean {\n if (ip.startsWith('169.254.')) {\n return true\n }\n\n if (ip.toLowerCase().startsWith('fe80')) {\n return true\n }\n\n return false\n}\n","import { CODE_IP4, CODE_IP6, CODE_IP6ZONE, multiaddr } from '@multiformats/multiaddr'\nimport type { NetConfig } from './get-net-config.ts'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nexport function getIpFromMultiaddr (ma: Multiaddr): string | undefined {\n const components = ma.getComponents()\n let index = 0\n\n if (components[0]?.code === CODE_IP6ZONE) {\n index++\n }\n\n if (components[index]?.code !== CODE_IP4 && components[index]?.code !== CODE_IP6) {\n return\n }\n\n return components[index]?.value\n}\n\nexport function netConfigToMultiaddr (config: NetConfig, port?: number | string, host?: string): Multiaddr {\n const parts: Array<string | number> = [\n config.type,\n host ?? config.host\n ]\n\n if (config.protocol != null) {\n const p = port ?? config.port\n\n if (p != null) {\n parts.push(\n config.protocol,\n p\n )\n }\n }\n\n if (config.type === 'ip6' && config.zone != null) {\n parts.unshift('ip6zone', config.zone)\n }\n\n if (config.cidr != null) {\n parts.push('ipcidr', config.cidr)\n }\n\n return multiaddr(`/${parts.join('/')}`)\n}\n","import { isIPv4, isIPv6 } from '@chainsafe/is-ip'\nimport { InvalidParametersError } from '@libp2p/interface'\nimport { multiaddr } from '@multiformats/multiaddr'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\n/**\n * Transform an IP, Port pair into a multiaddr\n */\nexport function ipPortToMultiaddr (ip: string, port: number | string): Multiaddr {\n if (typeof ip !== 'string') {\n throw new InvalidParametersError(`invalid ip provided: ${ip}`)\n }\n\n if (typeof port === 'string') {\n port = parseInt(port)\n }\n\n if (isNaN(port)) {\n throw new InvalidParametersError(`invalid port provided: ${port}`)\n }\n\n if (isIPv4(ip)) {\n return multiaddr(`/ip4/${ip}/tcp/${port}`)\n }\n\n if (isIPv6(ip)) {\n return multiaddr(`/ip6/${ip}/tcp/${port}`)\n }\n\n throw new InvalidParametersError(`invalid ip:port for creating a multiaddr: ${ip}:${port}`)\n}\n","import { anySignal } from 'any-signal'\nimport { setMaxListeners } from 'main-event'\nimport { debounce } from './debounce.ts'\nimport type { AbortOptions } from '@libp2p/interface'\n\nexport interface RepeatingTask {\n /**\n * Update the interval after which the next iteration of the task will run.\n *\n * This is useful if, for example, you want to retry a task with a short rest\n * duration until it succeeds, then periodically after that.\n *\n * This only affects the next iteration of the task, if it is currently\n * running, that run will not be interrupted.\n *\n * Setting the interval to the current value has no effect.\n */\n setInterval(ms: number): void\n\n /**\n * Update the amount of time a task will run before the passed abort signal\n * will fire.\n *\n * This only affects the next iteration of the task, if it is currently\n * running, that run will not be interrupted.\n */\n setTimeout(ms: number): void\n\n /**\n * Schedule the task to be run immediately - if the task is not running it\n * will run after a short delay in order to debounce multiple `.run()`\n * invocations.\n */\n run(): void\n\n /**\n * Start the task running\n */\n start(): void\n\n /**\n * Stop the task running\n */\n stop(): void\n}\n\nexport interface RepeatingTaskOptions {\n /**\n * How long the task is allowed to run before the passed AbortSignal fires an\n * abort event\n */\n timeout?: number\n\n /**\n * Whether to schedule the task to run immediately\n *\n * @default false\n */\n runImmediately?: boolean\n\n /**\n * When `.run()` is called to run the task outside of the current interval,\n * debounce repeated calls to `.run()` by this amount.\n *\n * @default 100\n */\n debounce?: number\n}\n\nexport function repeatingTask (fn: (options?: AbortOptions) => void | Promise<void>, interval: number, options?: RepeatingTaskOptions): RepeatingTask {\n let timeout: ReturnType<typeof setTimeout>\n let shutdownController: AbortController\n let running = false\n\n function runTask (): void {\n const opts: AbortOptions = {\n signal: shutdownController.signal\n }\n\n if (options?.timeout != null) {\n const signal = anySignal([shutdownController.signal, AbortSignal.timeout(options.timeout)])\n setMaxListeners(Infinity, signal)\n\n opts.signal = signal\n }\n\n running = true\n\n Promise.resolve().then(async () => {\n await fn(opts)\n })\n .catch(() => {})\n .finally(() => {\n running = false\n\n if (shutdownController.signal.aborted) {\n // task has been cancelled, bail\n return\n }\n\n // reschedule\n timeout = setTimeout(runTask, interval)\n })\n }\n\n const runTaskDebounced = debounce(runTask, options?.debounce ?? 100)\n\n let started = false\n\n return {\n setInterval: (ms): void => {\n if (interval === ms) {\n // already running at this interval, nothing to do\n return\n }\n\n interval = ms\n\n // maybe reschedule\n if (timeout != null) {\n clearTimeout(timeout)\n timeout = setTimeout(runTask, interval)\n }\n },\n setTimeout: (ms): void => {\n options ??= {}\n options.timeout = ms\n },\n run: (): void => {\n if (running) {\n return\n }\n\n clearTimeout(timeout)\n runTaskDebounced()\n },\n start: (): void => {\n if (started) {\n return\n }\n\n started = true\n shutdownController = new AbortController()\n setMaxListeners(Infinity, shutdownController.signal)\n\n // run now\n if (options?.runImmediately === true) {\n queueMicrotask(() => {\n runTask()\n })\n } else {\n // run later\n timeout = setTimeout(runTask, interval)\n }\n },\n stop: (): void => {\n clearTimeout(timeout)\n shutdownController?.abort()\n started = false\n }\n }\n}\n","import type { WebSocket as WSSWebSocket } from 'ws'\n\n/**\n * Adds properties/methods to a `WebSocket` instance from the `ws` module to be\n * compatible with the `globalThis.WebSocket` API\n */\nexport function toWebSocket (ws: WSSWebSocket): WebSocket {\n Object.defineProperty(ws, 'url', {\n value: '',\n writable: false\n })\n\n // @ts-expect-error not a WS/WebSocket method\n ws.dispatchEvent = (evt: Event) => {\n if (evt.type === 'close') {\n ws.emit('close')\n }\n\n if (evt.type === 'open') {\n ws.emit('open')\n }\n\n if (evt.type === 'message') {\n const m = evt as MessageEvent\n ws.emit('data', m.data)\n }\n\n if (evt.type === 'error') {\n ws.emit('error', new Error('An error occurred'))\n }\n ws.emit(evt.type, evt)\n }\n\n // @ts-expect-error ws is now WebSocket\n return ws\n}\n","import { AbstractMultiaddrConnection, repeatingTask } from '@libp2p/utils'\nimport { Uint8ArrayList } from 'uint8arraylist'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport type { AbortOptions, MultiaddrConnection } from '@libp2p/interface'\nimport type { AbstractMultiaddrConnectionInit, RepeatingTask, SendResult } from '@libp2p/utils'\n\nconst DEFAULT_MAX_BUFFERED_AMOUNT = 1024 * 1024 * 4\nconst DEFAULT_BUFFERED_AMOUNT_POLL_INTERVAL = 10\n\nexport interface WebSocketMultiaddrConnectionInit extends Omit<AbstractMultiaddrConnectionInit, 'name'> {\n websocket: WebSocket\n maxBufferedAmount?: number\n bufferedAmountPollInterval?: number\n}\n\nclass WebSocketMultiaddrConnection extends AbstractMultiaddrConnection {\n private websocket: WebSocket\n private maxBufferedAmount: number\n private checkBufferedAmountTask: RepeatingTask\n\n constructor (init: WebSocketMultiaddrConnectionInit) {\n super(init)\n\n this.websocket = init.websocket\n this.maxBufferedAmount = init.maxBufferedAmount ?? DEFAULT_MAX_BUFFERED_AMOUNT\n this.checkBufferedAmountTask = repeatingTask(this.checkBufferedAmount.bind(this), init.bufferedAmountPollInterval ?? DEFAULT_BUFFERED_AMOUNT_POLL_INTERVAL)\n\n this.websocket.addEventListener('close', (evt) => {\n this.log('closed - code %d, reason \"%s\", wasClean %s', evt.code, evt.reason, evt.wasClean)\n this.checkBufferedAmountTask.stop()\n\n if (!evt.wasClean) {\n this.onRemoteReset()\n return\n }\n\n this.onTransportClosed()\n }, { once: true })\n\n this.websocket.addEventListener('message', (evt) => {\n try {\n let buf: Uint8Array\n\n if (typeof evt.data === 'string') {\n buf = uint8ArrayFromString(evt.data)\n } else if (evt.data instanceof ArrayBuffer) {\n buf = new Uint8Array(evt.data, 0, evt.data.byteLength)\n } else {\n this.abort(new Error('Incorrect binary type'))\n return\n }\n\n this.onData(buf)\n } catch (err: any) {\n this.log.error('error receiving data - %e', err)\n }\n })\n }\n\n sendData (data: Uint8ArrayList): SendResult {\n for (const buf of data) {\n this.websocket.send(buf)\n }\n\n const canSendMore = this.websocket.bufferedAmount < this.maxBufferedAmount\n\n if (!canSendMore) {\n this.checkBufferedAmountTask.start()\n }\n\n return {\n sentBytes: data.byteLength,\n canSendMore\n }\n }\n\n sendReset (): void {\n this.websocket.close(1006) // abnormal closure\n }\n\n async sendClose (options?: AbortOptions): Promise<void> {\n this.websocket.close()\n options?.signal?.throwIfAborted()\n }\n\n sendPause (): void {\n // read backpressure is not supported\n }\n\n sendResume (): void {\n // read backpressure is not supported\n }\n\n private checkBufferedAmount (): void {\n this.log('buffered amount now %d', this.websocket.bufferedAmount)\n\n if (this.websocket.bufferedAmount === 0) {\n this.checkBufferedAmountTask.stop()\n this.safeDispatchEvent('drain')\n }\n }\n}\n\n// Convert a stream into a MultiaddrConnection\n// https://github.com/libp2p/interface-transport#multiaddrconnection\nexport function webSocketToMaConn (init: WebSocketMultiaddrConnectionInit): MultiaddrConnection {\n return new WebSocketMultiaddrConnection(init)\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport class Logger {\n private level: LogLevel;\n private prefix: string;\n\n constructor(prefix: string, level: LogLevel = LogLevel.INFO) {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG:`, message, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.info(`[${this.prefix}] INFO:`, message, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN:`, message, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR:`, message, ...args);\n }\n }\n}\n\nexport const createLogger = (prefix: string, level?: LogLevel): Logger => {\n return new Logger(prefix, level);\n};\n","import Ajv, { JSONSchemaType } from 'ajv';\nimport { DiscoveryError } from '../utils/errors.js';\n\n// Re-export Phase 2 types\nexport type { AgentCard, Capability, CapabilityParameter, LegacyAgentCard } from './agent-card-types.js';\nexport { isLegacyCard, upgradeLegacyCard, downgradeToLegacyCard } from './agent-card-types.js';\n\n// Import for internal use\nimport type { AgentCard, Capability, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard } from './agent-card-types.js';\n\n// Legacy schema for backward compatibility\nconst legacyAgentCardSchema: JSONSchemaType<Omit<LegacyAgentCard, 'signature'>> = {\n type: 'object',\n properties: {\n did: { type: 'string', pattern: '^did:clawiverse:[1-9A-HJ-NP-Za-km-z]+$' },\n name: { type: 'string', minLength: 1, maxLength: 100 },\n description: { type: 'string', maxLength: 500 },\n version: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$' },\n capabilities: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 50,\n },\n endpoints: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 10,\n },\n peerId: { type: 'string', nullable: true },\n metadata: {\n type: 'object',\n nullable: true,\n required: [],\n },\n timestamp: { type: 'number' },\n },\n required: ['did', 'name', 'description', 'version', 'capabilities', 'endpoints', 'timestamp'],\n additionalProperties: false,\n};\n\nconst ajv = new Ajv();\nconst validateLegacySchema = ajv.compile(legacyAgentCardSchema);\n\n/**\n * Create a new Agent Card (Phase 2 format with structured capabilities)\n */\nexport function createAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: Capability[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<AgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create a legacy Agent Card (Phase 1 format with string capabilities)\n * For backward compatibility\n */\nexport function createLegacyAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: string[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<LegacyAgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Validate an Agent Card structure (supports both Phase 1 and Phase 2 formats)\n */\nexport function validateAgentCard(card: unknown): card is AgentCard | LegacyAgentCard {\n if (typeof card !== 'object' || card === null) {\n return false;\n }\n\n const c = card as Partial<AgentCard | LegacyAgentCard>;\n\n // Check signature exists\n if (typeof c.signature !== 'string') {\n return false;\n }\n\n // Check if it's legacy format\n if (isLegacyCard(c as any)) {\n return validateLegacySchema(c);\n }\n\n // Phase 2 format - basic validation\n // (Full JSON-LD validation would be more complex)\n return (\n typeof c.did === 'string' &&\n typeof c.name === 'string' &&\n typeof c.description === 'string' &&\n typeof c.version === 'string' &&\n Array.isArray(c.capabilities) &&\n Array.isArray(c.endpoints) &&\n typeof c.timestamp === 'number'\n );\n}\n\n/**\n * Sign an Agent Card\n */\nexport async function signAgentCard(\n card: Omit<AgentCard, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<AgentCard> {\n try {\n const cardJson = JSON.stringify(card);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signature = await signFn(cardBytes);\n\n return {\n ...card,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new DiscoveryError('Failed to sign Agent Card', error);\n }\n}\n\n/**\n * Verify an Agent Card signature\n */\nexport async function verifyAgentCard(\n card: AgentCard,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...cardWithoutSig } = card;\n const cardJson = JSON.stringify(cardWithoutSig);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, cardBytes);\n } catch (error) {\n throw new DiscoveryError('Failed to verify Agent Card', error);\n }\n}\n\n/**\n * Check if an Agent Card matches a capability query\n * Supports both Phase 1 (string[]) and Phase 2 (Capability[]) formats\n */\nexport function matchesCapability(\n card: AgentCard | LegacyAgentCard,\n capability: string\n): boolean {\n if (isLegacyCard(card)) {\n return card.capabilities.some((cap) =>\n cap.toLowerCase().includes(capability.toLowerCase())\n );\n }\n\n return card.capabilities.some((cap) =>\n cap.id.toLowerCase().includes(capability.toLowerCase()) ||\n cap.name.toLowerCase().includes(capability.toLowerCase()) ||\n cap.description.toLowerCase().includes(capability.toLowerCase())\n );\n}\n","/**\n * Enhanced Agent Card Types for Phase 2\n *\n * Adds structured capabilities, JSON-LD support, and trust metrics\n */\n\nimport type { TrustScore } from '../trust/trust-score.js';\n\n/**\n * Capability Parameter Definition\n */\nexport interface CapabilityParameter {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n required: boolean;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\n/**\n * Structured Capability Definition\n */\nexport interface Capability {\n '@type'?: string; // JSON-LD type (e.g., \"TranslationService\")\n id: string; // Unique capability ID\n name: string; // Human-readable name\n description: string;\n parameters?: CapabilityParameter[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Enhanced Agent Card with JSON-LD support\n */\nexport interface AgentCard {\n '@context'?: string[]; // JSON-LD context\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: Capability[]; // Changed from string[] to Capability[]\n endpoints: string[];\n peerId?: string;\n trust?: TrustScore; // Trust metrics\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Legacy Agent Card (Phase 1 compatibility)\n */\nexport interface LegacyAgentCard {\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: string[]; // Flat string array\n endpoints: string[];\n peerId?: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Check if card is legacy format\n */\nexport function isLegacyCard(card: AgentCard | LegacyAgentCard): card is LegacyAgentCard {\n return Array.isArray(card.capabilities) &&\n card.capabilities.length > 0 &&\n typeof card.capabilities[0] === 'string';\n}\n\n/**\n * Convert legacy card to new format\n */\nexport function upgradeLegacyCard(legacy: LegacyAgentCard): AgentCard {\n return {\n ...legacy,\n capabilities: legacy.capabilities.map(cap => ({\n id: cap,\n name: cap,\n description: `Capability: ${cap}`,\n })),\n };\n}\n\n/**\n * Convert new card to legacy format (for backward compatibility)\n */\nexport function downgradeToLegacyCard(card: AgentCard): LegacyAgentCard {\n const { '@context': _, trust: __, ...rest } = card;\n return {\n ...rest,\n capabilities: card.capabilities.map(cap => cap.id),\n };\n}\n","/**\n * JSON-LD Schema Definitions for Agent Cards\n *\n * Defines the Clawiverse vocabulary and integrates with Schema.org\n * for semantic interoperability.\n */\n\nexport const CLAWIVERSE_CONTEXT = 'https://clawiverse.org/context/v1';\nexport const SCHEMA_ORG_CONTEXT = 'https://schema.org';\n\n/**\n * Clawiverse JSON-LD Context\n * Defines the vocabulary for Agent Cards and Capabilities\n */\nexport const clawiverseContext = {\n '@context': {\n '@vocab': CLAWIVERSE_CONTEXT,\n 'schema': SCHEMA_ORG_CONTEXT,\n 'AgentCard': 'schema:SoftwareApplication',\n 'Capability': 'schema:Action',\n 'did': '@id',\n 'name': 'schema:name',\n 'description': 'schema:description',\n 'version': 'schema:softwareVersion',\n 'capabilities': {\n '@id': 'schema:potentialAction',\n '@type': '@id',\n '@container': '@list'\n },\n 'endpoints': {\n '@id': 'schema:url',\n '@container': '@list'\n },\n 'peerId': 'clawiverse:peerId',\n 'trust': 'clawiverse:trustScore',\n 'metadata': 'schema:additionalProperty',\n 'timestamp': 'schema:dateModified',\n 'signature': 'clawiverse:signature',\n 'parameters': {\n '@id': 'schema:object',\n '@container': '@list'\n }\n }\n};\n\n/**\n * Capability Type Definitions\n * Common capability types with semantic meaning\n */\nexport const CapabilityTypes = {\n TRANSLATION: 'TranslationService',\n CODE_REVIEW: 'CodeReviewService',\n DATA_ANALYSIS: 'DataAnalysisService',\n TEXT_GENERATION: 'TextGenerationService',\n IMAGE_GENERATION: 'ImageGenerationService',\n SEARCH: 'SearchService',\n COMPUTATION: 'ComputationService',\n STORAGE: 'StorageService',\n MESSAGING: 'MessagingService',\n AUTHENTICATION: 'AuthenticationService',\n} as const;\n\n/**\n * Parameter Type Definitions\n */\nexport const ParameterTypes = {\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n OBJECT: 'object',\n ARRAY: 'array',\n} as const;\n\n/**\n * Get JSON-LD context for Agent Card\n */\nexport function getAgentCardContext(): string[] {\n return [SCHEMA_ORG_CONTEXT, CLAWIVERSE_CONTEXT];\n}\n\n/**\n * Validate JSON-LD context\n */\nexport function isValidContext(context: unknown): boolean {\n if (!Array.isArray(context)) return false;\n return context.every(c => typeof c === 'string');\n}\n","/**\n * Agent Card Encoder - Dual Encoding Support\n *\n * Provides bidirectional conversion between:\n * - CBOR (compact binary) for DHT storage\n * - JSON-LD (semantic) for Web publishing\n */\n\nimport { encode as cborEncode, decode as cborDecode } from 'cbor-x';\nimport type { AgentCard, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard, upgradeLegacyCard } from './agent-card-types.js';\nimport { getAgentCardContext } from './agent-card-schema.js';\nimport { DiscoveryError } from '../utils/errors.js';\n\n/**\n * Encode Agent Card as CBOR for DHT storage\n */\nexport function encodeForDHT(card: AgentCard): Uint8Array {\n try {\n // Remove JSON-LD context for compact storage\n const { '@context': _, ...cardWithoutContext } = card;\n return cborEncode(cardWithoutContext);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as CBOR', error);\n }\n}\n\n/**\n * Encode Agent Card as JSON-LD for Web publishing\n */\nexport function encodeForWeb(card: AgentCard): string {\n try {\n // Ensure JSON-LD context is present\n const cardWithContext: AgentCard = {\n '@context': card['@context'] || getAgentCardContext(),\n ...card,\n };\n return JSON.stringify(cardWithContext, null, 2);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as JSON-LD', error);\n }\n}\n\n/**\n * Decode Agent Card from CBOR\n */\nexport function decodeFromCBOR(data: Uint8Array): AgentCard {\n try {\n const decoded = cborDecode(data) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from CBOR', error);\n }\n}\n\n/**\n * Decode Agent Card from JSON-LD\n */\nexport function decodeFromJSON(json: string): AgentCard {\n try {\n const decoded = JSON.parse(json) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from JSON', error);\n }\n}\n\n/**\n * Auto-detect format and decode\n */\nexport function decodeAgentCard(data: Uint8Array | string): AgentCard {\n if (typeof data === 'string') {\n return decodeFromJSON(data);\n }\n\n // Try CBOR first, fallback to JSON if it looks like text\n try {\n return decodeFromCBOR(data);\n } catch {\n // Check if it's actually JSON text\n const text = new TextDecoder().decode(data);\n if (text.trim().startsWith('{')) {\n return decodeFromJSON(text);\n }\n throw new DiscoveryError('Unable to decode Agent Card: unknown format');\n }\n}\n\n/**\n * Calculate encoded size for comparison\n */\nexport function getEncodedSize(card: AgentCard): { cbor: number; json: number } {\n return {\n cbor: encodeForDHT(card).length,\n json: encodeForWeb(card).length,\n };\n}\n","import type { Libp2p } from 'libp2p';\nimport type { AgentCard } from './agent-card.js';\nimport { createLogger } from '../utils/logger.js';\nimport { DiscoveryError } from '../utils/errors.js';\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string';\nimport { encodeForDHT, decodeFromCBOR } from './agent-card-encoder.js';\nimport { createSemanticSearch } from './semantic-search.js';\nimport type { SemanticQuery } from './search-index.js';\n\nconst logger = createLogger('dht');\n\nexport interface ResolvedDID {\n peerId: string;\n multiaddrs: string[];\n}\n\ninterface CachedPeerInfo {\n peerId: string;\n multiaddrs: string[];\n timestamp: number;\n}\n\nconst peerCache = new Map<string, CachedPeerInfo>();\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\nexport interface DHTOperations {\n publishAgentCard: (card: AgentCard) => Promise<void>;\n queryAgentCard: (did: string) => Promise<AgentCard | null>;\n queryByCapability: (capability: string) => Promise<AgentCard[]>;\n searchSemantic: (query: SemanticQuery) => Promise<AgentCard[]>;\n resolveDID: (did: string) => Promise<ResolvedDID | null>;\n queryRelayPeers: () => Promise<string[]>;\n}\n\n/** Extract a DHT value from a get() event, handling both VALUE and PEER_RESPONSE */\nfunction extractValue(event: any): Uint8Array | null {\n if (event.name === 'VALUE' && event.value) return event.value;\n if (event.name === 'PEER_RESPONSE' && event.value) return event.value;\n return null;\n}\n\n/** Normalize capability name for use as a DHT key segment */\nfunction capKey(cap: string): string {\n return cap.toLowerCase().replace(/[^a-z0-9_-]/g, '_');\n}\n\n/** Read a DID list stored at a DHT key (newline-separated) */\nasync function readDIDList(dht: any, key: Uint8Array): Promise<string[]> {\n try {\n for await (const event of dht.get(key, { signal: AbortSignal.timeout(30000) })) {\n const raw = extractValue(event);\n if (raw) {\n const text = uint8ArrayToString(raw);\n return text.split('\\n').filter(Boolean);\n }\n }\n } catch {\n // key not found or timeout\n }\n return [];\n}\n\n/** Write a DID list to a DHT key (newline-separated), deduplicating */\nasync function writeDIDList(dht: any, key: Uint8Array, dids: string[]): Promise<void> {\n const value = uint8ArrayFromString([...new Set(dids)].join('\\n'));\n // Retry up to 3 times with 30s timeout each\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n for await (const _ of dht.put(key, value, { signal: AbortSignal.timeout(30000) })) { /* consume */ }\n return; // Success\n } catch (e: any) {\n if (e?.name === 'AbortError' && attempt < 3) {\n logger.debug(`DHT put timeout, retrying (${attempt}/3)...`);\n continue;\n }\n if (e?.name !== 'AbortError') throw e;\n }\n }\n}\n\n/**\n * Create DHT operations for a libp2p node\n */\nexport function createDHTOperations(libp2p: Libp2p): DHTOperations {\n const operations: DHTOperations = {} as DHTOperations;\n const searchEngine = createSemanticSearch(operations);\n\n return Object.assign(operations, {\n publishAgentCard: async (card: AgentCard) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n // 1. Store Agent Card under /clawiverse/agent/<did>\n const agentKey = uint8ArrayFromString(`/clawiverse/agent/${card.did}`);\n // Retry up to 3 times with 30s timeout each\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n for await (const _ of dht.put(agentKey, encodeForDHT(card), { signal: AbortSignal.timeout(30000) })) { /* consume */ }\n break; // Success\n } catch (e: any) {\n if (e?.name === 'AbortError' && attempt < 3) {\n logger.debug(`DHT put agent card timeout, retrying (${attempt}/3)...`);\n continue;\n }\n logger.warn('DHT put agent card failed (non-fatal)', { error: (e as Error).message });\n break;\n }\n }\n\n // 2. For each capability, append this DID to /clawiverse/cap/<capability>\n // Skip capability indexing in slow networks - rely on local index and semantic search instead\n const caps: string[] = (card.capabilities ?? []).flatMap((c: any) => {\n if (typeof c === 'string') return [c];\n return [c.name, c.id].filter((v): v is string => typeof v === 'string' && v.length > 0);\n });\n\n // Always index under the special \"all\" key so name/description search works\n caps.push('__all__');\n\n // Keep indexing lightweight, but preserve relay discovery path.\n const importantCaps = ['__all__'];\n if (caps.some((cap) => capKey(cap) === 'relay')) {\n importantCaps.push('relay');\n }\n await Promise.all(importantCaps.map(async (cap) => {\n const capKeyStr = `/clawiverse/cap/${capKey(cap)}`;\n const capDHTKey = uint8ArrayFromString(capKeyStr);\n try {\n const existing = await readDIDList(dht, capDHTKey);\n if (!existing.includes(card.did)) {\n await writeDIDList(dht, capDHTKey, [...existing, card.did]);\n logger.debug('Indexed capability in DHT', { cap: capKey(cap), did: card.did });\n }\n } catch (e: any) {\n logger.warn('Failed to index capability (non-fatal)', { cap: capKey(cap), error: (e as Error).message });\n }\n }));\n\n // 3. Index locally for fast in-process search\n searchEngine.indexAgentCard(card);\n\n logger.info('Published Agent Card to DHT', { did: card.did });\n } catch (error) {\n // DHT publish failure is non-fatal - local index is still available\n logger.warn('Failed to publish Agent Card to DHT (non-fatal)', { error: (error as Error).message });\n // Still index locally even if DHT fails\n searchEngine.indexAgentCard(card);\n }\n },\n\n queryAgentCard: async (did: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n searchEngine.indexAgentCard(card);\n logger.debug('Found Agent Card in DHT', { did });\n return card;\n }\n }\n\n logger.debug('Agent Card not found in DHT', { did });\n return null;\n } catch (error) {\n logger.warn('Failed to query Agent Card', { did, error });\n return null;\n }\n },\n\n queryByCapability: async (capability: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n\n // 1. Check local index first\n const local = searchEngine.getAllIndexedCards().filter(card =>\n card.capabilities.some((cap: any) => {\n const name = typeof cap === 'string' ? cap : cap.name;\n return name?.toLowerCase().includes(capability.toLowerCase());\n })\n );\n if (local.length > 0) return local;\n\n // 2. Fall back to DHT capability index\n if (!dht) return [];\n\n const capDHTKey = uint8ArrayFromString(`/clawiverse/cap/${capKey(capability)}`);\n const dids = await readDIDList(dht, capDHTKey);\n logger.debug('DHT capability index', { capability, dids });\n\n // Fetch each Agent Card in parallel\n const cards = await Promise.all(\n dids.map(async (did) => {\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n try {\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n searchEngine.indexAgentCard(card);\n return card;\n }\n }\n } catch { /* skip unreachable */ }\n return null;\n })\n );\n\n return cards.filter((c): c is AgentCard => c !== null);\n } catch (error) {\n throw new DiscoveryError('Failed to query by capability', error);\n }\n },\n\n searchSemantic: async (query: SemanticQuery) => {\n try {\n // Always pull from DHT __all__ index to discover remote nodes\n const dht = (libp2p as any).services?.dht;\n if (dht) {\n const allKey = uint8ArrayFromString('/clawiverse/cap/__all__');\n const dids = await readDIDList(dht, allKey);\n logger.debug('DHT __all__ index', { count: dids.length });\n\n await Promise.all(\n dids.map(async (did) => {\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n try {\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n searchEngine.indexAgentCard(decodeFromCBOR(raw));\n break;\n }\n }\n } catch { /* skip */ }\n })\n );\n }\n\n return searchEngine.search(query);\n } catch (error) {\n throw new DiscoveryError('Failed to perform semantic search', error);\n }\n },\n\n queryRelayPeers: async (): Promise<string[]> => {\n const dht = (libp2p as any).services?.dht;\n if (!dht) return [];\n const capDHTKey = uint8ArrayFromString('/clawiverse/cap/relay');\n const dids = await readDIDList(dht, capDHTKey);\n const addrs: string[] = [];\n await Promise.all(dids.map(async (did) => {\n const card = await operations.queryAgentCard(did);\n if (card?.endpoints) {\n addrs.push(...card.endpoints.filter((e: string) => !e.includes('/p2p-circuit/')));\n }\n }));\n return addrs;\n },\n\n resolveDID: async (did: string) => {\n try {\n // Check cache first\n const cached = peerCache.get(did);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n logger.debug('Using cached peer info', { did });\n return { peerId: cached.peerId, multiaddrs: cached.multiaddrs };\n }\n\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n if (card.peerId) {\n logger.debug('Resolved DID to peer', { did, peerId: card.peerId });\n const result = { peerId: card.peerId, multiaddrs: card.endpoints || [] };\n\n // Cache the result\n peerCache.set(did, {\n peerId: result.peerId,\n multiaddrs: result.multiaddrs,\n timestamp: Date.now()\n });\n\n return result;\n }\n logger.warn('Agent Card found but has no peerId', { did });\n return null;\n }\n }\n\n logger.debug('DID not found in DHT', { did });\n return null;\n } catch (error) {\n logger.warn('Failed to resolve DID', { did, error });\n return null;\n }\n },\n });\n}\n","/**\n * Semantic Search Engine\n *\n * Provides intelligent agent discovery through semantic search\n * with local-first strategy and network fallback\n */\n\nimport type { AgentCard } from './agent-card-types.js';\nimport { SearchIndex } from './search-index.js';\nimport type { SemanticQuery, SearchResult } from './search-index.js';\nimport { CapabilityMatcher } from './capability-matcher.js';\nimport type { DHTOperations } from './dht.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('semantic-search');\n\n/**\n * Semantic Search Engine\n */\nexport class SemanticSearchEngine {\n private index: SearchIndex;\n private matcher: CapabilityMatcher;\n\n constructor(private dht?: DHTOperations) {\n this.index = new SearchIndex();\n this.matcher = new CapabilityMatcher();\n }\n\n /**\n * Main search interface\n * Local-first with network fallback\n */\n async search(query: SemanticQuery): Promise<AgentCard[]> {\n logger.info('Searching for agents', { query });\n\n // 1. Search local index\n const localResults = this.index.search(query);\n logger.debug('Local search results', { count: localResults.length });\n\n // 2. If insufficient results, query network\n const limit = query.limit || 10;\n if (localResults.length < limit && this.dht) {\n logger.debug('Insufficient local results, querying network');\n const networkResults = await this.searchNetwork(query);\n return this.mergeResults(localResults, networkResults, limit);\n }\n\n return localResults.map(r => r.card);\n }\n\n /**\n * Index an Agent Card for local search\n */\n indexAgentCard(card: AgentCard): void {\n this.index.indexAgentCard(card);\n }\n\n /**\n * Remove an Agent Card from local index\n */\n removeAgentCard(did: string): void {\n this.index.removeAgentCard(did);\n }\n\n /**\n * Get all indexed cards\n */\n getAllIndexedCards(): AgentCard[] {\n return this.index.getAllCards();\n }\n\n /**\n * Clear local index\n */\n clearIndex(): void {\n this.index.clear();\n }\n\n /**\n * Get index size\n */\n getIndexSize(): number {\n return this.index.size();\n }\n\n /**\n * Search network via DHT\n */\n private async searchNetwork(query: SemanticQuery): Promise<SearchResult[]> {\n if (!this.dht) {\n return [];\n }\n\n try {\n // For now, use capability-based DHT query\n // In future, implement distributed semantic search overlay\n const capability = query.capability || this.extractPrimaryCapability(query.text);\n\n if (!capability) {\n logger.debug('No capability extracted from query, skipping network search');\n return [];\n }\n\n const cards = await this.dht.queryByCapability(capability);\n logger.debug('Network search results', { count: cards.length });\n\n // Score network results\n return cards.map(card => {\n const score = this.scoreCard(card, query);\n return { card, score };\n });\n } catch (error) {\n logger.error('Network search failed', { error });\n return [];\n }\n }\n\n /**\n * Merge local and network results, removing duplicates\n */\n private mergeResults(\n local: SearchResult[],\n network: SearchResult[],\n limit: number\n ): AgentCard[] {\n const seen = new Set<string>();\n const merged: SearchResult[] = [];\n\n // Add local results first (they're already scored and sorted)\n for (const result of local) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n }\n }\n\n // Add network results\n for (const result of network) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n\n // Also index for future searches\n this.index.indexAgentCard(result.card);\n }\n }\n\n // Sort by score and apply limit\n merged.sort((a, b) => b.score - a.score);\n return merged.slice(0, limit).map(r => r.card);\n }\n\n /**\n * Score a card against a query\n */\n private scoreCard(card: AgentCard, query: SemanticQuery): number {\n let totalScore = 0;\n let count = 0;\n\n for (const capability of card.capabilities) {\n const score = this.matcher.match(query, capability);\n if (score > 0) {\n totalScore += score;\n count++;\n }\n }\n\n // Average score across matching capabilities\n const avgScore = count > 0 ? totalScore / count : 0;\n\n // Boost by trust score if available\n if (card.trust) {\n const trustBoost = card.trust.interactionScore * 0.2;\n return Math.min(avgScore + trustBoost, 1.0);\n }\n\n return avgScore;\n }\n\n /**\n * Extract primary capability from natural language text\n */\n private extractPrimaryCapability(text?: string): string | undefined {\n if (!text) return undefined;\n\n const keywords = this.matcher.extractKeywords(text);\n\n // Common capability keywords\n const capabilityKeywords = [\n 'translate', 'translation',\n 'review', 'code',\n 'analyze', 'analysis',\n 'generate', 'generation',\n 'search', 'query',\n 'compute', 'calculation',\n 'store', 'storage',\n 'message', 'messaging',\n 'auth', 'authentication',\n ];\n\n // Find first matching keyword\n for (const keyword of keywords) {\n if (capabilityKeywords.includes(keyword)) {\n return keyword;\n }\n }\n\n // Return first keyword as fallback\n return keywords[0];\n }\n}\n\n/**\n * Create a semantic search engine\n */\nexport function createSemanticSearch(dht?: DHTOperations): SemanticSearchEngine {\n return new SemanticSearchEngine(dht);\n}\n","/**\n * Search Index for Agent Discovery\n *\n * Maintains a local index of discovered agents for fast semantic search\n */\n\nimport lunr from 'lunr';\nimport Fuse from 'fuse.js';\nimport type { AgentCard } from './agent-card-types.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('search-index');\n\n/**\n * Semantic Query Interface\n */\nexport interface SemanticQuery {\n text?: string; // Natural language: \"translate Japanese\"\n capability?: string; // Structured: \"translate\"\n filters?: {\n language?: string;\n minTrustScore?: number;\n maxCost?: number;\n tags?: string[];\n };\n limit?: number;\n}\n\n/**\n * Search Result with Score\n */\nexport interface SearchResult {\n card: AgentCard;\n score: number;\n}\n\n/**\n * Search Index Implementation\n */\nexport class SearchIndex {\n private cards = new Map<string, AgentCard>();\n private lunrIndex?: lunr.Index;\n private fuse?: Fuse<AgentCard>;\n private needsRebuild = false;\n\n /**\n * Add or update an Agent Card in the index\n */\n indexAgentCard(card: AgentCard): void {\n this.cards.set(card.did, card);\n this.needsRebuild = true;\n logger.debug('Indexed Agent Card', { did: card.did, capabilities: card.capabilities.length });\n }\n\n /**\n * Remove an Agent Card from the index\n */\n removeAgentCard(did: string): void {\n this.cards.delete(did);\n this.needsRebuild = true;\n logger.debug('Removed Agent Card from index', { did });\n }\n\n /**\n * Search for agents matching a query\n */\n search(query: SemanticQuery): SearchResult[] {\n if (this.needsRebuild) {\n this.rebuild();\n }\n\n let results: SearchResult[] = [];\n\n // Text search using Lunr\n if (query.text && this.lunrIndex) {\n results = this.searchByText(query.text);\n }\n // Capability search using Fuse\n else if (query.capability && this.fuse) {\n results = this.searchByCapability(query.capability);\n }\n // No query - return all\n else {\n results = Array.from(this.cards.values()).map(card => ({\n card,\n score: 1.0,\n }));\n }\n\n // Apply filters\n if (query.filters) {\n results = this.applyFilters(results, query.filters);\n }\n\n // Sort by score (descending)\n results.sort((a, b) => b.score - a.score);\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n logger.debug('Search completed', { query, results: results.length });\n return results;\n }\n\n /**\n * Get all indexed cards\n */\n getAllCards(): AgentCard[] {\n return Array.from(this.cards.values());\n }\n\n /**\n * Clear the index\n */\n clear(): void {\n this.cards.clear();\n this.lunrIndex = undefined;\n this.fuse = undefined;\n this.needsRebuild = false;\n logger.info('Search index cleared');\n }\n\n /**\n * Get index size\n */\n size(): number {\n return this.cards.size;\n }\n\n /**\n * Rebuild search indexes\n */\n private rebuild(): void {\n logger.info('Rebuilding search indexes', { cards: this.cards.size });\n\n const cards = Array.from(this.cards.values());\n\n // Build Lunr index for full-text search\n this.lunrIndex = lunr(function (this: lunr.Builder) {\n this.ref('did');\n this.field('name', { boost: 10 });\n this.field('description', { boost: 5 });\n this.field('capabilities');\n\n for (const card of cards) {\n this.add({\n did: card.did,\n name: card.name,\n description: card.description,\n capabilities: card.capabilities\n .map((cap: any) => `${cap.name} ${cap.description}`)\n .join(' '),\n });\n }\n });\n\n // Build Fuse index for fuzzy matching\n this.fuse = new Fuse(Array.from(this.cards.values()), {\n keys: [\n { name: 'name', weight: 0.3 },\n { name: 'description', weight: 0.2 },\n { name: 'capabilities.name', weight: 0.3 },\n { name: 'capabilities.description', weight: 0.2 },\n ],\n threshold: 0.4,\n includeScore: true,\n });\n\n this.needsRebuild = false;\n logger.info('Search indexes rebuilt');\n }\n\n /**\n * Search by text using Lunr\n */\n private searchByText(text: string): SearchResult[] {\n if (!this.lunrIndex) return [];\n\n const lunrResults = this.lunrIndex.search(text);\n return lunrResults.map(result => ({\n card: this.cards.get(result.ref)!,\n score: result.score,\n }));\n }\n\n /**\n * Search by capability using Fuse\n */\n private searchByCapability(capability: string): SearchResult[] {\n if (!this.fuse) return [];\n\n const fuseResults = this.fuse.search(capability);\n return fuseResults.map(result => ({\n card: result.item,\n score: 1 - (result.score || 0), // Fuse score is distance, convert to similarity\n }));\n }\n\n /**\n * Apply filters to search results\n */\n private applyFilters(\n results: SearchResult[],\n filters: NonNullable<SemanticQuery['filters']>\n ): SearchResult[] {\n return results.filter(result => {\n const { card } = result;\n\n // Trust score filter\n if (filters.minTrustScore !== undefined && card.trust) {\n const overallTrust =\n card.trust.interactionScore * 0.4 +\n Math.min(card.trust.endorsements / 10, 1) * 0.2 +\n card.trust.completionRate * 0.2 +\n card.trust.uptime * 0.2;\n\n if (overallTrust < filters.minTrustScore) {\n return false;\n }\n }\n\n // Language filter (check capability metadata)\n if (filters.language) {\n const hasLanguage = card.capabilities.some(\n cap => {\n const metadata = cap.metadata as Record<string, any> | undefined;\n if (!metadata) return false;\n return metadata.language === filters.language ||\n (Array.isArray(metadata.languages) && metadata.languages.includes(filters.language));\n }\n );\n if (!hasLanguage) return false;\n }\n\n // Tags filter\n if (filters.tags && filters.tags.length > 0) {\n const cardTags = Array.isArray(card.metadata?.tags) ? (card.metadata.tags as string[]) : [];\n const hasAllTags = filters.tags.every(tag => cardTags.includes(tag));\n if (!hasAllTags) return false;\n }\n\n return true;\n });\n }\n}\n","/**\n * Capability Matcher\n *\n * Matches semantic queries against agent capabilities\n */\n\nimport type { Capability } from './agent-card-types.js';\nimport type { SemanticQuery } from './search-index.js';\n\n/**\n * Capability Matcher\n */\nexport class CapabilityMatcher {\n /**\n * Match a query against a capability\n * Returns a score between 0 and 1\n */\n match(query: SemanticQuery, capability: Capability): number {\n let score = 0;\n let weights = 0;\n\n // Exact capability ID match\n if (query.capability && capability.id === query.capability) {\n return 1.0;\n }\n\n // Fuzzy capability name match\n if (query.capability) {\n const nameScore = this.fuzzyMatch(query.capability, capability.name);\n score += nameScore * 0.4;\n weights += 0.4;\n }\n\n // Text keyword match\n if (query.text) {\n const keywords = this.extractKeywords(query.text);\n const keywordScore = this.matchKeywords(keywords, capability);\n score += keywordScore * 0.4;\n weights += 0.4;\n }\n\n // Type hierarchy match\n if (query.capability && capability['@type']) {\n const typeScore = this.matchesType(query.capability, capability['@type']) ? 0.6 : 0;\n score += typeScore * 0.2;\n weights += 0.2;\n }\n\n return weights > 0 ? score / weights : 0;\n }\n\n /**\n * Extract keywords from natural language text\n */\n extractKeywords(text: string): string[] {\n // Remove common stop words\n const stopWords = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been',\n 'to', 'from', 'in', 'on', 'at', 'by', 'for', 'with', 'about',\n 'can', 'could', 'should', 'would', 'will', 'do', 'does', 'did',\n 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her',\n ]);\n\n return text\n .toLowerCase()\n .split(/\\W+/)\n .filter(word => word.length > 2 && !stopWords.has(word));\n }\n\n /**\n * Match keywords against capability\n */\n matchKeywords(keywords: string[], capability: Capability): number {\n if (keywords.length === 0) return 0;\n\n const capText = `${capability.name} ${capability.description}`.toLowerCase();\n const matches = keywords.filter(keyword => capText.includes(keyword));\n\n return matches.length / keywords.length;\n }\n\n /**\n * Check if query matches capability type hierarchy\n */\n matchesType(query: string, type: string): boolean {\n const queryLower = query.toLowerCase();\n const typeLower = type.toLowerCase();\n\n // Direct match\n if (typeLower.includes(queryLower)) return true;\n\n // Common type mappings\n const typeMap: Record<string, string[]> = {\n translate: ['translation', 'translationservice'],\n review: ['codereview', 'reviewservice'],\n analyze: ['analysis', 'dataanalysis'],\n generate: ['generation', 'textgeneration', 'imagegeneration'],\n search: ['searchservice', 'query'],\n compute: ['computation', 'computationservice'],\n store: ['storage', 'storageservice'],\n message: ['messaging', 'messagingservice'],\n auth: ['authentication', 'authenticationservice'],\n };\n\n for (const [key, values] of Object.entries(typeMap)) {\n if (queryLower.includes(key) && values.some(v => typeLower.includes(v))) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Fuzzy string matching using Levenshtein distance\n */\n private fuzzyMatch(query: string, target: string): number {\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n // Exact match\n if (queryLower === targetLower) return 1.0;\n\n // Substring match\n if (targetLower.includes(queryLower)) return 0.8;\n if (queryLower.includes(targetLower)) return 0.7;\n\n // Levenshtein distance\n const distance = this.levenshteinDistance(queryLower, targetLower);\n const maxLen = Math.max(queryLower.length, targetLower.length);\n const similarity = 1 - distance / maxLen;\n\n // Only return positive scores for reasonable similarity\n return similarity > 0.5 ? similarity * 0.6 : 0;\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n }\n}\n","import { MessagingError } from '../utils/errors.js';\n\nexport interface MessageEnvelope {\n id: string;\n from: string; // DID\n to: string; // DID\n type: 'request' | 'response' | 'notification';\n protocol: string;\n payload: unknown;\n timestamp: number;\n signature: string;\n replyTo?: string; // For responses, the ID of the request\n}\n\n/**\n * Create a message envelope\n */\nexport function createEnvelope(\n from: string,\n to: string,\n type: 'request' | 'response' | 'notification',\n protocol: string,\n payload: unknown,\n replyTo?: string\n): Omit<MessageEnvelope, 'signature'> {\n return {\n id: generateMessageId(),\n from,\n to,\n type,\n protocol,\n payload,\n timestamp: Date.now(),\n replyTo,\n };\n}\n\n/**\n * Sign a message envelope\n */\nexport async function signEnvelope(\n envelope: Omit<MessageEnvelope, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<MessageEnvelope> {\n try {\n const envelopeJson = JSON.stringify(envelope);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signature = await signFn(envelopeBytes);\n\n return {\n ...envelope,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new MessagingError('Failed to sign envelope', error);\n }\n}\n\n/**\n * Verify a message envelope signature\n */\nexport async function verifyEnvelope(\n envelope: MessageEnvelope,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const envelopeJson = JSON.stringify(envelopeWithoutSig);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, envelopeBytes);\n } catch (error) {\n throw new MessagingError('Failed to verify envelope', error);\n }\n}\n\n/**\n * Validate message envelope structure\n */\nexport function validateEnvelope(msg: unknown): msg is MessageEnvelope {\n if (typeof msg !== 'object' || msg === null) {\n return false;\n }\n\n const m = msg as Partial<MessageEnvelope>;\n\n return (\n typeof m.id === 'string' &&\n typeof m.from === 'string' &&\n m.from.startsWith('did:clawiverse:') &&\n typeof m.to === 'string' &&\n m.to.startsWith('did:clawiverse:') &&\n (m.type === 'request' || m.type === 'response' || m.type === 'notification') &&\n typeof m.protocol === 'string' &&\n m.payload !== undefined &&\n typeof m.timestamp === 'number' &&\n typeof m.signature === 'string'\n );\n}\n\n/**\n * Generate a unique message ID\n */\nfunction generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n","import { encode, decode } from 'cbor-x';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessagingError } from '../utils/errors.js';\n\n/**\n * Encode a message envelope to CBOR\n */\nexport function encodeMessage(envelope: MessageEnvelope): Uint8Array {\n try {\n return encode(envelope);\n } catch (error) {\n throw new MessagingError('Failed to encode message', error);\n }\n}\n\n/**\n * Decode a CBOR message to envelope\n */\nexport function decodeMessage(data: Uint8Array): MessageEnvelope {\n try {\n return decode(data) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message', error);\n }\n}\n\n/**\n * Encode message to JSON (for debugging/logging)\n */\nexport function encodeMessageJSON(envelope: MessageEnvelope): string {\n try {\n return JSON.stringify(envelope, null, 2);\n } catch (error) {\n throw new MessagingError('Failed to encode message to JSON', error);\n }\n}\n\n/**\n * Decode JSON message to envelope\n */\nexport function decodeMessageJSON(json: string): MessageEnvelope {\n try {\n return JSON.parse(json) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message from JSON', error);\n }\n}\n","import type { Libp2p } from 'libp2p';\nimport { peerIdFromString } from '@libp2p/peer-id';\nimport { multiaddr } from '@multiformats/multiaddr';\nimport type { MessageEnvelope } from './envelope.js';\nimport type { DHTOperations } from '../discovery/dht.js';\nimport { encodeMessage, decodeMessage } from './codec.js';\nimport { validateEnvelope, verifyEnvelope } from './envelope.js';\nimport { createLogger } from '../utils/logger.js';\nimport { MessagingError } from '../utils/errors.js';\nimport { extractPublicKey } from '../identity/did.js';\nimport { verify } from '../identity/keys.js';\n\nconst logger = createLogger('router');\n\n/** Helper to efficiently concatenate Uint8Array chunks */\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n if (arrays.length === 0) return new Uint8Array(0);\n if (arrays.length === 1) return arrays[0];\n\n const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\nexport type MessageHandler = (\n envelope: MessageEnvelope\n) => Promise<MessageEnvelope | void>;\n\nexport interface PeerHint {\n peerId: string;\n multiaddrs: string[];\n}\n\nexport interface MessageRouter {\n registerHandler: (protocol: string, handler: MessageHandler) => void;\n unregisterHandler: (protocol: string) => void;\n registerCatchAllHandler: (handler: MessageHandler) => void;\n sendMessage: (envelope: MessageEnvelope, peerHint?: PeerHint) => Promise<MessageEnvelope | void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\n\n/**\n * Create a message router for a libp2p node.\n * When dht is provided, sendMessage can resolve DIDs to peer addresses via DHT lookup.\n * When relayPeers is provided, sendMessage will attempt relay fallback if direct dial fails.\n */\nexport function createMessageRouter(\n libp2p: Libp2p,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>,\n dht?: DHTOperations,\n relayPeers?: string[]\n): MessageRouter {\n const handlers = new Map<string, MessageHandler>();\n let catchAllHandler: MessageHandler | undefined;\n const PROTOCOL_PREFIX = '/clawiverse/msg/1.0.0';\n\n return {\n registerHandler: (protocol: string, handler: MessageHandler) => {\n handlers.set(protocol, handler);\n logger.info('Registered message handler', { protocol });\n },\n\n unregisterHandler: (protocol: string) => {\n handlers.delete(protocol);\n logger.info('Unregistered message handler', { protocol });\n },\n\n registerCatchAllHandler: (handler: MessageHandler) => {\n catchAllHandler = handler;\n logger.info('Registered catch-all message handler');\n },\n\n sendMessage: async (envelope: MessageEnvelope, peerHint?: PeerHint) => {\n try {\n if (!validateEnvelope(envelope)) {\n throw new MessagingError('Invalid message envelope');\n }\n\n // Resolve peer: try peerHint first, then DHT\n let targetPeerIdStr: string | undefined;\n let targetMultiaddrs: string[] = [];\n\n if (peerHint) {\n targetPeerIdStr = peerHint.peerId;\n targetMultiaddrs = peerHint.multiaddrs;\n logger.info('Using peer hint for direct addressing', { peerId: targetPeerIdStr });\n } else if (dht) {\n const resolved = await dht.resolveDID(envelope.to);\n if (resolved) {\n targetPeerIdStr = resolved.peerId;\n targetMultiaddrs = resolved.multiaddrs;\n }\n }\n\n if (!targetPeerIdStr) {\n throw new MessagingError(\n `Cannot resolve recipient: ${envelope.to} — provide peerHint or ensure agent is in DHT`\n );\n }\n\n const targetPeerId = peerIdFromString(targetPeerIdStr);\n\n if (targetMultiaddrs.length > 0) {\n const mas = targetMultiaddrs.map((a) => multiaddr(a));\n await libp2p.peerStore.merge(targetPeerId, { multiaddrs: mas });\n }\n\n logger.info('Dialing peer for message delivery', {\n peerId: targetPeerIdStr,\n multiaddrs: targetMultiaddrs,\n });\n\n let stream: any;\n const DIAL_TIMEOUT = 3000; // 3 seconds per attempt\n\n // Separate relay addrs from direct addrs\n const relayMultiaddrs = targetMultiaddrs.filter((a) => a.includes('/p2p-circuit/'));\n const directMultiaddrs = targetMultiaddrs.filter((a) => !a.includes('/p2p-circuit/'));\n\n // Try direct addresses in parallel\n if (directMultiaddrs.length > 0) {\n const directDialPromises = directMultiaddrs.map(async (addr) => {\n try {\n const conn = await libp2p.dial(multiaddr(addr), {\n signal: AbortSignal.timeout(DIAL_TIMEOUT)\n });\n const s = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('Direct dial succeeded', { addr });\n return { conn, stream: s };\n } catch {\n return null;\n }\n });\n\n const winner = await Promise.race(\n directDialPromises.map(p => p.then(r => r || Promise.reject()))\n ).catch(() => undefined);\n\n if (winner) {\n stream = winner.stream;\n // Close connections whose streams were not selected\n Promise.allSettled(directDialPromises).then((results) => {\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value && result.value.stream !== stream) {\n result.value.conn.close().catch(() => {});\n }\n }\n });\n }\n }\n\n let lastError: unknown;\n\n // Fall back to relay: try all relay addresses in parallel\n if (!stream) {\n const allRelayAddrs = [\n ...relayMultiaddrs,\n ...(relayPeers ?? []).map((r) => buildCircuitRelayAddr(r, targetPeerIdStr!)),\n ];\n // Deduplicate\n const uniqueRelayAddrs = [...new Set(allRelayAddrs)];\n\n if (uniqueRelayAddrs.length > 0) {\n const relayDialPromises = uniqueRelayAddrs.map(async (addr) => {\n try {\n const conn = await libp2p.dial(multiaddr(addr), {\n signal: AbortSignal.timeout(DIAL_TIMEOUT)\n });\n logger.info('Relay connection established', { addr });\n const s = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('Relay stream opened', { addr });\n return { conn, stream: s };\n } catch (relayErr) {\n logger.warn('Relay dial failed', { addr, error: (relayErr as Error).message });\n lastError = relayErr;\n return null;\n }\n });\n\n const winner = await Promise.race(\n relayDialPromises.map(p => p.then(r => r || Promise.reject()))\n ).catch(() => undefined);\n\n if (winner) {\n stream = winner.stream;\n // Close connections whose streams were not selected\n Promise.allSettled(relayDialPromises).then((results) => {\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value && result.value.stream !== stream) {\n result.value.conn.close().catch(() => {});\n }\n }\n });\n }\n }\n }\n\n // Last resort: query DHT for relay-capable peers\n if (!stream && dht && 'queryRelayPeers' in dht) {\n const discoveredRelays = await (dht as any).queryRelayPeers();\n for (const relayAddr of discoveredRelays) {\n const circuitAddr = buildCircuitRelayAddr(relayAddr, targetPeerIdStr!);\n try {\n const conn = await libp2p.dial(multiaddr(circuitAddr));\n stream = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('DHT-discovered relay succeeded', { relayAddr });\n break;\n } catch (e) {\n logger.warn('DHT relay failed', { relayAddr, error: (e as Error).message });\n lastError = e;\n }\n }\n }\n\n if (!stream) {\n throw lastError ?? new MessagingError('All dial attempts failed (including DHT-discovered relays)');\n }\n\n const encoded = encodeMessage(envelope);\n await stream.sink(\n (async function* () {\n yield encoded;\n })()\n );\n\n logger.info('Message sent over libp2p stream', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n });\n\n // If this is a request, wait for response\n if (envelope.type === 'request') {\n logger.debug('Waiting for response to request', { id: envelope.id });\n\n try {\n // Add timeout to prevent infinite blocking\n const RESPONSE_TIMEOUT = 30000; // 30 seconds (CVP-0010 §4.2)\n\n const responsePromise = (async () => {\n const responseChunks: Uint8Array[] = [];\n for await (const chunk of stream.source) {\n responseChunks.push(chunk.subarray());\n }\n\n if (responseChunks.length > 0) {\n const responseData = concatUint8Arrays(responseChunks);\n const responseEnvelope = decodeMessage(responseData);\n logger.info('Received response', {\n id: responseEnvelope.id,\n replyTo: responseEnvelope.replyTo,\n });\n\n return responseEnvelope;\n } else {\n logger.warn('No response received for request', { id: envelope.id });\n return undefined;\n }\n })();\n\n const timeoutPromise = new Promise<undefined>((resolve) => {\n setTimeout(() => {\n logger.warn('Response timeout', { id: envelope.id, timeout: RESPONSE_TIMEOUT });\n resolve(undefined);\n }, RESPONSE_TIMEOUT);\n });\n\n const response = await Promise.race([responsePromise, timeoutPromise]);\n return response;\n } catch (error) {\n logger.warn('Error reading response', { error });\n return undefined;\n }\n }\n\n return undefined;\n } catch (error) {\n if (error instanceof MessagingError) throw error;\n throw new MessagingError('Failed to send message', error);\n }\n },\n\n start: async () => {\n await libp2p.handle(PROTOCOL_PREFIX, async ({ stream }) => {\n try {\n await handleIncomingStream(stream, handlers, catchAllHandler, verifyFn);\n } catch (error) {\n logger.error('Error handling incoming stream', error);\n }\n }, { runOnLimitedConnection: true });\n\n logger.info('Message router started');\n },\n\n stop: async () => {\n await libp2p.unhandle(PROTOCOL_PREFIX);\n handlers.clear();\n catchAllHandler = undefined;\n logger.info('Message router stopped');\n },\n };\n}\n\nfunction buildCircuitRelayAddr(relayAddr: string, targetPeerId: string): string {\n return `${relayAddr}/p2p-circuit/p2p/${targetPeerId}`;\n}\n\nasync function handleIncomingStream(\n stream: any,\n handlers: Map<string, MessageHandler>,\n catchAllHandler: MessageHandler | undefined,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<void> {\n try {\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream.source) {\n chunks.push(chunk.subarray());\n }\n\n const data = concatUint8Arrays(chunks);\n\n // Ignore empty streams (from unused parallel dial connections)\n if (data.length === 0) {\n logger.debug('Received empty stream, ignoring');\n return;\n }\n\n const envelope = decodeMessage(data);\n\n if (!validateEnvelope(envelope)) {\n logger.warn('Received invalid message envelope');\n return;\n }\n\n // Verify signature against sender DID embedded public key.\n const isValidSignature = await verifyEnvelope(envelope, async (signature, data) => {\n const senderPublicKey = extractPublicKey(envelope.from);\n return verify(signature, data, senderPublicKey);\n });\n if (!isValidSignature) {\n logger.warn('Received message with invalid signature', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n\n // Optional caller-supplied verification hook (e.g. policy checks).\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const dataBytes = new TextEncoder().encode(JSON.stringify(envelopeWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const hookValid = await verifyFn(signatureBytes, dataBytes);\n if (!hookValid) {\n logger.warn('Message rejected by custom verifier', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n } catch (error) {\n logger.warn('Custom verification hook failed', {\n id: envelope.id,\n from: envelope.from,\n error: (error as Error).message,\n });\n return;\n }\n\n logger.info('Received message', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n payload: envelope.payload,\n });\n\n const handler = handlers.get(envelope.protocol);\n let response: MessageEnvelope | void = undefined;\n\n if (handler) {\n response = await handler(envelope);\n } else if (catchAllHandler) {\n logger.debug('Using catch-all handler for protocol', { protocol: envelope.protocol });\n response = await catchAllHandler(envelope);\n } else {\n logger.warn('No handler for protocol', { protocol: envelope.protocol });\n }\n\n // Send response back if handler returned one\n if (response) {\n const encoded = encodeMessage(response);\n logger.info('Sending response back to sender', {\n responseId: response.id,\n replyTo: response.replyTo,\n size: encoded.length\n });\n\n await stream.sink(\n (async function* () {\n yield encoded;\n })()\n );\n }\n } catch (error) {\n logger.error('Error handling incoming message', error);\n }\n}\n","/**\n * Message Queue Types\n *\n * Types for message queue, storage, and filtering operations.\n */\n\nimport type { MessageEnvelope } from './envelope.js';\n\n/**\n * Message direction\n */\nexport type MessageDirection = 'inbound' | 'outbound';\n\n/**\n * Message status\n */\nexport type MessageStatus = 'pending' | 'delivered' | 'failed' | 'archived';\n\n/**\n * Stored message with metadata\n */\nexport interface StoredMessage {\n envelope: MessageEnvelope;\n direction: MessageDirection;\n status: MessageStatus;\n receivedAt?: number;\n sentAt?: number;\n readAt?: number;\n trustScore?: number;\n error?: string;\n}\n\n/**\n * Message filter for queries\n */\nexport interface MessageFilter {\n fromDid?: string | string[];\n toDid?: string | string[];\n protocol?: string | string[];\n minTrustScore?: number;\n maxAge?: number; // milliseconds\n type?: 'request' | 'response' | 'notification';\n unreadOnly?: boolean;\n status?: MessageStatus | MessageStatus[];\n}\n\n/**\n * Pagination options\n */\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n startKey?: string; // For cursor-based pagination\n}\n\n/**\n * Paginated message results\n */\nexport interface MessagePage {\n messages: StoredMessage[];\n total: number;\n hasMore: boolean;\n nextKey?: string;\n}\n\n/**\n * Blocklist entry\n */\nexport interface BlocklistEntry {\n did: string;\n reason: string;\n blockedAt: number;\n blockedBy: string; // Local agent DID\n}\n\n/**\n * Allowlist entry\n */\nexport interface AllowlistEntry {\n did: string;\n addedAt: number;\n note?: string;\n}\n\n/**\n * Seen cache entry (for deduplication)\n */\nexport interface SeenEntry {\n messageId: string;\n seenAt: number;\n fromDid: string;\n}\n\n/**\n * Rate limit state\n */\nexport interface RateLimitState {\n did: string;\n tokens: number;\n lastRefill: number;\n totalRequests: number;\n firstSeen: number;\n}\n\n/**\n * Defense check result\n */\nexport interface DefenseResult {\n allowed: boolean;\n reason?: 'blocked' | 'duplicate' | 'trust_too_low' | 'rate_limited' | 'invalid';\n trustScore?: number;\n remainingTokens?: number;\n resetTime?: number;\n}\n\n/**\n * Rate limit result\n */\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetTime: number;\n limit: number;\n}\n\n/**\n * Queue statistics\n */\nexport interface QueueStats {\n inboxTotal: number;\n inboxUnread: number;\n outboxPending: number;\n outboxFailed: number;\n blockedAgents: number;\n allowedAgents: number;\n rateLimitedAgents: number;\n}\n\n/**\n * Subscription callback\n */\nexport type MessageCallback = (message: StoredMessage) => void | Promise<void>;\n\n/**\n * Subscription filter\n */\nexport interface SubscriptionFilter extends MessageFilter {\n webhookUrl?: string;\n}\n","/**\n * Message Storage - LevelDB operations for message queue\n *\n * Key schema:\n * msg:inbound:{timestamp}:{id} → StoredMessage\n * msg:outbound:{timestamp}:{id} → StoredMessage\n * block:{did} → BlocklistEntry\n * allow:{did} → AllowlistEntry\n * seen:{messageId} → SeenEntry\n * rate:{did} → RateLimitState\n * idx:from:{did}:{timestamp}:{id} → '1'\n */\n\nimport { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\nimport type {\n StoredMessage,\n BlocklistEntry,\n AllowlistEntry,\n SeenEntry,\n RateLimitState,\n MessageFilter,\n PaginationOptions,\n MessagePage,\n} from './types.js';\n\nconst logger = createLogger('message-storage');\n\nexport class MessageStorage {\n private db: Level<string, any>;\n private ready = false;\n\n constructor(dbPath: string) {\n this.db = new Level<string, any>(dbPath, { valueEncoding: 'json' });\n }\n\n async open(): Promise<void> {\n await this.db.open();\n this.ready = true;\n logger.info('Message storage opened');\n }\n\n async close(): Promise<void> {\n if (this.ready) {\n await this.db.close();\n this.ready = false;\n logger.info('Message storage closed');\n }\n }\n\n // ─── Message Operations ───────────────────────────────────────────────────\n\n async putMessage(msg: StoredMessage): Promise<void> {\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${msg.envelope.id}`;\n await this.db.put(key, msg);\n\n // Secondary index by sender\n const idxKey = `idx:from:${msg.envelope.from}:${ts}:${msg.envelope.id}`;\n await this.db.put(idxKey, '1');\n }\n\n async getMessage(id: string): Promise<StoredMessage | null> {\n // Scan both directions since we don't know the timestamp\n for (const direction of ['inbound', 'outbound'] as const) {\n const prefix = `msg:${direction}:`;\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n valueEncoding: 'json',\n })) {\n if (value.envelope.id === id) return value;\n }\n }\n return null;\n }\n\n async updateMessage(id: string, updates: Partial<StoredMessage>): Promise<void> {\n const msg = await this.getMessage(id);\n if (!msg) return;\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${id}`;\n await this.db.put(key, { ...msg, ...updates });\n }\n\n async deleteMessage(id: string): Promise<void> {\n const msg = await this.getMessage(id);\n if (!msg) return;\n const ts = String(msg.receivedAt ?? msg.sentAt ?? Date.now()).padStart(16, '0');\n const key = `msg:${msg.direction}:${ts}:${id}`;\n const idxKey = `idx:from:${msg.envelope.from}:${ts}:${id}`;\n await this.db.batch([\n { type: 'del', key },\n { type: 'del', key: idxKey },\n ]);\n }\n\n async queryMessages(\n direction: 'inbound' | 'outbound',\n filter: MessageFilter = {},\n pagination: PaginationOptions = {}\n ): Promise<MessagePage> {\n const { limit = 50, offset = 0 } = pagination;\n const prefix = `msg:${direction}:`;\n const results: StoredMessage[] = [];\n let total = 0;\n let skipped = 0;\n\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n reverse: true, // newest first\n valueEncoding: 'json',\n })) {\n if (!this.matchesFilter(value, filter)) continue;\n total++;\n if (skipped < offset) { skipped++; continue; }\n if (results.length < limit) results.push(value);\n }\n\n return {\n messages: results,\n total,\n hasMore: total > offset + results.length,\n };\n }\n\n private matchesFilter(msg: StoredMessage, filter: MessageFilter): boolean {\n if (filter.fromDid) {\n const froms = Array.isArray(filter.fromDid) ? filter.fromDid : [filter.fromDid];\n if (!froms.includes(msg.envelope.from)) return false;\n }\n if (filter.toDid) {\n const tos = Array.isArray(filter.toDid) ? filter.toDid : [filter.toDid];\n if (!tos.includes(msg.envelope.to)) return false;\n }\n if (filter.protocol) {\n const protos = Array.isArray(filter.protocol) ? filter.protocol : [filter.protocol];\n if (!protos.includes(msg.envelope.protocol)) return false;\n }\n if (filter.type && msg.envelope.type !== filter.type) return false;\n if (filter.unreadOnly && msg.readAt != null) return false;\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n if (!statuses.includes(msg.status)) return false;\n }\n if (filter.maxAge) {\n const age = Date.now() - (msg.receivedAt ?? msg.sentAt ?? 0);\n if (age > filter.maxAge) return false;\n }\n if (filter.minTrustScore != null && (msg.trustScore ?? 0) < filter.minTrustScore) return false;\n return true;\n }\n\n async countMessages(direction: 'inbound' | 'outbound', filter: MessageFilter = {}): Promise<number> {\n const prefix = `msg:${direction}:`;\n let count = 0;\n for await (const [, value] of this.db.iterator<string, StoredMessage>({\n gte: prefix,\n lte: prefix + '\\xff',\n valueEncoding: 'json',\n })) {\n if (this.matchesFilter(value, filter)) count++;\n }\n return count;\n }\n\n // ─── Blocklist ────────────────────────────────────────────────────────────\n\n async putBlock(entry: BlocklistEntry): Promise<void> {\n await this.db.put(`block:${entry.did}`, entry);\n }\n\n async getBlock(did: string): Promise<BlocklistEntry | null> {\n try {\n return await this.db.get(`block:${did}`);\n } catch {\n return null;\n }\n }\n\n async deleteBlock(did: string): Promise<void> {\n try { await this.db.del(`block:${did}`); } catch { /* not found */ }\n }\n\n async listBlocked(): Promise<BlocklistEntry[]> {\n const results: BlocklistEntry[] = [];\n for await (const [, value] of this.db.iterator<string, BlocklistEntry>({\n gte: 'block:',\n lte: 'block:\\xff',\n valueEncoding: 'json',\n })) {\n results.push(value);\n }\n return results;\n }\n\n // ─── Allowlist ────────────────────────────────────────────────────────────\n\n async putAllow(entry: AllowlistEntry): Promise<void> {\n await this.db.put(`allow:${entry.did}`, entry);\n }\n\n async getAllow(did: string): Promise<AllowlistEntry | null> {\n try {\n return await this.db.get(`allow:${did}`);\n } catch {\n return null;\n }\n }\n\n async deleteAllow(did: string): Promise<void> {\n try { await this.db.del(`allow:${did}`); } catch { /* not found */ }\n }\n\n async listAllowed(): Promise<AllowlistEntry[]> {\n const results: AllowlistEntry[] = [];\n for await (const [, value] of this.db.iterator<string, AllowlistEntry>({\n gte: 'allow:',\n lte: 'allow:\\xff',\n valueEncoding: 'json',\n })) {\n results.push(value);\n }\n return results;\n }\n\n // ─── Seen Cache ───────────────────────────────────────────────────────────\n\n async putSeen(entry: SeenEntry): Promise<void> {\n await this.db.put(`seen:${entry.messageId}`, entry);\n }\n\n async getSeen(messageId: string): Promise<SeenEntry | null> {\n try {\n return await this.db.get(`seen:${messageId}`);\n } catch {\n return null;\n }\n }\n\n async cleanupSeen(maxAgeMs: number): Promise<void> {\n const cutoff = Date.now() - maxAgeMs;\n const toDelete: string[] = [];\n for await (const [key, value] of this.db.iterator<string, SeenEntry>({\n gte: 'seen:',\n lte: 'seen:\\xff',\n valueEncoding: 'json',\n })) {\n if (value.seenAt < cutoff) toDelete.push(key);\n }\n await this.db.batch(toDelete.map((key) => ({ type: 'del' as const, key })));\n }\n\n // ─── Rate Limit State ─────────────────────────────────────────────────────\n\n async putRateLimit(state: RateLimitState): Promise<void> {\n await this.db.put(`rate:${state.did}`, state);\n }\n\n async getRateLimit(did: string): Promise<RateLimitState | null> {\n try {\n return await this.db.get(`rate:${did}`);\n } catch {\n return null;\n }\n }\n\n async cleanupRateLimits(maxAgeMs: number): Promise<void> {\n const cutoff = Date.now() - maxAgeMs;\n const toDelete: string[] = [];\n for await (const [key, value] of this.db.iterator<string, RateLimitState>({\n gte: 'rate:',\n lte: 'rate:\\xff',\n valueEncoding: 'json',\n })) {\n if (value.lastRefill < cutoff) toDelete.push(key);\n }\n await this.db.batch(toDelete.map((key) => ({ type: 'del' as const, key })));\n }\n}\n","/**\n * Message Queue\n *\n * Persistent inbox/outbox backed by LevelDB.\n * Supports real-time subscriptions and pagination.\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessageStorage } from './storage.js';\nimport type {\n StoredMessage,\n MessageFilter,\n PaginationOptions,\n MessagePage,\n MessageCallback,\n SubscriptionFilter,\n QueueStats,\n} from './types.js';\n\nconst logger = createLogger('message-queue');\n\nexport interface MessageQueueConfig {\n dbPath: string;\n}\n\ninterface Subscription {\n id: string;\n filter: SubscriptionFilter;\n callback: MessageCallback;\n}\n\nexport class MessageQueue {\n private storage: MessageStorage;\n private subscriptions = new Map<string, Subscription>();\n private subCounter = 0;\n\n constructor(config: MessageQueueConfig) {\n this.storage = new MessageStorage(config.dbPath);\n }\n\n get store(): MessageStorage {\n return this.storage;\n }\n\n async start(): Promise<void> {\n await this.storage.open();\n logger.info('Message queue started');\n }\n\n async stop(): Promise<void> {\n await this.storage.close();\n this.subscriptions.clear();\n logger.info('Message queue stopped');\n }\n\n // ─── Inbox ────────────────────────────────────────────────────────────────\n\n async getInbox(filter: MessageFilter = {}, pagination: PaginationOptions = {}): Promise<MessagePage> {\n return this.storage.queryMessages('inbound', filter, pagination);\n }\n\n async getMessage(id: string): Promise<StoredMessage | null> {\n return this.storage.getMessage(id);\n }\n\n async markAsRead(id: string): Promise<void> {\n await this.storage.updateMessage(id, { readAt: Date.now() });\n }\n\n async deleteMessage(id: string): Promise<void> {\n await this.storage.deleteMessage(id);\n }\n\n // ─── Outbox ───────────────────────────────────────────────────────────────\n\n async getOutbox(pagination: PaginationOptions = {}): Promise<MessagePage> {\n return this.storage.queryMessages('outbound', {}, pagination);\n }\n\n async retryMessage(id: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'pending', error: undefined });\n }\n\n // ─── Enqueue ──────────────────────────────────────────────────────────────\n\n async enqueueInbound(envelope: MessageEnvelope, trustScore?: number): Promise<StoredMessage> {\n const msg: StoredMessage = {\n envelope,\n direction: 'inbound',\n status: 'pending',\n receivedAt: Date.now(),\n trustScore,\n };\n await this.storage.putMessage(msg);\n logger.debug('Enqueued inbound message', { id: envelope.id, from: envelope.from });\n this.notifySubscribers(msg);\n return msg;\n }\n\n async enqueueOutbound(envelope: MessageEnvelope): Promise<StoredMessage> {\n const msg: StoredMessage = {\n envelope,\n direction: 'outbound',\n status: 'pending',\n sentAt: Date.now(),\n };\n await this.storage.putMessage(msg);\n logger.debug('Enqueued outbound message', { id: envelope.id, to: envelope.to });\n return msg;\n }\n\n async markOutboundDelivered(id: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'delivered' });\n }\n\n async markOutboundFailed(id: string, error: string): Promise<void> {\n await this.storage.updateMessage(id, { status: 'failed', error });\n }\n\n // ─── Subscriptions ────────────────────────────────────────────────────────\n\n subscribe(filter: SubscriptionFilter, callback: MessageCallback): string {\n const id = `sub_${++this.subCounter}`;\n this.subscriptions.set(id, { id, filter, callback });\n logger.debug('Subscription added', { id });\n return id;\n }\n\n unsubscribe(subscriptionId: string): void {\n this.subscriptions.delete(subscriptionId);\n logger.debug('Subscription removed', { id: subscriptionId });\n }\n\n private notifySubscribers(msg: StoredMessage): void {\n for (const sub of this.subscriptions.values()) {\n if (this.matchesSubscriptionFilter(msg, sub.filter)) {\n Promise.resolve(sub.callback(msg)).catch((err) => {\n logger.warn('Subscription callback error', { id: sub.id, error: (err as Error).message });\n });\n }\n }\n }\n\n private matchesSubscriptionFilter(msg: StoredMessage, filter: SubscriptionFilter): boolean {\n if (filter.fromDid) {\n const froms = Array.isArray(filter.fromDid) ? filter.fromDid : [filter.fromDid];\n if (!froms.includes(msg.envelope.from)) return false;\n }\n if (filter.protocol) {\n const protos = Array.isArray(filter.protocol) ? filter.protocol : [filter.protocol];\n if (!protos.includes(msg.envelope.protocol)) return false;\n }\n if (filter.type && msg.envelope.type !== filter.type) return false;\n return true;\n }\n\n // ─── Stats ────────────────────────────────────────────────────────────────\n\n async getStats(): Promise<QueueStats> {\n const [inboxTotal, inboxUnread, outboxPending, outboxFailed, blocked, allowed] =\n await Promise.all([\n this.storage.countMessages('inbound'),\n this.storage.countMessages('inbound', { unreadOnly: true }),\n this.storage.countMessages('outbound', { status: 'pending' }),\n this.storage.countMessages('outbound', { status: 'failed' }),\n this.storage.listBlocked().then((l) => l.length),\n this.storage.listAllowed().then((l) => l.length),\n ]);\n\n return {\n inboxTotal,\n inboxUnread,\n outboxPending,\n outboxFailed,\n blockedAgents: blocked,\n allowedAgents: allowed,\n rateLimitedAgents: 0,\n };\n }\n}\n","/**\n * Defense Middleware\n *\n * Checks incoming messages against:\n * 1. Allowlist bypass\n * 2. Blocklist rejection\n * 3. Deduplication (seen cache)\n * 4. Trust score filtering\n * 5. Rate limiting (token bucket, tiered by trust)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport type { MessageEnvelope } from './envelope.js';\nimport type { TrustSystem } from '../trust/index.js';\nimport type { MessageStorage } from './storage.js';\nimport type { DefenseResult, RateLimitResult } from './types.js';\nimport {\n TokenBucket,\n DEFAULT_RATE_LIMIT_TIERS,\n getTierConfig,\n type RateLimitTiers,\n} from './rate-limiter.js';\n\nconst logger = createLogger('defense');\n\nexport interface DefenseConfig {\n trustSystem: TrustSystem;\n storage: MessageStorage;\n /** Minimum trust score to accept messages (0 = accept all) */\n minTrustScore?: number;\n /** Auto-block agents below this score */\n autoBlockThreshold?: number;\n rateLimitTiers?: RateLimitTiers;\n /** TTL for seen-cache entries in ms (default: 1 hour) */\n seenTtlMs?: number;\n}\n\nexport class DefenseMiddleware {\n private readonly trust: TrustSystem;\n private readonly storage: MessageStorage;\n private readonly minTrustScore: number;\n private readonly autoBlockThreshold: number;\n private readonly tiers: RateLimitTiers;\n private readonly seenTtlMs: number;\n\n // In-memory LRU-style seen cache (backed by LevelDB for persistence)\n private readonly seenCache = new Map<string, number>(); // id → seenAt\n private readonly MAX_SEEN_CACHE = 10_000;\n\n // In-memory token buckets (backed by LevelDB for persistence)\n private readonly buckets = new Map<string, TokenBucket>();\n\n constructor(config: DefenseConfig) {\n this.trust = config.trustSystem;\n this.storage = config.storage;\n this.minTrustScore = config.minTrustScore ?? 0;\n this.autoBlockThreshold = config.autoBlockThreshold ?? 0.1;\n this.tiers = config.rateLimitTiers ?? DEFAULT_RATE_LIMIT_TIERS;\n this.seenTtlMs = config.seenTtlMs ?? 60 * 60 * 1000; // 1 hour\n }\n\n /**\n * Run all defense checks on an incoming message.\n * Returns { allowed: true } if the message should be processed,\n * or { allowed: false, reason } if it should be dropped.\n */\n async checkMessage(envelope: MessageEnvelope): Promise<DefenseResult> {\n const did = envelope.from;\n\n // 1. Allowlist bypass — skip all other checks\n if (await this.isAllowed(did)) {\n this.markAsSeen(envelope.id);\n return { allowed: true };\n }\n\n // 2. Blocklist check\n if (await this.isBlocked(did)) {\n logger.debug('Message rejected: blocked', { id: envelope.id, from: did });\n return { allowed: false, reason: 'blocked' };\n }\n\n // 3. Deduplication\n if (this.hasSeen(envelope.id)) {\n logger.debug('Message rejected: duplicate', { id: envelope.id });\n return { allowed: false, reason: 'duplicate' };\n }\n\n // 4. Trust score check\n let trustScore = 0;\n try {\n const score = await this.trust.getTrustScore(did);\n trustScore = score.interactionScore;\n\n // Auto-block very low trust agents\n if (trustScore < this.autoBlockThreshold && trustScore > 0) {\n logger.warn('Auto-blocking low-trust agent', { did, trustScore });\n await this.blockAgent(did, `Auto-blocked: trust score ${trustScore.toFixed(2)} below threshold`);\n return { allowed: false, reason: 'blocked' };\n }\n\n if (trustScore < this.minTrustScore) {\n logger.debug('Message rejected: trust too low', { id: envelope.id, trustScore });\n return { allowed: false, reason: 'trust_too_low', trustScore };\n }\n } catch (err) {\n logger.warn('Trust score lookup failed, using 0', { did, error: (err as Error).message });\n }\n\n // 5. Rate limiting (tiered by trust)\n const rateLimitResult = await this.checkRateLimit(did, trustScore);\n if (!rateLimitResult.allowed) {\n logger.debug('Message rejected: rate limited', {\n id: envelope.id,\n from: did,\n resetTime: rateLimitResult.resetTime,\n });\n return {\n allowed: false,\n reason: 'rate_limited',\n remainingTokens: rateLimitResult.remaining,\n resetTime: rateLimitResult.resetTime,\n };\n }\n\n // All checks passed\n this.markAsSeen(envelope.id);\n return { allowed: true, trustScore, remainingTokens: rateLimitResult.remaining };\n }\n\n // ─── Blocklist ────────────────────────────────────────────────────────────\n\n async blockAgent(did: string, reason: string, blockedBy = 'local'): Promise<void> {\n await this.storage.putBlock({ did, reason, blockedAt: Date.now(), blockedBy });\n logger.info('Agent blocked', { did, reason });\n }\n\n async unblockAgent(did: string): Promise<void> {\n await this.storage.deleteBlock(did);\n logger.info('Agent unblocked', { did });\n }\n\n async isBlocked(did: string): Promise<boolean> {\n return (await this.storage.getBlock(did)) !== null;\n }\n\n // ─── Allowlist ────────────────────────────────────────────────────────────\n\n async allowAgent(did: string, note?: string): Promise<void> {\n await this.storage.putAllow({ did, addedAt: Date.now(), note });\n logger.info('Agent allowlisted', { did });\n }\n\n async removeFromAllowlist(did: string): Promise<void> {\n await this.storage.deleteAllow(did);\n logger.info('Agent removed from allowlist', { did });\n }\n\n async isAllowed(did: string): Promise<boolean> {\n return (await this.storage.getAllow(did)) !== null;\n }\n\n // ─── Rate Limiting ────────────────────────────────────────────────────────\n\n async checkRateLimit(did: string, trustScore: number): Promise<RateLimitResult> {\n const tierConfig = getTierConfig(trustScore, this.tiers);\n\n // Load or create bucket\n let bucket = this.buckets.get(did);\n if (!bucket) {\n // Try to restore from LevelDB\n const persisted = await this.storage.getRateLimit(did);\n if (persisted) {\n bucket = new TokenBucket(tierConfig, persisted.tokens, persisted.lastRefill);\n } else {\n bucket = new TokenBucket(tierConfig);\n }\n this.buckets.set(did, bucket);\n }\n\n const allowed = bucket.consume();\n const state = bucket.toState();\n\n // Persist updated state\n await this.storage.putRateLimit({\n did,\n tokens: state.tokens,\n lastRefill: state.lastRefill,\n totalRequests: 0,\n firstSeen: Date.now(),\n });\n\n return {\n allowed,\n remaining: bucket.getRemaining(),\n resetTime: bucket.getResetTime(),\n limit: tierConfig.capacity,\n };\n }\n\n // ─── Seen Cache (deduplication) ───────────────────────────────────────────\n\n hasSeen(messageId: string): boolean {\n return this.seenCache.has(messageId);\n }\n\n markAsSeen(messageId: string): void {\n // Evict oldest entries if at capacity\n if (this.seenCache.size >= this.MAX_SEEN_CACHE) {\n const firstKey = this.seenCache.keys().next().value;\n if (firstKey) this.seenCache.delete(firstKey);\n }\n this.seenCache.set(messageId, Date.now());\n\n // Persist to LevelDB (fire-and-forget)\n this.storage.putSeen({ messageId, seenAt: Date.now(), fromDid: '' }).catch(() => {});\n }\n\n /** Periodic cleanup of expired seen entries */\n async cleanupSeen(): Promise<void> {\n const cutoff = Date.now() - this.seenTtlMs;\n for (const [id, seenAt] of this.seenCache) {\n if (seenAt < cutoff) this.seenCache.delete(id);\n }\n await this.storage.cleanupSeen(this.seenTtlMs);\n }\n\n /** Periodic cleanup of stale rate limit buckets (24h inactive) */\n async cleanupRateLimits(): Promise<void> {\n const staleMs = 24 * 60 * 60 * 1000;\n const cutoff = Date.now() - staleMs;\n for (const [did, bucket] of this.buckets) {\n if (bucket.toState().lastRefill < cutoff) this.buckets.delete(did);\n }\n await this.storage.cleanupRateLimits(staleMs);\n }\n}\n","/**\n * Token Bucket Rate Limiter\n *\n * Classic token bucket algorithm for per-sender rate limiting.\n * Tokens refill at a constant rate up to capacity.\n */\n\nexport interface TokenBucketConfig {\n capacity: number; // Max tokens (burst size)\n refillRate: number; // Tokens per millisecond\n}\n\nexport class TokenBucket {\n private tokens: number;\n private lastRefill: number;\n private readonly capacity: number;\n private readonly refillRate: number; // tokens per ms\n\n constructor(config: TokenBucketConfig, initialTokens?: number, lastRefill?: number) {\n this.capacity = config.capacity;\n this.refillRate = config.refillRate;\n this.tokens = initialTokens ?? config.capacity;\n this.lastRefill = lastRefill ?? Date.now();\n }\n\n /** Attempt to consume one token. Returns true if allowed. */\n consume(): boolean {\n this.refill();\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n return false;\n }\n\n getRemaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /** Milliseconds until at least one token is available */\n getResetTime(): number {\n this.refill();\n if (this.tokens >= 1) return 0;\n const needed = 1 - this.tokens;\n return Math.ceil(needed / this.refillRate);\n }\n\n /** Serialize state for persistence */\n toState(): { tokens: number; lastRefill: number } {\n return { tokens: this.tokens, lastRefill: this.lastRefill };\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n this.tokens = Math.min(this.capacity, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n\n/**\n * Rate limiter tiers based on trust score\n */\nexport interface RateLimitTiers {\n /** Trust < 0.3: new/unknown agents */\n newAgent: TokenBucketConfig;\n /** Trust 0.3–0.6: established agents */\n established: TokenBucketConfig;\n /** Trust > 0.6: trusted agents */\n trusted: TokenBucketConfig;\n}\n\nexport const DEFAULT_RATE_LIMIT_TIERS: RateLimitTiers = {\n newAgent: { capacity: 10, refillRate: 10 / (60 * 1000) }, // 10/min, burst 10\n established: { capacity: 100, refillRate: 60 / (60 * 1000) }, // 60/min, burst 100\n trusted: { capacity: 1000, refillRate: 600 / (60 * 1000) }, // 600/min, burst 1000\n};\n\nexport function getTierConfig(trustScore: number, tiers: RateLimitTiers): TokenBucketConfig {\n if (trustScore >= 0.6) return tiers.trusted;\n if (trustScore >= 0.3) return tiers.established;\n return tiers.newAgent;\n}\n","/**\n * Trust System - Main Export\n *\n * Combines all trust components into a unified interface\n */\n\nexport * from './trust-score.js';\nexport * from './interaction-history.js';\nexport * from './endorsement.js';\nexport * from './sybil-defense.js';\n\nimport { Level } from 'level';\nimport { TrustMetrics } from './trust-score.js';\nimport type { TrustScore, Interaction } from './trust-score.js';\nimport { InteractionHistory } from './interaction-history.js';\nimport { EndorsementManager } from './endorsement.js';\nimport type { Endorsement, SignFunction, VerifyFunction } from './endorsement.js';\nimport { SybilDefense } from './sybil-defense.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('trust-system');\n\n/**\n * Trust System Configuration\n */\nexport interface TrustSystemConfig {\n dbPath: string;\n getPublicKey: (did: string) => Promise<Uint8Array>;\n}\n\n/**\n * Unified Trust System\n */\nexport class TrustSystem {\n private metrics: TrustMetrics;\n private history: InteractionHistory;\n private endorsements: EndorsementManager;\n private sybilDefense: SybilDefense;\n private trustCache = new Map<string, { score: TrustScore; timestamp: number }>();\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: TrustSystemConfig) {\n this.metrics = new TrustMetrics();\n this.history = new InteractionHistory(`${config.dbPath}/interactions`);\n\n const endorsementDb = new Level<string, Endorsement>(`${config.dbPath}/endorsements`, {\n valueEncoding: 'json',\n });\n this.endorsements = new EndorsementManager(endorsementDb, config.getPublicKey);\n this.sybilDefense = new SybilDefense();\n }\n\n /**\n * Initialize the trust system\n */\n async start(): Promise<void> {\n await this.history.open();\n logger.info('Trust system started');\n }\n\n /**\n * Shutdown the trust system\n */\n async stop(): Promise<void> {\n await this.history.close();\n logger.info('Trust system stopped');\n }\n\n /**\n * Record an interaction\n */\n async recordInteraction(interaction: Interaction): Promise<void> {\n await this.history.record(interaction);\n this.sybilDefense.recordRequest(interaction.agentDid);\n\n // Invalidate cache\n this.trustCache.delete(interaction.agentDid);\n }\n\n /**\n * Get trust score for an agent\n */\n async getTrustScore(agentDid: string): Promise<TrustScore> {\n // Check cache\n const cached = this.trustCache.get(agentDid);\n if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {\n return cached.score;\n }\n\n // Calculate fresh score\n const stats = await this.history.getStats(agentDid);\n const endorsementList = await this.endorsements.getEndorsements(agentDid);\n const uptime = 1.0; // TODO: Implement uptime tracking\n\n const score = this.metrics.calculateScore(stats, endorsementList.length, uptime);\n\n // Cache result\n this.trustCache.set(agentDid, { score, timestamp: Date.now() });\n\n return score;\n }\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n const endorsement = await this.endorsements.endorse(fromDid, toDid, score, reason, signFn);\n await this.endorsements.publish(endorsement);\n\n // Invalidate cache\n this.trustCache.delete(toDid);\n\n return endorsement;\n }\n\n /**\n * Get endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n return this.endorsements.getEndorsements(agentDid);\n }\n\n /**\n * Verify an endorsement\n */\n async verifyEndorsement(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n return this.endorsements.verify(endorsement, verifyFn);\n }\n\n /**\n * Check if agent should be rate limited\n */\n isRateLimited(agentDid: string): boolean {\n return this.sybilDefense.isRateLimited(agentDid);\n }\n\n /**\n * Generate Sybil defense challenge\n */\n generateChallenge(did: string, difficulty?: number) {\n return this.sybilDefense.generateChallenge(did, difficulty);\n }\n\n /**\n * Verify Sybil defense challenge\n */\n verifyChallenge(solution: any): boolean {\n return this.sybilDefense.verifyChallenge(solution);\n }\n\n /**\n * Get peer trust level\n */\n getPeerTrustLevel(peerId: string) {\n return this.sybilDefense.getPeerTrustLevel(peerId);\n }\n\n /**\n * Record peer seen\n */\n recordPeerSeen(peerId: string): void {\n this.sybilDefense.recordPeerSeen(peerId);\n }\n\n /**\n * Get interaction history\n */\n async getHistory(agentDid: string, limit?: number): Promise<Interaction[]> {\n return this.history.getHistory(agentDid, limit);\n }\n\n /**\n * Clean up old data\n */\n async cleanup(): Promise<void> {\n await this.history.cleanup();\n this.sybilDefense.cleanup();\n this.trustCache.clear();\n logger.info('Trust system cleanup completed');\n }\n}\n\n/**\n * Create a trust system instance\n */\nexport function createTrustSystem(config: TrustSystemConfig): TrustSystem {\n return new TrustSystem(config);\n}\n","/**\n * Trust Score System\n *\n * Tracks agent reputation based on interactions, endorsements,\n * and network behavior.\n */\n\n/**\n * Trust Score Metrics\n */\nexport interface TrustScore {\n interactionScore: number; // 0-1, based on successful interactions\n endorsements: number; // Count of endorsements\n completionRate: number; // % of completed tasks (0-1)\n responseTime: number; // Average response time (ms)\n uptime: number; // % of time online last 30 days (0-1)\n lastUpdated: number; // Timestamp\n}\n\n/**\n * Interaction Record\n */\nexport interface Interaction {\n agentDid: string;\n timestamp: number;\n type: 'message' | 'task' | 'query';\n success: boolean;\n responseTime: number;\n rating?: number; // 1-5 stars (optional user rating)\n feedback?: string;\n}\n\n/**\n * Interaction Statistics\n */\nexport interface InteractionStats {\n totalInteractions: number;\n successRate: number;\n avgResponseTime: number;\n lastInteraction: number;\n}\n\n/**\n * Trust Metrics Calculator\n */\nexport class TrustMetrics {\n /**\n * Calculate trust score from interaction history\n */\n calculateScore(stats: InteractionStats, endorsements: number, uptime: number): TrustScore {\n // Interaction score: weighted by success rate and volume\n const volumeWeight = Math.min(stats.totalInteractions / 100, 1); // Cap at 100 interactions\n const interactionScore = stats.successRate * volumeWeight;\n\n // Completion rate is same as success rate for now\n const completionRate = stats.successRate;\n\n return {\n interactionScore,\n endorsements,\n completionRate,\n responseTime: stats.avgResponseTime,\n uptime,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Calculate overall trust level (0-1)\n */\n calculateOverallTrust(score: TrustScore): number {\n // Weighted average of different factors\n const weights = {\n interaction: 0.4,\n endorsement: 0.2,\n completion: 0.2,\n uptime: 0.2,\n };\n\n const endorsementScore = Math.min(score.endorsements / 10, 1); // Cap at 10 endorsements\n\n return (\n score.interactionScore * weights.interaction +\n endorsementScore * weights.endorsement +\n score.completionRate * weights.completion +\n score.uptime * weights.uptime\n );\n }\n\n /**\n * Get trust level category\n */\n getTrustLevel(score: TrustScore): 'new' | 'low' | 'medium' | 'high' | 'trusted' {\n const overall = this.calculateOverallTrust(score);\n\n if (score.interactionScore === 0) return 'new';\n if (overall < 0.3) return 'low';\n if (overall < 0.6) return 'medium';\n if (overall < 0.8) return 'high';\n return 'trusted';\n }\n\n /**\n * Check if agent should be rate limited\n */\n shouldRateLimit(score: TrustScore, agentAge: number): boolean {\n const overall = this.calculateOverallTrust(score);\n const ONE_DAY = 24 * 60 * 60 * 1000;\n\n // New agents (< 24 hours) with low trust\n if (agentAge < ONE_DAY && overall < 0.3) {\n return true;\n }\n\n // Very low trust regardless of age\n if (overall < 0.1) {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * Default trust score for new agents\n */\nexport function createDefaultTrustScore(): TrustScore {\n return {\n interactionScore: 0,\n endorsements: 0,\n completionRate: 0,\n responseTime: 0,\n uptime: 1.0, // Assume online initially\n lastUpdated: Date.now(),\n };\n}\n","/**\n * Interaction History Tracker\n *\n * Records and queries agent interaction history for trust scoring\n */\n\nimport { Level } from 'level';\nimport type { Interaction, InteractionStats } from './trust-score.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('interaction-history');\n\n/**\n * Interaction History Manager\n */\nexport class InteractionHistory {\n private db: Level<string, Interaction>;\n\n constructor(dbPath: string) {\n this.db = new Level(dbPath, { valueEncoding: 'json' });\n }\n\n /**\n * Open database connection\n */\n async open(): Promise<void> {\n await this.db.open();\n logger.info('Interaction history database opened', { path: this.db.location });\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n await this.db.close();\n logger.info('Interaction history database closed');\n }\n\n /**\n * Record an interaction\n */\n async record(interaction: Interaction): Promise<void> {\n const key = `interaction:${interaction.agentDid}:${interaction.timestamp}`;\n await this.db.put(key, interaction);\n logger.debug('Recorded interaction', { agentDid: interaction.agentDid, type: interaction.type });\n }\n\n /**\n * Get interaction history for an agent\n */\n async getHistory(agentDid: string, limit = 100): Promise<Interaction[]> {\n const interactions: Interaction[] = [];\n const prefix = `interaction:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n limit,\n reverse: true, // Most recent first\n })) {\n interactions.push(value);\n }\n } catch (error) {\n logger.error('Failed to get interaction history', { agentDid, error });\n }\n\n return interactions;\n }\n\n /**\n * Get interaction statistics for an agent\n */\n async getStats(agentDid: string): Promise<InteractionStats> {\n const history = await this.getHistory(agentDid, 1000); // Last 1000 interactions\n\n if (history.length === 0) {\n return {\n totalInteractions: 0,\n successRate: 0,\n avgResponseTime: 0,\n lastInteraction: 0,\n };\n }\n\n const successCount = history.filter(i => i.success).length;\n const totalResponseTime = history.reduce((sum, i) => sum + i.responseTime, 0);\n\n return {\n totalInteractions: history.length,\n successRate: successCount / history.length,\n avgResponseTime: totalResponseTime / history.length,\n lastInteraction: history[0].timestamp,\n };\n }\n\n /**\n * Get all agents with interaction history\n */\n async getAllAgents(): Promise<string[]> {\n const agents = new Set<string>();\n\n try {\n for await (const [key] of this.db.iterator()) {\n const match = key.match(/^interaction:([^:]+):/);\n if (match) {\n agents.add(match[1]);\n }\n }\n } catch (error) {\n logger.error('Failed to get all agents', { error });\n }\n\n return Array.from(agents);\n }\n\n /**\n * Delete all interactions for an agent\n */\n async deleteAgent(agentDid: string): Promise<void> {\n const prefix = `interaction:${agentDid}:`;\n const keysToDelete: string[] = [];\n\n for await (const [key] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n keysToDelete.push(key);\n }\n\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Deleted interaction history', { agentDid, count: keysToDelete.length });\n }\n\n /**\n * Clean up old interactions (older than 90 days)\n */\n async cleanup(maxAge = 90 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - maxAge;\n const keysToDelete: string[] = [];\n\n for await (const [key, value] of this.db.iterator()) {\n if (value.timestamp < cutoff) {\n keysToDelete.push(key);\n }\n }\n\n if (keysToDelete.length > 0) {\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Cleaned up old interactions', { count: keysToDelete.length });\n }\n\n return keysToDelete.length;\n }\n}\n","/**\n * Endorsement System\n *\n * Allows agents to endorse each other, building a web of trust\n */\n\nimport type { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('endorsement');\n\n/**\n * Endorsement Record\n */\nexport interface Endorsement {\n from: string; // Endorser DID\n to: string; // Endorsed agent DID\n score: number; // 0-1\n reason: string;\n timestamp: number;\n signature: string; // Signed by endorser\n}\n\n/**\n * Sign function type\n */\nexport type SignFunction = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Verify function type\n */\nexport type VerifyFunction = (signature: Uint8Array, data: Uint8Array, publicKey: Uint8Array) => Promise<boolean>;\n\n/**\n * Endorsement Manager\n */\nexport class EndorsementManager {\n constructor(\n private db: Level<string, Endorsement>,\n private getPublicKey: (did: string) => Promise<Uint8Array>\n ) {}\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n if (score < 0 || score > 1) {\n throw new Error('Score must be between 0 and 1');\n }\n\n const endorsement: Omit<Endorsement, 'signature'> = {\n from: fromDid,\n to: toDid,\n score,\n reason,\n timestamp: Date.now(),\n };\n\n // Sign the endorsement\n const data = new TextEncoder().encode(JSON.stringify(endorsement));\n const signatureBytes = await signFn(data);\n const signature = Buffer.from(signatureBytes).toString('hex');\n\n const signedEndorsement: Endorsement = {\n ...endorsement,\n signature,\n };\n\n logger.info('Created endorsement', { from: fromDid, to: toDid, score });\n return signedEndorsement;\n }\n\n /**\n * Verify endorsement signature\n */\n async verify(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n try {\n const { signature, ...endorsementWithoutSig } = endorsement;\n const data = new TextEncoder().encode(JSON.stringify(endorsementWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const publicKey = await this.getPublicKey(endorsement.from);\n\n return await verifyFn(signatureBytes, data, publicKey);\n } catch (error) {\n logger.error('Failed to verify endorsement', { error });\n return false;\n }\n }\n\n /**\n * Publish endorsement to local database\n */\n async publish(endorsement: Endorsement): Promise<void> {\n const key = `endorsement:${endorsement.to}:${endorsement.from}`;\n await this.db.put(key, endorsement);\n logger.info('Published endorsement', { from: endorsement.from, to: endorsement.to });\n }\n\n /**\n * Get all endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n const prefix = `endorsement:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n endorsements.push(value);\n }\n } catch (error) {\n logger.error('Failed to get endorsements', { agentDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Get endorsements given by an agent\n */\n async getEndorsementsBy(fromDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n\n try {\n for await (const [_, value] of this.db.iterator()) {\n if (value.from === fromDid) {\n endorsements.push(value);\n }\n }\n } catch (error) {\n logger.error('Failed to get endorsements by agent', { fromDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Calculate average endorsement score\n */\n async getAverageScore(agentDid: string): Promise<number> {\n const endorsements = await this.getEndorsements(agentDid);\n\n if (endorsements.length === 0) {\n return 0;\n }\n\n const totalScore = endorsements.reduce((sum, e) => sum + e.score, 0);\n return totalScore / endorsements.length;\n }\n\n /**\n * Delete an endorsement\n */\n async deleteEndorsement(fromDid: string, toDid: string): Promise<void> {\n const key = `endorsement:${toDid}:${fromDid}`;\n await this.db.del(key);\n logger.info('Deleted endorsement', { from: fromDid, to: toDid });\n }\n}\n","/**\n * Sybil Defense Mechanisms\n *\n * Protects the network from Sybil attacks through:\n * - Entry cost (Hashcash challenges)\n * - Progressive trust (rate limiting for new agents)\n * - DHT region protection (prefer established peers)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nconst logger = createLogger('sybil-defense');\n\n/**\n * Hashcash Challenge\n */\nexport interface Challenge {\n did: string;\n difficulty: number; // Number of leading zero bits required\n nonce: string;\n timestamp: number;\n}\n\n/**\n * Challenge Solution\n */\nexport interface ChallengeSolution {\n challenge: Challenge;\n solution: string; // Nonce that produces required hash\n}\n\n/**\n * Rate Limit Record\n */\ninterface RateLimitRecord {\n did: string;\n requests: number[]; // Timestamps of requests\n firstSeen: number;\n}\n\n/**\n * Peer Trust Level\n */\nexport type PeerTrustLevel = 'new' | 'established' | 'trusted';\n\n/**\n * Sybil Defense Manager\n */\nexport class SybilDefense {\n private rateLimits = new Map<string, RateLimitRecord>();\n private peerFirstSeen = new Map<string, number>();\n private readonly NEW_AGENT_WINDOW = 24 * 60 * 60 * 1000; // 24 hours\n private readonly RATE_LIMIT_WINDOW = 60 * 60 * 1000; // 1 hour\n private readonly MAX_REQUESTS_NEW = 10; // Max requests per hour for new agents\n private readonly ESTABLISHED_THRESHOLD = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n /**\n * Generate a Hashcash challenge for a new DID\n */\n generateChallenge(did: string, difficulty = 20): Challenge {\n const nonce = this.generateNonce();\n return {\n did,\n difficulty,\n nonce,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Verify a Hashcash challenge solution\n */\n verifyChallenge(solution: ChallengeSolution): boolean {\n const { challenge, solution: solutionNonce } = solution;\n\n // Check challenge is not too old (valid for 1 hour)\n if (Date.now() - challenge.timestamp > 60 * 60 * 1000) {\n logger.warn('Challenge expired', { did: challenge.did });\n return false;\n }\n\n // Compute hash\n const data = `${challenge.did}:${challenge.nonce}:${solutionNonce}`;\n const hash = sha256(new TextEncoder().encode(data));\n\n // Check leading zeros\n const leadingZeros = this.countLeadingZeroBits(hash);\n const valid = leadingZeros >= challenge.difficulty;\n\n if (valid) {\n logger.info('Challenge verified', { did: challenge.did, leadingZeros });\n } else {\n logger.warn('Challenge failed', { did: challenge.did, leadingZeros, required: challenge.difficulty });\n }\n\n return valid;\n }\n\n /**\n * Check if an agent should be rate limited\n */\n isRateLimited(did: string): boolean {\n const record = this.rateLimits.get(did);\n if (!record) {\n return false;\n }\n\n const now = Date.now();\n const agentAge = now - record.firstSeen;\n\n // Only rate limit new agents\n if (agentAge > this.NEW_AGENT_WINDOW) {\n return false;\n }\n\n // Count recent requests\n const recentRequests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n return recentRequests.length >= this.MAX_REQUESTS_NEW;\n }\n\n /**\n * Record a request from an agent\n */\n recordRequest(did: string): void {\n const now = Date.now();\n let record = this.rateLimits.get(did);\n\n if (!record) {\n record = {\n did,\n requests: [],\n firstSeen: now,\n };\n this.rateLimits.set(did, record);\n }\n\n // Add request timestamp\n record.requests.push(now);\n\n // Clean up old requests\n record.requests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n logger.debug('Recorded request', { did, count: record.requests.length });\n }\n\n /**\n * Get peer trust level based on age\n */\n getPeerTrustLevel(peerId: string): PeerTrustLevel {\n const firstSeen = this.peerFirstSeen.get(peerId);\n if (!firstSeen) {\n return 'new';\n }\n\n const age = Date.now() - firstSeen;\n\n if (age < this.NEW_AGENT_WINDOW) {\n return 'new';\n } else if (age < this.ESTABLISHED_THRESHOLD) {\n return 'established';\n } else {\n return 'trusted';\n }\n }\n\n /**\n * Record first seen time for a peer\n */\n recordPeerSeen(peerId: string): void {\n if (!this.peerFirstSeen.has(peerId)) {\n this.peerFirstSeen.set(peerId, Date.now());\n logger.debug('Recorded new peer', { peerId });\n }\n }\n\n /**\n * Clean up old records\n */\n cleanup(): void {\n const now = Date.now();\n const cutoff = now - this.NEW_AGENT_WINDOW;\n\n // Clean up rate limits for old agents\n for (const [did, record] of this.rateLimits.entries()) {\n if (record.firstSeen < cutoff) {\n this.rateLimits.delete(did);\n }\n }\n\n logger.info('Cleaned up Sybil defense records', {\n rateLimits: this.rateLimits.size,\n peers: this.peerFirstSeen.size,\n });\n }\n\n /**\n * Generate a random nonce\n */\n private generateNonce(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n }\n\n /**\n * Count leading zero bits in a hash\n */\n private countLeadingZeroBits(hash: Uint8Array): number {\n let count = 0;\n for (const byte of hash) {\n if (byte === 0) {\n count += 8;\n } else {\n // Count leading zeros in this byte\n let b = byte;\n while ((b & 0x80) === 0) {\n count++;\n b <<= 1;\n }\n break;\n }\n }\n return count;\n }\n}\n"]}