@qntx/nostr 0.5.0 → 0.7.0

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 (178) hide show
  1. package/dist/{abort-Ba8tDrOI.mjs → abort-DBq2STPj.mjs} +13 -6
  2. package/dist/abort-DBq2STPj.mjs.map +1 -0
  3. package/dist/{builder-9tjI6WQ3.mjs → builder-CdLE4J6O.mjs} +11 -17
  4. package/dist/builder-CdLE4J6O.mjs.map +1 -0
  5. package/dist/{builder-sSflu6nB.d.mts → builder-DgkqDylK.d.mts} +5 -6
  6. package/dist/{client-BtIAtxrL.mjs → client-CILhdfsF.mjs} +104 -314
  7. package/dist/client-CILhdfsF.mjs.map +1 -0
  8. package/dist/client.d.mts +2 -2
  9. package/dist/client.mjs +2 -2
  10. package/dist/collections-DtwMc1NU.mjs +33 -0
  11. package/dist/collections-DtwMc1NU.mjs.map +1 -0
  12. package/dist/core.d.mts +9 -8
  13. package/dist/core.mjs +7 -7
  14. package/dist/{error-BW7re1UN.d.mts → error-BD_0QFKT.d.mts} +2 -2
  15. package/dist/{error-CR8Urc84.d.mts → error-BquXDmIN.d.mts} +4 -4
  16. package/dist/{error-DrEIM7FO.mjs → error-L_QdmSnV.mjs} +2 -2
  17. package/dist/{error-DrEIM7FO.mjs.map → error-L_QdmSnV.mjs.map} +1 -1
  18. package/dist/{error-B__OMBRY.mjs → error-gtJvV6YS.mjs} +2 -2
  19. package/dist/{error-B__OMBRY.mjs.map → error-gtJvV6YS.mjs.map} +1 -1
  20. package/dist/{event-fU3Y01PR.d.mts → event-DJeb_DIL.d.mts} +4 -2
  21. package/dist/{event-D8Nfoh4K.mjs → event-DinQMmJ1.mjs} +16 -10
  22. package/dist/event-DinQMmJ1.mjs.map +1 -0
  23. package/dist/{filter-C0IMByE3.d.mts → filter-jI_9htF7.d.mts} +2 -2
  24. package/dist/{gossip-DpIvkBuj.d.mts → gossip-C7HLW5kI.d.mts} +35 -26
  25. package/dist/{gossip-oloDMWEj.mjs → gossip-CcTp9VpU.mjs} +23 -33
  26. package/dist/gossip-CcTp9VpU.mjs.map +1 -0
  27. package/dist/gossip.d.mts +1 -1
  28. package/dist/gossip.mjs +1 -1
  29. package/dist/{index-CvkvqB16.d.mts → index-DU9tRFTZ.d.mts} +7 -20
  30. package/dist/{index-q4MDce_r.d.mts → index-DiXwNn2M.d.mts} +6 -8
  31. package/dist/{index-QxvrpMfF.d.mts → index-DocgD9K0.d.mts} +92 -167
  32. package/dist/{index-D1bqFHKB.d.mts → index-InQZpHyQ.d.mts} +18 -18
  33. package/dist/{index-MxC28S4P.d.mts → index-Tx15HGAD.d.mts} +26 -28
  34. package/dist/{index-Dmc8FJgO.d.mts → index-iLT8UzY3.d.mts} +19 -37
  35. package/dist/index.d.mts +23 -21
  36. package/dist/index.mjs +21 -19
  37. package/dist/instance-BcKzxHIP.mjs +220 -0
  38. package/dist/instance-BcKzxHIP.mjs.map +1 -0
  39. package/dist/instance-DjsL8h84.d.mts +15 -0
  40. package/dist/{key-Cv4_pN3x.d.mts → key-D_5OgGT7.d.mts} +11 -7
  41. package/dist/{key-Bps-LqX7.mjs → key-bshqfmZL.mjs} +13 -9
  42. package/dist/key-bshqfmZL.mjs.map +1 -0
  43. package/dist/{loaders-o6YXB_Ri.mjs → loaders-DD0XAGzw.mjs} +73 -82
  44. package/dist/loaders-DD0XAGzw.mjs.map +1 -0
  45. package/dist/loaders.d.mts +3 -3
  46. package/dist/loaders.mjs +2 -2
  47. package/dist/{memory-C2EVx0_O.mjs → memory-D_-5-T31.mjs} +2 -2
  48. package/dist/memory-D_-5-T31.mjs.map +1 -0
  49. package/dist/{memory-index-Do1mz0WF.mjs → memory-index-C6rujtoc.mjs} +30 -247
  50. package/dist/memory-index-C6rujtoc.mjs.map +1 -0
  51. package/dist/message-CWLcFTQ1.mjs +194 -0
  52. package/dist/message-CWLcFTQ1.mjs.map +1 -0
  53. package/dist/{message-iGPIqnn0.d.mts → message-CbBZOhq3.d.mts} +3 -3
  54. package/dist/{nip17-CKIufV98.d.mts → nip17-cTDFfFVt.d.mts} +5 -6
  55. package/dist/{nip19-BevCJZsp.d.mts → nip19-D1OnJ192.d.mts} +3 -9
  56. package/dist/{nip46-DDV4dC56.d.mts → nip46-DrsPI8EX.d.mts} +3 -5
  57. package/dist/nip51-DoPUvQ--.d.mts +87 -0
  58. package/dist/{nip59-zQgdLcEr.d.mts → nip59-BFIihLYY.d.mts} +3 -4
  59. package/dist/nip65-52HiwiyD.d.mts +23 -0
  60. package/dist/{nip77-DH4RhS5r.d.mts → nip77-C9QcZn7b.d.mts} +3 -4
  61. package/dist/nips/blossom.d.mts +12 -8
  62. package/dist/nips/blossom.mjs +30 -9
  63. package/dist/nips/blossom.mjs.map +1 -1
  64. package/dist/nips/nip04.mjs +17 -7
  65. package/dist/nips/nip04.mjs.map +1 -1
  66. package/dist/nips/nip05.d.mts +2 -3
  67. package/dist/nips/nip05.mjs +1 -4
  68. package/dist/nips/nip05.mjs.map +1 -1
  69. package/dist/nips/nip10.d.mts +3 -3
  70. package/dist/nips/nip10.mjs +3 -3
  71. package/dist/nips/nip11.d.mts +1 -1
  72. package/dist/nips/nip11.mjs +4 -4
  73. package/dist/nips/nip11.mjs.map +1 -1
  74. package/dist/nips/nip13.d.mts +7 -7
  75. package/dist/nips/nip13.mjs +32 -10
  76. package/dist/nips/nip13.mjs.map +1 -1
  77. package/dist/nips/nip17.d.mts +1 -1
  78. package/dist/nips/nip17.mjs +13 -33
  79. package/dist/nips/nip17.mjs.map +1 -1
  80. package/dist/nips/nip19.d.mts +2 -2
  81. package/dist/nips/nip19.mjs +16 -28
  82. package/dist/nips/nip19.mjs.map +1 -1
  83. package/dist/nips/nip21.d.mts +6 -1
  84. package/dist/nips/nip21.mjs +15 -5
  85. package/dist/nips/nip21.mjs.map +1 -1
  86. package/dist/nips/nip27.d.mts +4 -4
  87. package/dist/nips/nip27.mjs.map +1 -1
  88. package/dist/nips/nip42.d.mts +1 -1
  89. package/dist/nips/nip42.mjs +2 -1
  90. package/dist/nips/nip42.mjs.map +1 -1
  91. package/dist/nips/nip44.mjs +1 -1
  92. package/dist/nips/nip46.d.mts +2 -2
  93. package/dist/nips/nip46.mjs +15 -19
  94. package/dist/nips/nip46.mjs.map +1 -1
  95. package/dist/nips/nip49.d.mts +5 -5
  96. package/dist/nips/nip49.mjs +4 -4
  97. package/dist/nips/nip49.mjs.map +1 -1
  98. package/dist/nips/nip51.d.mts +2 -86
  99. package/dist/nips/nip51.mjs +7 -23
  100. package/dist/nips/nip51.mjs.map +1 -1
  101. package/dist/nips/nip57.d.mts +7 -5
  102. package/dist/nips/nip57.mjs +12 -17
  103. package/dist/nips/nip57.mjs.map +1 -1
  104. package/dist/nips/nip59.d.mts +1 -1
  105. package/dist/nips/nip59.mjs +16 -16
  106. package/dist/nips/nip59.mjs.map +1 -1
  107. package/dist/nips/nip65.d.mts +2 -2
  108. package/dist/nips/nip65.mjs +14 -37
  109. package/dist/nips/nip65.mjs.map +1 -1
  110. package/dist/nips/nip77.d.mts +1 -1
  111. package/dist/nips/nip77.mjs +33 -32
  112. package/dist/nips/nip77.mjs.map +1 -1
  113. package/dist/nips/nip98.d.mts +5 -5
  114. package/dist/nips/nip98.mjs +8 -8
  115. package/dist/nips/nip98.mjs.map +1 -1
  116. package/dist/nostr_crypto_wasm_bg.wasm +0 -0
  117. package/dist/{pool-DBIYMtwy.d.mts → pool-SzJKPIa3.d.mts} +96 -91
  118. package/dist/pool-YHRZgcQ3.mjs +596 -0
  119. package/dist/pool-YHRZgcQ3.mjs.map +1 -0
  120. package/dist/put-DS0yzVJx.mjs +187 -0
  121. package/dist/put-DS0yzVJx.mjs.map +1 -0
  122. package/dist/{reactive-DFpqtIf_.d.mts → reactive-BJ1ggn4d.d.mts} +9 -22
  123. package/dist/{reactive-DDlThDSZ.mjs → reactive-BJRoVHxU.mjs} +113 -64
  124. package/dist/reactive-BJRoVHxU.mjs.map +1 -0
  125. package/dist/{pool-As20OGxB.mjs → relay-CvxPiQ_m.mjs} +178 -721
  126. package/dist/relay-CvxPiQ_m.mjs.map +1 -0
  127. package/dist/relay.d.mts +4 -4
  128. package/dist/relay.mjs +3 -2
  129. package/dist/serial-Bzpw-xz3.mjs +21 -0
  130. package/dist/serial-Bzpw-xz3.mjs.map +1 -0
  131. package/dist/{signer-CYQutDzD.mjs → signer-yW3slDC2.mjs} +12 -14
  132. package/dist/signer-yW3slDC2.mjs.map +1 -0
  133. package/dist/signer.d.mts +2 -2
  134. package/dist/signer.mjs +2 -2
  135. package/dist/{storage-Dky3wuoH.mjs → storage-CZ52ifcQ.mjs} +17 -42
  136. package/dist/storage-CZ52ifcQ.mjs.map +1 -0
  137. package/dist/storage.d.mts +3 -3
  138. package/dist/storage.mjs +4 -4
  139. package/dist/store.d.mts +1 -1
  140. package/dist/store.mjs +1 -1
  141. package/dist/testing.d.mts +18 -18
  142. package/dist/testing.mjs +9 -9
  143. package/dist/testing.mjs.map +1 -1
  144. package/dist/{types-2pCUprRU.d.mts → types-Cm-XMgtH.d.mts} +6 -6
  145. package/dist/{types-CRQEk0Oi.d.mts → types-DNmiscfd.d.mts} +2 -2
  146. package/dist/{util-LfQirgDk.mjs → util-yFYzlbrm.mjs} +29 -7
  147. package/dist/util-yFYzlbrm.mjs.map +1 -0
  148. package/dist/{verifier-t5WoWbtY.mjs → verifier-BTLOpo1n.mjs} +3 -3
  149. package/dist/verifier-BTLOpo1n.mjs.map +1 -0
  150. package/dist/verifier-CgTFpgsC.d.mts +22 -0
  151. package/dist/wasm.browser.d.mts +8 -0
  152. package/dist/wasm.browser.mjs +19 -0
  153. package/dist/wasm.browser.mjs.map +1 -0
  154. package/dist/wasm.d.mts +3 -13
  155. package/dist/wasm.mjs +7 -208
  156. package/dist/wasm.mjs.map +1 -1
  157. package/package.json +13 -10
  158. package/dist/abort-Ba8tDrOI.mjs.map +0 -1
  159. package/dist/builder-9tjI6WQ3.mjs.map +0 -1
  160. package/dist/client-BtIAtxrL.mjs.map +0 -1
  161. package/dist/event-D8Nfoh4K.mjs.map +0 -1
  162. package/dist/gossip-oloDMWEj.mjs.map +0 -1
  163. package/dist/key-Bps-LqX7.mjs.map +0 -1
  164. package/dist/loaders-o6YXB_Ri.mjs.map +0 -1
  165. package/dist/memory-C2EVx0_O.mjs.map +0 -1
  166. package/dist/memory-index-Do1mz0WF.mjs.map +0 -1
  167. package/dist/message-DcY6Fi9o.mjs +0 -193
  168. package/dist/message-DcY6Fi9o.mjs.map +0 -1
  169. package/dist/nip65-CjgmdpPB.d.mts +0 -26
  170. package/dist/nips/nip96.d.mts +0 -40
  171. package/dist/nips/nip96.mjs +0 -118
  172. package/dist/nips/nip96.mjs.map +0 -1
  173. package/dist/pool-As20OGxB.mjs.map +0 -1
  174. package/dist/reactive-DDlThDSZ.mjs.map +0 -1
  175. package/dist/signer-CYQutDzD.mjs.map +0 -1
  176. package/dist/storage-Dky3wuoH.mjs.map +0 -1
  177. package/dist/util-LfQirgDk.mjs.map +0 -1
  178. package/dist/verifier-t5WoWbtY.mjs.map +0 -1
@@ -1,7 +1,8 @@
1
- import { n as EventTemplate, t as Event } from "./event-fU3Y01PR.mjs";
2
- import { t as Filter } from "./filter-C0IMByE3.mjs";
3
- import { n as CountResult } from "./message-iGPIqnn0.mjs";
4
- import { a as NegentropyStorageVector } from "./nip77-DH4RhS5r.mjs";
1
+ import { n as EventTemplate, t as Event } from "./event-DJeb_DIL.mjs";
2
+ import { t as Filter } from "./filter-jI_9htF7.mjs";
3
+ import { n as CountResult } from "./message-CbBZOhq3.mjs";
4
+ import { t as EventVerifier } from "./verifier-CgTFpgsC.mjs";
5
+ import { a as NegentropyStorageVector } from "./nip77-C9QcZn7b.mjs";
5
6
  import { t as WebSocketConstructor } from "./websocket-CmeqvAkp.mjs";
6
7
  //#region src/relay/subscription.d.ts
7
8
  type SubscriptionHandlers = {
@@ -31,39 +32,21 @@ type SubscribeOptions = SubscriptionHandlers & {
31
32
  closeOnEose?: boolean | undefined;
32
33
  signal?: AbortSignal | undefined;
33
34
  };
34
- declare class Subscription {
35
- #private;
35
+ /** Uniform close handle returned by subscriptions, fan-ins, and feeds. */
36
+ type Closer = {
37
+ close: (reason?: string) => void;
38
+ };
39
+ /** Public subscription handle returned by {@link Relay.subscribe}. */
40
+ type RelaySubscription = {
36
41
  readonly id: string;
37
- readonly filters: Filter[];
38
- readonly handlers: SubscriptionHandlers;
39
- readonly closeOnEose: boolean;
40
- eosed: boolean;
41
- closed: boolean;
42
- /** True after one CLOSED `auth-required:` retry. */
43
- authRetried: boolean;
44
- /** Inclusive NIP-01 `since` watermark from verified EVENTs. */
45
- lastCreatedAt: number | undefined;
46
- /** Event ids at `lastCreatedAt` (same-second reconnect dedup). Not all seen ids. */
47
- readonly idsAtWatermark: Set<string>;
48
- constructor(filters: Filter[], opts: SubscribeOptions, sendClose: (id: string) => void);
49
- close(reason?: string): void;
50
- /** Advance the reconnect watermark after a verified EVENT. */
51
- noteVerified(event: Event): void;
52
- /**
53
- * Filters for re-REQ. Original `filters` stay unchanged. NIP-01 `since` is inclusive — never
54
- * `lastCreatedAt + 1`.
55
- */
56
- replayFilters(): Filter[];
57
- }
58
- /** AsyncIterable wrapper over a subscription's events until EOSE or close. */
59
- declare function subscriptionToAsyncIterable(start: (handlers: SubscriptionHandlers) => {
42
+ readonly closed: boolean;
60
43
  close: (reason?: string) => void;
61
- }, opts?: {
44
+ };
45
+ /** AsyncIterable wrapper over a subscription's events until EOSE or close. */
46
+ declare function subscriptionToAsyncIterable(start: (handlers: SubscriptionHandlers) => Closer, opts?: {
62
47
  signal?: AbortSignal | undefined;
63
48
  includeEose?: boolean | undefined;
64
- }): AsyncIterable<Event> & {
65
- close: (reason?: string) => void;
66
- };
49
+ }): AsyncIterable<Event> & Closer;
67
50
  //#endregion
68
51
  //#region src/relay/subscribe.d.ts
69
52
  /** How a one-shot {@link Relay.fetch} REQ ended. */
@@ -82,7 +65,17 @@ type RelayFetchResult = {
82
65
  };
83
66
  //#endregion
84
67
  //#region src/relay/relay.d.ts
85
- /** Relay lifecycle states. */
68
+ /**
69
+ * Relay lifecycle states:
70
+ *
71
+ * - `initialized` — constructed; `connect()` not yet attempted.
72
+ * - `connecting` — a `connect()` attempt is in flight (socket opening / resubscribing).
73
+ * - `connected` — socket open; REQ/EVENT/COUNT flow.
74
+ * - `disconnected` — socket down: a reconnect is scheduled when `enableReconnect` has live
75
+ * subscriptions to restore, or `disconnect()` severed manually (REQ state kept).
76
+ * - `closed` — terminal until the next `connect()`: `close()` or a socket death without a scheduled
77
+ * reconnect.
78
+ */
86
79
  declare const RelayStatus: {
87
80
  readonly Initialized: "initialized";
88
81
  readonly Connecting: "connecting";
@@ -95,7 +88,7 @@ type RelayStatusName = (typeof RelayStatus)[keyof typeof RelayStatus];
95
88
  /** Per-relay options: socket override, verification, timeouts, reconnect, ping, NIP-42 auth. */
96
89
  type RelayOptions = {
97
90
  websocketImplementation?: WebSocketConstructor | undefined;
98
- verifyEvent?: ((event: Event) => boolean) | undefined;
91
+ verifyEvent?: EventVerifier | undefined;
99
92
  publishTimeoutMs?: number | undefined;
100
93
  connectTimeoutMs?: number | undefined;
101
94
  /**
@@ -104,7 +97,7 @@ type RelayOptions = {
104
97
  */
105
98
  enableReconnect?: boolean | undefined;
106
99
  /** Backoff delays in ms between reconnect attempts. */
107
- reconnectBackoffMs?: number[] | undefined;
100
+ reconnectBackoffMs?: ReadonlyArray<number> | undefined;
108
101
  enablePing?: boolean | undefined;
109
102
  pingIntervalMs?: number | undefined;
110
103
  pingTimeoutMs?: number | undefined;
@@ -116,6 +109,22 @@ type PublishResult = {
116
109
  ok: boolean;
117
110
  message: string;
118
111
  };
112
+ /** Typed event payloads for {@link Relay.on}: lifecycle and protocol notifications. */
113
+ type RelayEventMap = {
114
+ /** A NIP-01 NOTICE message from the relay. */
115
+ notice: string;
116
+ /** Terminal close of the relay (a transient disconnect with reconnect does not fire it). */
117
+ close: undefined;
118
+ /** Fired when the relay sends a NIP-42 AUTH challenge. */
119
+ auth: string;
120
+ /** Fired after a successful reconnect (not the initial connect). */
121
+ reconnect: undefined;
122
+ /**
123
+ * Fired when a delivered EVENT fails id/signature verification, just before the event is dropped.
124
+ * A poisoned verifier dropping events does not fire it.
125
+ */
126
+ invalidevent: undefined;
127
+ };
119
128
  /**
120
129
  * Single-relay NIP-01 client. Connection lifecycle, REQ/CLOSE, EVENT publish ACK, AUTH, COUNT,
121
130
  * NIP-77, optional reconnect.
@@ -123,17 +132,6 @@ type PublishResult = {
123
132
  declare class Relay {
124
133
  #private;
125
134
  readonly url: string;
126
- onnotice: ((msg: string) => void) | undefined;
127
- onclose: (() => void) | undefined;
128
- /** Fired when the relay sends a NIP-42 AUTH challenge. */
129
- onauth: ((challenge: string) => void) | undefined;
130
- /** Fired after a successful reconnect (not the initial connect). */
131
- onreconnect: (() => void) | undefined;
132
- /**
133
- * Fired when a delivered EVENT fails id/signature verification, just before the event is dropped.
134
- * A poisoned verifier dropping events does not fire it.
135
- */
136
- oninvalidevent: (() => void) | undefined;
137
135
  constructor(url: string, opts?: RelayOptions);
138
136
  /** Latest NIP-42 challenge, if any. */
139
137
  get challenge(): string | undefined;
@@ -145,6 +143,12 @@ declare class Relay {
145
143
  get subscriptionCount(): number;
146
144
  /** One-shot requests still awaiting a relay reply (EVENT ACK, COUNT, NEG). */
147
145
  get inFlightCount(): number;
146
+ /**
147
+ * Listen for a relay event. Multiple listeners per type are allowed and fire in registration
148
+ * order; a throwing listener is reported and does not break the dispatch. Returns an unsubscribe
149
+ * function.
150
+ */
151
+ on<K extends keyof RelayEventMap>(type: K, listener: (payload: RelayEventMap[K]) => void): () => void;
148
152
  static connect(url: string, opts?: RelayOptions & {
149
153
  signal?: AbortSignal;
150
154
  }): Promise<Relay>;
@@ -161,25 +165,26 @@ declare class Relay {
161
165
  */
162
166
  disconnect(): void;
163
167
  /** Low-level REQ with callbacks. Survives reconnect when enableReconnect is on. */
164
- subscribe(filters: Filter[], opts?: SubscribeOptions): Subscription;
168
+ subscribe(filters: ReadonlyArray<Filter>, opts?: SubscribeOptions): RelaySubscription;
165
169
  /** AsyncIterable of events for filters until the subscription is closed. */
166
- stream(filters: Filter[], opts?: {
167
- signal?: AbortSignal;
168
- id?: string;
169
- }): AsyncIterable<Event> & {
170
- close: (reason?: string) => void;
171
- };
170
+ stream(filters: ReadonlyArray<Filter>, opts?: {
171
+ signal?: AbortSignal | undefined;
172
+ id?: string | undefined;
173
+ }): AsyncIterable<Event> & Closer;
172
174
  /**
173
175
  * One-shot query: collect events until the REQ ends, then close. `end` reports how it ended —
174
176
  * relay `EOSE`, relay `CLOSED` (with its reason), or the local timeout; events received before a
175
177
  * CLOSED or the deadline are still returned. Abort rejects; a failed (re)connect rejects.
176
178
  */
177
- fetch(filters: Filter[], opts?: {
179
+ fetch(filters: ReadonlyArray<Filter>, opts?: {
178
180
  timeoutMs?: number | undefined;
179
181
  signal?: AbortSignal | undefined;
180
182
  id?: string | undefined;
181
183
  }): Promise<RelayFetchResult>;
182
- /** Publish an event and wait for OK. */
184
+ /**
185
+ * Publish an event and wait for OK. A concurrent publish of the same event id joins the in-flight
186
+ * publish instead of racing it — the joiner's `timeoutMs` does not apply.
187
+ */
183
188
  publish(event: Event, opts?: {
184
189
  timeoutMs?: number | undefined;
185
190
  }): Promise<PublishResult>;
@@ -187,7 +192,7 @@ declare class Relay {
187
192
  * NIP-45 COUNT: ask the relay how many events match `filters`. Resolves with the COUNT payload
188
193
  * (count / optional approximate / optional hll).
189
194
  */
190
- count(filters: Filter[], opts?: {
195
+ count(filters: ReadonlyArray<Filter>, opts?: {
191
196
  id?: string | undefined;
192
197
  timeoutMs?: number | undefined;
193
198
  signal?: AbortSignal | undefined;
@@ -198,8 +203,8 @@ declare class Relay {
198
203
  }): Promise<PublishResult>;
199
204
  /**
200
205
  * Clear a cached AUTH rejection for the current challenge so a later `auth()` signs again. A
201
- * successful auth and in-flight answers are kept. When a challenge is pending and unanswered,
202
- * `onauth` is re-fired so the pool's automatic auth can run once more.
206
+ * successful auth and in-flight answers are kept. When a challenge is pending and unanswered, an
207
+ * `auth` event is re-fired so the pool's automatic auth can run once more.
203
208
  */
204
209
  resetAuth(): void;
205
210
  /**
@@ -231,16 +236,7 @@ type InvalidEventPolicy = {
231
236
  cooldownMs: number;
232
237
  };
233
238
  /** Pool-wide options applied to every managed relay. */
234
- type PoolOptions = {
235
- websocketImplementation?: WebSocketConstructor | undefined;
236
- verifyEvent?: RelayOptions["verifyEvent"];
237
- publishTimeoutMs?: number | undefined;
238
- connectTimeoutMs?: number | undefined;
239
- enableReconnect?: boolean | undefined;
240
- reconnectBackoffMs?: number[] | undefined;
241
- enablePing?: boolean | undefined;
242
- pingIntervalMs?: number | undefined;
243
- pingTimeoutMs?: number | undefined;
239
+ type PoolOptions = Omit<RelayOptions, "authSigner"> & {
244
240
  /**
245
241
  * When set, automatically answer NIP-42 AUTH challenges for relays that send them. Return
246
242
  * undefined to skip a given relay URL.
@@ -275,11 +271,19 @@ type PoolOptions = {
275
271
  */
276
272
  onRelaySuspended?: ((url: string, until: number) => void) | undefined;
277
273
  };
278
- /** Per-relay publish outcome: the relay's OK reply or an error string. */
274
+ /** Per-relay publish outcome: the relay's OK verdict or a transport-level failure. */
279
275
  type PoolPublishResult = {
280
- url: string;
281
- result?: PublishResult;
282
- error?: string;
276
+ readonly url: string;
277
+ readonly status: "ok";
278
+ readonly message: string;
279
+ } | {
280
+ readonly url: string;
281
+ readonly status: "rejected";
282
+ readonly message: string;
283
+ } | {
284
+ readonly url: string;
285
+ readonly status: "failed";
286
+ readonly error: string;
283
287
  };
284
288
  /** Multi-relay subscribe options: callbacks also receive the normalized relay URL. */
285
289
  type PoolSubscribeOptions = Omit<SubscribeOptions, "onevent" | "receivedEvent"> & {
@@ -295,13 +299,14 @@ type PoolFetchResult = {
295
299
  readonly reason: string;
296
300
  };
297
301
  };
298
- /** Per-relay NIP-45 COUNT result (or its error). */
299
- type PoolCountResult = {
300
- url: string;
301
- count?: number;
302
- approximate?: boolean;
303
- hll?: string;
304
- error?: string;
302
+ /** Per-relay NIP-45 COUNT result (or a transport-level failure). */
303
+ type PoolCountResult = ({
304
+ readonly url: string;
305
+ readonly status: "ok";
306
+ } & CountResult) | {
307
+ readonly url: string;
308
+ readonly status: "failed";
309
+ readonly error: string;
305
310
  };
306
311
  /** Multi-relay coordinator: connection reuse, cross-relay event dedup, fan-out publish. */
307
312
  declare class Pool {
@@ -325,38 +330,38 @@ declare class Pool {
325
330
  * Subscribe across relays. Deduplicates by event id. Returns a closer; callbacks receive every
326
331
  * new event once.
327
332
  */
328
- subscribe(relays: string[], filters: Filter[], opts?: PoolSubscribeOptions): {
329
- close: (reason?: string) => void;
330
- };
333
+ subscribe(relays: ReadonlyArray<string>, filters: ReadonlyArray<Filter>, opts?: PoolSubscribeOptions): Closer;
331
334
  /**
332
335
  * One-shot fetch per relay: each entry reports its own events and end reason (`eose`, `closed`,
333
336
  * `timeout`), or `failed` when the connect or REQ itself errored. An abort rejects the whole
334
337
  * call. Events are not deduped across relays — use {@link fetch} for that.
335
338
  */
336
- fetchEach(relays: string[], filters: Filter[], opts?: {
339
+ fetchEach(relays: ReadonlyArray<string>, filters: ReadonlyArray<Filter>, opts?: {
337
340
  timeoutMs?: number | undefined;
338
341
  signal?: AbortSignal | undefined;
339
342
  }): Promise<PoolFetchResult[]>;
340
343
  /** Fetch events until each connected relay EOSE or timeout; dedupe by id. */
341
- fetch(relays: string[], filters: Filter[], opts?: {
344
+ fetch(relays: ReadonlyArray<string>, filters: ReadonlyArray<Filter>, opts?: {
342
345
  timeoutMs?: number | undefined;
343
346
  signal?: AbortSignal | undefined;
344
347
  /** Every event of every relay batch, including cross-relay duplicates. */
345
348
  onevent?: ((event: Event, relayUrl: string) => void) | undefined;
346
349
  }): Promise<Event[]>;
347
350
  /** Publish to all listed relays; returns per-relay outcomes. */
348
- publish(relays: string[], event: Event, opts?: {
351
+ publish(relays: ReadonlyArray<string>, event: Event, opts?: {
349
352
  timeoutMs?: number | undefined;
350
353
  }): Promise<PoolPublishResult[]>;
351
354
  /** First successful publish (Promise.any semantics). */
352
- publishAny(relays: string[], event: Event, opts?: {
355
+ publishAny(relays: ReadonlyArray<string>, event: Event, opts?: {
353
356
  timeoutMs?: number | undefined;
354
- }): Promise<PoolPublishResult>;
357
+ }): Promise<Extract<PoolPublishResult, {
358
+ status: "ok";
359
+ }>>;
355
360
  /**
356
361
  * NIP-45 COUNT across relays. Per-relay outcomes; failures do not throw. Counts are not summed —
357
362
  * each relay reports independently (may overlap).
358
363
  */
359
- count(relays: string[], filters: Filter[], opts?: {
364
+ count(relays: ReadonlyArray<string>, filters: ReadonlyArray<Filter>, opts?: {
360
365
  timeoutMs?: number | undefined;
361
366
  signal?: AbortSignal | undefined;
362
367
  }): Promise<PoolCountResult[]>;
@@ -367,5 +372,5 @@ declare class Pool {
367
372
  connectedUrls(): string[];
368
373
  }
369
374
  //#endregion
370
- export { SubscriptionHandlers as _, PoolOptions as a, PublishResult as c, RelayStatus as d, RelayStatusName as f, Subscription as g, SubscribeOptions as h, PoolFetchResult as i, Relay as l, RelayFetchResult as m, Pool as n, PoolPublishResult as o, RelayFetchEnd as p, PoolCountResult as r, PoolSubscribeOptions as s, InvalidEventPolicy as t, RelayOptions as u, subscriptionToAsyncIterable as v };
371
- //# sourceMappingURL=pool-DBIYMtwy.d.mts.map
375
+ export { RelaySubscription as _, PoolOptions as a, subscriptionToAsyncIterable as b, PublishResult as c, RelayOptions as d, RelayStatus as f, Closer as g, RelayFetchResult as h, PoolFetchResult as i, Relay as l, RelayFetchEnd as m, Pool as n, PoolPublishResult as o, RelayStatusName as p, PoolCountResult as r, PoolSubscribeOptions as s, InvalidEventPolicy as t, RelayEventMap as u, SubscribeOptions as v, SubscriptionHandlers as y };
376
+ //# sourceMappingURL=pool-SzJKPIa3.d.mts.map