457d1127ce84fe01a29cedc7a9e3fef559697794ec3ae9608cb0af795370c38d.json raw
1 {"ast":null,"code":"import _asyncToGenerator from \"/home/mleku/src/orly.dev/next/signer/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\n/**\n * NIP-05 Verification Helper\n *\n * Directly validates NIP-05 identifiers by fetching the .well-known/nostr.json\n * file and comparing the pubkey.\n */\n/**\n * Parse a NIP-05 identifier into its components\n * @param nip05 - The NIP-05 identifier (e.g., \"me@mleku.dev\" or \"_@mleku.dev\")\n * @returns Object with name and domain, or null if invalid\n */\nexport function parseNip05(nip05) {\n if (!nip05 || typeof nip05 !== 'string') {\n return null;\n }\n const parts = nip05.toLowerCase().trim().split('@');\n if (parts.length !== 2) {\n return null;\n }\n const [name, domain] = parts;\n if (!name || !domain) {\n return null;\n }\n // Basic domain validation\n if (!domain.includes('.') || domain.includes('/')) {\n return null;\n }\n return {\n name,\n domain\n };\n}\n/**\n * Validate a NIP-05 identifier against a pubkey\n *\n * @param nip05 - The NIP-05 identifier (e.g., \"me@mleku.dev\")\n * @param expectedPubkey - The expected pubkey in hex format\n * @param timeoutMs - Fetch timeout in milliseconds\n * @returns Validation result with status and any discovered relays\n */\nexport function validateNip05(_x, _x2) {\n return _validateNip.apply(this, arguments);\n}\nfunction _validateNip() {\n _validateNip = _asyncToGenerator(function* (nip05, expectedPubkey, timeoutMs = 10000) {\n const parsed = parseNip05(nip05);\n if (!parsed) {\n return {\n valid: false,\n error: 'Invalid NIP-05 format'\n };\n }\n const {\n name,\n domain\n } = parsed;\n const url = `https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(name)}`;\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n const response = yield fetch(url, {\n signal: controller.signal,\n headers: {\n 'Accept': 'application/json'\n }\n });\n clearTimeout(timeoutId);\n if (!response.ok) {\n return {\n valid: false,\n error: `HTTP ${response.status}: ${response.statusText}`\n };\n }\n const data = yield response.json();\n // Check if the names object exists and contains the requested name\n if (!data.names || typeof data.names !== 'object') {\n return {\n valid: false,\n error: 'Invalid nostr.json structure: missing names'\n };\n }\n // NIP-05 names are case-insensitive\n const pubkeyFromJson = data.names[name] || data.names[name.toLowerCase()];\n if (!pubkeyFromJson) {\n return {\n valid: false,\n error: `Name \"${name}\" not found in nostr.json`\n };\n }\n // Compare pubkeys (case-insensitive hex comparison)\n const normalizedExpected = expectedPubkey.toLowerCase();\n const normalizedFound = pubkeyFromJson.toLowerCase();\n const valid = normalizedExpected === normalizedFound;\n // Extract relays if present\n let relays;\n if (data.relays && typeof data.relays === 'object') {\n const relayList = data.relays[pubkeyFromJson] || data.relays[normalizedFound];\n if (Array.isArray(relayList)) {\n relays = relayList;\n }\n }\n return {\n valid,\n pubkey: pubkeyFromJson,\n relays,\n error: valid ? undefined : 'Pubkey mismatch'\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n return {\n valid: false,\n error: 'Request timeout'\n };\n }\n return {\n valid: false,\n error: error.message\n };\n }\n return {\n valid: false,\n error: 'Unknown error'\n };\n }\n });\n return _validateNip.apply(this, arguments);\n}","map":null,"metadata":{},"sourceType":"module","externalDependencies":[]}