@unicitylabs/sphere-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1112 -0
- package/dist/core/index.cjs +7042 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +2548 -0
- package/dist/core/index.d.ts +2548 -0
- package/dist/core/index.js +6946 -0
- package/dist/core/index.js.map +1 -0
- package/dist/impl/browser/index.cjs +7853 -0
- package/dist/impl/browser/index.cjs.map +1 -0
- package/dist/impl/browser/index.d.cts +3016 -0
- package/dist/impl/browser/index.d.ts +3016 -0
- package/dist/impl/browser/index.js +7841 -0
- package/dist/impl/browser/index.js.map +1 -0
- package/dist/impl/nodejs/index.cjs +1767 -0
- package/dist/impl/nodejs/index.cjs.map +1 -0
- package/dist/impl/nodejs/index.d.cts +1091 -0
- package/dist/impl/nodejs/index.d.ts +1091 -0
- package/dist/impl/nodejs/index.js +1722 -0
- package/dist/impl/nodejs/index.js.map +1 -0
- package/dist/index.cjs +7647 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +10533 -0
- package/dist/index.d.ts +10533 -0
- package/dist/index.js +7523 -0
- package/dist/index.js.map +1 -0
- package/dist/l1/index.cjs +1545 -0
- package/dist/l1/index.cjs.map +1 -0
- package/dist/l1/index.d.cts +705 -0
- package/dist/l1/index.d.ts +705 -0
- package/dist/l1/index.js +1455 -0
- package/dist/l1/index.js.map +1 -0
- package/package.json +140 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../impl/browser/storage/LocalStorageProvider.ts","../../../constants.ts","../../../impl/browser/storage/IpfsStorageProvider.ts","../../../node_modules/@libp2p/interface/src/errors.ts","../../../node_modules/@libp2p/interface/src/peer-discovery.ts","../../../node_modules/@libp2p/interface/src/peer-id.ts","../../../node_modules/main-event/src/events.browser.ts","../../../node_modules/main-event/src/index.ts","../../../node_modules/@libp2p/interface/src/index.ts","../../../node_modules/multiformats/src/bases/base58.ts","../../../node_modules/multiformats/src/bytes.ts","../../../node_modules/multiformats/src/vendor/base-x.js","../../../node_modules/multiformats/src/bases/base.ts","../../../node_modules/multiformats/src/bases/base32.ts","../../../node_modules/multiformats/src/bases/base36.ts","../../../node_modules/multiformats/src/vendor/varint.js","../../../node_modules/multiformats/src/varint.ts","../../../node_modules/multiformats/src/hashes/digest.ts","../../../node_modules/multiformats/src/cid.ts","../../../node_modules/multiformats/src/hashes/identity.ts","../../../node_modules/uint8arrays/src/equals.ts","../../../node_modules/uint8arrays/src/alloc.ts","../../../node_modules/uint8arrays/src/util/as-uint8array.ts","../../../node_modules/uint8arrays/src/concat.ts","../../../node_modules/uint8arraylist/src/index.ts","../../../node_modules/multiformats/src/bases/base10.ts","../../../node_modules/multiformats/src/bases/base16.ts","../../../node_modules/multiformats/src/bases/base2.ts","../../../node_modules/multiformats/src/bases/base256emoji.ts","../../../node_modules/multiformats/src/bases/base64.ts","../../../node_modules/multiformats/src/bases/base8.ts","../../../node_modules/multiformats/src/bases/identity.ts","../../../node_modules/multiformats/src/codecs/json.ts","../../../node_modules/multiformats/src/hashes/sha2-browser.ts","../../../node_modules/multiformats/src/hashes/hasher.ts","../../../node_modules/multiformats/src/basics.ts","../../../node_modules/uint8arrays/src/util/bases.ts","../../../node_modules/uint8arrays/src/from-string.ts","../../../node_modules/uint8arrays/src/to-string.ts","../../../node_modules/@libp2p/crypto/src/keys/rsa/der.ts","../../../node_modules/@libp2p/crypto/src/keys/ecdsa/index.ts","../../../node_modules/@libp2p/crypto/src/keys/ecdsa/utils.ts","../../../node_modules/@libp2p/crypto/src/keys/ecdsa/ecdsa.ts","../../../node_modules/@libp2p/crypto/src/keys/ed25519/index.browser.ts","../../../node_modules/@libp2p/crypto/src/errors.ts","../../../node_modules/@libp2p/crypto/src/webcrypto/webcrypto.browser.ts","../../../node_modules/@libp2p/crypto/src/webcrypto/index.ts","../../../node_modules/@libp2p/crypto/src/util.ts","../../../node_modules/@libp2p/crypto/src/keys/ed25519/ed25519.ts","../../../node_modules/@libp2p/crypto/src/keys/ed25519/utils.ts","../../../node_modules/uint8-varint/src/index.ts","../../../node_modules/protons-runtime/src/utils/float.ts","../../../node_modules/protons-runtime/src/utils/longbits.ts","../../../node_modules/protons-runtime/src/utils/utf8.ts","../../../node_modules/protons-runtime/src/utils/reader.ts","../../../node_modules/protons-runtime/src/decode.ts","../../../node_modules/protons-runtime/src/utils/pool.ts","../../../node_modules/protons-runtime/src/utils/writer.ts","../../../node_modules/protons-runtime/src/encode.ts","../../../node_modules/protons-runtime/src/codec.ts","../../../node_modules/protons-runtime/src/codecs/enum.ts","../../../node_modules/protons-runtime/src/codecs/message.ts","../../../node_modules/@libp2p/crypto/src/keys/keys.ts","../../../node_modules/@libp2p/crypto/src/keys/secp256k1/index.browser.ts","../../../node_modules/@libp2p/crypto/src/keys/secp256k1/utils.ts","../../../node_modules/@libp2p/crypto/src/keys/secp256k1/secp256k1.ts","../../../node_modules/@libp2p/crypto/src/keys/index.ts","../../../node_modules/@libp2p/peer-id/src/peer-id.ts","../../../node_modules/@libp2p/peer-id/src/index.ts","../../../node_modules/@multiformats/multiaddr/src/errors.ts","../../../node_modules/@chainsafe/is-ip/src/parser.ts","../../../node_modules/@chainsafe/is-ip/src/parse.ts","../../../node_modules/@chainsafe/is-ip/src/is-ip.ts","../../../node_modules/@multiformats/multiaddr/src/constants.ts","../../../node_modules/@multiformats/multiaddr/src/utils.ts","../../../node_modules/@multiformats/multiaddr/src/validation.ts","../../../node_modules/@multiformats/multiaddr/src/registry.ts","../../../node_modules/@multiformats/multiaddr/src/components.ts","../../../node_modules/@multiformats/multiaddr/src/multiaddr.ts","../../../node_modules/@multiformats/multiaddr/src/index.ts","../../../node_modules/@multiformats/multiaddr-matcher/src/utils.ts","../../../node_modules/@multiformats/multiaddr-matcher/src/index.ts","../../../node_modules/@libp2p/bootstrap/src/index.ts","../../../impl/browser/storage/IndexedDBTokenStorageProvider.ts","../../../transport/NostrTransportProvider.ts","../../../transport/websocket.ts","../../../impl/browser/transport/index.ts","../../../oracle/UnicityAggregatorProvider.ts","../../../impl/browser/oracle/index.ts","../../../impl/browser/download.ts","../../../impl/shared/resolvers.ts","../../../impl/browser/index.ts"],"sourcesContent":["/**\n * Browser LocalStorage Provider\n * Implements StorageProvider using browser localStorage\n */\n\nimport type { ProviderStatus, FullIdentity } from '../../../types';\nimport type { StorageProvider } from '../../../storage';\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\nexport interface LocalStorageProviderConfig {\n /** Key prefix (default: 'sphere_sdk2_') */\n prefix?: string;\n /** Custom storage instance (for testing/SSR) */\n storage?: Storage;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\nexport class LocalStorageProvider implements StorageProvider {\n readonly id = 'localStorage';\n readonly name = 'Local Storage';\n readonly type = 'local' as const;\n readonly description = 'Browser localStorage for single-device persistence';\n\n private config: Required<Pick<LocalStorageProviderConfig, 'prefix' | 'debug'>> & {\n storage: Storage;\n };\n private identity: FullIdentity | null = null;\n private status: ProviderStatus = 'disconnected';\n\n constructor(config?: LocalStorageProviderConfig) {\n // SSR fallback: use in-memory storage if localStorage unavailable\n const storage = config?.storage ?? this.getStorageSafe();\n\n this.config = {\n prefix: config?.prefix ?? 'sphere_sdk2_',\n storage,\n debug: config?.debug ?? false,\n };\n }\n\n // ===========================================================================\n // BaseProvider Implementation\n // ===========================================================================\n\n async connect(): Promise<void> {\n if (this.status === 'connected') return;\n\n this.status = 'connecting';\n\n try {\n // Test storage availability\n const testKey = `${this.config.prefix}_test`;\n this.config.storage.setItem(testKey, 'test');\n this.config.storage.removeItem(testKey);\n\n this.status = 'connected';\n this.log('Connected to localStorage');\n } catch (error) {\n this.status = 'error';\n throw new Error(`LocalStorage not available: ${error}`);\n }\n }\n\n async disconnect(): Promise<void> {\n this.status = 'disconnected';\n this.log('Disconnected from localStorage');\n }\n\n isConnected(): boolean {\n return this.status === 'connected';\n }\n\n getStatus(): ProviderStatus {\n return this.status;\n }\n\n // ===========================================================================\n // StorageProvider Implementation\n // ===========================================================================\n\n setIdentity(identity: FullIdentity): void {\n this.identity = identity;\n this.log('Identity set:', identity.address);\n }\n\n async get(key: string): Promise<string | null> {\n this.ensureConnected();\n const fullKey = this.getFullKey(key);\n return this.config.storage.getItem(fullKey);\n }\n\n async set(key: string, value: string): Promise<void> {\n this.ensureConnected();\n const fullKey = this.getFullKey(key);\n this.config.storage.setItem(fullKey, value);\n }\n\n async remove(key: string): Promise<void> {\n this.ensureConnected();\n const fullKey = this.getFullKey(key);\n this.config.storage.removeItem(fullKey);\n }\n\n async has(key: string): Promise<boolean> {\n this.ensureConnected();\n const fullKey = this.getFullKey(key);\n return this.config.storage.getItem(fullKey) !== null;\n }\n\n async keys(prefix?: string): Promise<string[]> {\n this.ensureConnected();\n const basePrefix = this.getFullKey('');\n const searchPrefix = prefix ? this.getFullKey(prefix) : basePrefix;\n const result: string[] = [];\n\n for (let i = 0; i < this.config.storage.length; i++) {\n const key = this.config.storage.key(i);\n if (key?.startsWith(searchPrefix)) {\n // Return key without the base prefix\n result.push(key.slice(basePrefix.length));\n }\n }\n\n return result;\n }\n\n async clear(prefix?: string): Promise<void> {\n this.ensureConnected();\n const keysToRemove = await this.keys(prefix);\n for (const key of keysToRemove) {\n await this.remove(key);\n }\n }\n\n // ===========================================================================\n // Helpers\n // ===========================================================================\n\n /**\n * Get JSON data\n */\n async getJSON<T>(key: string): Promise<T | null> {\n const value = await this.get(key);\n if (!value) return null;\n try {\n return JSON.parse(value) as T;\n } catch {\n return null;\n }\n }\n\n /**\n * Set JSON data\n */\n async setJSON<T>(key: string, value: T): Promise<void> {\n await this.set(key, JSON.stringify(value));\n }\n\n // ===========================================================================\n // Private Methods\n // ===========================================================================\n\n private getFullKey(key: string): string {\n const addressPart = this.identity?.address ?? 'default';\n return `${this.config.prefix}${addressPart}_${key}`;\n }\n\n private ensureConnected(): void {\n if (this.status !== 'connected') {\n throw new Error('LocalStorageProvider not connected');\n }\n }\n\n private getStorageSafe(): Storage {\n if (typeof window !== 'undefined' && window.localStorage) {\n return window.localStorage;\n }\n\n // SSR fallback: in-memory storage\n return createInMemoryStorage();\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[LocalStorageProvider]', ...args);\n }\n }\n}\n\n// =============================================================================\n// In-Memory Storage (SSR Fallback)\n// =============================================================================\n\nfunction createInMemoryStorage(): Storage {\n const data = new Map<string, string>();\n\n return {\n get length() {\n return data.size;\n },\n clear() {\n data.clear();\n },\n getItem(key: string) {\n return data.get(key) ?? null;\n },\n setItem(key: string, value: string) {\n data.set(key, value);\n },\n removeItem(key: string) {\n data.delete(key);\n },\n key(index: number) {\n return Array.from(data.keys())[index] ?? null;\n },\n };\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\nexport function createLocalStorageProvider(\n config?: LocalStorageProviderConfig\n): LocalStorageProvider {\n return new LocalStorageProvider(config);\n}\n","/**\n * SDK2 Constants\n * Default configuration values and storage keys\n */\n\n// =============================================================================\n// Storage Keys\n// =============================================================================\n\n/** Default prefix for all storage keys */\nexport const STORAGE_PREFIX = 'sphere_' as const;\n\n/**\n * Default encryption key for wallet data\n * WARNING: This is a placeholder. In production, use user-provided password.\n * This key is used when no password is provided to encrypt/decrypt mnemonic.\n */\nexport const DEFAULT_ENCRYPTION_KEY = 'sphere-default-key' as const;\n\n/** Storage keys for wallet data */\nexport const STORAGE_KEYS = {\n /** Encrypted BIP39 mnemonic */\n MNEMONIC: `${STORAGE_PREFIX}mnemonic`,\n /** Encrypted master private key */\n MASTER_KEY: `${STORAGE_PREFIX}master_key`,\n /** BIP32 chain code */\n CHAIN_CODE: `${STORAGE_PREFIX}chain_code`,\n /** HD derivation path (full path like m/44'/0'/0'/0/0) */\n DERIVATION_PATH: `${STORAGE_PREFIX}derivation_path`,\n /** Base derivation path (like m/44'/0'/0' without chain/index) */\n BASE_PATH: `${STORAGE_PREFIX}base_path`,\n /** Derivation mode: bip32, wif_hmac, legacy_hmac */\n DERIVATION_MODE: `${STORAGE_PREFIX}derivation_mode`,\n /** Wallet source: mnemonic, file, unknown */\n WALLET_SOURCE: `${STORAGE_PREFIX}wallet_source`,\n /** Wallet existence flag */\n WALLET_EXISTS: `${STORAGE_PREFIX}wallet_exists`,\n /** Registered nametag (legacy - single address) */\n NAMETAG: `${STORAGE_PREFIX}nametag`,\n /** Current active address index */\n CURRENT_ADDRESS_INDEX: `${STORAGE_PREFIX}current_address_index`,\n /** Address nametags map (JSON: { \"0\": \"alice\", \"1\": \"bob\" }) */\n ADDRESS_NAMETAGS: `${STORAGE_PREFIX}address_nametags`,\n /** Token data */\n TOKENS: `${STORAGE_PREFIX}tokens`,\n /** Pending transfers */\n PENDING_TRANSFERS: `${STORAGE_PREFIX}pending_transfers`,\n /** Transfer outbox */\n OUTBOX: `${STORAGE_PREFIX}outbox`,\n /** Conversations */\n CONVERSATIONS: `${STORAGE_PREFIX}conversations`,\n /** Messages */\n MESSAGES: `${STORAGE_PREFIX}messages`,\n /** Transaction history */\n TRANSACTION_HISTORY: `${STORAGE_PREFIX}transaction_history`,\n /** Archived tokens (spent token history) */\n ARCHIVED_TOKENS: `${STORAGE_PREFIX}archived_tokens`,\n /** Tombstones (records of deleted/spent tokens) */\n TOMBSTONES: `${STORAGE_PREFIX}tombstones`,\n /** Forked tokens (alternative histories) */\n FORKED_TOKENS: `${STORAGE_PREFIX}forked_tokens`,\n} as const;\n\n// =============================================================================\n// Nostr Defaults\n// =============================================================================\n\n/** Default Nostr relays */\nexport const DEFAULT_NOSTR_RELAYS = [\n 'wss://relay.unicity.network',\n 'wss://relay.damus.io',\n 'wss://nos.lol',\n 'wss://relay.nostr.band',\n] as const;\n\n/** Nostr event kinds used by SDK - must match @unicitylabs/nostr-js-sdk */\nexport const NOSTR_EVENT_KINDS = {\n /** NIP-04 encrypted direct message */\n DIRECT_MESSAGE: 4,\n /** Token transfer (Unicity custom - 31113) */\n TOKEN_TRANSFER: 31113,\n /** Payment request (Unicity custom - 31115) */\n PAYMENT_REQUEST: 31115,\n /** Payment request response (Unicity custom - 31116) */\n PAYMENT_REQUEST_RESPONSE: 31116,\n /** Nametag binding (NIP-78 app-specific data) */\n NAMETAG_BINDING: 30078,\n /** Public broadcast */\n BROADCAST: 1,\n} as const;\n\n// =============================================================================\n// Aggregator (Oracle) Defaults\n// =============================================================================\n\n/**\n * Default aggregator URL\n * Note: The aggregator is conceptually an oracle - a trusted service that provides\n * verifiable truth about token state through cryptographic inclusion proofs.\n */\nexport const DEFAULT_AGGREGATOR_URL = 'https://aggregator.unicity.network/rpc' as const;\n\n/** Dev aggregator URL */\nexport const DEV_AGGREGATOR_URL = 'https://dev-aggregator.dyndns.org/rpc' as const;\n\n/** Test aggregator URL (Goggregator) */\nexport const TEST_AGGREGATOR_URL = 'https://goggregator-test.unicity.network' as const;\n\n/** Default aggregator request timeout (ms) */\nexport const DEFAULT_AGGREGATOR_TIMEOUT = 30000;\n\n// =============================================================================\n// IPFS Defaults\n// =============================================================================\n\n/** Default IPFS gateways */\nexport const DEFAULT_IPFS_GATEWAYS = [\n 'https://ipfs.unicity.network',\n 'https://dweb.link',\n 'https://ipfs.io',\n] as const;\n\n/** Unicity IPFS bootstrap peers */\nexport const DEFAULT_IPFS_BOOTSTRAP_PEERS = [\n '/dns4/unicity-ipfs2.dyndns.org/tcp/4001/p2p/12D3KooWLNi5NDPPHbrfJakAQqwBqymYTTwMQXQKEWuCrJNDdmfh',\n '/dns4/unicity-ipfs3.dyndns.org/tcp/4001/p2p/12D3KooWQ4aujVE4ShLjdusNZBdffq3TbzrwT2DuWZY9H1Gxhwn6',\n '/dns4/unicity-ipfs4.dyndns.org/tcp/4001/p2p/12D3KooWJ1ByPfUzUrpYvgxKU8NZrR8i6PU1tUgMEbQX9Hh2DEn1',\n '/dns4/unicity-ipfs5.dyndns.org/tcp/4001/p2p/12D3KooWB1MdZZGHN5B8TvWXntbycfe7Cjcz7n6eZ9eykZadvmDv',\n] as const;\n\n// =============================================================================\n// Wallet Defaults\n// =============================================================================\n\n/** Default BIP32 base path (without chain/index) */\nexport const DEFAULT_BASE_PATH = \"m/44'/0'/0'\" as const;\n\n/** Default BIP32 derivation path (full path with chain/index) */\nexport const DEFAULT_DERIVATION_PATH = `${DEFAULT_BASE_PATH}/0/0` as const;\n\n/** Coin types */\nexport const COIN_TYPES = {\n /** ALPHA token (L1 blockchain) */\n ALPHA: 'ALPHA',\n /** Test token */\n TEST: 'TEST',\n} as const;\n\n// =============================================================================\n// L1 (ALPHA Blockchain) Defaults\n// =============================================================================\n\n/** Default Fulcrum electrum server for mainnet */\nexport const DEFAULT_ELECTRUM_URL = 'wss://fulcrum.alpha.unicity.network:50004' as const;\n\n/** Testnet Fulcrum electrum server */\nexport const TEST_ELECTRUM_URL = 'wss://fulcrum.alpha.testnet.unicity.network:50004' as const;\n\n// =============================================================================\n// Network Defaults\n// =============================================================================\n\n/** Testnet Nostr relays */\nexport const TEST_NOSTR_RELAYS = [\n 'wss://nostr-relay.testnet.unicity.network',\n] as const;\n\n/** Network configurations */\nexport const NETWORKS = {\n mainnet: {\n name: 'Mainnet',\n aggregatorUrl: DEFAULT_AGGREGATOR_URL,\n nostrRelays: DEFAULT_NOSTR_RELAYS,\n ipfsGateways: DEFAULT_IPFS_GATEWAYS,\n electrumUrl: DEFAULT_ELECTRUM_URL,\n },\n testnet: {\n name: 'Testnet',\n aggregatorUrl: TEST_AGGREGATOR_URL,\n nostrRelays: TEST_NOSTR_RELAYS,\n ipfsGateways: DEFAULT_IPFS_GATEWAYS,\n electrumUrl: TEST_ELECTRUM_URL,\n },\n dev: {\n name: 'Development',\n aggregatorUrl: DEV_AGGREGATOR_URL,\n nostrRelays: TEST_NOSTR_RELAYS,\n ipfsGateways: DEFAULT_IPFS_GATEWAYS,\n electrumUrl: TEST_ELECTRUM_URL,\n },\n} as const;\n\nexport type NetworkType = keyof typeof NETWORKS;\nexport type NetworkConfig = (typeof NETWORKS)[NetworkType];\n\n// =============================================================================\n// Timeouts & Limits\n// =============================================================================\n\n/** Default timeouts (ms) */\nexport const TIMEOUTS = {\n /** WebSocket connection timeout */\n WEBSOCKET_CONNECT: 10000,\n /** Nostr relay reconnect delay */\n NOSTR_RECONNECT_DELAY: 3000,\n /** Max reconnect attempts */\n MAX_RECONNECT_ATTEMPTS: 5,\n /** Proof polling interval */\n PROOF_POLL_INTERVAL: 1000,\n /** Sync interval */\n SYNC_INTERVAL: 60000,\n} as const;\n\n/** Validation limits */\nexport const LIMITS = {\n /** Min nametag length */\n NAMETAG_MIN_LENGTH: 3,\n /** Max nametag length */\n NAMETAG_MAX_LENGTH: 20,\n /** Max memo length */\n MEMO_MAX_LENGTH: 500,\n /** Max message length */\n MESSAGE_MAX_LENGTH: 10000,\n} as const;\n","/**\n * Browser IPFS Storage Provider\n * Implements TokenStorageProvider using IPFS/IPNS for decentralized storage\n *\n * Uses a hybrid approach:\n * - HTTP API to backend gateways for fast publishing/resolution\n * - Helia for browser-based DHT operations as backup\n */\n\nimport type { ProviderStatus, FullIdentity } from '../../../types';\nimport type {\n TokenStorageProvider,\n TxfStorageDataBase,\n TxfTombstone,\n SaveResult,\n LoadResult,\n SyncResult,\n StorageEvent,\n StorageEventCallback,\n} from '../../../storage';\nimport {\n DEFAULT_IPFS_GATEWAYS,\n DEFAULT_IPFS_BOOTSTRAP_PEERS,\n} from '../../../constants';\n\n// Helia and IPFS imports\nimport { createHelia, type Helia } from 'helia';\nimport { json, type JSON as HeliaJSON } from '@helia/json';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { generateKeyPairFromSeed } from '@libp2p/crypto/keys';\nimport { peerIdFromPrivateKey } from '@libp2p/peer-id';\nimport type { PrivateKey } from '@libp2p/interface';\nimport { hkdf } from '@noble/hashes/hkdf.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { CID } from 'multiformats/cid';\n\n/** HKDF info for IPNS key derivation */\nconst HKDF_INFO = new TextEncoder().encode('ipfs-storage-key');\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\nexport interface IpfsStorageProviderConfig {\n /** IPFS gateway URLs for HTTP API */\n gateways?: string[];\n /** Bootstrap peers for DHT */\n bootstrapPeers?: string[];\n /** Enable IPNS for mutable addressing */\n enableIpns?: boolean;\n /** IPNS publish timeout (ms) */\n ipnsTimeout?: number;\n /** Content fetch timeout (ms) */\n fetchTimeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\nexport class IpfsStorageProvider<TData extends TxfStorageDataBase = TxfStorageDataBase>\n implements TokenStorageProvider<TData>\n{\n readonly id = 'ipfs';\n readonly name = 'IPFS Storage';\n readonly type = 'p2p' as const;\n readonly description = 'Decentralized storage via IPFS/IPNS';\n\n private config: Required<IpfsStorageProviderConfig>;\n private identity: FullIdentity | null = null;\n private status: ProviderStatus = 'disconnected';\n private ipnsName: string | null = null;\n private lastCid: string | null = null;\n private eventCallbacks: Set<StorageEventCallback> = new Set();\n\n // Helia instance for browser-based IPFS\n private helia: Helia | null = null;\n private heliaJson: HeliaJSON | null = null;\n private ipnsKeyPair: PrivateKey | null = null;\n\n /** Get the last published CID */\n getLastCid(): string | null {\n return this.lastCid;\n }\n\n // Local cache for faster loads\n private localCache: TData | null = null;\n private cacheTimestamp = 0;\n\n constructor(config?: IpfsStorageProviderConfig) {\n this.config = {\n gateways: config?.gateways ?? [...DEFAULT_IPFS_GATEWAYS],\n bootstrapPeers: config?.bootstrapPeers ?? [...DEFAULT_IPFS_BOOTSTRAP_PEERS],\n enableIpns: config?.enableIpns ?? true,\n ipnsTimeout: config?.ipnsTimeout ?? 30000,\n fetchTimeout: config?.fetchTimeout ?? 15000,\n debug: config?.debug ?? false,\n };\n }\n\n // ===========================================================================\n // BaseProvider Implementation\n // ===========================================================================\n\n async connect(): Promise<void> {\n if (this.status === 'connected') return;\n\n this.status = 'connecting';\n\n try {\n // Test gateway connectivity first (fast path)\n await this.testGatewayConnectivity();\n\n // Initialize Helia for browser-based DHT\n await this.initializeHelia();\n\n this.status = 'connected';\n this.log('Connected to IPFS gateways and Helia initialized');\n } catch (error) {\n this.status = 'error';\n throw new Error(`IPFS connection failed: ${error}`);\n }\n }\n\n /**\n * Initialize Helia browser IPFS node\n */\n private async initializeHelia(): Promise<void> {\n if (this.helia) return;\n\n try {\n this.log('Initializing Helia with bootstrap peers...');\n\n this.helia = await createHelia({\n libp2p: {\n peerDiscovery: [\n bootstrap({ list: this.config.bootstrapPeers }),\n ],\n connectionManager: {\n maxConnections: 10,\n },\n },\n });\n\n this.heliaJson = json(this.helia);\n\n const peerId = this.helia.libp2p.peerId.toString();\n this.log('Helia initialized, browser peer ID:', peerId.slice(0, 20) + '...');\n\n // Log connections after a short delay\n setTimeout(() => {\n const connections = this.helia?.libp2p.getConnections() || [];\n this.log(`Active Helia connections: ${connections.length}`);\n }, 3000);\n } catch (error) {\n this.log('Helia initialization failed (will use HTTP only):', error);\n // Non-fatal - HTTP gateways still work\n }\n }\n\n async disconnect(): Promise<void> {\n // Stop Helia\n if (this.helia) {\n try {\n await this.helia.stop();\n } catch (error) {\n this.log('Error stopping Helia:', error);\n }\n this.helia = null;\n this.heliaJson = null;\n }\n\n this.status = 'disconnected';\n this.localCache = null;\n this.ipnsKeyPair = null;\n this.log('Disconnected from IPFS');\n }\n\n isConnected(): boolean {\n return this.status === 'connected';\n }\n\n getStatus(): ProviderStatus {\n return this.status;\n }\n\n // ===========================================================================\n // TokenStorageProvider Implementation\n // ===========================================================================\n\n async setIdentity(identity: FullIdentity): Promise<void> {\n this.identity = identity;\n\n // Derive IPNS key pair from wallet private key using HKDF\n try {\n const walletSecret = this.hexToBytes(identity.privateKey);\n const derivedKey = hkdf(sha256, walletSecret, undefined, HKDF_INFO, 32);\n\n // Generate libp2p Ed25519 key pair for IPNS\n this.ipnsKeyPair = await generateKeyPairFromSeed('Ed25519', derivedKey);\n const peerId = peerIdFromPrivateKey(this.ipnsKeyPair);\n this.ipnsName = peerId.toString();\n\n this.log('Identity set, IPNS name:', this.ipnsName);\n } catch {\n // Fallback to provided IPNS name or simple derivation\n this.ipnsName = identity.ipnsName ?? this.deriveIpnsNameSimple(identity.privateKey);\n this.log('Identity set with fallback IPNS name:', this.ipnsName);\n }\n }\n\n async initialize(): Promise<boolean> {\n if (!this.identity) {\n throw new Error('Identity must be set before initialization');\n }\n\n try {\n await this.connect();\n return true;\n } catch {\n return false;\n }\n }\n\n async shutdown(): Promise<void> {\n await this.disconnect();\n }\n\n async save(data: TData): Promise<SaveResult> {\n this.ensureReady();\n this.emitEvent({ type: 'storage:saving', timestamp: Date.now() });\n\n try {\n // Update metadata\n const dataToSave: TData = {\n ...data,\n _meta: {\n ...data._meta,\n updatedAt: Date.now(),\n ipnsName: this.ipnsName ?? undefined,\n },\n };\n\n // Publish to IPFS (parallel to all gateways)\n const cid = await this.publishToGateways(dataToSave);\n\n // Update IPNS if enabled\n if (this.config.enableIpns && this.ipnsName) {\n await this.publishIpns(cid);\n }\n\n // Update local cache\n this.localCache = dataToSave;\n this.cacheTimestamp = Date.now();\n this.lastCid = cid;\n\n this.emitEvent({ type: 'storage:saved', timestamp: Date.now(), data: { cid } });\n\n return {\n success: true,\n cid,\n timestamp: Date.now(),\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.emitEvent({ type: 'storage:error', timestamp: Date.now(), error: errorMsg });\n\n return {\n success: false,\n error: errorMsg,\n timestamp: Date.now(),\n };\n }\n }\n\n async load(identifier?: string): Promise<LoadResult<TData>> {\n this.ensureReady();\n this.emitEvent({ type: 'storage:loading', timestamp: Date.now() });\n\n try {\n // Try local cache first (if recent)\n const cacheAge = Date.now() - this.cacheTimestamp;\n if (this.localCache && cacheAge < 60000) {\n this.log('Returning cached data');\n return {\n success: true,\n data: this.localCache,\n source: 'cache',\n timestamp: Date.now(),\n };\n }\n\n // Resolve IPNS or use direct CID\n let cid: string | null = identifier ?? null;\n\n if (!cid && this.config.enableIpns && this.ipnsName) {\n cid = await this.resolveIpns(this.ipnsName);\n }\n\n if (!cid) {\n // No remote data found\n return {\n success: true,\n data: undefined,\n source: 'remote',\n timestamp: Date.now(),\n };\n }\n\n // Fetch content\n const data = await this.fetchFromGateways<TData>(cid);\n\n // Update cache\n this.localCache = data;\n this.cacheTimestamp = Date.now();\n this.lastCid = cid;\n\n this.emitEvent({ type: 'storage:loaded', timestamp: Date.now() });\n\n return {\n success: true,\n data,\n source: 'remote',\n timestamp: Date.now(),\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.emitEvent({ type: 'storage:error', timestamp: Date.now(), error: errorMsg });\n\n // Fallback to cache on error\n if (this.localCache) {\n return {\n success: true,\n data: this.localCache,\n source: 'cache',\n timestamp: Date.now(),\n };\n }\n\n return {\n success: false,\n error: errorMsg,\n source: 'remote',\n timestamp: Date.now(),\n };\n }\n }\n\n async sync(localData: TData): Promise<SyncResult<TData>> {\n this.ensureReady();\n this.emitEvent({ type: 'sync:started', timestamp: Date.now() });\n\n try {\n // Load remote data\n const remoteResult = await this.load();\n const remoteData = remoteResult.data;\n\n if (!remoteData) {\n // No remote data, just save local\n await this.save(localData);\n this.emitEvent({ type: 'sync:completed', timestamp: Date.now() });\n return {\n success: true,\n merged: localData,\n added: 0,\n removed: 0,\n conflicts: 0,\n };\n }\n\n // Merge data\n const mergeResult = this.mergeData(localData, remoteData);\n\n // Save merged result\n await this.save(mergeResult.merged);\n\n this.emitEvent({ type: 'sync:completed', timestamp: Date.now() });\n\n return {\n success: true,\n merged: mergeResult.merged,\n added: mergeResult.added,\n removed: mergeResult.removed,\n conflicts: mergeResult.conflicts,\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.emitEvent({ type: 'sync:error', timestamp: Date.now(), error: errorMsg });\n\n return {\n success: false,\n added: 0,\n removed: 0,\n conflicts: 0,\n error: errorMsg,\n };\n }\n }\n\n async exists(): Promise<boolean> {\n if (!this.ipnsName) return false;\n\n try {\n const cid = await this.resolveIpns(this.ipnsName);\n return cid !== null;\n } catch {\n return false;\n }\n }\n\n async clear(): Promise<boolean> {\n // IPFS is immutable, we can only publish empty data\n const emptyData = {\n _meta: {\n version: 0,\n address: this.identity?.address ?? '',\n formatVersion: '2.0',\n updatedAt: Date.now(),\n },\n _tombstones: [],\n } as unknown as TData;\n\n const result = await this.save(emptyData);\n return result.success;\n }\n\n onEvent(callback: StorageEventCallback): () => void {\n this.eventCallbacks.add(callback);\n return () => this.eventCallbacks.delete(callback);\n }\n\n // ===========================================================================\n // Private: IPFS Operations\n // ===========================================================================\n\n private async testGatewayConnectivity(): Promise<void> {\n const gateway = this.config.gateways[0];\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n\n try {\n const response = await fetch(`${gateway}/api/v0/version`, {\n method: 'POST',\n signal: controller.signal,\n });\n if (!response.ok) throw new Error('Gateway not responding');\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async publishToGateways(data: TData): Promise<string> {\n const content = JSON.stringify(data);\n const blob = new Blob([content], { type: 'application/json' });\n\n // Strategy: Try both HTTP and Helia in parallel, return first success\n const promises: Promise<string>[] = [];\n\n // HTTP gateway publishing (fast path)\n for (const gateway of this.config.gateways) {\n promises.push(this.publishToGateway(gateway, blob));\n }\n\n // Helia DHT publishing (backup path)\n if (this.heliaJson) {\n promises.push(this.publishToHelia(data));\n }\n\n try {\n const cid = await Promise.any(promises);\n this.log('Published to IPFS, CID:', cid);\n return cid;\n } catch {\n throw new Error('All publish attempts failed');\n }\n }\n\n /**\n * Publish data via Helia (browser DHT)\n */\n private async publishToHelia(data: TData): Promise<string> {\n if (!this.heliaJson) {\n throw new Error('Helia not initialized');\n }\n\n const cid = await this.heliaJson.add(data);\n this.log('Published via Helia, CID:', cid.toString());\n return cid.toString();\n }\n\n private async publishToGateway(gateway: string, blob: Blob): Promise<string> {\n const formData = new FormData();\n formData.append('file', blob);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.fetchTimeout);\n\n try {\n const response = await fetch(`${gateway}/api/v0/add?pin=true`, {\n method: 'POST',\n body: formData,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Gateway ${gateway} returned ${response.status}`);\n }\n\n const result = await response.json();\n return result.Hash;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async publishIpns(cid: string): Promise<void> {\n if (!this.identity) return;\n\n // Publish to all gateways in parallel\n const promises = this.config.gateways.map((gateway) =>\n this.publishIpnsToGateway(gateway, cid).catch(() => null)\n );\n\n await Promise.allSettled(promises);\n this.log('Published IPNS:', this.ipnsName, '->', cid);\n }\n\n private async publishIpnsToGateway(gateway: string, cid: string): Promise<void> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.ipnsTimeout);\n\n try {\n const response = await fetch(\n `${gateway}/api/v0/name/publish?arg=${cid}&key=${this.ipnsName}`,\n {\n method: 'POST',\n signal: controller.signal,\n }\n );\n\n if (!response.ok) {\n throw new Error(`IPNS publish failed: ${response.status}`);\n }\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async resolveIpns(name: string): Promise<string | null> {\n // Try each gateway\n for (const gateway of this.config.gateways) {\n try {\n return await this.resolveIpnsFromGateway(gateway, name);\n } catch {\n continue;\n }\n }\n return null;\n }\n\n private async resolveIpnsFromGateway(gateway: string, name: string): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.fetchTimeout);\n\n try {\n const response = await fetch(`${gateway}/api/v0/name/resolve?arg=${name}`, {\n method: 'POST',\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`IPNS resolve failed: ${response.status}`);\n }\n\n const result = await response.json();\n // Path is like \"/ipfs/Qm...\"\n return result.Path.replace('/ipfs/', '');\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async fetchFromGateways<T>(cid: string): Promise<T> {\n // Strategy: Try both HTTP and Helia in parallel\n const promises: Promise<T>[] = [];\n\n // HTTP gateway fetching (fast path)\n for (const gateway of this.config.gateways) {\n promises.push(this.fetchFromGateway<T>(gateway, cid));\n }\n\n // Helia DHT fetching (backup path)\n if (this.heliaJson) {\n promises.push(this.fetchFromHelia<T>(cid));\n }\n\n return Promise.any(promises);\n }\n\n /**\n * Fetch content via Helia (browser DHT)\n */\n private async fetchFromHelia<T>(cidString: string): Promise<T> {\n if (!this.heliaJson) {\n throw new Error('Helia not initialized');\n }\n\n const cid = CID.parse(cidString);\n const data = await this.heliaJson.get(cid);\n this.log('Fetched via Helia, CID:', cidString);\n return data as T;\n }\n\n private async fetchFromGateway<T>(gateway: string, cid: string): Promise<T> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.fetchTimeout);\n\n try {\n const response = await fetch(`${gateway}/ipfs/${cid}`, {\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Fetch failed: ${response.status}`);\n }\n\n return response.json();\n } finally {\n clearTimeout(timeout);\n }\n }\n\n // ===========================================================================\n // Private: Merge Logic\n // ===========================================================================\n\n private mergeData(\n local: TData,\n remote: TData\n ): { merged: TData; added: number; removed: number; conflicts: number } {\n const localVersion = local._meta?.version ?? 0;\n const remoteVersion = remote._meta?.version ?? 0;\n\n // Simple strategy: newer version wins for meta\n const baseMeta = remoteVersion > localVersion ? remote._meta : local._meta;\n\n // Merge tombstones (union)\n const tombstones = new Map<string, TxfTombstone>();\n for (const t of local._tombstones ?? []) {\n tombstones.set(t.tokenId, t);\n }\n for (const t of remote._tombstones ?? []) {\n const existing = tombstones.get(t.tokenId);\n if (!existing || t.timestamp > existing.timestamp) {\n tombstones.set(t.tokenId, t);\n }\n }\n\n // Merge token entries (newer wins, respect tombstones)\n const merged = {\n _meta: {\n ...baseMeta,\n version: Math.max(localVersion, remoteVersion) + 1,\n updatedAt: Date.now(),\n },\n _tombstones: Array.from(tombstones.values()),\n } as unknown as TData;\n\n let added = 0;\n let conflicts = 0;\n\n // Process all token entries from both sources\n const processedKeys = new Set<string>();\n\n for (const key of Object.keys(local)) {\n if (!key.startsWith('_') || key === '_meta' || key === '_tombstones') continue;\n processedKeys.add(key);\n\n const tokenId = key.slice(1); // Remove leading _\n if (tombstones.has(tokenId)) continue; // Deleted\n\n const localToken = local[key as keyof TData];\n const remoteToken = remote[key as keyof TData];\n\n if (remoteToken) {\n // Both have it - conflict resolution\n conflicts++;\n // Use local (could be smarter based on timestamps)\n (merged as Record<string, unknown>)[key] = localToken;\n } else {\n (merged as Record<string, unknown>)[key] = localToken;\n }\n }\n\n for (const key of Object.keys(remote)) {\n if (!key.startsWith('_') || key === '_meta' || key === '_tombstones') continue;\n if (processedKeys.has(key)) continue;\n\n const tokenId = key.slice(1);\n if (tombstones.has(tokenId)) continue;\n\n (merged as Record<string, unknown>)[key] = remote[key as keyof TData];\n added++;\n }\n\n return { merged, added, removed: 0, conflicts };\n }\n\n // ===========================================================================\n // Private: Helpers\n // ===========================================================================\n\n private ensureReady(): void {\n if (this.status !== 'connected') {\n throw new Error('IpfsStorageProvider not connected');\n }\n if (!this.identity) {\n throw new Error('Identity not set');\n }\n }\n\n /**\n * Simple IPNS name derivation (fallback when libp2p is unavailable)\n */\n private deriveIpnsNameSimple(privateKey: string): string {\n // Fallback: use truncated hash of private key\n return `12D3KooW${privateKey.slice(0, 40)}`;\n }\n\n /**\n * Convert hex string to Uint8Array\n */\n private hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(hex.substr(i * 2, 2), 16);\n }\n return bytes;\n }\n\n private emitEvent(event: StorageEvent): void {\n for (const callback of this.eventCallbacks) {\n try {\n callback(event);\n } catch (error) {\n console.error('[IpfsStorageProvider] Event callback error:', error);\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[IpfsStorageProvider]', ...args);\n }\n }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\nexport function createIpfsStorageProvider<TData extends TxfStorageDataBase = TxfStorageDataBase>(\n config?: IpfsStorageProviderConfig\n): IpfsStorageProvider<TData> {\n return new IpfsStorageProvider<TData>(config);\n}\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 { PeerInfo } from './peer-info.js'\nimport type { TypedEventTarget } from 'main-event'\n\n/**\n * Any object that implements this Symbol as a property should return a\n * PeerDiscovery instance as the property value, similar to how\n * `Symbol.Iterable` can be used to return an `Iterable` from an `Iterator`.\n *\n * @example\n *\n * ```TypeScript\n * import { peerDiscovery, PeerDiscovery } from '@libp2p/peer-discovery'\n *\n * class MyPeerDiscoverer implements PeerDiscovery {\n * get [peerDiscovery] () {\n * return this\n * }\n *\n * // ...other methods\n * }\n * ```\n */\nexport const peerDiscoverySymbol = Symbol.for('@libp2p/peer-discovery')\n\n/**\n * Implementers of this interface can provide a PeerDiscovery implementation to\n * interested callers.\n */\nexport interface PeerDiscoveryProvider {\n [peerDiscoverySymbol]: PeerDiscovery\n}\n\nexport interface PeerDiscoveryEvents {\n peer: CustomEvent<PeerInfo>\n}\n\n/**\n * A class that implements the `PeerDiscovery` interface uses an\n * implementation-specific method to discover peers. These peers are then added\n * to the peer store for use by other system components and services.\n */\nexport interface PeerDiscovery extends TypedEventTarget<PeerDiscoveryEvents> {}\n","import type { Ed25519PublicKey, KeyType, RSAPublicKey, Secp256k1PublicKey } from './keys.js'\nimport type { CID } from 'multiformats/cid'\nimport type { MultihashDigest } from 'multiformats/hashes/interface'\n\nexport type PeerIdType = KeyType | string\n\n/**\n * A PeerId generated from an RSA public key - it is a base58btc encoded sha-256\n * hash of the public key.\n *\n * RSA public keys are too large to pass around freely, instead Ed25519 or\n * secp256k1 should be preferred as they can embed their public key in the\n * PeerId itself.\n *\n * @deprecated Ed25519 or secp256k1 keys are preferred to RSA\n */\nexport interface RSAPeerId {\n readonly type: 'RSA'\n\n /**\n * RSA public keys are too large to embed in the multihash commonly used to\n * refer to peers, so this will only be defined if the public key has\n * previously been found through a routing query or during normal protocol\n * operations\n */\n readonly publicKey?: RSAPublicKey\n\n /**\n * Returns the multihash from `toMultihash()` as a base58btc encoded string\n */\n toString(): string\n\n /**\n * Returns a multihash, the digest of which is the SHA2-256 hash of the public\n * key\n */\n toMultihash(): MultihashDigest<0x12>\n\n /**\n * Returns a CID with the libp2p key code and the same multihash as\n * `toMultihash()`\n */\n toCID(): CID<Uint8Array, 0x72, 0x12, 1>\n\n /**\n * Returns true if the passed argument is equivalent to this PeerId\n */\n equals(other?: any): boolean\n}\n\nexport interface Ed25519PeerId {\n readonly type: 'Ed25519'\n\n /**\n * This will always be defined as the public key is embedded in the multihash\n * of this PeerId\n */\n readonly publicKey: Ed25519PublicKey\n\n /**\n * Returns the multihash from `toMultihash()` as a base58btc encoded string\n */\n toString(): string\n\n /**\n * Returns a multihash, the digest of which is the protobuf-encoded public key\n * encoded as an identity hash\n */\n toMultihash(): MultihashDigest<0x0>\n\n /**\n * Returns a CID with the libp2p key code and the same multihash as\n * `toMultihash()`\n */\n toCID(): CID<Uint8Array, 0x72, 0x0, 1>\n\n /**\n * Returns true if the passed argument is equivalent to this PeerId\n */\n equals(other?: any): boolean\n}\n\nexport interface Secp256k1PeerId {\n readonly type: 'secp256k1'\n\n /**\n * This will always be defined as the public key is embedded in the multihash\n * of this PeerId\n */\n readonly publicKey: Secp256k1PublicKey\n\n /**\n * Returns the multihash from `toMultihash()` as a base58btc encoded string\n */\n toString(): string\n\n /**\n * Returns a multihash, the digest of which is the protobuf-encoded public key\n * encoded as an identity hash\n */\n toMultihash(): MultihashDigest<0x0>\n\n /**\n * Returns a CID with the libp2p key code and the same multihash as\n * `toMultihash()`\n */\n toCID(): CID<Uint8Array, 0x72, 0x0, 1>\n\n /**\n * Returns true if the passed argument is equivalent to this PeerId\n */\n equals(other?: any): boolean\n}\n\nexport interface URLPeerId {\n readonly type: 'url'\n\n /**\n * This will always be undefined as URL Peers do not have public keys\n */\n readonly publicKey: undefined\n\n /**\n * Returns CID from `toCID()` encoded as a base36 string\n */\n toString(): string\n\n /**\n * Returns a multihash, the digest of which is the URL encoded as an identity\n * hash\n */\n toMultihash(): MultihashDigest<0x0>\n\n /**\n * Returns a CID with the Transport IPFS Gateway HTTP code and the same\n * multihash as `toMultihash()`\n */\n toCID(): CID<Uint8Array, 0x0920, 0x0, 1>\n\n /**\n * Returns true if the passed argument is equivalent to this PeerId\n */\n equals(other?: any): boolean\n}\n\n/**\n * This is a union of all known PeerId types - use the `.type` field to\n * disambiguate them\n */\nexport type PeerId = RSAPeerId | Ed25519PeerId | Secp256k1PeerId | URLPeerId\n\n/**\n * All PeerId implementations must use this symbol as the name of a property\n * with a boolean `true` value\n */\nexport const peerIdSymbol = Symbol.for('@libp2p/peer-id')\n\n/**\n * Returns true if the passed argument is a PeerId implementation\n */\nexport function isPeerId (other?: any): other is PeerId {\n return Boolean(other?.[peerIdSymbol])\n}\n","/**\n * Noop for browser compatibility\n */\nexport function setMaxListeners (): void {}\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","/**\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","import { baseX } from './base.js'\n\nexport const base58btc = baseX({\n name: 'base58btc',\n prefix: 'z',\n alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n})\n\nexport const base58flickr = baseX({\n name: 'base58flickr',\n prefix: 'Z',\n alphabet: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n})\n","export const empty = new Uint8Array(0)\n\nexport function toHex (d: Uint8Array): string {\n return d.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '')\n}\n\nexport function fromHex (hex: string): Uint8Array {\n const hexes = hex.match(/../g)\n return hexes != null ? new Uint8Array(hexes.map(b => parseInt(b, 16))) : empty\n}\n\nexport function equals (aa: Uint8Array, bb: Uint8Array): boolean {\n if (aa === bb) { return true }\n if (aa.byteLength !== bb.byteLength) {\n return false\n }\n\n for (let ii = 0; ii < aa.byteLength; ii++) {\n if (aa[ii] !== bb[ii]) {\n return false\n }\n }\n\n return true\n}\n\nexport function coerce (o: ArrayBufferView | ArrayBuffer | Uint8Array): Uint8Array {\n if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') { return o }\n if (o instanceof ArrayBuffer) { return new Uint8Array(o) }\n if (ArrayBuffer.isView(o)) {\n return new Uint8Array(o.buffer, o.byteOffset, o.byteLength)\n }\n throw new Error('Unknown type, must be binary type')\n}\n\nexport function isBinary (o: unknown): o is ArrayBuffer | ArrayBufferView {\n return o instanceof ArrayBuffer || ArrayBuffer.isView(o)\n}\n\nexport function fromString (str: string): Uint8Array {\n return new TextEncoder().encode(str)\n}\n\nexport function toString (b: Uint8Array): string {\n return new TextDecoder().decode(b)\n}\n","/* eslint-disable */\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n/**\n * @param {string} ALPHABET\n * @param {any} name\n */\nfunction base (ALPHABET, name) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n var BASE_MAP = new Uint8Array(256);\n for (var j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255;\n }\n for (var i = 0; i < ALPHABET.length; i++) {\n var x = ALPHABET.charAt(i);\n var xc = x.charCodeAt(0);\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i;\n }\n var BASE = ALPHABET.length;\n var LEADER = ALPHABET.charAt(0);\n var FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n var iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n /**\n * @param {any[] | Iterable<number>} source\n */\n function encode (source) {\n // @ts-ignore\n if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source);\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n var zeroes = 0;\n var length = 0;\n var pbegin = 0;\n var pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n var size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n var b58 = new Uint8Array(size);\n // Process the bytes.\n while (pbegin !== pend) {\n var carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n var i = 0;\n for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = (carry % BASE) >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n var it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n var str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }\n return str\n }\n /**\n * @param {string | string[]} source\n */\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n var psz = 0;\n // Skip leading spaces.\n if (source[psz] === ' ') { return }\n // Skip and count leading '1's.\n var zeroes = 0;\n var length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n var size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.\n var b256 = new Uint8Array(size);\n // Process the characters.\n while (source[psz]) {\n // Decode character\n var carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) { return }\n var i = 0;\n for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = (carry % 256) >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n psz++;\n }\n // Skip trailing spaces.\n if (source[psz] === ' ') { return }\n // Skip leading zeroes in b256.\n var it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n var vch = new Uint8Array(zeroes + (size - it4));\n var j = zeroes;\n while (it4 !== size) {\n vch[j++] = b256[it4++];\n }\n return vch\n }\n /**\n * @param {string | string[]} string\n */\n function decode (string) {\n var buffer = decodeUnsafe(string);\n if (buffer) { return buffer }\n throw new Error(`Non-${name} character`)\n }\n return {\n encode: encode,\n decodeUnsafe: decodeUnsafe,\n decode: decode\n }\n}\nvar src = base;\n\nvar _brrp__multiformats_scope_baseX = src;\n\nexport default _brrp__multiformats_scope_baseX;\n","import { coerce } from '../bytes.js'\nimport basex from '../vendor/base-x.js'\nimport type { BaseCodec, BaseDecoder, BaseEncoder, CombobaseDecoder, Multibase, MultibaseCodec, MultibaseDecoder, MultibaseEncoder, UnibaseDecoder } from './interface.js'\n\ninterface EncodeFn { (bytes: Uint8Array): string }\ninterface DecodeFn { (text: string): Uint8Array }\n\n/**\n * Class represents both BaseEncoder and MultibaseEncoder meaning it\n * can be used to encode to multibase or base encode without multibase\n * prefix.\n */\nclass Encoder<Base extends string, Prefix extends string> implements MultibaseEncoder<Prefix>, BaseEncoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n }\n\n encode (bytes: Uint8Array): Multibase<Prefix> {\n if (bytes instanceof Uint8Array) {\n return `${this.prefix}${this.baseEncode(bytes)}`\n } else {\n throw Error('Unknown type, must be binary type')\n }\n }\n}\n\n/**\n * Class represents both BaseDecoder and MultibaseDecoder so it could be used\n * to decode multibases (with matching prefix) or just base decode strings\n * with corresponding base encoding.\n */\nclass Decoder<Base extends string, Prefix extends string> implements MultibaseDecoder<Prefix>, UnibaseDecoder<Prefix>, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseDecode: DecodeFn\n private readonly prefixCodePoint: number\n\n constructor (name: Base, prefix: Prefix, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n const prefixCodePoint = prefix.codePointAt(0)\n /* c8 ignore next 3 */\n if (prefixCodePoint === undefined) {\n throw new Error('Invalid prefix character')\n }\n this.prefixCodePoint = prefixCodePoint\n this.baseDecode = baseDecode\n }\n\n decode (text: string): Uint8Array {\n if (typeof text === 'string') {\n if (text.codePointAt(0) !== this.prefixCodePoint) {\n throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`)\n }\n return this.baseDecode(text.slice(this.prefix.length))\n } else {\n throw Error('Can only multibase decode strings')\n }\n }\n\n or<OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n}\n\ntype Decoders<Prefix extends string> = Record<Prefix, UnibaseDecoder<Prefix>>\n\nclass ComposedDecoder<Prefix extends string> implements MultibaseDecoder<Prefix>, CombobaseDecoder<Prefix> {\n readonly decoders: Decoders<Prefix>\n\n constructor (decoders: Decoders<Prefix>) {\n this.decoders = decoders\n }\n\n or <OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n\n decode (input: string): Uint8Array {\n const prefix = input[0] as Prefix\n const decoder = this.decoders[prefix]\n if (decoder != null) {\n return decoder.decode(input)\n } else {\n throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)\n }\n }\n}\n\nexport function or <L extends string, R extends string> (left: UnibaseDecoder<L> | CombobaseDecoder<L>, right: UnibaseDecoder<R> | CombobaseDecoder<R>): ComposedDecoder<L | R> {\n return new ComposedDecoder({\n ...(left.decoders ?? { [(left as UnibaseDecoder<L>).prefix]: left }),\n ...(right.decoders ?? { [(right as UnibaseDecoder<R>).prefix]: right })\n } as Decoders<L | R>)\n}\n\nexport class Codec<Base extends string, Prefix extends string> implements MultibaseCodec<Prefix>, MultibaseEncoder<Prefix>, MultibaseDecoder<Prefix>, BaseCodec, BaseEncoder, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n readonly baseDecode: DecodeFn\n readonly encoder: Encoder<Base, Prefix>\n readonly decoder: Decoder<Base, Prefix>\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n this.baseDecode = baseDecode\n this.encoder = new Encoder(name, prefix, baseEncode)\n this.decoder = new Decoder(name, prefix, baseDecode)\n }\n\n encode (input: Uint8Array): string {\n return this.encoder.encode(input)\n }\n\n decode (input: string): Uint8Array {\n return this.decoder.decode(input)\n }\n}\n\nexport function from <Base extends string, Prefix extends string> ({ name, prefix, encode, decode }: { name: Base, prefix: Prefix, encode: EncodeFn, decode: DecodeFn }): Codec<Base, Prefix> {\n return new Codec(name, prefix, encode, decode)\n}\n\nexport function baseX <Base extends string, Prefix extends string> ({ name, prefix, alphabet }: { name: Base, prefix: Prefix, alphabet: string }): Codec<Base, Prefix> {\n const { encode, decode } = basex(alphabet, name)\n return from({\n prefix,\n name,\n encode,\n decode: (text: string): Uint8Array => coerce(decode(text))\n })\n}\n\nfunction decode (string: string, alphabetIdx: Record<string, number>, bitsPerChar: number, name: string): Uint8Array {\n // Count the padding bytes:\n let end = string.length\n while (string[end - 1] === '=') {\n --end\n }\n\n // Allocate the output:\n const out = new Uint8Array((end * bitsPerChar / 8) | 0)\n\n // Parse the data:\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n let written = 0 // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = alphabetIdx[string[i]]\n if (value === undefined) {\n throw new SyntaxError(`Non-${name} character`)\n }\n\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value\n bits += bitsPerChar\n\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8\n out[written++] = 0xff & (buffer >> bits)\n }\n }\n\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('Unexpected end of data')\n }\n\n return out\n}\n\nfunction encode (data: Uint8Array, alphabet: string, bitsPerChar: number): string {\n const pad = alphabet[alphabet.length - 1] === '='\n const mask = (1 << bitsPerChar) - 1\n let out = ''\n\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n for (let i = 0; i < data.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | data[i]\n bits += 8\n\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar\n out += alphabet[mask & (buffer >> bits)]\n }\n }\n\n // Partial character:\n if (bits !== 0) {\n out += alphabet[mask & (buffer << (bitsPerChar - bits))]\n }\n\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((out.length * bitsPerChar) & 7) !== 0) {\n out += '='\n }\n }\n\n return out\n}\n\nfunction createAlphabetIdx (alphabet: string): Record<string, number> {\n // Build the character lookup table:\n const alphabetIdx: Record<string, number> = {}\n for (let i = 0; i < alphabet.length; ++i) {\n alphabetIdx[alphabet[i]] = i\n }\n return alphabetIdx\n}\n\n/**\n * RFC4648 Factory\n */\nexport function rfc4648 <Base extends string, Prefix extends string> ({ name, prefix, bitsPerChar, alphabet }: { name: Base, prefix: Prefix, bitsPerChar: number, alphabet: string }): Codec<Base, Prefix> {\n const alphabetIdx = createAlphabetIdx(alphabet)\n return from({\n prefix,\n name,\n encode (input: Uint8Array): string {\n return encode(input, alphabet, bitsPerChar)\n },\n decode (input: string): Uint8Array {\n return decode(input, alphabetIdx, bitsPerChar, name)\n }\n })\n}\n","import { rfc4648 } from './base.js'\n\nexport const base32 = rfc4648({\n prefix: 'b',\n name: 'base32',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567',\n bitsPerChar: 5\n})\n\nexport const base32upper = rfc4648({\n prefix: 'B',\n name: 'base32upper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',\n bitsPerChar: 5\n})\n\nexport const base32pad = rfc4648({\n prefix: 'c',\n name: 'base32pad',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567=',\n bitsPerChar: 5\n})\n\nexport const base32padupper = rfc4648({\n prefix: 'C',\n name: 'base32padupper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',\n bitsPerChar: 5\n})\n\nexport const base32hex = rfc4648({\n prefix: 'v',\n name: 'base32hex',\n alphabet: '0123456789abcdefghijklmnopqrstuv',\n bitsPerChar: 5\n})\n\nexport const base32hexupper = rfc4648({\n prefix: 'V',\n name: 'base32hexupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV',\n bitsPerChar: 5\n})\n\nexport const base32hexpad = rfc4648({\n prefix: 't',\n name: 'base32hexpad',\n alphabet: '0123456789abcdefghijklmnopqrstuv=',\n bitsPerChar: 5\n})\n\nexport const base32hexpadupper = rfc4648({\n prefix: 'T',\n name: 'base32hexpadupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV=',\n bitsPerChar: 5\n})\n\nexport const base32z = rfc4648({\n prefix: 'h',\n name: 'base32z',\n alphabet: 'ybndrfg8ejkmcpqxot1uwisza345h769',\n bitsPerChar: 5\n})\n","import { baseX } from './base.js'\n\nexport const base36 = baseX({\n prefix: 'k',\n name: 'base36',\n alphabet: '0123456789abcdefghijklmnopqrstuvwxyz'\n})\n\nexport const base36upper = baseX({\n prefix: 'K',\n name: 'base36upper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n})\n","/* eslint-disable */\nvar encode_1 = encode;\n\nvar MSB = 0x80\n , REST = 0x7F\n , MSBALL = ~REST\n , INT = Math.pow(2, 31);\n\n/**\n * @param {number} num\n * @param {number[]} out\n * @param {number} offset\n */\nfunction encode(num, out, offset) {\n out = out || [];\n offset = offset || 0;\n var oldOffset = offset;\n\n while(num >= INT) {\n out[offset++] = (num & 0xFF) | MSB;\n num /= 128;\n }\n while(num & MSBALL) {\n out[offset++] = (num & 0xFF) | MSB;\n num >>>= 7;\n }\n out[offset] = num | 0;\n \n // @ts-ignore\n encode.bytes = offset - oldOffset + 1;\n \n return out\n}\n\nvar decode = read;\n\nvar MSB$1 = 0x80\n , REST$1 = 0x7F;\n\n/**\n * @param {string | any[]} buf\n * @param {number} offset\n */\nfunction read(buf, offset) {\n var res = 0\n , offset = offset || 0\n , shift = 0\n , counter = offset\n , b\n , l = buf.length;\n\n do {\n if (counter >= l) {\n // @ts-ignore\n read.bytes = 0;\n throw new RangeError('Could not decode varint')\n }\n b = buf[counter++];\n res += shift < 28\n ? (b & REST$1) << shift\n : (b & REST$1) * Math.pow(2, shift);\n shift += 7;\n } while (b >= MSB$1)\n\n // @ts-ignore\n read.bytes = counter - offset;\n\n return res\n}\n\nvar N1 = Math.pow(2, 7);\nvar N2 = Math.pow(2, 14);\nvar N3 = Math.pow(2, 21);\nvar N4 = Math.pow(2, 28);\nvar N5 = Math.pow(2, 35);\nvar N6 = Math.pow(2, 42);\nvar N7 = Math.pow(2, 49);\nvar N8 = Math.pow(2, 56);\nvar N9 = Math.pow(2, 63);\n\nvar length = function (/** @type {number} */ value) {\n return (\n value < N1 ? 1\n : value < N2 ? 2\n : value < N3 ? 3\n : value < N4 ? 4\n : value < N5 ? 5\n : value < N6 ? 6\n : value < N7 ? 7\n : value < N8 ? 8\n : value < N9 ? 9\n : 10\n )\n};\n\nvar varint = {\n encode: encode_1\n , decode: decode\n , encodingLength: length\n};\n\nvar _brrp_varint = varint;\n\nexport default _brrp_varint;\n","import varint from './vendor/varint.js'\n\nexport function decode (data: Uint8Array, offset = 0): [number, number] {\n const code = varint.decode(data, offset)\n return [code, varint.decode.bytes]\n}\n\nexport function encodeTo (int: number, target: Uint8Array, offset = 0): Uint8Array {\n varint.encode(int, target, offset)\n return target\n}\n\nexport function encodingLength (int: number): number {\n return varint.encodingLength(int)\n}\n","import { coerce, equals as equalBytes } from '../bytes.js'\nimport * as varint from '../varint.js'\nimport type { MultihashDigest } from './interface.js'\n\n/**\n * Creates a multihash digest.\n */\nexport function create <Code extends number> (code: Code, digest: Uint8Array): Digest<Code, number> {\n const size = digest.byteLength\n const sizeOffset = varint.encodingLength(code)\n const digestOffset = sizeOffset + varint.encodingLength(size)\n\n const bytes = new Uint8Array(digestOffset + size)\n varint.encodeTo(code, bytes, 0)\n varint.encodeTo(size, bytes, sizeOffset)\n bytes.set(digest, digestOffset)\n\n return new Digest(code, size, digest, bytes)\n}\n\n/**\n * Turns bytes representation of multihash digest into an instance.\n */\nexport function decode (multihash: Uint8Array): MultihashDigest {\n const bytes = coerce(multihash)\n const [code, sizeOffset] = varint.decode(bytes)\n const [size, digestOffset] = varint.decode(bytes.subarray(sizeOffset))\n const digest = bytes.subarray(sizeOffset + digestOffset)\n\n if (digest.byteLength !== size) {\n throw new Error('Incorrect length')\n }\n\n return new Digest(code, size, digest, bytes)\n}\n\nexport function equals (a: MultihashDigest, b: unknown): b is MultihashDigest {\n if (a === b) {\n return true\n } else {\n const data = b as { code?: unknown, size?: unknown, bytes?: unknown }\n\n return (\n a.code === data.code &&\n a.size === data.size &&\n data.bytes instanceof Uint8Array &&\n equalBytes(a.bytes, data.bytes)\n )\n }\n}\n\n/**\n * Represents a multihash digest which carries information about the\n * hashing algorithm and an actual hash digest.\n */\nexport class Digest<Code extends number, Size extends number> implements MultihashDigest {\n readonly code: Code\n readonly size: Size\n readonly digest: Uint8Array\n readonly bytes: Uint8Array\n\n /**\n * Creates a multihash digest.\n */\n constructor (code: Code, size: Size, digest: Uint8Array, bytes: Uint8Array) {\n this.code = code\n this.size = size\n this.digest = digest\n this.bytes = bytes\n }\n}\n\n/**\n * Used to check that the passed multihash has the passed code\n */\nexport function hasCode <T extends number> (digest: MultihashDigest, code: T): digest is MultihashDigest<T> {\n return digest.code === code\n}\n","import { base32 } from './bases/base32.js'\nimport { base36 } from './bases/base36.js'\nimport { base58btc } from './bases/base58.js'\nimport { coerce } from './bytes.js'\nimport * as Digest from './hashes/digest.js'\nimport * as varint from './varint.js'\nimport type * as API from './link/interface.js'\n\n// This way TS will also expose all the types from module\nexport * from './link/interface.js'\n\nexport function format <T extends API.Link<unknown, number, number, API.Version>, Prefix extends string> (link: T, base?: API.MultibaseEncoder<Prefix>): API.ToString<T, Prefix> {\n const { bytes, version } = link\n switch (version) {\n case 0:\n return toStringV0(\n bytes,\n baseCache(link),\n base as API.MultibaseEncoder<'z'> ?? base58btc.encoder\n )\n default:\n return toStringV1(\n bytes,\n baseCache(link),\n (base ?? base32.encoder) as API.MultibaseEncoder<Prefix>\n )\n }\n}\n\nexport function toJSON <Link extends API.UnknownLink> (link: Link): API.LinkJSON<Link> {\n return {\n '/': format(link)\n }\n}\n\nexport function fromJSON <Link extends API.UnknownLink> (json: API.LinkJSON<Link>): CID<unknown, number, number, API.Version> {\n return CID.parse(json['/'])\n}\n\nconst cache = new WeakMap<API.UnknownLink, Map<string, string>>()\n\nfunction baseCache (cid: API.UnknownLink): Map<string, string> {\n const baseCache = cache.get(cid)\n if (baseCache == null) {\n const baseCache = new Map()\n cache.set(cid, baseCache)\n return baseCache\n }\n return baseCache\n}\n\nexport class CID<Data = unknown, Format extends number = number, Alg extends number = number, Version extends API.Version = API.Version> implements API.Link<Data, Format, Alg, Version> {\n readonly code: Format\n readonly version: Version\n readonly multihash: API.MultihashDigest<Alg>\n readonly bytes: Uint8Array\n readonly '/': Uint8Array\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param multihash - (Multi)hash of the of the content.\n */\n constructor (version: Version, code: Format, multihash: API.MultihashDigest<Alg>, bytes: Uint8Array) {\n this.code = code\n this.version = version\n this.multihash = multihash\n this.bytes = bytes\n\n // flag to serializers that this is a CID and\n // should be treated specially\n this['/'] = bytes\n }\n\n /**\n * Signalling `cid.asCID === cid` has been replaced with `cid['/'] === cid.bytes`\n * please either use `CID.asCID(cid)` or switch to new signalling mechanism\n *\n * @deprecated\n */\n get asCID (): this {\n return this\n }\n\n // ArrayBufferView\n get byteOffset (): number {\n return this.bytes.byteOffset\n }\n\n // ArrayBufferView\n get byteLength (): number {\n return this.bytes.byteLength\n }\n\n toV0 (): CID<Data, API.DAG_PB, API.SHA_256, 0> {\n switch (this.version) {\n case 0: {\n return this as CID<Data, API.DAG_PB, API.SHA_256, 0>\n }\n case 1: {\n const { code, multihash } = this\n\n if (code !== DAG_PB_CODE) {\n throw new Error('Cannot convert a non dag-pb CID to CIDv0')\n }\n\n // sha2-256\n if (multihash.code !== SHA_256_CODE) {\n throw new Error('Cannot convert non sha2-256 multihash CID to CIDv0')\n }\n\n return (\n CID.createV0(\n multihash as API.MultihashDigest<API.SHA_256>\n )\n )\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 0. This is a bug please report`\n )\n }\n }\n }\n\n toV1 (): CID<Data, Format, Alg, 1> {\n switch (this.version) {\n case 0: {\n const { code, digest } = this.multihash\n const multihash = Digest.create(code, digest)\n return (\n CID.createV1(this.code, multihash)\n )\n }\n case 1: {\n return this as CID<Data, Format, Alg, 1>\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 1. This is a bug please report`\n )\n }\n }\n }\n\n equals (other: unknown): other is CID<Data, Format, Alg, Version> {\n return CID.equals(this, other)\n }\n\n static equals <Data, Format extends number, Alg extends number, Version extends API.Version>(self: API.Link<Data, Format, Alg, Version>, other: unknown): other is CID {\n const unknown = other as { code?: unknown, version?: unknown, multihash?: unknown }\n return (\n unknown != null &&\n self.code === unknown.code &&\n self.version === unknown.version &&\n Digest.equals(self.multihash, unknown.multihash)\n )\n }\n\n toString (base?: API.MultibaseEncoder<string>): string {\n return format(this, base)\n }\n\n toJSON (): API.LinkJSON<this> {\n return { '/': format(this) }\n }\n\n link (): this {\n return this\n }\n\n readonly [Symbol.toStringTag] = 'CID';\n\n // Legacy\n\n [Symbol.for('nodejs.util.inspect.custom')] (): string {\n return `CID(${this.toString()})`\n }\n\n /**\n * Takes any input `value` and returns a `CID` instance if it was\n * a `CID` otherwise returns `null`. If `value` is instanceof `CID`\n * it will return value back. If `value` is not instance of this CID\n * class, but is compatible CID it will return new instance of this\n * `CID` class. Otherwise returns null.\n *\n * This allows two different incompatible versions of CID library to\n * co-exist and interop as long as binary interface is compatible.\n */\n static asCID <Data, Format extends number, Alg extends number, Version extends API.Version, U>(input: API.Link<Data, Format, Alg, Version> | U): CID<Data, Format, Alg, Version> | null {\n if (input == null) {\n return null\n }\n\n const value = input as any\n if (value instanceof CID) {\n // If value is instance of CID then we're all set.\n return value\n } else if ((value['/'] != null && value['/'] === value.bytes) || value.asCID === value) {\n // If value isn't instance of this CID class but `this.asCID === this` or\n // `value['/'] === value.bytes` is true it is CID instance coming from a\n // different implementation (diff version or duplicate). In that case we\n // rebase it to this `CID` implementation so caller is guaranteed to get\n // instance with expected API.\n const { version, code, multihash, bytes } = value\n return new CID(\n version,\n code,\n multihash as API.MultihashDigest<Alg>,\n bytes ?? encodeCID(version, code, multihash.bytes)\n )\n } else if (value[cidSymbol] === true) {\n // If value is a CID from older implementation that used to be tagged via\n // symbol we still rebase it to the this `CID` implementation by\n // delegating that to a constructor.\n const { version, multihash, code } = value\n const digest = Digest.decode(multihash) as API.MultihashDigest<Alg>\n return CID.create(version, code, digest)\n } else {\n // Otherwise value is not a CID (or an incompatible version of it) in\n // which case we return `null`.\n return null\n }\n }\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param digest - (Multi)hash of the of the content.\n */\n static create <Data, Format extends number, Alg extends number, Version extends API.Version>(version: Version, code: Format, digest: API.MultihashDigest<Alg>): CID<Data, Format, Alg, Version> {\n if (typeof code !== 'number') {\n throw new Error('String codecs are no longer supported')\n }\n\n if (!(digest.bytes instanceof Uint8Array)) {\n throw new Error('Invalid digest')\n }\n\n switch (version) {\n case 0: {\n if (code !== DAG_PB_CODE) {\n throw new Error(\n `Version 0 CID must use dag-pb (code: ${DAG_PB_CODE}) block encoding`\n )\n } else {\n return new CID(version, code, digest, digest.bytes)\n }\n }\n case 1: {\n const bytes = encodeCID(version, code, digest.bytes)\n return new CID(version, code, digest, bytes)\n }\n default: {\n throw new Error('Invalid version')\n }\n }\n }\n\n /**\n * Simplified version of `create` for CIDv0.\n */\n static createV0 <T = unknown>(digest: API.MultihashDigest<typeof SHA_256_CODE>): CID<T, typeof DAG_PB_CODE, typeof SHA_256_CODE, 0> {\n return CID.create(0, DAG_PB_CODE, digest)\n }\n\n /**\n * Simplified version of `create` for CIDv1.\n *\n * @param code - Content encoding format code.\n * @param digest - Multihash of the content.\n */\n static createV1 <Data, Code extends number, Alg extends number>(code: Code, digest: API.MultihashDigest<Alg>): CID<Data, Code, Alg, 1> {\n return CID.create(1, code, digest)\n }\n\n /**\n * Decoded a CID from its binary representation. The byte array must contain\n * only the CID with no additional bytes.\n *\n * An error will be thrown if the bytes provided do not contain a valid\n * binary representation of a CID.\n */\n static decode <Data, Code extends number, Alg extends number, Version extends API.Version>(bytes: API.ByteView<API.Link<Data, Code, Alg, Version>>): CID<Data, Code, Alg, Version> {\n const [cid, remainder] = CID.decodeFirst(bytes)\n if (remainder.length !== 0) {\n throw new Error('Incorrect length')\n }\n return cid\n }\n\n /**\n * Decoded a CID from its binary representation at the beginning of a byte\n * array.\n *\n * Returns an array with the first element containing the CID and the second\n * element containing the remainder of the original byte array. The remainder\n * will be a zero-length byte array if the provided bytes only contained a\n * binary CID representation.\n */\n static decodeFirst <T, C extends number, A extends number, V extends API.Version>(bytes: API.ByteView<API.Link<T, C, A, V>>): [CID<T, C, A, V>, Uint8Array] {\n const specs = CID.inspectBytes(bytes)\n const prefixSize = specs.size - specs.multihashSize\n const multihashBytes = coerce(\n bytes.subarray(prefixSize, prefixSize + specs.multihashSize)\n )\n if (multihashBytes.byteLength !== specs.multihashSize) {\n throw new Error('Incorrect length')\n }\n const digestBytes = multihashBytes.subarray(\n specs.multihashSize - specs.digestSize\n )\n const digest = new Digest.Digest(\n specs.multihashCode,\n specs.digestSize,\n digestBytes,\n multihashBytes\n )\n const cid =\n specs.version === 0\n ? CID.createV0(digest as API.MultihashDigest<API.SHA_256>)\n : CID.createV1(specs.codec, digest)\n return [cid as CID<T, C, A, V>, bytes.subarray(specs.size)]\n }\n\n /**\n * Inspect the initial bytes of a CID to determine its properties.\n *\n * Involves decoding up to 4 varints. Typically this will require only 4 to 6\n * bytes but for larger multicodec code values and larger multihash digest\n * lengths these varints can be quite large. It is recommended that at least\n * 10 bytes be made available in the `initialBytes` argument for a complete\n * inspection.\n */\n static inspectBytes <T, C extends number, A extends number, V extends API.Version>(initialBytes: API.ByteView<API.Link<T, C, A, V>>): { version: V, codec: C, multihashCode: A, digestSize: number, multihashSize: number, size: number } {\n let offset = 0\n const next = (): number => {\n const [i, length] = varint.decode(initialBytes.subarray(offset))\n offset += length\n return i\n }\n\n let version = next() as V\n let codec = DAG_PB_CODE as C\n if (version as number === 18) {\n // CIDv0\n version = 0 as V\n offset = 0\n } else {\n codec = next() as C\n }\n\n if (version !== 0 && version !== 1) {\n throw new RangeError(`Invalid CID version ${version}`)\n }\n\n const prefixSize = offset\n const multihashCode = next() as A // multihash code\n const digestSize = next() // multihash length\n const size = offset + digestSize\n const multihashSize = size - prefixSize\n\n return { version, codec, multihashCode, digestSize, multihashSize, size }\n }\n\n /**\n * Takes cid in a string representation and creates an instance. If `base`\n * decoder is not provided will use a default from the configuration. It will\n * throw an error if encoding of the CID is not compatible with supplied (or\n * a default decoder).\n */\n static parse <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version>(source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): CID<Data, Code, Alg, Version> {\n const [prefix, bytes] = parseCIDtoBytes(source, base)\n\n const cid = CID.decode(bytes)\n\n if (cid.version === 0 && source[0] !== 'Q') {\n throw Error('Version 0 CID string must not include multibase prefix')\n }\n\n // Cache string representation to avoid computing it on `this.toString()`\n baseCache(cid).set(prefix, source)\n\n return cid\n }\n}\n\nfunction parseCIDtoBytes <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version> (source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): [Prefix, API.ByteView<API.Link<Data, Code, Alg, Version>>] {\n switch (source[0]) {\n // CIDv0 is parsed differently\n case 'Q': {\n const decoder = base ?? base58btc\n return [\n base58btc.prefix as Prefix,\n decoder.decode(`${base58btc.prefix}${source}`)\n ]\n }\n case base58btc.prefix: {\n const decoder = base ?? base58btc\n return [base58btc.prefix as Prefix, decoder.decode(source)]\n }\n case base32.prefix: {\n const decoder = base ?? base32\n return [base32.prefix as Prefix, decoder.decode(source)]\n }\n case base36.prefix: {\n const decoder = base ?? base36\n return [base36.prefix as Prefix, decoder.decode(source)]\n }\n default: {\n if (base == null) {\n throw Error(\n 'To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided'\n )\n }\n return [source[0] as Prefix, base.decode(source)]\n }\n }\n}\n\nfunction toStringV0 (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<'z'>): string {\n const { prefix } = base\n if (prefix !== base58btc.prefix) {\n throw Error(`Cannot string encode V0 in ${base.name} encoding`)\n }\n\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes).slice(1)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nfunction toStringV1 <Prefix extends string> (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<Prefix>): string {\n const { prefix } = base\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nconst DAG_PB_CODE = 0x70\nconst SHA_256_CODE = 0x12\n\nfunction encodeCID (version: API.Version, code: number, multihash: Uint8Array): Uint8Array {\n const codeOffset = varint.encodingLength(version)\n const hashOffset = codeOffset + varint.encodingLength(code)\n const bytes = new Uint8Array(hashOffset + multihash.byteLength)\n varint.encodeTo(version, bytes, 0)\n varint.encodeTo(code, bytes, codeOffset)\n bytes.set(multihash, hashOffset)\n return bytes\n}\n\nconst cidSymbol = Symbol.for('@ipld/js-cid/CID')\n","import { coerce } from '../bytes.js'\nimport * as Digest from './digest.js'\nimport type { DigestOptions } from './hasher.js'\n\nconst code: 0x0 = 0x0\nconst name = 'identity'\n\nconst encode: (input: Uint8Array) => Uint8Array = coerce\n\nfunction digest (input: Uint8Array, options?: DigestOptions): Digest.Digest<typeof code, number> {\n if (options?.truncate != null && options.truncate !== input.byteLength) {\n if (options.truncate < 0 || options.truncate > input.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${input.byteLength}`)\n }\n\n input = input.subarray(0, options.truncate)\n }\n\n return Digest.create(code, encode(input))\n}\n\nexport const identity = { code, name, encode, digest }\n","/**\n * Returns true if the two passed Uint8Arrays have the same content\n */\nexport function equals (a: Uint8Array, b: Uint8Array): boolean {\n if (a === b) {\n return true\n }\n\n if (a.byteLength !== b.byteLength) {\n return false\n }\n\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n\n return true\n}\n","/**\n * Returns a `Uint8Array` of the requested size. Referenced memory will\n * be initialized to 0.\n */\nexport function alloc (size: number = 0): Uint8Array {\n return new Uint8Array(size)\n}\n\n/**\n * Where possible returns a Uint8Array of the requested size that references\n * uninitialized memory. Only use if you are certain you will immediately\n * overwrite every value in the returned `Uint8Array`.\n */\nexport function allocUnsafe (size: number = 0): Uint8Array {\n return new Uint8Array(size)\n}\n","/**\n * To guarantee Uint8Array semantics, convert nodejs Buffers\n * into vanilla Uint8Arrays\n */\nexport function asUint8Array (buf: Uint8Array): Uint8Array {\n return buf\n}\n","import { allocUnsafe } from '#alloc'\nimport { asUint8Array } from '#util/as-uint8array'\n\n/**\n * Returns a new Uint8Array created by concatenating the passed Uint8Arrays\n */\nexport function concat (arrays: Uint8Array[], length?: number): Uint8Array {\n if (length == null) {\n length = arrays.reduce((acc, curr) => acc + curr.length, 0)\n }\n\n const output = allocUnsafe(length)\n let offset = 0\n\n for (const arr of arrays) {\n output.set(arr, offset)\n offset += arr.length\n }\n\n return asUint8Array(output)\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 { baseX } from './base.js'\n\nexport const base10 = baseX({\n prefix: '9',\n name: 'base10',\n alphabet: '0123456789'\n})\n","import { rfc4648 } from './base.js'\n\nexport const base16 = rfc4648({\n prefix: 'f',\n name: 'base16',\n alphabet: '0123456789abcdef',\n bitsPerChar: 4\n})\n\nexport const base16upper = rfc4648({\n prefix: 'F',\n name: 'base16upper',\n alphabet: '0123456789ABCDEF',\n bitsPerChar: 4\n})\n","import { rfc4648 } from './base.js'\n\nexport const base2 = rfc4648({\n prefix: '0',\n name: 'base2',\n alphabet: '01',\n bitsPerChar: 1\n})\n","import { from } from './base.js'\n\nconst alphabet = Array.from('🚀🪐☄🛰🌌🌑🌒🌓🌔🌕🌖🌗🌘🌍🌏🌎🐉☀💻🖥💾💿😂❤😍🤣😊🙏💕😭😘👍😅👏😁🔥🥰💔💖💙😢🤔😆🙄💪😉☺👌🤗💜😔😎😇🌹🤦🎉💞✌✨🤷😱😌🌸🙌😋💗💚😏💛🙂💓🤩😄😀🖤😃💯🙈👇🎶😒🤭❣😜💋👀😪😑💥🙋😞😩😡🤪👊🥳😥🤤👉💃😳✋😚😝😴🌟😬🙃🍀🌷😻😓⭐✅🥺🌈😈🤘💦✔😣🏃💐☹🎊💘😠☝😕🌺🎂🌻😐🖕💝🙊😹🗣💫💀👑🎵🤞😛🔴😤🌼😫⚽🤙☕🏆🤫👈😮🙆🍻🍃🐶💁😲🌿🧡🎁⚡🌞🎈❌✊👋😰🤨😶🤝🚶💰🍓💢🤟🙁🚨💨🤬✈🎀🍺🤓😙💟🌱😖👶🥴▶➡❓💎💸⬇😨🌚🦋😷🕺⚠🙅😟😵👎🤲🤠🤧📌🔵💅🧐🐾🍒😗🤑🌊🤯🐷☎💧😯💆👆🎤🙇🍑❄🌴💣🐸💌📍🥀🤢👅💡💩👐📸👻🤐🤮🎼🥵🚩🍎🍊👼💍📣🥂')\nconst alphabetBytesToChars: string[] = (alphabet.reduce<string[]>((p, c, i) => { p[i] = c; return p }, ([])))\nconst alphabetCharsToBytes: number[] = (alphabet.reduce<number[]>((p, c, i) => {\n const codePoint = c.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${c}`)\n }\n p[codePoint] = i\n return p\n}, ([])))\n\nfunction encode (data: Uint8Array): string {\n return data.reduce((p, c) => {\n p += alphabetBytesToChars[c]\n return p\n }, '')\n}\n\nfunction decode (str: string): Uint8Array {\n const byts = []\n for (const char of str) {\n const codePoint = char.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${char}`)\n }\n const byt = alphabetCharsToBytes[codePoint]\n if (byt == null) {\n throw new Error(`Non-base256emoji character: ${char}`)\n }\n byts.push(byt)\n }\n return new Uint8Array(byts)\n}\n\nexport const base256emoji = from({\n prefix: '🚀',\n name: 'base256emoji',\n encode,\n decode\n})\n","import { rfc4648 } from './base.js'\n\nexport const base64 = rfc4648({\n prefix: 'm',\n name: 'base64',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n bitsPerChar: 6\n})\n\nexport const base64pad = rfc4648({\n prefix: 'M',\n name: 'base64pad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n bitsPerChar: 6\n})\n\nexport const base64url = rfc4648({\n prefix: 'u',\n name: 'base64url',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n bitsPerChar: 6\n})\n\nexport const base64urlpad = rfc4648({\n prefix: 'U',\n name: 'base64urlpad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=',\n bitsPerChar: 6\n})\n","import { rfc4648 } from './base.js'\n\nexport const base8 = rfc4648({\n prefix: '7',\n name: 'base8',\n alphabet: '01234567',\n bitsPerChar: 3\n})\n","import { fromString, toString } from '../bytes.js'\nimport { from } from './base.js'\n\nexport const identity = from({\n prefix: '\\x00',\n name: 'identity',\n encode: (buf) => toString(buf),\n decode: (str) => fromString(str)\n})\n","import type { ArrayBufferView, ByteView } from './interface.js'\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\nexport const name = 'json'\nexport const code = 0x0200\n\nexport function encode <T> (node: T): ByteView<T> {\n return textEncoder.encode(JSON.stringify(node))\n}\n\nexport function decode <T> (data: ByteView<T> | ArrayBufferView<T>): T {\n return JSON.parse(textDecoder.decode(data))\n}\n","/* global crypto */\n\nimport { from } from './hasher.js'\n\nfunction sha (name: AlgorithmIdentifier): (data: Uint8Array) => Promise<Uint8Array> {\n return async data => new Uint8Array(await crypto.subtle.digest(name, data))\n}\n\nexport const sha256 = from({\n name: 'sha2-256',\n code: 0x12,\n encode: sha('SHA-256')\n})\n\nexport const sha512 = from({\n name: 'sha2-512',\n code: 0x13,\n encode: sha('SHA-512')\n})\n","import * as Digest from './digest.js'\nimport type { MultihashHasher } from './interface.js'\n\ntype Await<T> = Promise<T> | T\n\nconst DEFAULT_MIN_DIGEST_LENGTH = 20\n\nexport interface HasherInit <Name extends string, Code extends number> {\n name: Name\n code: Code\n encode(input: Uint8Array): Await<Uint8Array>\n\n /**\n * The minimum length a hash is allowed to be truncated to in bytes\n *\n * @default 20\n */\n minDigestLength?: number\n\n /**\n * The maximum length a hash is allowed to be truncated to in bytes. If not\n * specified it will be inferred from the length of the digest.\n */\n maxDigestLength?: number\n}\n\nexport function from <Name extends string, Code extends number> ({ name, code, encode, minDigestLength, maxDigestLength }: HasherInit<Name, Code>): Hasher<Name, Code> {\n return new Hasher(name, code, encode, minDigestLength, maxDigestLength)\n}\n\nexport interface DigestOptions {\n /**\n * Truncate the returned digest to this number of bytes.\n *\n * This may cause the digest method to throw/reject if the passed value is\n * greater than the digest length or below a threshold under which the risk of\n * hash collisions is significant.\n *\n * The actual value of this threshold can depend on the hashing algorithm in\n * use.\n */\n truncate?: number\n}\n\n/**\n * Hasher represents a hashing algorithm implementation that produces as\n * `MultihashDigest`.\n */\nexport class Hasher<Name extends string, Code extends number> implements MultihashHasher<Code> {\n readonly name: Name\n readonly code: Code\n readonly encode: (input: Uint8Array) => Await<Uint8Array>\n readonly minDigestLength: number\n readonly maxDigestLength?: number\n\n constructor (name: Name, code: Code, encode: (input: Uint8Array) => Await<Uint8Array>, minDigestLength?: number, maxDigestLength?: number) {\n this.name = name\n this.code = code\n this.encode = encode\n this.minDigestLength = minDigestLength ?? DEFAULT_MIN_DIGEST_LENGTH\n this.maxDigestLength = maxDigestLength\n }\n\n digest (input: Uint8Array, options?: DigestOptions): Await<Digest.Digest<Code, number>> {\n if (options?.truncate != null) {\n if (options.truncate < this.minDigestLength) {\n throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`)\n }\n\n if (this.maxDigestLength != null && options.truncate > this.maxDigestLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`)\n }\n }\n\n if (input instanceof Uint8Array) {\n const result = this.encode(input)\n\n if (result instanceof Uint8Array) {\n return createDigest(result, this.code, options?.truncate)\n }\n\n return result.then(digest => createDigest(digest, this.code, options?.truncate))\n } else {\n throw Error('Unknown type, must be binary type')\n /* c8 ignore next 1 */\n }\n }\n}\n\n/**\n * Create a Digest from the passed uint8array and code, optionally truncating it\n * first.\n */\nfunction createDigest <Code extends number> (digest: Uint8Array, code: Code, truncate?: number): Digest.Digest<Code, number> {\n if (truncate != null && truncate !== digest.byteLength) {\n if (truncate > digest.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${digest.byteLength}`)\n }\n\n digest = digest.subarray(0, truncate)\n }\n\n return Digest.create(code, digest)\n}\n","import * as base10 from './bases/base10.js'\nimport * as base16 from './bases/base16.js'\nimport * as base2 from './bases/base2.js'\nimport * as base256emoji from './bases/base256emoji.js'\nimport * as base32 from './bases/base32.js'\nimport * as base36 from './bases/base36.js'\nimport * as base58 from './bases/base58.js'\nimport * as base64 from './bases/base64.js'\nimport * as base8 from './bases/base8.js'\nimport * as identityBase from './bases/identity.js'\nimport * as json from './codecs/json.js'\nimport * as raw from './codecs/raw.js'\nimport * as identity from './hashes/identity.js'\nimport * as sha2 from './hashes/sha2.js'\nimport { CID, hasher, digest, varint, bytes } from './index.js'\n\nexport const bases = { ...identityBase, ...base2, ...base8, ...base10, ...base16, ...base32, ...base36, ...base58, ...base64, ...base256emoji }\nexport const hashes = { ...sha2, ...identity }\nexport const codecs = { raw, json }\n\nexport { CID, hasher, digest, varint, bytes }\n","import { bases } from 'multiformats/basics'\nimport type { MultibaseCodec } from 'multiformats'\nimport { allocUnsafe } from '#alloc'\n\nfunction createCodec (name: string, prefix: string, encode: (buf: Uint8Array) => string, decode: (str: string) => Uint8Array): MultibaseCodec<any> {\n return {\n name,\n prefix,\n encoder: {\n name,\n prefix,\n encode\n },\n decoder: {\n decode\n }\n }\n}\n\nconst string = createCodec('utf8', 'u', (buf) => {\n const decoder = new TextDecoder('utf8')\n return 'u' + decoder.decode(buf)\n}, (str) => {\n const encoder = new TextEncoder()\n return encoder.encode(str.substring(1))\n})\n\nconst ascii = createCodec('ascii', 'a', (buf) => {\n let string = 'a'\n\n for (let i = 0; i < buf.length; i++) {\n string += String.fromCharCode(buf[i])\n }\n return string\n}, (str) => {\n str = str.substring(1)\n const buf = allocUnsafe(str.length)\n\n for (let i = 0; i < str.length; i++) {\n buf[i] = str.charCodeAt(i)\n }\n\n return buf\n})\n\nexport type SupportedEncodings = 'utf8' | 'utf-8' | 'hex' | 'latin1' | 'ascii' | 'binary' | keyof typeof bases\n\nconst BASES: Record<SupportedEncodings, MultibaseCodec<any>> = {\n utf8: string,\n 'utf-8': string,\n hex: bases.base16,\n latin1: ascii,\n ascii,\n binary: ascii,\n\n ...bases\n}\n\nexport default BASES\n","import bases, { type SupportedEncodings } from './util/bases.js'\n\nexport type { SupportedEncodings }\n\n/**\n * Create a `Uint8Array` from the passed string\n *\n * Supports `utf8`, `utf-8`, `hex`, and any encoding supported by the multiformats module.\n *\n * Also `ascii` which is similar to node's 'binary' encoding.\n */\nexport function fromString (string: string, encoding: SupportedEncodings = 'utf8'): Uint8Array {\n const base = bases[encoding]\n\n if (base == null) {\n throw new Error(`Unsupported encoding \"${encoding}\"`)\n }\n\n // add multibase prefix\n return base.decoder.decode(`${base.prefix}${string}`) // eslint-disable-line @typescript-eslint/restrict-template-expressions\n}\n","import bases, { type SupportedEncodings } from './util/bases.js'\n\nexport type { SupportedEncodings }\n\n/**\n * Turns a `Uint8Array` into a string.\n *\n * Supports `utf8`, `utf-8` and any encoding supported by the multibase module.\n *\n * Also `ascii` which is similar to node's 'binary' encoding.\n */\nexport function toString (array: Uint8Array, encoding: SupportedEncodings = 'utf8'): string {\n const base = bases[encoding]\n\n if (base == null) {\n throw new Error(`Unsupported encoding \"${encoding}\"`)\n }\n\n // strip multibase prefix\n return base.encoder.encode(array).substring(1)\n}\n","import { Uint8ArrayList } from 'uint8arraylist'\n\ninterface Context {\n offset: number\n}\n\nconst TAG_MASK = parseInt('11111', 2)\nconst LONG_LENGTH_MASK = parseInt('10000000', 2)\nconst LONG_LENGTH_BYTES_MASK = parseInt('01111111', 2)\n\ninterface Decoder {\n (buf: Uint8Array, context: Context): any\n}\n\nconst decoders: Record<number, Decoder> = {\n 0x0: readSequence,\n 0x1: readSequence,\n 0x2: readInteger,\n 0x3: readBitString,\n 0x4: readOctetString,\n 0x5: readNull,\n 0x6: readObjectIdentifier,\n 0x10: readSequence,\n 0x16: readSequence,\n 0x30: readSequence\n}\n\nexport function decodeDer (buf: Uint8Array, context: Context = { offset: 0 }): any {\n const tag = buf[context.offset] & TAG_MASK\n context.offset++\n\n if (decoders[tag] != null) {\n return decoders[tag](buf, context)\n }\n\n throw new Error('No decoder for tag ' + tag)\n}\n\nfunction readLength (buf: Uint8Array, context: Context): number {\n let length = 0\n\n if ((buf[context.offset] & LONG_LENGTH_MASK) === LONG_LENGTH_MASK) {\n // long length\n const count = buf[context.offset] & LONG_LENGTH_BYTES_MASK\n let str = '0x'\n context.offset++\n\n for (let i = 0; i < count; i++, context.offset++) {\n str += buf[context.offset].toString(16).padStart(2, '0')\n }\n\n length = parseInt(str, 16)\n } else {\n length = buf[context.offset]\n context.offset++\n }\n\n return length\n}\n\nfunction readSequence (buf: Uint8Array, context: Context): any[] {\n readLength(buf, context)\n const entries: any[] = []\n\n while (true) {\n if (context.offset >= buf.byteLength) {\n break\n }\n\n const result = decodeDer(buf, context)\n\n if (result === null) {\n break\n }\n\n entries.push(result)\n }\n\n return entries\n}\n\nfunction readInteger (buf: Uint8Array, context: Context): Uint8Array {\n const length = readLength(buf, context)\n const start = context.offset\n const end = context.offset + length\n\n const vals: number[] = []\n\n for (let i = start; i < end; i++) {\n if (i === start && buf[i] === 0) {\n continue\n }\n\n vals.push(buf[i])\n }\n\n context.offset += length\n\n return Uint8Array.from(vals)\n}\n\nfunction readObjectIdentifier (buf: Uint8Array, context: Context): string {\n const count = readLength(buf, context)\n const finalOffset = context.offset + count\n\n const byte = buf[context.offset]\n context.offset++\n\n let val1 = 0\n let val2 = 0\n\n if (byte < 40) {\n val1 = 0\n val2 = byte\n } else if (byte < 80) {\n val1 = 1\n val2 = byte - 40\n } else {\n val1 = 2\n val2 = byte - 80\n }\n\n let oid = `${val1}.${val2}`\n let num: number[] = []\n\n while (context.offset < finalOffset) {\n const byte = buf[context.offset]\n context.offset++\n\n // remove msb\n num.push(byte & 0b01111111)\n\n if (byte < 128) {\n num.reverse()\n\n // reached the end of the encoding\n let val = 0\n\n for (let i = 0; i < num.length; i++) {\n val += num[i] << (i * 7)\n }\n\n oid += `.${val}`\n num = []\n }\n }\n\n return oid\n}\n\nfunction readNull (buf: Uint8Array, context: Context): null {\n context.offset++\n\n return null\n}\n\nfunction readBitString (buf: Uint8Array, context: Context): any {\n const length = readLength(buf, context)\n const unusedBits = buf[context.offset]\n context.offset++\n const bytes = buf.subarray(context.offset, context.offset + length - 1)\n context.offset += length\n\n if (unusedBits !== 0) {\n // need to shift all bytes along by this many bits\n throw new Error('Unused bits in bit string is unimplemented')\n }\n\n return bytes\n}\n\nfunction readOctetString (buf: Uint8Array, context: Context): any {\n const length = readLength(buf, context)\n const bytes = buf.subarray(context.offset, context.offset + length)\n context.offset += length\n\n return bytes\n}\n\nfunction encodeNumber (value: number): Uint8ArrayList {\n let number = value.toString(16)\n\n if (number.length % 2 === 1) {\n number = '0' + number\n }\n\n const array = new Uint8ArrayList()\n\n for (let i = 0; i < number.length; i += 2) {\n array.append(Uint8Array.from([parseInt(`${number[i]}${number[i + 1]}`, 16)]))\n }\n\n return array\n}\n\nfunction encodeLength (bytes: { byteLength: number }): Uint8Array | Uint8ArrayList {\n if (bytes.byteLength < 128) {\n return Uint8Array.from([bytes.byteLength])\n }\n\n // long length\n const length = encodeNumber(bytes.byteLength)\n\n return new Uint8ArrayList(\n Uint8Array.from([\n length.byteLength | LONG_LENGTH_MASK\n ]),\n length\n )\n}\n\nexport function encodeInteger (value: Uint8Array | Uint8ArrayList): Uint8ArrayList {\n const contents = new Uint8ArrayList()\n\n const mask = 0b10000000\n const positive = (value.subarray()[0] & mask) === mask\n\n if (positive) {\n contents.append(Uint8Array.from([0]))\n }\n\n contents.append(value)\n\n return new Uint8ArrayList(\n Uint8Array.from([0x02]),\n encodeLength(contents),\n contents\n )\n}\n\nexport function encodeBitString (value: Uint8Array | Uint8ArrayList): Uint8ArrayList {\n // unused bits is always 0 with full-byte-only values\n const unusedBits = Uint8Array.from([0])\n\n const contents = new Uint8ArrayList(\n unusedBits,\n value\n )\n\n return new Uint8ArrayList(\n Uint8Array.from([0x03]),\n encodeLength(contents),\n contents\n )\n}\n\nexport function encodeOctetString (value: Uint8Array | Uint8ArrayList): Uint8ArrayList {\n return new Uint8ArrayList(\n Uint8Array.from([0x04]),\n encodeLength(value),\n value\n )\n}\n\nexport function encodeSequence (values: Array<Uint8Array | Uint8ArrayList>, tag = 0x30): Uint8ArrayList {\n const output = new Uint8ArrayList()\n\n for (const buf of values) {\n output.append(\n buf\n )\n }\n\n return new Uint8ArrayList(\n Uint8Array.from([tag]),\n encodeLength(output),\n output\n )\n}\n","import type { JWKKeyPair } from '../interface.js'\nimport type { AbortOptions } from '@libp2p/interface'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nexport type Curve = 'P-256' | 'P-384' | 'P-521'\n\nexport const ECDSA_P_256_OID = '1.2.840.10045.3.1.7'\nexport const ECDSA_P_384_OID = '1.3.132.0.34'\nexport const ECDSA_P_521_OID = '1.3.132.0.35'\n\nexport async function generateECDSAKey (curve: Curve = 'P-256'): Promise<JWKKeyPair> {\n const keyPair = await crypto.subtle.generateKey({\n name: 'ECDSA',\n namedCurve: curve\n }, true, ['sign', 'verify'])\n\n return {\n publicKey: await crypto.subtle.exportKey('jwk', keyPair.publicKey),\n privateKey: await crypto.subtle.exportKey('jwk', keyPair.privateKey)\n }\n}\n\nexport async function hashAndSign (key: JsonWebKey, msg: Uint8Array | Uint8ArrayList, options?: AbortOptions): Promise<Uint8Array> {\n const privateKey = await crypto.subtle.importKey('jwk', key, {\n name: 'ECDSA',\n namedCurve: key.crv ?? 'P-256'\n }, false, ['sign'])\n options?.signal?.throwIfAborted()\n\n const signature = await crypto.subtle.sign({\n name: 'ECDSA',\n hash: {\n name: 'SHA-256'\n }\n }, privateKey, msg.subarray())\n options?.signal?.throwIfAborted()\n\n return new Uint8Array(signature, 0, signature.byteLength)\n}\n\nexport async function hashAndVerify (key: JsonWebKey, sig: Uint8Array, msg: Uint8Array | Uint8ArrayList, options?: AbortOptions): Promise<boolean> {\n const publicKey = await crypto.subtle.importKey('jwk', key, {\n name: 'ECDSA',\n namedCurve: key.crv ?? 'P-256'\n }, false, ['verify'])\n options?.signal?.throwIfAborted()\n\n const result = await crypto.subtle.verify({\n name: 'ECDSA',\n hash: {\n name: 'SHA-256'\n }\n }, publicKey, sig, msg.subarray())\n options?.signal?.throwIfAborted()\n\n return result\n}\n","import { InvalidParametersError } from '@libp2p/interface'\nimport { Uint8ArrayList } from 'uint8arraylist'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport { decodeDer, encodeBitString, encodeInteger, encodeOctetString, encodeSequence } from '../rsa/der.js'\nimport { ECDSAPrivateKey as ECDSAPrivateKeyClass, ECDSAPublicKey as ECDSAPublicKeyClass } from './ecdsa.js'\nimport { generateECDSAKey } from './index.js'\nimport type { Curve } from '../ecdh/index.js'\nimport type { ECDSAPublicKey, ECDSAPrivateKey } from '@libp2p/interface'\n\n// 1.2.840.10045.3.1.7 prime256v1 (ANSI X9.62 named elliptic curve)\nconst OID_256 = Uint8Array.from([0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07])\n// 1.3.132.0.34 secp384r1 (SECG (Certicom) named elliptic curve)\nconst OID_384 = Uint8Array.from([0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22])\n// 1.3.132.0.35 secp521r1 (SECG (Certicom) named elliptic curve)\nconst OID_521 = Uint8Array.from([0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x23])\n\nconst P_256_KEY_JWK = {\n ext: true,\n kty: 'EC',\n crv: 'P-256'\n}\n\nconst P_384_KEY_JWK = {\n ext: true,\n kty: 'EC',\n crv: 'P-384'\n}\n\nconst P_521_KEY_JWK = {\n ext: true,\n kty: 'EC',\n crv: 'P-521'\n}\n\nconst P_256_KEY_LENGTH = 32\nconst P_384_KEY_LENGTH = 48\nconst P_521_KEY_LENGTH = 66\n\nexport function unmarshalECDSAPrivateKey (bytes: Uint8Array): ECDSAPrivateKey {\n const message = decodeDer(bytes)\n\n return pkiMessageToECDSAPrivateKey(message)\n}\n\nexport function pkiMessageToECDSAPrivateKey (message: any): ECDSAPrivateKey {\n const privateKey = message[1]\n const d = uint8ArrayToString(privateKey, 'base64url')\n const coordinates: Uint8Array = message[2][1][0]\n const offset = 1\n let x: string\n let y: string\n\n if (privateKey.byteLength === P_256_KEY_LENGTH) {\n x = uint8ArrayToString(coordinates.subarray(offset, offset + P_256_KEY_LENGTH), 'base64url')\n y = uint8ArrayToString(coordinates.subarray(offset + P_256_KEY_LENGTH), 'base64url')\n\n return new ECDSAPrivateKeyClass({\n ...P_256_KEY_JWK,\n key_ops: ['sign'],\n d,\n x,\n y\n })\n }\n\n if (privateKey.byteLength === P_384_KEY_LENGTH) {\n x = uint8ArrayToString(coordinates.subarray(offset, offset + P_384_KEY_LENGTH), 'base64url')\n y = uint8ArrayToString(coordinates.subarray(offset + P_384_KEY_LENGTH), 'base64url')\n\n return new ECDSAPrivateKeyClass({\n ...P_384_KEY_JWK,\n key_ops: ['sign'],\n d,\n x,\n y\n })\n }\n\n if (privateKey.byteLength === P_521_KEY_LENGTH) {\n x = uint8ArrayToString(coordinates.subarray(offset, offset + P_521_KEY_LENGTH), 'base64url')\n y = uint8ArrayToString(coordinates.subarray(offset + P_521_KEY_LENGTH), 'base64url')\n\n return new ECDSAPrivateKeyClass({\n ...P_521_KEY_JWK,\n key_ops: ['sign'],\n d,\n x,\n y\n })\n }\n\n throw new InvalidParametersError(`Private key length was wrong length, got ${privateKey.byteLength}, expected 32, 48 or 66`)\n}\n\nexport function unmarshalECDSAPublicKey (bytes: Uint8Array): ECDSAPublicKey {\n const message = decodeDer(bytes)\n\n return pkiMessageToECDSAPublicKey(message)\n}\n\nexport function pkiMessageToECDSAPublicKey (message: any): ECDSAPublicKey {\n const coordinates = message[1][1][0]\n const offset = 1\n let x: string\n let y: string\n\n if (coordinates.byteLength === ((P_256_KEY_LENGTH * 2) + 1)) {\n x = uint8ArrayToString(coordinates.subarray(offset, offset + P_256_KEY_LENGTH), 'base64url')\n y = uint8ArrayToString(coordinates.subarray(offset + P_256_KEY_LENGTH), 'base64url')\n\n return new ECDSAPublicKeyClass({\n ...P_256_KEY_JWK,\n key_ops: ['verify'],\n x,\n y\n })\n }\n\n if (coordinates.byteLength === ((P_384_KEY_LENGTH * 2) + 1)) {\n x = uint8ArrayToString(coordinates.subarray(offset, offset + P_384_KEY_LENGTH), 'base64url')\n y = uint8ArrayToString(coordinates.subarray(offset + P_384_KEY_LENGTH), 'base64url')\n\n return new ECDSAPublicKeyClass({\n ...P_384_KEY_JWK,\n key_ops: ['verify'],\n x,\n y\n })\n }\n\n if (coordinates.byteLength === ((P_521_KEY_LENGTH * 2) + 1)) {\n x = uint8ArrayToString(coordinates.subarray(offset, offset + P_521_KEY_LENGTH), 'base64url')\n y = uint8ArrayToString(coordinates.subarray(offset + P_521_KEY_LENGTH), 'base64url')\n\n return new ECDSAPublicKeyClass({\n ...P_521_KEY_JWK,\n key_ops: ['verify'],\n x,\n y\n })\n }\n\n throw new InvalidParametersError(`coordinates were wrong length, got ${coordinates.byteLength}, expected 65, 97 or 133`)\n}\n\nexport function privateKeyToPKIMessage (privateKey: JsonWebKey): Uint8Array {\n return encodeSequence([\n encodeInteger(Uint8Array.from([1])), // header\n encodeOctetString(uint8ArrayFromString(privateKey.d ?? '', 'base64url')), // body\n encodeSequence([ // PKIProtection\n getOID(privateKey.crv)\n ], 0xA0),\n encodeSequence([ // extraCerts\n encodeBitString(\n new Uint8ArrayList(\n Uint8Array.from([0x04]),\n uint8ArrayFromString(privateKey.x ?? '', 'base64url'),\n uint8ArrayFromString(privateKey.y ?? '', 'base64url')\n )\n )\n ], 0xA1)\n ]).subarray()\n}\n\nexport function publicKeyToPKIMessage (publicKey: JsonWebKey): Uint8Array {\n return encodeSequence([\n encodeInteger(Uint8Array.from([1])), // header\n encodeSequence([ // PKIProtection\n getOID(publicKey.crv)\n ], 0xA0),\n encodeSequence([ // extraCerts\n encodeBitString(\n new Uint8ArrayList(\n Uint8Array.from([0x04]),\n uint8ArrayFromString(publicKey.x ?? '', 'base64url'),\n uint8ArrayFromString(publicKey.y ?? '', 'base64url')\n )\n )\n ], 0xA1)\n ]).subarray()\n}\n\nfunction getOID (curve?: string): Uint8Array {\n if (curve === 'P-256') {\n return OID_256\n }\n\n if (curve === 'P-384') {\n return OID_384\n }\n\n if (curve === 'P-521') {\n return OID_521\n }\n\n throw new InvalidParametersError(`Invalid curve ${curve}`)\n}\n\nexport async function generateECDSAKeyPair (curve: Curve = 'P-256'): Promise<ECDSAPrivateKey> {\n const key = await generateECDSAKey(curve)\n\n return new ECDSAPrivateKeyClass(key.privateKey)\n}\n\nexport function ensureECDSAKey (key: Uint8Array, length: number): Uint8Array {\n key = Uint8Array.from(key ?? [])\n if (key.length !== length) {\n throw new InvalidParametersError(`Key must be a Uint8Array of length ${length}, got ${key.length}`)\n }\n return key\n}\n","import { base58btc } from 'multiformats/bases/base58'\nimport { CID } from 'multiformats/cid'\nimport { identity } from 'multiformats/hashes/identity'\nimport { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport { publicKeyToProtobuf } from '../index.js'\nimport { privateKeyToPKIMessage, publicKeyToPKIMessage } from './utils.js'\nimport { hashAndVerify, hashAndSign } from './index.js'\nimport type { ECDSAPublicKey as ECDSAPublicKeyInterface, ECDSAPrivateKey as ECDSAPrivateKeyInterface, AbortOptions } from '@libp2p/interface'\nimport type { Digest } from 'multiformats/hashes/digest'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nexport class ECDSAPublicKey implements ECDSAPublicKeyInterface {\n public readonly type = 'ECDSA'\n public readonly jwk: JsonWebKey\n private _raw?: Uint8Array\n\n constructor (jwk: JsonWebKey) {\n this.jwk = jwk\n }\n\n get raw (): Uint8Array {\n if (this._raw == null) {\n this._raw = publicKeyToPKIMessage(this.jwk)\n }\n\n return this._raw\n }\n\n toMultihash (): Digest<0x0, number> {\n return identity.digest(publicKeyToProtobuf(this))\n }\n\n toCID (): CID<unknown, 114, 0x0, 1> {\n return CID.createV1(114, this.toMultihash())\n }\n\n toString (): string {\n return base58btc.encode(this.toMultihash().bytes).substring(1)\n }\n\n equals (key?: any): boolean {\n if (key == null || !(key.raw instanceof Uint8Array)) {\n return false\n }\n\n return uint8ArrayEquals(this.raw, key.raw)\n }\n\n async verify (data: Uint8Array | Uint8ArrayList, sig: Uint8Array, options?: AbortOptions): Promise<boolean> {\n return hashAndVerify(this.jwk, sig, data, options)\n }\n}\n\nexport class ECDSAPrivateKey implements ECDSAPrivateKeyInterface {\n public readonly type = 'ECDSA'\n public readonly jwk: JsonWebKey\n public readonly publicKey: ECDSAPublicKey\n private _raw?: Uint8Array\n\n constructor (jwk: JsonWebKey) {\n this.jwk = jwk\n this.publicKey = new ECDSAPublicKey({\n crv: jwk.crv,\n ext: jwk.ext,\n key_ops: ['verify'],\n kty: 'EC',\n x: jwk.x,\n y: jwk.y\n })\n }\n\n get raw (): Uint8Array {\n if (this._raw == null) {\n this._raw = privateKeyToPKIMessage(this.jwk)\n }\n\n return this._raw\n }\n\n equals (key?: any): boolean {\n if (key == null || !(key.raw instanceof Uint8Array)) {\n return false\n }\n\n return uint8ArrayEquals(this.raw, key.raw)\n }\n\n async sign (message: Uint8Array | Uint8ArrayList, options?: AbortOptions): Promise<Uint8Array> {\n return hashAndSign(this.jwk, message, options)\n }\n}\n","import { ed25519 as ed } from '@noble/curves/ed25519.js'\nimport { toString as uint8arrayToString } from 'uint8arrays/to-string'\nimport crypto from '../../webcrypto/index.js'\nimport type { Uint8ArrayKeyPair } from '../interface.js'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nconst PUBLIC_KEY_BYTE_LENGTH = 32\nconst PRIVATE_KEY_BYTE_LENGTH = 64 // private key is actually 32 bytes but for historical reasons we concat private and public keys\nconst KEYS_BYTE_LENGTH = 32\n\nexport { PUBLIC_KEY_BYTE_LENGTH as publicKeyLength }\nexport { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength }\n\n// memoize support result to skip additional awaits every time we use an ed key\nlet ed25519Supported: boolean | undefined\nconst webCryptoEd25519SupportedPromise = (async () => {\n try {\n await crypto.get().subtle.generateKey({ name: 'Ed25519' }, true, ['sign', 'verify'])\n return true\n } catch {\n return false\n }\n})()\n\nexport function generateKey (): Uint8ArrayKeyPair {\n // the actual private key (32 bytes)\n const privateKeyRaw = ed.utils.randomSecretKey()\n const publicKey = ed.getPublicKey(privateKeyRaw)\n\n // concatenated the public key to the private key\n const privateKey = concatKeys(privateKeyRaw, publicKey)\n\n return {\n privateKey,\n publicKey\n }\n}\n\nexport function generateKeyFromSeed (seed: Uint8Array): Uint8ArrayKeyPair {\n if (seed.length !== KEYS_BYTE_LENGTH) {\n throw new TypeError('\"seed\" must be 32 bytes in length.')\n } else if (!(seed instanceof Uint8Array)) {\n throw new TypeError('\"seed\" must be a node.js Buffer, or Uint8Array.')\n }\n\n // based on node forges algorithm, the seed is used directly as private key\n const privateKeyRaw = seed\n const publicKey = ed.getPublicKey(privateKeyRaw)\n\n const privateKey = concatKeys(privateKeyRaw, publicKey)\n\n return {\n privateKey,\n publicKey\n }\n}\n\nasync function hashAndSignWebCrypto (privateKey: Uint8Array, msg: Uint8Array | Uint8ArrayList): Promise<Uint8Array> {\n let privateKeyRaw: Uint8Array\n if (privateKey.length === PRIVATE_KEY_BYTE_LENGTH) {\n privateKeyRaw = privateKey.subarray(0, 32)\n } else {\n privateKeyRaw = privateKey\n }\n\n const jwk: JsonWebKey = {\n crv: 'Ed25519',\n kty: 'OKP',\n x: uint8arrayToString(privateKey.subarray(32), 'base64url'),\n d: uint8arrayToString(privateKeyRaw, 'base64url'),\n ext: true,\n key_ops: ['sign']\n }\n\n const key = await crypto.get().subtle.importKey('jwk', jwk, { name: 'Ed25519' }, true, ['sign'])\n const sig = await crypto.get().subtle.sign({ name: 'Ed25519' }, key, msg instanceof Uint8Array ? msg : msg.subarray())\n\n return new Uint8Array(sig, 0, sig.byteLength)\n}\n\nexport function hashAndSignNoble (privateKey: Uint8Array, msg: Uint8Array | Uint8ArrayList): Uint8Array {\n const privateKeyRaw = privateKey.subarray(0, KEYS_BYTE_LENGTH)\n\n return ed.sign(msg instanceof Uint8Array ? msg : msg.subarray(), privateKeyRaw)\n}\n\nexport async function hashAndSign (privateKey: Uint8Array, msg: Uint8Array | Uint8ArrayList): Promise<Uint8Array> {\n if (ed25519Supported == null) {\n ed25519Supported = await webCryptoEd25519SupportedPromise\n }\n\n if (ed25519Supported) {\n return hashAndSignWebCrypto(privateKey, msg)\n }\n\n return hashAndSignNoble(privateKey, msg)\n}\n\nasync function hashAndVerifyWebCrypto (publicKey: Uint8Array, sig: Uint8Array, msg: Uint8Array | Uint8ArrayList): Promise<boolean> {\n if (publicKey.buffer instanceof ArrayBuffer) {\n const key = await crypto.get().subtle.importKey('raw', publicKey.buffer, { name: 'Ed25519' }, false, ['verify'])\n const isValid = await crypto.get().subtle.verify({ name: 'Ed25519' }, key, sig, msg instanceof Uint8Array ? msg : msg.subarray())\n return isValid\n }\n\n throw new TypeError('WebCrypto does not support SharedArrayBuffer for Ed25519 keys')\n}\n\nexport function hashAndVerifyNoble (publicKey: Uint8Array, sig: Uint8Array, msg: Uint8Array | Uint8ArrayList): boolean {\n return ed.verify(sig, msg instanceof Uint8Array ? msg : msg.subarray(), publicKey)\n}\n\nexport async function hashAndVerify (publicKey: Uint8Array, sig: Uint8Array, msg: Uint8Array | Uint8ArrayList): Promise<boolean> {\n if (ed25519Supported == null) {\n ed25519Supported = await webCryptoEd25519SupportedPromise\n }\n\n if (ed25519Supported) {\n return hashAndVerifyWebCrypto(publicKey, sig, msg)\n }\n\n return hashAndVerifyNoble(publicKey, sig, msg)\n}\n\nfunction concatKeys (privateKeyRaw: Uint8Array, publicKey: Uint8Array): Uint8Array {\n const privateKey = new Uint8Array(PRIVATE_KEY_BYTE_LENGTH)\n for (let i = 0; i < KEYS_BYTE_LENGTH; i++) {\n privateKey[i] = privateKeyRaw[i]\n privateKey[KEYS_BYTE_LENGTH + i] = publicKey[i]\n }\n return privateKey\n}\n","/**\n * Signing a message failed\n */\nexport class SigningError extends Error {\n constructor (message = 'An error occurred while signing a message') {\n super(message)\n this.name = 'SigningError'\n }\n}\n\n/**\n * Verifying a message signature failed\n */\nexport class VerificationError extends Error {\n constructor (message = 'An error occurred while verifying a message') {\n super(message)\n this.name = 'VerificationError'\n }\n}\n\n/**\n * WebCrypto was not available in the current context\n */\nexport class WebCryptoMissingError extends Error {\n constructor (message = 'Missing Web Crypto API') {\n super(message)\n this.name = 'WebCryptoMissingError'\n }\n}\n","/* eslint-env browser */\n\nimport { WebCryptoMissingError } from '../errors.js'\n\n// Check native crypto exists and is enabled (In insecure context `self.crypto`\n// exists but `self.crypto.subtle` does not).\nexport default {\n get (win = globalThis) {\n const nativeCrypto = win.crypto\n\n if (nativeCrypto?.subtle == null) {\n throw new WebCryptoMissingError(\n 'Missing Web Crypto API. ' +\n 'The most likely cause of this error is that this page is being accessed ' +\n 'from an insecure context (i.e. not HTTPS). For more information and ' +\n 'possible resolutions see ' +\n 'https://github.com/libp2p/js-libp2p/blob/main/packages/crypto/README.md#web-crypto-api'\n )\n }\n\n return nativeCrypto\n }\n}\n","import webcrypto from './webcrypto.js'\n\nexport default webcrypto\n","import { concat as uint8ArrayConcat } from 'uint8arrays/concat'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\n\nexport function base64urlToBuffer (str: string, len?: number): Uint8Array {\n let buf = uint8ArrayFromString(str, 'base64urlpad')\n\n if (len != null) {\n if (buf.length > len) {\n throw new Error('byte array longer than desired length')\n }\n\n buf = uint8ArrayConcat([new Uint8Array(len - buf.length), buf])\n }\n\n return buf\n}\n\nexport function isPromise <T = unknown> (thing: any): thing is Promise<T> {\n if (thing == null) {\n return false\n }\n\n return typeof thing.then === 'function' &&\n typeof thing.catch === 'function' &&\n typeof thing.finally === 'function'\n}\n","import { base58btc } from 'multiformats/bases/base58'\nimport { CID } from 'multiformats/cid'\nimport { identity } from 'multiformats/hashes/identity'\nimport { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport { isPromise } from '../../util.ts'\nimport { publicKeyToProtobuf } from '../index.js'\nimport { ensureEd25519Key } from './utils.js'\nimport * as crypto from './index.js'\nimport type { Ed25519PublicKey as Ed25519PublicKeyInterface, Ed25519PrivateKey as Ed25519PrivateKeyInterface, AbortOptions } from '@libp2p/interface'\nimport type { Digest } from 'multiformats/hashes/digest'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nexport class Ed25519PublicKey implements Ed25519PublicKeyInterface {\n public readonly type = 'Ed25519'\n public readonly raw: Uint8Array\n\n constructor (key: Uint8Array) {\n this.raw = ensureEd25519Key(key, crypto.publicKeyLength)\n }\n\n toMultihash (): Digest<0x0, number> {\n return identity.digest(publicKeyToProtobuf(this))\n }\n\n toCID (): CID<unknown, 114, 0x0, 1> {\n return CID.createV1(114, this.toMultihash())\n }\n\n toString (): string {\n return base58btc.encode(this.toMultihash().bytes).substring(1)\n }\n\n equals (key?: any): boolean {\n if (key == null || !(key.raw instanceof Uint8Array)) {\n return false\n }\n\n return uint8ArrayEquals(this.raw, key.raw)\n }\n\n verify (data: Uint8Array | Uint8ArrayList, sig: Uint8Array, options?: AbortOptions): boolean | Promise<boolean> {\n options?.signal?.throwIfAborted()\n const result = crypto.hashAndVerify(this.raw, sig, data)\n\n if (isPromise<boolean>(result)) {\n return result.then(res => {\n options?.signal?.throwIfAborted()\n return res\n })\n }\n\n return result\n }\n}\n\nexport class Ed25519PrivateKey implements Ed25519PrivateKeyInterface {\n public readonly type = 'Ed25519'\n public readonly raw: Uint8Array\n public readonly publicKey: Ed25519PublicKey\n\n // key - 64 byte Uint8Array containing private key\n // publicKey - 32 byte Uint8Array containing public key\n constructor (key: Uint8Array, publicKey: Uint8Array) {\n this.raw = ensureEd25519Key(key, crypto.privateKeyLength)\n this.publicKey = new Ed25519PublicKey(publicKey)\n }\n\n equals (key?: any): boolean {\n if (key == null || !(key.raw instanceof Uint8Array)) {\n return false\n }\n\n return uint8ArrayEquals(this.raw, key.raw)\n }\n\n sign (message: Uint8Array | Uint8ArrayList, options?: AbortOptions): Uint8Array | Promise<Uint8Array> {\n options?.signal?.throwIfAborted()\n const sig = crypto.hashAndSign(this.raw, message)\n\n if (isPromise<Uint8Array>(sig)) {\n return sig.then(res => {\n options?.signal?.throwIfAborted()\n return res\n })\n }\n\n options?.signal?.throwIfAborted()\n return sig\n }\n}\n","import { InvalidParametersError } from '@libp2p/interface'\nimport { Ed25519PublicKey as Ed25519PublicKeyClass, Ed25519PrivateKey as Ed25519PrivateKeyClass } from './ed25519.js'\nimport * as crypto from './index.js'\nimport type { Ed25519PublicKey, Ed25519PrivateKey } from '@libp2p/interface'\n\nexport function unmarshalEd25519PrivateKey (bytes: Uint8Array): Ed25519PrivateKey {\n // Try the old, redundant public key version\n if (bytes.length > crypto.privateKeyLength) {\n bytes = ensureEd25519Key(bytes, crypto.privateKeyLength + crypto.publicKeyLength)\n const privateKeyBytes = bytes.subarray(0, crypto.privateKeyLength)\n const publicKeyBytes = bytes.subarray(crypto.privateKeyLength, bytes.length)\n return new Ed25519PrivateKeyClass(privateKeyBytes, publicKeyBytes)\n }\n\n bytes = ensureEd25519Key(bytes, crypto.privateKeyLength)\n const privateKeyBytes = bytes.subarray(0, crypto.privateKeyLength)\n const publicKeyBytes = bytes.subarray(crypto.publicKeyLength)\n return new Ed25519PrivateKeyClass(privateKeyBytes, publicKeyBytes)\n}\n\nexport function unmarshalEd25519PublicKey (bytes: Uint8Array): Ed25519PublicKey {\n bytes = ensureEd25519Key(bytes, crypto.publicKeyLength)\n return new Ed25519PublicKeyClass(bytes)\n}\n\nexport async function generateEd25519KeyPair (): Promise<Ed25519PrivateKey> {\n const { privateKey, publicKey } = crypto.generateKey()\n return new Ed25519PrivateKeyClass(privateKey, publicKey)\n}\n\nexport async function generateEd25519KeyPairFromSeed (seed: Uint8Array): Promise<Ed25519PrivateKey> {\n const { privateKey, publicKey } = crypto.generateKeyFromSeed(seed)\n return new Ed25519PrivateKeyClass(privateKey, publicKey)\n}\n\nexport function ensureEd25519Key (key: Uint8Array, length: number): Uint8Array {\n key = Uint8Array.from(key ?? [])\n if (key.length !== length) {\n throw new InvalidParametersError(`Key must be a Uint8Array of length ${length}, got ${key.length}`)\n }\n return key\n}\n","/* eslint-disable no-fallthrough */\nimport { allocUnsafe } from 'uint8arrays/alloc'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nconst N1 = Math.pow(2, 7)\nconst N2 = Math.pow(2, 14)\nconst N3 = Math.pow(2, 21)\nconst N4 = Math.pow(2, 28)\nconst N5 = Math.pow(2, 35)\nconst N6 = Math.pow(2, 42)\nconst N7 = Math.pow(2, 49)\n\n/** Most significant bit of a byte */\nconst MSB = 0x80\n/** Rest of the bits in a byte */\nconst REST = 0x7f\n\nexport function encodingLength (value: number): number {\n if (value < N1) {\n return 1\n }\n\n if (value < N2) {\n return 2\n }\n\n if (value < N3) {\n return 3\n }\n\n if (value < N4) {\n return 4\n }\n\n if (value < N5) {\n return 5\n }\n\n if (value < N6) {\n return 6\n }\n\n if (value < N7) {\n return 7\n }\n\n if (Number.MAX_SAFE_INTEGER != null && value > Number.MAX_SAFE_INTEGER) {\n throw new RangeError('Could not encode varint')\n }\n\n return 8\n}\n\nexport function encodeUint8Array (value: number, buf: Uint8Array, offset: number = 0): Uint8Array {\n switch (encodingLength(value)) {\n case 8: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 7: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 6: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 5: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 4: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 3: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 2: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 1: {\n buf[offset++] = (value & 0xFF)\n value >>>= 7\n break\n }\n default: throw new Error('unreachable')\n }\n return buf\n}\n\nexport function encodeUint8ArrayList (value: number, buf: Uint8ArrayList, offset: number = 0): Uint8ArrayList {\n switch (encodingLength(value)) {\n case 8: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 7: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 6: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 5: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 4: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 3: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 2: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 1: {\n buf.set(offset++, (value & 0xFF))\n value >>>= 7\n break\n }\n default: throw new Error('unreachable')\n }\n return buf\n}\n\nexport function decodeUint8Array (buf: Uint8Array, offset: number): number {\n let b = buf[offset]\n let res = 0\n\n res += b & REST\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 1]\n res += (b & REST) << 7\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 2]\n res += (b & REST) << 14\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 3]\n res += (b & REST) << 21\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 4]\n res += (b & REST) * N4\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 5]\n res += (b & REST) * N5\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 6]\n res += (b & REST) * N6\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 7]\n res += (b & REST) * N7\n if (b < MSB) {\n return res\n }\n\n throw new RangeError('Could not decode varint')\n}\n\nexport function decodeUint8ArrayList (buf: Uint8ArrayList, offset: number): number {\n let b = buf.get(offset)\n let res = 0\n\n res += b & REST\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 1)\n res += (b & REST) << 7\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 2)\n res += (b & REST) << 14\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 3)\n res += (b & REST) << 21\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 4)\n res += (b & REST) * N4\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 5)\n res += (b & REST) * N5\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 6)\n res += (b & REST) * N6\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 7)\n res += (b & REST) * N7\n if (b < MSB) {\n return res\n }\n\n throw new RangeError('Could not decode varint')\n}\n\nexport function encode (value: number): Uint8Array\nexport function encode (value: number, buf: Uint8Array, offset?: number): Uint8Array\nexport function encode (value: number, buf: Uint8ArrayList, offset?: number): Uint8ArrayList\nexport function encode <T extends Uint8Array | Uint8ArrayList = Uint8Array> (value: number, buf?: T, offset: number = 0): T {\n if (buf == null) {\n buf = allocUnsafe(encodingLength(value)) as T\n }\n if (buf instanceof Uint8Array) {\n return encodeUint8Array(value, buf, offset) as T\n } else {\n return encodeUint8ArrayList(value, buf, offset) as T\n }\n}\n\nexport function decode (buf: Uint8ArrayList | Uint8Array, offset: number = 0): number {\n if (buf instanceof Uint8Array) {\n return decodeUint8Array(buf, offset)\n } else {\n return decodeUint8ArrayList(buf, offset)\n }\n}\n","const f32 = new Float32Array([-0])\nconst f8b = new Uint8Array(f32.buffer)\n\n/**\n * Writes a 32 bit float to a buffer using little endian byte order\n */\nexport function writeFloatLE (val: number, buf: Uint8Array, pos: number): void {\n f32[0] = val\n buf[pos] = f8b[0]\n buf[pos + 1] = f8b[1]\n buf[pos + 2] = f8b[2]\n buf[pos + 3] = f8b[3]\n}\n\n/**\n * Writes a 32 bit float to a buffer using big endian byte order\n */\nexport function writeFloatBE (val: number, buf: Uint8Array, pos: number): void {\n f32[0] = val\n buf[pos] = f8b[3]\n buf[pos + 1] = f8b[2]\n buf[pos + 2] = f8b[1]\n buf[pos + 3] = f8b[0]\n}\n\n/**\n * Reads a 32 bit float from a buffer using little endian byte order\n */\nexport function readFloatLE (buf: Uint8Array, pos: number): number {\n f8b[0] = buf[pos]\n f8b[1] = buf[pos + 1]\n f8b[2] = buf[pos + 2]\n f8b[3] = buf[pos + 3]\n return f32[0]\n}\n\n/**\n * Reads a 32 bit float from a buffer using big endian byte order\n */\nexport function readFloatBE (buf: Uint8Array, pos: number): number {\n f8b[3] = buf[pos]\n f8b[2] = buf[pos + 1]\n f8b[1] = buf[pos + 2]\n f8b[0] = buf[pos + 3]\n return f32[0]\n}\n\nconst f64 = new Float64Array([-0])\nconst d8b = new Uint8Array(f64.buffer)\n\n/**\n * Writes a 64 bit double to a buffer using little endian byte order\n */\nexport function writeDoubleLE (val: number, buf: Uint8Array, pos: number): void {\n f64[0] = val\n buf[pos] = d8b[0]\n buf[pos + 1] = d8b[1]\n buf[pos + 2] = d8b[2]\n buf[pos + 3] = d8b[3]\n buf[pos + 4] = d8b[4]\n buf[pos + 5] = d8b[5]\n buf[pos + 6] = d8b[6]\n buf[pos + 7] = d8b[7]\n}\n\n/**\n * Writes a 64 bit double to a buffer using big endian byte order\n */\nexport function writeDoubleBE (val: number, buf: Uint8Array, pos: number): void {\n f64[0] = val\n buf[pos] = d8b[7]\n buf[pos + 1] = d8b[6]\n buf[pos + 2] = d8b[5]\n buf[pos + 3] = d8b[4]\n buf[pos + 4] = d8b[3]\n buf[pos + 5] = d8b[2]\n buf[pos + 6] = d8b[1]\n buf[pos + 7] = d8b[0]\n}\n\n/**\n * Reads a 64 bit double from a buffer using little endian byte order\n */\nexport function readDoubleLE (buf: Uint8Array, pos: number): number {\n d8b[0] = buf[pos]\n d8b[1] = buf[pos + 1]\n d8b[2] = buf[pos + 2]\n d8b[3] = buf[pos + 3]\n d8b[4] = buf[pos + 4]\n d8b[5] = buf[pos + 5]\n d8b[6] = buf[pos + 6]\n d8b[7] = buf[pos + 7]\n return f64[0]\n}\n\n/**\n * Reads a 64 bit double from a buffer using big endian byte order\n */\nexport function readDoubleBE (buf: Uint8Array, pos: number): number {\n d8b[7] = buf[pos]\n d8b[6] = buf[pos + 1]\n d8b[5] = buf[pos + 2]\n d8b[4] = buf[pos + 3]\n d8b[3] = buf[pos + 4]\n d8b[2] = buf[pos + 5]\n d8b[1] = buf[pos + 6]\n d8b[0] = buf[pos + 7]\n return f64[0]\n}\n","// the largest BigInt we can safely downcast to a Number\nconst MAX_SAFE_NUMBER_INTEGER = BigInt(Number.MAX_SAFE_INTEGER)\nconst MIN_SAFE_NUMBER_INTEGER = BigInt(Number.MIN_SAFE_INTEGER)\n\n/**\n * Constructs new long bits.\n *\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @function Object() { [native code] }\n * @param {number} lo - Low 32 bits, unsigned\n * @param {number} hi - High 32 bits, unsigned\n */\nexport class LongBits {\n public lo: number\n public hi: number\n\n constructor (lo: number, hi: number) {\n // note that the casts below are theoretically unnecessary as of today, but older statically\n // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n /**\n * Low bits\n */\n this.lo = lo | 0\n\n /**\n * High bits\n */\n this.hi = hi | 0\n }\n\n /**\n * Converts this long bits to a possibly unsafe JavaScript number\n */\n toNumber (unsigned: boolean = false): number {\n if (!unsigned && (this.hi >>> 31) > 0) {\n const lo = ~this.lo + 1 >>> 0\n let hi = ~this.hi >>> 0\n if (lo === 0) {\n hi = hi + 1 >>> 0\n }\n return -(lo + hi * 4294967296)\n }\n return this.lo + this.hi * 4294967296\n }\n\n /**\n * Converts this long bits to a bigint\n */\n toBigInt (unsigned: boolean = false): bigint {\n if (unsigned) {\n return BigInt(this.lo >>> 0) + (BigInt(this.hi >>> 0) << 32n)\n }\n\n if ((this.hi >>> 31) !== 0) {\n const lo = ~this.lo + 1 >>> 0\n let hi = ~this.hi >>> 0\n if (lo === 0) {\n hi = hi + 1 >>> 0\n }\n return -(BigInt(lo) + (BigInt(hi) << 32n))\n }\n\n return BigInt(this.lo >>> 0) + (BigInt(this.hi >>> 0) << 32n)\n }\n\n /**\n * Converts this long bits to a string\n */\n toString (unsigned: boolean = false): string {\n return this.toBigInt(unsigned).toString()\n }\n\n /**\n * Zig-zag encodes this long bits\n */\n zzEncode (): this {\n const mask = this.hi >> 31\n this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0\n this.lo = (this.lo << 1 ^ mask) >>> 0\n return this\n }\n\n /**\n * Zig-zag decodes this long bits\n */\n zzDecode (): this {\n const mask = -(this.lo & 1)\n this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0\n this.hi = (this.hi >>> 1 ^ mask) >>> 0\n return this\n }\n\n /**\n * Calculates the length of this longbits when encoded as a varint.\n */\n length (): number {\n const part0 = this.lo\n const part1 = (this.lo >>> 28 | this.hi << 4) >>> 0\n const part2 = this.hi >>> 24\n return part2 === 0\n ? part1 === 0\n ? part0 < 16384\n ? part0 < 128 ? 1 : 2\n : part0 < 2097152 ? 3 : 4\n : part1 < 16384\n ? part1 < 128 ? 5 : 6\n : part1 < 2097152 ? 7 : 8\n : part2 < 128 ? 9 : 10\n }\n\n /**\n * Constructs new long bits from the specified number\n */\n static fromBigInt (value: bigint): LongBits {\n if (value === 0n) {\n return zero\n }\n\n if (value < MAX_SAFE_NUMBER_INTEGER && value > MIN_SAFE_NUMBER_INTEGER) {\n return this.fromNumber(Number(value))\n }\n\n const negative = value < 0n\n\n if (negative) {\n value = -value\n }\n\n let hi = value >> 32n\n let lo = value - (hi << 32n)\n\n if (negative) {\n hi = ~hi | 0n\n lo = ~lo | 0n\n\n if (++lo > TWO_32) {\n lo = 0n\n if (++hi > TWO_32) { hi = 0n }\n }\n }\n\n return new LongBits(Number(lo), Number(hi))\n }\n\n /**\n * Constructs new long bits from the specified number\n */\n static fromNumber (value: number): LongBits {\n if (value === 0) { return zero }\n const sign = value < 0\n if (sign) { value = -value }\n let lo = value >>> 0\n let hi = (value - lo) / 4294967296 >>> 0\n if (sign) {\n hi = ~hi >>> 0\n lo = ~lo >>> 0\n if (++lo > 4294967295) {\n lo = 0\n if (++hi > 4294967295) { hi = 0 }\n }\n }\n return new LongBits(lo, hi)\n }\n\n /**\n * Constructs new long bits from a number, long or string\n */\n static from (value: bigint | number | string | { low: number, high: number }): LongBits {\n if (typeof value === 'number') {\n return LongBits.fromNumber(value)\n }\n if (typeof value === 'bigint') {\n return LongBits.fromBigInt(value)\n }\n if (typeof value === 'string') {\n return LongBits.fromBigInt(BigInt(value))\n }\n return value.low != null || value.high != null ? new LongBits(value.low >>> 0, value.high >>> 0) : zero\n }\n}\n\nconst zero = new LongBits(0, 0)\nzero.toBigInt = function () { return 0n }\nzero.zzEncode = zero.zzDecode = function () { return this }\nzero.length = function () { return 1 }\n\nconst TWO_32 = 4294967296n\n","/**\n * Calculates the UTF8 byte length of a string\n */\nexport function length (string: string): number {\n let len = 0\n let c = 0\n for (let i = 0; i < string.length; ++i) {\n c = string.charCodeAt(i)\n\n if (c < 128) {\n len += 1\n } else if (c < 2048) {\n len += 2\n } else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\n ++i\n len += 4\n } else {\n len += 3\n }\n }\n\n return len\n}\n\n/**\n * Reads UTF8 bytes as a string\n */\nexport function read (buffer: Uint8Array, start: number, end: number): string {\n const len = end - start\n\n if (len < 1) {\n return ''\n }\n\n let parts: string[] | undefined\n const chunk: number[] = []\n let i = 0 // char offset\n let t: number // temporary\n\n while (start < end) {\n t = buffer[start++]\n\n if (t < 128) {\n chunk[i++] = t\n } else if (t > 191 && t < 224) {\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63\n } else if (t > 239 && t < 365) {\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000\n chunk[i++] = 0xD800 + (t >> 10)\n chunk[i++] = 0xDC00 + (t & 1023)\n } else {\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63\n }\n\n if (i > 8191) {\n (parts ?? (parts = [])).push(String.fromCharCode.apply(String, chunk))\n i = 0\n }\n }\n\n if (parts != null) {\n if (i > 0) {\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)))\n }\n\n return parts.join('')\n }\n\n return String.fromCharCode.apply(String, chunk.slice(0, i))\n}\n\n/**\n * Writes a string as UTF8 bytes\n */\nexport function write (string: string, buffer: Uint8Array, offset: number): number {\n const start = offset\n let c1 // character 1\n let c2 // character 2\n\n for (let i = 0; i < string.length; ++i) {\n c1 = string.charCodeAt(i)\n\n if (c1 < 128) {\n buffer[offset++] = c1\n } else if (c1 < 2048) {\n buffer[offset++] = c1 >> 6 | 192\n buffer[offset++] = c1 & 63 | 128\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF)\n ++i\n buffer[offset++] = c1 >> 18 | 240\n buffer[offset++] = c1 >> 12 & 63 | 128\n buffer[offset++] = c1 >> 6 & 63 | 128\n buffer[offset++] = c1 & 63 | 128\n } else {\n buffer[offset++] = c1 >> 12 | 224\n buffer[offset++] = c1 >> 6 & 63 | 128\n buffer[offset++] = c1 & 63 | 128\n }\n }\n\n return offset - start\n}\n","import { decodeUint8Array, encodingLength } from 'uint8-varint'\nimport { readFloatLE, readDoubleLE } from './float.js'\nimport { LongBits } from './longbits.js'\nimport * as utf8 from './utf8.js'\nimport type { Reader } from '../index.js'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\n/* istanbul ignore next */\nfunction indexOutOfRange (reader: Reader, writeLength?: number): RangeError {\n return RangeError(`index out of range: ${reader.pos} + ${writeLength ?? 1} > ${reader.len}`)\n}\n\nfunction readFixed32End (buf: Uint8Array, end: number): number { // note that this uses `end`, not `pos`\n return (buf[end - 4] |\n buf[end - 3] << 8 |\n buf[end - 2] << 16 |\n buf[end - 1] << 24) >>> 0\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n */\nexport class Uint8ArrayReader implements Reader {\n public buf: Uint8Array\n public pos: number\n public len: number\n\n public _slice = Uint8Array.prototype.subarray\n\n constructor (buffer: Uint8Array) {\n /**\n * Read buffer\n */\n this.buf = buffer\n\n /**\n * Read buffer position\n */\n this.pos = 0\n\n /**\n * Read buffer length\n */\n this.len = buffer.length\n }\n\n /**\n * Reads a varint as an unsigned 32 bit value\n */\n uint32 (): number {\n let value = 4294967295\n\n value = (this.buf[this.pos] & 127) >>> 0; if (this.buf[this.pos++] < 128) { return value }\n value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) { return value }\n value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) { return value }\n value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) { return value }\n value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) { return value }\n\n if ((this.pos += 5) > this.len) {\n this.pos = this.len\n throw indexOutOfRange(this, 10)\n }\n\n return value\n }\n\n /**\n * Reads a varint as a signed 32 bit value\n */\n int32 (): number {\n return this.uint32() | 0\n }\n\n /**\n * Reads a zig-zag encoded varint as a signed 32 bit value\n */\n sint32 (): number {\n const value = this.uint32()\n return value >>> 1 ^ -(value & 1) | 0\n }\n\n /**\n * Reads a varint as a boolean\n */\n bool (): boolean {\n return this.uint32() !== 0\n }\n\n /**\n * Reads fixed 32 bits as an unsigned 32 bit integer\n */\n fixed32 (): number {\n if (this.pos + 4 > this.len) { throw indexOutOfRange(this, 4) }\n\n const res = readFixed32End(this.buf, this.pos += 4)\n\n return res\n }\n\n /**\n * Reads fixed 32 bits as a signed 32 bit integer\n */\n sfixed32 (): number {\n if (this.pos + 4 > this.len) {\n throw indexOutOfRange(this, 4)\n }\n\n const res = readFixed32End(this.buf, this.pos += 4) | 0\n\n return res\n }\n\n /**\n * Reads a float (32 bit) as a number\n */\n float (): number {\n if (this.pos + 4 > this.len) {\n throw indexOutOfRange(this, 4)\n }\n\n const value = readFloatLE(this.buf, this.pos)\n this.pos += 4\n return value\n }\n\n /**\n * Reads a double (64 bit float) as a number\n */\n double (): number {\n /* istanbul ignore if */\n if (this.pos + 8 > this.len) { throw indexOutOfRange(this, 4) }\n\n const value = readDoubleLE(this.buf, this.pos)\n this.pos += 8\n return value\n }\n\n /**\n * Reads a sequence of bytes preceded by its length as a varint\n */\n bytes (): Uint8Array {\n const length = this.uint32()\n const start = this.pos\n const end = this.pos + length\n\n /* istanbul ignore if */\n if (end > this.len) {\n throw indexOutOfRange(this, length)\n }\n\n this.pos += length\n\n return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1\n ? new Uint8Array(0)\n : this.buf.subarray(start, end)\n }\n\n /**\n * Reads a string preceded by its byte length as a varint\n */\n string (): string {\n const bytes = this.bytes()\n return utf8.read(bytes, 0, bytes.length)\n }\n\n /**\n * Skips the specified number of bytes if specified, otherwise skips a varint\n */\n skip (length?: number): this {\n if (typeof length === 'number') {\n /* istanbul ignore if */\n if (this.pos + length > this.len) { throw indexOutOfRange(this, length) }\n this.pos += length\n } else {\n do {\n /* istanbul ignore if */\n if (this.pos >= this.len) {\n throw indexOutOfRange(this)\n }\n } while ((this.buf[this.pos++] & 128) !== 0)\n }\n return this\n }\n\n /**\n * Skips the next element of the specified wire type\n */\n skipType (wireType: number): this {\n switch (wireType) {\n case 0:\n this.skip()\n break\n case 1:\n this.skip(8)\n break\n case 2:\n this.skip(this.uint32())\n break\n case 3:\n while ((wireType = this.uint32() & 7) !== 4) {\n this.skipType(wireType)\n }\n break\n case 5:\n this.skip(4)\n break\n\n /* istanbul ignore next */\n default:\n throw Error(`invalid wire type ${wireType} at offset ${this.pos}`)\n }\n return this\n }\n\n private readLongVarint (): LongBits {\n // tends to deopt with local vars for octet etc.\n const bits = new LongBits(0, 0)\n let i = 0\n if (this.len - this.pos > 4) { // fast route (lo)\n for (; i < 4; ++i) {\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0\n if (this.buf[this.pos++] < 128) { return bits }\n }\n // 5th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0\n if (this.buf[this.pos++] < 128) { return bits }\n i = 0\n } else {\n for (; i < 3; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len) { throw indexOutOfRange(this) }\n // 1st..3th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0\n if (this.buf[this.pos++] < 128) { return bits }\n }\n // 4th\n bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0\n return bits\n }\n if (this.len - this.pos > 4) { // fast route (hi)\n for (; i < 5; ++i) {\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0\n if (this.buf[this.pos++] < 128) { return bits }\n }\n } else {\n for (; i < 5; ++i) {\n if (this.pos >= this.len) {\n throw indexOutOfRange(this)\n }\n\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0\n if (this.buf[this.pos++] < 128) { return bits }\n }\n }\n\n throw Error('invalid varint encoding')\n }\n\n private readFixed64 (): LongBits {\n if (this.pos + 8 > this.len) {\n throw indexOutOfRange(this, 8)\n }\n\n const lo = readFixed32End(this.buf, this.pos += 4)\n const hi = readFixed32End(this.buf, this.pos += 4)\n\n return new LongBits(lo, hi)\n }\n\n /**\n * Reads a varint as a signed 64 bit value\n */\n int64 (): bigint {\n return this.readLongVarint().toBigInt()\n }\n\n /**\n * Reads a varint as a signed 64 bit value returned as a possibly unsafe\n * JavaScript number\n */\n int64Number (): number {\n return this.readLongVarint().toNumber()\n }\n\n /**\n * Reads a varint as a signed 64 bit value returned as a string\n */\n int64String (): string {\n return this.readLongVarint().toString()\n }\n\n /**\n * Reads a varint as an unsigned 64 bit value\n */\n uint64 (): bigint {\n return this.readLongVarint().toBigInt(true)\n }\n\n /**\n * Reads a varint as an unsigned 64 bit value returned as a possibly unsafe\n * JavaScript number\n */\n uint64Number (): number {\n const value = decodeUint8Array(this.buf, this.pos)\n this.pos += encodingLength(value)\n return value\n }\n\n /**\n * Reads a varint as an unsigned 64 bit value returned as a string\n */\n uint64String (): string {\n return this.readLongVarint().toString(true)\n }\n\n /**\n * Reads a zig-zag encoded varint as a signed 64 bit value\n */\n sint64 (): bigint {\n return this.readLongVarint().zzDecode().toBigInt()\n }\n\n /**\n * Reads a zig-zag encoded varint as a signed 64 bit value returned as a\n * possibly unsafe JavaScript number\n */\n sint64Number (): number {\n return this.readLongVarint().zzDecode().toNumber()\n }\n\n /**\n * Reads a zig-zag encoded varint as a signed 64 bit value returned as a\n * string\n */\n sint64String (): string {\n return this.readLongVarint().zzDecode().toString()\n }\n\n /**\n * Reads fixed 64 bits\n */\n fixed64 (): bigint {\n return this.readFixed64().toBigInt()\n }\n\n /**\n * Reads fixed 64 bits returned as a possibly unsafe JavaScript number\n */\n fixed64Number (): number {\n return this.readFixed64().toNumber()\n }\n\n /**\n * Reads fixed 64 bits returned as a string\n */\n fixed64String (): string {\n return this.readFixed64().toString()\n }\n\n /**\n * Reads zig-zag encoded fixed 64 bits\n */\n sfixed64 (): bigint {\n return this.readFixed64().toBigInt()\n }\n\n /**\n * Reads zig-zag encoded fixed 64 bits returned as a possibly unsafe\n * JavaScript number\n */\n sfixed64Number (): number {\n return this.readFixed64().toNumber()\n }\n\n /**\n * Reads zig-zag encoded fixed 64 bits returned as a string\n */\n sfixed64String (): string {\n return this.readFixed64().toString()\n }\n}\n\nexport function createReader (buf: Uint8Array | Uint8ArrayList): Reader {\n return new Uint8ArrayReader(buf instanceof Uint8Array ? buf : buf.subarray())\n}\n","import { createReader } from './utils/reader.js'\nimport type { Codec, DecodeOptions } from './codec.js'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nexport function decodeMessage <T> (buf: Uint8Array | Uint8ArrayList, codec: Pick<Codec<T>, 'decode'>, opts?: DecodeOptions<T>): T {\n const reader = createReader(buf)\n\n return codec.decode(reader, undefined, opts)\n}\n","import { allocUnsafe } from 'uint8arrays/alloc'\n\n/**\n * A general purpose buffer pool\n */\nexport default function pool (size?: number): (size: number) => Uint8Array {\n const SIZE = size ?? 8192\n const MAX = SIZE >>> 1\n let slab: Uint8Array\n let offset = SIZE\n return function poolAlloc (size: number) {\n if (size < 1 || size > MAX) {\n return allocUnsafe(size)\n }\n\n if (offset + size > SIZE) {\n slab = allocUnsafe(SIZE)\n offset = 0\n }\n\n const buf = slab.subarray(offset, offset += size)\n\n if ((offset & 7) !== 0) {\n // align to 32 bit\n offset = (offset | 7) + 1\n }\n\n return buf\n }\n}\n","import { encodeUint8Array, encodingLength } from 'uint8-varint'\nimport { allocUnsafe } from 'uint8arrays/alloc'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { writeFloatLE, writeDoubleLE } from './float.js'\nimport { LongBits } from './longbits.js'\nimport pool from './pool.js'\nimport * as utf8 from './utf8.js'\nimport type { Writer } from '../index.js'\n\ninterface WriterOperation<T> {\n (val: T, buf: Uint8Array, pos: number): any\n}\n\n/**\n * Constructs a new writer operation instance.\n *\n * @classdesc Scheduled writer operation\n */\nclass Op<T> {\n /**\n * Function to call\n */\n public fn: WriterOperation<T>\n\n /**\n * Value byte length\n */\n public len: number\n\n /**\n * Next operation\n */\n public next?: Op<any>\n\n /**\n * Value to write\n */\n public val: T\n\n constructor (fn: WriterOperation<T>, len: number, val: T) {\n this.fn = fn\n this.len = len\n this.next = undefined\n this.val = val // type varies\n }\n}\n\n/* istanbul ignore next */\nfunction noop (): void {}\n\n/**\n * Constructs a new writer state instance\n */\nclass State {\n /**\n * Current head\n */\n public head: Op<any>\n\n /**\n * Current tail\n */\n public tail: Op<any>\n\n /**\n * Current buffer length\n */\n public len: number\n\n /**\n * Next state\n */\n public next?: State\n\n constructor (writer: Uint8ArrayWriter) {\n this.head = writer.head\n this.tail = writer.tail\n this.len = writer.len\n this.next = writer.states\n }\n}\n\nconst bufferPool = pool()\n\n/**\n * Allocates a buffer of the specified size\n */\nfunction alloc (size: number): Uint8Array {\n if (globalThis.Buffer != null) {\n return allocUnsafe(size)\n }\n\n return bufferPool(size)\n}\n\n/**\n * When a value is written, the writer calculates its byte length and puts it into a linked\n * list of operations to perform when finish() is called. This both allows us to allocate\n * buffers of the exact required size and reduces the amount of work we have to do compared\n * to first calculating over objects and then encoding over objects. In our case, the encoding\n * part is just a linked list walk calling operations with already prepared values.\n */\nclass Uint8ArrayWriter implements Writer {\n /**\n * Current length\n */\n public len: number\n\n /**\n * Operations head\n */\n public head: Op<any>\n\n /**\n * Operations tail\n */\n public tail: Op<any>\n\n /**\n * Linked forked states\n */\n public states?: any\n\n constructor () {\n this.len = 0\n this.head = new Op(noop, 0, 0)\n this.tail = this.head\n this.states = null\n }\n\n /**\n * Pushes a new operation to the queue\n */\n _push (fn: WriterOperation<any>, len: number, val: any): this {\n this.tail = this.tail.next = new Op(fn, len, val)\n this.len += len\n\n return this\n }\n\n /**\n * Writes an unsigned 32 bit value as a varint\n */\n uint32 (value: number): this {\n // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n // uint32 is by far the most frequently used operation and benefits significantly from this.\n this.len += (this.tail = this.tail.next = new VarintOp(\n (value = value >>> 0) <\n 128\n ? 1\n : value < 16384\n ? 2\n : value < 2097152\n ? 3\n : value < 268435456\n ? 4\n : 5,\n value)).len\n return this\n }\n\n /**\n * Writes a signed 32 bit value as a varint`\n */\n int32 (value: number): this {\n return value < 0\n ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n : this.uint32(value)\n }\n\n /**\n * Writes a 32 bit value as a varint, zig-zag encoded\n */\n sint32 (value: number): this {\n return this.uint32((value << 1 ^ value >> 31) >>> 0)\n }\n\n /**\n * Writes an unsigned 64 bit value as a varint\n */\n uint64 (value: bigint): this {\n const bits = LongBits.fromBigInt(value)\n return this._push(writeVarint64, bits.length(), bits)\n }\n\n /**\n * Writes an unsigned 64 bit value as a varint\n */\n uint64Number (value: number): this {\n return this._push(encodeUint8Array, encodingLength(value), value)\n }\n\n /**\n * Writes an unsigned 64 bit value as a varint\n */\n uint64String (value: string): this {\n return this.uint64(BigInt(value))\n }\n\n /**\n * Writes a signed 64 bit value as a varint\n */\n int64 (value: bigint): this {\n return this.uint64(value)\n }\n\n /**\n * Writes a signed 64 bit value as a varint\n */\n int64Number (value: number): this {\n return this.uint64Number(value)\n }\n\n /**\n * Writes a signed 64 bit value as a varint\n */\n int64String (value: string): this {\n return this.uint64String(value)\n }\n\n /**\n * Writes a signed 64 bit value as a varint, zig-zag encoded\n */\n sint64 (value: bigint): this {\n const bits = LongBits.fromBigInt(value).zzEncode()\n return this._push(writeVarint64, bits.length(), bits)\n }\n\n /**\n * Writes a signed 64 bit value as a varint, zig-zag encoded\n */\n sint64Number (value: number): this {\n const bits = LongBits.fromNumber(value).zzEncode()\n return this._push(writeVarint64, bits.length(), bits)\n }\n\n /**\n * Writes a signed 64 bit value as a varint, zig-zag encoded\n */\n sint64String (value: string): this {\n return this.sint64(BigInt(value))\n }\n\n /**\n * Writes a boolish value as a varint\n */\n bool (value: boolean): this {\n return this._push(writeByte, 1, value ? 1 : 0)\n }\n\n /**\n * Writes an unsigned 32 bit value as fixed 32 bits\n */\n fixed32 (value: number): this {\n return this._push(writeFixed32, 4, value >>> 0)\n }\n\n /**\n * Writes a signed 32 bit value as fixed 32 bits\n */\n sfixed32 (value: number): this {\n return this.fixed32(value)\n }\n\n /**\n * Writes an unsigned 64 bit value as fixed 64 bits\n */\n fixed64 (value: bigint): this {\n const bits = LongBits.fromBigInt(value)\n return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi)\n }\n\n /**\n * Writes an unsigned 64 bit value as fixed 64 bits\n */\n fixed64Number (value: number): this {\n const bits = LongBits.fromNumber(value)\n return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi)\n }\n\n /**\n * Writes an unsigned 64 bit value as fixed 64 bits\n */\n fixed64String (value: string): this {\n return this.fixed64(BigInt(value))\n }\n\n /**\n * Writes a signed 64 bit value as fixed 64 bits\n */\n sfixed64 (value: bigint): this {\n return this.fixed64(value)\n }\n\n /**\n * Writes a signed 64 bit value as fixed 64 bits\n */\n sfixed64Number (value: number): this {\n return this.fixed64Number(value)\n }\n\n /**\n * Writes a signed 64 bit value as fixed 64 bits\n */\n sfixed64String (value: string): this {\n return this.fixed64String(value)\n }\n\n /**\n * Writes a float (32 bit)\n */\n float (value: number): this {\n return this._push(writeFloatLE, 4, value)\n }\n\n /**\n * Writes a double (64 bit float).\n *\n * @function\n * @param {number} value - Value to write\n * @returns {Writer} `this`\n */\n double (value: number): this {\n return this._push(writeDoubleLE, 8, value)\n }\n\n /**\n * Writes a sequence of bytes\n */\n bytes (value: Uint8Array): this {\n const len = value.length >>> 0\n\n if (len === 0) {\n return this._push(writeByte, 1, 0)\n }\n\n return this.uint32(len)._push(writeBytes, len, value)\n }\n\n /**\n * Writes a string\n */\n string (value: string): this {\n const len = utf8.length(value)\n return len !== 0\n ? this.uint32(len)._push(utf8.write, len, value)\n : this._push(writeByte, 1, 0)\n }\n\n /**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n */\n fork (): this {\n this.states = new State(this)\n this.head = this.tail = new Op(noop, 0, 0)\n this.len = 0\n return this\n }\n\n /**\n * Resets this instance to the last state\n */\n reset (): this {\n if (this.states != null) {\n this.head = this.states.head\n this.tail = this.states.tail\n this.len = this.states.len\n this.states = this.states.next\n } else {\n this.head = this.tail = new Op(noop, 0, 0)\n this.len = 0\n }\n return this\n }\n\n /**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n */\n ldelim (): this {\n const head = this.head\n const tail = this.tail\n const len = this.len\n this.reset().uint32(len)\n if (len !== 0) {\n this.tail.next = head.next // skip noop\n this.tail = tail\n this.len += len\n }\n return this\n }\n\n /**\n * Finishes the write operation\n */\n finish (): Uint8Array {\n let head = this.head.next // skip noop\n const buf = alloc(this.len)\n let pos = 0\n while (head != null) {\n head.fn(head.val, buf, pos)\n pos += head.len\n head = head.next\n }\n // this.head = this.tail = null;\n return buf\n }\n}\n\nfunction writeByte (val: number, buf: Uint8Array, pos: number): void {\n buf[pos] = val & 255\n}\n\nfunction writeVarint32 (val: number, buf: Uint8Array, pos: number): void {\n while (val > 127) {\n buf[pos++] = val & 127 | 128\n val >>>= 7\n }\n buf[pos] = val\n}\n\n/**\n * Constructs a new varint writer operation instance.\n *\n * @classdesc Scheduled varint writer operation\n */\nclass VarintOp extends Op<number> {\n public next?: Op<any>\n\n constructor (len: number, val: number) {\n super(writeVarint32, len, val)\n this.next = undefined\n }\n}\n\nfunction writeVarint64 (val: LongBits, buf: Uint8Array, pos: number): void {\n while (val.hi !== 0) {\n buf[pos++] = val.lo & 127 | 128\n val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0\n val.hi >>>= 7\n }\n while (val.lo > 127) {\n buf[pos++] = val.lo & 127 | 128\n val.lo = val.lo >>> 7\n }\n buf[pos++] = val.lo\n}\n\nfunction writeFixed32 (val: number, buf: Uint8Array, pos: number): void {\n buf[pos] = val & 255\n buf[pos + 1] = val >>> 8 & 255\n buf[pos + 2] = val >>> 16 & 255\n buf[pos + 3] = val >>> 24\n}\n\nfunction writeBytes (val: Uint8Array, buf: Uint8Array, pos: number): void {\n buf.set(val, pos)\n}\n\nif (globalThis.Buffer != null) {\n Uint8ArrayWriter.prototype.bytes = function (value: Uint8Array) {\n const len = value.length >>> 0\n\n this.uint32(len)\n\n if (len > 0) {\n this._push(writeBytesBuffer, len, value)\n }\n\n return this\n }\n\n Uint8ArrayWriter.prototype.string = function (value: string) {\n const len = globalThis.Buffer.byteLength(value)\n\n this.uint32(len)\n\n if (len > 0) {\n this._push(writeStringBuffer, len, value)\n }\n\n return this\n }\n}\n\nfunction writeBytesBuffer (val: Uint8Array, buf: Uint8Array, pos: number): void {\n buf.set(val, pos) // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n // also works for plain array values\n}\n\nfunction writeStringBuffer (val: string, buf: Uint8Array, pos: number): void {\n if (val.length < 40) {\n // plain js is faster for short strings (probably due to redundant assertions)\n utf8.write(val, buf, pos)\n // @ts-expect-error buf isn't a Uint8Array?\n } else if (buf.utf8Write != null) {\n // @ts-expect-error buf isn't a Uint8Array?\n buf.utf8Write(val, pos)\n } else {\n buf.set(uint8ArrayFromString(val), pos)\n }\n}\n\n/**\n * Creates a new writer\n */\nexport function createWriter (): Writer {\n return new Uint8ArrayWriter()\n}\n","import { createWriter } from './utils/writer.js'\nimport type { Codec } from './codec.js'\n\nexport function encodeMessage <T> (message: Partial<T>, codec: Pick<Codec<T>, 'encode'>): Uint8Array {\n const w = createWriter()\n\n codec.encode(message, w, {\n lengthDelimited: false\n })\n\n return w.finish()\n}\n","import type { Writer, Reader } from './index.js'\n\n// https://developers.google.com/protocol-buffers/docs/encoding#structure\nexport enum CODEC_TYPES {\n VARINT = 0,\n BIT64,\n LENGTH_DELIMITED,\n START_GROUP,\n END_GROUP,\n BIT32\n}\n\nexport interface EncodeOptions {\n lengthDelimited?: boolean\n writeDefaults?: boolean\n}\n\nexport interface EncodeFunction<T> {\n (value: Partial<T>, writer: Writer, opts?: EncodeOptions): void\n}\n\n// protobuf types that contain multiple values\ntype CollectionTypes = any[] | Map<any, any>\n\n// protobuf types that are not collections or messages\ntype PrimitiveTypes = boolean | number | string | bigint | Uint8Array\n\n// recursive array/map field length limits\ntype CollectionLimits <T> = {\n [K in keyof T]: T[K] extends CollectionTypes ? number :\n T[K] extends PrimitiveTypes ? never : Limits<T[K]>\n}\n\n// recursive array member array/map field length limits\ntype ArrayElementLimits <T> = {\n [K in keyof T as `${string & K}$`]: T[K] extends Array<infer ElementType> ?\n (ElementType extends PrimitiveTypes ? never : Limits<ElementType>) :\n (T[K] extends PrimitiveTypes ? never : Limits<T[K]>)\n}\n\n// recursive map value array/map field length limits\ntype MapValueLimits <T> = {\n [K in keyof T as `${string & K}$value`]: T[K] extends Map<any, infer MapValueType> ?\n (MapValueType extends PrimitiveTypes ? never : Limits<MapValueType>) :\n (T[K] extends PrimitiveTypes ? never : Limits<T[K]>)\n}\n\n// union of collection and array elements\ntype Limits<T> = Partial<CollectionLimits<T> & ArrayElementLimits<T> & MapValueLimits<T>>\n\nexport interface DecodeOptions<T> {\n /**\n * Runtime-specified limits for lengths of repeated/map fields\n */\n limits?: Limits<T>\n}\n\nexport interface DecodeFunction<T> {\n (reader: Reader, length?: number, opts?: DecodeOptions<T>): T\n}\n\nexport interface Codec<T> {\n name: string\n type: CODEC_TYPES\n encode: EncodeFunction<T>\n decode: DecodeFunction<T>\n}\n\nexport function createCodec <T> (name: string, type: CODEC_TYPES, encode: EncodeFunction<T>, decode: DecodeFunction<T>): Codec<T> {\n return {\n name,\n type,\n encode,\n decode\n }\n}\n","import { createCodec, CODEC_TYPES } from '../codec.js'\nimport type { DecodeFunction, EncodeFunction, Codec } from '../codec.js'\n\nexport function enumeration <T> (v: any): Codec<T> {\n function findValue (val: string | number): number {\n // Use the reverse mapping to look up the enum key for the stored value\n // https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\n if (v[val.toString()] == null) {\n throw new Error('Invalid enum value')\n }\n\n return v[val]\n }\n\n const encode: EncodeFunction<number | string> = function enumEncode (val, writer) {\n const enumValue = findValue(val)\n\n writer.int32(enumValue)\n }\n\n const decode: DecodeFunction<number | string> = function enumDecode (reader) {\n const val = reader.int32()\n\n return findValue(val)\n }\n\n // @ts-expect-error yeah yeah\n return createCodec('enum', CODEC_TYPES.VARINT, encode, decode)\n}\n","import { createCodec, CODEC_TYPES } from '../codec.js'\nimport type { EncodeFunction, DecodeFunction, Codec } from '../codec.js'\n\nexport interface Factory<A, T> {\n new (obj: A): T\n}\n\nexport function message <T> (encode: EncodeFunction<T>, decode: DecodeFunction<T>): Codec<T> {\n return createCodec('message', CODEC_TYPES.LENGTH_DELIMITED, encode, decode)\n}\n","import { decodeMessage, encodeMessage, enumeration, message } from 'protons-runtime'\nimport type { Codec, DecodeOptions } from 'protons-runtime'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nexport enum KeyType {\n RSA = 'RSA',\n Ed25519 = 'Ed25519',\n secp256k1 = 'secp256k1',\n ECDSA = 'ECDSA'\n}\n\nenum __KeyTypeValues {\n RSA = 0,\n Ed25519 = 1,\n secp256k1 = 2,\n ECDSA = 3\n}\n\nexport namespace KeyType {\n export const codec = (): Codec<KeyType> => {\n return enumeration<KeyType>(__KeyTypeValues)\n }\n}\nexport interface PublicKey {\n Type?: KeyType\n Data?: Uint8Array\n}\n\nexport namespace PublicKey {\n let _codec: Codec<PublicKey>\n\n export const codec = (): Codec<PublicKey> => {\n if (_codec == null) {\n _codec = message<PublicKey>((obj, w, opts = {}) => {\n if (opts.lengthDelimited !== false) {\n w.fork()\n }\n\n if (obj.Type != null) {\n w.uint32(8)\n KeyType.codec().encode(obj.Type, w)\n }\n\n if (obj.Data != null) {\n w.uint32(18)\n w.bytes(obj.Data)\n }\n\n if (opts.lengthDelimited !== false) {\n w.ldelim()\n }\n }, (reader, length, opts = {}) => {\n const obj: any = {}\n\n const end = length == null ? reader.len : reader.pos + length\n\n while (reader.pos < end) {\n const tag = reader.uint32()\n\n switch (tag >>> 3) {\n case 1: {\n obj.Type = KeyType.codec().decode(reader)\n break\n }\n case 2: {\n obj.Data = reader.bytes()\n break\n }\n default: {\n reader.skipType(tag & 7)\n break\n }\n }\n }\n\n return obj\n })\n }\n\n return _codec\n }\n\n export const encode = (obj: Partial<PublicKey>): Uint8Array => {\n return encodeMessage(obj, PublicKey.codec())\n }\n\n export const decode = (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<PublicKey>): PublicKey => {\n return decodeMessage(buf, PublicKey.codec(), opts)\n }\n}\n\nexport interface PrivateKey {\n Type?: KeyType\n Data?: Uint8Array\n}\n\nexport namespace PrivateKey {\n let _codec: Codec<PrivateKey>\n\n export const codec = (): Codec<PrivateKey> => {\n if (_codec == null) {\n _codec = message<PrivateKey>((obj, w, opts = {}) => {\n if (opts.lengthDelimited !== false) {\n w.fork()\n }\n\n if (obj.Type != null) {\n w.uint32(8)\n KeyType.codec().encode(obj.Type, w)\n }\n\n if (obj.Data != null) {\n w.uint32(18)\n w.bytes(obj.Data)\n }\n\n if (opts.lengthDelimited !== false) {\n w.ldelim()\n }\n }, (reader, length, opts = {}) => {\n const obj: any = {}\n\n const end = length == null ? reader.len : reader.pos + length\n\n while (reader.pos < end) {\n const tag = reader.uint32()\n\n switch (tag >>> 3) {\n case 1: {\n obj.Type = KeyType.codec().decode(reader)\n break\n }\n case 2: {\n obj.Data = reader.bytes()\n break\n }\n default: {\n reader.skipType(tag & 7)\n break\n }\n }\n }\n\n return obj\n })\n }\n\n return _codec\n }\n\n export const encode = (obj: Partial<PrivateKey>): Uint8Array => {\n return encodeMessage(obj, PrivateKey.codec())\n }\n\n export const decode = (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<PrivateKey>): PrivateKey => {\n return decodeMessage(buf, PrivateKey.codec(), opts)\n }\n}\n","import { secp256k1 as secp } from '@noble/curves/secp256k1.js'\nimport { sha256 } from 'multiformats/hashes/sha2'\nimport { SigningError, VerificationError } from '../../errors.js'\nimport { isPromise } from '../../util.js'\nimport type { AbortOptions } from '@libp2p/interface'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nconst PUBLIC_KEY_BYTE_LENGTH = 33\nconst PRIVATE_KEY_BYTE_LENGTH = 32\n\nexport { PUBLIC_KEY_BYTE_LENGTH as publicKeyLength }\nexport { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength }\n\n/**\n * Hash and sign message with private key\n */\nexport function hashAndSign (key: Uint8Array, msg: Uint8Array | Uint8ArrayList, options?: AbortOptions): Uint8Array | Promise<Uint8Array> {\n const p = sha256.digest(msg instanceof Uint8Array ? msg : msg.subarray())\n\n if (isPromise(p)) {\n return p\n .then(({ digest }) => {\n options?.signal?.throwIfAborted()\n return secp.sign(digest, key, {\n prehash: false,\n format: 'der'\n })\n })\n .catch(err => {\n if (err.name === 'AbortError') {\n throw err\n }\n\n throw new SigningError(String(err))\n })\n }\n\n try {\n return secp.sign(p.digest, key, {\n prehash: false,\n format: 'der'\n })\n } catch (err) {\n throw new SigningError(String(err))\n }\n}\n\n/**\n * Hash message and verify signature with public key\n */\nexport function hashAndVerify (key: Uint8Array, sig: Uint8Array, msg: Uint8Array | Uint8ArrayList, options?: AbortOptions): boolean | Promise<boolean> {\n const p = sha256.digest(msg instanceof Uint8Array ? msg : msg.subarray())\n\n if (isPromise(p)) {\n return p\n .then(({ digest }) => {\n options?.signal?.throwIfAborted()\n return secp.verify(sig, digest, key, {\n prehash: false,\n format: 'der'\n })\n })\n .catch(err => {\n if (err.name === 'AbortError') {\n throw err\n }\n\n throw new VerificationError(String(err))\n })\n }\n\n try {\n options?.signal?.throwIfAborted()\n return secp.verify(sig, p.digest, key, {\n prehash: false,\n format: 'der'\n })\n } catch (err) {\n throw new VerificationError(String(err))\n }\n}\n","import { InvalidPrivateKeyError, InvalidPublicKeyError } from '@libp2p/interface'\nimport { secp256k1 as secp } from '@noble/curves/secp256k1.js'\nimport { Secp256k1PublicKey as Secp256k1PublicKeyClass, Secp256k1PrivateKey as Secp256k1PrivateKeyClass } from './secp256k1.js'\nimport type { Secp256k1PublicKey, Secp256k1PrivateKey } from '@libp2p/interface'\n\nconst PRIVATE_KEY_BYTE_LENGTH = 32\n\nexport { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength }\n\nexport function unmarshalSecp256k1PrivateKey (bytes: Uint8Array): Secp256k1PrivateKey {\n return new Secp256k1PrivateKeyClass(bytes)\n}\n\nexport function unmarshalSecp256k1PublicKey (bytes: Uint8Array): Secp256k1PublicKey {\n return new Secp256k1PublicKeyClass(bytes)\n}\n\nexport async function generateSecp256k1KeyPair (): Promise<Secp256k1PrivateKey> {\n const privateKeyBytes = generateSecp256k1PrivateKey()\n return new Secp256k1PrivateKeyClass(privateKeyBytes)\n}\n\nexport function compressSecp256k1PublicKey (key: Uint8Array): Uint8Array {\n return secp.Point.fromBytes(key).toBytes()\n}\n\nexport function decompressSecp256k1PublicKey (key: Uint8Array): Uint8Array {\n return secp.Point.fromBytes(key).toBytes(false)\n}\n\nexport function validateSecp256k1PrivateKey (key: Uint8Array): Uint8Array {\n try {\n secp.getPublicKey(key, true)\n\n return key\n } catch (err) {\n throw new InvalidPrivateKeyError(String(err))\n }\n}\n\nexport function validateSecp256k1PublicKey (key: Uint8Array): Uint8Array {\n try {\n secp.Point.fromBytes(key)\n\n return key\n } catch (err) {\n throw new InvalidPublicKeyError(String(err))\n }\n}\n\nexport function computeSecp256k1PublicKey (privateKey: Uint8Array): Uint8Array {\n try {\n return secp.getPublicKey(privateKey, true)\n } catch (err) {\n throw new InvalidPrivateKeyError(String(err))\n }\n}\n\nexport function generateSecp256k1PrivateKey (): Uint8Array {\n return secp.utils.randomSecretKey()\n}\n","import { base58btc } from 'multiformats/bases/base58'\nimport { CID } from 'multiformats/cid'\nimport { identity } from 'multiformats/hashes/identity'\nimport { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport { publicKeyToProtobuf } from '../index.js'\nimport { validateSecp256k1PublicKey, compressSecp256k1PublicKey, computeSecp256k1PublicKey, validateSecp256k1PrivateKey } from './utils.js'\nimport { hashAndVerify, hashAndSign } from './index.js'\nimport type { Secp256k1PublicKey as Secp256k1PublicKeyInterface, Secp256k1PrivateKey as Secp256k1PrivateKeyInterface, AbortOptions } from '@libp2p/interface'\nimport type { Digest } from 'multiformats/hashes/digest'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nexport class Secp256k1PublicKey implements Secp256k1PublicKeyInterface {\n public readonly type = 'secp256k1'\n public readonly raw: Uint8Array\n public readonly _key: Uint8Array\n\n constructor (key: Uint8Array) {\n this._key = validateSecp256k1PublicKey(key)\n this.raw = compressSecp256k1PublicKey(this._key)\n }\n\n toMultihash (): Digest<0x0, number> {\n return identity.digest(publicKeyToProtobuf(this))\n }\n\n toCID (): CID<unknown, 114, 0x0, 1> {\n return CID.createV1(114, this.toMultihash())\n }\n\n toString (): string {\n return base58btc.encode(this.toMultihash().bytes).substring(1)\n }\n\n equals (key: any): boolean {\n if (key == null || !(key.raw instanceof Uint8Array)) {\n return false\n }\n\n return uint8ArrayEquals(this.raw, key.raw)\n }\n\n verify (data: Uint8Array | Uint8ArrayList, sig: Uint8Array, options?: AbortOptions): boolean {\n return hashAndVerify(this._key, sig, data, options)\n }\n}\n\nexport class Secp256k1PrivateKey implements Secp256k1PrivateKeyInterface {\n public readonly type = 'secp256k1'\n public readonly raw: Uint8Array\n public readonly publicKey: Secp256k1PublicKey\n\n constructor (key: Uint8Array, publicKey?: Uint8Array) {\n this.raw = validateSecp256k1PrivateKey(key)\n this.publicKey = new Secp256k1PublicKey(publicKey ?? computeSecp256k1PublicKey(key))\n }\n\n equals (key?: any): boolean {\n if (key == null || !(key.raw instanceof Uint8Array)) {\n return false\n }\n\n return uint8ArrayEquals(this.raw, key.raw)\n }\n\n sign (message: Uint8Array | Uint8ArrayList, options?: AbortOptions): Uint8Array | Promise<Uint8Array> {\n return hashAndSign(this.raw, message, options)\n }\n}\n","/**\n * @packageDocumentation\n *\n * ## Supported Key Types\n *\n * Currently the `'RSA'`, `'ed25519'`, and `secp256k1` types are supported, although ed25519 and secp256k1 keys support only signing and verification of messages.\n *\n * For encryption / decryption support, RSA keys should be used.\n */\n\nimport { InvalidParametersError, UnsupportedKeyTypeError } from '@libp2p/interface'\nimport { ECDSAPrivateKey as ECDSAPrivateKeyClass } from './ecdsa/ecdsa.js'\nimport { ECDSA_P_256_OID, ECDSA_P_384_OID, ECDSA_P_521_OID } from './ecdsa/index.js'\nimport { generateECDSAKeyPair, pkiMessageToECDSAPrivateKey, pkiMessageToECDSAPublicKey, unmarshalECDSAPrivateKey, unmarshalECDSAPublicKey } from './ecdsa/utils.js'\nimport { privateKeyLength as ed25519PrivateKeyLength, publicKeyLength as ed25519PublicKeyLength } from './ed25519/index.js'\nimport { generateEd25519KeyPair, generateEd25519KeyPairFromSeed, unmarshalEd25519PrivateKey, unmarshalEd25519PublicKey } from './ed25519/utils.js'\nimport * as pb from './keys.js'\nimport { decodeDer } from './rsa/der.js'\nimport { RSAES_PKCS1_V1_5_OID } from './rsa/index.js'\nimport { pkcs1ToRSAPrivateKey, pkixToRSAPublicKey, generateRSAKeyPair, pkcs1MessageToRSAPrivateKey, pkixMessageToRSAPublicKey, jwkToRSAPrivateKey } from './rsa/utils.js'\nimport { privateKeyLength as secp256k1PrivateKeyLength, publicKeyLength as secp256k1PublicKeyLength } from './secp256k1/index.js'\nimport { generateSecp256k1KeyPair, unmarshalSecp256k1PrivateKey, unmarshalSecp256k1PublicKey } from './secp256k1/utils.js'\nimport type { Curve } from './ecdsa/index.js'\nimport type { PrivateKey, PublicKey, KeyType, RSAPrivateKey, Secp256k1PrivateKey, Ed25519PrivateKey, Secp256k1PublicKey, Ed25519PublicKey, ECDSAPrivateKey, ECDSAPublicKey } from '@libp2p/interface'\nimport type { MultihashDigest } from 'multiformats'\nimport type { Digest } from 'multiformats/hashes/digest'\n\nexport { generateEphemeralKeyPair } from './ecdh/index.js'\nexport type { Curve } from './ecdh/index.js'\nexport type { ECDHKey, EnhancedKey, EnhancedKeyPair, ECDHKeyPair } from './interface.js'\nexport { keyStretcher } from './key-stretcher.js'\n\n/**\n * Generates a keypair of the given type and bitsize\n */\nexport async function generateKeyPair (type: 'Ed25519'): Promise<Ed25519PrivateKey>\nexport async function generateKeyPair (type: 'secp256k1'): Promise<Secp256k1PrivateKey>\nexport async function generateKeyPair (type: 'ECDSA', curve?: Curve): Promise<ECDSAPrivateKey>\nexport async function generateKeyPair (type: 'RSA', bits?: number): Promise<RSAPrivateKey>\nexport async function generateKeyPair (type: KeyType, bits?: number): Promise<PrivateKey>\nexport async function generateKeyPair (type: KeyType, bits?: number | string): Promise<unknown> {\n if (type === 'Ed25519') {\n return generateEd25519KeyPair()\n }\n\n if (type === 'secp256k1') {\n return generateSecp256k1KeyPair()\n }\n\n if (type === 'RSA') {\n return generateRSAKeyPair(toBits(bits))\n }\n\n if (type === 'ECDSA') {\n return generateECDSAKeyPair(toCurve(bits))\n }\n\n throw new UnsupportedKeyTypeError()\n}\n\n/**\n * Generates a keypair of the given type from the passed seed. Currently only\n * supports Ed25519 keys.\n *\n * Seed is a 32 byte uint8array\n */\nexport async function generateKeyPairFromSeed (type: 'Ed25519', seed: Uint8Array): Promise<Ed25519PrivateKey>\nexport async function generateKeyPairFromSeed <T extends KeyType> (type: T, seed: Uint8Array, bits?: number): Promise<never>\nexport async function generateKeyPairFromSeed (type: string, seed: Uint8Array): Promise<unknown> {\n if (type !== 'Ed25519') {\n throw new UnsupportedKeyTypeError('Seed key derivation only supported for Ed25519 keys')\n }\n\n return generateEd25519KeyPairFromSeed(seed)\n}\n\n/**\n * Converts a protobuf serialized public key into its representative object.\n *\n * For RSA public keys optionally pass the multihash digest of the public key if\n * it is known. If the digest is omitted it will be calculated which can be\n * expensive.\n *\n * For other key types the digest option is ignored.\n */\nexport function publicKeyFromProtobuf (buf: Uint8Array, digest?: Digest<18, number>): PublicKey {\n const { Type, Data } = pb.PublicKey.decode(buf)\n const data = Data ?? new Uint8Array()\n\n switch (Type) {\n case pb.KeyType.RSA:\n return pkixToRSAPublicKey(data, digest)\n case pb.KeyType.Ed25519:\n return unmarshalEd25519PublicKey(data)\n case pb.KeyType.secp256k1:\n return unmarshalSecp256k1PublicKey(data)\n case pb.KeyType.ECDSA:\n return unmarshalECDSAPublicKey(data)\n default:\n throw new UnsupportedKeyTypeError()\n }\n}\n\n/**\n * Creates a public key from the raw key bytes\n */\nexport function publicKeyFromRaw (buf: Uint8Array): PublicKey {\n if (buf.byteLength === ed25519PublicKeyLength) {\n return unmarshalEd25519PublicKey(buf)\n } else if (buf.byteLength === secp256k1PublicKeyLength) {\n return unmarshalSecp256k1PublicKey(buf)\n }\n\n const message = decodeDer(buf)\n const ecdsaOid = message[1]?.[0]\n\n if (ecdsaOid === ECDSA_P_256_OID || ecdsaOid === ECDSA_P_384_OID || ecdsaOid === ECDSA_P_521_OID) {\n return pkiMessageToECDSAPublicKey(message)\n }\n\n if (message[0]?.[0] === RSAES_PKCS1_V1_5_OID) {\n return pkixMessageToRSAPublicKey(message, buf)\n }\n\n throw new InvalidParametersError('Could not extract public key from raw bytes')\n}\n\n/**\n * Creates a public key from an identity multihash which contains a protobuf\n * encoded Ed25519 or secp256k1 public key.\n *\n * RSA keys are not supported as in practice we they are not stored in identity\n * multihash since the hash would be very large.\n */\nexport function publicKeyFromMultihash (digest: MultihashDigest<0x0>): Ed25519PublicKey | Secp256k1PublicKey | ECDSAPublicKey {\n const { Type, Data } = pb.PublicKey.decode(digest.digest)\n const data = Data ?? new Uint8Array()\n\n switch (Type) {\n case pb.KeyType.Ed25519:\n return unmarshalEd25519PublicKey(data)\n case pb.KeyType.secp256k1:\n return unmarshalSecp256k1PublicKey(data)\n case pb.KeyType.ECDSA:\n return unmarshalECDSAPublicKey(data)\n default:\n throw new UnsupportedKeyTypeError()\n }\n}\n\n/**\n * Converts a public key object into a protobuf serialized public key\n */\nexport function publicKeyToProtobuf (key: PublicKey): Uint8Array {\n return pb.PublicKey.encode({\n Type: pb.KeyType[key.type],\n Data: key.raw\n })\n}\n\n/**\n * Converts a protobuf serialized private key into its representative object\n */\nexport function privateKeyFromProtobuf (buf: Uint8Array): Ed25519PrivateKey | Secp256k1PrivateKey | RSAPrivateKey | ECDSAPrivateKey {\n const decoded = pb.PrivateKey.decode(buf)\n const data = decoded.Data ?? new Uint8Array()\n\n switch (decoded.Type) {\n case pb.KeyType.RSA:\n return pkcs1ToRSAPrivateKey(data)\n case pb.KeyType.Ed25519:\n return unmarshalEd25519PrivateKey(data)\n case pb.KeyType.secp256k1:\n return unmarshalSecp256k1PrivateKey(data)\n case pb.KeyType.ECDSA:\n return unmarshalECDSAPrivateKey(data)\n default:\n throw new UnsupportedKeyTypeError()\n }\n}\n\n/**\n * Creates a private key from the raw key bytes. For Ed25519 keys this requires\n * the public key to be appended to the private key otherwise we can't\n * differentiate between Ed25519 and secp256k1 keys as they are the same length.\n */\nexport function privateKeyFromRaw (buf: Uint8Array): PrivateKey {\n if (buf.byteLength === ed25519PrivateKeyLength) {\n return unmarshalEd25519PrivateKey(buf)\n } else if (buf.byteLength === secp256k1PrivateKeyLength) {\n return unmarshalSecp256k1PrivateKey(buf)\n }\n\n const message = decodeDer(buf)\n const ecdsaOid = message[2]?.[0]\n\n if (ecdsaOid === ECDSA_P_256_OID || ecdsaOid === ECDSA_P_384_OID || ecdsaOid === ECDSA_P_521_OID) {\n return pkiMessageToECDSAPrivateKey(message)\n }\n\n if (message.length > 8) {\n return pkcs1MessageToRSAPrivateKey(message)\n }\n\n throw new InvalidParametersError('Could not extract private key from raw bytes')\n}\n\n/**\n * Converts a private key object into a protobuf serialized private key\n */\nexport function privateKeyToProtobuf (key: PrivateKey): Uint8Array {\n return pb.PrivateKey.encode({\n Type: pb.KeyType[key.type],\n Data: key.raw\n })\n}\n\nfunction toBits (bits: any): number {\n if (bits == null) {\n return 2048\n }\n\n return parseInt(bits, 10)\n}\n\nfunction toCurve (curve: any): Curve {\n if (curve === 'P-256' || curve == null) {\n return 'P-256'\n }\n\n if (curve === 'P-384') {\n return 'P-384'\n }\n\n if (curve === 'P-521') {\n return 'P-521'\n }\n\n throw new InvalidParametersError('Unsupported curve, should be P-256, P-384 or P-521')\n}\n\n/**\n * Convert a libp2p RSA or ECDSA private key to a WebCrypto CryptoKeyPair\n */\nexport async function privateKeyToCryptoKeyPair (privateKey: PrivateKey): Promise<CryptoKeyPair> {\n if (privateKey.type === 'RSA') {\n return {\n privateKey: await crypto.subtle.importKey('jwk', privateKey.jwk, {\n name: 'RSASSA-PKCS1-v1_5',\n hash: { name: 'SHA-256' }\n }, true, ['sign']),\n publicKey: await crypto.subtle.importKey('jwk', privateKey.publicKey.jwk, {\n name: 'RSASSA-PKCS1-v1_5',\n hash: { name: 'SHA-256' }\n }, true, ['verify'])\n }\n }\n\n if (privateKey.type === 'ECDSA') {\n return {\n privateKey: await crypto.subtle.importKey('jwk', privateKey.jwk, {\n name: 'ECDSA',\n namedCurve: privateKey.jwk.crv ?? 'P-256'\n }, true, ['sign']),\n publicKey: await crypto.subtle.importKey('jwk', privateKey.publicKey.jwk, {\n name: 'ECDSA',\n namedCurve: privateKey.publicKey.jwk.crv ?? 'P-256'\n }, true, ['verify'])\n }\n }\n\n throw new InvalidParametersError('Only RSA and ECDSA keys are supported')\n}\n\n/**\n * Convert a RSA or ECDSA WebCrypto CryptoKeyPair to a libp2p private key\n */\nexport async function privateKeyFromCryptoKeyPair (keyPair: CryptoKeyPair): Promise<PrivateKey> {\n if (keyPair.privateKey.algorithm.name === 'RSASSA-PKCS1-v1_5') {\n const jwk = await crypto.subtle.exportKey('jwk', keyPair.privateKey)\n\n return jwkToRSAPrivateKey(jwk)\n }\n\n if (keyPair.privateKey.algorithm.name === 'ECDSA') {\n const jwk = await crypto.subtle.exportKey('jwk', keyPair.privateKey)\n\n return new ECDSAPrivateKeyClass(jwk)\n }\n\n throw new InvalidParametersError('Only RSA and ECDSA keys are supported')\n}\n","/**\n * @packageDocumentation\n *\n * An implementation of a peer id\n *\n * @example\n *\n * ```TypeScript\n * import { peerIdFromString } from '@libp2p/peer-id'\n * const peer = peerIdFromString('k51qzi5uqu5dkwkqm42v9j9kqcam2jiuvloi16g72i4i4amoo2m8u3ol3mqu6s')\n *\n * console.log(peer.toCID()) // CID(bafzaa...)\n * console.log(peer.toString()) // \"12D3K...\"\n * ```\n */\n\nimport { peerIdSymbol } from '@libp2p/interface'\nimport { base58btc } from 'multiformats/bases/base58'\nimport { CID } from 'multiformats/cid'\nimport { identity } from 'multiformats/hashes/identity'\nimport { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport type { Ed25519PeerId as Ed25519PeerIdInterface, PeerIdType, RSAPeerId as RSAPeerIdInterface, URLPeerId as URLPeerIdInterface, Secp256k1PeerId as Secp256k1PeerIdInterface, PeerId, PublicKey, Ed25519PublicKey, Secp256k1PublicKey, RSAPublicKey } from '@libp2p/interface'\nimport type { MultihashDigest } from 'multiformats/hashes/interface'\n\nconst inspect = Symbol.for('nodejs.util.inspect.custom')\n\n// these values are from https://github.com/multiformats/multicodec/blob/master/table.csv\nconst LIBP2P_KEY_CODE = 0x72\n\ninterface PeerIdInit <DigestCode extends number> {\n type: PeerIdType\n multihash: MultihashDigest<DigestCode>\n}\n\ninterface RSAPeerIdInit {\n multihash: MultihashDigest<0x12>\n publicKey?: RSAPublicKey\n}\n\ninterface Ed25519PeerIdInit {\n multihash: MultihashDigest<0x0>\n publicKey: Ed25519PublicKey\n}\n\ninterface Secp256k1PeerIdInit {\n multihash: MultihashDigest<0x0>\n publicKey: Secp256k1PublicKey\n}\n\nclass PeerIdImpl <DigestCode extends number> {\n public type: PeerIdType\n private readonly multihash: MultihashDigest<DigestCode>\n public readonly publicKey?: PublicKey\n private string?: string\n\n constructor (init: PeerIdInit<DigestCode>) {\n this.type = init.type\n this.multihash = init.multihash\n\n // mark string cache as non-enumerable\n Object.defineProperty(this, 'string', {\n enumerable: false,\n writable: true\n })\n }\n\n get [Symbol.toStringTag] (): string {\n return `PeerId(${this.toString()})`\n }\n\n readonly [peerIdSymbol] = true\n\n toString (): string {\n if (this.string == null) {\n this.string = base58btc.encode(this.multihash.bytes).slice(1)\n }\n\n return this.string\n }\n\n toMultihash (): MultihashDigest<DigestCode> {\n return this.multihash\n }\n\n // return self-describing String representation\n // in default format from RFC 0001: https://github.com/libp2p/specs/pull/209\n toCID (): CID<Uint8Array, 0x72, DigestCode, 1> {\n return CID.createV1(LIBP2P_KEY_CODE, this.multihash)\n }\n\n toJSON (): string {\n return this.toString()\n }\n\n /**\n * Checks the equality of `this` peer against a given PeerId\n */\n equals (id?: PeerId | Uint8Array | string): boolean {\n if (id == null) {\n return false\n }\n\n if (id instanceof Uint8Array) {\n return uint8ArrayEquals(this.multihash.bytes, id)\n } else if (typeof id === 'string') {\n return this.toString() === id\n } else if (id?.toMultihash()?.bytes != null) {\n return uint8ArrayEquals(this.multihash.bytes, id.toMultihash().bytes)\n } else {\n throw new Error('not valid Id')\n }\n }\n\n /**\n * Returns PeerId as a human-readable string\n * https://nodejs.org/api/util.html#utilinspectcustom\n *\n * @example\n * ```TypeScript\n * import { peerIdFromString } from '@libp2p/peer-id'\n *\n * console.info(peerIdFromString('QmFoo'))\n * // 'PeerId(QmFoo)'\n * ```\n */\n [inspect] (): string {\n return `PeerId(${this.toString()})`\n }\n}\n\nexport class RSAPeerId extends PeerIdImpl<0x12> implements RSAPeerIdInterface {\n public readonly type = 'RSA'\n public readonly publicKey?: RSAPublicKey\n\n constructor (init: RSAPeerIdInit) {\n super({ ...init, type: 'RSA' })\n\n this.publicKey = init.publicKey\n }\n}\n\nexport class Ed25519PeerId extends PeerIdImpl<0x0> implements Ed25519PeerIdInterface {\n public readonly type = 'Ed25519'\n public readonly publicKey: Ed25519PublicKey\n\n constructor (init: Ed25519PeerIdInit) {\n super({ ...init, type: 'Ed25519' })\n\n this.publicKey = init.publicKey\n }\n}\n\nexport class Secp256k1PeerId extends PeerIdImpl<0x0> implements Secp256k1PeerIdInterface {\n public readonly type = 'secp256k1'\n public readonly publicKey: Secp256k1PublicKey\n\n constructor (init: Secp256k1PeerIdInit) {\n super({ ...init, type: 'secp256k1' })\n\n this.publicKey = init.publicKey\n }\n}\n\n// these values are from https://github.com/multiformats/multicodec/blob/master/table.csv\nconst TRANSPORT_IPFS_GATEWAY_HTTP_CODE = 0x0920\n\nexport class URLPeerId implements URLPeerIdInterface {\n readonly type = 'url'\n readonly multihash: MultihashDigest<0x0>\n readonly publicKey: undefined\n readonly url: string\n\n constructor (url: URL) {\n this.url = url.toString()\n this.multihash = identity.digest(uint8ArrayFromString(this.url))\n }\n\n [inspect] (): string {\n return `PeerId(${this.url})`\n }\n\n readonly [peerIdSymbol] = true\n\n toString (): string {\n return this.toCID().toString()\n }\n\n toMultihash (): MultihashDigest<0x0> {\n return this.multihash\n }\n\n toCID (): CID<Uint8Array, 0x0920, 0x0, 1> {\n return CID.createV1(TRANSPORT_IPFS_GATEWAY_HTTP_CODE, this.toMultihash())\n }\n\n toJSON (): string {\n return this.toString()\n }\n\n equals (other?: PeerId | Uint8Array | string): boolean {\n if (other == null) {\n return false\n }\n\n if (other instanceof Uint8Array) {\n other = uint8ArrayToString(other)\n }\n\n return other.toString() === this.toString()\n }\n}\n","/**\n * @packageDocumentation\n *\n * An implementation of a peer id\n *\n * @example\n *\n * ```TypeScript\n * import { peerIdFromString } from '@libp2p/peer-id'\n * const peer = peerIdFromString('12D3KooWKnDdG3iXw9eTFijk3EWSunZcFi54Zka4wmtqtt6rPxc8')\n *\n * console.log(peer.toCID()) // CID(bafzaa...)\n * console.log(peer.toString()) // \"12D3K...\"\n * ```\n */\n\nimport { publicKeyFromMultihash } from '@libp2p/crypto/keys'\nimport { InvalidCIDError, InvalidMultihashError, InvalidParametersError, UnsupportedKeyTypeError } from '@libp2p/interface'\nimport { base58btc } from 'multiformats/bases/base58'\nimport { CID } from 'multiformats/cid'\nimport * as Digest from 'multiformats/hashes/digest'\nimport { identity } from 'multiformats/hashes/identity'\nimport { sha256 } from 'multiformats/hashes/sha2'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport { RSAPeerId as RSAPeerIdClass, Ed25519PeerId as Ed25519PeerIdClass, Secp256k1PeerId as Secp256k1PeerIdClass, URLPeerId as URLPeerIdClass } from './peer-id.js'\nimport type { Ed25519PeerId, RSAPeerId, URLPeerId, Secp256k1PeerId, PeerId, PublicKey, Ed25519PublicKey, Secp256k1PublicKey, RSAPublicKey, Ed25519PrivateKey, Secp256k1PrivateKey, RSAPrivateKey, PrivateKey } from '@libp2p/interface'\nimport type { MultibaseDecoder } from 'multiformats/cid'\nimport type { MultihashDigest } from 'multiformats/hashes/interface'\n\n// these values are from https://github.com/multiformats/multicodec/blob/master/table.csv\nconst LIBP2P_KEY_CODE = 0x72\nconst TRANSPORT_IPFS_GATEWAY_HTTP_CODE = 0x0920\n\nexport function peerIdFromString (str: string, decoder?: MultibaseDecoder<any>): Ed25519PeerId | Secp256k1PeerId | RSAPeerId | URLPeerId {\n let multihash: MultihashDigest\n\n if (str.charAt(0) === '1' || str.charAt(0) === 'Q') {\n // identity hash ed25519/secp256k1 key or sha2-256 hash of\n // rsa public key - base58btc encoded either way\n multihash = Digest.decode(base58btc.decode(`z${str}`))\n } else if (str.startsWith('k51qzi5uqu5') || str.startsWith('kzwfwjn5ji4') || str.startsWith('k2k4r8') || str.startsWith('bafz')) {\n // base36 encoded CIDv1 with libp2p-key and identity hash (for ed25519/secp256k1/rsa) or base32 encoded CIDv1 with libp2p-key and identity hash (for ed25519/secp256k1/rsa)\n return peerIdFromCID(CID.parse(str))\n } else {\n if (decoder == null) {\n throw new InvalidParametersError('Please pass a multibase decoder for strings that do not start with \"1\" or \"Q\"')\n }\n\n multihash = Digest.decode(decoder.decode(str))\n }\n\n return peerIdFromMultihash(multihash)\n}\n\nexport function peerIdFromPublicKey (publicKey: Ed25519PublicKey): Ed25519PeerId\nexport function peerIdFromPublicKey (publicKey: Secp256k1PublicKey): Secp256k1PeerId\nexport function peerIdFromPublicKey (publicKey: RSAPublicKey): RSAPeerId\nexport function peerIdFromPublicKey (publicKey: PublicKey): PeerId\nexport function peerIdFromPublicKey (publicKey: PublicKey): PeerId {\n if (publicKey.type === 'Ed25519') {\n return new Ed25519PeerIdClass({\n multihash: publicKey.toCID().multihash,\n publicKey\n })\n } else if (publicKey.type === 'secp256k1') {\n return new Secp256k1PeerIdClass({\n multihash: publicKey.toCID().multihash,\n publicKey\n })\n } else if (publicKey.type === 'RSA') {\n return new RSAPeerIdClass({\n multihash: publicKey.toCID().multihash,\n publicKey\n })\n }\n\n throw new UnsupportedKeyTypeError()\n}\n\nexport function peerIdFromPrivateKey (privateKey: Ed25519PrivateKey): Ed25519PeerId\nexport function peerIdFromPrivateKey (privateKey: Secp256k1PrivateKey): Secp256k1PeerId\nexport function peerIdFromPrivateKey (privateKey: RSAPrivateKey): RSAPeerId\nexport function peerIdFromPrivateKey (privateKey: PrivateKey): PeerId\nexport function peerIdFromPrivateKey (privateKey: PrivateKey): PeerId {\n return peerIdFromPublicKey(privateKey.publicKey)\n}\n\nexport function peerIdFromMultihash (multihash: MultihashDigest): PeerId {\n if (isSha256Multihash(multihash)) {\n return new RSAPeerIdClass({ multihash })\n } else if (isIdentityMultihash(multihash)) {\n try {\n const publicKey = publicKeyFromMultihash(multihash)\n\n if (publicKey.type === 'Ed25519') {\n return new Ed25519PeerIdClass({ multihash, publicKey })\n } else if (publicKey.type === 'secp256k1') {\n return new Secp256k1PeerIdClass({ multihash, publicKey })\n }\n } catch (err) {\n // was not Ed or secp key, try URL\n const url = uint8ArrayToString(multihash.digest)\n\n return new URLPeerIdClass(new URL(url))\n }\n }\n\n throw new InvalidMultihashError('Supplied PeerID Multihash is invalid')\n}\n\nexport function peerIdFromCID (cid: CID): Ed25519PeerId | Secp256k1PeerId | RSAPeerId | URLPeerId {\n if (cid?.multihash == null || cid.version == null || (cid.version === 1 && (cid.code !== LIBP2P_KEY_CODE) && cid.code !== TRANSPORT_IPFS_GATEWAY_HTTP_CODE)) {\n throw new InvalidCIDError('Supplied PeerID CID is invalid')\n }\n\n if (cid.code === TRANSPORT_IPFS_GATEWAY_HTTP_CODE) {\n const url = uint8ArrayToString(cid.multihash.digest)\n\n return new URLPeerIdClass(new URL(url))\n }\n\n return peerIdFromMultihash(cid.multihash)\n}\n\nfunction isIdentityMultihash (multihash: MultihashDigest): multihash is MultihashDigest<0x0> {\n return multihash.code === identity.code\n}\n\nfunction isSha256Multihash (multihash: MultihashDigest): multihash is MultihashDigest<0x12> {\n return multihash.code === sha256.code\n}\n","/**\n * Thrown when an invalid multiaddr is encountered\n */\nexport class InvalidMultiaddrError extends Error {\n static name = 'InvalidMultiaddrError'\n name = 'InvalidMultiaddrError'\n}\n\nexport class ValidationError extends Error {\n static name = 'ValidationError'\n name = 'ValidationError'\n}\n\nexport class InvalidParametersError extends Error {\n static name = 'InvalidParametersError'\n name = 'InvalidParametersError'\n}\n\nexport class UnknownProtocolError extends Error {\n static name = 'UnknownProtocolError'\n name = 'UnknownProtocolError'\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-return */\n\n// Heavily inspired by https://doc.rust-lang.org/src/std/net/parser.rs.html\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Fn = (...foo: any) => any;\n\nexport class Parser {\n private index = 0;\n private input = \"\";\n\n new(input: string): this {\n this.index = 0;\n this.input = input;\n return this;\n }\n\n /** Run a parser, and restore the pre-parse state if it fails. */\n readAtomically<T extends Fn>(fn: T): ReturnType<T> {\n const index = this.index;\n const result = fn();\n if (result === undefined) {\n this.index = index;\n }\n return result;\n }\n\n /** Run a parser, but fail if the entire input wasn't consumed. Doesn't run atomically. */\n parseWith<T extends Fn>(fn: T): ReturnType<T> | undefined {\n const result = fn();\n if (this.index !== this.input.length) {\n return undefined;\n }\n return result;\n }\n\n /** Peek the next character from the input */\n peekChar(): string | undefined {\n if (this.index >= this.input.length) {\n return undefined;\n }\n return this.input[this.index];\n }\n\n /** Read the next character from the input */\n readChar(): string | undefined {\n if (this.index >= this.input.length) {\n return undefined;\n }\n return this.input[this.index++];\n }\n\n /** Read the next character from the input if it matches the target. */\n readGivenChar(target: string): string | undefined {\n return this.readAtomically(() => {\n const char = this.readChar();\n if (char !== target) {\n return undefined;\n }\n return char;\n });\n }\n\n /**\n * Helper for reading separators in an indexed loop. Reads the separator\n * character iff index > 0, then runs the parser. When used in a loop,\n * the separator character will only be read on index > 0 (see\n * readIPv4Addr for an example)\n */\n readSeparator<T extends Fn>(sep: string, index: number, inner: T): ReturnType<T> {\n return this.readAtomically(() => {\n if (index > 0) {\n if (this.readGivenChar(sep) === undefined) {\n return undefined;\n }\n }\n return inner();\n });\n }\n\n /**\n * Read a number off the front of the input in the given radix, stopping\n * at the first non-digit character or eof. Fails if the number has more\n * digits than max_digits or if there is no number.\n */\n readNumber(\n radix: number,\n maxDigits: number | undefined,\n allowZeroPrefix: boolean,\n maxBytes: number\n ): number | undefined {\n return this.readAtomically(() => {\n let result = 0;\n let digitCount = 0;\n\n const leadingChar = this.peekChar();\n if (leadingChar === undefined) {\n return undefined;\n }\n const hasLeadingZero = leadingChar === \"0\";\n const maxValue = 2 ** (8 * maxBytes) - 1;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const digit = this.readAtomically(() => {\n const char = this.readChar();\n if (char === undefined) {\n return undefined;\n }\n const num = Number.parseInt(char, radix);\n if (Number.isNaN(num)) {\n return undefined;\n }\n return num;\n });\n if (digit === undefined) {\n break;\n }\n result *= radix;\n result += digit;\n if (result > maxValue) {\n return undefined;\n }\n digitCount += 1;\n if (maxDigits !== undefined) {\n if (digitCount > maxDigits) {\n return undefined;\n }\n }\n }\n\n if (digitCount === 0) {\n return undefined;\n } else if (!allowZeroPrefix && hasLeadingZero && digitCount > 1) {\n return undefined;\n } else {\n return result;\n }\n });\n }\n\n /** Read an IPv4 address. */\n readIPv4Addr(): Uint8Array | undefined {\n return this.readAtomically(() => {\n const out = new Uint8Array(4);\n\n for (let i = 0; i < out.length; i++) {\n const ix = this.readSeparator(\".\", i, () => this.readNumber(10, 3, false, 1));\n if (ix === undefined) {\n return undefined;\n }\n out[i] = ix;\n }\n\n return out;\n });\n }\n\n /** Read an IPv6 Address. */\n readIPv6Addr(): Uint8Array | undefined {\n /**\n * Read a chunk of an IPv6 address into `groups`. Returns the number\n * of groups read, along with a bool indicating if an embedded\n * trailing IPv4 address was read. Specifically, read a series of\n * colon-separated IPv6 groups (0x0000 - 0xFFFF), with an optional\n * trailing embedded IPv4 address.\n */\n const readGroups = (groups: Uint8Array): [number, boolean] => {\n for (let i = 0; i < groups.length / 2; i++) {\n const ix = i * 2;\n // Try to read a trailing embedded IPv4 address. There must be at least 4 groups left.\n if (i < groups.length - 3) {\n const ipv4 = this.readSeparator(\":\", i, () => this.readIPv4Addr());\n if (ipv4 !== undefined) {\n groups[ix] = ipv4[0];\n groups[ix + 1] = ipv4[1];\n groups[ix + 2] = ipv4[2];\n groups[ix + 3] = ipv4[3];\n\n return [ix + 4, true];\n }\n }\n\n const group = this.readSeparator(\":\", i, () => this.readNumber(16, 4, true, 2));\n if (group === undefined) {\n return [ix, false];\n }\n groups[ix] = group >> 8;\n groups[ix + 1] = group & 255;\n }\n return [groups.length, false];\n };\n\n return this.readAtomically(() => {\n // Read the front part of the address; either the whole thing, or up to the first ::\n const head = new Uint8Array(16);\n const [headSize, headIp4] = readGroups(head);\n\n if (headSize === 16) {\n return head;\n }\n\n // IPv4 part is not allowed before `::`\n if (headIp4) {\n return undefined;\n }\n\n // Read `::` if previous code parsed less than 8 groups.\n // `::` indicates one or more groups of 16 bits of zeros.\n if (this.readGivenChar(\":\") === undefined) {\n return undefined;\n }\n if (this.readGivenChar(\":\") === undefined) {\n return undefined;\n }\n\n // Read the back part of the address. The :: must contain at least one\n // set of zeroes, so our max length is 7.\n const tail = new Uint8Array(14);\n const limit = 16 - (headSize + 2);\n const [tailSize] = readGroups(tail.subarray(0, limit));\n\n // Concat the head and tail of the IP address\n head.set(tail.subarray(0, tailSize), 16 - tailSize);\n\n return head;\n });\n }\n\n /** Read an IP Address, either IPv4 or IPv6. */\n readIPAddr(): Uint8Array | undefined {\n return this.readIPv4Addr() ?? this.readIPv6Addr();\n }\n}\n","import { Parser } from \"./parser.js\";\n\n// See https://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address\nconst MAX_IPV6_LENGTH = 45;\nconst MAX_IPV4_LENGTH = 15;\n\nconst parser = new Parser();\n\n/** Parse `input` into IPv4 bytes. */\nexport function parseIPv4(input: string): Uint8Array | undefined {\n if (input.length > MAX_IPV4_LENGTH) {\n return undefined;\n }\n return parser.new(input).parseWith(() => parser.readIPv4Addr());\n}\n\n/** Parse IPv4 `input` into IPv6 with IPv4-mapped bytes, eg ::ffff:1.2.3.4 */\nexport function parseIPv4Mapped(input: string): Uint8Array | undefined {\n if (input.length > MAX_IPV4_LENGTH) {\n return undefined;\n }\n\n const ipv4 = parser.new(input).parseWith(() => parser.readIPv4Addr());\n if (ipv4 === undefined) {\n return undefined;\n }\n\n return Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, ipv4[0], ipv4[1], ipv4[2], ipv4[3]]);\n}\n\n/** Parse `input` into IPv6 bytes. */\nexport function parseIPv6(input: string): Uint8Array | undefined {\n // strip zone index if it is present\n if (input.includes(\"%\")) {\n input = input.split(\"%\")[0];\n }\n if (input.length > MAX_IPV6_LENGTH) {\n return undefined;\n }\n return parser.new(input).parseWith(() => parser.readIPv6Addr());\n}\n\n/** Parse `input` into IPv4 or IPv6 bytes. */\nexport function parseIP(input: string, mapIPv4ToIPv6 = false): Uint8Array | undefined {\n // strip zone index if it is present\n if (input.includes(\"%\")) {\n input = input.split(\"%\")[0];\n }\n\n if (input.length > MAX_IPV6_LENGTH) {\n return undefined;\n }\n\n const addr = parser.new(input).parseWith(() => parser.readIPAddr());\n if (!addr) {\n return undefined;\n }\n\n if (mapIPv4ToIPv6 && addr.length === 4) {\n return Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, addr[0], addr[1], addr[2], addr[3]]);\n }\n\n return addr;\n}\n","import { parseIP, parseIPv4, parseIPv6 } from \"./parse.js\";\n\n/** Check if `input` is IPv4. */\nexport function isIPv4(input: string): boolean {\n return Boolean(parseIPv4(input));\n}\n\n/** Check if `input` is IPv6. */\nexport function isIPv6(input: string): boolean {\n return Boolean(parseIPv6(input));\n}\n\n/** Check if `input` is IPv4 or IPv6. */\nexport function isIP(input: string): boolean {\n return Boolean(parseIP(input));\n}\n\n/**\n * @returns `6` if `input` is IPv6, `4` if `input` is IPv4, or `undefined` if `input` is neither.\n */\nexport function ipVersion(input: string): 4 | 6 | undefined {\n if (isIPv4(input)) {\n return 4;\n } else if (isIPv6(input)) {\n return 6;\n } else {\n return undefined;\n }\n}\n","// the values here come from https://github.com/multiformats/multiaddr/blob/master/protocols.csv\n\nexport const CODE_IP4 = 4\nexport const CODE_TCP = 6\nexport const CODE_UDP = 273\nexport const CODE_DCCP = 33\nexport const CODE_IP6 = 41\nexport const CODE_IP6ZONE = 42\nexport const CODE_IPCIDR = 43\nexport const CODE_DNS = 53\nexport const CODE_DNS4 = 54\nexport const CODE_DNS6 = 55\nexport const CODE_DNSADDR = 56\nexport const CODE_SCTP = 132\nexport const CODE_UDT = 301\nexport const CODE_UTP = 302\nexport const CODE_UNIX = 400\nexport const CODE_P2P = 421 // also IPFS\nexport const CODE_ONION = 444\nexport const CODE_ONION3 = 445\nexport const CODE_GARLIC64 = 446\nexport const CODE_GARLIC32 = 447\nexport const CODE_TLS = 448\nexport const CODE_SNI = 449\nexport const CODE_NOISE = 454\nexport const CODE_QUIC = 460\nexport const CODE_QUIC_V1 = 461\nexport const CODE_WEBTRANSPORT = 465\nexport const CODE_CERTHASH = 466\nexport const CODE_HTTP = 480\nexport const CODE_HTTP_PATH = 481\nexport const CODE_HTTPS = 443\nexport const CODE_WS = 477\nexport const CODE_WSS = 478\nexport const CODE_P2P_WEBSOCKET_STAR = 479\nexport const CODE_P2P_STARDUST = 277\nexport const CODE_P2P_WEBRTC_STAR = 275\nexport const CODE_P2P_WEBRTC_DIRECT = 276\nexport const CODE_WEBRTC_DIRECT = 280\nexport const CODE_WEBRTC = 281\nexport const CODE_P2P_CIRCUIT = 290\nexport const CODE_MEMORY = 777\n","import { isIPv4 } from '@chainsafe/is-ip'\nimport { base32 } from 'multiformats/bases/base32'\nimport { bases } from 'multiformats/basics'\nimport { concat as uint8ArrayConcat } from 'uint8arrays/concat'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport { InvalidMultiaddrError } from './errors.ts'\nimport type { MultibaseCodec } from 'multiformats'\nimport type { SupportedEncodings } from 'uint8arrays/to-string'\n\nexport function bytesToString (base: SupportedEncodings): (buf: Uint8Array) => string {\n return (buf) => {\n return uint8ArrayToString(buf, base)\n }\n}\n\nexport function stringToBytes (base: SupportedEncodings): (value: string) => Uint8Array {\n return (buf) => {\n return uint8ArrayFromString(buf, base)\n }\n}\n\nexport function bytes2port (buf: Uint8Array): string {\n const view = new DataView(buf.buffer)\n return view.getUint16(buf.byteOffset).toString()\n}\n\nexport function port2bytes (port: string | number): Uint8Array {\n const buf = new ArrayBuffer(2)\n const view = new DataView(buf)\n view.setUint16(0, typeof port === 'string' ? parseInt(port) : port)\n\n return new Uint8Array(buf)\n}\n\nexport function onion2bytes (str: string): Uint8Array {\n const addr = str.split(':')\n\n if (addr.length !== 2) {\n throw new Error(`failed to parse onion addr: [\"'${addr.join('\", \"')}'\"]' does not contain a port number`)\n }\n\n if (addr[0].length !== 16) {\n throw new Error(`failed to parse onion addr: ${addr[0]} not a Tor onion address.`)\n }\n\n // onion addresses do not include the multibase prefix, add it before decoding\n const buf = uint8ArrayFromString(addr[0], 'base32')\n\n // onion port number\n const port = parseInt(addr[1], 10)\n\n if (port < 1 || port > 65536) {\n throw new Error('Port number is not in range(1, 65536)')\n }\n\n const portBuf = port2bytes(port)\n\n return uint8ArrayConcat([buf, portBuf], buf.length + portBuf.length)\n}\n\nexport function onion32bytes (str: string): Uint8Array {\n const addr = str.split(':')\n\n if (addr.length !== 2) {\n throw new Error(`failed to parse onion addr: [\"'${addr.join('\", \"')}'\"]' does not contain a port number`)\n }\n\n if (addr[0].length !== 56) {\n throw new Error(`failed to parse onion addr: ${addr[0]} not a Tor onion3 address.`)\n }\n\n // onion addresses do not include the multibase prefix, add it before decoding\n const buf = base32.decode(`b${addr[0]}`)\n\n // onion port number\n const port = parseInt(addr[1], 10)\n\n if (port < 1 || port > 65536) {\n throw new Error('Port number is not in range(1, 65536)')\n }\n\n const portBuf = port2bytes(port)\n\n return uint8ArrayConcat([buf, portBuf], buf.length + portBuf.length)\n}\n\nexport function bytes2onion (buf: Uint8Array): string {\n const addrBytes = buf.subarray(0, buf.length - 2)\n const portBytes = buf.subarray(buf.length - 2)\n const addr = uint8ArrayToString(addrBytes, 'base32')\n const port = bytes2port(portBytes)\n return `${addr}:${port}`\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L7\n// but with buf/offset args removed because we don't use them\nexport const ip4ToBytes = function (ip: string): Uint8Array {\n ip = ip.toString().trim()\n\n const bytes = new Uint8Array(4)\n\n ip.split(/\\./g).forEach((byte, index) => {\n const value = parseInt(byte, 10)\n\n if (isNaN(value) || value < 0 || value > 0xff) {\n throw new InvalidMultiaddrError('Invalid byte value in IP address')\n }\n\n bytes[index] = value\n })\n\n return bytes\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L7\n// but with buf/offset args removed because we don't use them\nexport const ip6ToBytes = function (ip: string): Uint8Array {\n let offset = 0\n ip = ip.toString().trim()\n\n const sections = ip.split(':', 8)\n\n let i\n for (i = 0; i < sections.length; i++) {\n const isv4 = isIPv4(sections[i])\n let v4Buffer: Uint8Array | undefined\n\n if (isv4) {\n v4Buffer = ip4ToBytes(sections[i])\n sections[i] = uint8ArrayToString(v4Buffer.subarray(0, 2), 'base16')\n }\n\n if (v4Buffer != null && ++i < 8) {\n sections.splice(i, 0, uint8ArrayToString(v4Buffer.subarray(2, 4), 'base16'))\n }\n }\n\n if (sections[0] === '') {\n while (sections.length < 8) { sections.unshift('0') }\n } else if (sections[sections.length - 1] === '') {\n while (sections.length < 8) { sections.push('0') }\n } else if (sections.length < 8) {\n for (i = 0; i < sections.length && sections[i] !== ''; i++) { }\n const argv: [number, number, ...string[]] = [i, 1]\n for (i = 9 - sections.length; i > 0; i--) {\n argv.push('0')\n }\n sections.splice.apply(sections, argv)\n }\n\n const bytes = new Uint8Array(offset + 16)\n\n for (i = 0; i < sections.length; i++) {\n if (sections[i] === '') {\n sections[i] = '0'\n }\n\n const word = parseInt(sections[i], 16)\n\n if (isNaN(word) || word < 0 || word > 0xffff) {\n throw new InvalidMultiaddrError('Invalid byte value in IP address')\n }\n\n bytes[offset++] = (word >> 8) & 0xff\n bytes[offset++] = word & 0xff\n }\n\n return bytes\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L63\nexport const ip4ToString = function (buf: Uint8Array): string {\n if (buf.byteLength !== 4) {\n throw new InvalidMultiaddrError('IPv4 address was incorrect length')\n }\n\n const result = []\n\n for (let i = 0; i < buf.byteLength; i++) {\n result.push(buf[i])\n }\n\n return result.join('.')\n}\n\nexport const ip6ToString = function (buf: Uint8Array): string {\n if (buf.byteLength !== 16) {\n throw new InvalidMultiaddrError('IPv6 address was incorrect length')\n }\n\n const result: string[] = []\n\n for (let i = 0; i < buf.byteLength; i += 2) {\n const byte1 = buf[i]\n const byte2 = buf[i + 1]\n\n const tuple = `${byte1.toString(16).padStart(2, '0')}${byte2.toString(16).padStart(2, '0')}`\n\n result.push(tuple)\n }\n\n const ip = result.join(':')\n\n try {\n const url = new URL(`http://[${ip}]`)\n\n return url.hostname.substring(1, url.hostname.length - 1)\n } catch {\n throw new InvalidMultiaddrError(`Invalid IPv6 address \"${ip}\"`)\n }\n}\n\nexport function ip6StringToValue (str: string): string {\n try {\n const url = new URL(`http://[${str}]`)\n\n return url.hostname.substring(1, url.hostname.length - 1)\n } catch {\n throw new InvalidMultiaddrError(`Invalid IPv6 address \"${str}\"`)\n }\n}\n\nconst decoders = Object.values(bases).map((c) => c.decoder)\nconst anybaseDecoder = (function () {\n let acc = decoders[0].or(decoders[1])\n decoders.slice(2).forEach((d) => (acc = acc.or(d)))\n return acc\n})()\n\nexport function mb2bytes (mbstr: string): Uint8Array {\n return anybaseDecoder.decode(mbstr)\n}\n\nexport function bytes2mb (base: MultibaseCodec<any>): (buf: Uint8Array) => string {\n return (buf) => {\n return base.encoder.encode(buf)\n }\n}\n","import { ValidationError } from './errors.ts'\n\nexport function integer (value: string): void {\n const int = parseInt(value)\n\n if (int.toString() !== value) {\n throw new ValidationError('Value must be an integer')\n }\n}\n\nexport function positive (value: any): void {\n if (value < 0) {\n throw new ValidationError('Value must be a positive integer, or zero')\n }\n}\n\nexport function maxValue (max: number): (value: any) => void {\n return (value) => {\n if (value > max) {\n throw new ValidationError(`Value must be smaller than or equal to ${max}`)\n }\n }\n}\n\nexport function validate (...funcs: Array<(value: string) => void>): (value: string) => void {\n return (value) => {\n for (const fn of funcs) {\n fn(value)\n }\n }\n}\n\nexport const validatePort = validate(\n integer,\n positive,\n maxValue(65_535)\n)\n","import { isIPv4, isIPv6 } from '@chainsafe/is-ip'\nimport { CID } from 'multiformats'\nimport { base64url } from 'multiformats/bases/base64'\nimport { CODE_CERTHASH, CODE_DCCP, CODE_DNS, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, CODE_GARLIC32, CODE_GARLIC64, CODE_HTTP, CODE_HTTP_PATH, CODE_HTTPS, CODE_IP4, CODE_IP6, CODE_IP6ZONE, CODE_IPCIDR, CODE_MEMORY, CODE_NOISE, CODE_ONION, CODE_ONION3, CODE_P2P, CODE_P2P_CIRCUIT, CODE_P2P_STARDUST, CODE_P2P_WEBRTC_DIRECT, CODE_P2P_WEBRTC_STAR, CODE_P2P_WEBSOCKET_STAR, CODE_QUIC, CODE_QUIC_V1, CODE_SCTP, CODE_SNI, CODE_TCP, CODE_TLS, CODE_UDP, CODE_UDT, CODE_UNIX, CODE_UTP, CODE_WEBRTC, CODE_WEBRTC_DIRECT, CODE_WEBTRANSPORT, CODE_WS, CODE_WSS } from './constants.ts'\nimport { UnknownProtocolError, ValidationError } from './errors.ts'\nimport { bytes2mb, bytes2onion, bytes2port, bytesToString, ip4ToBytes, ip4ToString, ip6StringToValue, ip6ToBytes, ip6ToString, mb2bytes, onion2bytes, onion32bytes, port2bytes, stringToBytes } from './utils.ts'\nimport { validatePort } from './validation.ts'\nimport type { Registry as RegistryInterface } from './index.ts'\n\nexport const V = -1\n\nexport interface ProtocolCodec {\n /**\n * A numeric code that will be used in the binary representation of the tuple.\n */\n code: number\n\n /**\n * A string name that will be used in the string representation of the addr.\n */\n name: string\n\n /**\n * Size defines the expected length of the address part of the tuple - valid\n * values are `-1` (or the `V` constant) for variable length (this will be\n * varint encoded in the binary representation), `0` for no address part or a\n * number that represents a fixed-length address.\n */\n size?: number\n\n /**\n * If specified this protocol codec will also be used to decode tuples with\n * these names from string multiaddrs.\n */\n aliases?: string[]\n\n /**\n * Where the multiaddr has been encoded as a string, decode the value if\n * necessary, unescaping any escaped values\n */\n stringToValue?(value: string): string\n\n /**\n * To encode the multiaddr as a string, escape any necessary values\n */\n valueToString?(value: string): string\n\n /**\n * To encode the multiaddr as bytes, convert the value to bytes\n */\n valueToBytes?(value: string): Uint8Array\n\n /**\n * To decode bytes to a multiaddr, convert the value bytes to a string\n */\n bytesToValue?(bytes: Uint8Array): string\n\n /**\n * Perform any necessary validation on the string value\n */\n validate?(value: string): void\n}\n\nclass Registry implements RegistryInterface {\n private protocolsByCode = new Map<number, ProtocolCodec>()\n private protocolsByName = new Map<string, ProtocolCodec>()\n\n getProtocol (key: string | number): ProtocolCodec {\n let codec: ProtocolCodec | undefined\n\n if (typeof key === 'string') {\n codec = this.protocolsByName.get(key)\n } else {\n codec = this.protocolsByCode.get(key)\n }\n\n if (codec == null) {\n throw new UnknownProtocolError(`Protocol ${key} was unknown`)\n }\n\n return codec\n }\n\n addProtocol (codec: ProtocolCodec): void {\n this.protocolsByCode.set(codec.code, codec)\n this.protocolsByName.set(codec.name, codec)\n\n codec.aliases?.forEach(alias => {\n this.protocolsByName.set(alias, codec)\n })\n }\n\n removeProtocol (code: number): void {\n const codec = this.protocolsByCode.get(code)\n\n if (codec == null) {\n return\n }\n\n this.protocolsByCode.delete(codec.code)\n this.protocolsByName.delete(codec.name)\n\n codec.aliases?.forEach(alias => {\n this.protocolsByName.delete(alias)\n })\n }\n}\n\nexport const registry = new Registry()\n\nconst codecs: ProtocolCodec[] = [{\n code: CODE_IP4,\n name: 'ip4',\n size: 32,\n valueToBytes: ip4ToBytes,\n bytesToValue: ip4ToString,\n validate: (value) => {\n if (!isIPv4(value)) {\n throw new ValidationError(`Invalid IPv4 address \"${value}\"`)\n }\n }\n}, {\n code: CODE_TCP,\n name: 'tcp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_UDP,\n name: 'udp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_DCCP,\n name: 'dccp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_IP6,\n name: 'ip6',\n size: 128,\n valueToBytes: ip6ToBytes,\n bytesToValue: ip6ToString,\n stringToValue: ip6StringToValue,\n validate: (value) => {\n if (!isIPv6(value)) {\n throw new ValidationError(`Invalid IPv6 address \"${value}\"`)\n }\n }\n}, {\n code: CODE_IP6ZONE,\n name: 'ip6zone',\n size: V\n}, {\n code: CODE_IPCIDR,\n name: 'ipcidr',\n size: 8,\n bytesToValue: bytesToString('base10'),\n valueToBytes: stringToBytes('base10')\n}, {\n code: CODE_DNS,\n name: 'dns',\n size: V\n}, {\n code: CODE_DNS4,\n name: 'dns4',\n size: V\n}, {\n code: CODE_DNS6,\n name: 'dns6',\n size: V\n}, {\n code: CODE_DNSADDR,\n name: 'dnsaddr',\n size: V\n}, {\n code: CODE_SCTP,\n name: 'sctp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_UDT,\n name: 'udt'\n}, {\n code: CODE_UTP,\n name: 'utp'\n}, {\n code: CODE_UNIX,\n name: 'unix',\n size: V,\n stringToValue: (str) => decodeURIComponent(str),\n valueToString: (val) => encodeURIComponent(val)\n}, {\n code: CODE_P2P,\n name: 'p2p',\n aliases: ['ipfs'],\n size: V,\n bytesToValue: bytesToString('base58btc'),\n valueToBytes: (val) => {\n if (val.startsWith('Q') || val.startsWith('1')) {\n return stringToBytes('base58btc')(val)\n }\n\n return CID.parse(val).multihash.bytes\n }\n}, {\n code: CODE_ONION,\n name: 'onion',\n size: 96,\n bytesToValue: bytes2onion,\n valueToBytes: onion2bytes\n}, {\n code: CODE_ONION3,\n name: 'onion3',\n size: 296,\n bytesToValue: bytes2onion,\n valueToBytes: onion32bytes\n}, {\n code: CODE_GARLIC64,\n name: 'garlic64',\n size: V\n}, {\n code: CODE_GARLIC32,\n name: 'garlic32',\n size: V\n}, {\n code: CODE_TLS,\n name: 'tls'\n}, {\n code: CODE_SNI,\n name: 'sni',\n size: V\n}, {\n code: CODE_NOISE,\n name: 'noise'\n}, {\n code: CODE_QUIC,\n name: 'quic'\n}, {\n code: CODE_QUIC_V1,\n name: 'quic-v1'\n}, {\n code: CODE_WEBTRANSPORT,\n name: 'webtransport'\n}, {\n code: CODE_CERTHASH,\n name: 'certhash',\n size: V,\n bytesToValue: bytes2mb(base64url),\n valueToBytes: mb2bytes\n}, {\n code: CODE_HTTP,\n name: 'http'\n}, {\n code: CODE_HTTP_PATH,\n name: 'http-path',\n size: V,\n stringToValue: (str) => `/${decodeURIComponent(str)}`,\n valueToString: (val) => encodeURIComponent(val.substring(1))\n}, {\n code: CODE_HTTPS,\n name: 'https'\n}, {\n code: CODE_WS,\n name: 'ws'\n}, {\n code: CODE_WSS,\n name: 'wss'\n}, {\n code: CODE_P2P_WEBSOCKET_STAR,\n name: 'p2p-websocket-star'\n}, {\n code: CODE_P2P_STARDUST,\n name: 'p2p-stardust'\n}, {\n code: CODE_P2P_WEBRTC_STAR,\n name: 'p2p-webrtc-star'\n}, {\n code: CODE_P2P_WEBRTC_DIRECT,\n name: 'p2p-webrtc-direct'\n}, {\n code: CODE_WEBRTC_DIRECT,\n name: 'webrtc-direct'\n}, {\n code: CODE_WEBRTC,\n name: 'webrtc'\n}, {\n code: CODE_P2P_CIRCUIT,\n name: 'p2p-circuit'\n}, {\n code: CODE_MEMORY,\n name: 'memory',\n size: V\n}]\n\ncodecs.forEach(codec => {\n registry.addProtocol(codec)\n})\n","import * as varint from 'uint8-varint'\nimport { concat as uint8ArrayConcat } from 'uint8arrays/concat'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport { InvalidMultiaddrError } from './errors.ts'\nimport { registry, V } from './registry.ts'\nimport type { Component } from './index.js'\nimport type { ProtocolCodec } from './registry.ts'\n\nexport function bytesToComponents (bytes: Uint8Array): Component[] {\n const components: Component[] = []\n\n let i = 0\n while (i < bytes.length) {\n const code = varint.decode(bytes, i)\n const codec = registry.getProtocol(code)\n const codeLength = varint.encodingLength(code)\n const size = sizeForAddr(codec, bytes, i + codeLength)\n let sizeLength = 0\n\n if (size > 0 && codec.size === V) {\n sizeLength = varint.encodingLength(size)\n }\n\n const componentLength = codeLength + sizeLength + size\n\n const component: Component = {\n code,\n name: codec.name,\n bytes: bytes.subarray(i, i + componentLength)\n }\n\n if (size > 0) {\n const valueOffset = i + codeLength + sizeLength\n const valueBytes = bytes.subarray(valueOffset, valueOffset + size)\n\n component.value = codec.bytesToValue?.(valueBytes) ?? uint8ArrayToString(valueBytes)\n }\n\n components.push(component)\n\n i += componentLength\n }\n\n return components\n}\n\nexport function componentsToBytes (components: Component[]): Uint8Array {\n let length = 0\n const bytes: Uint8Array[] = []\n\n for (const component of components) {\n if (component.bytes == null) {\n const codec = registry.getProtocol(component.code)\n const codecLength = varint.encodingLength(component.code)\n let valueBytes: Uint8Array | undefined\n let valueLength = 0\n let valueLengthLength = 0\n\n if (component.value != null) {\n valueBytes = codec.valueToBytes?.(component.value) ?? uint8ArrayFromString(component.value)\n valueLength = valueBytes.byteLength\n\n if (codec.size === V) {\n valueLengthLength = varint.encodingLength(valueLength)\n }\n }\n\n const bytes = new Uint8Array(codecLength + valueLengthLength + valueLength)\n\n // encode the protocol code\n let offset = 0\n varint.encodeUint8Array(component.code, bytes, offset)\n offset += codecLength\n\n // if there is a value\n if (valueBytes != null) {\n // if the value has variable length, encode the length\n if (codec.size === V) {\n varint.encodeUint8Array(valueLength, bytes, offset)\n offset += valueLengthLength\n }\n\n // finally encode the value\n bytes.set(valueBytes, offset)\n }\n\n component.bytes = bytes\n }\n\n bytes.push(component.bytes)\n length += component.bytes.byteLength\n }\n\n return uint8ArrayConcat(bytes, length)\n}\n\nexport function stringToComponents (string: string): Component[] {\n if (string.charAt(0) !== '/') {\n throw new InvalidMultiaddrError('String multiaddr must start with \"/\"')\n }\n\n const components: Component[] = []\n let collecting: 'protocol' | 'value' = 'protocol'\n let value = ''\n let protocol = ''\n\n for (let i = 1; i < string.length; i++) {\n const char = string.charAt(i)\n\n if (char !== '/') {\n if (collecting === 'protocol') {\n protocol += string.charAt(i)\n } else {\n value += string.charAt(i)\n }\n }\n\n const ended = i === string.length - 1\n\n if (char === '/' || ended) {\n const codec = registry.getProtocol(protocol)\n\n if (collecting === 'protocol') {\n if (codec.size == null || codec.size === 0) {\n // a protocol without an address, eg. `/tls`\n components.push({\n code: codec.code,\n name: codec.name\n })\n\n value = ''\n protocol = ''\n collecting = 'protocol'\n\n continue\n } else if (ended) {\n throw new InvalidMultiaddrError(`Component ${protocol} was missing value`)\n }\n\n // continue collecting value\n collecting = 'value'\n } else if (collecting === 'value') {\n const component: Component = {\n code: codec.code,\n name: codec.name\n }\n\n if (codec.size != null && codec.size !== 0) {\n if (value === '') {\n throw new InvalidMultiaddrError(`Component ${protocol} was missing value`)\n }\n\n component.value = codec.stringToValue?.(value) ?? value\n }\n\n components.push(component)\n\n value = ''\n protocol = ''\n collecting = 'protocol'\n }\n }\n }\n\n if (protocol !== '' && value !== '') {\n throw new InvalidMultiaddrError('Incomplete multiaddr')\n }\n\n return components\n}\n\nexport function componentsToString (components: Component[]): string {\n return `/${components.flatMap(component => {\n if (component.value == null) {\n return component.name\n }\n\n const codec = registry.getProtocol(component.code)\n\n if (codec == null) {\n throw new InvalidMultiaddrError(`Unknown protocol code ${component.code}`)\n }\n\n return [\n component.name,\n codec.valueToString?.(component.value) ?? component.value\n ]\n }).join('/')}`\n}\n\n/**\n * For the passed address, return the serialized size\n */\nfunction sizeForAddr (codec: ProtocolCodec, bytes: Uint8Array, offset: number): number {\n if (codec.size == null || codec.size === 0) {\n return 0\n }\n\n if (codec.size > 0) {\n return codec.size / 8\n }\n\n return varint.decode(bytes, offset)\n}\n","import { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport { bytesToComponents, componentsToBytes, componentsToString, stringToComponents } from './components.js'\nimport { InvalidMultiaddrError, InvalidParametersError } from './errors.ts'\nimport { registry } from './registry.ts'\nimport { isMultiaddr } from './index.js'\nimport type { MultiaddrInput, Multiaddr as MultiaddrInterface, Component } from './index.js'\n\nconst inspect = Symbol.for('nodejs.util.inspect.custom')\nexport const symbol = Symbol.for('@multiformats/multiaddr')\n\nfunction toComponents (addr: MultiaddrInput): Component[] {\n if (addr == null) {\n addr = '/'\n }\n\n if (isMultiaddr(addr)) {\n return addr.getComponents()\n }\n\n if (addr instanceof Uint8Array) {\n return bytesToComponents(addr)\n }\n\n if (typeof addr === 'string') {\n addr = addr\n .replace(/\\/(\\/)+/, '/')\n .replace(/(\\/)+$/, '')\n\n if (addr === '') {\n addr = '/'\n }\n\n return stringToComponents(addr)\n }\n\n if (Array.isArray(addr)) {\n return addr\n }\n\n throw new InvalidMultiaddrError('Must be a string, Uint8Array, Component[], or another Multiaddr')\n}\n\ninterface MultiaddrOptions {\n validate?: boolean\n}\n\n/**\n * Creates a {@link Multiaddr} from a {@link MultiaddrInput}\n */\nexport class Multiaddr implements MultiaddrInterface {\n [symbol]: boolean = true\n readonly #components: Component[]\n\n // cache string representation\n #string: string | undefined\n // cache byte representation\n #bytes: Uint8Array | undefined\n\n constructor (addr: MultiaddrInput | Component[] = '/', options: MultiaddrOptions = {}) {\n this.#components = toComponents(addr)\n\n if (options.validate !== false) {\n validate(this)\n }\n }\n\n get bytes (): Uint8Array {\n if (this.#bytes == null) {\n this.#bytes = componentsToBytes(this.#components)\n }\n\n return this.#bytes\n }\n\n toString (): string {\n if (this.#string == null) {\n this.#string = componentsToString(this.#components)\n }\n\n return this.#string\n }\n\n toJSON (): string {\n return this.toString()\n }\n\n getComponents (): Component[] {\n return [\n ...this.#components.map(c => ({ ...c }))\n ]\n }\n\n encapsulate (addr: MultiaddrInput): MultiaddrInterface {\n const ma = new Multiaddr(addr)\n\n return new Multiaddr([\n ...this.#components,\n ...ma.getComponents()\n ], {\n validate: false\n })\n }\n\n decapsulate (addr: Multiaddr | string): MultiaddrInterface {\n const addrString = addr.toString()\n const s = this.toString()\n const i = s.lastIndexOf(addrString)\n\n if (i < 0) {\n throw new InvalidParametersError(`Address ${this.toString()} does not contain subaddress: ${addrString}`)\n }\n\n return new Multiaddr(s.slice(0, i), {\n validate: false\n })\n }\n\n decapsulateCode (code: number): Multiaddr {\n let index\n\n for (let i = this.#components.length - 1; i > -1; i--) {\n if (this.#components[i].code === code) {\n index = i\n break\n }\n }\n\n return new Multiaddr(this.#components.slice(0, index), {\n validate: false\n })\n }\n\n equals (addr: { bytes: Uint8Array }): boolean {\n return uint8ArrayEquals(this.bytes, addr.bytes)\n }\n\n /**\n * Returns Multiaddr as a human-readable string\n * https://nodejs.org/api/util.html#utilinspectcustom\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * console.info(multiaddr('/ip4/127.0.0.1/tcp/4001'))\n * // 'Multiaddr(/ip4/127.0.0.1/tcp/4001)'\n * ```\n */\n [inspect] (): string {\n return `Multiaddr(${this.toString()})`\n }\n}\n\n/**\n * Ensures all multiaddr tuples are correct. Throws if any invalid protocols or\n * values are encountered.\n */\nexport function validate (addr: Multiaddr): void {\n addr.getComponents()\n .forEach(component => {\n const codec = registry.getProtocol(component.code)\n\n if (component.value == null) {\n return\n }\n\n codec.validate?.(component.value)\n })\n}\n","/**\n * @packageDocumentation\n *\n * A standard way to represent addresses that\n *\n * - support any standard network protocol\n * - have a binary packed format\n * - have a nice string representation\n * - encapsulate well\n *\n * @example\n *\n * ```TypeScript\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const addr = multiaddr('/ip4/127.0.0.1/udp/1234')\n * // Multiaddr(/ip4/127.0.0.1/udp/1234)\n *\n * addr.bytes\n * // <Uint8Array 04 7f 00 00 01 11 04 d2>\n *\n * addr.toString()\n * // '/ip4/127.0.0.1/udp/1234'\n *\n * addr.getComponents()\n * // [\n * // { code: 4, name: 'ip4', value: '127.0.0.1' },\n * // { code: 273, name: 'udp', value: '1234' }\n * // ]\n *\n * addr.encapsulate('/sctp/5678')\n * // Multiaddr(/ip4/127.0.0.1/udp/1234/sctp/5678)\n * ```\n *\n * @example Adding custom protocols\n *\n * To add application-specific or experimental protocols, add a protocol codec\n * to the protocol registry:\n *\n * ```ts\n * import { registry, V, multiaddr } from '@multiformats/multiaddr'\n * import type { ProtocolCodec } from '@multiformats/multiaddr'\n *\n * const maWithCustomTuple = '/custom-protocol/hello'\n *\n * // throws UnknownProtocolError\n * multiaddr(maWithCustomTuple)\n *\n * const protocol: ProtocolCodec = {\n * code: 2059,\n * name: 'custom-protocol',\n * size: V\n * // V means variable length, can also be 0, a positive integer (e.g. a fixed\n * // length or omitted\n * }\n *\n * registry.addProtocol(protocol)\n *\n * // does not throw UnknownProtocolError\n * multiaddr(maWithCustomTuple)\n *\n * // protocols can also be removed\n * registry.removeProtocol(protocol.code)\n * ```\n */\n\nimport { Multiaddr as MultiaddrClass, symbol } from './multiaddr.js'\nimport { registry, V } from './registry.ts'\nimport type { ProtocolCodec } from './registry.ts'\n\n/**\n * The protocol registry stores protocol codecs that allow transformation of\n * multiaddr tuples from bytes to string and back again, and also validation of\n * the address values.\n */\nexport interface Registry {\n /**\n * Retrieve a protocol definition by it's code or name\n */\n getProtocol (key: string | number): ProtocolCodec\n\n /**\n * Add a new protocol definition\n */\n addProtocol (codec: ProtocolCodec): void\n\n /**\n * Remove a protocol definition by it's code\n */\n removeProtocol (code: number): void\n}\n\n/**\n * These types can be parsed into a {@link Multiaddr} object\n */\nexport type MultiaddrInput = string | Multiaddr | Uint8Array | null | Component[]\n\n/**\n * A Component is a section of a multiaddr with a name/code, possibly with a\n * value.\n *\n * Component names/codes are defined in the protocol table.\n *\n * @see https://github.com/multiformats/multiaddr/blob/master/protocols.csv\n */\nexport interface Component {\n /**\n * The code of the component as defined in the protocol table\n */\n code: number\n\n /**\n * The name of the component as defined in the protocol table\n */\n name: string\n\n /**\n * The component value, if one is present\n */\n value?: string\n\n /**\n * The bytes that make up the component. This will be set if the multiaddr\n * was parsed from a `Uint8Array`, or if `.bytes` has been accessed on it.\n */\n bytes?: Uint8Array\n}\n\nexport interface Multiaddr {\n bytes: Uint8Array\n\n /**\n * Returns Multiaddr as a String\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001').toString()\n * // '/ip4/127.0.0.1/tcp/4001'\n * ```\n */\n toString(): string\n\n /**\n * Returns Multiaddr as a JSON encoded object\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * JSON.stringify(multiaddr('/ip4/127.0.0.1/tcp/4001'))\n * // '/ip4/127.0.0.1/tcp/4001'\n * ```\n */\n toJSON(): string\n\n /**\n * Returns the components that make up this Multiaddr\n *\n * @example\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001').getComponents()\n * // [{ name: 'ip4', code: 4, value: '127.0.0.1' }, { name: 'tcp', code: 6, value: '4001' }]\n * ```\n */\n getComponents(): Component[]\n\n /**\n * Encapsulates a Multiaddr in another Multiaddr\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * const mh3 = mh1.encapsulate(mh2)\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001)\n *\n * mh3.toString()\n * // '/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001'\n * ```\n *\n * @param {MultiaddrInput} addr - Multiaddr to add into this Multiaddr\n */\n encapsulate(addr: MultiaddrInput): Multiaddr\n\n /**\n * Decapsulates a Multiaddr from another Multiaddr\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * const mh3 = mh1.encapsulate(mh2)\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001)\n *\n * mh3.decapsulate(mh2).toString()\n * // '/ip4/8.8.8.8/tcp/1080'\n * ```\n *\n * @param {Multiaddr | string} addr - Multiaddr to remove from this Multiaddr\n */\n decapsulate(addr: Multiaddr | string): Multiaddr\n\n /**\n * A more reliable version of `decapsulate` if you are targeting a specific\n * code, such as 421 (the `p2p` protocol code). The last index of the code\n * will be removed from the `Multiaddr`, and a new instance will be returned.\n * If the code is not present, the original `Multiaddr` is returned.\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const addr = multiaddr('/ip4/0.0.0.0/tcp/8080/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC')\n * // Multiaddr(/ip4/0.0.0.0/tcp/8080/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC)\n *\n * addr.decapsulateCode(421).toString()\n * // '/ip4/0.0.0.0/tcp/8080'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/8080').decapsulateCode(421).toString()\n * // '/ip4/127.0.0.1/tcp/8080'\n * ```\n */\n decapsulateCode(code: number): Multiaddr\n\n /**\n * Checks if two Multiaddrs are the same\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * mh1.equals(mh1)\n * // true\n *\n * mh1.equals(mh2)\n * // false\n * ```\n */\n equals(addr: { bytes: Uint8Array }): boolean\n}\n\n/**\n * Check if object is a {@link Multiaddr} instance\n *\n * @example\n *\n * ```js\n * import { isMultiaddr, multiaddr } from '@multiformats/multiaddr'\n *\n * isMultiaddr(5)\n * // false\n * isMultiaddr(multiaddr('/ip4/127.0.0.1'))\n * // true\n * ```\n */\nexport function isMultiaddr (value: any): value is Multiaddr {\n return Boolean(value?.[symbol])\n}\n\n/**\n * A function that takes a {@link MultiaddrInput} and returns a {@link Multiaddr}\n *\n * @example\n * ```js\n * import { multiaddr } from '@libp2p/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n * ```\n *\n * @param {MultiaddrInput} [addr] - If String or Uint8Array, needs to adhere to the address format of a [multiaddr](https://github.com/multiformats/multiaddr#string-format)\n */\nexport function multiaddr (addr?: MultiaddrInput): Multiaddr {\n return new MultiaddrClass(addr)\n}\n\n/**\n * Export all table.csv codes. These are all named exports so can be tree-shaken\n * out by bundlers.\n */\nexport * from './constants.ts'\nexport { registry, V }\nexport type { ProtocolCodec }\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 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","/**\n * @packageDocumentation\n *\n * The configured bootstrap peers will be discovered after the configured timeout. This will ensure there are some peers in the peer store for the node to use to discover other peers.\n *\n * They will be tagged with a tag with the name `'bootstrap'` tag, the value `50` and it will expire after two minutes which means the nodes connections may be closed if the maximum number of connections is reached.\n *\n * Clients that need constant connections to bootstrap nodes (e.g. browsers) can set the TTL to `Infinity`.\n *\n * @example Configuring a list of bootstrap nodes\n *\n * ```TypeScript\n * import { createLibp2p } from 'libp2p'\n * import { bootstrap } from '@libp2p/bootstrap'\n *\n * const libp2p = await createLibp2p({\n * peerDiscovery: [\n * bootstrap({\n * list: [\n * // a list of bootstrap peer multiaddrs to connect to on node startup\n * '/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ',\n * '/dnsaddr/bootstrap.libp2p.io/ipfs/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',\n * '/dnsaddr/bootstrap.libp2p.io/ipfs/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa'\n * ]\n * })\n * ]\n * })\n *\n * libp2p.addEventListener('peer:discovery', (evt) => {\n * console.log('found peer: ', evt.detail.toString())\n * })\n * ```\n */\n\nimport { peerDiscoverySymbol, serviceCapabilities } from '@libp2p/interface'\nimport { peerIdFromString } from '@libp2p/peer-id'\nimport { CODE_P2P, multiaddr } from '@multiformats/multiaddr'\nimport { P2P } from '@multiformats/multiaddr-matcher'\nimport { TypedEventEmitter } from 'main-event'\nimport type { ComponentLogger, Logger, PeerDiscovery, PeerDiscoveryEvents, PeerInfo, PeerStore, Startable } from '@libp2p/interface'\nimport type { ConnectionManager } from '@libp2p/interface-internal'\n\nconst DEFAULT_BOOTSTRAP_TAG_NAME = 'bootstrap'\nconst DEFAULT_BOOTSTRAP_TAG_VALUE = 50\nconst DEFAULT_BOOTSTRAP_DISCOVERY_TIMEOUT = 1000\n\nexport interface BootstrapInit {\n /**\n * The list of peer addresses in multi-address format\n */\n list: string[]\n\n /**\n * How long to wait before discovering bootstrap nodes\n */\n timeout?: number\n\n /**\n * Tag a bootstrap peer with this name before \"discovering\" it\n *\n * @default 'bootstrap'\n */\n tagName?: string\n\n /**\n * The bootstrap peer tag will have this value\n *\n * @default 50\n */\n tagValue?: number\n\n /**\n * Cause the bootstrap peer tag to be removed after this number of ms\n */\n tagTTL?: number\n}\n\nexport interface BootstrapComponents {\n peerStore: PeerStore\n logger: ComponentLogger\n connectionManager: ConnectionManager\n}\n\n/**\n * Emits 'peer' events on a regular interval for each peer in the provided list.\n */\nclass Bootstrap extends TypedEventEmitter<PeerDiscoveryEvents> implements PeerDiscovery, Startable {\n static tag = 'bootstrap'\n\n private readonly log: Logger\n private timer?: ReturnType<typeof setTimeout>\n private readonly list: PeerInfo[]\n private readonly timeout: number\n private readonly components: BootstrapComponents\n private readonly _init: BootstrapInit\n\n constructor (components: BootstrapComponents, options: BootstrapInit = { list: [] }) {\n if (options.list == null || options.list.length === 0) {\n throw new Error('Bootstrap requires a list of peer addresses')\n }\n super()\n\n this.components = components\n this.log = components.logger.forComponent('libp2p:bootstrap')\n this.timeout = options.timeout ?? DEFAULT_BOOTSTRAP_DISCOVERY_TIMEOUT\n this.list = options.list\n .map(str => multiaddr(str))\n .filter(ma => {\n if (!P2P.matches(ma)) {\n this.log.error('invalid multiaddr %a', ma)\n return false\n }\n\n const peerIdStr = ma.getComponents().findLast(c => c.code === CODE_P2P)?.value\n\n if (peerIdStr == null) {\n this.log.error('invalid bootstrap multiaddr without peer id')\n return false\n }\n\n return true\n })\n .map(ma => {\n return {\n id: peerIdFromString(ma.getComponents().findLast(c => c.code === CODE_P2P)?.value ?? ''),\n multiaddrs: [ma]\n }\n })\n\n this._init = options\n }\n\n readonly [peerDiscoverySymbol] = this\n\n readonly [Symbol.toStringTag] = '@libp2p/bootstrap'\n\n readonly [serviceCapabilities]: string[] = [\n '@libp2p/peer-discovery'\n ]\n\n isStarted (): boolean {\n return Boolean(this.timer)\n }\n\n /**\n * Start emitting events\n */\n start (): void {\n if (this.isStarted()) {\n return\n }\n\n this.log('Starting bootstrap node discovery, discovering peers after %s ms', this.timeout)\n this.timer = setTimeout(() => {\n void this._discoverBootstrapPeers()\n .catch(err => {\n this.log.error('failed to discover bootstrap peers - %e', err)\n })\n }, this.timeout)\n }\n\n /**\n * Emit each address in the list as a PeerInfo\n */\n async _discoverBootstrapPeers (): Promise<void> {\n if (this.timer == null) {\n return\n }\n\n for (const peerData of this.list) {\n await this.components.peerStore.merge(peerData.id, {\n tags: {\n [this._init.tagName ?? DEFAULT_BOOTSTRAP_TAG_NAME]: {\n value: this._init.tagValue ?? DEFAULT_BOOTSTRAP_TAG_VALUE,\n ttl: this._init.tagTTL\n }\n },\n multiaddrs: peerData.multiaddrs\n })\n\n // check we are still running\n if (this.timer == null) {\n return\n }\n\n this.safeDispatchEvent('peer', { detail: peerData })\n this.components.connectionManager.openConnection(peerData.id)\n .catch(err => {\n this.log.error('could not dial bootstrap peer %p - %e', peerData.id, err)\n })\n }\n }\n\n /**\n * Stop emitting events\n */\n stop (): void {\n if (this.timer != null) {\n clearTimeout(this.timer)\n }\n\n this.timer = undefined\n }\n}\n\nexport function bootstrap (init: BootstrapInit): (components: BootstrapComponents) => PeerDiscovery {\n return (components: BootstrapComponents) => new Bootstrap(components, init)\n}\n","/**\n * IndexedDB Token Storage Provider for Browser\n * Stores tokens in IndexedDB for persistent browser storage\n */\n\nimport type { TokenStorageProvider, TxfStorageDataBase, SyncResult, SaveResult, LoadResult } from '../../../storage';\nimport type { FullIdentity, ProviderStatus } from '../../../types';\n\nconst DB_NAME = 'sphere-token-storage';\nconst DB_VERSION = 1;\nconst STORE_TOKENS = 'tokens';\nconst STORE_META = 'meta';\n\nexport interface IndexedDBTokenStorageConfig {\n /** Database name prefix (default: 'sphere-token-storage') */\n dbNamePrefix?: string;\n}\n\nexport class IndexedDBTokenStorageProvider implements TokenStorageProvider<TxfStorageDataBase> {\n readonly id = 'indexeddb-token-storage';\n readonly name = 'IndexedDB Token Storage';\n readonly type = 'local' as const;\n\n private dbName: string;\n private db: IDBDatabase | null = null;\n private status: ProviderStatus = 'disconnected';\n private identity: FullIdentity | null = null;\n\n constructor(config?: IndexedDBTokenStorageConfig) {\n const prefix = config?.dbNamePrefix ?? DB_NAME;\n this.dbName = prefix;\n }\n\n setIdentity(identity: FullIdentity): void {\n this.identity = identity;\n // Scope database to address\n this.dbName = `${DB_NAME}-${identity.address.slice(0, 20)}`;\n }\n\n async initialize(): Promise<boolean> {\n try {\n this.db = await this.openDatabase();\n this.status = 'connected';\n return true;\n } catch (error) {\n console.error('[IndexedDBTokenStorage] Failed to initialize:', error);\n this.status = 'error';\n return false;\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n this.status = 'disconnected';\n }\n\n async connect(): Promise<void> {\n await this.initialize();\n }\n\n async disconnect(): Promise<void> {\n await this.shutdown();\n }\n\n isConnected(): boolean {\n return this.status === 'connected' && this.db !== null;\n }\n\n getStatus(): ProviderStatus {\n return this.status;\n }\n\n async load(): Promise<LoadResult<TxfStorageDataBase>> {\n if (!this.db) {\n return {\n success: false,\n error: 'Database not initialized',\n source: 'local',\n timestamp: Date.now(),\n };\n }\n\n try {\n const data: TxfStorageDataBase = {\n _meta: {\n version: 1,\n address: this.identity?.address ?? '',\n formatVersion: '2.0',\n updatedAt: Date.now(),\n },\n };\n\n // Load meta\n const meta = await this.getFromStore<TxfStorageDataBase['_meta']>(STORE_META, 'meta');\n if (meta) {\n data._meta = meta;\n }\n\n // Load all tokens\n const tokens = await this.getAllFromStore<{ id: string; data: unknown }>(STORE_TOKENS);\n for (const token of tokens) {\n const key = `_${token.id}` as `_${string}`;\n data[key] = token.data;\n }\n\n // Load tombstones\n const tombstones = await this.getFromStore<TxfStorageDataBase['_tombstones']>(STORE_META, 'tombstones');\n if (tombstones) {\n data._tombstones = tombstones;\n }\n\n // Load outbox\n const outbox = await this.getFromStore<TxfStorageDataBase['_outbox']>(STORE_META, 'outbox');\n if (outbox) {\n data._outbox = outbox;\n }\n\n // Load sent\n const sent = await this.getFromStore<TxfStorageDataBase['_sent']>(STORE_META, 'sent');\n if (sent) {\n data._sent = sent;\n }\n\n // Load invalid\n const invalid = await this.getFromStore<TxfStorageDataBase['_invalid']>(STORE_META, 'invalid');\n if (invalid) {\n data._invalid = invalid;\n }\n\n return {\n success: true,\n data,\n source: 'local',\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n source: 'local',\n timestamp: Date.now(),\n };\n }\n }\n\n async save(data: TxfStorageDataBase): Promise<SaveResult> {\n if (!this.db) {\n return {\n success: false,\n error: 'Database not initialized',\n timestamp: Date.now(),\n };\n }\n\n try {\n // Save meta\n await this.putToStore(STORE_META, 'meta', data._meta);\n\n // Save special arrays\n if (data._tombstones) {\n await this.putToStore(STORE_META, 'tombstones', data._tombstones);\n }\n if (data._outbox) {\n await this.putToStore(STORE_META, 'outbox', data._outbox);\n }\n if (data._sent) {\n await this.putToStore(STORE_META, 'sent', data._sent);\n }\n if (data._invalid) {\n await this.putToStore(STORE_META, 'invalid', data._invalid);\n }\n\n // Save each token\n for (const [key, value] of Object.entries(data)) {\n if (key.startsWith('_') && key !== '_meta' && key !== '_tombstones' && key !== '_outbox' && key !== '_sent' && key !== '_invalid') {\n const tokenId = key.slice(1);\n await this.putToStore(STORE_TOKENS, tokenId, { id: tokenId, data: value });\n }\n }\n\n // Handle tombstones - delete tokens\n if (data._tombstones) {\n for (const tombstone of data._tombstones) {\n await this.deleteFromStore(STORE_TOKENS, tombstone.tokenId);\n }\n }\n\n return {\n success: true,\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: Date.now(),\n };\n }\n }\n\n async sync(localData: TxfStorageDataBase): Promise<SyncResult<TxfStorageDataBase>> {\n // For local IndexedDB storage, just save and return\n const saveResult = await this.save(localData);\n return {\n success: saveResult.success,\n merged: localData,\n added: 0,\n removed: 0,\n conflicts: 0,\n error: saveResult.error,\n };\n }\n\n async exists(): Promise<boolean> {\n if (!this.db) return false;\n const meta = await this.getFromStore(STORE_META, 'meta');\n return meta !== null;\n }\n\n async clear(): Promise<boolean> {\n if (!this.db) return false;\n try {\n await this.clearStore(STORE_TOKENS);\n await this.clearStore(STORE_META);\n return true;\n } catch {\n return false;\n }\n }\n\n // =========================================================================\n // Helper methods for individual token operations\n // =========================================================================\n\n async deleteToken(tokenId: string): Promise<void> {\n if (this.db) {\n await this.deleteFromStore(STORE_TOKENS, tokenId);\n }\n }\n\n async saveToken(tokenId: string, tokenData: unknown): Promise<void> {\n if (this.db) {\n await this.putToStore(STORE_TOKENS, tokenId, { id: tokenId, data: tokenData });\n }\n }\n\n async getToken(tokenId: string): Promise<unknown | null> {\n if (!this.db) return null;\n const result = await this.getFromStore<{ id: string; data: unknown }>(STORE_TOKENS, tokenId);\n return result?.data ?? null;\n }\n\n async listTokenIds(): Promise<string[]> {\n if (!this.db) return [];\n const tokens = await this.getAllFromStore<{ id: string }>(STORE_TOKENS);\n return tokens.map(t => t.id);\n }\n\n // =========================================================================\n // Private IndexedDB helpers\n // =========================================================================\n\n private openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, DB_VERSION);\n\n request.onerror = () => {\n reject(request.error);\n };\n\n request.onsuccess = () => {\n resolve(request.result);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n // Create tokens store\n if (!db.objectStoreNames.contains(STORE_TOKENS)) {\n db.createObjectStore(STORE_TOKENS, { keyPath: 'id' });\n }\n\n // Create meta store\n if (!db.objectStoreNames.contains(STORE_META)) {\n db.createObjectStore(STORE_META);\n }\n };\n });\n }\n\n private getFromStore<T>(storeName: string, key: string): Promise<T | null> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n resolve(null);\n return;\n }\n\n const transaction = this.db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.get(key);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result ?? null);\n });\n }\n\n private getAllFromStore<T>(storeName: string): Promise<T[]> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n resolve([]);\n return;\n }\n\n const transaction = this.db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result ?? []);\n });\n }\n\n private putToStore(storeName: string, key: string, value: unknown): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n reject(new Error('Database not initialized'));\n return;\n }\n\n const transaction = this.db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n\n // For meta store, use put with explicit key\n // For tokens store, value contains the key (keyPath: 'id')\n const request = storeName === STORE_META\n ? store.put(value, key)\n : store.put(value);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n\n private deleteFromStore(storeName: string, key: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n resolve();\n return;\n }\n\n const transaction = this.db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.delete(key);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n\n private clearStore(storeName: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.db) {\n resolve();\n return;\n }\n\n const transaction = this.db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n const request = store.clear();\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n}\n\nexport function createIndexedDBTokenStorageProvider(\n config?: IndexedDBTokenStorageConfig\n): IndexedDBTokenStorageProvider {\n return new IndexedDBTokenStorageProvider(config);\n}\n","/**\n * Nostr Transport Provider\n * Platform-independent implementation using Nostr protocol for P2P messaging\n *\n * Uses @unicitylabs/nostr-js-sdk for:\n * - Real secp256k1 event signing\n * - NIP-04 encryption/decryption\n * - Event ID calculation\n *\n * WebSocket is injected via factory for cross-platform support\n */\n\nimport { Buffer } from 'buffer';\nimport {\n NostrKeyManager,\n NIP04,\n Event as NostrEventClass,\n hashNametag,\n} from '@unicitylabs/nostr-js-sdk';\nimport type { ProviderStatus, FullIdentity } from '../types';\nimport type {\n TransportProvider,\n MessageHandler,\n TokenTransferHandler,\n BroadcastHandler,\n PaymentRequestHandler,\n PaymentRequestResponseHandler,\n IncomingMessage,\n IncomingTokenTransfer,\n IncomingBroadcast,\n IncomingPaymentRequest,\n IncomingPaymentRequestResponse,\n TokenTransferPayload,\n PaymentRequestPayload,\n PaymentRequestResponsePayload,\n TransportEvent,\n TransportEventCallback,\n} from './transport-provider';\nimport type { IWebSocket, IMessageEvent, WebSocketFactory, UUIDGenerator } from './websocket';\nimport { WebSocketReadyState, defaultUUIDGenerator } from './websocket';\nimport {\n DEFAULT_NOSTR_RELAYS,\n NOSTR_EVENT_KINDS,\n TIMEOUTS,\n} from '../constants';\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\nexport interface NostrTransportProviderConfig {\n /** Nostr relay URLs */\n relays?: string[];\n /** Connection timeout (ms) */\n timeout?: number;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect delay (ms) */\n reconnectDelay?: number;\n /** Max reconnect attempts */\n maxReconnectAttempts?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** WebSocket factory (required for platform support) */\n createWebSocket: WebSocketFactory;\n /** UUID generator (optional, defaults to crypto.randomUUID) */\n generateUUID?: UUIDGenerator;\n}\n\n// Alias for backward compatibility\nconst EVENT_KINDS = NOSTR_EVENT_KINDS;\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\nexport class NostrTransportProvider implements TransportProvider {\n readonly id = 'nostr';\n readonly name = 'Nostr Transport';\n readonly type = 'p2p' as const;\n readonly description = 'P2P messaging via Nostr protocol';\n\n private config: Required<Omit<NostrTransportProviderConfig, 'createWebSocket' | 'generateUUID'>> & {\n createWebSocket: WebSocketFactory;\n generateUUID: UUIDGenerator;\n };\n private identity: FullIdentity | null = null;\n private keyManager: NostrKeyManager | null = null;\n private status: ProviderStatus = 'disconnected';\n\n // WebSocket connections to relays\n private connections: Map<string, IWebSocket> = new Map();\n private reconnectAttempts: Map<string, number> = new Map();\n\n // Event handlers\n private messageHandlers: Set<MessageHandler> = new Set();\n private transferHandlers: Set<TokenTransferHandler> = new Set();\n private paymentRequestHandlers: Set<PaymentRequestHandler> = new Set();\n private paymentRequestResponseHandlers: Set<PaymentRequestResponseHandler> = new Set();\n private broadcastHandlers: Map<string, Set<BroadcastHandler>> = new Map();\n private eventCallbacks: Set<TransportEventCallback> = new Set();\n\n // Subscriptions\n private subscriptions: Map<string, string[]> = new Map(); // subId -> relays\n\n constructor(config: NostrTransportProviderConfig) {\n this.config = {\n relays: config.relays ?? [...DEFAULT_NOSTR_RELAYS],\n timeout: config.timeout ?? TIMEOUTS.WEBSOCKET_CONNECT,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? TIMEOUTS.NOSTR_RECONNECT_DELAY,\n maxReconnectAttempts: config.maxReconnectAttempts ?? TIMEOUTS.MAX_RECONNECT_ATTEMPTS,\n debug: config.debug ?? false,\n createWebSocket: config.createWebSocket,\n generateUUID: config.generateUUID ?? defaultUUIDGenerator,\n };\n }\n\n // ===========================================================================\n // BaseProvider Implementation\n // ===========================================================================\n\n async connect(): Promise<void> {\n if (this.status === 'connected') return;\n\n this.status = 'connecting';\n\n try {\n // Connect to all relays in parallel\n const connectPromises = this.config.relays.map((relay) =>\n this.connectToRelay(relay)\n );\n\n await Promise.allSettled(connectPromises);\n\n // Need at least one successful connection\n if (this.connections.size === 0) {\n throw new Error('Failed to connect to any relay');\n }\n\n this.status = 'connected';\n this.emitEvent({ type: 'transport:connected', timestamp: Date.now() });\n this.log('Connected to', this.connections.size, 'relays');\n\n // Set up subscriptions\n if (this.identity) {\n this.subscribeToEvents();\n }\n } catch (error) {\n this.status = 'error';\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n for (const [url, ws] of this.connections) {\n ws.close();\n this.connections.delete(url);\n }\n\n this.subscriptions.clear();\n this.status = 'disconnected';\n this.emitEvent({ type: 'transport:disconnected', timestamp: Date.now() });\n this.log('Disconnected from all relays');\n }\n\n isConnected(): boolean {\n return this.status === 'connected' && this.connections.size > 0;\n }\n\n getStatus(): ProviderStatus {\n return this.status;\n }\n\n // ===========================================================================\n // Dynamic Relay Management\n // ===========================================================================\n\n /**\n * Get list of configured relay URLs\n */\n getRelays(): string[] {\n return [...this.config.relays];\n }\n\n /**\n * Get list of currently connected relay URLs\n */\n getConnectedRelays(): string[] {\n return Array.from(this.connections.keys());\n }\n\n /**\n * Add a new relay dynamically\n * Will connect immediately if provider is already connected\n */\n async addRelay(relayUrl: string): Promise<boolean> {\n // Check if already configured\n if (this.config.relays.includes(relayUrl)) {\n this.log('Relay already configured:', relayUrl);\n return false;\n }\n\n // Add to config\n this.config.relays.push(relayUrl);\n\n // Connect if provider is connected\n if (this.status === 'connected') {\n try {\n await this.connectToRelay(relayUrl);\n this.log('Added and connected to relay:', relayUrl);\n this.emitEvent({\n type: 'transport:relay_added',\n timestamp: Date.now(),\n data: { relay: relayUrl, connected: true },\n });\n return true;\n } catch (error) {\n this.log('Failed to connect to new relay:', relayUrl, error);\n this.emitEvent({\n type: 'transport:relay_added',\n timestamp: Date.now(),\n data: { relay: relayUrl, connected: false, error: String(error) },\n });\n return false;\n }\n }\n\n this.emitEvent({\n type: 'transport:relay_added',\n timestamp: Date.now(),\n data: { relay: relayUrl, connected: false },\n });\n return true;\n }\n\n /**\n * Remove a relay dynamically\n * Will disconnect from the relay if connected\n */\n async removeRelay(relayUrl: string): Promise<boolean> {\n const index = this.config.relays.indexOf(relayUrl);\n if (index === -1) {\n this.log('Relay not found:', relayUrl);\n return false;\n }\n\n // Remove from config\n this.config.relays.splice(index, 1);\n\n // Disconnect if connected\n const ws = this.connections.get(relayUrl);\n if (ws) {\n ws.close();\n this.connections.delete(relayUrl);\n this.reconnectAttempts.delete(relayUrl);\n this.log('Removed and disconnected from relay:', relayUrl);\n }\n\n this.emitEvent({\n type: 'transport:relay_removed',\n timestamp: Date.now(),\n data: { relay: relayUrl },\n });\n\n // Check if we still have connections\n if (this.connections.size === 0 && this.status === 'connected') {\n this.status = 'error';\n this.emitEvent({\n type: 'transport:error',\n timestamp: Date.now(),\n data: { error: 'No connected relays remaining' },\n });\n }\n\n return true;\n }\n\n /**\n * Check if a relay is configured\n */\n hasRelay(relayUrl: string): boolean {\n return this.config.relays.includes(relayUrl);\n }\n\n /**\n * Check if a relay is currently connected\n */\n isRelayConnected(relayUrl: string): boolean {\n const ws = this.connections.get(relayUrl);\n return ws !== undefined && ws.readyState === WebSocketReadyState.OPEN;\n }\n\n // ===========================================================================\n // TransportProvider Implementation\n // ===========================================================================\n\n setIdentity(identity: FullIdentity): void {\n this.identity = identity;\n\n // Create NostrKeyManager from private key\n const secretKey = Buffer.from(identity.privateKey, 'hex');\n this.keyManager = NostrKeyManager.fromPrivateKey(secretKey);\n\n // Use Nostr-format pubkey (32 bytes / 64 hex chars) from keyManager\n const nostrPubkey = this.keyManager.getPublicKeyHex();\n this.log('Identity set, Nostr pubkey:', nostrPubkey.slice(0, 16) + '...');\n\n // Re-subscribe if already connected\n if (this.isConnected()) {\n this.subscribeToEvents();\n }\n }\n\n /**\n * Get the Nostr-format public key (32 bytes / 64 hex chars)\n * This is the x-coordinate only, without the 02/03 prefix.\n */\n getNostrPubkey(): string {\n if (!this.keyManager) {\n throw new Error('KeyManager not initialized - call setIdentity first');\n }\n return this.keyManager.getPublicKeyHex();\n }\n\n async sendMessage(recipientPubkey: string, content: string): Promise<string> {\n this.ensureReady();\n\n // Create NIP-04 encrypted DM event\n const event = await this.createEncryptedEvent(\n EVENT_KINDS.DIRECT_MESSAGE,\n content,\n [['p', recipientPubkey]]\n );\n\n await this.publishEvent(event);\n\n this.emitEvent({\n type: 'message:sent',\n timestamp: Date.now(),\n data: { recipient: recipientPubkey },\n });\n\n return event.id;\n }\n\n onMessage(handler: MessageHandler): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n async sendTokenTransfer(\n recipientPubkey: string,\n payload: TokenTransferPayload\n ): Promise<string> {\n this.ensureReady();\n\n // Create encrypted token transfer event\n // Content must have \"token_transfer:\" prefix for nostr-js-sdk compatibility\n const content = 'token_transfer:' + JSON.stringify(payload);\n const event = await this.createEncryptedEvent(\n EVENT_KINDS.TOKEN_TRANSFER,\n content,\n [\n ['p', recipientPubkey],\n ['d', 'token-transfer'],\n ['type', 'token_transfer'],\n ]\n );\n\n await this.publishEvent(event);\n\n this.emitEvent({\n type: 'transfer:sent',\n timestamp: Date.now(),\n data: { recipient: recipientPubkey },\n });\n\n return event.id;\n }\n\n onTokenTransfer(handler: TokenTransferHandler): () => void {\n this.transferHandlers.add(handler);\n return () => this.transferHandlers.delete(handler);\n }\n\n async sendPaymentRequest(\n recipientPubkey: string,\n payload: PaymentRequestPayload\n ): Promise<string> {\n this.ensureReady();\n\n const requestId = this.config.generateUUID();\n const amount = typeof payload.amount === 'bigint' ? payload.amount.toString() : payload.amount;\n\n // Build request content matching nostr-js-sdk format\n const requestContent = {\n requestId,\n amount,\n coinId: payload.coinId,\n message: payload.message,\n recipientNametag: payload.recipientNametag,\n deadline: Date.now() + 5 * 60 * 1000, // 5 minutes default\n };\n\n // Content must have \"payment_request:\" prefix for nostr-js-sdk compatibility\n const content = 'payment_request:' + JSON.stringify(requestContent);\n\n // Build tags matching nostr-js-sdk format\n const tags: string[][] = [\n ['p', recipientPubkey],\n ['type', 'payment_request'],\n ['amount', amount],\n ];\n if (payload.recipientNametag) {\n tags.push(['recipient', payload.recipientNametag]);\n }\n\n const event = await this.createEncryptedEvent(\n EVENT_KINDS.PAYMENT_REQUEST,\n content,\n tags\n );\n\n await this.publishEvent(event);\n\n this.log('Sent payment request:', event.id);\n\n return event.id;\n }\n\n onPaymentRequest(handler: PaymentRequestHandler): () => void {\n this.paymentRequestHandlers.add(handler);\n return () => this.paymentRequestHandlers.delete(handler);\n }\n\n async sendPaymentRequestResponse(\n recipientPubkey: string,\n payload: PaymentRequestResponsePayload\n ): Promise<string> {\n this.ensureReady();\n\n // Build response content\n const responseContent = {\n requestId: payload.requestId,\n responseType: payload.responseType,\n message: payload.message,\n transferId: payload.transferId,\n };\n\n // Create encrypted payment request response event\n // Content must have \"payment_response:\" prefix for nostr-js-sdk compatibility\n const content = 'payment_response:' + JSON.stringify(responseContent);\n const event = await this.createEncryptedEvent(\n EVENT_KINDS.PAYMENT_REQUEST_RESPONSE,\n content,\n [\n ['p', recipientPubkey],\n ['e', payload.requestId], // Reference to original request\n ['d', 'payment-request-response'],\n ['type', 'payment_response'],\n ]\n );\n\n await this.publishEvent(event);\n\n this.log('Sent payment request response:', event.id, 'type:', payload.responseType);\n\n return event.id;\n }\n\n onPaymentRequestResponse(handler: PaymentRequestResponseHandler): () => void {\n this.paymentRequestResponseHandlers.add(handler);\n return () => this.paymentRequestResponseHandlers.delete(handler);\n }\n\n async resolveNametag(nametag: string): Promise<string | null> {\n this.ensureReady();\n\n // Query for nametag binding events using hashed nametag (privacy-preserving)\n // Try both '#d' and '#t' filters for compatibility with nostr-js-sdk\n const hashedNametag = hashNametag(nametag);\n\n // First try '#t' tag (nostr-js-sdk format)\n let events = await this.queryEvents({\n kinds: [EVENT_KINDS.NAMETAG_BINDING],\n '#t': [hashedNametag],\n limit: 1,\n });\n\n // Fallback to '#d' tag (legacy format)\n if (events.length === 0) {\n events = await this.queryEvents({\n kinds: [EVENT_KINDS.NAMETAG_BINDING],\n '#d': [hashedNametag],\n limit: 1,\n });\n }\n\n if (events.length === 0) return null;\n\n // Parse binding event\n const bindingEvent = events[0];\n\n // For Nostr messaging (NIP-04 encryption), we MUST use the event author's pubkey.\n // The 'address' tag contains the Unicity blockchain address (not a hex pubkey),\n // which cannot be used for Nostr encryption.\n // The event.pubkey is always the hex pubkey of the nametag owner.\n if (bindingEvent.pubkey) {\n return bindingEvent.pubkey;\n }\n\n // Fallback: try 'p' tag (our SDK format uses hex pubkey here)\n const pubkeyTag = bindingEvent.tags.find((t: string[]) => t[0] === 'p');\n if (pubkeyTag?.[1]) return pubkeyTag[1];\n\n return null;\n }\n\n async publishNametag(nametag: string, address: string): Promise<void> {\n this.ensureReady();\n\n // Use hashed nametag (privacy-preserving)\n const hashedNametag = hashNametag(nametag);\n const event = await this.createEvent(EVENT_KINDS.NAMETAG_BINDING, address, [\n ['d', hashedNametag],\n ['a', address],\n ]);\n\n await this.publishEvent(event);\n this.log('Published nametag binding:', nametag);\n }\n\n async registerNametag(nametag: string, _publicKey: string): Promise<boolean> {\n this.ensureReady();\n\n // Always use 32-byte Nostr-format pubkey from keyManager (not the 33-byte compressed key)\n const nostrPubkey = this.getNostrPubkey();\n\n // Check if nametag is already taken by someone else\n const existing = await this.resolveNametag(nametag);\n\n this.log('registerNametag:', nametag, 'existing:', existing, 'myPubkey:', nostrPubkey);\n\n if (existing && existing !== nostrPubkey) {\n this.log('Nametag already taken:', nametag, '- owner:', existing);\n return false;\n }\n\n // Always (re)publish to ensure event has correct format with all required tags\n // This is a parameterized replaceable event (kind 30078), so publishing with same 'd' tag\n // will replace any old event. This ensures the event has ['t', hash] tag for nostr-js-sdk.\n\n // Publish nametag binding matching nostr-js-sdk format\n // Use Nostr pubkey (32 bytes) for all fields\n const hashedNametag = hashNametag(nametag);\n const content = JSON.stringify({\n nametag_hash: hashedNametag,\n address: nostrPubkey,\n verified: Date.now(),\n });\n\n const event = await this.createEvent(EVENT_KINDS.NAMETAG_BINDING, content, [\n ['d', hashedNametag],\n ['nametag', hashedNametag],\n ['t', hashedNametag],\n['address', nostrPubkey],\n ]);\n\n await this.publishEvent(event);\n this.log('Registered nametag:', nametag, 'for pubkey:', nostrPubkey.slice(0, 16) + '...');\n return true;\n }\n\n subscribeToBroadcast(tags: string[], handler: BroadcastHandler): () => void {\n const key = tags.sort().join(':');\n\n if (!this.broadcastHandlers.has(key)) {\n this.broadcastHandlers.set(key, new Set());\n\n // Subscribe to relay\n if (this.isConnected()) {\n this.subscribeToTags(tags);\n }\n }\n\n this.broadcastHandlers.get(key)!.add(handler);\n\n return () => {\n this.broadcastHandlers.get(key)?.delete(handler);\n if (this.broadcastHandlers.get(key)?.size === 0) {\n this.broadcastHandlers.delete(key);\n }\n };\n }\n\n async publishBroadcast(content: string, tags?: string[]): Promise<string> {\n this.ensureReady();\n\n const eventTags = tags?.map((t) => ['t', t]) ?? [];\n const event = await this.createEvent(EVENT_KINDS.BROADCAST, content, eventTags);\n\n await this.publishEvent(event);\n return event.id;\n }\n\n // ===========================================================================\n // Event Subscription\n // ===========================================================================\n\n onEvent(callback: TransportEventCallback): () => void {\n this.eventCallbacks.add(callback);\n return () => this.eventCallbacks.delete(callback);\n }\n\n // ===========================================================================\n // Private: Connection Management\n // ===========================================================================\n\n private async connectToRelay(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const ws = this.config.createWebSocket(url);\n\n const timeout = setTimeout(() => {\n ws.close();\n reject(new Error(`Connection timeout: ${url}`));\n }, this.config.timeout);\n\n ws.onopen = () => {\n clearTimeout(timeout);\n this.connections.set(url, ws);\n this.reconnectAttempts.set(url, 0);\n this.log('Connected to relay:', url);\n resolve();\n };\n\n ws.onerror = (error) => {\n clearTimeout(timeout);\n this.log('Relay error:', url, error);\n reject(error);\n };\n\n ws.onclose = () => {\n this.connections.delete(url);\n if (this.config.autoReconnect && this.status === 'connected') {\n this.scheduleReconnect(url);\n }\n };\n\n ws.onmessage = (event: IMessageEvent) => {\n this.handleRelayMessage(url, event.data);\n };\n });\n }\n\n private scheduleReconnect(url: string): void {\n const attempts = this.reconnectAttempts.get(url) ?? 0;\n if (attempts >= this.config.maxReconnectAttempts) {\n this.log('Max reconnect attempts reached for:', url);\n return;\n }\n\n this.reconnectAttempts.set(url, attempts + 1);\n const delay = this.config.reconnectDelay * Math.pow(2, attempts);\n\n this.emitEvent({ type: 'transport:reconnecting', timestamp: Date.now() });\n\n setTimeout(() => {\n this.connectToRelay(url).catch(() => {\n // Will retry again if still below max attempts\n });\n }, delay);\n }\n\n // ===========================================================================\n // Private: Message Handling\n // ===========================================================================\n\n private handleRelayMessage(relay: string, data: string): void {\n try {\n const message = JSON.parse(data);\n const [type, ...args] = message;\n\n switch (type) {\n case 'EVENT':\n this.handleEvent(args[1]);\n break;\n case 'EOSE':\n // End of stored events\n break;\n case 'OK':\n // Event accepted\n break;\n case 'NOTICE':\n this.log('Relay notice:', relay, args[0]);\n break;\n }\n } catch (error) {\n this.log('Failed to parse relay message:', error);\n }\n }\n\n private async handleEvent(event: NostrEvent): Promise<void> {\n try {\n switch (event.kind) {\n case EVENT_KINDS.DIRECT_MESSAGE:\n await this.handleDirectMessage(event);\n break;\n case EVENT_KINDS.TOKEN_TRANSFER:\n await this.handleTokenTransfer(event);\n break;\n case EVENT_KINDS.PAYMENT_REQUEST:\n await this.handlePaymentRequest(event);\n break;\n case EVENT_KINDS.PAYMENT_REQUEST_RESPONSE:\n await this.handlePaymentRequestResponse(event);\n break;\n case EVENT_KINDS.BROADCAST:\n this.handleBroadcast(event);\n break;\n }\n } catch (error) {\n this.log('Failed to handle event:', error);\n }\n }\n\n private async handleDirectMessage(event: NostrEvent): Promise<void> {\n if (!this.identity || !this.keyManager) return;\n\n // Skip our own messages (compare with 32-byte Nostr pubkey)\n if (event.pubkey === this.keyManager.getPublicKeyHex()) return;\n\n // Decrypt content\n const content = await this.decryptContent(event.content, event.pubkey);\n\n const message: IncomingMessage = {\n id: event.id,\n senderPubkey: event.pubkey,\n content,\n timestamp: event.created_at * 1000,\n encrypted: true,\n };\n\n this.emitEvent({ type: 'message:received', timestamp: Date.now() });\n\n for (const handler of this.messageHandlers) {\n try {\n handler(message);\n } catch (error) {\n this.log('Message handler error:', error);\n }\n }\n }\n\n private async handleTokenTransfer(event: NostrEvent): Promise<void> {\n if (!this.identity) return;\n\n // Decrypt content\n const content = await this.decryptContent(event.content, event.pubkey);\n const payload = JSON.parse(content) as TokenTransferPayload;\n\n const transfer: IncomingTokenTransfer = {\n id: event.id,\n senderPubkey: event.pubkey,\n payload,\n timestamp: event.created_at * 1000,\n };\n\n this.emitEvent({ type: 'transfer:received', timestamp: Date.now() });\n\n for (const handler of this.transferHandlers) {\n try {\n handler(transfer);\n } catch (error) {\n this.log('Transfer handler error:', error);\n }\n }\n }\n\n private async handlePaymentRequest(event: NostrEvent): Promise<void> {\n if (!this.identity) return;\n\n try {\n // Decrypt content\n const content = await this.decryptContent(event.content, event.pubkey);\n const requestData = JSON.parse(content) as {\n requestId: string;\n amount: string;\n coinId: string;\n message?: string;\n recipientNametag?: string;\n metadata?: Record<string, unknown>;\n };\n\n const request: IncomingPaymentRequest = {\n id: event.id,\n senderPubkey: event.pubkey,\n request: {\n requestId: requestData.requestId,\n amount: requestData.amount,\n coinId: requestData.coinId,\n message: requestData.message,\n recipientNametag: requestData.recipientNametag,\n metadata: requestData.metadata,\n },\n timestamp: event.created_at * 1000,\n };\n\n this.log('Received payment request:', request.id);\n\n for (const handler of this.paymentRequestHandlers) {\n try {\n handler(request);\n } catch (error) {\n this.log('Payment request handler error:', error);\n }\n }\n } catch (error) {\n this.log('Failed to handle payment request:', error);\n }\n }\n\n private async handlePaymentRequestResponse(event: NostrEvent): Promise<void> {\n if (!this.identity) return;\n\n try {\n // Decrypt content\n const content = await this.decryptContent(event.content, event.pubkey);\n const responseData = JSON.parse(content) as {\n requestId: string;\n responseType: 'accepted' | 'rejected' | 'paid';\n message?: string;\n transferId?: string;\n };\n\n const response: IncomingPaymentRequestResponse = {\n id: event.id,\n responderPubkey: event.pubkey,\n response: {\n requestId: responseData.requestId,\n responseType: responseData.responseType,\n message: responseData.message,\n transferId: responseData.transferId,\n },\n timestamp: event.created_at * 1000,\n };\n\n this.log('Received payment request response:', response.id, 'type:', responseData.responseType);\n\n for (const handler of this.paymentRequestResponseHandlers) {\n try {\n handler(response);\n } catch (error) {\n this.log('Payment request response handler error:', error);\n }\n }\n } catch (error) {\n this.log('Failed to handle payment request response:', error);\n }\n }\n\n private handleBroadcast(event: NostrEvent): void {\n const tags = event.tags\n .filter((t: string[]) => t[0] === 't')\n .map((t: string[]) => t[1]);\n\n const broadcast: IncomingBroadcast = {\n id: event.id,\n authorPubkey: event.pubkey,\n content: event.content,\n tags,\n timestamp: event.created_at * 1000,\n };\n\n // Find matching handlers\n for (const [key, handlers] of this.broadcastHandlers) {\n const subscribedTags = key.split(':');\n if (tags.some((t) => subscribedTags.includes(t))) {\n for (const handler of handlers) {\n try {\n handler(broadcast);\n } catch (error) {\n this.log('Broadcast handler error:', error);\n }\n }\n }\n }\n }\n\n // ===========================================================================\n // Private: Event Creation & Publishing\n // ===========================================================================\n\n private async createEvent(\n kind: number,\n content: string,\n tags: string[][]\n ): Promise<NostrEvent> {\n if (!this.identity) throw new Error('Identity not set');\n if (!this.keyManager) throw new Error('KeyManager not initialized');\n\n // Create and sign event using SDK\n const signedEvent = NostrEventClass.create(this.keyManager, {\n kind,\n content,\n tags,\n });\n\n // Convert to our interface\n const event: NostrEvent = {\n id: signedEvent.id,\n kind: signedEvent.kind,\n content: signedEvent.content,\n tags: signedEvent.tags,\n pubkey: signedEvent.pubkey,\n created_at: signedEvent.created_at,\n sig: signedEvent.sig,\n };\n\n return event;\n }\n\n private async createEncryptedEvent(\n kind: number,\n content: string,\n tags: string[][]\n ): Promise<NostrEvent> {\n if (!this.keyManager) throw new Error('KeyManager not initialized');\n\n // Extract recipient pubkey from tags (first 'p' tag)\n const recipientTag = tags.find((t) => t[0] === 'p');\n if (!recipientTag || !recipientTag[1]) {\n throw new Error('No recipient pubkey in tags for encryption');\n }\n const recipientPubkey = recipientTag[1];\n\n // Encrypt content with NIP-04 (using hex variant for string keys)\n const encrypted = await NIP04.encryptHex(\n content,\n this.keyManager.getPrivateKeyHex(),\n recipientPubkey\n );\n\n return this.createEvent(kind, encrypted, tags);\n }\n\n private async publishEvent(event: NostrEvent): Promise<void> {\n const message = JSON.stringify(['EVENT', event]);\n\n const publishPromises = Array.from(this.connections.values()).map((ws) => {\n return new Promise<void>((resolve, reject) => {\n if (ws.readyState !== WebSocketReadyState.OPEN) {\n reject(new Error('WebSocket not open'));\n return;\n }\n\n ws.send(message);\n resolve();\n });\n });\n\n await Promise.any(publishPromises);\n }\n\n private async queryEvents(filter: NostrFilter): Promise<NostrEvent[]> {\n if (this.connections.size === 0) {\n throw new Error('No connected relays');\n }\n\n // Query all relays in parallel and return first non-empty result\n const queryPromises = Array.from(this.connections.values()).map(ws =>\n this.queryEventsFromRelay(ws, filter)\n );\n\n // Wait for first relay that returns events, or all to complete\n const results = await Promise.allSettled(queryPromises);\n\n // Find first successful result with events\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.length > 0) {\n return result.value;\n }\n }\n\n // No events found on any relay\n return [];\n }\n\n private async queryEventsFromRelay(ws: IWebSocket, filter: NostrFilter): Promise<NostrEvent[]> {\n const subId = this.config.generateUUID().slice(0, 8);\n const events: NostrEvent[] = [];\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n this.unsubscribeFromRelay(ws, subId);\n resolve(events);\n }, 5000);\n\n const originalHandler = ws.onmessage;\n ws.onmessage = (event: IMessageEvent) => {\n const message = JSON.parse(event.data);\n const [type, sid, data] = message;\n\n if (sid !== subId) {\n originalHandler?.call(ws, event);\n return;\n }\n\n if (type === 'EVENT') {\n events.push(data);\n } else if (type === 'EOSE') {\n clearTimeout(timeout);\n ws.onmessage = originalHandler;\n this.unsubscribeFromRelay(ws, subId);\n resolve(events);\n }\n };\n\n ws.send(JSON.stringify(['REQ', subId, filter]));\n });\n }\n\n private unsubscribeFromRelay(ws: IWebSocket, subId: string): void {\n if (ws.readyState === WebSocketReadyState.OPEN) {\n ws.send(JSON.stringify(['CLOSE', subId]));\n }\n }\n\n // ===========================================================================\n // Private: Subscriptions\n // ===========================================================================\n\n private subscribeToEvents(): void {\n if (!this.identity || !this.keyManager) return;\n\n const subId = 'main';\n // Use 32-byte Nostr pubkey (x-coordinate only), not 33-byte compressed key\n const nostrPubkey = this.keyManager.getPublicKeyHex();\n const filter: NostrFilter = {\n kinds: [\n EVENT_KINDS.DIRECT_MESSAGE,\n EVENT_KINDS.TOKEN_TRANSFER,\n EVENT_KINDS.PAYMENT_REQUEST,\n EVENT_KINDS.PAYMENT_REQUEST_RESPONSE,\n ],\n '#p': [nostrPubkey],\n since: Math.floor(Date.now() / 1000) - 86400, // Last 24h\n };\n\n const message = JSON.stringify(['REQ', subId, filter]);\n\n for (const ws of this.connections.values()) {\n if (ws.readyState === WebSocketReadyState.OPEN) {\n ws.send(message);\n }\n }\n\n this.subscriptions.set(subId, Array.from(this.connections.keys()));\n this.log('Subscribed to events');\n }\n\n private subscribeToTags(tags: string[]): void {\n const subId = `tags:${tags.join(':')}`;\n const filter: NostrFilter = {\n kinds: [EVENT_KINDS.BROADCAST],\n '#t': tags,\n since: Math.floor(Date.now() / 1000) - 3600, // Last hour\n };\n\n const message = JSON.stringify(['REQ', subId, filter]);\n\n for (const ws of this.connections.values()) {\n if (ws.readyState === WebSocketReadyState.OPEN) {\n ws.send(message);\n }\n }\n\n this.subscriptions.set(subId, Array.from(this.connections.keys()));\n }\n\n // ===========================================================================\n // Private: Encryption\n // ===========================================================================\n\n private async decryptContent(content: string, senderPubkey: string): Promise<string> {\n if (!this.keyManager) throw new Error('KeyManager not initialized');\n\n // Decrypt content using NIP-04 (using hex variant for string keys)\n const decrypted = await NIP04.decryptHex(\n content,\n this.keyManager.getPrivateKeyHex(),\n senderPubkey\n );\n\n // Strip known prefixes for compatibility with nostr-js-sdk\n return this.stripContentPrefix(decrypted);\n }\n\n /**\n * Strip known content prefixes (nostr-js-sdk compatibility)\n * Handles: payment_request:, token_transfer:, etc.\n */\n private stripContentPrefix(content: string): string {\n const prefixes = [\n 'payment_request:',\n 'token_transfer:',\n 'payment_response:',\n ];\n\n for (const prefix of prefixes) {\n if (content.startsWith(prefix)) {\n return content.slice(prefix.length);\n }\n }\n\n return content;\n }\n\n // ===========================================================================\n // Private: Helpers\n // ===========================================================================\n\n private ensureReady(): void {\n if (!this.isConnected()) {\n throw new Error('NostrTransportProvider not connected');\n }\n if (!this.identity) {\n throw new Error('Identity not set');\n }\n }\n\n private emitEvent(event: TransportEvent): void {\n for (const callback of this.eventCallbacks) {\n try {\n callback(event);\n } catch (error) {\n this.log('Event callback error:', error);\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[NostrTransportProvider]', ...args);\n }\n }\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface NostrEvent {\n id: string;\n kind: number;\n content: string;\n tags: string[][];\n pubkey: string;\n created_at: number;\n sig: string;\n}\n\ninterface NostrFilter {\n ids?: string[];\n authors?: string[];\n kinds?: number[];\n '#p'?: string[];\n '#t'?: string[];\n '#d'?: string[];\n since?: number;\n until?: number;\n limit?: number;\n}\n","/**\n * WebSocket Abstraction\n * Platform-independent WebSocket interface for cross-platform support\n */\n\n// =============================================================================\n// WebSocket Interface\n// =============================================================================\n\n/**\n * Minimal WebSocket interface compatible with browser and Node.js\n */\nexport interface IWebSocket {\n readonly readyState: number;\n\n send(data: string): void;\n close(code?: number, reason?: string): void;\n\n onopen: ((event: unknown) => void) | null;\n onclose: ((event: unknown) => void) | null;\n onerror: ((event: unknown) => void) | null;\n onmessage: ((event: IMessageEvent) => void) | null;\n}\n\nexport interface IMessageEvent {\n data: string;\n}\n\n/**\n * WebSocket ready states (same as native WebSocket)\n */\nexport const WebSocketReadyState = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3,\n} as const;\n\n/**\n * Factory function to create WebSocket instances\n * Different implementations for browser (native) vs Node.js (ws package)\n */\nexport type WebSocketFactory = (url: string) => IWebSocket;\n\n// =============================================================================\n// UUID Generator\n// =============================================================================\n\n/**\n * Generate a unique ID (platform-independent)\n * Browser: crypto.randomUUID()\n * Node: crypto.randomUUID() or uuid package\n */\nexport type UUIDGenerator = () => string;\n\n/**\n * Default UUID generator using crypto.randomUUID\n * Works in modern browsers and Node 19+\n */\nexport function defaultUUIDGenerator(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for older environments\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","/**\n * Browser Transport Exports\n * Re-exports shared transport with browser-specific WebSocket factory\n */\n\nimport {\n NostrTransportProvider,\n type NostrTransportProviderConfig,\n} from '../../../transport/NostrTransportProvider';\nimport type { IWebSocket } from '../../../transport/websocket';\n\n// Re-export shared types and classes\nexport {\n NostrTransportProvider,\n type NostrTransportProviderConfig,\n} from '../../../transport/NostrTransportProvider';\n\nexport {\n type IWebSocket,\n type IMessageEvent,\n type WebSocketFactory,\n type UUIDGenerator,\n WebSocketReadyState,\n defaultUUIDGenerator,\n} from '../../../transport/websocket';\n\n// =============================================================================\n// Browser WebSocket Factory\n// =============================================================================\n\n/**\n * Browser WebSocket factory using native WebSocket\n * Cast to IWebSocket since native WebSocket is a superset\n */\nexport function createBrowserWebSocket(url: string): IWebSocket {\n return new WebSocket(url) as unknown as IWebSocket;\n}\n\n/**\n * Create NostrTransportProvider with browser WebSocket\n * Convenience factory that injects browser-native WebSocket\n */\nexport function createNostrTransportProvider(\n config?: Omit<NostrTransportProviderConfig, 'createWebSocket'>\n): NostrTransportProvider {\n return new NostrTransportProvider({\n ...config,\n createWebSocket: createBrowserWebSocket,\n });\n}\n","/**\n * Unicity Aggregator Provider\n * Platform-independent implementation using @unicitylabs/state-transition-sdk\n *\n * The oracle is a trusted service that provides verifiable truth\n * about token state through cryptographic inclusion proofs.\n *\n * TrustBaseLoader is injected for platform-specific loading:\n * - Browser: fetch from URL\n * - Node.js: read from file\n */\n\nimport type { ProviderStatus } from '../types';\nimport type {\n OracleProvider,\n TransferCommitment,\n SubmitResult,\n InclusionProof,\n WaitOptions,\n ValidationResult,\n TokenState,\n MintParams,\n MintResult,\n OracleEvent,\n OracleEventCallback,\n TrustBaseLoader,\n} from './oracle-provider';\nimport { DEFAULT_AGGREGATOR_TIMEOUT, TIMEOUTS } from '../constants';\n\n// SDK imports - using direct imports from the SDK\nimport { StateTransitionClient } from '@unicitylabs/state-transition-sdk/lib/StateTransitionClient';\nimport { AggregatorClient } from '@unicitylabs/state-transition-sdk/lib/api/AggregatorClient';\nimport { RootTrustBase } from '@unicitylabs/state-transition-sdk/lib/bft/RootTrustBase';\nimport { Token as SdkToken } from '@unicitylabs/state-transition-sdk/lib/token/Token';\nimport { waitInclusionProof } from '@unicitylabs/state-transition-sdk/lib/util/InclusionProofUtils';\nimport type { TransferCommitment as SdkTransferCommitment } from '@unicitylabs/state-transition-sdk/lib/transaction/TransferCommitment';\n\n// SDK MintCommitment type - using interface to avoid generic complexity\ninterface SdkMintCommitment {\n requestId?: { toString(): string };\n [key: string]: unknown;\n}\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\nexport interface UnicityAggregatorProviderConfig {\n /** Aggregator URL */\n url: string;\n /** API key for authentication */\n apiKey?: string;\n /** Request timeout (ms) */\n timeout?: number;\n /** Skip trust base verification (dev only) */\n skipVerification?: boolean;\n /** Enable debug logging */\n debug?: boolean;\n /** Trust base loader (platform-specific) */\n trustBaseLoader?: TrustBaseLoader;\n}\n\n// =============================================================================\n// RPC Response Types\n// =============================================================================\n\ninterface RpcSubmitResponse {\n requestId?: string;\n}\n\ninterface RpcProofResponse {\n proof?: unknown;\n roundNumber?: number;\n}\n\ninterface RpcValidateResponse {\n valid?: boolean;\n spent?: boolean;\n stateHash?: string;\n error?: string;\n}\n\ninterface RpcSpentResponse {\n spent?: boolean;\n}\n\ninterface RpcTokenStateResponse {\n state?: {\n stateHash?: string;\n spent?: boolean;\n roundNumber?: number;\n };\n}\n\ninterface RpcMintResponse {\n requestId?: string;\n tokenId?: string;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Unicity Aggregator Provider\n * Concrete implementation of OracleProvider using Unicity's aggregator service\n */\nexport class UnicityAggregatorProvider implements OracleProvider {\n readonly id = 'unicity-aggregator';\n readonly name = 'Unicity Aggregator';\n readonly type = 'network' as const;\n readonly description = 'Unicity state transition aggregator (oracle implementation)';\n\n private config: Required<Omit<UnicityAggregatorProviderConfig, 'trustBaseLoader'>> & {\n trustBaseLoader?: TrustBaseLoader;\n };\n private status: ProviderStatus = 'disconnected';\n private eventCallbacks: Set<OracleEventCallback> = new Set();\n\n // SDK clients\n private aggregatorClient: AggregatorClient | null = null;\n private stateTransitionClient: StateTransitionClient | null = null;\n private trustBase: RootTrustBase | null = null;\n\n /** Get the current trust base */\n getTrustBase(): RootTrustBase | null {\n return this.trustBase;\n }\n\n /** Get the state transition client */\n getStateTransitionClient(): StateTransitionClient | null {\n return this.stateTransitionClient;\n }\n\n /** Get the aggregator client */\n getAggregatorClient(): AggregatorClient | null {\n return this.aggregatorClient;\n }\n\n // Cache for spent states (immutable)\n private spentCache: Map<string, boolean> = new Map();\n\n constructor(config: UnicityAggregatorProviderConfig) {\n this.config = {\n url: config.url,\n apiKey: config.apiKey ?? '',\n timeout: config.timeout ?? DEFAULT_AGGREGATOR_TIMEOUT,\n skipVerification: config.skipVerification ?? false,\n debug: config.debug ?? false,\n trustBaseLoader: config.trustBaseLoader,\n };\n }\n\n // ===========================================================================\n // BaseProvider Implementation\n // ===========================================================================\n\n async connect(): Promise<void> {\n if (this.status === 'connected') return;\n\n this.status = 'connecting';\n\n // Mark as connected - actual connectivity will be verified on first operation\n // The aggregator requires requestId in params even for status checks,\n // which the SDK client doesn't support directly\n this.status = 'connected';\n this.emitEvent({ type: 'oracle:connected', timestamp: Date.now() });\n this.log('Connected to oracle:', this.config.url);\n }\n\n async disconnect(): Promise<void> {\n this.status = 'disconnected';\n this.emitEvent({ type: 'oracle:disconnected', timestamp: Date.now() });\n this.log('Disconnected from oracle');\n }\n\n isConnected(): boolean {\n return this.status === 'connected';\n }\n\n getStatus(): ProviderStatus {\n return this.status;\n }\n\n // ===========================================================================\n // OracleProvider Implementation\n // ===========================================================================\n\n async initialize(trustBase?: RootTrustBase): Promise<void> {\n // Initialize SDK clients with optional API key\n this.aggregatorClient = new AggregatorClient(\n this.config.url,\n this.config.apiKey || null\n );\n this.stateTransitionClient = new StateTransitionClient(this.aggregatorClient);\n\n if (trustBase) {\n this.trustBase = trustBase;\n } else if (!this.config.skipVerification && this.config.trustBaseLoader) {\n // Load trust base using injected loader\n try {\n const trustBaseJson = await this.config.trustBaseLoader.load();\n if (trustBaseJson) {\n this.trustBase = RootTrustBase.fromJSON(trustBaseJson);\n }\n } catch (error) {\n this.log('Failed to load trust base:', error);\n }\n }\n\n await this.connect();\n this.log('Initialized with trust base:', !!this.trustBase);\n }\n\n /**\n * Submit a transfer commitment to the aggregator.\n * Accepts either an SDK TransferCommitment or a simple commitment object.\n */\n async submitCommitment(commitment: TransferCommitment | SdkTransferCommitment): Promise<SubmitResult> {\n this.ensureConnected();\n\n try {\n let requestId: string;\n\n // Check if it's an SDK commitment (has submitTransferCommitment method signature)\n if (this.isSdkTransferCommitment(commitment)) {\n // Use SDK client directly\n const response = await this.stateTransitionClient!.submitTransferCommitment(commitment);\n requestId = commitment.requestId?.toString() ?? response.status;\n } else {\n // Fallback to RPC for simple commitment objects\n const response = await this.rpcCall<RpcSubmitResponse>('submitCommitment', {\n sourceToken: commitment.sourceToken,\n recipient: commitment.recipient,\n salt: Array.from(commitment.salt),\n data: commitment.data,\n });\n requestId = response.requestId ?? '';\n }\n\n this.emitEvent({\n type: 'commitment:submitted',\n timestamp: Date.now(),\n data: { requestId },\n });\n\n return {\n success: true,\n requestId,\n timestamp: Date.now(),\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: errorMsg,\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Submit a mint commitment to the aggregator (SDK only)\n * @param commitment - SDK MintCommitment instance\n */\n async submitMintCommitment(commitment: SdkMintCommitment): Promise<SubmitResult> {\n this.ensureConnected();\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = await this.stateTransitionClient!.submitMintCommitment(commitment as any);\n const requestId = commitment.requestId?.toString() ?? response.status;\n\n this.emitEvent({\n type: 'commitment:submitted',\n timestamp: Date.now(),\n data: { requestId },\n });\n\n return {\n success: true,\n requestId,\n timestamp: Date.now(),\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: errorMsg,\n timestamp: Date.now(),\n };\n }\n }\n\n private isSdkTransferCommitment(commitment: unknown): commitment is SdkTransferCommitment {\n return (\n commitment !== null &&\n typeof commitment === 'object' &&\n 'requestId' in commitment &&\n typeof (commitment as SdkTransferCommitment).requestId?.toString === 'function'\n );\n }\n\n async getProof(requestId: string): Promise<InclusionProof | null> {\n this.ensureConnected();\n\n try {\n const response = await this.rpcCall<RpcProofResponse>('getInclusionProof', { requestId });\n\n if (!response.proof) {\n return null;\n }\n\n return {\n requestId,\n roundNumber: response.roundNumber ?? 0,\n proof: response.proof,\n timestamp: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async waitForProof(requestId: string, options?: WaitOptions): Promise<InclusionProof> {\n const timeout = options?.timeout ?? this.config.timeout;\n const pollInterval = options?.pollInterval ?? TIMEOUTS.PROOF_POLL_INTERVAL;\n const startTime = Date.now();\n let attempt = 0;\n\n while (Date.now() - startTime < timeout) {\n options?.onPoll?.(++attempt);\n\n const proof = await this.getProof(requestId);\n if (proof) {\n this.emitEvent({\n type: 'proof:received',\n timestamp: Date.now(),\n data: { requestId, roundNumber: proof.roundNumber },\n });\n return proof;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(`Timeout waiting for proof: ${requestId}`);\n }\n\n async validateToken(tokenData: unknown): Promise<ValidationResult> {\n this.ensureConnected();\n\n try {\n // Try SDK validation first if we have trust base\n if (this.trustBase && !this.config.skipVerification) {\n try {\n const sdkToken = await SdkToken.fromJSON(tokenData);\n const verifyResult = await sdkToken.verify(this.trustBase);\n\n // Calculate state hash\n const stateHash = await sdkToken.state.calculateHash();\n const stateHashStr = stateHash.toJSON();\n\n const valid = verifyResult.isSuccessful;\n\n this.emitEvent({\n type: 'validation:completed',\n timestamp: Date.now(),\n data: { valid },\n });\n\n return {\n valid,\n spent: false, // Spend check is separate\n stateHash: stateHashStr,\n error: valid ? undefined : 'SDK verification failed',\n };\n } catch (sdkError) {\n this.log('SDK validation failed, falling back to RPC:', sdkError);\n }\n }\n\n // Fallback to RPC validation\n const response = await this.rpcCall<RpcValidateResponse>('validateToken', { token: tokenData });\n\n const valid = response.valid ?? false;\n const spent = response.spent ?? false;\n\n this.emitEvent({\n type: 'validation:completed',\n timestamp: Date.now(),\n data: { valid },\n });\n\n // Cache spent state if spent\n if (response.stateHash && spent) {\n this.spentCache.set(response.stateHash, true);\n }\n\n return {\n valid,\n spent,\n stateHash: response.stateHash,\n error: response.error,\n };\n } catch (error) {\n return {\n valid: false,\n spent: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Wait for inclusion proof using SDK (for SDK commitments)\n */\n async waitForProofSdk(\n commitment: SdkTransferCommitment | SdkMintCommitment,\n signal?: AbortSignal\n ): Promise<unknown> {\n this.ensureConnected();\n\n if (!this.trustBase) {\n throw new Error('Trust base not initialized');\n }\n\n return await waitInclusionProof(\n this.trustBase,\n this.stateTransitionClient!,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n commitment as any,\n signal\n );\n }\n\n async isSpent(stateHash: string): Promise<boolean> {\n // Check cache first (spent is immutable)\n if (this.spentCache.has(stateHash)) {\n return this.spentCache.get(stateHash)!;\n }\n\n this.ensureConnected();\n\n try {\n const response = await this.rpcCall<RpcSpentResponse>('isSpent', { stateHash });\n const spent = response.spent ?? false;\n\n // Cache result\n if (spent) {\n this.spentCache.set(stateHash, true);\n }\n\n return spent;\n } catch {\n return false;\n }\n }\n\n async getTokenState(tokenId: string): Promise<TokenState | null> {\n this.ensureConnected();\n\n try {\n const response = await this.rpcCall<RpcTokenStateResponse>('getTokenState', { tokenId });\n\n if (!response.state) {\n return null;\n }\n\n return {\n tokenId,\n stateHash: response.state.stateHash ?? '',\n spent: response.state.spent ?? false,\n roundNumber: response.state.roundNumber,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getCurrentRound(): Promise<number> {\n if (this.aggregatorClient) {\n const blockHeight = await this.aggregatorClient.getBlockHeight();\n return Number(blockHeight);\n }\n return 0;\n }\n\n async mint(params: MintParams): Promise<MintResult> {\n this.ensureConnected();\n\n try {\n const response = await this.rpcCall<RpcMintResponse>('mint', {\n coinId: params.coinId,\n amount: params.amount,\n recipientAddress: params.recipientAddress,\n recipientPubkey: params.recipientPubkey,\n });\n\n return {\n success: true,\n requestId: response.requestId,\n tokenId: response.tokenId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n // ===========================================================================\n // Event Subscription\n // ===========================================================================\n\n onEvent(callback: OracleEventCallback): () => void {\n this.eventCallbacks.add(callback);\n return () => this.eventCallbacks.delete(callback);\n }\n\n // ===========================================================================\n // Private: RPC\n // ===========================================================================\n\n private async rpcCall<T>(method: string, params: unknown): Promise<T> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(this.config.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: Date.now(),\n method,\n params,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n\n if (result.error) {\n throw new Error(result.error.message ?? 'RPC error');\n }\n\n return (result.result ?? {}) as T;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n // ===========================================================================\n // Private: Helpers\n // ===========================================================================\n\n private ensureConnected(): void {\n if (this.status !== 'connected') {\n throw new Error('UnicityAggregatorProvider not connected');\n }\n }\n\n private emitEvent(event: OracleEvent): void {\n for (const callback of this.eventCallbacks) {\n try {\n callback(event);\n } catch (error) {\n this.log('Event callback error:', error);\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[UnicityAggregatorProvider]', ...args);\n }\n }\n}\n\n// =============================================================================\n// Backward Compatibility Aliases (Oracle -> Aggregator)\n// =============================================================================\n\n/** @deprecated Use UnicityAggregatorProvider instead */\nexport const UnicityOracleProvider = UnicityAggregatorProvider;\n/** @deprecated Use UnicityAggregatorProviderConfig instead */\nexport type UnicityOracleProviderConfig = UnicityAggregatorProviderConfig;\n","/**\n * Browser Oracle Exports\n * Re-exports shared oracle with browser-specific TrustBaseLoader\n */\n\nimport {\n UnicityAggregatorProvider,\n type UnicityAggregatorProviderConfig,\n} from '../../../oracle/UnicityAggregatorProvider';\nimport type { TrustBaseLoader } from '../../../oracle/oracle-provider';\n\n// Re-export shared types and classes\nexport {\n UnicityAggregatorProvider,\n type UnicityAggregatorProviderConfig,\n UnicityOracleProvider,\n type UnicityOracleProviderConfig,\n} from '../../../oracle/UnicityAggregatorProvider';\n\nexport type { TrustBaseLoader } from '../../../oracle/oracle-provider';\n\n// =============================================================================\n// Browser TrustBase Loader\n// =============================================================================\n\n/**\n * Browser TrustBase loader using fetch\n */\nexport class BrowserTrustBaseLoader implements TrustBaseLoader {\n private url: string;\n\n constructor(url: string = '/trustbase-testnet.json') {\n this.url = url;\n }\n\n async load(): Promise<unknown | null> {\n try {\n const response = await fetch(this.url);\n if (response.ok) {\n return await response.json();\n }\n } catch {\n // Ignore fetch errors\n }\n return null;\n }\n}\n\n/**\n * Create browser TrustBase loader\n */\nexport function createBrowserTrustBaseLoader(url?: string): TrustBaseLoader {\n return new BrowserTrustBaseLoader(url);\n}\n\n// =============================================================================\n// Browser Factory\n// =============================================================================\n\n/**\n * Create UnicityAggregatorProvider with browser TrustBase loader\n * Convenience factory that injects browser-specific loader\n */\nexport function createUnicityAggregatorProvider(\n config: Omit<UnicityAggregatorProviderConfig, 'trustBaseLoader'> & {\n trustBaseUrl?: string;\n }\n): UnicityAggregatorProvider {\n const { trustBaseUrl, ...restConfig } = config;\n return new UnicityAggregatorProvider({\n ...restConfig,\n trustBaseLoader: createBrowserTrustBaseLoader(trustBaseUrl),\n });\n}\n\n/** @deprecated Use createUnicityAggregatorProvider instead */\nexport const createUnicityOracleProvider = createUnicityAggregatorProvider;\n","/**\n * Browser Download Utilities\n * Functions for downloading wallet backups as files\n */\n\nimport type { Sphere } from '../../core/Sphere';\nimport type { WalletJSON, WalletJSONExportOptions } from '../../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface DownloadTextOptions {\n /** Password for encryption */\n password?: string;\n /** Number of addresses to include */\n addressCount?: number;\n /** Custom filename (without extension) */\n filename?: string;\n}\n\nexport interface DownloadJSONOptions extends WalletJSONExportOptions {\n /** Custom filename (without extension) */\n filename?: string;\n /** Pretty print JSON (default: true) */\n pretty?: boolean;\n}\n\n// =============================================================================\n// Core Download Function\n// =============================================================================\n\n/**\n * Download content as a file in the browser\n */\nexport function downloadFile(\n content: string | Blob,\n filename: string,\n mimeType: string = 'text/plain'\n): void {\n const blob = content instanceof Blob\n ? content\n : new Blob([content], { type: mimeType });\n\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = filename;\n link.click();\n\n // Clean up the URL after a short delay\n setTimeout(() => URL.revokeObjectURL(url), 100);\n}\n\n/**\n * Download text content as a .txt file\n */\nexport function downloadTextFile(content: string, filename: string): void {\n downloadFile(content, filename, 'text/plain');\n}\n\n/**\n * Download JSON content as a .json file\n */\nexport function downloadJSONFile(content: object | string, filename: string): void {\n const jsonString = typeof content === 'string'\n ? content\n : JSON.stringify(content, null, 2);\n downloadFile(jsonString, filename, 'application/json');\n}\n\n// =============================================================================\n// Wallet Download Functions\n// =============================================================================\n\n/**\n * Download wallet backup as text file\n *\n * @example\n * ```ts\n * // Download unencrypted backup\n * downloadWalletText(sphere);\n *\n * // Download encrypted backup\n * downloadWalletText(sphere, { password: 'secret' });\n *\n * // Custom filename\n * downloadWalletText(sphere, { filename: 'my-backup' });\n * ```\n */\nexport function downloadWalletText(sphere: Sphere, options: DownloadTextOptions = {}): void {\n const content = sphere.exportToTxt({\n password: options.password,\n addressCount: options.addressCount,\n });\n\n const filename = options.filename\n ? `${options.filename}.txt`\n : `sphere-wallet-${Date.now()}.txt`;\n\n downloadTextFile(content, filename);\n}\n\n/**\n * Download wallet backup as JSON file\n *\n * @example\n * ```ts\n * // Download unencrypted backup\n * downloadWalletJSON(sphere);\n *\n * // Download encrypted backup\n * downloadWalletJSON(sphere, { password: 'secret' });\n *\n * // Include multiple addresses\n * downloadWalletJSON(sphere, { addressCount: 5 });\n * ```\n */\nexport function downloadWalletJSON(sphere: Sphere, options: DownloadJSONOptions = {}): void {\n const json = sphere.exportToJSON({\n password: options.password,\n addressCount: options.addressCount,\n includeMnemonic: options.includeMnemonic,\n });\n\n const filename = options.filename\n ? `${options.filename}.json`\n : `sphere-wallet-${Date.now()}.json`;\n\n const jsonString = options.pretty !== false\n ? JSON.stringify(json, null, 2)\n : JSON.stringify(json);\n\n downloadFile(jsonString, filename, 'application/json');\n}\n\n/**\n * Download pre-built WalletJSON as file\n */\nexport function downloadWalletJSONData(json: WalletJSON, filename?: string): void {\n const name = filename || `sphere-wallet-${Date.now()}.json`;\n downloadJSONFile(json, name.endsWith('.json') ? name : `${name}.json`);\n}\n\n// =============================================================================\n// File Reading Utilities\n// =============================================================================\n\n/**\n * Read a file as text\n */\nexport function readFileAsText(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(new Error('Failed to read file'));\n reader.readAsText(file);\n });\n}\n\n/**\n * Read a file as ArrayBuffer (for binary files like .dat)\n */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as ArrayBuffer);\n reader.onerror = () => reject(new Error('Failed to read file'));\n reader.readAsArrayBuffer(file);\n });\n}\n\n/**\n * Read a file as Uint8Array (for binary files like .dat)\n */\nexport async function readFileAsUint8Array(file: File): Promise<Uint8Array> {\n const buffer = await readFileAsArrayBuffer(file);\n return new Uint8Array(buffer);\n}\n","/**\n * Configuration Resolvers\n * Utility functions for resolving provider configurations with extend/override pattern\n */\n\nimport { NETWORKS, type NetworkType, type NetworkConfig } from '../../constants';\nimport type {\n BaseTransportConfig,\n BaseOracleConfig,\n L1Config,\n ResolvedTransportConfig,\n ResolvedOracleConfig,\n} from './config';\n\n// =============================================================================\n// Network Resolution\n// =============================================================================\n\n/**\n * Get network configuration by type\n */\nexport function getNetworkConfig(network: NetworkType = 'mainnet'): NetworkConfig {\n return NETWORKS[network];\n}\n\n// =============================================================================\n// Transport Resolution\n// =============================================================================\n\n/**\n * Resolve transport configuration with extend/override pattern\n *\n * Priority:\n * 1. `relays` - replaces defaults entirely\n * 2. `additionalRelays` - extends network defaults\n * 3. Network defaults\n *\n * @example\n * ```ts\n * // Use network defaults\n * resolveTransportConfig('testnet', undefined);\n *\n * // Replace relays entirely\n * resolveTransportConfig('testnet', { relays: ['wss://custom.relay'] });\n *\n * // Extend defaults\n * resolveTransportConfig('testnet', { additionalRelays: ['wss://extra.relay'] });\n * ```\n */\nexport function resolveTransportConfig(\n network: NetworkType,\n config?: BaseTransportConfig & { reconnectDelay?: number; maxReconnectAttempts?: number }\n): ResolvedTransportConfig {\n const networkConfig = getNetworkConfig(network);\n\n // Resolve relays with extend/override pattern\n let relays: string[];\n if (config?.relays) {\n // Explicit relays - replace entirely\n relays = config.relays;\n } else {\n // Start with network defaults\n relays = [...networkConfig.nostrRelays] as string[];\n // Add additional relays if specified\n if (config?.additionalRelays) {\n relays = [...relays, ...config.additionalRelays];\n }\n }\n\n return {\n relays,\n timeout: config?.timeout,\n autoReconnect: config?.autoReconnect,\n debug: config?.debug,\n // Browser-specific\n reconnectDelay: config?.reconnectDelay,\n maxReconnectAttempts: config?.maxReconnectAttempts,\n };\n}\n\n// =============================================================================\n// Oracle Resolution\n// =============================================================================\n\n/**\n * Resolve oracle configuration with override pattern\n *\n * Uses network default URL if not explicitly provided\n *\n * @example\n * ```ts\n * // Use network default\n * resolveOracleConfig('testnet', undefined);\n *\n * // Override URL\n * resolveOracleConfig('testnet', { url: 'https://custom.aggregator' });\n * ```\n */\nexport function resolveOracleConfig(\n network: NetworkType,\n config?: BaseOracleConfig & { trustBasePath?: string }\n): ResolvedOracleConfig {\n const networkConfig = getNetworkConfig(network);\n\n return {\n url: config?.url ?? networkConfig.aggregatorUrl,\n apiKey: config?.apiKey,\n timeout: config?.timeout,\n skipVerification: config?.skipVerification,\n debug: config?.debug,\n // Node.js-specific\n trustBasePath: config?.trustBasePath,\n };\n}\n\n// =============================================================================\n// L1 Resolution\n// =============================================================================\n\n/**\n * Resolve L1 configuration with override pattern\n *\n * Only returns config if l1 is explicitly provided (L1 is optional)\n *\n * @example\n * ```ts\n * // No L1 config - returns undefined\n * resolveL1Config('testnet', undefined);\n *\n * // Enable L1 with defaults\n * resolveL1Config('testnet', {});\n *\n * // Override electrum URL\n * resolveL1Config('testnet', { electrumUrl: 'wss://custom.fulcrum:50004' });\n * ```\n */\nexport function resolveL1Config(\n network: NetworkType,\n config?: L1Config\n): L1Config | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n const networkConfig = getNetworkConfig(network);\n\n return {\n electrumUrl: config.electrumUrl ?? networkConfig.electrumUrl,\n defaultFeeRate: config.defaultFeeRate,\n enableVesting: config.enableVesting,\n };\n}\n\n// =============================================================================\n// Array Extension Helper\n// =============================================================================\n\n/**\n * Resolve array with extend/override pattern\n *\n * @param defaults - Default values from network config\n * @param replace - Values that replace defaults entirely\n * @param additional - Values to add to defaults\n * @returns Resolved array\n *\n * @example\n * ```ts\n * // Use defaults\n * resolveArrayConfig(['a', 'b'], undefined, undefined); // ['a', 'b']\n *\n * // Replace\n * resolveArrayConfig(['a', 'b'], ['x'], undefined); // ['x']\n *\n * // Extend\n * resolveArrayConfig(['a', 'b'], undefined, ['c']); // ['a', 'b', 'c']\n * ```\n */\nexport function resolveArrayConfig<T>(\n defaults: readonly T[],\n replace?: T[],\n additional?: T[]\n): T[] {\n if (replace) {\n return replace;\n }\n\n const result = [...defaults];\n if (additional) {\n return [...result, ...additional];\n }\n\n return result;\n}\n","/**\n * Browser-specific implementations\n * All platform-dependent code lives here\n */\n\nexport * from './storage';\nexport * from './transport';\nexport * from './oracle';\nexport * from './download';\n\n// Re-export shared types for convenience\nexport type {\n BaseTransportConfig,\n BaseOracleConfig,\n L1Config,\n BaseProviders,\n} from '../shared';\n\n// =============================================================================\n// Convenience Factory\n// =============================================================================\n\nimport { createLocalStorageProvider, type LocalStorageProviderConfig, createIndexedDBTokenStorageProvider } from './storage';\nimport { createNostrTransportProvider } from './transport';\nimport { createUnicityAggregatorProvider } from './oracle';\nimport type { StorageProvider, TokenStorageProvider, TxfStorageDataBase } from '../../storage';\nimport type { TransportProvider } from '../../transport';\nimport type { OracleProvider } from '../../oracle';\nimport type { NetworkType } from '../../constants';\nimport {\n type BaseTransportConfig,\n type BaseOracleConfig,\n type L1Config,\n type BrowserTransportExtensions,\n resolveTransportConfig,\n resolveOracleConfig,\n resolveL1Config,\n resolveArrayConfig,\n getNetworkConfig,\n} from '../shared';\n\n// =============================================================================\n// Browser-Specific Configuration Extensions\n// =============================================================================\n\n/**\n * Browser transport configuration\n * Extends base with browser-specific options\n */\nexport type TransportConfig = BaseTransportConfig & BrowserTransportExtensions;\n\n/**\n * Browser oracle configuration\n * Same as base (no browser-specific extensions)\n */\nexport type OracleConfig = BaseOracleConfig;\n\n// =============================================================================\n// Token Sync Backend Configurations\n// =============================================================================\n\n/**\n * IPFS sync backend configuration\n */\nexport interface IpfsSyncConfig {\n /** Enable IPFS sync (default: false) */\n enabled?: boolean;\n /** Replace default gateways entirely */\n gateways?: string[];\n /** Add gateways to network defaults */\n additionalGateways?: string[];\n /** Replace default bootstrap peers */\n bootstrapPeers?: string[];\n /** Add bootstrap peers to defaults */\n additionalBootstrapPeers?: string[];\n /** Use browser DHT (Helia) vs HTTP-only mode */\n useDht?: boolean;\n}\n\n/**\n * File sync backend configuration (future)\n */\nexport interface FileSyncConfig {\n /** Enable file sync (default: false) */\n enabled?: boolean;\n /** Directory path for token files */\n directory?: string;\n /** File format: 'json' | 'txf' */\n format?: 'json' | 'txf';\n}\n\n/**\n * Cloud sync backend configuration (future)\n */\nexport interface CloudSyncConfig {\n /** Enable cloud sync (default: false) */\n enabled?: boolean;\n /** Cloud provider */\n provider?: 'aws' | 'gcp' | 'azure' | 'custom';\n /** Bucket/container name */\n bucket?: string;\n /** API endpoint (for custom provider) */\n endpoint?: string;\n /** API key or credentials */\n apiKey?: string;\n}\n\n/**\n * MongoDB sync backend configuration\n */\nexport interface MongoDbSyncConfig {\n /** Enable MongoDB sync (default: false) */\n enabled?: boolean;\n /** MongoDB connection URI */\n uri?: string;\n /** Database name */\n database?: string;\n /** Collection name (default: 'tokens') */\n collection?: string;\n /** Enable authentication */\n authEnabled?: boolean;\n /** Username (if authEnabled) */\n username?: string;\n /** Password (if authEnabled) */\n password?: string;\n}\n\n/**\n * Token sync configuration - supports multiple backends\n */\nexport interface TokenSyncConfig {\n /** IPFS sync backend */\n ipfs?: IpfsSyncConfig;\n /** File sync backend (future) */\n file?: FileSyncConfig;\n /** Cloud sync backend (future) */\n cloud?: CloudSyncConfig;\n /** MongoDB sync backend */\n mongodb?: MongoDbSyncConfig;\n}\n\n// =============================================================================\n// Browser Providers Configuration\n// =============================================================================\n\nexport interface BrowserProvidersConfig {\n /** Network preset: mainnet, testnet, or dev. Sets default URLs for all services */\n network?: NetworkType;\n /** Storage configuration (localStorage) */\n storage?: LocalStorageProviderConfig;\n /** Transport (Nostr) configuration - supports extend/override pattern */\n transport?: TransportConfig;\n /** Oracle (Aggregator) configuration - supports extend/override pattern */\n oracle?: OracleConfig;\n /** L1 (ALPHA blockchain) configuration */\n l1?: L1Config;\n /**\n * Token sync backends configuration\n * Supports multiple backends: IPFS, file, cloud (future)\n * Each backend can be enabled/disabled independently\n */\n tokenSync?: TokenSyncConfig;\n}\n\nexport interface BrowserProviders {\n storage: StorageProvider;\n transport: TransportProvider;\n oracle: OracleProvider;\n /** Token storage provider for local persistence (IndexedDB) */\n tokenStorage: TokenStorageProvider<TxfStorageDataBase>;\n /** L1 configuration (for passing to Sphere.init) */\n l1?: L1Config;\n /**\n * Token sync configuration (resolved from tokenSync options)\n * For advanced use cases when additional sync backends are needed\n * @deprecated Use tokenStorage provider instead. For custom sync backends,\n * use Sphere.addTokenStorageProvider() after initialization.\n */\n tokenSyncConfig?: {\n ipfs?: {\n enabled: boolean;\n gateways: string[];\n bootstrapPeers?: string[];\n useDht?: boolean;\n };\n file?: {\n enabled: boolean;\n directory?: string;\n format?: 'json' | 'txf';\n };\n cloud?: {\n enabled: boolean;\n provider?: string;\n bucket?: string;\n endpoint?: string;\n apiKey?: string;\n };\n mongodb?: {\n enabled: boolean;\n uri?: string;\n database?: string;\n collection?: string;\n };\n };\n}\n\n// =============================================================================\n// Token Sync Resolution\n// =============================================================================\n\n/**\n * Resolve IPFS sync configuration with extend/override pattern\n */\nfunction resolveIpfsSyncConfig(\n network: NetworkType,\n config?: IpfsSyncConfig\n): NonNullable<BrowserProviders['tokenSyncConfig']>['ipfs'] | undefined {\n if (!config) return undefined;\n\n const networkConfig = getNetworkConfig(network);\n const gateways = resolveArrayConfig(\n networkConfig.ipfsGateways,\n config.gateways,\n config.additionalGateways\n );\n\n return {\n enabled: config.enabled ?? false,\n gateways,\n bootstrapPeers: config.bootstrapPeers ?? config.additionalBootstrapPeers,\n useDht: config.useDht,\n };\n}\n\n/**\n * Resolve all token sync backends\n */\nfunction resolveTokenSyncConfig(\n network: NetworkType,\n config?: TokenSyncConfig\n): BrowserProviders['tokenSyncConfig'] {\n if (!config) return undefined;\n\n const result: BrowserProviders['tokenSyncConfig'] = {};\n\n // IPFS backend\n const ipfs = resolveIpfsSyncConfig(network, config.ipfs);\n if (ipfs) result.ipfs = ipfs;\n\n // File backend\n if (config.file) {\n result.file = {\n enabled: config.file.enabled ?? false,\n directory: config.file.directory,\n format: config.file.format,\n };\n }\n\n // Cloud backend\n if (config.cloud) {\n result.cloud = {\n enabled: config.cloud.enabled ?? false,\n provider: config.cloud.provider,\n bucket: config.cloud.bucket,\n endpoint: config.cloud.endpoint,\n apiKey: config.cloud.apiKey,\n };\n }\n\n // MongoDB backend\n if (config.mongodb) {\n result.mongodb = {\n enabled: config.mongodb.enabled ?? false,\n uri: config.mongodb.uri,\n database: config.mongodb.database,\n collection: config.mongodb.collection,\n };\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create all browser providers with default configuration\n *\n * Supports extend/override pattern for flexible configuration:\n * - Use `network` preset for quick setup (mainnet/testnet/dev)\n * - Override specific values (e.g., `oracle.url` replaces default)\n * - Extend arrays with `additional*` (e.g., `additionalRelays` adds to defaults)\n *\n * @example\n * ```ts\n * // Simple - uses mainnet defaults\n * const providers = createBrowserProviders();\n *\n * // Testnet - all services use testnet URLs\n * const providers = createBrowserProviders({ network: 'testnet' });\n *\n * // Add extra relays to testnet defaults\n * const providers = createBrowserProviders({\n * network: 'testnet',\n * transport: {\n * additionalRelays: ['wss://my-relay.com', 'wss://backup-relay.com'],\n * },\n * });\n *\n * // Replace relays entirely (ignores network defaults)\n * const providers = createBrowserProviders({\n * network: 'testnet',\n * transport: {\n * relays: ['wss://only-this-relay.com'],\n * },\n * });\n *\n * // Use with Sphere.init (tokenStorage is automatically included)\n * const { sphere } = await Sphere.init({\n * ...providers,\n * autoGenerate: true,\n * });\n *\n * // Add additional sync backends dynamically after init\n * // await sphere.addTokenStorageProvider(myMongoDbProvider);\n * ```\n */\nexport function createBrowserProviders(config?: BrowserProvidersConfig): BrowserProviders {\n const network = config?.network ?? 'mainnet';\n\n // Resolve configurations using shared utilities\n const transportConfig = resolveTransportConfig(network, config?.transport);\n const oracleConfig = resolveOracleConfig(network, config?.oracle);\n const l1Config = resolveL1Config(network, config?.l1);\n const tokenSyncConfig = resolveTokenSyncConfig(network, config?.tokenSync);\n\n return {\n storage: createLocalStorageProvider(config?.storage),\n transport: createNostrTransportProvider({\n relays: transportConfig.relays,\n timeout: transportConfig.timeout,\n autoReconnect: transportConfig.autoReconnect,\n reconnectDelay: transportConfig.reconnectDelay,\n maxReconnectAttempts: transportConfig.maxReconnectAttempts,\n debug: transportConfig.debug,\n }),\n oracle: createUnicityAggregatorProvider({\n url: oracleConfig.url,\n apiKey: oracleConfig.apiKey,\n timeout: oracleConfig.timeout,\n skipVerification: oracleConfig.skipVerification,\n debug: oracleConfig.debug,\n }),\n tokenStorage: createIndexedDBTokenStorageProvider(),\n l1: l1Config,\n tokenSyncConfig,\n };\n}\n"],"mappings":"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","names":["identity","value","message","message","message","name","encode","length","i","j","decode","string","name","decoders","encode","decode","alphabet","string","value","encode","decode","value","decode","code","code","digest","decode","equals","base","baseCache","code","digest","equals","base","value","decode","length","cache","cid","encode","equals","length","value","length","equals","encode","decode","identity_exports","identity","identity","from","name","code","encode","digest","name","from","identity_exports","name","encode","decode","string","fromString","string","base","toString","base","length","byte","value","positive","message","toString","fromString","equals","message","toString","hashAndSign","hashAndVerify","equals","hashAndVerify","message","hashAndSign","length","N1","N2","N3","N4","N5","N6","N7","MSB","REST","encodingLength","value","REST","MSB","N4","N5","N6","N7","decode","value","length","string","read","value","length","read","encodingLength","size","alloc","value","encodingLength","length","fromString","message","CODEC_TYPES","createCodec","name","encode","decode","encode","decode","createCodec","encode","decode","createCodec","KeyType","__KeyTypeValues","PublicKey","length","PrivateKey","hashAndVerify","digest","secp","equals","hashAndVerify","secp","secp","digest","equals","fromString","toString","LIBP2P_KEY_CODE","TRANSPORT_IPFS_GATEWAY_HTTP_CODE","decode","toString","InvalidParametersError","maxValue","base","toString","fromString","value","decoders","value","code","value","code","decode","encodingLength","toString","length","fromString","bytes","string","value","inspect","symbol","validate","InvalidParametersError","code","equals","value","symbol","code","value","or","or","code","sha256","identity","sha256","name","identity","value","Buffer","identity","Buffer","message","valid","json","name"]}
|