@qntx/nostr 0.0.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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/dist/builder-BphJa-Y-.d.mts +67 -0
  4. package/dist/builder-q0VsvnYE.mjs +158 -0
  5. package/dist/builder-q0VsvnYE.mjs.map +1 -0
  6. package/dist/client-Bd8B1mYm.mjs +835 -0
  7. package/dist/client-Bd8B1mYm.mjs.map +1 -0
  8. package/dist/client.d.mts +2 -0
  9. package/dist/client.mjs +2 -0
  10. package/dist/core.d.mts +8 -0
  11. package/dist/core.mjs +9 -0
  12. package/dist/error-B49rbDzT.d.mts +7 -0
  13. package/dist/error-CwBxle6N.mjs +13 -0
  14. package/dist/error-CwBxle6N.mjs.map +1 -0
  15. package/dist/error-DZEs5OuZ.mjs +24 -0
  16. package/dist/error-DZEs5OuZ.mjs.map +1 -0
  17. package/dist/error-WEFS-R-4.d.mts +20 -0
  18. package/dist/event-B5D2jxt_.d.mts +108 -0
  19. package/dist/event-CzoQEFMF.mjs +188 -0
  20. package/dist/event-CzoQEFMF.mjs.map +1 -0
  21. package/dist/filter-BxwjEkZp.mjs +113 -0
  22. package/dist/filter-BxwjEkZp.mjs.map +1 -0
  23. package/dist/filter-DUEKP3q1.d.mts +40 -0
  24. package/dist/gossip-3xkRRCm_.mjs +220 -0
  25. package/dist/gossip-3xkRRCm_.mjs.map +1 -0
  26. package/dist/gossip-C5RVB1UB.d.mts +71 -0
  27. package/dist/gossip.d.mts +3 -0
  28. package/dist/gossip.mjs +2 -0
  29. package/dist/http-6vevbBlu.d.mts +22 -0
  30. package/dist/http-D2rhokZo.mjs +24 -0
  31. package/dist/http-D2rhokZo.mjs.map +1 -0
  32. package/dist/index-BYMnhRIC.d.mts +161 -0
  33. package/dist/index-C0C4e-Gn.d.mts +55 -0
  34. package/dist/index-CaxrMD1A.d.mts +1 -0
  35. package/dist/index-DaRyjo7O.d.mts +77 -0
  36. package/dist/index-DgOugrpF.d.mts +275 -0
  37. package/dist/index-EwL6fHLo.d.mts +267 -0
  38. package/dist/index-k2YhCgsh.d.mts +57 -0
  39. package/dist/index.d.mts +22 -0
  40. package/dist/index.mjs +23 -0
  41. package/dist/key-BiGxGLhg.d.mts +37 -0
  42. package/dist/key-Dn-aX4x4.mjs +130 -0
  43. package/dist/key-Dn-aX4x4.mjs.map +1 -0
  44. package/dist/kind-BLl4cLOc.mjs +59 -0
  45. package/dist/kind-BLl4cLOc.mjs.map +1 -0
  46. package/dist/loaders-BNQszDAn.mjs +767 -0
  47. package/dist/loaders-BNQszDAn.mjs.map +1 -0
  48. package/dist/loaders.d.mts +3 -0
  49. package/dist/loaders.mjs +2 -0
  50. package/dist/memory-BCmhZPek.mjs +461 -0
  51. package/dist/memory-BCmhZPek.mjs.map +1 -0
  52. package/dist/message-C_Uj-Y-c.mjs +179 -0
  53. package/dist/message-C_Uj-Y-c.mjs.map +1 -0
  54. package/dist/message-DJC-Jz6T.d.mts +32 -0
  55. package/dist/nip17-BWq-Kfq5.d.mts +38 -0
  56. package/dist/nip19-D7905oIv.d.mts +63 -0
  57. package/dist/nip46-C_DoxiS_.d.mts +51 -0
  58. package/dist/nip59-DljW_sYh.d.mts +76 -0
  59. package/dist/nip65-Di5hZRuV.d.mts +21 -0
  60. package/dist/nip77-ByxlgoQO.d.mts +55 -0
  61. package/dist/nips/blossom.d.mts +93 -0
  62. package/dist/nips/blossom.mjs +325 -0
  63. package/dist/nips/blossom.mjs.map +1 -0
  64. package/dist/nips/nip04.d.mts +8 -0
  65. package/dist/nips/nip04.mjs +41 -0
  66. package/dist/nips/nip04.mjs.map +1 -0
  67. package/dist/nips/nip05.d.mts +89 -0
  68. package/dist/nips/nip05.mjs +147 -0
  69. package/dist/nips/nip05.mjs.map +1 -0
  70. package/dist/nips/nip10.d.mts +43 -0
  71. package/dist/nips/nip10.mjs +194 -0
  72. package/dist/nips/nip10.mjs.map +1 -0
  73. package/dist/nips/nip11.d.mts +43 -0
  74. package/dist/nips/nip11.mjs +99 -0
  75. package/dist/nips/nip11.mjs.map +1 -0
  76. package/dist/nips/nip13.d.mts +23 -0
  77. package/dist/nips/nip13.mjs +88 -0
  78. package/dist/nips/nip13.mjs.map +1 -0
  79. package/dist/nips/nip17.d.mts +2 -0
  80. package/dist/nips/nip17.mjs +138 -0
  81. package/dist/nips/nip17.mjs.map +1 -0
  82. package/dist/nips/nip19.d.mts +2 -0
  83. package/dist/nips/nip19.mjs +174 -0
  84. package/dist/nips/nip19.mjs.map +1 -0
  85. package/dist/nips/nip21.d.mts +17 -0
  86. package/dist/nips/nip21.mjs +29 -0
  87. package/dist/nips/nip21.mjs.map +1 -0
  88. package/dist/nips/nip27.d.mts +42 -0
  89. package/dist/nips/nip27.mjs +175 -0
  90. package/dist/nips/nip27.mjs.map +1 -0
  91. package/dist/nips/nip42.d.mts +12 -0
  92. package/dist/nips/nip42.mjs +22 -0
  93. package/dist/nips/nip42.mjs.map +1 -0
  94. package/dist/nips/nip44.d.mts +12 -0
  95. package/dist/nips/nip44.mjs +125 -0
  96. package/dist/nips/nip44.mjs.map +1 -0
  97. package/dist/nips/nip46.d.mts +2 -0
  98. package/dist/nips/nip46.mjs +132 -0
  99. package/dist/nips/nip46.mjs.map +1 -0
  100. package/dist/nips/nip49.d.mts +12 -0
  101. package/dist/nips/nip49.mjs +80 -0
  102. package/dist/nips/nip49.mjs.map +1 -0
  103. package/dist/nips/nip51.d.mts +88 -0
  104. package/dist/nips/nip51.mjs +246 -0
  105. package/dist/nips/nip51.mjs.map +1 -0
  106. package/dist/nips/nip57.d.mts +43 -0
  107. package/dist/nips/nip57.mjs +230 -0
  108. package/dist/nips/nip57.mjs.map +1 -0
  109. package/dist/nips/nip59.d.mts +2 -0
  110. package/dist/nips/nip59.mjs +171 -0
  111. package/dist/nips/nip59.mjs.map +1 -0
  112. package/dist/nips/nip65.d.mts +2 -0
  113. package/dist/nips/nip65.mjs +76 -0
  114. package/dist/nips/nip65.mjs.map +1 -0
  115. package/dist/nips/nip77.d.mts +2 -0
  116. package/dist/nips/nip77.mjs +421 -0
  117. package/dist/nips/nip77.mjs.map +1 -0
  118. package/dist/nips/nip96.d.mts +31 -0
  119. package/dist/nips/nip96.mjs +95 -0
  120. package/dist/nips/nip96.mjs.map +1 -0
  121. package/dist/nips/nip98.d.mts +28 -0
  122. package/dist/nips/nip98.mjs +91 -0
  123. package/dist/nips/nip98.mjs.map +1 -0
  124. package/dist/nostr_crypto_wasm_bg-hi5aXi5P.mjs +4 -0
  125. package/dist/nostr_crypto_wasm_bg.wasm +0 -0
  126. package/dist/pool-C_j1OmBB.mjs +1881 -0
  127. package/dist/pool-C_j1OmBB.mjs.map +1 -0
  128. package/dist/pool-DhRi7l-b.d.mts +297 -0
  129. package/dist/relay.d.mts +4 -0
  130. package/dist/relay.mjs +2 -0
  131. package/dist/signer-CZ6K6FUc.mjs +473 -0
  132. package/dist/signer-CZ6K6FUc.mjs.map +1 -0
  133. package/dist/signer.d.mts +3 -0
  134. package/dist/signer.mjs +2 -0
  135. package/dist/storage-DOy0iLRE.mjs +870 -0
  136. package/dist/storage-DOy0iLRE.mjs.map +1 -0
  137. package/dist/storage.d.mts +4 -0
  138. package/dist/storage.mjs +4 -0
  139. package/dist/types-BzyADqnw.d.mts +19 -0
  140. package/dist/types-Dn24TPFs.d.mts +43 -0
  141. package/dist/util-6tfLQ9JF.mjs +73 -0
  142. package/dist/util-6tfLQ9JF.mjs.map +1 -0
  143. package/dist/wasm.d.mts +19 -0
  144. package/dist/wasm.mjs +237 -0
  145. package/dist/wasm.mjs.map +1 -0
  146. package/package.json +204 -0
@@ -0,0 +1,179 @@
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";
4
+ //#region src/core/message.ts
5
+ function assertSubscriptionId(id) {
6
+ if (id.length === 0 || id.length > 64) throw new MessageError(`subscription id length must be 1..64`);
7
+ return id;
8
+ }
9
+ function createSubscriptionId(id) {
10
+ if (id !== void 0) return assertSubscriptionId(id);
11
+ const bytes = /* @__PURE__ */ new Uint8Array(8);
12
+ crypto.getRandomValues(bytes);
13
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
14
+ }
15
+ const HLL_BYTES = 256;
16
+ const HLL_HEX_LEN = HLL_BYTES * 2;
17
+ const HEX_RE = /^[0-9a-fA-F]+$/;
18
+ /**
19
+ * Register-wise max of NIP-45 HyperLogLog sketches.
20
+ * Output is always lowercase 512 hex. Empty input is the zero sketch (identity).
21
+ */
22
+ function mergeCountHll(hexes) {
23
+ const merged = new Uint8Array(HLL_BYTES);
24
+ for (const hex of hexes) {
25
+ if (hex.length !== HLL_HEX_LEN || !HEX_RE.test(hex)) throw new MessageError("invalid NIP-45 HLL sketch: expected 512-char hex");
26
+ 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;
30
+ }
31
+ }
32
+ return bytesToHex(merged);
33
+ }
34
+ function encodeClientMessage(message) {
35
+ return JSON.stringify(message);
36
+ }
37
+ function encodeRelayMessage(message) {
38
+ return JSON.stringify(message);
39
+ }
40
+ function parseClientMessage(raw) {
41
+ let data;
42
+ try {
43
+ data = JSON.parse(raw);
44
+ } catch {
45
+ throw new MessageError("client message is not valid JSON");
46
+ }
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];
49
+ switch (type) {
50
+ case "EVENT":
51
+ if (data.length !== 2 || !validateSignedEvent(data[1])) throw new MessageError("invalid EVENT client message");
52
+ return ["EVENT", data[1]];
53
+ case "REQ":
54
+ if (data.length < 3 || typeof data[1] !== "string") throw new MessageError("invalid REQ client message");
55
+ return [
56
+ "REQ",
57
+ data[1],
58
+ ...data.slice(2)
59
+ ];
60
+ case "CLOSE":
61
+ if (data.length !== 2 || typeof data[1] !== "string") throw new MessageError("invalid CLOSE client message");
62
+ return ["CLOSE", data[1]];
63
+ case "AUTH":
64
+ if (data.length !== 2 || !validateSignedEvent(data[1])) throw new MessageError("invalid AUTH client message");
65
+ return ["AUTH", data[1]];
66
+ case "COUNT":
67
+ if (data.length < 3 || typeof data[1] !== "string") throw new MessageError("invalid COUNT client message");
68
+ return [
69
+ "COUNT",
70
+ data[1],
71
+ ...data.slice(2)
72
+ ];
73
+ case "NEG-OPEN":
74
+ if (data.length === 5) throw new MessageError("obsolete 5-element NEG-OPEN; expected [NEG-OPEN, id, filter, hex]");
75
+ if (data.length !== 4 || typeof data[1] !== "string" || !isFilterObject(data[2]) || !isNegHex(data[3])) throw new MessageError("invalid NEG-OPEN client message");
76
+ return [
77
+ "NEG-OPEN",
78
+ data[1],
79
+ data[2],
80
+ data[3].toLowerCase()
81
+ ];
82
+ case "NEG-MSG":
83
+ if (data.length !== 3 || typeof data[1] !== "string" || !isNegHex(data[2])) throw new MessageError("invalid NEG-MSG client message");
84
+ return [
85
+ "NEG-MSG",
86
+ data[1],
87
+ data[2].toLowerCase()
88
+ ];
89
+ case "NEG-CLOSE":
90
+ if (data.length !== 2 || typeof data[1] !== "string") throw new MessageError("invalid NEG-CLOSE client message");
91
+ return ["NEG-CLOSE", data[1]];
92
+ default: throw new MessageError(`unknown client message type: ${type}`);
93
+ }
94
+ }
95
+ function parseRelayMessage(raw) {
96
+ let data;
97
+ try {
98
+ data = JSON.parse(raw);
99
+ } catch {
100
+ throw new MessageError("relay message is not valid JSON");
101
+ }
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];
104
+ switch (type) {
105
+ case "EVENT":
106
+ if (data.length !== 3 || typeof data[1] !== "string" || !validateSignedEvent(data[2])) throw new MessageError("invalid EVENT relay message");
107
+ return [
108
+ "EVENT",
109
+ data[1],
110
+ data[2]
111
+ ];
112
+ case "OK":
113
+ if (data.length !== 4 || typeof data[1] !== "string" || typeof data[2] !== "boolean" || typeof data[3] !== "string") throw new MessageError("invalid OK relay message");
114
+ return [
115
+ "OK",
116
+ data[1],
117
+ data[2],
118
+ data[3]
119
+ ];
120
+ case "EOSE":
121
+ if (data.length !== 2 || typeof data[1] !== "string") throw new MessageError("invalid EOSE relay message");
122
+ return ["EOSE", data[1]];
123
+ case "CLOSED":
124
+ if (data.length !== 3 || typeof data[1] !== "string" || typeof data[2] !== "string") throw new MessageError("invalid CLOSED relay message");
125
+ return [
126
+ "CLOSED",
127
+ data[1],
128
+ data[2]
129
+ ];
130
+ case "NOTICE":
131
+ if (data.length !== 2 || typeof data[1] !== "string") throw new MessageError("invalid NOTICE relay message");
132
+ return ["NOTICE", data[1]];
133
+ case "AUTH":
134
+ if (data.length !== 2 || typeof data[1] !== "string") throw new MessageError("invalid AUTH relay message");
135
+ return ["AUTH", data[1]];
136
+ 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);
142
+ if (hll !== void 0) result.hll = hll;
143
+ return [
144
+ "COUNT",
145
+ data[1],
146
+ result
147
+ ];
148
+ }
149
+ case "NEG-MSG":
150
+ if (data.length !== 3 || typeof data[1] !== "string" || !isNegHex(data[2])) throw new MessageError("invalid NEG-MSG relay message");
151
+ return [
152
+ "NEG-MSG",
153
+ data[1],
154
+ data[2].toLowerCase()
155
+ ];
156
+ case "NEG-ERR":
157
+ if (data.length !== 3 && data.length !== 4 || typeof data[1] !== "string" || typeof data[2] !== "string") throw new MessageError("invalid NEG-ERR relay message");
158
+ return [
159
+ "NEG-ERR",
160
+ data[1],
161
+ data[2]
162
+ ];
163
+ default: throw new MessageError(`unknown relay message type: ${type}`);
164
+ }
165
+ }
166
+ function parseCountHll(value) {
167
+ if (typeof value !== "string" || value.length !== HLL_HEX_LEN || !HEX_RE.test(value)) return;
168
+ return value.toLowerCase();
169
+ }
170
+ function isFilterObject(value) {
171
+ return typeof value === "object" && value !== null && !Array.isArray(value);
172
+ }
173
+ function isNegHex(value) {
174
+ return typeof value === "string" && value.length > 0 && value.length % 2 === 0 && HEX_RE.test(value);
175
+ }
176
+ //#endregion
177
+ export { mergeCountHll as a, encodeRelayMessage as i, createSubscriptionId as n, parseClientMessage as o, encodeClientMessage as r, parseRelayMessage as s, assertSubscriptionId as t };
178
+
179
+ //# sourceMappingURL=message-C_Uj-Y-c.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-C_Uj-Y-c.mjs","names":[],"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 } from \"./util.ts\";\n\nexport type SubscriptionId = string;\n\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\nexport function createSubscriptionId(id?: string): SubscriptionId {\n if (id !== undefined) return assertSubscriptionId(id);\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\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).\n * Merge sketches with `mergeCountHll`. 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.\n * Output is always lowercase 512 hex. Empty input is the zero sketch (identity).\n */\nexport function mergeCountHll(hexes: readonly 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 (let i = 0; i < HLL_BYTES; i++) {\n const b = bytes[i]!;\n if (b > merged[i]!) merged[i] = b;\n }\n }\n return bytesToHex(merged);\n}\n\nexport function encodeClientMessage(message: ClientMessage): string {\n return JSON.stringify(message);\n}\n\nexport function encodeRelayMessage(message: RelayMessage): string {\n return JSON.stringify(message);\n}\n\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 < 1 || typeof data[0] !== \"string\") {\n throw new MessageError(\"client message must be a non-empty JSON array\");\n }\n const type = data[0];\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], ...(data.slice(2) as Filter[])];\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], ...(data.slice(2) as Filter[])];\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: ${type}`);\n }\n}\n\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 < 1 || typeof data[0] !== \"string\") {\n throw new MessageError(\"relay message must be a non-empty JSON array\");\n }\n const type = data[0];\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 if (\n data.length !== 3 ||\n typeof data[1] !== \"string\" ||\n typeof data[2] !== \"object\" ||\n data[2] === null ||\n typeof (data[2] as { count?: unknown }).count !== \"number\"\n ) {\n throw new MessageError(\"invalid COUNT relay message\");\n }\n const payload = data[2] as { count: number; approximate?: unknown; hll?: unknown };\n const result: CountResult = { count: payload.count };\n if (typeof payload.approximate === \"boolean\") result.approximate = payload.approximate;\n const hll = parseCountHll(payload.hll);\n if (hll !== undefined) result.hll = hll;\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: ${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 isFilterObject(value: unknown): value is Filter {\n return typeof value === \"object\" && value !== null && !Array.isArray(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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"}
@@ -0,0 +1,32 @@
1
+ import { t as Event } from "./event-B5D2jxt_.mjs";
2
+ import { t as Filter } from "./filter-DUEKP3q1.mjs";
3
+ //#region src/core/message.d.ts
4
+ type SubscriptionId = string;
5
+ declare function assertSubscriptionId(id: string): SubscriptionId;
6
+ declare function createSubscriptionId(id?: string): SubscriptionId;
7
+ /** Client → relay messages (NIP-01 + NIP-42 AUTH + NIP-45 COUNT + NIP-77). */
8
+ 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];
9
+ /** Relay → client messages. */
10
+ type RelayMessage = ["EVENT", SubscriptionId, Event] | ["OK", string, boolean, string] | ["EOSE", SubscriptionId] | ["CLOSED", SubscriptionId, string] | ["NOTICE", string] | ["AUTH", string] | ["COUNT", SubscriptionId, CountResult] | ["NEG-MSG", SubscriptionId, string] | ["NEG-ERR", SubscriptionId, string];
11
+ /** NIP-45 COUNT reply payload. */
12
+ type CountResult = {
13
+ count: number;
14
+ approximate?: boolean;
15
+ /**
16
+ * Optional 512-char hex HyperLogLog sketch (256 registers).
17
+ * Merge sketches with `mergeCountHll`. Estimation is unspecified by NIP-45 and not provided.
18
+ */
19
+ hll?: string;
20
+ };
21
+ /**
22
+ * Register-wise max of NIP-45 HyperLogLog sketches.
23
+ * Output is always lowercase 512 hex. Empty input is the zero sketch (identity).
24
+ */
25
+ declare function mergeCountHll(hexes: readonly string[]): string;
26
+ declare function encodeClientMessage(message: ClientMessage): string;
27
+ declare function encodeRelayMessage(message: RelayMessage): string;
28
+ declare function parseClientMessage(raw: string): ClientMessage;
29
+ declare function parseRelayMessage(raw: string): RelayMessage;
30
+ //#endregion
31
+ 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
@@ -0,0 +1,38 @@
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";
5
+ //#region src/nips/nip17.d.ts
6
+ declare class Nip17Error extends NostrError {
7
+ constructor(message: string, options?: ErrorOptions);
8
+ }
9
+ type Recipient = {
10
+ readonly pubkey: string;
11
+ readonly relayHint?: string;
12
+ };
13
+ type ReplyTo = {
14
+ readonly id: string;
15
+ readonly relayHint?: string;
16
+ };
17
+ type ChatMessageOptions = {
18
+ readonly created_at?: number;
19
+ readonly subject?: string;
20
+ readonly replyTo?: ReplyTo;
21
+ };
22
+ /** Parse kind:10050 DM relay list (`["relay", url]` tags). */
23
+ declare function parseDmRelayList(event: Pick<Event, "kind" | "tags">): string[];
24
+ /** 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;
28
+ /** 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<{
32
+ recipient: string;
33
+ wrap: Event;
34
+ }>>;
35
+ declare function requireDmRelays(pubkey: string, relays: readonly string[]): string[];
36
+ //#endregion
37
+ 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
@@ -0,0 +1,63 @@
1
+ import { a as NostrError } from "./error-WEFS-R-4.mjs";
2
+ //#region src/nips/nip19.d.ts
3
+ type NProfile = `nprofile1${string}`;
4
+ type NEvent = `nevent1${string}`;
5
+ type NAddr = `naddr1${string}`;
6
+ type NSec = `nsec1${string}`;
7
+ type NPub = `npub1${string}`;
8
+ type Note = `note1${string}`;
9
+ declare const Bech32MaxSize = 5000;
10
+ type ProfilePointer = {
11
+ pubkey: string;
12
+ relays?: string[];
13
+ };
14
+ type EventPointer = {
15
+ id: string;
16
+ relays?: string[];
17
+ author?: string;
18
+ kind?: number;
19
+ };
20
+ type AddressPointer = {
21
+ identifier: string;
22
+ pubkey: string;
23
+ kind: number;
24
+ relays?: string[];
25
+ };
26
+ type DecodedResult = {
27
+ type: "nprofile";
28
+ data: ProfilePointer;
29
+ } | {
30
+ type: "nevent";
31
+ data: EventPointer;
32
+ } | {
33
+ type: "naddr";
34
+ data: AddressPointer;
35
+ } | {
36
+ type: "nsec";
37
+ data: Uint8Array;
38
+ } | {
39
+ type: "npub";
40
+ data: string;
41
+ } | {
42
+ type: "note";
43
+ data: string;
44
+ };
45
+ declare class Nip19Error extends NostrError {
46
+ constructor(message: string);
47
+ }
48
+ declare function encodeBytes<Prefix extends string>(prefix: Prefix, bytes: Uint8Array): `${Prefix}1${string}`;
49
+ declare function nsecEncode(key: Uint8Array): NSec;
50
+ declare function npubEncode(hex: string): NPub;
51
+ declare function noteEncode(hex: string): Note;
52
+ declare function nprofileEncode(profile: ProfilePointer): NProfile;
53
+ declare function neventEncode(event: EventPointer): NEvent;
54
+ declare function naddrEncode(addr: AddressPointer): NAddr;
55
+ declare function decode(code: string): DecodedResult;
56
+ /** Decode `nostr:` URI or bare bech32; returns invalid sentinel instead of throwing. */
57
+ declare function decodeNostrURI(nip19code: string): DecodedResult | {
58
+ type: "invalid";
59
+ data: null;
60
+ };
61
+ //#endregion
62
+ 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
@@ -0,0 +1,51 @@
1
+ import { a as NostrError } from "./error-WEFS-R-4.mjs";
2
+ //#region src/nips/nip46.d.ts
3
+ declare const BUNKER_REGEX: RegExp;
4
+ type BunkerPointer = {
5
+ /** Remote signer / bunker public key (hex). */
6
+ pubkey: string;
7
+ relays: string[];
8
+ secret: string | null;
9
+ };
10
+ type ClientMetadata = {
11
+ name?: string;
12
+ url?: string;
13
+ image?: string;
14
+ };
15
+ type NostrConnectParams = {
16
+ clientPubkey: string;
17
+ relays: string[];
18
+ secret: string;
19
+ perms?: string[];
20
+ } & ClientMetadata;
21
+ type Nip46Request = {
22
+ id: string;
23
+ method: string;
24
+ params: string[];
25
+ };
26
+ type Nip46Response = {
27
+ id: string;
28
+ result?: string;
29
+ error?: string;
30
+ };
31
+ declare class Nip46Error extends NostrError {
32
+ constructor(message: string, options?: ErrorOptions);
33
+ }
34
+ /** Encode a bunker pointer as `bunker://…`. */
35
+ declare function toBunkerURL(pointer: BunkerPointer): string;
36
+ /**
37
+ * Parse a `bunker://` URL into a pointer.
38
+ * Returns null when the input is not a bunker URL (including NIP-05 identifiers).
39
+ */
40
+ declare function parseBunkerURL(input: string): BunkerPointer | null;
41
+ /** Build a client-initiated `nostrconnect://` URI. */
42
+ declare function createNostrConnectURI(params: NostrConnectParams): string;
43
+ /** Parse a `nostrconnect://` URI. */
44
+ declare function parseNostrConnectURI(uri: string): NostrConnectParams;
45
+ declare function encodeNip46Request(req: Nip46Request): string;
46
+ declare function decodeNip46Request(json: string): Nip46Request;
47
+ declare function encodeNip46Response(res: Nip46Response): string;
48
+ declare function decodeNip46Response(json: string): Nip46Response;
49
+ //#endregion
50
+ 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
@@ -0,0 +1,76 @@
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";
3
+ //#region src/nips/nip59.d.ts
4
+ /** Unsigned event with a computed id. Never has `sig`. */
5
+ type Rumor = UnsignedEvent & {
6
+ readonly id: string;
7
+ };
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/.
12
+ */
13
+ 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>;
18
+ };
19
+ type Nip44Decryptor = {
20
+ nip44Decrypt(peer: string, payload: string): Promise<string>;
21
+ };
22
+ type GiftWrapTimestamps = {
23
+ readonly seal: number;
24
+ readonly wrap: number;
25
+ };
26
+ /** `"wrap"` randomizes only the gift wrap; `"seal+wrap"` (default) randomizes both. */
27
+ type TimestampRandomize = "wrap" | "seal+wrap";
28
+ type WrapOptions = {
29
+ /** Unix seconds used as the randomization window end. Default: floor(Date.now()/1000). */
30
+ readonly now?: number;
31
+ /** Uniform integer in [0, maxExclusive). Default: CSPRNG via @noble/hashes randomBytes. */
32
+ readonly randomInt?: (maxExclusive: number) => number;
33
+ /** When set, used as-is. Overrides now/randomInt for this call. */
34
+ readonly timestamps?: GiftWrapTimestamps;
35
+ readonly relayHint?: string;
36
+ /** 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;
40
+ };
41
+ type SealOptions = Pick<WrapOptions, "now" | "randomInt" | "timestamps" | "randomize">;
42
+ declare class Nip59Error extends NostrError {
43
+ constructor(message: string, options?: ErrorOptions);
44
+ }
45
+ declare const TWO_DAYS_SECS: number;
46
+ declare function isGiftWrapKind(kind: number): boolean;
47
+ type Nip59CryptoInput = {
48
+ getPublicKey(): Promise<string>;
49
+ signEvent(unsigned: UnsignedEvent): Promise<Event>;
50
+ nip44Encrypt?: (peer: string, plaintext: string) => Promise<string>;
51
+ nip44Decrypt?: (peer: string, payload: string) => Promise<string>;
52
+ };
53
+ /** Narrow a signer-shaped object to {@link Nip59Crypto}, or throw. */
54
+ declare function requireNip59Crypto(crypto: Nip59CryptoInput): Nip59Crypto;
55
+ declare function requireNip44Decryptor(crypto: {
56
+ nip44Decrypt?: (peer: string, payload: string) => Promise<string>;
57
+ }): Nip44Decryptor;
58
+ declare function rumorToJson(rumor: Rumor): string;
59
+ declare function eventToJson(event: Event): string;
60
+ declare function randomPastTimestamp(opts?: {
61
+ now?: number;
62
+ randomInt?: (maxExclusive: number) => number;
63
+ }): number;
64
+ declare function createRumor(pubkey: string, template: {
65
+ kind: number;
66
+ content?: string;
67
+ tags?: readonly Tag[];
68
+ created_at?: number;
69
+ }): Rumor;
70
+ declare function createSeal(crypto: Nip59Crypto, recipient: string, rumor: Rumor, opts?: SealOptions): Promise<Event>;
71
+ declare function createGiftWrap(seal: Event, recipient: string, opts?: WrapOptions): Event;
72
+ declare function wrap(crypto: Nip59Crypto, recipient: string, rumor: Rumor, opts?: WrapOptions): Promise<Event>;
73
+ declare function unwrap(crypto: Nip44Decryptor, giftWrap: Event): Promise<Rumor>;
74
+ //#endregion
75
+ 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
@@ -0,0 +1,21 @@
1
+ import { t as Event, v as Tag } from "./event-B5D2jxt_.mjs";
2
+ import { t as EventBuilder } from "./builder-BphJa-Y-.mjs";
3
+ //#region src/nips/nip65.d.ts
4
+ type RelayMarker = "read" | "write" | "readwrite";
5
+ type RelayListItem = {
6
+ url: string;
7
+ read: boolean;
8
+ write: boolean;
9
+ };
10
+ declare function markerOf(item: RelayListItem): RelayMarker;
11
+ /** Parse a kind:10002 NIP-65 event into relay list entries. */
12
+ declare function parseRelayList(event: Event): RelayListItem[];
13
+ /** Encode relay list items as NIP-65 `r` tags. */
14
+ declare function relayListToTags(items: RelayListItem[]): Tag[];
15
+ /** Build an unsigned kind:10002 EventBuilder from relay list items. */
16
+ declare function relayListEventBuilder(items: RelayListItem[]): EventBuilder;
17
+ declare function readRelays(items: RelayListItem[]): string[];
18
+ declare function writeRelays(items: RelayListItem[]): string[];
19
+ //#endregion
20
+ 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
@@ -0,0 +1,55 @@
1
+ import { t as Event } from "./event-B5D2jxt_.mjs";
2
+ import { a as NostrError } from "./error-WEFS-R-4.mjs";
3
+ //#region src/nips/nip77.d.ts
4
+ declare const PROTOCOL_VERSION = 97;
5
+ declare const DEFAULT_FRAME_SIZE_LIMIT = 60000;
6
+ declare const MAX_NEG_ROUNDS = 1024;
7
+ declare class Nip77Error extends NostrError {
8
+ constructor(message: string, options?: ErrorOptions);
9
+ }
10
+ type NegItem = {
11
+ timestamp: number;
12
+ id: Uint8Array;
13
+ };
14
+ type ReconcileOutcome = {
15
+ /** Event ids the local side holds that the peer does not. */
16
+ have: string[];
17
+ /** Event ids the peer holds that the local side does not. */
18
+ need: string[];
19
+ /** Next NEG-MSG hex, or null when the session converged. */
20
+ nextMessage: string | null;
21
+ };
22
+ declare class NegentropyStorageVector {
23
+ #private;
24
+ insert(timestamp: number, id: string): void;
25
+ seal(): void;
26
+ size(): number;
27
+ iterate(begin: number, end: number, cb: (item: NegItem, i: number) => boolean): void;
28
+ findLowerBound(begin: number, end: number, bound: NegItem): number;
29
+ fingerprint(begin: number, end: number): Uint8Array;
30
+ }
31
+ declare function storageFromItems(items: readonly {
32
+ id: string;
33
+ created_at: number;
34
+ }[]): NegentropyStorageVector;
35
+ declare function storageFromEvents(events: readonly Pick<Event, "id" | "created_at">[]): NegentropyStorageVector;
36
+ declare class Negentropy {
37
+ #private;
38
+ constructor(storage: NegentropyStorageVector, frameSizeLimit?: number);
39
+ initiate(): string;
40
+ reconcile(queryMsg: string): ReconcileOutcome;
41
+ }
42
+ /** Drive initiate/reconcile until nextMessage is null. Transport-free. */
43
+ declare function runNegSession(opts: {
44
+ storage: NegentropyStorageVector;
45
+ frameSizeLimit?: number;
46
+ openingSend: (hex: string) => void;
47
+ msgSend: (hex: string) => void;
48
+ next: () => Promise<string>;
49
+ }): Promise<{
50
+ have: string[];
51
+ need: string[];
52
+ }>;
53
+ //#endregion
54
+ 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
@@ -0,0 +1,93 @@
1
+ import { n as EventTemplate, t as Event } 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 { t as ManualFetch } from "../http-6vevbBlu.mjs";
5
+ //#region src/nips/blossom.d.ts
6
+ type BlobDescriptor = {
7
+ url: string;
8
+ sha256: string;
9
+ size: number;
10
+ type?: string;
11
+ uploaded?: number;
12
+ };
13
+ type BlossomFetch = ManualFetch;
14
+ /** Signs a kind 24242 auth template (draft; pubkey is filled by the signer). */
15
+ type BlossomSign = (template: EventTemplate) => Promise<Event>;
16
+ /** BUD-11 `t` verbs. Mirror reuses `upload`; there is no `t=mirror`. */
17
+ type BlossomAuthVerb = "upload" | "delete" | "list" | "get" | "media";
18
+ declare class BlossomError extends NostrError {
19
+ readonly status?: number;
20
+ constructor(message: string, options?: ErrorOptions & {
21
+ status?: number;
22
+ });
23
+ }
24
+ /** Last 64-char hex in the URL path (extension ignored). Null if none or the URL is invalid. */
25
+ declare function getHashFromURL(url: string | URL): string | null;
26
+ declare function sha256Blob(data: Blob | ArrayBuffer | Uint8Array): Promise<string>;
27
+ /** True when `sha256Blob(data)` equals the expected hex (any case). */
28
+ declare function verifyBlob(data: Blob | ArrayBuffer | Uint8Array, sha256Hex: string): Promise<boolean>;
29
+ /**
30
+ * `Nostr ` + base64url(utf8 JSON), padding stripped.
31
+ * NIP-98 uses standard base64; mixing them is a 401.
32
+ */
33
+ declare function encodeAuthorizationHeader(event: Event): string;
34
+ declare function createAuthTemplate(verb: BlossomAuthVerb, opts?: {
35
+ sha256?: string;
36
+ expiration?: number;
37
+ message?: string;
38
+ }): EventTemplate;
39
+ declare function createUploadAuth(sign: BlossomSign, file: Blob, opts?: {
40
+ message?: string;
41
+ expiration?: number;
42
+ }): Promise<Event>;
43
+ declare function upload(server: string, file: Blob, auth: Event, opts?: {
44
+ fetch?: BlossomFetch;
45
+ signal?: AbortSignal;
46
+ }): Promise<BlobDescriptor>;
47
+ declare function listBlobs(server: string, pubkey: string, auth: Event | undefined, opts?: {
48
+ fetch?: BlossomFetch;
49
+ signal?: AbortSignal;
50
+ }): Promise<BlobDescriptor[]>;
51
+ declare function deleteBlob(server: string, sha256Hex: string, auth: Event, opts?: {
52
+ fetch?: BlossomFetch;
53
+ signal?: AbortSignal;
54
+ }): Promise<void>;
55
+ declare function mirrorBlob(server: string, blob: BlobDescriptor, opts: {
56
+ auth: Event;
57
+ fetch?: BlossomFetch;
58
+ signal?: AbortSignal;
59
+ }): Promise<BlobDescriptor>;
60
+ /** BUD-06 preflight. Does not PUT the body. */
61
+ declare function checkUpload(server: string, file: Blob, auth: Event, opts?: {
62
+ fetch?: BlossomFetch;
63
+ signal?: AbortSignal;
64
+ }): Promise<void>;
65
+ /** Strict HEAD probe. 2xx → true. 404 → false. Other HTTP (including 405) / network → throw BlossomError. AbortError propagates. No GET fallback. */
66
+ declare function blobExists(server: string, sha256Hex: string, opts?: {
67
+ fetch?: BlossomFetch;
68
+ signal?: AbortSignal;
69
+ }): Promise<boolean>;
70
+ /** GET body, then verifyBlob. Non-2xx or sha256 mismatch → throw BlossomError. */
71
+ declare function getBlob(server: string, sha256Hex: string, opts?: {
72
+ fetch?: BlossomFetch;
73
+ signal?: AbortSignal;
74
+ }): Promise<Uint8Array>;
75
+ /**
76
+ * If `url` is not available, try `servers` for the same hash (NIP-B7 SHOULD).
77
+ * Never throws on HTTP status. AbortError still throws.
78
+ * Returns the original URL when no hash, original still available, or nothing else responds.
79
+ */
80
+ declare function healBlobUrl(url: string, servers: readonly string[], opts?: {
81
+ fetch?: BlossomFetch;
82
+ signal?: AbortSignal;
83
+ }): Promise<string>;
84
+ /** PUT /upload to each server in order until one descriptor succeeds. */
85
+ declare function uploadToServers(servers: readonly string[], file: Blob, auth: Event, opts?: {
86
+ fetch?: BlossomFetch;
87
+ signal?: AbortSignal;
88
+ }): Promise<BlobDescriptor>;
89
+ declare function blossomServerListEventBuilder(servers: readonly string[]): EventBuilder;
90
+ declare function parseBlossomServerList(event: Pick<Event, "kind" | "tags">): string[];
91
+ //#endregion
92
+ export { BlobDescriptor, BlossomAuthVerb, BlossomError, BlossomFetch, BlossomSign, blobExists, blossomServerListEventBuilder, checkUpload, createAuthTemplate, createUploadAuth, deleteBlob, encodeAuthorizationHeader, getBlob, getHashFromURL, healBlobUrl, listBlobs, mirrorBlob, parseBlossomServerList, sha256Blob, upload, uploadToServers, verifyBlob };
93
+ //# sourceMappingURL=blossom.d.mts.map