nostr-tools 2.23.7 → 2.23.8

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/lib/esm/nip10.js CHANGED
@@ -1,4 +1,5 @@
1
1
  // nip10.ts
2
+ var HEX64 = /^[0-9a-fA-F]{64}$/;
2
3
  function parse(event) {
3
4
  const result = {
4
5
  reply: void 0,
@@ -11,12 +12,12 @@ function parse(event) {
11
12
  let maybeRoot;
12
13
  for (let i = event.tags.length - 1; i >= 0; i--) {
13
14
  const tag = event.tags[i];
14
- if (tag[0] === "e" && tag[1]) {
15
+ if (tag[0] === "e" && tag[1] && HEX64.test(tag[1])) {
15
16
  const [_, eTagEventId, eTagRelayUrl, eTagMarker, eTagAuthor] = tag;
16
17
  const eventPointer = {
17
18
  id: eTagEventId,
18
19
  relays: eTagRelayUrl ? [eTagRelayUrl] : [],
19
- author: eTagAuthor
20
+ author: eTagAuthor && HEX64.test(eTagAuthor) ? eTagAuthor : void 0
20
21
  };
21
22
  if (eTagMarker === "root") {
22
23
  result.root = eventPointer;
@@ -38,14 +39,14 @@ function parse(event) {
38
39
  result.mentions.push(eventPointer);
39
40
  continue;
40
41
  }
41
- if (tag[0] === "q" && tag[1]) {
42
+ if (tag[0] === "q" && tag[1] && HEX64.test(tag[1])) {
42
43
  const [_, eTagEventId, eTagRelayUrl] = tag;
43
44
  result.quotes.push({
44
45
  id: eTagEventId,
45
46
  relays: eTagRelayUrl ? [eTagRelayUrl] : []
46
47
  });
47
48
  }
48
- if (tag[0] === "p" && tag[1]) {
49
+ if (tag[0] === "p" && tag[1] && HEX64.test(tag[1])) {
49
50
  result.profiles.push({
50
51
  pubkey: tag[1],
51
52
  relays: tag[2] ? [tag[2]] : []
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../nip10.ts"],
4
- "sourcesContent": ["import type { Event } from './core.ts'\nimport type { EventPointer, ProfilePointer } from './nip19.ts'\n\nexport function parse(event: Pick<Event, 'tags'>): {\n /**\n * Pointer to the root of the thread.\n */\n root: EventPointer | undefined\n\n /**\n * Pointer to a \"parent\" event that parsed event replies to (responded to).\n */\n reply: EventPointer | undefined\n\n /**\n * Pointers to events that may or may not be in the reply chain.\n */\n mentions: EventPointer[]\n\n /**\n * Pointers to events that were directly quoted.\n */\n quotes: EventPointer[]\n\n /**\n * List of pubkeys that are involved in the thread in no particular order.\n */\n profiles: ProfilePointer[]\n} {\n const result: ReturnType<typeof parse> = {\n reply: undefined,\n root: undefined,\n mentions: [],\n profiles: [],\n quotes: [],\n }\n\n let maybeParent: EventPointer | undefined\n let maybeRoot: EventPointer | undefined\n\n for (let i = event.tags.length - 1; i >= 0; i--) {\n const tag = event.tags[i]\n\n if (tag[0] === 'e' && tag[1]) {\n const [_, eTagEventId, eTagRelayUrl, eTagMarker, eTagAuthor] = tag as [\n string,\n string,\n undefined | string,\n undefined | string,\n undefined | string,\n ]\n\n const eventPointer: EventPointer = {\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n author: eTagAuthor,\n }\n\n if (eTagMarker === 'root') {\n result.root = eventPointer\n continue\n }\n\n if (eTagMarker === 'reply') {\n result.reply = eventPointer\n continue\n }\n\n if (eTagMarker === 'mention') {\n result.mentions.push(eventPointer)\n continue\n }\n\n if (!maybeParent) {\n maybeParent = eventPointer\n } else {\n maybeRoot = eventPointer\n }\n\n result.mentions.push(eventPointer)\n continue\n }\n\n if (tag[0] === 'q' && tag[1]) {\n const [_, eTagEventId, eTagRelayUrl] = tag as [string, string, undefined | string]\n result.quotes.push({\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n })\n }\n\n if (tag[0] === 'p' && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n })\n continue\n }\n }\n\n // get legacy (positional) markers, set reply to root and vice-versa if one of them is missing\n if (!result.root) {\n result.root = maybeRoot || maybeParent || result.reply\n }\n if (!result.reply) {\n result.reply = maybeParent || result.root\n }\n\n // remove root and reply from mentions, inherit relay hints from authors if any\n ;[result.reply, result.root].forEach(ref => {\n if (!ref) return\n\n let idx = result.mentions.indexOf(ref)\n if (idx !== -1) {\n result.mentions.splice(idx, 1)\n }\n if (ref.author) {\n let author = result.profiles.find(p => p.pubkey === ref.author)\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = []\n }\n author.relays.forEach(url => {\n if (ref.relays!?.indexOf(url) === -1) ref.relays!.push(url)\n })\n author.relays = ref.relays\n }\n }\n })\n\n result.mentions.forEach(ref => {\n if (ref!.author) {\n let author = result.profiles.find(p => p.pubkey === ref.author)\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = []\n }\n author.relays.forEach(url => {\n if (ref.relays!.indexOf(url) === -1) ref.relays!.push(url)\n })\n author.relays = ref.relays\n }\n }\n })\n\n return result\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Event } from './core.ts'\nimport type { EventPointer, ProfilePointer } from './nip19.ts'\n\nconst HEX64 = /^[0-9a-fA-F]{64}$/\n\nexport function parse(event: Pick<Event, 'tags'>): {\n /**\n * Pointer to the root of the thread.\n */\n root: EventPointer | undefined\n\n /**\n * Pointer to a \"parent\" event that parsed event replies to (responded to).\n */\n reply: EventPointer | undefined\n\n /**\n * Pointers to events that may or may not be in the reply chain.\n */\n mentions: EventPointer[]\n\n /**\n * Pointers to events that were directly quoted.\n */\n quotes: EventPointer[]\n\n /**\n * List of pubkeys that are involved in the thread in no particular order.\n */\n profiles: ProfilePointer[]\n} {\n const result: ReturnType<typeof parse> = {\n reply: undefined,\n root: undefined,\n mentions: [],\n profiles: [],\n quotes: [],\n }\n\n let maybeParent: EventPointer | undefined\n let maybeRoot: EventPointer | undefined\n\n for (let i = event.tags.length - 1; i >= 0; i--) {\n const tag = event.tags[i]\n\n if (tag[0] === 'e' && tag[1] && HEX64.test(tag[1])) {\n const [_, eTagEventId, eTagRelayUrl, eTagMarker, eTagAuthor] = tag as [\n string,\n string,\n undefined | string,\n undefined | string,\n undefined | string,\n ]\n\n const eventPointer: EventPointer = {\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n author: eTagAuthor && HEX64.test(eTagAuthor) ? eTagAuthor : undefined,\n }\n\n if (eTagMarker === 'root') {\n result.root = eventPointer\n continue\n }\n\n if (eTagMarker === 'reply') {\n result.reply = eventPointer\n continue\n }\n\n if (eTagMarker === 'mention') {\n result.mentions.push(eventPointer)\n continue\n }\n\n if (!maybeParent) {\n maybeParent = eventPointer\n } else {\n maybeRoot = eventPointer\n }\n\n result.mentions.push(eventPointer)\n continue\n }\n\n if (tag[0] === 'q' && tag[1] && HEX64.test(tag[1])) {\n const [_, eTagEventId, eTagRelayUrl] = tag as [string, string, undefined | string]\n result.quotes.push({\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n })\n }\n\n if (tag[0] === 'p' && tag[1] && HEX64.test(tag[1])) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n })\n continue\n }\n }\n\n // get legacy (positional) markers, set reply to root and vice-versa if one of them is missing\n if (!result.root) {\n result.root = maybeRoot || maybeParent || result.reply\n }\n if (!result.reply) {\n result.reply = maybeParent || result.root\n }\n\n // remove root and reply from mentions, inherit relay hints from authors if any\n ;[result.reply, result.root].forEach(ref => {\n if (!ref) return\n\n let idx = result.mentions.indexOf(ref)\n if (idx !== -1) {\n result.mentions.splice(idx, 1)\n }\n if (ref.author) {\n let author = result.profiles.find(p => p.pubkey === ref.author)\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = []\n }\n author.relays.forEach(url => {\n if (ref.relays!?.indexOf(url) === -1) ref.relays!.push(url)\n })\n author.relays = ref.relays\n }\n }\n })\n\n result.mentions.forEach(ref => {\n if (ref!.author) {\n let author = result.profiles.find(p => p.pubkey === ref.author)\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = []\n }\n author.relays.forEach(url => {\n if (ref.relays!.indexOf(url) === -1) ref.relays!.push(url)\n })\n author.relays = ref.relays\n }\n }\n })\n\n return result\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/lib/esm/nip22.js CHANGED
@@ -1,4 +1,5 @@
1
1
  // nip22.ts
2
+ var HEX64 = /^[0-9a-fA-F]{64}$/;
2
3
  function parseKind(kind) {
3
4
  if (!kind)
4
5
  return void 0;
@@ -12,9 +13,12 @@ function parseAddressPointer(value, relayUrl) {
12
13
  const kind = parseInt(value.slice(0, idx), 10);
13
14
  if (Number.isNaN(kind))
14
15
  return void 0;
16
+ const pubkey = value.slice(idx + 1, idx2);
17
+ if (!HEX64.test(pubkey))
18
+ return void 0;
15
19
  return {
16
20
  kind,
17
- pubkey: value.slice(idx + 1, idx2),
21
+ pubkey,
18
22
  identifier: value.slice(idx2 + 1),
19
23
  relays: relayUrl ? [relayUrl] : []
20
24
  };
@@ -23,12 +27,12 @@ function parsePointer(tag) {
23
27
  switch (tag[0]) {
24
28
  case "E":
25
29
  case "e":
26
- if (!tag[1])
30
+ if (!tag[1] || !HEX64.test(tag[1]))
27
31
  return void 0;
28
32
  return {
29
33
  id: tag[1],
30
34
  relays: tag[2] ? [tag[2]] : [],
31
- author: tag[3]
35
+ author: tag[3] && HEX64.test(tag[3]) ? tag[3] : void 0
32
36
  };
33
37
  case "A":
34
38
  case "a":
@@ -51,10 +55,12 @@ function parseQuote(tag) {
51
55
  if (tag[1].includes(":")) {
52
56
  return parseAddressPointer(tag[1], tag[2]);
53
57
  }
58
+ if (!HEX64.test(tag[1]))
59
+ return void 0;
54
60
  return {
55
61
  id: tag[1],
56
62
  relays: tag[2] ? [tag[2]] : [],
57
- author: tag[3]
63
+ author: tag[3] && HEX64.test(tag[3]) ? tag[3] : void 0
58
64
  };
59
65
  }
60
66
  function choosePointer(candidates) {
@@ -114,7 +120,7 @@ function parse(event) {
114
120
  result.quotes.push(pointer);
115
121
  continue;
116
122
  }
117
- if ((tag[0] === "P" || tag[0] === "p") && tag[1]) {
123
+ if ((tag[0] === "P" || tag[0] === "p") && tag[1] && HEX64.test(tag[1])) {
118
124
  result.profiles.push({
119
125
  pubkey: tag[1],
120
126
  relays: tag[2] ? [tag[2]] : []
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../nip22.ts"],
4
- "sourcesContent": ["import type { Event } from './core.ts'\nimport type { AddressPointer, EventPointer, ProfilePointer } from './nip19.ts'\n\nexport type ExternalPointer = {\n value: string\n hint?: string\n}\n\nfunction parseKind(kind: string | undefined): number | string | undefined {\n if (!kind) return undefined\n return /^\\d+$/.test(kind) ? parseInt(kind, 10) : kind\n}\n\nfunction parseAddressPointer(value: string, relayUrl?: string): AddressPointer | undefined {\n const idx = value.indexOf(':')\n const idx2 = value.indexOf(':', idx + 1)\n if (idx === -1 || idx2 === -1) return undefined\n\n const kind = parseInt(value.slice(0, idx), 10)\n if (Number.isNaN(kind)) return undefined\n\n return {\n kind,\n pubkey: value.slice(idx + 1, idx2),\n identifier: value.slice(idx2 + 1),\n relays: relayUrl ? [relayUrl] : [],\n }\n}\n\nfunction parsePointer(tag: string[]): EventPointer | AddressPointer | ExternalPointer | undefined {\n switch (tag[0]) {\n case 'E':\n case 'e':\n if (!tag[1]) return undefined\n return {\n id: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n author: tag[3],\n }\n case 'A':\n case 'a':\n if (!tag[1]) return undefined\n return parseAddressPointer(tag[1], tag[2])\n case 'I':\n case 'i':\n if (!tag[1]) return undefined\n return {\n value: tag[1],\n hint: tag[2],\n }\n }\n}\n\nfunction parseQuote(tag: string[]): EventPointer | AddressPointer | ExternalPointer | undefined {\n if (!tag[1]) return undefined\n\n if (tag[1].includes(':')) {\n return parseAddressPointer(tag[1], tag[2])\n }\n\n return {\n id: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n author: tag[3],\n }\n}\n\nfunction choosePointer(\n candidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }>,\n): EventPointer | AddressPointer | ExternalPointer | undefined {\n return (\n candidates.findLast(candidate => candidate.tagName === 'A' || candidate.tagName === 'a')?.pointer ||\n candidates.findLast(candidate => candidate.tagName === 'I' || candidate.tagName === 'i')?.pointer ||\n candidates.findLast(candidate => candidate.tagName === 'E' || candidate.tagName === 'e')?.pointer\n )\n}\n\nfunction inheritRelayHints(\n pointer: EventPointer | AddressPointer | ExternalPointer | undefined,\n profiles: ProfilePointer[],\n) {\n if (!pointer || !('id' in pointer) || !pointer.author) return\n\n const author = profiles.find(profile => profile.pubkey === pointer.author)\n if (!author || !author.relays) return\n\n if (!pointer.relays) {\n pointer.relays = []\n }\n\n author.relays.forEach(url => {\n if (pointer.relays!.indexOf(url) === -1) pointer.relays!.push(url)\n })\n author.relays = pointer.relays\n}\n\nexport function parse(event: Pick<Event, 'tags'>): {\n /**\n * Pointer to root scope.\n */\n root: EventPointer | AddressPointer | ExternalPointer | undefined\n\n /**\n * Kind of root scope from `K` tag.\n */\n rootKind: number | string | undefined\n\n /**\n * Pointer to parent item being replied to.\n */\n reply: EventPointer | AddressPointer | ExternalPointer | undefined\n\n /**\n * Kind of parent item from `k` tag.\n */\n replyKind: number | string | undefined\n\n /**\n * Reserved for extra referenced items.\n */\n mentions: (EventPointer | AddressPointer | ExternalPointer)[]\n\n /**\n * Pointers directly quoted with `q` tags.\n */\n quotes: (EventPointer | AddressPointer | ExternalPointer)[]\n\n /**\n * Root and parent authors.\n */\n profiles: ProfilePointer[]\n} {\n const result: ReturnType<typeof parse> = {\n root: undefined,\n rootKind: undefined,\n reply: undefined,\n replyKind: undefined,\n mentions: [],\n quotes: [],\n profiles: [],\n }\n\n const rootCandidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }> = []\n const replyCandidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }> = []\n\n for (const tag of event.tags) {\n if ((tag[0] === 'E' || tag[0] === 'A' || tag[0] === 'I') && tag[1]) {\n const pointer = parsePointer(tag)\n if (pointer) rootCandidates.push({ tagName: tag[0], pointer })\n continue\n }\n\n if ((tag[0] === 'e' || tag[0] === 'a' || tag[0] === 'i') && tag[1]) {\n const pointer = parsePointer(tag)\n if (pointer) replyCandidates.push({ tagName: tag[0], pointer })\n continue\n }\n\n if (tag[0] === 'K') {\n result.rootKind = parseKind(tag[1])\n continue\n }\n\n if (tag[0] === 'k') {\n result.replyKind = parseKind(tag[1])\n continue\n }\n\n if (tag[0] === 'q') {\n const pointer = parseQuote(tag)\n if (pointer) result.quotes.push(pointer)\n continue\n }\n\n if ((tag[0] === 'P' || tag[0] === 'p') && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n })\n }\n }\n\n result.root = choosePointer(rootCandidates)\n result.reply = choosePointer(replyCandidates)\n\n inheritRelayHints(result.root, result.profiles)\n inheritRelayHints(result.reply, result.profiles)\n result.quotes.forEach(pointer => inheritRelayHints(pointer, result.profiles))\n\n return result\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Event } from './core.ts'\nimport type { AddressPointer, EventPointer, ProfilePointer } from './nip19.ts'\n\nconst HEX64 = /^[0-9a-fA-F]{64}$/\n\nexport type ExternalPointer = {\n value: string\n hint?: string\n}\n\nfunction parseKind(kind: string | undefined): number | string | undefined {\n if (!kind) return undefined\n return /^\\d+$/.test(kind) ? parseInt(kind, 10) : kind\n}\n\nfunction parseAddressPointer(value: string, relayUrl?: string): AddressPointer | undefined {\n const idx = value.indexOf(':')\n const idx2 = value.indexOf(':', idx + 1)\n if (idx === -1 || idx2 === -1) return undefined\n\n const kind = parseInt(value.slice(0, idx), 10)\n if (Number.isNaN(kind)) return undefined\n\n const pubkey = value.slice(idx + 1, idx2)\n if (!HEX64.test(pubkey)) return undefined\n\n return {\n kind,\n pubkey,\n identifier: value.slice(idx2 + 1),\n relays: relayUrl ? [relayUrl] : [],\n }\n}\n\nfunction parsePointer(tag: string[]): EventPointer | AddressPointer | ExternalPointer | undefined {\n switch (tag[0]) {\n case 'E':\n case 'e':\n if (!tag[1] || !HEX64.test(tag[1])) return undefined\n return {\n id: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n author: tag[3] && HEX64.test(tag[3]) ? tag[3] : undefined,\n }\n case 'A':\n case 'a':\n if (!tag[1]) return undefined\n return parseAddressPointer(tag[1], tag[2])\n case 'I':\n case 'i':\n if (!tag[1]) return undefined\n return {\n value: tag[1],\n hint: tag[2],\n }\n }\n}\n\nfunction parseQuote(tag: string[]): EventPointer | AddressPointer | ExternalPointer | undefined {\n if (!tag[1]) return undefined\n\n if (tag[1].includes(':')) {\n return parseAddressPointer(tag[1], tag[2])\n }\n\n if (!HEX64.test(tag[1])) return undefined\n\n return {\n id: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n author: tag[3] && HEX64.test(tag[3]) ? tag[3] : undefined,\n }\n}\n\nfunction choosePointer(\n candidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }>,\n): EventPointer | AddressPointer | ExternalPointer | undefined {\n return (\n candidates.findLast(candidate => candidate.tagName === 'A' || candidate.tagName === 'a')?.pointer ||\n candidates.findLast(candidate => candidate.tagName === 'I' || candidate.tagName === 'i')?.pointer ||\n candidates.findLast(candidate => candidate.tagName === 'E' || candidate.tagName === 'e')?.pointer\n )\n}\n\nfunction inheritRelayHints(\n pointer: EventPointer | AddressPointer | ExternalPointer | undefined,\n profiles: ProfilePointer[],\n) {\n if (!pointer || !('id' in pointer) || !pointer.author) return\n\n const author = profiles.find(profile => profile.pubkey === pointer.author)\n if (!author || !author.relays) return\n\n if (!pointer.relays) {\n pointer.relays = []\n }\n\n author.relays.forEach(url => {\n if (pointer.relays!.indexOf(url) === -1) pointer.relays!.push(url)\n })\n author.relays = pointer.relays\n}\n\nexport function parse(event: Pick<Event, 'tags'>): {\n /**\n * Pointer to root scope.\n */\n root: EventPointer | AddressPointer | ExternalPointer | undefined\n\n /**\n * Kind of root scope from `K` tag.\n */\n rootKind: number | string | undefined\n\n /**\n * Pointer to parent item being replied to.\n */\n reply: EventPointer | AddressPointer | ExternalPointer | undefined\n\n /**\n * Kind of parent item from `k` tag.\n */\n replyKind: number | string | undefined\n\n /**\n * Reserved for extra referenced items.\n */\n mentions: (EventPointer | AddressPointer | ExternalPointer)[]\n\n /**\n * Pointers directly quoted with `q` tags.\n */\n quotes: (EventPointer | AddressPointer | ExternalPointer)[]\n\n /**\n * Root and parent authors.\n */\n profiles: ProfilePointer[]\n} {\n const result: ReturnType<typeof parse> = {\n root: undefined,\n rootKind: undefined,\n reply: undefined,\n replyKind: undefined,\n mentions: [],\n quotes: [],\n profiles: [],\n }\n\n const rootCandidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }> = []\n const replyCandidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }> = []\n\n for (const tag of event.tags) {\n if ((tag[0] === 'E' || tag[0] === 'A' || tag[0] === 'I') && tag[1]) {\n const pointer = parsePointer(tag)\n if (pointer) rootCandidates.push({ tagName: tag[0], pointer })\n continue\n }\n\n if ((tag[0] === 'e' || tag[0] === 'a' || tag[0] === 'i') && tag[1]) {\n const pointer = parsePointer(tag)\n if (pointer) replyCandidates.push({ tagName: tag[0], pointer })\n continue\n }\n\n if (tag[0] === 'K') {\n result.rootKind = parseKind(tag[1])\n continue\n }\n\n if (tag[0] === 'k') {\n result.replyKind = parseKind(tag[1])\n continue\n }\n\n if (tag[0] === 'q') {\n const pointer = parseQuote(tag)\n if (pointer) result.quotes.push(pointer)\n continue\n }\n\n if ((tag[0] === 'P' || tag[0] === 'p') && tag[1] && HEX64.test(tag[1])) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n })\n }\n }\n\n result.root = choosePointer(rootCandidates)\n result.reply = choosePointer(replyCandidates)\n\n inheritRelayHints(result.root, result.profiles)\n inheritRelayHints(result.reply, result.profiles)\n result.quotes.forEach(pointer => inheritRelayHints(pointer, result.profiles))\n\n return result\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/lib/esm/nip46.js CHANGED
@@ -1349,8 +1349,13 @@ var BunkerSigner = class {
1349
1349
  if (resp !== "pong")
1350
1350
  throw new Error(`result is not pong: ${resp}`);
1351
1351
  }
1352
- async connect() {
1353
- await this.sendRequest("connect", [this.bp.pubkey, this.bp.secret || ""]);
1352
+ async connect(clientMetadata) {
1353
+ const params = [this.bp.pubkey, this.bp.secret || ""];
1354
+ if (clientMetadata) {
1355
+ params.push("");
1356
+ params.push(JSON.stringify(clientMetadata));
1357
+ }
1358
+ await this.sendRequest("connect", params);
1354
1359
  }
1355
1360
  async logout() {
1356
1361
  let resp = await this.sendRequest("logout", []);