928d271fa349754dbddf5eaf87d7b0b8fc1217f16045e78c23d62569a7a83a9f.json raw

   1  {"ast":null,"code":"import _asyncToGenerator from \"/home/mleku/src/orly.dev/next/signer/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nvar __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n  for (var name in all) __defProp(target, name, {\n    get: all[name],\n    enumerable: true\n  });\n};\n\n// pure.ts\nimport { schnorr } from \"@noble/curves/secp256k1\";\nimport { bytesToHex } from \"@noble/hashes/utils\";\n\n// core.ts\nvar verifiedSymbol = Symbol(\"verified\");\nvar isRecord = obj => obj instanceof Object;\nfunction validateEvent(event) {\n  if (!isRecord(event)) return false;\n  if (typeof event.kind !== \"number\") return false;\n  if (typeof event.content !== \"string\") return false;\n  if (typeof event.created_at !== \"number\") return false;\n  if (typeof event.pubkey !== \"string\") return false;\n  if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false;\n  if (!Array.isArray(event.tags)) return false;\n  for (let i2 = 0; i2 < event.tags.length; i2++) {\n    let tag = event.tags[i2];\n    if (!Array.isArray(tag)) return false;\n    for (let j = 0; j < tag.length; j++) {\n      if (typeof tag[j] === \"object\") return false;\n    }\n  }\n  return true;\n}\nfunction sortEvents(events) {\n  return events.sort((a, b) => {\n    if (a.created_at !== b.created_at) {\n      return b.created_at - a.created_at;\n    }\n    return a.id.localeCompare(b.id);\n  });\n}\n\n// pure.ts\nimport { sha256 } from \"@noble/hashes/sha256\";\n\n// utils.ts\nvar utils_exports = {};\n__export(utils_exports, {\n  Queue: () => Queue,\n  QueueNode: () => QueueNode,\n  binarySearch: () => binarySearch,\n  insertEventIntoAscendingList: () => insertEventIntoAscendingList,\n  insertEventIntoDescendingList: () => insertEventIntoDescendingList,\n  normalizeURL: () => normalizeURL,\n  utf8Decoder: () => utf8Decoder,\n  utf8Encoder: () => utf8Encoder\n});\nvar utf8Decoder = new TextDecoder(\"utf-8\");\nvar utf8Encoder = new TextEncoder();\nfunction normalizeURL(url) {\n  if (url.indexOf(\"://\") === -1) url = \"wss://\" + url;\n  let p = new URL(url);\n  p.pathname = p.pathname.replace(/\\/+/g, \"/\");\n  if (p.pathname.endsWith(\"/\")) p.pathname = p.pathname.slice(0, -1);\n  if (p.port === \"80\" && p.protocol === \"ws:\" || p.port === \"443\" && p.protocol === \"wss:\") p.port = \"\";\n  p.searchParams.sort();\n  p.hash = \"\";\n  return p.toString();\n}\nfunction insertEventIntoDescendingList(sortedArray, event) {\n  const [idx, found] = binarySearch(sortedArray, b => {\n    if (event.id === b.id) return 0;\n    if (event.created_at === b.created_at) return -1;\n    return b.created_at - event.created_at;\n  });\n  if (!found) {\n    sortedArray.splice(idx, 0, event);\n  }\n  return sortedArray;\n}\nfunction insertEventIntoAscendingList(sortedArray, event) {\n  const [idx, found] = binarySearch(sortedArray, b => {\n    if (event.id === b.id) return 0;\n    if (event.created_at === b.created_at) return -1;\n    return event.created_at - b.created_at;\n  });\n  if (!found) {\n    sortedArray.splice(idx, 0, event);\n  }\n  return sortedArray;\n}\nfunction binarySearch(arr, compare) {\n  let start = 0;\n  let end = arr.length - 1;\n  while (start <= end) {\n    const mid = Math.floor((start + end) / 2);\n    const cmp = compare(arr[mid]);\n    if (cmp === 0) {\n      return [mid, true];\n    }\n    if (cmp < 0) {\n      end = mid - 1;\n    } else {\n      start = mid + 1;\n    }\n  }\n  return [start, false];\n}\nvar QueueNode = class {\n  value;\n  next = null;\n  prev = null;\n  constructor(message) {\n    this.value = message;\n  }\n};\nvar Queue = class {\n  first;\n  last;\n  constructor() {\n    this.first = null;\n    this.last = null;\n  }\n  enqueue(value) {\n    const newNode = new QueueNode(value);\n    if (!this.last) {\n      this.first = newNode;\n      this.last = newNode;\n    } else if (this.last === this.first) {\n      this.last = newNode;\n      this.last.prev = this.first;\n      this.first.next = newNode;\n    } else {\n      newNode.prev = this.last;\n      this.last.next = newNode;\n      this.last = newNode;\n    }\n    return true;\n  }\n  dequeue() {\n    if (!this.first) return null;\n    if (this.first === this.last) {\n      const target2 = this.first;\n      this.first = null;\n      this.last = null;\n      return target2.value;\n    }\n    const target = this.first;\n    this.first = target.next;\n    return target.value;\n  }\n};\n\n// pure.ts\nvar JS = class {\n  generateSecretKey() {\n    return schnorr.utils.randomPrivateKey();\n  }\n  getPublicKey(secretKey) {\n    return bytesToHex(schnorr.getPublicKey(secretKey));\n  }\n  finalizeEvent(t, secretKey) {\n    const event = t;\n    event.pubkey = bytesToHex(schnorr.getPublicKey(secretKey));\n    event.id = getEventHash(event);\n    event.sig = bytesToHex(schnorr.sign(getEventHash(event), secretKey));\n    event[verifiedSymbol] = true;\n    return event;\n  }\n  verifyEvent(event) {\n    if (typeof event[verifiedSymbol] === \"boolean\") return event[verifiedSymbol];\n    const hash = getEventHash(event);\n    if (hash !== event.id) {\n      event[verifiedSymbol] = false;\n      return false;\n    }\n    try {\n      const valid = schnorr.verify(event.sig, hash, event.pubkey);\n      event[verifiedSymbol] = valid;\n      return valid;\n    } catch (err) {\n      event[verifiedSymbol] = false;\n      return false;\n    }\n  }\n};\nfunction serializeEvent(evt) {\n  if (!validateEvent(evt)) throw new Error(\"can't serialize event with wrong or missing properties\");\n  return JSON.stringify([0, evt.pubkey, evt.created_at, evt.kind, evt.tags, evt.content]);\n}\nfunction getEventHash(event) {\n  let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)));\n  return bytesToHex(eventHash);\n}\nvar i = new JS();\nvar generateSecretKey = i.generateSecretKey;\nvar getPublicKey = i.getPublicKey;\nvar finalizeEvent = i.finalizeEvent;\nvar verifyEvent = i.verifyEvent;\n\n// kinds.ts\nvar kinds_exports = {};\n__export(kinds_exports, {\n  Application: () => Application,\n  BadgeAward: () => BadgeAward,\n  BadgeDefinition: () => BadgeDefinition,\n  BlockedRelaysList: () => BlockedRelaysList,\n  BookmarkList: () => BookmarkList,\n  Bookmarksets: () => Bookmarksets,\n  Calendar: () => Calendar,\n  CalendarEventRSVP: () => CalendarEventRSVP,\n  ChannelCreation: () => ChannelCreation,\n  ChannelHideMessage: () => ChannelHideMessage,\n  ChannelMessage: () => ChannelMessage,\n  ChannelMetadata: () => ChannelMetadata,\n  ChannelMuteUser: () => ChannelMuteUser,\n  ClassifiedListing: () => ClassifiedListing,\n  ClientAuth: () => ClientAuth,\n  CommunitiesList: () => CommunitiesList,\n  CommunityDefinition: () => CommunityDefinition,\n  CommunityPostApproval: () => CommunityPostApproval,\n  Contacts: () => Contacts,\n  CreateOrUpdateProduct: () => CreateOrUpdateProduct,\n  CreateOrUpdateStall: () => CreateOrUpdateStall,\n  Curationsets: () => Curationsets,\n  Date: () => Date2,\n  DraftClassifiedListing: () => DraftClassifiedListing,\n  DraftLong: () => DraftLong,\n  Emojisets: () => Emojisets,\n  EncryptedDirectMessage: () => EncryptedDirectMessage,\n  EncryptedDirectMessages: () => EncryptedDirectMessages,\n  EventDeletion: () => EventDeletion,\n  FileMetadata: () => FileMetadata,\n  FileServerPreference: () => FileServerPreference,\n  Followsets: () => Followsets,\n  GenericRepost: () => GenericRepost,\n  Genericlists: () => Genericlists,\n  HTTPAuth: () => HTTPAuth,\n  Handlerinformation: () => Handlerinformation,\n  Handlerrecommendation: () => Handlerrecommendation,\n  Highlights: () => Highlights,\n  InterestsList: () => InterestsList,\n  Interestsets: () => Interestsets,\n  JobFeedback: () => JobFeedback,\n  JobRequest: () => JobRequest,\n  JobResult: () => JobResult,\n  Label: () => Label,\n  LightningPubRPC: () => LightningPubRPC,\n  LiveChatMessage: () => LiveChatMessage,\n  LiveEvent: () => LiveEvent,\n  LongFormArticle: () => LongFormArticle,\n  Metadata: () => Metadata,\n  Mutelist: () => Mutelist,\n  NWCWalletInfo: () => NWCWalletInfo,\n  NWCWalletRequest: () => NWCWalletRequest,\n  NWCWalletResponse: () => NWCWalletResponse,\n  NostrConnect: () => NostrConnect,\n  OpenTimestamps: () => OpenTimestamps,\n  Pinlist: () => Pinlist,\n  ProblemTracker: () => ProblemTracker,\n  ProfileBadges: () => ProfileBadges,\n  PublicChatsList: () => PublicChatsList,\n  Reaction: () => Reaction,\n  RecommendRelay: () => RecommendRelay,\n  RelayList: () => RelayList,\n  Relaysets: () => Relaysets,\n  Report: () => Report,\n  Reporting: () => Reporting,\n  Repost: () => Repost,\n  SearchRelaysList: () => SearchRelaysList,\n  ShortTextNote: () => ShortTextNote,\n  Time: () => Time,\n  UserEmojiList: () => UserEmojiList,\n  UserStatuses: () => UserStatuses,\n  Zap: () => Zap,\n  ZapGoal: () => ZapGoal,\n  ZapRequest: () => ZapRequest,\n  classifyKind: () => classifyKind,\n  isEphemeralKind: () => isEphemeralKind,\n  isParameterizedReplaceableKind: () => isParameterizedReplaceableKind,\n  isRegularKind: () => isRegularKind,\n  isReplaceableKind: () => isReplaceableKind\n});\nfunction isRegularKind(kind) {\n  return 1e3 <= kind && kind < 1e4 || [1, 2, 4, 5, 6, 7, 8, 16, 40, 41, 42, 43, 44].includes(kind);\n}\nfunction isReplaceableKind(kind) {\n  return [0, 3].includes(kind) || 1e4 <= kind && kind < 2e4;\n}\nfunction isEphemeralKind(kind) {\n  return 2e4 <= kind && kind < 3e4;\n}\nfunction isParameterizedReplaceableKind(kind) {\n  return 3e4 <= kind && kind < 4e4;\n}\nfunction classifyKind(kind) {\n  if (isRegularKind(kind)) return \"regular\";\n  if (isReplaceableKind(kind)) return \"replaceable\";\n  if (isEphemeralKind(kind)) return \"ephemeral\";\n  if (isParameterizedReplaceableKind(kind)) return \"parameterized\";\n  return \"unknown\";\n}\nvar Metadata = 0;\nvar ShortTextNote = 1;\nvar RecommendRelay = 2;\nvar Contacts = 3;\nvar EncryptedDirectMessage = 4;\nvar EncryptedDirectMessages = 4;\nvar EventDeletion = 5;\nvar Repost = 6;\nvar Reaction = 7;\nvar BadgeAward = 8;\nvar GenericRepost = 16;\nvar ChannelCreation = 40;\nvar ChannelMetadata = 41;\nvar ChannelMessage = 42;\nvar ChannelHideMessage = 43;\nvar ChannelMuteUser = 44;\nvar OpenTimestamps = 1040;\nvar FileMetadata = 1063;\nvar LiveChatMessage = 1311;\nvar ProblemTracker = 1971;\nvar Report = 1984;\nvar Reporting = 1984;\nvar Label = 1985;\nvar CommunityPostApproval = 4550;\nvar JobRequest = 5999;\nvar JobResult = 6999;\nvar JobFeedback = 7e3;\nvar ZapGoal = 9041;\nvar ZapRequest = 9734;\nvar Zap = 9735;\nvar Highlights = 9802;\nvar Mutelist = 1e4;\nvar Pinlist = 10001;\nvar RelayList = 10002;\nvar BookmarkList = 10003;\nvar CommunitiesList = 10004;\nvar PublicChatsList = 10005;\nvar BlockedRelaysList = 10006;\nvar SearchRelaysList = 10007;\nvar InterestsList = 10015;\nvar UserEmojiList = 10030;\nvar FileServerPreference = 10096;\nvar NWCWalletInfo = 13194;\nvar LightningPubRPC = 21e3;\nvar ClientAuth = 22242;\nvar NWCWalletRequest = 23194;\nvar NWCWalletResponse = 23195;\nvar NostrConnect = 24133;\nvar HTTPAuth = 27235;\nvar Followsets = 3e4;\nvar Genericlists = 30001;\nvar Relaysets = 30002;\nvar Bookmarksets = 30003;\nvar Curationsets = 30004;\nvar ProfileBadges = 30008;\nvar BadgeDefinition = 30009;\nvar Interestsets = 30015;\nvar CreateOrUpdateStall = 30017;\nvar CreateOrUpdateProduct = 30018;\nvar LongFormArticle = 30023;\nvar DraftLong = 30024;\nvar Emojisets = 30030;\nvar Application = 30078;\nvar LiveEvent = 30311;\nvar UserStatuses = 30315;\nvar ClassifiedListing = 30402;\nvar DraftClassifiedListing = 30403;\nvar Date2 = 31922;\nvar Time = 31923;\nvar Calendar = 31924;\nvar CalendarEventRSVP = 31925;\nvar Handlerrecommendation = 31989;\nvar Handlerinformation = 31990;\nvar CommunityDefinition = 34550;\n\n// filter.ts\nfunction matchFilter(filter, event) {\n  if (filter.ids && filter.ids.indexOf(event.id) === -1) {\n    return false;\n  }\n  if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) {\n    return false;\n  }\n  if (filter.authors && filter.authors.indexOf(event.pubkey) === -1) {\n    return false;\n  }\n  for (let f in filter) {\n    if (f[0] === \"#\") {\n      let tagName = f.slice(1);\n      let values = filter[`#${tagName}`];\n      if (values && !event.tags.find(([t, v]) => t === f.slice(1) && values.indexOf(v) !== -1)) return false;\n    }\n  }\n  if (filter.since && event.created_at < filter.since) return false;\n  if (filter.until && event.created_at > filter.until) return false;\n  return true;\n}\nfunction matchFilters(filters, event) {\n  for (let i2 = 0; i2 < filters.length; i2++) {\n    if (matchFilter(filters[i2], event)) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction mergeFilters(...filters) {\n  let result = {};\n  for (let i2 = 0; i2 < filters.length; i2++) {\n    let filter = filters[i2];\n    Object.entries(filter).forEach(([property, values]) => {\n      if (property === \"kinds\" || property === \"ids\" || property === \"authors\" || property[0] === \"#\") {\n        result[property] = result[property] || [];\n        for (let v = 0; v < values.length; v++) {\n          let value = values[v];\n          if (!result[property].includes(value)) result[property].push(value);\n        }\n      }\n    });\n    if (filter.limit && (!result.limit || filter.limit > result.limit)) result.limit = filter.limit;\n    if (filter.until && (!result.until || filter.until > result.until)) result.until = filter.until;\n    if (filter.since && (!result.since || filter.since < result.since)) result.since = filter.since;\n  }\n  return result;\n}\nfunction getFilterLimit(filter) {\n  if (filter.ids && !filter.ids.length) return 0;\n  if (filter.kinds && !filter.kinds.length) return 0;\n  if (filter.authors && !filter.authors.length) return 0;\n  return Math.min(Math.max(0, filter.limit ?? Infinity), filter.ids?.length ?? Infinity, filter.authors?.length && filter.kinds?.every(kind => isReplaceableKind(kind)) ? filter.authors.length * filter.kinds.length : Infinity);\n}\n\n// fakejson.ts\nvar fakejson_exports = {};\n__export(fakejson_exports, {\n  getHex64: () => getHex64,\n  getInt: () => getInt,\n  getSubscriptionId: () => getSubscriptionId,\n  matchEventId: () => matchEventId,\n  matchEventKind: () => matchEventKind,\n  matchEventPubkey: () => matchEventPubkey\n});\nfunction getHex64(json, field) {\n  let len = field.length + 3;\n  let idx = json.indexOf(`\"${field}\":`) + len;\n  let s = json.slice(idx).indexOf(`\"`) + idx + 1;\n  return json.slice(s, s + 64);\n}\nfunction getInt(json, field) {\n  let len = field.length;\n  let idx = json.indexOf(`\"${field}\":`) + len + 3;\n  let sliced = json.slice(idx);\n  let end = Math.min(sliced.indexOf(\",\"), sliced.indexOf(\"}\"));\n  return parseInt(sliced.slice(0, end), 10);\n}\nfunction getSubscriptionId(json) {\n  let idx = json.slice(0, 22).indexOf(`\"EVENT\"`);\n  if (idx === -1) return null;\n  let pstart = json.slice(idx + 7 + 1).indexOf(`\"`);\n  if (pstart === -1) return null;\n  let start = idx + 7 + 1 + pstart;\n  let pend = json.slice(start + 1, 80).indexOf(`\"`);\n  if (pend === -1) return null;\n  let end = start + 1 + pend;\n  return json.slice(start + 1, end);\n}\nfunction matchEventId(json, id) {\n  return id === getHex64(json, \"id\");\n}\nfunction matchEventPubkey(json, pubkey) {\n  return pubkey === getHex64(json, \"pubkey\");\n}\nfunction matchEventKind(json, kind) {\n  return kind === getInt(json, \"kind\");\n}\n\n// nip42.ts\nvar nip42_exports = {};\n__export(nip42_exports, {\n  makeAuthEvent: () => makeAuthEvent\n});\nfunction makeAuthEvent(relayURL, challenge) {\n  return {\n    kind: ClientAuth,\n    created_at: Math.floor(Date.now() / 1e3),\n    tags: [[\"relay\", relayURL], [\"challenge\", challenge]],\n    content: \"\"\n  };\n}\n\n// helpers.ts\nfunction yieldThread() {\n  return _yieldThread.apply(this, arguments);\n}\nfunction _yieldThread() {\n  _yieldThread = _asyncToGenerator(function* () {\n    return new Promise(resolve => {\n      const ch = new MessageChannel();\n      const handler = () => {\n        ch.port1.removeEventListener(\"message\", handler);\n        resolve();\n      };\n      ch.port1.addEventListener(\"message\", handler);\n      ch.port2.postMessage(0);\n      ch.port1.start();\n    });\n  });\n  return _yieldThread.apply(this, arguments);\n}\nvar alwaysTrue = t => {\n  t[verifiedSymbol] = true;\n  return true;\n};\n\n// abstract-relay.ts\nvar AbstractRelay = class {\n  url;\n  _connected = false;\n  onclose = null;\n  onnotice = msg => console.debug(`NOTICE from ${this.url}: ${msg}`);\n  _onauth = null;\n  baseEoseTimeout = 4400;\n  connectionTimeout = 4400;\n  openSubs = /* @__PURE__ */new Map();\n  connectionTimeoutHandle;\n  connectionPromise;\n  openCountRequests = /* @__PURE__ */new Map();\n  openEventPublishes = /* @__PURE__ */new Map();\n  ws;\n  incomingMessageQueue = new Queue();\n  queueRunning = false;\n  challenge;\n  serial = 0;\n  verifyEvent;\n  _WebSocket;\n  constructor(url, opts) {\n    this.url = normalizeURL(url);\n    this.verifyEvent = opts.verifyEvent;\n    this._WebSocket = opts.websocketImplementation || WebSocket;\n  }\n  static connect(url, opts) {\n    return _asyncToGenerator(function* () {\n      const relay = new AbstractRelay(url, opts);\n      yield relay.connect();\n      return relay;\n    })();\n  }\n  closeAllSubscriptions(reason) {\n    for (let [_, sub] of this.openSubs) {\n      sub.close(reason);\n    }\n    this.openSubs.clear();\n    for (let [_, ep] of this.openEventPublishes) {\n      ep.reject(new Error(reason));\n    }\n    this.openEventPublishes.clear();\n    for (let [_, cr] of this.openCountRequests) {\n      cr.reject(new Error(reason));\n    }\n    this.openCountRequests.clear();\n  }\n  get connected() {\n    return this._connected;\n  }\n  connect() {\n    var _this = this;\n    return _asyncToGenerator(function* () {\n      if (_this.connectionPromise) return _this.connectionPromise;\n      _this.challenge = void 0;\n      _this.connectionPromise = new Promise((resolve, reject) => {\n        _this.connectionTimeoutHandle = setTimeout(() => {\n          reject(\"connection timed out\");\n          _this.connectionPromise = void 0;\n          _this.onclose?.();\n          _this.closeAllSubscriptions(\"relay connection timed out\");\n        }, _this.connectionTimeout);\n        try {\n          _this.ws = new _this._WebSocket(_this.url);\n        } catch (err) {\n          reject(err);\n          return;\n        }\n        _this.ws.onopen = () => {\n          clearTimeout(_this.connectionTimeoutHandle);\n          _this._connected = true;\n          resolve();\n        };\n        _this.ws.onerror = ev => {\n          reject(ev.message);\n          if (_this._connected) {\n            _this._connected = false;\n            _this.connectionPromise = void 0;\n            _this.onclose?.();\n            _this.closeAllSubscriptions(\"relay connection errored\");\n          }\n        };\n        _this.ws.onclose = /*#__PURE__*/_asyncToGenerator(function* () {\n          if (_this._connected) {\n            _this._connected = false;\n            _this.connectionPromise = void 0;\n            _this.onclose?.();\n            _this.closeAllSubscriptions(\"relay connection closed\");\n          }\n        });\n        _this.ws.onmessage = _this._onmessage.bind(_this);\n      });\n      return _this.connectionPromise;\n    })();\n  }\n  runQueue() {\n    var _this2 = this;\n    return _asyncToGenerator(function* () {\n      _this2.queueRunning = true;\n      while (true) {\n        if (false === _this2.handleNext()) {\n          break;\n        }\n        yield yieldThread();\n      }\n      _this2.queueRunning = false;\n    })();\n  }\n  handleNext() {\n    const json = this.incomingMessageQueue.dequeue();\n    if (!json) {\n      return false;\n    }\n    const subid = getSubscriptionId(json);\n    if (subid) {\n      const so = this.openSubs.get(subid);\n      if (!so) {\n        return;\n      }\n      const id = getHex64(json, \"id\");\n      const alreadyHave = so.alreadyHaveEvent?.(id);\n      so.receivedEvent?.(this, id);\n      if (alreadyHave) {\n        return;\n      }\n    }\n    try {\n      let data = JSON.parse(json);\n      switch (data[0]) {\n        case \"EVENT\":\n          {\n            const so = this.openSubs.get(data[1]);\n            const event = data[2];\n            if (this.verifyEvent(event) && matchFilters(so.filters, event)) {\n              so.onevent(event);\n            }\n            return;\n          }\n        case \"COUNT\":\n          {\n            const id = data[1];\n            const payload = data[2];\n            const cr = this.openCountRequests.get(id);\n            if (cr) {\n              cr.resolve(payload.count);\n              this.openCountRequests.delete(id);\n            }\n            return;\n          }\n        case \"EOSE\":\n          {\n            const so = this.openSubs.get(data[1]);\n            if (!so) return;\n            so.receivedEose();\n            return;\n          }\n        case \"OK\":\n          {\n            const id = data[1];\n            const ok = data[2];\n            const reason = data[3];\n            const ep = this.openEventPublishes.get(id);\n            if (ok) ep.resolve(reason);else ep.reject(new Error(reason));\n            this.openEventPublishes.delete(id);\n            return;\n          }\n        case \"CLOSED\":\n          {\n            const id = data[1];\n            const so = this.openSubs.get(id);\n            if (!so) return;\n            so.closed = true;\n            so.close(data[2]);\n            return;\n          }\n        case \"NOTICE\":\n          this.onnotice(data[1]);\n          return;\n        case \"AUTH\":\n          {\n            this.challenge = data[1];\n            this._onauth?.(data[1]);\n            return;\n          }\n      }\n    } catch (err) {\n      return;\n    }\n  }\n  send(message) {\n    var _this3 = this;\n    return _asyncToGenerator(function* () {\n      if (!_this3.connectionPromise) throw new Error(\"sending on closed connection\");\n      _this3.connectionPromise.then(() => {\n        _this3.ws?.send(message);\n      });\n    })();\n  }\n  auth(signAuthEvent) {\n    var _this4 = this;\n    return _asyncToGenerator(function* () {\n      if (!_this4.challenge) throw new Error(\"can't perform auth, no challenge was received\");\n      const evt = yield signAuthEvent(makeAuthEvent(_this4.url, _this4.challenge));\n      const ret = new Promise((resolve, reject) => {\n        _this4.openEventPublishes.set(evt.id, {\n          resolve,\n          reject\n        });\n      });\n      _this4.send('[\"AUTH\",' + JSON.stringify(evt) + \"]\");\n      return ret;\n    })();\n  }\n  publish(event) {\n    var _this5 = this;\n    return _asyncToGenerator(function* () {\n      const ret = new Promise((resolve, reject) => {\n        _this5.openEventPublishes.set(event.id, {\n          resolve,\n          reject\n        });\n      });\n      _this5.send('[\"EVENT\",' + JSON.stringify(event) + \"]\");\n      return ret;\n    })();\n  }\n  count(filters, params) {\n    var _this6 = this;\n    return _asyncToGenerator(function* () {\n      _this6.serial++;\n      const id = params?.id || \"count:\" + _this6.serial;\n      const ret = new Promise((resolve, reject) => {\n        _this6.openCountRequests.set(id, {\n          resolve,\n          reject\n        });\n      });\n      _this6.send('[\"COUNT\",\"' + id + '\",' + JSON.stringify(filters).substring(1));\n      return ret;\n    })();\n  }\n  subscribe(filters, params) {\n    const subscription = this.prepareSubscription(filters, params);\n    subscription.fire();\n    return subscription;\n  }\n  prepareSubscription(filters, params) {\n    this.serial++;\n    const id = params.id || \"sub:\" + this.serial;\n    const subscription = new Subscription(this, id, filters, params);\n    this.openSubs.set(id, subscription);\n    return subscription;\n  }\n  close() {\n    this.closeAllSubscriptions(\"relay connection closed by us\");\n    this._connected = false;\n    this.ws?.close();\n  }\n  _onmessage(ev) {\n    this.incomingMessageQueue.enqueue(ev.data);\n    if (!this.queueRunning) {\n      this.runQueue();\n    }\n  }\n};\nvar Subscription = class {\n  relay;\n  id;\n  closed = false;\n  eosed = false;\n  filters;\n  alreadyHaveEvent;\n  receivedEvent;\n  onevent;\n  oneose;\n  onclose;\n  eoseTimeout;\n  eoseTimeoutHandle;\n  constructor(relay, id, filters, params) {\n    this.relay = relay;\n    this.filters = filters;\n    this.id = id;\n    this.alreadyHaveEvent = params.alreadyHaveEvent;\n    this.receivedEvent = params.receivedEvent;\n    this.eoseTimeout = params.eoseTimeout || relay.baseEoseTimeout;\n    this.oneose = params.oneose;\n    this.onclose = params.onclose;\n    this.onevent = params.onevent || (event => {\n      console.warn(`onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`, event);\n    });\n  }\n  fire() {\n    this.relay.send('[\"REQ\",\"' + this.id + '\",' + JSON.stringify(this.filters).substring(1));\n    this.eoseTimeoutHandle = setTimeout(this.receivedEose.bind(this), this.eoseTimeout);\n  }\n  receivedEose() {\n    if (this.eosed) return;\n    clearTimeout(this.eoseTimeoutHandle);\n    this.eosed = true;\n    this.oneose?.();\n  }\n  close(reason = \"closed by caller\") {\n    if (!this.closed && this.relay.connected) {\n      this.relay.send('[\"CLOSE\",' + JSON.stringify(this.id) + \"]\");\n      this.closed = true;\n    }\n    this.relay.openSubs.delete(this.id);\n    this.onclose?.(reason);\n  }\n};\n\n// relay.ts\nvar _WebSocket;\ntry {\n  _WebSocket = WebSocket;\n} catch {}\nvar Relay = class extends AbstractRelay {\n  constructor(url) {\n    super(url, {\n      verifyEvent,\n      websocketImplementation: _WebSocket\n    });\n  }\n  static connect(url) {\n    return _asyncToGenerator(function* () {\n      const relay = new Relay(url);\n      yield relay.connect();\n      return relay;\n    })();\n  }\n};\n\n// abstract-pool.ts\nvar AbstractSimplePool = class {\n  relays = /* @__PURE__ */new Map();\n  seenOn = /* @__PURE__ */new Map();\n  trackRelays = false;\n  verifyEvent;\n  trustedRelayURLs = /* @__PURE__ */new Set();\n  _WebSocket;\n  constructor(opts) {\n    this.verifyEvent = opts.verifyEvent;\n    this._WebSocket = opts.websocketImplementation;\n  }\n  ensureRelay(url, params) {\n    var _this7 = this;\n    return _asyncToGenerator(function* () {\n      url = normalizeURL(url);\n      let relay = _this7.relays.get(url);\n      if (!relay) {\n        relay = new AbstractRelay(url, {\n          verifyEvent: _this7.trustedRelayURLs.has(url) ? alwaysTrue : _this7.verifyEvent,\n          websocketImplementation: _this7._WebSocket\n        });\n        if (params?.connectionTimeout) relay.connectionTimeout = params.connectionTimeout;\n        _this7.relays.set(url, relay);\n      }\n      yield relay.connect();\n      return relay;\n    })();\n  }\n  close(relays) {\n    relays.map(normalizeURL).forEach(url => {\n      this.relays.get(url)?.close();\n    });\n  }\n  subscribeMany(relays, filters, params) {\n    return this.subscribeManyMap(Object.fromEntries(relays.map(url => [url, filters])), params);\n  }\n  subscribeManyMap(requests, params) {\n    var _this8 = this;\n    if (this.trackRelays) {\n      params.receivedEvent = (relay, id) => {\n        let set = this.seenOn.get(id);\n        if (!set) {\n          set = /* @__PURE__ */new Set();\n          this.seenOn.set(id, set);\n        }\n        set.add(relay);\n      };\n    }\n    const _knownIds = /* @__PURE__ */new Set();\n    const subs = [];\n    const relaysLength = Object.keys(requests).length;\n    const eosesReceived = [];\n    let handleEose = i2 => {\n      eosesReceived[i2] = true;\n      if (eosesReceived.filter(a => a).length === relaysLength) {\n        params.oneose?.();\n        handleEose = () => {};\n      }\n    };\n    const closesReceived = [];\n    let handleClose = (i2, reason) => {\n      handleEose(i2);\n      closesReceived[i2] = reason;\n      if (closesReceived.filter(a => a).length === relaysLength) {\n        params.onclose?.(closesReceived);\n        handleClose = () => {};\n      }\n    };\n    const localAlreadyHaveEventHandler = id => {\n      if (params.alreadyHaveEvent?.(id)) {\n        return true;\n      }\n      const have = _knownIds.has(id);\n      _knownIds.add(id);\n      return have;\n    };\n    const allOpened = Promise.all(Object.entries(requests).map(/*#__PURE__*/function () {\n      var _ref2 = _asyncToGenerator(function* (req, i2, arr) {\n        if (arr.indexOf(req) !== i2) {\n          handleClose(i2, \"duplicate url\");\n          return;\n        }\n        let [url, filters] = req;\n        url = normalizeURL(url);\n        let relay;\n        try {\n          relay = yield _this8.ensureRelay(url, {\n            connectionTimeout: params.maxWait ? Math.max(params.maxWait * 0.8, params.maxWait - 1e3) : void 0\n          });\n        } catch (err) {\n          handleClose(i2, err?.message || String(err));\n          return;\n        }\n        let subscription = relay.subscribe(filters, {\n          ...params,\n          oneose: () => handleEose(i2),\n          onclose: reason => handleClose(i2, reason),\n          alreadyHaveEvent: localAlreadyHaveEventHandler,\n          eoseTimeout: params.maxWait\n        });\n        subs.push(subscription);\n      });\n      return function (_x, _x2, _x3) {\n        return _ref2.apply(this, arguments);\n      };\n    }()));\n    return {\n      close() {\n        return _asyncToGenerator(function* () {\n          yield allOpened;\n          subs.forEach(sub => {\n            sub.close();\n          });\n        })();\n      }\n    };\n  }\n  subscribeManyEose(relays, filters, params) {\n    const subcloser = this.subscribeMany(relays, filters, {\n      ...params,\n      oneose() {\n        subcloser.close();\n      }\n    });\n    return subcloser;\n  }\n  querySync(relays, filter, params) {\n    var _this9 = this;\n    return _asyncToGenerator(function* () {\n      return new Promise(/*#__PURE__*/function () {\n        var _ref3 = _asyncToGenerator(function* (resolve) {\n          const events = [];\n          _this9.subscribeManyEose(relays, [filter], {\n            ...params,\n            onevent(event) {\n              events.push(event);\n            },\n            onclose(_) {\n              resolve(events);\n            }\n          });\n        });\n        return function (_x4) {\n          return _ref3.apply(this, arguments);\n        };\n      }());\n    })();\n  }\n  get(relays, filter, params) {\n    var _this0 = this;\n    return _asyncToGenerator(function* () {\n      filter.limit = 1;\n      const events = yield _this0.querySync(relays, filter, params);\n      events.sort((a, b) => b.created_at - a.created_at);\n      return events[0] || null;\n    })();\n  }\n  publish(relays, event) {\n    var _this1 = this;\n    return relays.map(normalizeURL).map(/*#__PURE__*/function () {\n      var _ref4 = _asyncToGenerator(function* (url, i2, arr) {\n        if (arr.indexOf(url) !== i2) {\n          return Promise.reject(\"duplicate url\");\n        }\n        let r = yield _this1.ensureRelay(url);\n        return r.publish(event);\n      });\n      return function (_x5, _x6, _x7) {\n        return _ref4.apply(this, arguments);\n      };\n    }());\n  }\n};\n\n// pool.ts\nvar _WebSocket2;\ntry {\n  _WebSocket2 = WebSocket;\n} catch {}\nvar SimplePool = class extends AbstractSimplePool {\n  constructor() {\n    super({\n      verifyEvent,\n      websocketImplementation: _WebSocket2\n    });\n  }\n};\n\n// nip19.ts\nvar nip19_exports = {};\n__export(nip19_exports, {\n  BECH32_REGEX: () => BECH32_REGEX,\n  Bech32MaxSize: () => Bech32MaxSize,\n  decode: () => decode,\n  encodeBytes: () => encodeBytes,\n  naddrEncode: () => naddrEncode,\n  neventEncode: () => neventEncode,\n  noteEncode: () => noteEncode,\n  nprofileEncode: () => nprofileEncode,\n  npubEncode: () => npubEncode,\n  nrelayEncode: () => nrelayEncode,\n  nsecEncode: () => nsecEncode\n});\nimport { bytesToHex as bytesToHex2, concatBytes, hexToBytes } from \"@noble/hashes/utils\";\nimport { bech32 } from \"@scure/base\";\nvar Bech32MaxSize = 5e3;\nvar BECH32_REGEX = /[\\x21-\\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;\nfunction integerToUint8Array(number) {\n  const uint8Array = new Uint8Array(4);\n  uint8Array[0] = number >> 24 & 255;\n  uint8Array[1] = number >> 16 & 255;\n  uint8Array[2] = number >> 8 & 255;\n  uint8Array[3] = number & 255;\n  return uint8Array;\n}\nfunction decode(nip19) {\n  let {\n    prefix,\n    words\n  } = bech32.decode(nip19, Bech32MaxSize);\n  let data = new Uint8Array(bech32.fromWords(words));\n  switch (prefix) {\n    case \"nprofile\":\n      {\n        let tlv = parseTLV(data);\n        if (!tlv[0]?.[0]) throw new Error(\"missing TLV 0 for nprofile\");\n        if (tlv[0][0].length !== 32) throw new Error(\"TLV 0 should be 32 bytes\");\n        return {\n          type: \"nprofile\",\n          data: {\n            pubkey: bytesToHex2(tlv[0][0]),\n            relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n          }\n        };\n      }\n    case \"nevent\":\n      {\n        let tlv = parseTLV(data);\n        if (!tlv[0]?.[0]) throw new Error(\"missing TLV 0 for nevent\");\n        if (tlv[0][0].length !== 32) throw new Error(\"TLV 0 should be 32 bytes\");\n        if (tlv[2] && tlv[2][0].length !== 32) throw new Error(\"TLV 2 should be 32 bytes\");\n        if (tlv[3] && tlv[3][0].length !== 4) throw new Error(\"TLV 3 should be 4 bytes\");\n        return {\n          type: \"nevent\",\n          data: {\n            id: bytesToHex2(tlv[0][0]),\n            relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n            author: tlv[2]?.[0] ? bytesToHex2(tlv[2][0]) : void 0,\n            kind: tlv[3]?.[0] ? parseInt(bytesToHex2(tlv[3][0]), 16) : void 0\n          }\n        };\n      }\n    case \"naddr\":\n      {\n        let tlv = parseTLV(data);\n        if (!tlv[0]?.[0]) throw new Error(\"missing TLV 0 for naddr\");\n        if (!tlv[2]?.[0]) throw new Error(\"missing TLV 2 for naddr\");\n        if (tlv[2][0].length !== 32) throw new Error(\"TLV 2 should be 32 bytes\");\n        if (!tlv[3]?.[0]) throw new Error(\"missing TLV 3 for naddr\");\n        if (tlv[3][0].length !== 4) throw new Error(\"TLV 3 should be 4 bytes\");\n        return {\n          type: \"naddr\",\n          data: {\n            identifier: utf8Decoder.decode(tlv[0][0]),\n            pubkey: bytesToHex2(tlv[2][0]),\n            kind: parseInt(bytesToHex2(tlv[3][0]), 16),\n            relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n          }\n        };\n      }\n    case \"nrelay\":\n      {\n        let tlv = parseTLV(data);\n        if (!tlv[0]?.[0]) throw new Error(\"missing TLV 0 for nrelay\");\n        return {\n          type: \"nrelay\",\n          data: utf8Decoder.decode(tlv[0][0])\n        };\n      }\n    case \"nsec\":\n      return {\n        type: prefix,\n        data\n      };\n    case \"npub\":\n    case \"note\":\n      return {\n        type: prefix,\n        data: bytesToHex2(data)\n      };\n    default:\n      throw new Error(`unknown prefix ${prefix}`);\n  }\n}\nfunction parseTLV(data) {\n  let result = {};\n  let rest = data;\n  while (rest.length > 0) {\n    let t = rest[0];\n    let l = rest[1];\n    let v = rest.slice(2, 2 + l);\n    rest = rest.slice(2 + l);\n    if (v.length < l) throw new Error(`not enough data to read on TLV ${t}`);\n    result[t] = result[t] || [];\n    result[t].push(v);\n  }\n  return result;\n}\nfunction nsecEncode(key) {\n  return encodeBytes(\"nsec\", key);\n}\nfunction npubEncode(hex) {\n  return encodeBytes(\"npub\", hexToBytes(hex));\n}\nfunction noteEncode(hex) {\n  return encodeBytes(\"note\", hexToBytes(hex));\n}\nfunction encodeBech32(prefix, data) {\n  let words = bech32.toWords(data);\n  return bech32.encode(prefix, words, Bech32MaxSize);\n}\nfunction encodeBytes(prefix, bytes) {\n  return encodeBech32(prefix, bytes);\n}\nfunction nprofileEncode(profile) {\n  let data = encodeTLV({\n    0: [hexToBytes(profile.pubkey)],\n    1: (profile.relays || []).map(url => utf8Encoder.encode(url))\n  });\n  return encodeBech32(\"nprofile\", data);\n}\nfunction neventEncode(event) {\n  let kindArray;\n  if (event.kind !== void 0) {\n    kindArray = integerToUint8Array(event.kind);\n  }\n  let data = encodeTLV({\n    0: [hexToBytes(event.id)],\n    1: (event.relays || []).map(url => utf8Encoder.encode(url)),\n    2: event.author ? [hexToBytes(event.author)] : [],\n    3: kindArray ? [new Uint8Array(kindArray)] : []\n  });\n  return encodeBech32(\"nevent\", data);\n}\nfunction naddrEncode(addr) {\n  let kind = new ArrayBuffer(4);\n  new DataView(kind).setUint32(0, addr.kind, false);\n  let data = encodeTLV({\n    0: [utf8Encoder.encode(addr.identifier)],\n    1: (addr.relays || []).map(url => utf8Encoder.encode(url)),\n    2: [hexToBytes(addr.pubkey)],\n    3: [new Uint8Array(kind)]\n  });\n  return encodeBech32(\"naddr\", data);\n}\nfunction nrelayEncode(url) {\n  let data = encodeTLV({\n    0: [utf8Encoder.encode(url)]\n  });\n  return encodeBech32(\"nrelay\", data);\n}\nfunction encodeTLV(tlv) {\n  let entries = [];\n  Object.entries(tlv).reverse().forEach(([t, vs]) => {\n    vs.forEach(v => {\n      let entry = new Uint8Array(v.length + 2);\n      entry.set([parseInt(t)], 0);\n      entry.set([v.length], 1);\n      entry.set(v, 2);\n      entries.push(entry);\n    });\n  });\n  return concatBytes(...entries);\n}\n\n// references.ts\nvar mentionRegex = /\\bnostr:((note|npub|naddr|nevent|nprofile)1\\w+)\\b|#\\[(\\d+)\\]/g;\nfunction parseReferences(evt) {\n  let references = [];\n  for (let ref of evt.content.matchAll(mentionRegex)) {\n    if (ref[2]) {\n      try {\n        let {\n          type,\n          data\n        } = decode(ref[1]);\n        switch (type) {\n          case \"npub\":\n            {\n              references.push({\n                text: ref[0],\n                profile: {\n                  pubkey: data,\n                  relays: []\n                }\n              });\n              break;\n            }\n          case \"nprofile\":\n            {\n              references.push({\n                text: ref[0],\n                profile: data\n              });\n              break;\n            }\n          case \"note\":\n            {\n              references.push({\n                text: ref[0],\n                event: {\n                  id: data,\n                  relays: []\n                }\n              });\n              break;\n            }\n          case \"nevent\":\n            {\n              references.push({\n                text: ref[0],\n                event: data\n              });\n              break;\n            }\n          case \"naddr\":\n            {\n              references.push({\n                text: ref[0],\n                address: data\n              });\n              break;\n            }\n        }\n      } catch (err) {}\n    } else if (ref[3]) {\n      let idx = parseInt(ref[3], 10);\n      let tag = evt.tags[idx];\n      if (!tag) continue;\n      switch (tag[0]) {\n        case \"p\":\n          {\n            references.push({\n              text: ref[0],\n              profile: {\n                pubkey: tag[1],\n                relays: tag[2] ? [tag[2]] : []\n              }\n            });\n            break;\n          }\n        case \"e\":\n          {\n            references.push({\n              text: ref[0],\n              event: {\n                id: tag[1],\n                relays: tag[2] ? [tag[2]] : []\n              }\n            });\n            break;\n          }\n        case \"a\":\n          {\n            try {\n              let [kind, pubkey, identifier] = tag[1].split(\":\");\n              references.push({\n                text: ref[0],\n                address: {\n                  identifier,\n                  pubkey,\n                  kind: parseInt(kind, 10),\n                  relays: tag[2] ? [tag[2]] : []\n                }\n              });\n            } catch (err) {}\n            break;\n          }\n      }\n    }\n  }\n  return references;\n}\n\n// nip04.ts\nvar nip04_exports = {};\n__export(nip04_exports, {\n  decrypt: () => decrypt,\n  encrypt: () => encrypt\n});\nimport { bytesToHex as bytesToHex3, randomBytes } from \"@noble/hashes/utils\";\nimport { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { cbc } from \"@noble/ciphers/aes\";\nimport { base64 } from \"@scure/base\";\nfunction encrypt(_x8, _x9, _x0) {\n  return _encrypt.apply(this, arguments);\n}\nfunction _encrypt() {\n  _encrypt = _asyncToGenerator(function* (secretKey, pubkey, text) {\n    const privkey = secretKey instanceof Uint8Array ? bytesToHex3(secretKey) : secretKey;\n    const key = secp256k1.getSharedSecret(privkey, \"02\" + pubkey);\n    const normalizedKey = getNormalizedX(key);\n    let iv = Uint8Array.from(randomBytes(16));\n    let plaintext = utf8Encoder.encode(text);\n    let ciphertext = cbc(normalizedKey, iv).encrypt(plaintext);\n    let ctb64 = base64.encode(new Uint8Array(ciphertext));\n    let ivb64 = base64.encode(new Uint8Array(iv.buffer));\n    return `${ctb64}?iv=${ivb64}`;\n  });\n  return _encrypt.apply(this, arguments);\n}\nfunction decrypt(_x1, _x10, _x11) {\n  return _decrypt.apply(this, arguments);\n}\nfunction _decrypt() {\n  _decrypt = _asyncToGenerator(function* (secretKey, pubkey, data) {\n    const privkey = secretKey instanceof Uint8Array ? bytesToHex3(secretKey) : secretKey;\n    let [ctb64, ivb64] = data.split(\"?iv=\");\n    let key = secp256k1.getSharedSecret(privkey, \"02\" + pubkey);\n    let normalizedKey = getNormalizedX(key);\n    let iv = base64.decode(ivb64);\n    let ciphertext = base64.decode(ctb64);\n    let plaintext = cbc(normalizedKey, iv).decrypt(ciphertext);\n    return utf8Decoder.decode(plaintext);\n  });\n  return _decrypt.apply(this, arguments);\n}\nfunction getNormalizedX(key) {\n  return key.slice(1, 33);\n}\n\n// nip05.ts\nvar nip05_exports = {};\n__export(nip05_exports, {\n  NIP05_REGEX: () => NIP05_REGEX,\n  isValid: () => isValid,\n  queryProfile: () => queryProfile,\n  searchDomain: () => searchDomain,\n  useFetchImplementation: () => useFetchImplementation\n});\nvar NIP05_REGEX = /^(?:([\\w.+-]+)@)?([\\w_-]+(\\.[\\w_-]+)+)$/;\nvar _fetch;\ntry {\n  _fetch = fetch;\n} catch {}\nfunction useFetchImplementation(fetchImplementation) {\n  _fetch = fetchImplementation;\n}\nfunction searchDomain(_x12) {\n  return _searchDomain.apply(this, arguments);\n}\nfunction _searchDomain() {\n  _searchDomain = _asyncToGenerator(function* (domain, query = \"\") {\n    try {\n      const url = `https://${domain}/.well-known/nostr.json?name=${query}`;\n      const res = yield _fetch(url, {\n        redirect: \"error\"\n      });\n      const json = yield res.json();\n      return json.names;\n    } catch (_) {\n      return {};\n    }\n  });\n  return _searchDomain.apply(this, arguments);\n}\nfunction queryProfile(_x13) {\n  return _queryProfile.apply(this, arguments);\n}\nfunction _queryProfile() {\n  _queryProfile = _asyncToGenerator(function* (fullname) {\n    const match = fullname.match(NIP05_REGEX);\n    if (!match) return null;\n    const [_, name = \"_\", domain] = match;\n    try {\n      const url = `https://${domain}/.well-known/nostr.json?name=${name}`;\n      const res = yield (yield _fetch(url, {\n        redirect: \"error\"\n      })).json();\n      let pubkey = res.names[name];\n      return pubkey ? {\n        pubkey,\n        relays: res.relays?.[pubkey]\n      } : null;\n    } catch (_e) {\n      return null;\n    }\n  });\n  return _queryProfile.apply(this, arguments);\n}\nfunction isValid(_x14, _x15) {\n  return _isValid.apply(this, arguments);\n} // nip10.ts\nfunction _isValid() {\n  _isValid = _asyncToGenerator(function* (pubkey, nip05) {\n    let res = yield queryProfile(nip05);\n    return res ? res.pubkey === pubkey : false;\n  });\n  return _isValid.apply(this, arguments);\n}\nvar nip10_exports = {};\n__export(nip10_exports, {\n  parse: () => parse\n});\nfunction parse(event) {\n  const result = {\n    reply: void 0,\n    root: void 0,\n    mentions: [],\n    profiles: []\n  };\n  const eTags = [];\n  for (const tag of event.tags) {\n    if (tag[0] === \"e\" && tag[1]) {\n      eTags.push(tag);\n    }\n    if (tag[0] === \"p\" && tag[1]) {\n      result.profiles.push({\n        pubkey: tag[1],\n        relays: tag[2] ? [tag[2]] : []\n      });\n    }\n  }\n  for (let eTagIndex = 0; eTagIndex < eTags.length; eTagIndex++) {\n    const eTag = eTags[eTagIndex];\n    const [_, eTagEventId, eTagRelayUrl, eTagMarker] = eTag;\n    const eventPointer = {\n      id: eTagEventId,\n      relays: eTagRelayUrl ? [eTagRelayUrl] : []\n    };\n    const isFirstETag = eTagIndex === 0;\n    const isLastETag = eTagIndex === eTags.length - 1;\n    if (eTagMarker === \"root\") {\n      result.root = eventPointer;\n      continue;\n    }\n    if (eTagMarker === \"reply\") {\n      result.reply = eventPointer;\n      continue;\n    }\n    if (eTagMarker === \"mention\") {\n      result.mentions.push(eventPointer);\n      continue;\n    }\n    if (isFirstETag) {\n      result.root = eventPointer;\n      continue;\n    }\n    if (isLastETag) {\n      result.reply = eventPointer;\n      continue;\n    }\n    result.mentions.push(eventPointer);\n  }\n  return result;\n}\n\n// nip11.ts\nvar nip11_exports = {};\n__export(nip11_exports, {\n  fetchRelayInformation: () => fetchRelayInformation,\n  useFetchImplementation: () => useFetchImplementation2\n});\nvar _fetch2;\ntry {\n  _fetch2 = fetch;\n} catch {}\nfunction useFetchImplementation2(fetchImplementation) {\n  _fetch2 = fetchImplementation;\n}\nfunction fetchRelayInformation(_x16) {\n  return _fetchRelayInformation.apply(this, arguments);\n} // nip13.ts\nfunction _fetchRelayInformation() {\n  _fetchRelayInformation = _asyncToGenerator(function* (url) {\n    return yield (yield fetch(url.replace(\"ws://\", \"http://\").replace(\"wss://\", \"https://\"), {\n      headers: {\n        Accept: \"application/nostr+json\"\n      }\n    })).json();\n  });\n  return _fetchRelayInformation.apply(this, arguments);\n}\nvar nip13_exports = {};\n__export(nip13_exports, {\n  getPow: () => getPow,\n  minePow: () => minePow\n});\nfunction getPow(hex) {\n  let count = 0;\n  for (let i2 = 0; i2 < hex.length; i2++) {\n    const nibble = parseInt(hex[i2], 16);\n    if (nibble === 0) {\n      count += 4;\n    } else {\n      count += Math.clz32(nibble) - 28;\n      break;\n    }\n  }\n  return count;\n}\nfunction minePow(unsigned, difficulty) {\n  let count = 0;\n  const event = unsigned;\n  const tag = [\"nonce\", count.toString(), difficulty.toString()];\n  event.tags.push(tag);\n  while (true) {\n    const now = Math.floor(new Date().getTime() / 1e3);\n    if (now !== event.created_at) {\n      count = 0;\n      event.created_at = now;\n    }\n    tag[1] = (++count).toString();\n    event.id = getEventHash(event);\n    if (getPow(event.id) >= difficulty) {\n      break;\n    }\n  }\n  return event;\n}\n\n// nip18.ts\nvar nip18_exports = {};\n__export(nip18_exports, {\n  finishRepostEvent: () => finishRepostEvent,\n  getRepostedEvent: () => getRepostedEvent,\n  getRepostedEventPointer: () => getRepostedEventPointer\n});\nfunction finishRepostEvent(t, reposted, relayUrl, privateKey) {\n  return finalizeEvent({\n    kind: Repost,\n    tags: [...(t.tags ?? []), [\"e\", reposted.id, relayUrl], [\"p\", reposted.pubkey]],\n    content: t.content === \"\" ? \"\" : JSON.stringify(reposted),\n    created_at: t.created_at\n  }, privateKey);\n}\nfunction getRepostedEventPointer(event) {\n  if (event.kind !== Repost) {\n    return void 0;\n  }\n  let lastETag;\n  let lastPTag;\n  for (let i2 = event.tags.length - 1; i2 >= 0 && (lastETag === void 0 || lastPTag === void 0); i2--) {\n    const tag = event.tags[i2];\n    if (tag.length >= 2) {\n      if (tag[0] === \"e\" && lastETag === void 0) {\n        lastETag = tag;\n      } else if (tag[0] === \"p\" && lastPTag === void 0) {\n        lastPTag = tag;\n      }\n    }\n  }\n  if (lastETag === void 0) {\n    return void 0;\n  }\n  return {\n    id: lastETag[1],\n    relays: [lastETag[2], lastPTag?.[2]].filter(x => typeof x === \"string\"),\n    author: lastPTag?.[1]\n  };\n}\nfunction getRepostedEvent(event, {\n  skipVerification\n} = {}) {\n  const pointer = getRepostedEventPointer(event);\n  if (pointer === void 0 || event.content === \"\") {\n    return void 0;\n  }\n  let repostedEvent;\n  try {\n    repostedEvent = JSON.parse(event.content);\n  } catch (error) {\n    return void 0;\n  }\n  if (repostedEvent.id !== pointer.id) {\n    return void 0;\n  }\n  if (!skipVerification && !verifyEvent(repostedEvent)) {\n    return void 0;\n  }\n  return repostedEvent;\n}\n\n// nip21.ts\nvar nip21_exports = {};\n__export(nip21_exports, {\n  NOSTR_URI_REGEX: () => NOSTR_URI_REGEX,\n  parse: () => parse2,\n  test: () => test\n});\nvar NOSTR_URI_REGEX = new RegExp(`nostr:(${BECH32_REGEX.source})`);\nfunction test(value) {\n  return typeof value === \"string\" && new RegExp(`^${NOSTR_URI_REGEX.source}$`).test(value);\n}\nfunction parse2(uri) {\n  const match = uri.match(new RegExp(`^${NOSTR_URI_REGEX.source}$`));\n  if (!match) throw new Error(`Invalid Nostr URI: ${uri}`);\n  return {\n    uri: match[0],\n    value: match[1],\n    decoded: decode(match[1])\n  };\n}\n\n// nip25.ts\nvar nip25_exports = {};\n__export(nip25_exports, {\n  finishReactionEvent: () => finishReactionEvent,\n  getReactedEventPointer: () => getReactedEventPointer\n});\nfunction finishReactionEvent(t, reacted, privateKey) {\n  const inheritedTags = reacted.tags.filter(tag => tag.length >= 2 && (tag[0] === \"e\" || tag[0] === \"p\"));\n  return finalizeEvent({\n    ...t,\n    kind: Reaction,\n    tags: [...(t.tags ?? []), ...inheritedTags, [\"e\", reacted.id], [\"p\", reacted.pubkey]],\n    content: t.content ?? \"+\"\n  }, privateKey);\n}\nfunction getReactedEventPointer(event) {\n  if (event.kind !== Reaction) {\n    return void 0;\n  }\n  let lastETag;\n  let lastPTag;\n  for (let i2 = event.tags.length - 1; i2 >= 0 && (lastETag === void 0 || lastPTag === void 0); i2--) {\n    const tag = event.tags[i2];\n    if (tag.length >= 2) {\n      if (tag[0] === \"e\" && lastETag === void 0) {\n        lastETag = tag;\n      } else if (tag[0] === \"p\" && lastPTag === void 0) {\n        lastPTag = tag;\n      }\n    }\n  }\n  if (lastETag === void 0 || lastPTag === void 0) {\n    return void 0;\n  }\n  return {\n    id: lastETag[1],\n    relays: [lastETag[2], lastPTag[2]].filter(x => x !== void 0),\n    author: lastPTag[1]\n  };\n}\n\n// nip27.ts\nvar nip27_exports = {};\n__export(nip27_exports, {\n  matchAll: () => matchAll,\n  regex: () => regex,\n  replaceAll: () => replaceAll\n});\nvar regex = () => new RegExp(`\\\\b${NOSTR_URI_REGEX.source}\\\\b`, \"g\");\nfunction* matchAll(content) {\n  const matches = content.matchAll(regex());\n  for (const match of matches) {\n    try {\n      const [uri, value] = match;\n      yield {\n        uri,\n        value,\n        decoded: decode(value),\n        start: match.index,\n        end: match.index + uri.length\n      };\n    } catch (_e) {}\n  }\n}\nfunction replaceAll(content, replacer) {\n  return content.replaceAll(regex(), (uri, value) => {\n    return replacer({\n      uri,\n      value,\n      decoded: decode(value)\n    });\n  });\n}\n\n// nip28.ts\nvar nip28_exports = {};\n__export(nip28_exports, {\n  channelCreateEvent: () => channelCreateEvent,\n  channelHideMessageEvent: () => channelHideMessageEvent,\n  channelMessageEvent: () => channelMessageEvent,\n  channelMetadataEvent: () => channelMetadataEvent,\n  channelMuteUserEvent: () => channelMuteUserEvent\n});\nvar channelCreateEvent = (t, privateKey) => {\n  let content;\n  if (typeof t.content === \"object\") {\n    content = JSON.stringify(t.content);\n  } else if (typeof t.content === \"string\") {\n    content = t.content;\n  } else {\n    return void 0;\n  }\n  return finalizeEvent({\n    kind: ChannelCreation,\n    tags: [...(t.tags ?? [])],\n    content,\n    created_at: t.created_at\n  }, privateKey);\n};\nvar channelMetadataEvent = (t, privateKey) => {\n  let content;\n  if (typeof t.content === \"object\") {\n    content = JSON.stringify(t.content);\n  } else if (typeof t.content === \"string\") {\n    content = t.content;\n  } else {\n    return void 0;\n  }\n  return finalizeEvent({\n    kind: ChannelMetadata,\n    tags: [[\"e\", t.channel_create_event_id], ...(t.tags ?? [])],\n    content,\n    created_at: t.created_at\n  }, privateKey);\n};\nvar channelMessageEvent = (t, privateKey) => {\n  const tags = [[\"e\", t.channel_create_event_id, t.relay_url, \"root\"]];\n  if (t.reply_to_channel_message_event_id) {\n    tags.push([\"e\", t.reply_to_channel_message_event_id, t.relay_url, \"reply\"]);\n  }\n  return finalizeEvent({\n    kind: ChannelMessage,\n    tags: [...tags, ...(t.tags ?? [])],\n    content: t.content,\n    created_at: t.created_at\n  }, privateKey);\n};\nvar channelHideMessageEvent = (t, privateKey) => {\n  let content;\n  if (typeof t.content === \"object\") {\n    content = JSON.stringify(t.content);\n  } else if (typeof t.content === \"string\") {\n    content = t.content;\n  } else {\n    return void 0;\n  }\n  return finalizeEvent({\n    kind: ChannelHideMessage,\n    tags: [[\"e\", t.channel_message_event_id], ...(t.tags ?? [])],\n    content,\n    created_at: t.created_at\n  }, privateKey);\n};\nvar channelMuteUserEvent = (t, privateKey) => {\n  let content;\n  if (typeof t.content === \"object\") {\n    content = JSON.stringify(t.content);\n  } else if (typeof t.content === \"string\") {\n    content = t.content;\n  } else {\n    return void 0;\n  }\n  return finalizeEvent({\n    kind: ChannelMuteUser,\n    tags: [[\"p\", t.pubkey_to_mute], ...(t.tags ?? [])],\n    content,\n    created_at: t.created_at\n  }, privateKey);\n};\n\n// nip30.ts\nvar nip30_exports = {};\n__export(nip30_exports, {\n  EMOJI_SHORTCODE_REGEX: () => EMOJI_SHORTCODE_REGEX,\n  matchAll: () => matchAll2,\n  regex: () => regex2,\n  replaceAll: () => replaceAll2\n});\nvar EMOJI_SHORTCODE_REGEX = /:(\\w+):/;\nvar regex2 = () => new RegExp(`\\\\B${EMOJI_SHORTCODE_REGEX.source}\\\\B`, \"g\");\nfunction* matchAll2(content) {\n  const matches = content.matchAll(regex2());\n  for (const match of matches) {\n    try {\n      const [shortcode, name] = match;\n      yield {\n        shortcode,\n        name,\n        start: match.index,\n        end: match.index + shortcode.length\n      };\n    } catch (_e) {}\n  }\n}\nfunction replaceAll2(content, replacer) {\n  return content.replaceAll(regex2(), (shortcode, name) => {\n    return replacer({\n      shortcode,\n      name\n    });\n  });\n}\n\n// nip39.ts\nvar nip39_exports = {};\n__export(nip39_exports, {\n  useFetchImplementation: () => useFetchImplementation3,\n  validateGithub: () => validateGithub\n});\nvar _fetch3;\ntry {\n  _fetch3 = fetch;\n} catch {}\nfunction useFetchImplementation3(fetchImplementation) {\n  _fetch3 = fetchImplementation;\n}\nfunction validateGithub(_x17, _x18, _x19) {\n  return _validateGithub.apply(this, arguments);\n} // nip44.ts\nfunction _validateGithub() {\n  _validateGithub = _asyncToGenerator(function* (pubkey, username, proof) {\n    try {\n      let res = yield (yield _fetch3(`https://gist.github.com/${username}/${proof}/raw`)).text();\n      return res === `Verifying that I control the following Nostr public key: ${pubkey}`;\n    } catch (_) {\n      return false;\n    }\n  });\n  return _validateGithub.apply(this, arguments);\n}\nvar nip44_exports = {};\n__export(nip44_exports, {\n  decrypt: () => decrypt2,\n  encrypt: () => encrypt2,\n  getConversationKey: () => getConversationKey,\n  v2: () => v2\n});\nimport { chacha20 } from \"@noble/ciphers/chacha\";\nimport { equalBytes } from \"@noble/ciphers/utils\";\nimport { secp256k1 as secp256k12 } from \"@noble/curves/secp256k1\";\nimport { extract as hkdf_extract, expand as hkdf_expand } from \"@noble/hashes/hkdf\";\nimport { hmac } from \"@noble/hashes/hmac\";\nimport { sha256 as sha2562 } from \"@noble/hashes/sha256\";\nimport { concatBytes as concatBytes2, randomBytes as randomBytes2 } from \"@noble/hashes/utils\";\nimport { base64 as base642 } from \"@scure/base\";\nvar minPlaintextSize = 1;\nvar maxPlaintextSize = 65535;\nfunction getConversationKey(privkeyA, pubkeyB) {\n  const sharedX = secp256k12.getSharedSecret(privkeyA, \"02\" + pubkeyB).subarray(1, 33);\n  return hkdf_extract(sha2562, sharedX, \"nip44-v2\");\n}\nfunction getMessageKeys(conversationKey, nonce) {\n  const keys = hkdf_expand(sha2562, conversationKey, nonce, 76);\n  return {\n    chacha_key: keys.subarray(0, 32),\n    chacha_nonce: keys.subarray(32, 44),\n    hmac_key: keys.subarray(44, 76)\n  };\n}\nfunction calcPaddedLen(len) {\n  if (!Number.isSafeInteger(len) || len < 1) throw new Error(\"expected positive integer\");\n  if (len <= 32) return 32;\n  const nextPower = 1 << Math.floor(Math.log2(len - 1)) + 1;\n  const chunk = nextPower <= 256 ? 32 : nextPower / 8;\n  return chunk * (Math.floor((len - 1) / chunk) + 1);\n}\nfunction writeU16BE(num) {\n  if (!Number.isSafeInteger(num) || num < minPlaintextSize || num > maxPlaintextSize) throw new Error(\"invalid plaintext size: must be between 1 and 65535 bytes\");\n  const arr = new Uint8Array(2);\n  new DataView(arr.buffer).setUint16(0, num, false);\n  return arr;\n}\nfunction pad(plaintext) {\n  const unpadded = utf8Encoder.encode(plaintext);\n  const unpaddedLen = unpadded.length;\n  const prefix = writeU16BE(unpaddedLen);\n  const suffix = new Uint8Array(calcPaddedLen(unpaddedLen) - unpaddedLen);\n  return concatBytes2(prefix, unpadded, suffix);\n}\nfunction unpad(padded) {\n  const unpaddedLen = new DataView(padded.buffer).getUint16(0);\n  const unpadded = padded.subarray(2, 2 + unpaddedLen);\n  if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize || unpadded.length !== unpaddedLen || padded.length !== 2 + calcPaddedLen(unpaddedLen)) throw new Error(\"invalid padding\");\n  return utf8Decoder.decode(unpadded);\n}\nfunction hmacAad(key, message, aad) {\n  if (aad.length !== 32) throw new Error(\"AAD associated data must be 32 bytes\");\n  const combined = concatBytes2(aad, message);\n  return hmac(sha2562, key, combined);\n}\nfunction decodePayload(payload) {\n  if (typeof payload !== \"string\") throw new Error(\"payload must be a valid string\");\n  const plen = payload.length;\n  if (plen < 132 || plen > 87472) throw new Error(\"invalid payload length: \" + plen);\n  if (payload[0] === \"#\") throw new Error(\"unknown encryption version\");\n  let data;\n  try {\n    data = base642.decode(payload);\n  } catch (error) {\n    throw new Error(\"invalid base64: \" + error.message);\n  }\n  const dlen = data.length;\n  if (dlen < 99 || dlen > 65603) throw new Error(\"invalid data length: \" + dlen);\n  const vers = data[0];\n  if (vers !== 2) throw new Error(\"unknown encryption version \" + vers);\n  return {\n    nonce: data.subarray(1, 33),\n    ciphertext: data.subarray(33, -32),\n    mac: data.subarray(-32)\n  };\n}\nfunction encrypt2(plaintext, conversationKey, nonce = randomBytes2(32)) {\n  const {\n    chacha_key,\n    chacha_nonce,\n    hmac_key\n  } = getMessageKeys(conversationKey, nonce);\n  const padded = pad(plaintext);\n  const ciphertext = chacha20(chacha_key, chacha_nonce, padded);\n  const mac = hmacAad(hmac_key, ciphertext, nonce);\n  return base642.encode(concatBytes2(new Uint8Array([2]), nonce, ciphertext, mac));\n}\nfunction decrypt2(payload, conversationKey) {\n  const {\n    nonce,\n    ciphertext,\n    mac\n  } = decodePayload(payload);\n  const {\n    chacha_key,\n    chacha_nonce,\n    hmac_key\n  } = getMessageKeys(conversationKey, nonce);\n  const calculatedMac = hmacAad(hmac_key, ciphertext, nonce);\n  if (!equalBytes(calculatedMac, mac)) throw new Error(\"invalid MAC\");\n  const padded = chacha20(chacha_key, chacha_nonce, ciphertext);\n  return unpad(padded);\n}\nvar v2 = {\n  utils: {\n    getConversationKey,\n    calcPaddedLen\n  },\n  encrypt: encrypt2,\n  decrypt: decrypt2\n};\n\n// nip47.ts\nvar nip47_exports = {};\n__export(nip47_exports, {\n  makeNwcRequestEvent: () => makeNwcRequestEvent,\n  parseConnectionString: () => parseConnectionString\n});\nfunction parseConnectionString(connectionString) {\n  const {\n    pathname,\n    searchParams\n  } = new URL(connectionString);\n  const pubkey = pathname;\n  const relay = searchParams.get(\"relay\");\n  const secret = searchParams.get(\"secret\");\n  if (!pubkey || !relay || !secret) {\n    throw new Error(\"invalid connection string\");\n  }\n  return {\n    pubkey,\n    relay,\n    secret\n  };\n}\nfunction makeNwcRequestEvent(_x20, _x21, _x22) {\n  return _makeNwcRequestEvent.apply(this, arguments);\n} // nip57.ts\nfunction _makeNwcRequestEvent() {\n  _makeNwcRequestEvent = _asyncToGenerator(function* (pubkey, secretKey, invoice) {\n    const content = {\n      method: \"pay_invoice\",\n      params: {\n        invoice\n      }\n    };\n    const encryptedContent = yield encrypt(secretKey, pubkey, JSON.stringify(content));\n    const eventTemplate = {\n      kind: NWCWalletRequest,\n      created_at: Math.round(Date.now() / 1e3),\n      content: encryptedContent,\n      tags: [[\"p\", pubkey]]\n    };\n    return finalizeEvent(eventTemplate, secretKey);\n  });\n  return _makeNwcRequestEvent.apply(this, arguments);\n}\nvar nip57_exports = {};\n__export(nip57_exports, {\n  getZapEndpoint: () => getZapEndpoint,\n  makeZapReceipt: () => makeZapReceipt,\n  makeZapRequest: () => makeZapRequest,\n  useFetchImplementation: () => useFetchImplementation4,\n  validateZapRequest: () => validateZapRequest\n});\nimport { bech32 as bech322 } from \"@scure/base\";\nvar _fetch4;\ntry {\n  _fetch4 = fetch;\n} catch {}\nfunction useFetchImplementation4(fetchImplementation) {\n  _fetch4 = fetchImplementation;\n}\nfunction getZapEndpoint(_x23) {\n  return _getZapEndpoint.apply(this, arguments);\n}\nfunction _getZapEndpoint() {\n  _getZapEndpoint = _asyncToGenerator(function* (metadata) {\n    try {\n      let lnurl = \"\";\n      let {\n        lud06,\n        lud16\n      } = JSON.parse(metadata.content);\n      if (lud06) {\n        let {\n          words\n        } = bech322.decode(lud06, 1e3);\n        let data = bech322.fromWords(words);\n        lnurl = utf8Decoder.decode(data);\n      } else if (lud16) {\n        let [name, domain] = lud16.split(\"@\");\n        lnurl = new URL(`/.well-known/lnurlp/${name}`, `https://${domain}`).toString();\n      } else {\n        return null;\n      }\n      let res = yield _fetch4(lnurl);\n      let body = yield res.json();\n      if (body.allowsNostr && body.nostrPubkey) {\n        return body.callback;\n      }\n    } catch (err) {}\n    return null;\n  });\n  return _getZapEndpoint.apply(this, arguments);\n}\nfunction makeZapRequest({\n  profile,\n  event,\n  amount,\n  relays,\n  comment = \"\"\n}) {\n  if (!amount) throw new Error(\"amount not given\");\n  if (!profile) throw new Error(\"profile not given\");\n  let zr = {\n    kind: 9734,\n    created_at: Math.round(Date.now() / 1e3),\n    content: comment,\n    tags: [[\"p\", profile], [\"amount\", amount.toString()], [\"relays\", ...relays]]\n  };\n  if (event) {\n    zr.tags.push([\"e\", event]);\n  }\n  return zr;\n}\nfunction validateZapRequest(zapRequestString) {\n  let zapRequest;\n  try {\n    zapRequest = JSON.parse(zapRequestString);\n  } catch (err) {\n    return \"Invalid zap request JSON.\";\n  }\n  if (!validateEvent(zapRequest)) return \"Zap request is not a valid Nostr event.\";\n  if (!verifyEvent(zapRequest)) return \"Invalid signature on zap request.\";\n  let p = zapRequest.tags.find(([t, v]) => t === \"p\" && v);\n  if (!p) return \"Zap request doesn't have a 'p' tag.\";\n  if (!p[1].match(/^[a-f0-9]{64}$/)) return \"Zap request 'p' tag is not valid hex.\";\n  let e = zapRequest.tags.find(([t, v]) => t === \"e\" && v);\n  if (e && !e[1].match(/^[a-f0-9]{64}$/)) return \"Zap request 'e' tag is not valid hex.\";\n  let relays = zapRequest.tags.find(([t, v]) => t === \"relays\" && v);\n  if (!relays) return \"Zap request doesn't have a 'relays' tag.\";\n  return null;\n}\nfunction makeZapReceipt({\n  zapRequest,\n  preimage,\n  bolt11,\n  paidAt\n}) {\n  let zr = JSON.parse(zapRequest);\n  let tagsFromZapRequest = zr.tags.filter(([t]) => t === \"e\" || t === \"p\" || t === \"a\");\n  let zap = {\n    kind: 9735,\n    created_at: Math.round(paidAt.getTime() / 1e3),\n    content: \"\",\n    tags: [...tagsFromZapRequest, [\"P\", zr.pubkey], [\"bolt11\", bolt11], [\"description\", zapRequest]]\n  };\n  if (preimage) {\n    zap.tags.push([\"preimage\", preimage]);\n  }\n  return zap;\n}\n\n// nip98.ts\nvar nip98_exports = {};\n__export(nip98_exports, {\n  getToken: () => getToken,\n  hashPayload: () => hashPayload,\n  unpackEventFromToken: () => unpackEventFromToken,\n  validateEvent: () => validateEvent2,\n  validateEventKind: () => validateEventKind,\n  validateEventMethodTag: () => validateEventMethodTag,\n  validateEventPayloadTag: () => validateEventPayloadTag,\n  validateEventTimestamp: () => validateEventTimestamp,\n  validateEventUrlTag: () => validateEventUrlTag,\n  validateToken: () => validateToken\n});\nimport { sha256 as sha2563 } from \"@noble/hashes/sha256\";\nimport { bytesToHex as bytesToHex4 } from \"@noble/hashes/utils\";\nimport { base64 as base643 } from \"@scure/base\";\nvar _authorizationScheme = \"Nostr \";\nfunction getToken(_x24, _x25, _x26) {\n  return _getToken.apply(this, arguments);\n}\nfunction _getToken() {\n  _getToken = _asyncToGenerator(function* (loginUrl, httpMethod, sign, includeAuthorizationScheme = false, payload) {\n    const event = {\n      kind: HTTPAuth,\n      tags: [[\"u\", loginUrl], [\"method\", httpMethod]],\n      created_at: Math.round(new Date().getTime() / 1e3),\n      content: \"\"\n    };\n    if (payload) {\n      event.tags.push([\"payload\", hashPayload(payload)]);\n    }\n    const signedEvent = yield sign(event);\n    const authorizationScheme = includeAuthorizationScheme ? _authorizationScheme : \"\";\n    return authorizationScheme + base643.encode(utf8Encoder.encode(JSON.stringify(signedEvent)));\n  });\n  return _getToken.apply(this, arguments);\n}\nfunction validateToken(_x27, _x28, _x29) {\n  return _validateToken.apply(this, arguments);\n}\nfunction _validateToken() {\n  _validateToken = _asyncToGenerator(function* (token, url, method) {\n    const event = yield unpackEventFromToken(token).catch(error => {\n      throw error;\n    });\n    const valid = yield validateEvent2(event, url, method).catch(error => {\n      throw error;\n    });\n    return valid;\n  });\n  return _validateToken.apply(this, arguments);\n}\nfunction unpackEventFromToken(_x30) {\n  return _unpackEventFromToken.apply(this, arguments);\n}\nfunction _unpackEventFromToken() {\n  _unpackEventFromToken = _asyncToGenerator(function* (token) {\n    if (!token) {\n      throw new Error(\"Missing token\");\n    }\n    token = token.replace(_authorizationScheme, \"\");\n    const eventB64 = utf8Decoder.decode(base643.decode(token));\n    if (!eventB64 || eventB64.length === 0 || !eventB64.startsWith(\"{\")) {\n      throw new Error(\"Invalid token\");\n    }\n    const event = JSON.parse(eventB64);\n    return event;\n  });\n  return _unpackEventFromToken.apply(this, arguments);\n}\nfunction validateEventTimestamp(event) {\n  if (!event.created_at) {\n    return false;\n  }\n  return Math.round(new Date().getTime() / 1e3) - event.created_at < 60;\n}\nfunction validateEventKind(event) {\n  return event.kind === HTTPAuth;\n}\nfunction validateEventUrlTag(event, url) {\n  const urlTag = event.tags.find(t => t[0] === \"u\");\n  if (!urlTag) {\n    return false;\n  }\n  return urlTag.length > 0 && urlTag[1] === url;\n}\nfunction validateEventMethodTag(event, method) {\n  const methodTag = event.tags.find(t => t[0] === \"method\");\n  if (!methodTag) {\n    return false;\n  }\n  return methodTag.length > 0 && methodTag[1].toLowerCase() === method.toLowerCase();\n}\nfunction hashPayload(payload) {\n  const hash = sha2563(utf8Encoder.encode(JSON.stringify(payload)));\n  return bytesToHex4(hash);\n}\nfunction validateEventPayloadTag(event, payload) {\n  const payloadTag = event.tags.find(t => t[0] === \"payload\");\n  if (!payloadTag) {\n    return false;\n  }\n  const payloadHash = hashPayload(payload);\n  return payloadTag.length > 0 && payloadTag[1] === payloadHash;\n}\nfunction validateEvent2(_x31, _x32, _x33, _x34) {\n  return _validateEvent.apply(this, arguments);\n}\nfunction _validateEvent() {\n  _validateEvent = _asyncToGenerator(function* (event, url, method, body) {\n    if (!verifyEvent(event)) {\n      throw new Error(\"Invalid nostr event, signature invalid\");\n    }\n    if (!validateEventKind(event)) {\n      throw new Error(\"Invalid nostr event, kind invalid\");\n    }\n    if (!validateEventTimestamp(event)) {\n      throw new Error(\"Invalid nostr event, created_at timestamp invalid\");\n    }\n    if (!validateEventUrlTag(event, url)) {\n      throw new Error(\"Invalid nostr event, url tag invalid\");\n    }\n    if (!validateEventMethodTag(event, method)) {\n      throw new Error(\"Invalid nostr event, method tag invalid\");\n    }\n    if (Boolean(body) && typeof body === \"object\" && Object.keys(body).length > 0) {\n      if (!validateEventPayloadTag(event, body)) {\n        throw new Error(\"Invalid nostr event, payload tag does not match request body hash\");\n      }\n    }\n    return true;\n  });\n  return _validateEvent.apply(this, arguments);\n}\nexport { Relay, SimplePool, finalizeEvent, fakejson_exports as fj, generateSecretKey, getEventHash, getFilterLimit, getPublicKey, kinds_exports as kinds, matchFilter, matchFilters, mergeFilters, nip04_exports as nip04, nip05_exports as nip05, nip10_exports as nip10, nip11_exports as nip11, nip13_exports as nip13, nip18_exports as nip18, nip19_exports as nip19, nip21_exports as nip21, nip25_exports as nip25, nip27_exports as nip27, nip28_exports as nip28, nip30_exports as nip30, nip39_exports as nip39, nip42_exports as nip42, nip44_exports as nip44, nip47_exports as nip47, nip57_exports as nip57, nip98_exports as nip98, parseReferences, serializeEvent, sortEvents, utils_exports as utils, validateEvent, verifiedSymbol, verifyEvent };","map":null,"metadata":{},"sourceType":"module","externalDependencies":[]}