{"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":[]}