@qntx/nostr 0.1.0 → 0.2.1

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.
Files changed (186) hide show
  1. package/README.md +16 -0
  2. package/dist/abort-Ba8tDrOI.mjs +38 -0
  3. package/dist/abort-Ba8tDrOI.mjs.map +1 -0
  4. package/dist/{builder-BphJa-Y-.d.mts → builder-BWn55Paf.d.mts} +20 -14
  5. package/dist/{builder-q0VsvnYE.mjs → builder-CyrGKRVP.mjs} +32 -16
  6. package/dist/builder-CyrGKRVP.mjs.map +1 -0
  7. package/dist/{client-Bd8B1mYm.mjs → client-5DhgYV7P.mjs} +372 -195
  8. package/dist/client-5DhgYV7P.mjs.map +1 -0
  9. package/dist/client.d.mts +1 -1
  10. package/dist/client.mjs +1 -1
  11. package/dist/core.d.mts +8 -8
  12. package/dist/core.mjs +8 -9
  13. package/dist/error-BW7re1UN.d.mts +9 -0
  14. package/dist/error-B__OMBRY.mjs +14 -0
  15. package/dist/error-B__OMBRY.mjs.map +1 -0
  16. package/dist/{error-WEFS-R-4.d.mts → error-CR8Urc84.d.mts} +20 -8
  17. package/dist/{error-CwBxle6N.mjs → error-DrEIM7FO.mjs} +5 -3
  18. package/dist/error-DrEIM7FO.mjs.map +1 -0
  19. package/dist/{event-CzoQEFMF.mjs → event-D8Nfoh4K.mjs} +40 -32
  20. package/dist/event-D8Nfoh4K.mjs.map +1 -0
  21. package/dist/{event-B5D2jxt_.d.mts → event-fU3Y01PR.d.mts} +23 -20
  22. package/dist/{filter-BxwjEkZp.mjs → filter-BQl3GlHt.mjs} +42 -35
  23. package/dist/filter-BQl3GlHt.mjs.map +1 -0
  24. package/dist/filter-C0IMByE3.d.mts +37 -0
  25. package/dist/{gossip-C5RVB1UB.d.mts → gossip-BRQwIM_q.d.mts} +25 -23
  26. package/dist/{gossip-3xkRRCm_.mjs → gossip-oloDMWEj.mjs} +52 -34
  27. package/dist/gossip-oloDMWEj.mjs.map +1 -0
  28. package/dist/gossip.d.mts +1 -1
  29. package/dist/gossip.mjs +1 -1
  30. package/dist/{http-6vevbBlu.d.mts → http-C4HwIu4B.d.mts} +7 -7
  31. package/dist/{http-D2rhokZo.mjs → http-CuazNRIP.mjs} +10 -6
  32. package/dist/http-CuazNRIP.mjs.map +1 -0
  33. package/dist/index-B-CGNDPS.d.mts +207 -0
  34. package/dist/index-BIhSADwK.d.mts +339 -0
  35. package/dist/{index-BYMnhRIC.d.mts → index-Ba7bJ7DD.d.mts} +68 -50
  36. package/dist/{index-DaRyjo7O.d.mts → index-Boe8FshM.d.mts} +13 -7
  37. package/dist/index-D-TK_KJG.d.mts +84 -0
  38. package/dist/index-D1bqFHKB.d.mts +188 -0
  39. package/dist/index.d.mts +22 -20
  40. package/dist/index.mjs +19 -18
  41. package/dist/{key-Dn-aX4x4.mjs → key-Bbtys6o7.mjs} +22 -14
  42. package/dist/key-Bbtys6o7.mjs.map +1 -0
  43. package/dist/{key-BiGxGLhg.d.mts → key-BlsYhN1V.d.mts} +9 -6
  44. package/dist/{kind-BLl4cLOc.mjs → kind-Cxwhhkx8.mjs} +2 -1
  45. package/dist/kind-Cxwhhkx8.mjs.map +1 -0
  46. package/dist/{loaders-BNQszDAn.mjs → loaders-o6YXB_Ri.mjs} +329 -305
  47. package/dist/loaders-o6YXB_Ri.mjs.map +1 -0
  48. package/dist/loaders.d.mts +3 -3
  49. package/dist/loaders.mjs +2 -2
  50. package/dist/memory-C2EVx0_O.mjs +46 -0
  51. package/dist/memory-C2EVx0_O.mjs.map +1 -0
  52. package/dist/{memory-BCmhZPek.mjs → memory-index-Do1mz0WF.mjs} +212 -82
  53. package/dist/memory-index-Do1mz0WF.mjs.map +1 -0
  54. package/dist/{message-C_Uj-Y-c.mjs → message-DcY6Fi9o.mjs} +38 -24
  55. package/dist/message-DcY6Fi9o.mjs.map +1 -0
  56. package/dist/{message-DJC-Jz6T.d.mts → message-iGPIqnn0.d.mts} +15 -8
  57. package/dist/{nip17-BWq-Kfq5.d.mts → nip17-DNEkz8rM.d.mts} +18 -17
  58. package/dist/{nip19-D7905oIv.d.mts → nip19-BevCJZsp.d.mts} +23 -3
  59. package/dist/{nip46-C_DoxiS_.d.mts → nip46-DDV4dC56.d.mts} +13 -12
  60. package/dist/{nip59-DljW_sYh.d.mts → nip59-zQgdLcEr.d.mts} +28 -25
  61. package/dist/{nip65-Di5hZRuV.d.mts → nip65-DBfh2smt.d.mts} +8 -3
  62. package/dist/{nip77-ByxlgoQO.d.mts → nip77-DH4RhS5r.d.mts} +9 -8
  63. package/dist/nips/blossom.d.mts +37 -37
  64. package/dist/nips/blossom.mjs +67 -52
  65. package/dist/nips/blossom.mjs.map +1 -1
  66. package/dist/nips/nip04.d.mts +2 -3
  67. package/dist/nips/nip04.mjs +6 -10
  68. package/dist/nips/nip04.mjs.map +1 -1
  69. package/dist/nips/nip05.d.mts +37 -43
  70. package/dist/nips/nip05.mjs +57 -57
  71. package/dist/nips/nip05.mjs.map +1 -1
  72. package/dist/nips/nip10.d.mts +18 -19
  73. package/dist/nips/nip10.mjs +76 -61
  74. package/dist/nips/nip10.mjs.map +1 -1
  75. package/dist/nips/nip11.d.mts +9 -8
  76. package/dist/nips/nip11.mjs +14 -11
  77. package/dist/nips/nip11.mjs.map +1 -1
  78. package/dist/nips/nip13.d.mts +9 -9
  79. package/dist/nips/nip13.mjs +15 -17
  80. package/dist/nips/nip13.mjs.map +1 -1
  81. package/dist/nips/nip17.d.mts +1 -1
  82. package/dist/nips/nip17.mjs +17 -12
  83. package/dist/nips/nip17.mjs.map +1 -1
  84. package/dist/nips/nip19.d.mts +1 -1
  85. package/dist/nips/nip19.mjs +52 -29
  86. package/dist/nips/nip19.mjs.map +1 -1
  87. package/dist/nips/nip21.d.mts +5 -6
  88. package/dist/nips/nip21.mjs +8 -7
  89. package/dist/nips/nip21.mjs.map +1 -1
  90. package/dist/nips/nip27.d.mts +7 -8
  91. package/dist/nips/nip27.mjs +26 -25
  92. package/dist/nips/nip27.mjs.map +1 -1
  93. package/dist/nips/nip42.d.mts +5 -6
  94. package/dist/nips/nip42.mjs +3 -3
  95. package/dist/nips/nip42.mjs.map +1 -1
  96. package/dist/nips/nip44.d.mts +24 -7
  97. package/dist/nips/nip44.mjs +25 -15
  98. package/dist/nips/nip44.mjs.map +1 -1
  99. package/dist/nips/nip46.d.mts +1 -1
  100. package/dist/nips/nip46.mjs +52 -49
  101. package/dist/nips/nip46.mjs.map +1 -1
  102. package/dist/nips/nip49.d.mts +8 -7
  103. package/dist/nips/nip49.mjs +16 -12
  104. package/dist/nips/nip49.mjs.map +1 -1
  105. package/dist/nips/nip51.d.mts +25 -27
  106. package/dist/nips/nip51.mjs +47 -36
  107. package/dist/nips/nip51.mjs.map +1 -1
  108. package/dist/nips/nip57.d.mts +12 -13
  109. package/dist/nips/nip57.mjs +35 -38
  110. package/dist/nips/nip57.mjs.map +1 -1
  111. package/dist/nips/nip59.d.mts +1 -1
  112. package/dist/nips/nip59.mjs +14 -18
  113. package/dist/nips/nip59.mjs.map +1 -1
  114. package/dist/nips/nip65.d.mts +1 -1
  115. package/dist/nips/nip65.mjs +11 -8
  116. package/dist/nips/nip65.mjs.map +1 -1
  117. package/dist/nips/nip77.d.mts +1 -1
  118. package/dist/nips/nip77.mjs +56 -34
  119. package/dist/nips/nip77.mjs.map +1 -1
  120. package/dist/nips/nip96.d.mts +21 -12
  121. package/dist/nips/nip96.mjs +59 -36
  122. package/dist/nips/nip96.mjs.map +1 -1
  123. package/dist/nips/nip98.d.mts +12 -12
  124. package/dist/nips/nip98.mjs +18 -19
  125. package/dist/nips/nip98.mjs.map +1 -1
  126. package/dist/pool-B7p_reAm.d.mts +333 -0
  127. package/dist/{pool-C_j1OmBB.mjs → pool-C2xOcsun.mjs} +792 -568
  128. package/dist/pool-C2xOcsun.mjs.map +1 -0
  129. package/dist/reactive-DDlThDSZ.mjs +324 -0
  130. package/dist/reactive-DDlThDSZ.mjs.map +1 -0
  131. package/dist/reactive-DFpqtIf_.d.mts +66 -0
  132. package/dist/relay.d.mts +5 -4
  133. package/dist/relay.mjs +2 -2
  134. package/dist/report-CHld4uWj.mjs +32 -0
  135. package/dist/report-CHld4uWj.mjs.map +1 -0
  136. package/dist/{signer-CZ6K6FUc.mjs → signer-CKR9EHce.mjs} +107 -72
  137. package/dist/signer-CKR9EHce.mjs.map +1 -0
  138. package/dist/signer.d.mts +3 -3
  139. package/dist/signer.mjs +3 -2
  140. package/dist/storage-xXxLGCVb.mjs +1376 -0
  141. package/dist/storage-xXxLGCVb.mjs.map +1 -0
  142. package/dist/storage.d.mts +4 -4
  143. package/dist/storage.mjs +5 -4
  144. package/dist/store.d.mts +2 -0
  145. package/dist/store.mjs +2 -0
  146. package/dist/testing.d.mts +135 -0
  147. package/dist/testing.mjs +963 -0
  148. package/dist/testing.mjs.map +1 -0
  149. package/dist/types-2pCUprRU.d.mts +47 -0
  150. package/dist/types-CRQEk0Oi.d.mts +19 -0
  151. package/dist/util-LfQirgDk.mjs +113 -0
  152. package/dist/util-LfQirgDk.mjs.map +1 -0
  153. package/dist/wasm.d.mts +4 -4
  154. package/dist/wasm.mjs +54 -55
  155. package/dist/wasm.mjs.map +1 -1
  156. package/dist/websocket-CmeqvAkp.d.mts +27 -0
  157. package/package.json +93 -39
  158. package/dist/builder-q0VsvnYE.mjs.map +0 -1
  159. package/dist/client-Bd8B1mYm.mjs.map +0 -1
  160. package/dist/error-B49rbDzT.d.mts +0 -7
  161. package/dist/error-CwBxle6N.mjs.map +0 -1
  162. package/dist/error-DZEs5OuZ.mjs +0 -24
  163. package/dist/error-DZEs5OuZ.mjs.map +0 -1
  164. package/dist/event-CzoQEFMF.mjs.map +0 -1
  165. package/dist/filter-BxwjEkZp.mjs.map +0 -1
  166. package/dist/filter-DUEKP3q1.d.mts +0 -40
  167. package/dist/gossip-3xkRRCm_.mjs.map +0 -1
  168. package/dist/http-D2rhokZo.mjs.map +0 -1
  169. package/dist/index-C0C4e-Gn.d.mts +0 -55
  170. package/dist/index-DgOugrpF.d.mts +0 -275
  171. package/dist/index-EwL6fHLo.d.mts +0 -267
  172. package/dist/index-k2YhCgsh.d.mts +0 -57
  173. package/dist/key-Dn-aX4x4.mjs.map +0 -1
  174. package/dist/kind-BLl4cLOc.mjs.map +0 -1
  175. package/dist/loaders-BNQszDAn.mjs.map +0 -1
  176. package/dist/memory-BCmhZPek.mjs.map +0 -1
  177. package/dist/message-C_Uj-Y-c.mjs.map +0 -1
  178. package/dist/pool-C_j1OmBB.mjs.map +0 -1
  179. package/dist/pool-DhRi7l-b.d.mts +0 -297
  180. package/dist/signer-CZ6K6FUc.mjs.map +0 -1
  181. package/dist/storage-DOy0iLRE.mjs +0 -870
  182. package/dist/storage-DOy0iLRE.mjs.map +0 -1
  183. package/dist/types-BzyADqnw.d.mts +0 -19
  184. package/dist/types-Dn24TPFs.d.mts +0 -43
  185. package/dist/util-6tfLQ9JF.mjs +0 -73
  186. package/dist/util-6tfLQ9JF.mjs.map +0 -1
@@ -1,42 +1,46 @@
1
- import { i as hexToBytes, r as bytesToHex } from "./util-6tfLQ9JF.mjs";
2
- import { i as MessageError } from "./error-DZEs5OuZ.mjs";
3
- import { p as validateSignedEvent } from "./event-CzoQEFMF.mjs";
1
+ import { a as hexToBytes, c as isRecord, h as MessageError, i as bytesToHex } from "./util-LfQirgDk.mjs";
2
+ import { m as validateSignedEvent } from "./event-D8Nfoh4K.mjs";
4
3
  //#region src/core/message.ts
4
+ /** Validate a subscription id; throws {@link MessageError} unless 1..64 chars. */
5
5
  function assertSubscriptionId(id) {
6
6
  if (id.length === 0 || id.length > 64) throw new MessageError(`subscription id length must be 1..64`);
7
7
  return id;
8
8
  }
9
+ /** Validate the given id, or mint a random 16-hex-char subscription id. */
9
10
  function createSubscriptionId(id) {
10
11
  if (id !== void 0) return assertSubscriptionId(id);
11
12
  const bytes = /* @__PURE__ */ new Uint8Array(8);
12
13
  crypto.getRandomValues(bytes);
13
- return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
14
+ return bytesToHex(bytes);
14
15
  }
15
16
  const HLL_BYTES = 256;
16
17
  const HLL_HEX_LEN = HLL_BYTES * 2;
17
18
  const HEX_RE = /^[0-9a-fA-F]+$/;
18
19
  /**
19
- * Register-wise max of NIP-45 HyperLogLog sketches.
20
- * Output is always lowercase 512 hex. Empty input is the zero sketch (identity).
20
+ * Register-wise max of NIP-45 HyperLogLog sketches. Output is always lowercase 512 hex. Empty input
21
+ * is the zero sketch (identity).
21
22
  */
22
23
  function mergeCountHll(hexes) {
23
24
  const merged = new Uint8Array(HLL_BYTES);
24
25
  for (const hex of hexes) {
25
26
  if (hex.length !== HLL_HEX_LEN || !HEX_RE.test(hex)) throw new MessageError("invalid NIP-45 HLL sketch: expected 512-char hex");
26
27
  const bytes = hexToBytes(hex);
27
- for (let i = 0; i < HLL_BYTES; i++) {
28
- const b = bytes[i];
29
- if (b > merged[i]) merged[i] = b;
28
+ for (const [i, b] of bytes.entries()) {
29
+ const m = merged[i];
30
+ if (m !== void 0 && b > m) merged[i] = b;
30
31
  }
31
32
  }
32
33
  return bytesToHex(merged);
33
34
  }
35
+ /** Serialize a client->relay message to its NIP-01 JSON wire form. */
34
36
  function encodeClientMessage(message) {
35
37
  return JSON.stringify(message);
36
38
  }
39
+ /** Serialize a relay->client message to its NIP-01 JSON wire form. */
37
40
  function encodeRelayMessage(message) {
38
41
  return JSON.stringify(message);
39
42
  }
43
+ /** Parse a client->relay JSON message; throws {@link MessageError} on malformed input. */
40
44
  function parseClientMessage(raw) {
41
45
  let data;
42
46
  try {
@@ -44,8 +48,8 @@ function parseClientMessage(raw) {
44
48
  } catch {
45
49
  throw new MessageError("client message is not valid JSON");
46
50
  }
47
- if (!Array.isArray(data) || data.length < 1 || typeof data[0] !== "string") throw new MessageError("client message must be a non-empty JSON array");
48
- const type = data[0];
51
+ if (!Array.isArray(data) || data.length === 0 || typeof data[0] !== "string") throw new MessageError("client message must be a non-empty JSON array");
52
+ const [type] = data;
49
53
  switch (type) {
50
54
  case "EVENT":
51
55
  if (data.length !== 2 || !validateSignedEvent(data[1])) throw new MessageError("invalid EVENT client message");
@@ -55,7 +59,7 @@ function parseClientMessage(raw) {
55
59
  return [
56
60
  "REQ",
57
61
  data[1],
58
- ...data.slice(2)
62
+ ...parseWireFilters(data.slice(2), "REQ")
59
63
  ];
60
64
  case "CLOSE":
61
65
  if (data.length !== 2 || typeof data[1] !== "string") throw new MessageError("invalid CLOSE client message");
@@ -68,7 +72,7 @@ function parseClientMessage(raw) {
68
72
  return [
69
73
  "COUNT",
70
74
  data[1],
71
- ...data.slice(2)
75
+ ...parseWireFilters(data.slice(2), "COUNT")
72
76
  ];
73
77
  case "NEG-OPEN":
74
78
  if (data.length === 5) throw new MessageError("obsolete 5-element NEG-OPEN; expected [NEG-OPEN, id, filter, hex]");
@@ -89,9 +93,10 @@ function parseClientMessage(raw) {
89
93
  case "NEG-CLOSE":
90
94
  if (data.length !== 2 || typeof data[1] !== "string") throw new MessageError("invalid NEG-CLOSE client message");
91
95
  return ["NEG-CLOSE", data[1]];
92
- default: throw new MessageError(`unknown client message type: ${type}`);
96
+ default: throw new MessageError(`unknown client message type: ${String(type)}`);
93
97
  }
94
98
  }
99
+ /** Parse a relay->client JSON message; throws {@link MessageError} on malformed input. */
95
100
  function parseRelayMessage(raw) {
96
101
  let data;
97
102
  try {
@@ -99,8 +104,9 @@ function parseRelayMessage(raw) {
99
104
  } catch {
100
105
  throw new MessageError("relay message is not valid JSON");
101
106
  }
102
- if (!Array.isArray(data) || data.length < 1 || typeof data[0] !== "string") throw new MessageError("relay message must be a non-empty JSON array");
103
- const type = data[0];
107
+ if (!Array.isArray(data) || data.length === 0 || typeof data[0] !== "string") throw new MessageError("relay message must be a non-empty JSON array");
108
+ const items = data;
109
+ const [type] = items;
104
110
  switch (type) {
105
111
  case "EVENT":
106
112
  if (data.length !== 3 || typeof data[1] !== "string" || !validateSignedEvent(data[2])) throw new MessageError("invalid EVENT relay message");
@@ -134,11 +140,11 @@ function parseRelayMessage(raw) {
134
140
  if (data.length !== 2 || typeof data[1] !== "string") throw new MessageError("invalid AUTH relay message");
135
141
  return ["AUTH", data[1]];
136
142
  case "COUNT": {
137
- if (data.length !== 3 || typeof data[1] !== "string" || typeof data[2] !== "object" || data[2] === null || typeof data[2].count !== "number") throw new MessageError("invalid COUNT relay message");
138
- const payload = data[2];
139
- const result = { count: payload.count };
140
- if (typeof payload.approximate === "boolean") result.approximate = payload.approximate;
141
- const hll = parseCountHll(payload.hll);
143
+ const payload = items.at(2);
144
+ if (data.length !== 3 || typeof data[1] !== "string" || !isRecord(payload) || typeof payload["count"] !== "number") throw new MessageError("invalid COUNT relay message");
145
+ const result = { count: payload["count"] };
146
+ if (typeof payload["approximate"] === "boolean") result.approximate = payload["approximate"];
147
+ const hll = parseCountHll(payload["hll"]);
142
148
  if (hll !== void 0) result.hll = hll;
143
149
  return [
144
150
  "COUNT",
@@ -160,15 +166,23 @@ function parseRelayMessage(raw) {
160
166
  data[1],
161
167
  data[2]
162
168
  ];
163
- default: throw new MessageError(`unknown relay message type: ${type}`);
169
+ default: throw new MessageError(`unknown relay message type: ${String(type)}`);
164
170
  }
165
171
  }
166
172
  function parseCountHll(value) {
167
173
  if (typeof value !== "string" || value.length !== HLL_HEX_LEN || !HEX_RE.test(value)) return;
168
174
  return value.toLowerCase();
169
175
  }
176
+ function parseWireFilters(items, kind) {
177
+ const filters = [];
178
+ for (const item of items) {
179
+ if (!isFilterObject(item)) throw new MessageError(`invalid ${kind} filter`);
180
+ filters.push(item);
181
+ }
182
+ return filters;
183
+ }
170
184
  function isFilterObject(value) {
171
- return typeof value === "object" && value !== null && !Array.isArray(value);
185
+ return isRecord(value);
172
186
  }
173
187
  function isNegHex(value) {
174
188
  return typeof value === "string" && value.length > 0 && value.length % 2 === 0 && HEX_RE.test(value);
@@ -176,4 +190,4 @@ function isNegHex(value) {
176
190
  //#endregion
177
191
  export { mergeCountHll as a, encodeRelayMessage as i, createSubscriptionId as n, parseClientMessage as o, encodeClientMessage as r, parseRelayMessage as s, assertSubscriptionId as t };
178
192
 
179
- //# sourceMappingURL=message-C_Uj-Y-c.mjs.map
193
+ //# sourceMappingURL=message-DcY6Fi9o.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-DcY6Fi9o.mjs","names":["items"],"sources":["../src/core/message.ts"],"sourcesContent":["import { MessageError } from \"./error.ts\";\nimport type { Event } from \"./event.ts\";\nimport { validateSignedEvent } from \"./event.ts\";\nimport type { Filter } from \"./filter.ts\";\nimport { SUBSCRIPTION_ID_MAX_CHARS } from \"./limits.ts\";\nimport { bytesToHex, hexToBytes, isRecord } from \"./util.ts\";\n\n/** NIP-01 subscription id: 1..64 chars. */\nexport type SubscriptionId = string;\n\n/** Validate a subscription id; throws {@link MessageError} unless 1..64 chars. */\nexport function assertSubscriptionId(id: string): SubscriptionId {\n if (id.length === 0 || id.length > SUBSCRIPTION_ID_MAX_CHARS) {\n throw new MessageError(`subscription id length must be 1..${SUBSCRIPTION_ID_MAX_CHARS}`);\n }\n return id;\n}\n\n/** Validate the given id, or mint a random 16-hex-char subscription id. */\nexport function createSubscriptionId(id?: string): SubscriptionId {\n if (id !== undefined) {\n return assertSubscriptionId(id);\n }\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n}\n\n/** Client → relay messages (NIP-01 + NIP-42 AUTH + NIP-45 COUNT + NIP-77). */\nexport type ClientMessage =\n | [\"EVENT\", Event]\n | [\"REQ\", SubscriptionId, ...Filter[]]\n | [\"CLOSE\", SubscriptionId]\n | [\"AUTH\", Event]\n | [\"COUNT\", SubscriptionId, ...Filter[]]\n | [\"NEG-OPEN\", SubscriptionId, Filter, string]\n | [\"NEG-MSG\", SubscriptionId, string]\n | [\"NEG-CLOSE\", SubscriptionId];\n\n/** Relay → client messages. */\nexport type RelayMessage =\n | [\"EVENT\", SubscriptionId, Event]\n | [\"OK\", string, boolean, string]\n | [\"EOSE\", SubscriptionId]\n | [\"CLOSED\", SubscriptionId, string]\n | [\"NOTICE\", string]\n | [\"AUTH\", string]\n | [\"COUNT\", SubscriptionId, CountResult]\n | [\"NEG-MSG\", SubscriptionId, string]\n | [\"NEG-ERR\", SubscriptionId, string];\n\n/** NIP-45 COUNT reply payload. */\nexport type CountResult = {\n count: number;\n approximate?: boolean;\n /**\n * Optional 512-char hex HyperLogLog sketch (256 registers). Merge sketches with `mergeCountHll`.\n * Estimation is unspecified by NIP-45 and not provided.\n */\n hll?: string;\n};\n\nconst HLL_BYTES = 256; // 512 hex chars (NIP-45; hex only, not base64)\nconst HLL_HEX_LEN = HLL_BYTES * 2;\nconst HEX_RE = /^[0-9a-fA-F]+$/;\n\n/**\n * Register-wise max of NIP-45 HyperLogLog sketches. Output is always lowercase 512 hex. Empty input\n * is the zero sketch (identity).\n */\nexport function mergeCountHll(hexes: ReadonlyArray<string>): string {\n const merged = new Uint8Array(HLL_BYTES);\n for (const hex of hexes) {\n if (hex.length !== HLL_HEX_LEN || !HEX_RE.test(hex)) {\n throw new MessageError(\"invalid NIP-45 HLL sketch: expected 512-char hex\");\n }\n const bytes = hexToBytes(hex);\n for (const [i, b] of bytes.entries()) {\n const m = merged[i];\n if (m !== undefined && b > m) {\n merged[i] = b;\n }\n }\n }\n return bytesToHex(merged);\n}\n\n/** Serialize a client->relay message to its NIP-01 JSON wire form. */\nexport function encodeClientMessage(message: ClientMessage): string {\n return JSON.stringify(message);\n}\n\n/** Serialize a relay->client message to its NIP-01 JSON wire form. */\nexport function encodeRelayMessage(message: RelayMessage): string {\n return JSON.stringify(message);\n}\n\n/** Parse a client->relay JSON message; throws {@link MessageError} on malformed input. */\nexport function parseClientMessage(raw: string): ClientMessage {\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new MessageError(\"client message is not valid JSON\");\n }\n if (!Array.isArray(data) || data.length === 0 || typeof data[0] !== \"string\") {\n throw new MessageError(\"client message must be a non-empty JSON array\");\n }\n const items: unknown[] = data;\n const [type] = items;\n switch (type) {\n case \"EVENT\":\n if (data.length !== 2 || !validateSignedEvent(data[1])) {\n throw new MessageError(\"invalid EVENT client message\");\n }\n return [\"EVENT\", data[1]];\n\n case \"REQ\":\n if (data.length < 3 || typeof data[1] !== \"string\") {\n throw new MessageError(\"invalid REQ client message\");\n }\n return [\"REQ\", data[1], ...parseWireFilters(data.slice(2), \"REQ\")];\n\n case \"CLOSE\":\n if (data.length !== 2 || typeof data[1] !== \"string\") {\n throw new MessageError(\"invalid CLOSE client message\");\n }\n return [\"CLOSE\", data[1]];\n\n case \"AUTH\":\n if (data.length !== 2 || !validateSignedEvent(data[1])) {\n throw new MessageError(\"invalid AUTH client message\");\n }\n return [\"AUTH\", data[1]];\n\n case \"COUNT\":\n if (data.length < 3 || typeof data[1] !== \"string\") {\n throw new MessageError(\"invalid COUNT client message\");\n }\n return [\"COUNT\", data[1], ...parseWireFilters(data.slice(2), \"COUNT\")];\n\n case \"NEG-OPEN\":\n if (data.length === 5) {\n throw new MessageError(\"obsolete 5-element NEG-OPEN; expected [NEG-OPEN, id, filter, hex]\");\n }\n if (\n data.length !== 4 ||\n typeof data[1] !== \"string\" ||\n !isFilterObject(data[2]) ||\n !isNegHex(data[3])\n ) {\n throw new MessageError(\"invalid NEG-OPEN client message\");\n }\n return [\"NEG-OPEN\", data[1], data[2], data[3].toLowerCase()];\n\n case \"NEG-MSG\":\n if (data.length !== 3 || typeof data[1] !== \"string\" || !isNegHex(data[2])) {\n throw new MessageError(\"invalid NEG-MSG client message\");\n }\n return [\"NEG-MSG\", data[1], data[2].toLowerCase()];\n\n case \"NEG-CLOSE\":\n if (data.length !== 2 || typeof data[1] !== \"string\") {\n throw new MessageError(\"invalid NEG-CLOSE client message\");\n }\n return [\"NEG-CLOSE\", data[1]];\n\n default:\n throw new MessageError(`unknown client message type: ${String(type)}`);\n }\n}\n\n/** Parse a relay->client JSON message; throws {@link MessageError} on malformed input. */\nexport function parseRelayMessage(raw: string): RelayMessage {\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new MessageError(\"relay message is not valid JSON\");\n }\n if (!Array.isArray(data) || data.length === 0 || typeof data[0] !== \"string\") {\n throw new MessageError(\"relay message must be a non-empty JSON array\");\n }\n const items: unknown[] = data;\n const [type] = items;\n switch (type) {\n case \"EVENT\":\n if (data.length !== 3 || typeof data[1] !== \"string\" || !validateSignedEvent(data[2])) {\n throw new MessageError(\"invalid EVENT relay message\");\n }\n return [\"EVENT\", data[1], data[2]];\n\n case \"OK\":\n if (\n data.length !== 4 ||\n typeof data[1] !== \"string\" ||\n typeof data[2] !== \"boolean\" ||\n typeof data[3] !== \"string\"\n ) {\n throw new MessageError(\"invalid OK relay message\");\n }\n return [\"OK\", data[1], data[2], data[3]];\n\n case \"EOSE\":\n if (data.length !== 2 || typeof data[1] !== \"string\") {\n throw new MessageError(\"invalid EOSE relay message\");\n }\n return [\"EOSE\", data[1]];\n\n case \"CLOSED\":\n if (data.length !== 3 || typeof data[1] !== \"string\" || typeof data[2] !== \"string\") {\n throw new MessageError(\"invalid CLOSED relay message\");\n }\n return [\"CLOSED\", data[1], data[2]];\n\n case \"NOTICE\":\n if (data.length !== 2 || typeof data[1] !== \"string\") {\n throw new MessageError(\"invalid NOTICE relay message\");\n }\n return [\"NOTICE\", data[1]];\n\n case \"AUTH\":\n if (data.length !== 2 || typeof data[1] !== \"string\") {\n throw new MessageError(\"invalid AUTH relay message\");\n }\n return [\"AUTH\", data[1]];\n\n case \"COUNT\": {\n const payload = items.at(2);\n if (\n data.length !== 3 ||\n typeof data[1] !== \"string\" ||\n !isRecord(payload) ||\n typeof payload[\"count\"] !== \"number\"\n ) {\n throw new MessageError(\"invalid COUNT relay message\");\n }\n const result: CountResult = { count: payload[\"count\"] };\n if (typeof payload[\"approximate\"] === \"boolean\") {\n result.approximate = payload[\"approximate\"];\n }\n const hll = parseCountHll(payload[\"hll\"]);\n if (hll !== undefined) {\n result.hll = hll;\n }\n return [\"COUNT\", data[1], result];\n }\n case \"NEG-MSG\":\n if (data.length !== 3 || typeof data[1] !== \"string\" || !isNegHex(data[2])) {\n throw new MessageError(\"invalid NEG-MSG relay message\");\n }\n return [\"NEG-MSG\", data[1], data[2].toLowerCase()];\n\n case \"NEG-ERR\":\n if (\n (data.length !== 3 && data.length !== 4) ||\n typeof data[1] !== \"string\" ||\n typeof data[2] !== \"string\"\n ) {\n throw new MessageError(\"invalid NEG-ERR relay message\");\n }\n return [\"NEG-ERR\", data[1], data[2]];\n\n default:\n throw new MessageError(`unknown relay message type: ${String(type)}`);\n }\n}\n\nfunction parseCountHll(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length !== HLL_HEX_LEN || !HEX_RE.test(value)) {\n return undefined;\n }\n return value.toLowerCase();\n}\n\nfunction parseWireFilters(items: unknown[], kind: string): Filter[] {\n const filters: Filter[] = [];\n for (const item of items) {\n if (!isFilterObject(item)) {\n throw new MessageError(`invalid ${kind} filter`);\n }\n filters.push(item);\n }\n return filters;\n}\n\nfunction isFilterObject(value: unknown): value is Filter {\n return isRecord(value);\n}\n\nfunction isNegHex(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.length > 0 && value.length % 2 === 0 && HEX_RE.test(value)\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,11 @@
1
- import { t as Event } from "./event-B5D2jxt_.mjs";
2
- import { t as Filter } from "./filter-DUEKP3q1.mjs";
1
+ import { t as Event } from "./event-fU3Y01PR.mjs";
2
+ import { t as Filter } from "./filter-C0IMByE3.mjs";
3
3
  //#region src/core/message.d.ts
4
+ /** NIP-01 subscription id: 1..64 chars. */
4
5
  type SubscriptionId = string;
6
+ /** Validate a subscription id; throws {@link MessageError} unless 1..64 chars. */
5
7
  declare function assertSubscriptionId(id: string): SubscriptionId;
8
+ /** Validate the given id, or mint a random 16-hex-char subscription id. */
6
9
  declare function createSubscriptionId(id?: string): SubscriptionId;
7
10
  /** Client → relay messages (NIP-01 + NIP-42 AUTH + NIP-45 COUNT + NIP-77). */
8
11
  type ClientMessage = ["EVENT", Event] | ["REQ", SubscriptionId, ...Filter[]] | ["CLOSE", SubscriptionId] | ["AUTH", Event] | ["COUNT", SubscriptionId, ...Filter[]] | ["NEG-OPEN", SubscriptionId, Filter, string] | ["NEG-MSG", SubscriptionId, string] | ["NEG-CLOSE", SubscriptionId];
@@ -13,20 +16,24 @@ type CountResult = {
13
16
  count: number;
14
17
  approximate?: boolean;
15
18
  /**
16
- * Optional 512-char hex HyperLogLog sketch (256 registers).
17
- * Merge sketches with `mergeCountHll`. Estimation is unspecified by NIP-45 and not provided.
19
+ * Optional 512-char hex HyperLogLog sketch (256 registers). Merge sketches with `mergeCountHll`.
20
+ * Estimation is unspecified by NIP-45 and not provided.
18
21
  */
19
22
  hll?: string;
20
23
  };
21
24
  /**
22
- * Register-wise max of NIP-45 HyperLogLog sketches.
23
- * Output is always lowercase 512 hex. Empty input is the zero sketch (identity).
25
+ * Register-wise max of NIP-45 HyperLogLog sketches. Output is always lowercase 512 hex. Empty input
26
+ * is the zero sketch (identity).
24
27
  */
25
- declare function mergeCountHll(hexes: readonly string[]): string;
28
+ declare function mergeCountHll(hexes: ReadonlyArray<string>): string;
29
+ /** Serialize a client->relay message to its NIP-01 JSON wire form. */
26
30
  declare function encodeClientMessage(message: ClientMessage): string;
31
+ /** Serialize a relay->client message to its NIP-01 JSON wire form. */
27
32
  declare function encodeRelayMessage(message: RelayMessage): string;
33
+ /** Parse a client->relay JSON message; throws {@link MessageError} on malformed input. */
28
34
  declare function parseClientMessage(raw: string): ClientMessage;
35
+ /** Parse a relay->client JSON message; throws {@link MessageError} on malformed input. */
29
36
  declare function parseRelayMessage(raw: string): RelayMessage;
30
37
  //#endregion
31
38
  export { assertSubscriptionId as a, encodeRelayMessage as c, parseRelayMessage as d, SubscriptionId as i, mergeCountHll as l, CountResult as n, createSubscriptionId as o, RelayMessage as r, encodeClientMessage as s, ClientMessage as t, parseClientMessage as u };
32
- //# sourceMappingURL=message-DJC-Jz6T.d.mts.map
39
+ //# sourceMappingURL=message-iGPIqnn0.d.mts.map
@@ -1,38 +1,39 @@
1
- import { t as Event, v as Tag } from "./event-B5D2jxt_.mjs";
2
- import { t as EventBuilder } from "./builder-BphJa-Y-.mjs";
3
- import { a as NostrError } from "./error-WEFS-R-4.mjs";
4
- import { a as Rumor, l as WrapOptions, r as Nip59Crypto } from "./nip59-DljW_sYh.mjs";
1
+ import { _ as Tag, t as Event } from "./event-fU3Y01PR.mjs";
2
+ import { t as EventBuilder } from "./builder-BWn55Paf.mjs";
3
+ import { a as NostrError } from "./error-CR8Urc84.mjs";
4
+ import { a as Rumor, l as WrapOptions, r as Nip59Crypto } from "./nip59-zQgdLcEr.mjs";
5
5
  //#region src/nips/nip17.d.ts
6
6
  declare class Nip17Error extends NostrError {
7
+ name: string;
7
8
  constructor(message: string, options?: ErrorOptions);
8
9
  }
9
10
  type Recipient = {
10
11
  readonly pubkey: string;
11
- readonly relayHint?: string;
12
+ readonly relayHint?: string | undefined;
12
13
  };
13
14
  type ReplyTo = {
14
15
  readonly id: string;
15
- readonly relayHint?: string;
16
+ readonly relayHint?: string | undefined;
16
17
  };
17
18
  type ChatMessageOptions = {
18
- readonly created_at?: number;
19
- readonly subject?: string;
20
- readonly replyTo?: ReplyTo;
19
+ readonly created_at?: number | undefined;
20
+ readonly subject?: string | undefined;
21
+ readonly replyTo?: ReplyTo | undefined;
21
22
  };
22
23
  /** Parse kind:10050 DM relay list (`["relay", url]` tags). */
23
24
  declare function parseDmRelayList(event: Pick<Event, "kind" | "tags">): string[];
24
25
  /** Encode DM relay URLs as NIP-17 `relay` tags. */
25
- declare function dmRelayListToTags(relays: readonly string[]): Tag[];
26
- /** Build an unsigned kind:10050 EventBuilder. */
27
- declare function dmRelayListEventBuilder(relays: readonly string[]): EventBuilder;
26
+ declare function dmRelayListToTags(relays: ReadonlyArray<string>): Tag[];
27
+ /** Build an unsigned kind:10050 EventBuilder. NIP-17 requires ≥1 relay tag. */
28
+ declare function dmRelayListEventBuilder(relays: ReadonlyArray<string>): EventBuilder;
28
29
  /** Accept a hex pubkey, a Recipient, or a readonly array of either. Dedup by pubkey. */
29
- declare function normalizeRecipients(input: string | Recipient | readonly (string | Recipient)[]): Recipient[];
30
- declare function buildChatMessageRumor(senderPubkey: string, recipients: readonly Recipient[], content: string, opts?: ChatMessageOptions): Rumor;
31
- declare function wrapDirectMessage(crypto: Nip59Crypto, recipients: readonly Recipient[], rumor: Rumor, opts?: Pick<WrapOptions, "now" | "randomInt" | "timestamps" | "randomize">): Promise<ReadonlyArray<{
30
+ declare function normalizeRecipients(input: string | Recipient | ReadonlyArray<string | Recipient>): Recipient[];
31
+ declare function buildChatMessageRumor(senderPubkey: string, recipients: ReadonlyArray<Recipient>, content: string, opts?: ChatMessageOptions): Rumor;
32
+ declare function wrapDirectMessage(crypto: Nip59Crypto, recipients: ReadonlyArray<Recipient>, rumor: Rumor, opts?: Pick<WrapOptions, "now" | "randomInt" | "timestamps" | "randomize">): Promise<ReadonlyArray<{
32
33
  recipient: string;
33
34
  wrap: Event;
34
35
  }>>;
35
- declare function requireDmRelays(pubkey: string, relays: readonly string[]): string[];
36
+ declare function requireDmRelays(pubkey: string, relays: ReadonlyArray<string>): string[];
36
37
  //#endregion
37
38
  export { buildChatMessageRumor as a, normalizeRecipients as c, wrapDirectMessage as d, ReplyTo as i, parseDmRelayList as l, Nip17Error as n, dmRelayListEventBuilder as o, Recipient as r, dmRelayListToTags as s, ChatMessageOptions as t, requireDmRelays as u };
38
- //# sourceMappingURL=nip17-BWq-Kfq5.d.mts.map
39
+ //# sourceMappingURL=nip17-DNEkz8rM.d.mts.map
@@ -1,28 +1,39 @@
1
- import { a as NostrError } from "./error-WEFS-R-4.mjs";
1
+ import { a as NostrError } from "./error-CR8Urc84.mjs";
2
2
  //#region src/nips/nip19.d.ts
3
+ /** Bech32 `nprofile1…` string (TLV profile pointer). */
3
4
  type NProfile = `nprofile1${string}`;
5
+ /** Bech32 `nevent1…` string (TLV event pointer). */
4
6
  type NEvent = `nevent1${string}`;
7
+ /** Bech32 `naddr1…` string (TLV address pointer). */
5
8
  type NAddr = `naddr1${string}`;
9
+ /** Bech32 `nsec1…` string (32-byte secret key). */
6
10
  type NSec = `nsec1${string}`;
11
+ /** Bech32 `npub1…` string (32-byte public key). */
7
12
  type NPub = `npub1${string}`;
13
+ /** Bech32 `note1…` string (32-byte event id). */
8
14
  type Note = `note1${string}`;
15
+ /** Maximum bech32 string length accepted by {@link decode} (NIP-19). */
9
16
  declare const Bech32MaxSize = 5000;
17
+ /** Decoded `nprofile` payload: a pubkey plus optional relay hints. */
10
18
  type ProfilePointer = {
11
19
  pubkey: string;
12
20
  relays?: string[];
13
21
  };
22
+ /** Decoded `nevent` payload: an event id plus optional relay/author/kind hints. */
14
23
  type EventPointer = {
15
24
  id: string;
16
25
  relays?: string[];
17
26
  author?: string;
18
27
  kind?: number;
19
28
  };
29
+ /** Decoded `naddr` payload: a replaceable-event coordinate plus optional relay hints. */
20
30
  type AddressPointer = {
21
31
  identifier: string;
22
32
  pubkey: string;
23
33
  kind: number;
24
34
  relays?: string[];
25
35
  };
36
+ /** Result of {@link decode}: the bech32 prefix and its decoded payload. */
26
37
  type DecodedResult = {
27
38
  type: "nprofile";
28
39
  data: ProfilePointer;
@@ -42,22 +53,31 @@ type DecodedResult = {
42
53
  type: "note";
43
54
  data: string;
44
55
  };
56
+ /** Error thrown by NIP-19 encoding/decoding failures. */
45
57
  declare class Nip19Error extends NostrError {
58
+ name: string;
46
59
  constructor(message: string);
47
60
  }
48
61
  declare function encodeBytes<Prefix extends string>(prefix: Prefix, bytes: Uint8Array): `${Prefix}1${string}`;
62
+ /** Encode a 32-byte secret key as `nsec1…`; throws {@link Nip19Error} on wrong length. */
49
63
  declare function nsecEncode(key: Uint8Array): NSec;
64
+ /** Encode a hex public key as `npub1…`; throws {@link HexError} on bad hex. */
50
65
  declare function npubEncode(hex: string): NPub;
66
+ /** Encode a hex event id as `note1…`; throws {@link HexError} on bad hex. */
51
67
  declare function noteEncode(hex: string): Note;
68
+ /** Encode a profile pointer as `nprofile1…`. */
52
69
  declare function nprofileEncode(profile: ProfilePointer): NProfile;
70
+ /** Encode an event pointer as `nevent1…`. */
53
71
  declare function neventEncode(event: EventPointer): NEvent;
72
+ /** Encode an address pointer as `naddr1…`. */
54
73
  declare function naddrEncode(addr: AddressPointer): NAddr;
74
+ /** Decode a NIP-19 bech32 entity; throws {@link Nip19Error} on bad input or unknown prefix. */
55
75
  declare function decode(code: string): DecodedResult;
56
76
  /** Decode `nostr:` URI or bare bech32; returns invalid sentinel instead of throwing. */
57
77
  declare function decodeNostrURI(nip19code: string): DecodedResult | {
58
78
  type: "invalid";
59
- data: null;
79
+ data: undefined;
60
80
  };
61
81
  //#endregion
62
82
  export { neventEncode as _, NAddr as a, npubEncode as b, NPub as c, Note as d, ProfilePointer as f, naddrEncode as g, encodeBytes as h, EventPointer as i, NSec as l, decodeNostrURI as m, Bech32MaxSize as n, NEvent as o, decode as p, DecodedResult as r, NProfile as s, AddressPointer as t, Nip19Error as u, noteEncode as v, nsecEncode as x, nprofileEncode as y };
63
- //# sourceMappingURL=nip19-D7905oIv.d.mts.map
83
+ //# sourceMappingURL=nip19-BevCJZsp.d.mts.map
@@ -1,22 +1,22 @@
1
- import { a as NostrError } from "./error-WEFS-R-4.mjs";
1
+ import { a as NostrError } from "./error-CR8Urc84.mjs";
2
2
  //#region src/nips/nip46.d.ts
3
3
  declare const BUNKER_REGEX: RegExp;
4
4
  type BunkerPointer = {
5
5
  /** Remote signer / bunker public key (hex). */
6
6
  pubkey: string;
7
7
  relays: string[];
8
- secret: string | null;
8
+ secret: string | undefined;
9
9
  };
10
10
  type ClientMetadata = {
11
- name?: string;
12
- url?: string;
13
- image?: string;
11
+ name?: string | undefined;
12
+ url?: string | undefined;
13
+ image?: string | undefined;
14
14
  };
15
15
  type NostrConnectParams = {
16
16
  clientPubkey: string;
17
17
  relays: string[];
18
18
  secret: string;
19
- perms?: string[];
19
+ perms?: string[] | undefined;
20
20
  } & ClientMetadata;
21
21
  type Nip46Request = {
22
22
  id: string;
@@ -25,19 +25,20 @@ type Nip46Request = {
25
25
  };
26
26
  type Nip46Response = {
27
27
  id: string;
28
- result?: string;
29
- error?: string;
28
+ result?: string | undefined;
29
+ error?: string | undefined;
30
30
  };
31
31
  declare class Nip46Error extends NostrError {
32
+ name: string;
32
33
  constructor(message: string, options?: ErrorOptions);
33
34
  }
34
35
  /** Encode a bunker pointer as `bunker://…`. */
35
36
  declare function toBunkerURL(pointer: BunkerPointer): string;
36
37
  /**
37
- * Parse a `bunker://` URL into a pointer.
38
- * Returns null when the input is not a bunker URL (including NIP-05 identifiers).
38
+ * Parse a `bunker://` URL into a pointer. Returns undefined when the input is not a bunker URL
39
+ * (including NIP-05 identifiers).
39
40
  */
40
- declare function parseBunkerURL(input: string): BunkerPointer | null;
41
+ declare function parseBunkerURL(input: string): BunkerPointer | undefined;
41
42
  /** Build a client-initiated `nostrconnect://` URI. */
42
43
  declare function createNostrConnectURI(params: NostrConnectParams): string;
43
44
  /** Parse a `nostrconnect://` URI. */
@@ -48,4 +49,4 @@ declare function encodeNip46Response(res: Nip46Response): string;
48
49
  declare function decodeNip46Response(json: string): Nip46Response;
49
50
  //#endregion
50
51
  export { Nip46Request as a, createNostrConnectURI as c, encodeNip46Request as d, encodeNip46Response as f, toBunkerURL as h, Nip46Error as i, decodeNip46Request as l, parseNostrConnectURI as m, BunkerPointer as n, Nip46Response as o, parseBunkerURL as p, ClientMetadata as r, NostrConnectParams as s, BUNKER_REGEX as t, decodeNip46Response as u };
51
- //# sourceMappingURL=nip46-C_DoxiS_.d.mts.map
52
+ //# sourceMappingURL=nip46-DDV4dC56.d.mts.map
@@ -1,23 +1,22 @@
1
- import { r as UnsignedEvent, t as Event, v as Tag } from "./event-B5D2jxt_.mjs";
2
- import { a as NostrError } from "./error-WEFS-R-4.mjs";
1
+ import { _ as Tag, r as UnsignedEvent, t as Event } from "./event-fU3Y01PR.mjs";
2
+ import { a as NostrError } from "./error-CR8Urc84.mjs";
3
3
  //#region src/nips/nip59.d.ts
4
4
  /** Unsigned event with a computed id. Never has `sig`. */
5
5
  type Rumor = UnsignedEvent & {
6
6
  readonly id: string;
7
7
  };
8
8
  /**
9
- * Structural crypto used by NIP-59.
10
- * Satisfied by NostrSigner when nip44Encrypt/nip44Decrypt are present.
11
- * This module must not import src/signer/.
9
+ * Structural crypto used by NIP-59. Satisfied by NostrSigner when nip44Encrypt/nip44Decrypt are
10
+ * present. This module must not import src/signer/.
12
11
  */
13
12
  type Nip59Crypto = {
14
- getPublicKey(): Promise<string>;
15
- signEvent(unsigned: UnsignedEvent): Promise<Event>;
16
- nip44Encrypt(peer: string, plaintext: string): Promise<string>;
17
- nip44Decrypt(peer: string, payload: string): Promise<string>;
13
+ getPublicKey: () => Promise<string>;
14
+ signEvent: (unsigned: UnsignedEvent) => Promise<Event>;
15
+ nip44Encrypt: (peer: string, plaintext: string) => Promise<string>;
16
+ nip44Decrypt: (peer: string, payload: string) => Promise<string>;
18
17
  };
19
18
  type Nip44Decryptor = {
20
- nip44Decrypt(peer: string, payload: string): Promise<string>;
19
+ nip44Decrypt: (peer: string, payload: string) => Promise<string>;
21
20
  };
22
21
  type GiftWrapTimestamps = {
23
22
  readonly seal: number;
@@ -27,26 +26,30 @@ type GiftWrapTimestamps = {
27
26
  type TimestampRandomize = "wrap" | "seal+wrap";
28
27
  type WrapOptions = {
29
28
  /** Unix seconds used as the randomization window end. Default: floor(Date.now()/1000). */
30
- readonly now?: number;
29
+ readonly now?: number | undefined;
31
30
  /** Uniform integer in [0, maxExclusive). Default: CSPRNG via @noble/hashes randomBytes. */
32
- readonly randomInt?: (maxExclusive: number) => number;
31
+ readonly randomInt?: ((maxExclusive: number) => number) | undefined;
33
32
  /** When set, used as-is. Overrides now/randomInt for this call. */
34
- readonly timestamps?: GiftWrapTimestamps;
35
- readonly relayHint?: string;
33
+ readonly timestamps?: GiftWrapTimestamps | undefined;
34
+ readonly relayHint?: string | undefined;
36
35
  /** Appended after the required wrap `p` tag. Never applied to the seal. */
37
- readonly extraTags?: readonly Tag[];
38
- /** Default `"seal+wrap"` (NIP-59). `"wrap"` = only wrap timestamp is randomized; seal uses rumor.created_at. */
39
- readonly randomize?: TimestampRandomize;
36
+ readonly extraTags?: ReadonlyArray<Tag> | undefined;
37
+ /**
38
+ * Default `"seal+wrap"` (NIP-59). `"wrap"` = only wrap timestamp is randomized; seal uses
39
+ * rumor.created_at.
40
+ */
41
+ readonly randomize?: TimestampRandomize | undefined;
40
42
  };
41
43
  type SealOptions = Pick<WrapOptions, "now" | "randomInt" | "timestamps" | "randomize">;
42
44
  declare class Nip59Error extends NostrError {
45
+ name: string;
43
46
  constructor(message: string, options?: ErrorOptions);
44
47
  }
45
48
  declare const TWO_DAYS_SECS: number;
46
49
  declare function isGiftWrapKind(kind: number): boolean;
47
50
  type Nip59CryptoInput = {
48
- getPublicKey(): Promise<string>;
49
- signEvent(unsigned: UnsignedEvent): Promise<Event>;
51
+ getPublicKey: () => Promise<string>;
52
+ signEvent: (unsigned: UnsignedEvent) => Promise<Event>;
50
53
  nip44Encrypt?: (peer: string, plaintext: string) => Promise<string>;
51
54
  nip44Decrypt?: (peer: string, payload: string) => Promise<string>;
52
55
  };
@@ -58,14 +61,14 @@ declare function requireNip44Decryptor(crypto: {
58
61
  declare function rumorToJson(rumor: Rumor): string;
59
62
  declare function eventToJson(event: Event): string;
60
63
  declare function randomPastTimestamp(opts?: {
61
- now?: number;
62
- randomInt?: (maxExclusive: number) => number;
64
+ now?: number | undefined;
65
+ randomInt?: ((maxExclusive: number) => number) | undefined;
63
66
  }): number;
64
67
  declare function createRumor(pubkey: string, template: {
65
68
  kind: number;
66
- content?: string;
67
- tags?: readonly Tag[];
68
- created_at?: number;
69
+ content?: string | undefined;
70
+ tags?: ReadonlyArray<Tag> | undefined;
71
+ created_at?: number | undefined;
69
72
  }): Rumor;
70
73
  declare function createSeal(crypto: Nip59Crypto, recipient: string, rumor: Rumor, opts?: SealOptions): Promise<Event>;
71
74
  declare function createGiftWrap(seal: Event, recipient: string, opts?: WrapOptions): Event;
@@ -73,4 +76,4 @@ declare function wrap(crypto: Nip59Crypto, recipient: string, rumor: Rumor, opts
73
76
  declare function unwrap(crypto: Nip44Decryptor, giftWrap: Event): Promise<Rumor>;
74
77
  //#endregion
75
78
  export { requireNip59Crypto as _, Rumor as a, wrap as b, TimestampRandomize as c, createRumor as d, createSeal as f, requireNip44Decryptor as g, randomPastTimestamp as h, Nip59Error as i, WrapOptions as l, isGiftWrapKind as m, Nip44Decryptor as n, SealOptions as o, eventToJson as p, Nip59Crypto as r, TWO_DAYS_SECS as s, GiftWrapTimestamps as t, createGiftWrap as u, rumorToJson as v, unwrap as y };
76
- //# sourceMappingURL=nip59-DljW_sYh.d.mts.map
79
+ //# sourceMappingURL=nip59-zQgdLcEr.d.mts.map
@@ -1,12 +1,15 @@
1
- import { t as Event, v as Tag } from "./event-B5D2jxt_.mjs";
2
- import { t as EventBuilder } from "./builder-BphJa-Y-.mjs";
1
+ import { _ as Tag, t as Event } from "./event-fU3Y01PR.mjs";
2
+ import { t as EventBuilder } from "./builder-BWn55Paf.mjs";
3
3
  //#region src/nips/nip65.d.ts
4
+ /** NIP-65 `r` tag marker: read-only, write-only, or unmarked (both). */
4
5
  type RelayMarker = "read" | "write" | "readwrite";
6
+ /** One NIP-65 relay-list entry: normalized URL plus read/write flags. */
5
7
  type RelayListItem = {
6
8
  url: string;
7
9
  read: boolean;
8
10
  write: boolean;
9
11
  };
12
+ /** The NIP-65 marker an item's read/write flags map to. */
10
13
  declare function markerOf(item: RelayListItem): RelayMarker;
11
14
  /** Parse a kind:10002 NIP-65 event into relay list entries. */
12
15
  declare function parseRelayList(event: Event): RelayListItem[];
@@ -14,8 +17,10 @@ declare function parseRelayList(event: Event): RelayListItem[];
14
17
  declare function relayListToTags(items: RelayListItem[]): Tag[];
15
18
  /** Build an unsigned kind:10002 EventBuilder from relay list items. */
16
19
  declare function relayListEventBuilder(items: RelayListItem[]): EventBuilder;
20
+ /** URLs of the read-enabled items. */
17
21
  declare function readRelays(items: RelayListItem[]): string[];
22
+ /** URLs of the write-enabled items. */
18
23
  declare function writeRelays(items: RelayListItem[]): string[];
19
24
  //#endregion
20
25
  export { readRelays as a, writeRelays as c, parseRelayList as i, RelayMarker as n, relayListEventBuilder as o, markerOf as r, relayListToTags as s, RelayListItem as t };
21
- //# sourceMappingURL=nip65-Di5hZRuV.d.mts.map
26
+ //# sourceMappingURL=nip65-DBfh2smt.d.mts.map
@@ -1,10 +1,11 @@
1
- import { t as Event } from "./event-B5D2jxt_.mjs";
2
- import { a as NostrError } from "./error-WEFS-R-4.mjs";
1
+ import { t as Event } from "./event-fU3Y01PR.mjs";
2
+ import { a as NostrError } from "./error-CR8Urc84.mjs";
3
3
  //#region src/nips/nip77.d.ts
4
4
  declare const PROTOCOL_VERSION = 97;
5
5
  declare const DEFAULT_FRAME_SIZE_LIMIT = 60000;
6
6
  declare const MAX_NEG_ROUNDS = 1024;
7
7
  declare class Nip77Error extends NostrError {
8
+ name: string;
8
9
  constructor(message: string, options?: ErrorOptions);
9
10
  }
10
11
  type NegItem = {
@@ -16,8 +17,8 @@ type ReconcileOutcome = {
16
17
  have: string[];
17
18
  /** Event ids the peer holds that the local side does not. */
18
19
  need: string[];
19
- /** Next NEG-MSG hex, or null when the session converged. */
20
- nextMessage: string | null;
20
+ /** Next NEG-MSG hex, or undefined when the session converged. */
21
+ nextMessage: string | undefined;
21
22
  };
22
23
  declare class NegentropyStorageVector {
23
24
  #private;
@@ -28,11 +29,11 @@ declare class NegentropyStorageVector {
28
29
  findLowerBound(begin: number, end: number, bound: NegItem): number;
29
30
  fingerprint(begin: number, end: number): Uint8Array;
30
31
  }
31
- declare function storageFromItems(items: readonly {
32
+ declare function storageFromItems(items: ReadonlyArray<{
32
33
  id: string;
33
34
  created_at: number;
34
- }[]): NegentropyStorageVector;
35
- declare function storageFromEvents(events: readonly Pick<Event, "id" | "created_at">[]): NegentropyStorageVector;
35
+ }>): NegentropyStorageVector;
36
+ declare function storageFromEvents(events: ReadonlyArray<Pick<Event, "id" | "created_at">>): NegentropyStorageVector;
36
37
  declare class Negentropy {
37
38
  #private;
38
39
  constructor(storage: NegentropyStorageVector, frameSizeLimit?: number);
@@ -52,4 +53,4 @@ declare function runNegSession(opts: {
52
53
  }>;
53
54
  //#endregion
54
55
  export { NegentropyStorageVector as a, ReconcileOutcome as c, storageFromItems as d, Negentropy as i, runNegSession as l, MAX_NEG_ROUNDS as n, Nip77Error as o, NegItem as r, PROTOCOL_VERSION as s, DEFAULT_FRAME_SIZE_LIMIT as t, storageFromEvents as u };
55
- //# sourceMappingURL=nip77-ByxlgoQO.d.mts.map
56
+ //# sourceMappingURL=nip77-DH4RhS5r.d.mts.map