@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.
- package/README.md +16 -0
- package/dist/abort-Ba8tDrOI.mjs +38 -0
- package/dist/abort-Ba8tDrOI.mjs.map +1 -0
- package/dist/{builder-BphJa-Y-.d.mts → builder-BWn55Paf.d.mts} +20 -14
- package/dist/{builder-q0VsvnYE.mjs → builder-CyrGKRVP.mjs} +32 -16
- package/dist/builder-CyrGKRVP.mjs.map +1 -0
- package/dist/{client-Bd8B1mYm.mjs → client-5DhgYV7P.mjs} +372 -195
- package/dist/client-5DhgYV7P.mjs.map +1 -0
- package/dist/client.d.mts +1 -1
- package/dist/client.mjs +1 -1
- package/dist/core.d.mts +8 -8
- package/dist/core.mjs +8 -9
- package/dist/error-BW7re1UN.d.mts +9 -0
- package/dist/error-B__OMBRY.mjs +14 -0
- package/dist/error-B__OMBRY.mjs.map +1 -0
- package/dist/{error-WEFS-R-4.d.mts → error-CR8Urc84.d.mts} +20 -8
- package/dist/{error-CwBxle6N.mjs → error-DrEIM7FO.mjs} +5 -3
- package/dist/error-DrEIM7FO.mjs.map +1 -0
- package/dist/{event-CzoQEFMF.mjs → event-D8Nfoh4K.mjs} +40 -32
- package/dist/event-D8Nfoh4K.mjs.map +1 -0
- package/dist/{event-B5D2jxt_.d.mts → event-fU3Y01PR.d.mts} +23 -20
- package/dist/{filter-BxwjEkZp.mjs → filter-BQl3GlHt.mjs} +42 -35
- package/dist/filter-BQl3GlHt.mjs.map +1 -0
- package/dist/filter-C0IMByE3.d.mts +37 -0
- package/dist/{gossip-C5RVB1UB.d.mts → gossip-BRQwIM_q.d.mts} +25 -23
- package/dist/{gossip-3xkRRCm_.mjs → gossip-oloDMWEj.mjs} +52 -34
- package/dist/gossip-oloDMWEj.mjs.map +1 -0
- package/dist/gossip.d.mts +1 -1
- package/dist/gossip.mjs +1 -1
- package/dist/{http-6vevbBlu.d.mts → http-C4HwIu4B.d.mts} +7 -7
- package/dist/{http-D2rhokZo.mjs → http-CuazNRIP.mjs} +10 -6
- package/dist/http-CuazNRIP.mjs.map +1 -0
- package/dist/index-B-CGNDPS.d.mts +207 -0
- package/dist/index-BIhSADwK.d.mts +339 -0
- package/dist/{index-BYMnhRIC.d.mts → index-Ba7bJ7DD.d.mts} +68 -50
- package/dist/{index-DaRyjo7O.d.mts → index-Boe8FshM.d.mts} +13 -7
- package/dist/index-D-TK_KJG.d.mts +84 -0
- package/dist/index-D1bqFHKB.d.mts +188 -0
- package/dist/index.d.mts +22 -20
- package/dist/index.mjs +19 -18
- package/dist/{key-Dn-aX4x4.mjs → key-Bbtys6o7.mjs} +22 -14
- package/dist/key-Bbtys6o7.mjs.map +1 -0
- package/dist/{key-BiGxGLhg.d.mts → key-BlsYhN1V.d.mts} +9 -6
- package/dist/{kind-BLl4cLOc.mjs → kind-Cxwhhkx8.mjs} +2 -1
- package/dist/kind-Cxwhhkx8.mjs.map +1 -0
- package/dist/{loaders-BNQszDAn.mjs → loaders-o6YXB_Ri.mjs} +329 -305
- package/dist/loaders-o6YXB_Ri.mjs.map +1 -0
- package/dist/loaders.d.mts +3 -3
- package/dist/loaders.mjs +2 -2
- package/dist/memory-C2EVx0_O.mjs +46 -0
- package/dist/memory-C2EVx0_O.mjs.map +1 -0
- package/dist/{memory-BCmhZPek.mjs → memory-index-Do1mz0WF.mjs} +212 -82
- package/dist/memory-index-Do1mz0WF.mjs.map +1 -0
- package/dist/{message-C_Uj-Y-c.mjs → message-DcY6Fi9o.mjs} +38 -24
- package/dist/message-DcY6Fi9o.mjs.map +1 -0
- package/dist/{message-DJC-Jz6T.d.mts → message-iGPIqnn0.d.mts} +15 -8
- package/dist/{nip17-BWq-Kfq5.d.mts → nip17-DNEkz8rM.d.mts} +18 -17
- package/dist/{nip19-D7905oIv.d.mts → nip19-BevCJZsp.d.mts} +23 -3
- package/dist/{nip46-C_DoxiS_.d.mts → nip46-DDV4dC56.d.mts} +13 -12
- package/dist/{nip59-DljW_sYh.d.mts → nip59-zQgdLcEr.d.mts} +28 -25
- package/dist/{nip65-Di5hZRuV.d.mts → nip65-DBfh2smt.d.mts} +8 -3
- package/dist/{nip77-ByxlgoQO.d.mts → nip77-DH4RhS5r.d.mts} +9 -8
- package/dist/nips/blossom.d.mts +37 -37
- package/dist/nips/blossom.mjs +67 -52
- package/dist/nips/blossom.mjs.map +1 -1
- package/dist/nips/nip04.d.mts +2 -3
- package/dist/nips/nip04.mjs +6 -10
- package/dist/nips/nip04.mjs.map +1 -1
- package/dist/nips/nip05.d.mts +37 -43
- package/dist/nips/nip05.mjs +57 -57
- package/dist/nips/nip05.mjs.map +1 -1
- package/dist/nips/nip10.d.mts +18 -19
- package/dist/nips/nip10.mjs +76 -61
- package/dist/nips/nip10.mjs.map +1 -1
- package/dist/nips/nip11.d.mts +9 -8
- package/dist/nips/nip11.mjs +14 -11
- package/dist/nips/nip11.mjs.map +1 -1
- package/dist/nips/nip13.d.mts +9 -9
- package/dist/nips/nip13.mjs +15 -17
- package/dist/nips/nip13.mjs.map +1 -1
- package/dist/nips/nip17.d.mts +1 -1
- package/dist/nips/nip17.mjs +17 -12
- package/dist/nips/nip17.mjs.map +1 -1
- package/dist/nips/nip19.d.mts +1 -1
- package/dist/nips/nip19.mjs +52 -29
- package/dist/nips/nip19.mjs.map +1 -1
- package/dist/nips/nip21.d.mts +5 -6
- package/dist/nips/nip21.mjs +8 -7
- package/dist/nips/nip21.mjs.map +1 -1
- package/dist/nips/nip27.d.mts +7 -8
- package/dist/nips/nip27.mjs +26 -25
- package/dist/nips/nip27.mjs.map +1 -1
- package/dist/nips/nip42.d.mts +5 -6
- package/dist/nips/nip42.mjs +3 -3
- package/dist/nips/nip42.mjs.map +1 -1
- package/dist/nips/nip44.d.mts +24 -7
- package/dist/nips/nip44.mjs +25 -15
- package/dist/nips/nip44.mjs.map +1 -1
- package/dist/nips/nip46.d.mts +1 -1
- package/dist/nips/nip46.mjs +52 -49
- package/dist/nips/nip46.mjs.map +1 -1
- package/dist/nips/nip49.d.mts +8 -7
- package/dist/nips/nip49.mjs +16 -12
- package/dist/nips/nip49.mjs.map +1 -1
- package/dist/nips/nip51.d.mts +25 -27
- package/dist/nips/nip51.mjs +47 -36
- package/dist/nips/nip51.mjs.map +1 -1
- package/dist/nips/nip57.d.mts +12 -13
- package/dist/nips/nip57.mjs +35 -38
- package/dist/nips/nip57.mjs.map +1 -1
- package/dist/nips/nip59.d.mts +1 -1
- package/dist/nips/nip59.mjs +14 -18
- package/dist/nips/nip59.mjs.map +1 -1
- package/dist/nips/nip65.d.mts +1 -1
- package/dist/nips/nip65.mjs +11 -8
- package/dist/nips/nip65.mjs.map +1 -1
- package/dist/nips/nip77.d.mts +1 -1
- package/dist/nips/nip77.mjs +56 -34
- package/dist/nips/nip77.mjs.map +1 -1
- package/dist/nips/nip96.d.mts +21 -12
- package/dist/nips/nip96.mjs +59 -36
- package/dist/nips/nip96.mjs.map +1 -1
- package/dist/nips/nip98.d.mts +12 -12
- package/dist/nips/nip98.mjs +18 -19
- package/dist/nips/nip98.mjs.map +1 -1
- package/dist/pool-B7p_reAm.d.mts +333 -0
- package/dist/{pool-C_j1OmBB.mjs → pool-C2xOcsun.mjs} +792 -568
- package/dist/pool-C2xOcsun.mjs.map +1 -0
- package/dist/reactive-DDlThDSZ.mjs +324 -0
- package/dist/reactive-DDlThDSZ.mjs.map +1 -0
- package/dist/reactive-DFpqtIf_.d.mts +66 -0
- package/dist/relay.d.mts +5 -4
- package/dist/relay.mjs +2 -2
- package/dist/report-CHld4uWj.mjs +32 -0
- package/dist/report-CHld4uWj.mjs.map +1 -0
- package/dist/{signer-CZ6K6FUc.mjs → signer-CKR9EHce.mjs} +107 -72
- package/dist/signer-CKR9EHce.mjs.map +1 -0
- package/dist/signer.d.mts +3 -3
- package/dist/signer.mjs +3 -2
- package/dist/storage-xXxLGCVb.mjs +1376 -0
- package/dist/storage-xXxLGCVb.mjs.map +1 -0
- package/dist/storage.d.mts +4 -4
- package/dist/storage.mjs +5 -4
- package/dist/store.d.mts +2 -0
- package/dist/store.mjs +2 -0
- package/dist/testing.d.mts +135 -0
- package/dist/testing.mjs +963 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/types-2pCUprRU.d.mts +47 -0
- package/dist/types-CRQEk0Oi.d.mts +19 -0
- package/dist/util-LfQirgDk.mjs +113 -0
- package/dist/util-LfQirgDk.mjs.map +1 -0
- package/dist/wasm.d.mts +4 -4
- package/dist/wasm.mjs +54 -55
- package/dist/wasm.mjs.map +1 -1
- package/dist/websocket-CmeqvAkp.d.mts +27 -0
- package/package.json +93 -39
- package/dist/builder-q0VsvnYE.mjs.map +0 -1
- package/dist/client-Bd8B1mYm.mjs.map +0 -1
- package/dist/error-B49rbDzT.d.mts +0 -7
- package/dist/error-CwBxle6N.mjs.map +0 -1
- package/dist/error-DZEs5OuZ.mjs +0 -24
- package/dist/error-DZEs5OuZ.mjs.map +0 -1
- package/dist/event-CzoQEFMF.mjs.map +0 -1
- package/dist/filter-BxwjEkZp.mjs.map +0 -1
- package/dist/filter-DUEKP3q1.d.mts +0 -40
- package/dist/gossip-3xkRRCm_.mjs.map +0 -1
- package/dist/http-D2rhokZo.mjs.map +0 -1
- package/dist/index-C0C4e-Gn.d.mts +0 -55
- package/dist/index-DgOugrpF.d.mts +0 -275
- package/dist/index-EwL6fHLo.d.mts +0 -267
- package/dist/index-k2YhCgsh.d.mts +0 -57
- package/dist/key-Dn-aX4x4.mjs.map +0 -1
- package/dist/kind-BLl4cLOc.mjs.map +0 -1
- package/dist/loaders-BNQszDAn.mjs.map +0 -1
- package/dist/memory-BCmhZPek.mjs.map +0 -1
- package/dist/message-C_Uj-Y-c.mjs.map +0 -1
- package/dist/pool-C_j1OmBB.mjs.map +0 -1
- package/dist/pool-DhRi7l-b.d.mts +0 -297
- package/dist/signer-CZ6K6FUc.mjs.map +0 -1
- package/dist/storage-DOy0iLRE.mjs +0 -870
- package/dist/storage-DOy0iLRE.mjs.map +0 -1
- package/dist/types-BzyADqnw.d.mts +0 -19
- package/dist/types-Dn24TPFs.d.mts +0 -43
- package/dist/util-6tfLQ9JF.mjs +0 -73
- package/dist/util-6tfLQ9JF.mjs.map +0 -1
|
@@ -0,0 +1,333 @@
|
|
|
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";
|
|
5
|
+
import { t as WebSocketConstructor } from "./websocket-CmeqvAkp.mjs";
|
|
6
|
+
//#region src/relay/subscription.d.ts
|
|
7
|
+
type SubscriptionHandlers = {
|
|
8
|
+
onevent?: ((event: Event) => void) | undefined;
|
|
9
|
+
oneose?: (() => void) | undefined;
|
|
10
|
+
onclose?: ((reason: string) => void) | undefined;
|
|
11
|
+
/** Skip verify + onevent when true. Evaluated after parse, before verify. */
|
|
12
|
+
alreadyHaveEvent?: ((id: string) => boolean) | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Fired for every EVENT id this sub sees, including duplicates and alreadyHaveEvent hits, after
|
|
15
|
+
* parse and before the verify skip.
|
|
16
|
+
*/
|
|
17
|
+
receivedEvent?: ((id: string) => void) | undefined;
|
|
18
|
+
};
|
|
19
|
+
/** Options for {@link Relay.subscribe}: event handlers plus REQ behavior. */
|
|
20
|
+
type SubscribeOptions = SubscriptionHandlers & {
|
|
21
|
+
id?: string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* If set, fire `oneose` once after this many ms if EOSE has not arrived. Does not close the REQ.
|
|
24
|
+
* `Relay.fetch` is the one-shot closer.
|
|
25
|
+
*/
|
|
26
|
+
eoseTimeoutMs?: number | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* One-shot REQ: do not join a live coalescing group, and close on EOSE. Default false (live).
|
|
29
|
+
* `Relay.fetch` passes true.
|
|
30
|
+
*/
|
|
31
|
+
closeOnEose?: boolean | undefined;
|
|
32
|
+
signal?: AbortSignal | undefined;
|
|
33
|
+
};
|
|
34
|
+
declare class Subscription {
|
|
35
|
+
#private;
|
|
36
|
+
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) => {
|
|
60
|
+
close: (reason?: string) => void;
|
|
61
|
+
}, opts?: {
|
|
62
|
+
signal?: AbortSignal | undefined;
|
|
63
|
+
includeEose?: boolean | undefined;
|
|
64
|
+
}): AsyncIterable<Event> & {
|
|
65
|
+
close: (reason?: string) => void;
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/relay/relay.d.ts
|
|
69
|
+
/** Relay lifecycle states. */
|
|
70
|
+
declare const RelayStatus: {
|
|
71
|
+
readonly Initialized: "initialized";
|
|
72
|
+
readonly Connecting: "connecting";
|
|
73
|
+
readonly Connected: "connected";
|
|
74
|
+
readonly Disconnected: "disconnected";
|
|
75
|
+
readonly Closed: "closed";
|
|
76
|
+
};
|
|
77
|
+
/** Union of the {@link RelayStatus} values. */
|
|
78
|
+
type RelayStatusName = (typeof RelayStatus)[keyof typeof RelayStatus];
|
|
79
|
+
/** Per-relay options: socket override, verification, timeouts, reconnect, ping, NIP-42 auth. */
|
|
80
|
+
type RelayOptions = {
|
|
81
|
+
websocketImplementation?: WebSocketConstructor | undefined;
|
|
82
|
+
verifyEvent?: ((event: Event) => boolean) | undefined;
|
|
83
|
+
publishTimeoutMs?: number | undefined;
|
|
84
|
+
connectTimeoutMs?: number | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* When true, unexpected disconnects schedule reconnect with backoff and re-fire open
|
|
87
|
+
* subscriptions. Default false.
|
|
88
|
+
*/
|
|
89
|
+
enableReconnect?: boolean | undefined;
|
|
90
|
+
/** Backoff delays in ms between reconnect attempts. */
|
|
91
|
+
reconnectBackoffMs?: number[] | undefined;
|
|
92
|
+
enablePing?: boolean | undefined;
|
|
93
|
+
pingIntervalMs?: number | undefined;
|
|
94
|
+
pingTimeoutMs?: number | undefined;
|
|
95
|
+
/** When set, CLOSED/OK `auth-required:` triggers AUTH then retries the REQ/EVENT/COUNT. */
|
|
96
|
+
authSigner?: ((template: EventTemplate) => Promise<Event>) | undefined;
|
|
97
|
+
};
|
|
98
|
+
/** A relay's NIP-01 OK reply to a published event. */
|
|
99
|
+
type PublishResult = {
|
|
100
|
+
ok: boolean;
|
|
101
|
+
message: string;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Single-relay NIP-01 client. Connection lifecycle, REQ/CLOSE, EVENT publish ACK, AUTH, COUNT,
|
|
105
|
+
* NIP-77, optional reconnect.
|
|
106
|
+
*/
|
|
107
|
+
declare class Relay {
|
|
108
|
+
#private;
|
|
109
|
+
readonly url: string;
|
|
110
|
+
onnotice: ((msg: string) => void) | undefined;
|
|
111
|
+
onclose: (() => void) | undefined;
|
|
112
|
+
/** Fired when the relay sends a NIP-42 AUTH challenge. */
|
|
113
|
+
onauth: ((challenge: string) => void) | undefined;
|
|
114
|
+
/** Fired after a successful reconnect (not the initial connect). */
|
|
115
|
+
onreconnect: (() => void) | undefined;
|
|
116
|
+
/**
|
|
117
|
+
* Fired when a delivered EVENT fails id/signature verification, just before the event is dropped.
|
|
118
|
+
* A poisoned verifier dropping events does not fire it.
|
|
119
|
+
*/
|
|
120
|
+
oninvalidevent: (() => void) | undefined;
|
|
121
|
+
constructor(url: string, opts?: RelayOptions);
|
|
122
|
+
/** Latest NIP-42 challenge, if any. */
|
|
123
|
+
get challenge(): string | undefined;
|
|
124
|
+
get connected(): boolean;
|
|
125
|
+
get status(): RelayStatusName;
|
|
126
|
+
get generation(): number;
|
|
127
|
+
get reconnectEnabled(): boolean;
|
|
128
|
+
/** User subscriptions only; dummy ping REQs are not counted. */
|
|
129
|
+
get subscriptionCount(): number;
|
|
130
|
+
/** One-shot requests still awaiting a relay reply (EVENT ACK, COUNT, NEG). */
|
|
131
|
+
get inFlightCount(): number;
|
|
132
|
+
static connect(url: string, opts?: RelayOptions & {
|
|
133
|
+
signal?: AbortSignal;
|
|
134
|
+
}): Promise<Relay>;
|
|
135
|
+
connect(opts?: {
|
|
136
|
+
signal?: AbortSignal | undefined;
|
|
137
|
+
timeoutMs?: number | undefined;
|
|
138
|
+
}): Promise<void>;
|
|
139
|
+
/** Graceful shutdown: disables reconnect and closes all subscriptions. */
|
|
140
|
+
close(): void;
|
|
141
|
+
/**
|
|
142
|
+
* Sever the socket while keeping every subscription: unlike {@link close}, open REQ state is
|
|
143
|
+
* preserved and reconnect stays suppressed — the next {@link connect} re-subscribes all of them.
|
|
144
|
+
* {@link Pool} uses this to suspend a relay without tearing down its live subscriptions.
|
|
145
|
+
*/
|
|
146
|
+
disconnect(): void;
|
|
147
|
+
/** Low-level REQ with callbacks. Survives reconnect when enableReconnect is on. */
|
|
148
|
+
subscribe(filters: Filter[], opts?: SubscribeOptions): Subscription;
|
|
149
|
+
/** AsyncIterable of events for filters until the subscription is closed. */
|
|
150
|
+
stream(filters: Filter[], opts?: {
|
|
151
|
+
signal?: AbortSignal;
|
|
152
|
+
id?: string;
|
|
153
|
+
}): AsyncIterable<Event> & {
|
|
154
|
+
close: (reason?: string) => void;
|
|
155
|
+
};
|
|
156
|
+
/** One-shot query: collect events until EOSE or timeout, then close. */
|
|
157
|
+
fetch(filters: Filter[], opts?: {
|
|
158
|
+
timeoutMs?: number | undefined;
|
|
159
|
+
signal?: AbortSignal | undefined;
|
|
160
|
+
id?: string | undefined;
|
|
161
|
+
}): Promise<Event[]>;
|
|
162
|
+
/** Publish an event and wait for OK. */
|
|
163
|
+
publish(event: Event, opts?: {
|
|
164
|
+
timeoutMs?: number | undefined;
|
|
165
|
+
}): Promise<PublishResult>;
|
|
166
|
+
/**
|
|
167
|
+
* NIP-45 COUNT: ask the relay how many events match `filters`. Resolves with the COUNT payload
|
|
168
|
+
* (count / optional approximate / optional hll).
|
|
169
|
+
*/
|
|
170
|
+
count(filters: Filter[], opts?: {
|
|
171
|
+
id?: string | undefined;
|
|
172
|
+
timeoutMs?: number | undefined;
|
|
173
|
+
signal?: AbortSignal | undefined;
|
|
174
|
+
}): Promise<CountResult>;
|
|
175
|
+
/** NIP-42 AUTH: sign the current challenge and wait for OK. */
|
|
176
|
+
auth(sign: (template: EventTemplate) => Promise<Event>, opts?: {
|
|
177
|
+
timeoutMs?: number | undefined;
|
|
178
|
+
}): Promise<PublishResult>;
|
|
179
|
+
/**
|
|
180
|
+
* Clear a cached AUTH rejection for the current challenge so a later `auth()` signs again. A
|
|
181
|
+
* successful auth and in-flight answers are kept. When a challenge is pending and unanswered,
|
|
182
|
+
* `onauth` is re-fired so the pool's automatic auth can run once more.
|
|
183
|
+
*/
|
|
184
|
+
resetAuth(): void;
|
|
185
|
+
/**
|
|
186
|
+
* NIP-77: run Negentropy reconciliation against this relay. Returns the local-only (`have`) and
|
|
187
|
+
* remote-only (`need`) event ids. Does not upload or download events.
|
|
188
|
+
*
|
|
189
|
+
* `timeoutMs` is a single wall-clock deadline for the whole session (`NEG-OPEN` through the last
|
|
190
|
+
* `NEG-MSG`), not a per-message budget. Default: {@link RelayOptions.publishTimeoutMs}.
|
|
191
|
+
*/
|
|
192
|
+
negReconcile(filter: Filter, storage: NegentropyStorageVector, opts?: {
|
|
193
|
+
id?: string | undefined;
|
|
194
|
+
timeoutMs?: number | undefined;
|
|
195
|
+
signal?: AbortSignal | undefined;
|
|
196
|
+
}): Promise<{
|
|
197
|
+
have: string[];
|
|
198
|
+
need: string[];
|
|
199
|
+
}>;
|
|
200
|
+
/** Generate a unique subscription id for this relay instance. */
|
|
201
|
+
nextSubId(prefix?: string): string;
|
|
202
|
+
}
|
|
203
|
+
//#endregion
|
|
204
|
+
//#region src/relay/pool.d.ts
|
|
205
|
+
/** Per-relay tolerance for events that fail id/signature verification. */
|
|
206
|
+
type InvalidEventPolicy = {
|
|
207
|
+
/** Invalid events tolerated within `windowMs`; exceeding it suspends the relay. */
|
|
208
|
+
limit: number;
|
|
209
|
+
windowMs: number;
|
|
210
|
+
/** How long a suspended relay stays closed before it may reconnect. */
|
|
211
|
+
cooldownMs: number;
|
|
212
|
+
};
|
|
213
|
+
/** Pool-wide options applied to every managed relay. */
|
|
214
|
+
type PoolOptions = {
|
|
215
|
+
websocketImplementation?: WebSocketConstructor | undefined;
|
|
216
|
+
verifyEvent?: RelayOptions["verifyEvent"];
|
|
217
|
+
publishTimeoutMs?: number | undefined;
|
|
218
|
+
connectTimeoutMs?: number | undefined;
|
|
219
|
+
enableReconnect?: boolean | undefined;
|
|
220
|
+
reconnectBackoffMs?: number[] | undefined;
|
|
221
|
+
enablePing?: boolean | undefined;
|
|
222
|
+
pingIntervalMs?: number | undefined;
|
|
223
|
+
pingTimeoutMs?: number | undefined;
|
|
224
|
+
/**
|
|
225
|
+
* When set, automatically answer NIP-42 AUTH challenges for relays that send them. Return
|
|
226
|
+
* undefined to skip a given relay URL.
|
|
227
|
+
*/
|
|
228
|
+
automaticallyAuth?: ((relayURL: string) => ((event: EventTemplate) => Promise<Event>) | undefined) | undefined;
|
|
229
|
+
/** When false (default), ensureRelay rejects isInsecureRelayUrl unless trusted. */
|
|
230
|
+
allowInsecure?: boolean | undefined;
|
|
231
|
+
trustedInsecureUrls?: ReadonlyArray<string> | undefined;
|
|
232
|
+
/** Close unused relays. Unset/0 = disabled. */
|
|
233
|
+
idleTimeoutMs?: number | undefined;
|
|
234
|
+
idleCleanupIntervalMs?: number | undefined;
|
|
235
|
+
onIdleRelaysClosed?: ((urls: string[]) => void) | undefined;
|
|
236
|
+
/**
|
|
237
|
+
* Soft cap on connected non-pinned relays. When `ensureRelay` would create a new non-pinned relay
|
|
238
|
+
* at the cap, the least-recently-used idle one is closed first (idle = no subscriptions and no
|
|
239
|
+
* in-flight requests). If none is idle the connect proceeds anyway — the cap never fails a
|
|
240
|
+
* request.
|
|
241
|
+
*/
|
|
242
|
+
maxRelays?: number | undefined;
|
|
243
|
+
/** Normalized URLs never closed by idle cleanup or `maxRelays` eviction. */
|
|
244
|
+
pinnedUrls?: ReadonlyArray<string> | undefined;
|
|
245
|
+
/**
|
|
246
|
+
* When set, a relay whose `limit`-th-plus-one EVENT fails id/signature verification inside a
|
|
247
|
+
* `windowMs` sliding window is disconnected and suspended for `cooldownMs`. During suspension
|
|
248
|
+
* `ensureRelay` rejects with {@link RelaySuspendedError}; once it lifts, live subscriptions resume
|
|
249
|
+
* through the normal reconnect path. Unset = events are dropped without counting, as before.
|
|
250
|
+
*/
|
|
251
|
+
invalidEventPolicy?: InvalidEventPolicy | undefined;
|
|
252
|
+
/**
|
|
253
|
+
* Fired once when a relay is suspended for exceeding `invalidEventPolicy`: `url` is the
|
|
254
|
+
* normalized relay URL and `until` the epoch-ms time the suspension lifts.
|
|
255
|
+
*/
|
|
256
|
+
onRelaySuspended?: ((url: string, until: number) => void) | undefined;
|
|
257
|
+
};
|
|
258
|
+
/** Per-relay publish outcome: the relay's OK reply or an error string. */
|
|
259
|
+
type PoolPublishResult = {
|
|
260
|
+
url: string;
|
|
261
|
+
result?: PublishResult;
|
|
262
|
+
error?: string;
|
|
263
|
+
};
|
|
264
|
+
/** Multi-relay subscribe options: callbacks also receive the normalized relay URL. */
|
|
265
|
+
type PoolSubscribeOptions = Omit<SubscribeOptions, "onevent" | "receivedEvent"> & {
|
|
266
|
+
onevent?: ((event: Event, relayUrl: string) => void) | undefined;
|
|
267
|
+
receivedEvent?: ((id: string, relayUrl: string) => void) | undefined;
|
|
268
|
+
};
|
|
269
|
+
/** Per-relay NIP-45 COUNT result (or its error). */
|
|
270
|
+
type PoolCountResult = {
|
|
271
|
+
url: string;
|
|
272
|
+
count?: number;
|
|
273
|
+
approximate?: boolean;
|
|
274
|
+
hll?: string;
|
|
275
|
+
error?: string;
|
|
276
|
+
};
|
|
277
|
+
/** Multi-relay coordinator: connection reuse, cross-relay event dedup, fan-out publish. */
|
|
278
|
+
declare class Pool {
|
|
279
|
+
#private;
|
|
280
|
+
constructor(opts?: PoolOptions);
|
|
281
|
+
setAllowInsecure(allow: boolean): void;
|
|
282
|
+
setTrustedInsecureUrls(urls: ReadonlyArray<string>): void;
|
|
283
|
+
setPinnedUrls(urls: ReadonlyArray<string>): void;
|
|
284
|
+
/**
|
|
285
|
+
* Drop cached AUTH rejections and re-fire pending challenges on every pooled relay, so a later
|
|
286
|
+
* `setSigner` takes effect without reconnect.
|
|
287
|
+
*/
|
|
288
|
+
resetAuth(): void;
|
|
289
|
+
cleanIdleRelays(): void;
|
|
290
|
+
ensureRelay(url: string, opts?: {
|
|
291
|
+
signal?: AbortSignal | undefined;
|
|
292
|
+
timeoutMs?: number | undefined;
|
|
293
|
+
}): Promise<Relay>;
|
|
294
|
+
close(urls?: string[]): void;
|
|
295
|
+
/**
|
|
296
|
+
* Subscribe across relays. Deduplicates by event id. Returns a closer; callbacks receive every
|
|
297
|
+
* new event once.
|
|
298
|
+
*/
|
|
299
|
+
subscribe(relays: string[], filters: Filter[], opts?: PoolSubscribeOptions): {
|
|
300
|
+
close: (reason?: string) => void;
|
|
301
|
+
};
|
|
302
|
+
/** Fetch events until each connected relay EOSE or timeout; dedupe by id. */
|
|
303
|
+
fetch(relays: string[], filters: Filter[], opts?: {
|
|
304
|
+
timeoutMs?: number | undefined;
|
|
305
|
+
signal?: AbortSignal | undefined;
|
|
306
|
+
/** Every event of every relay batch, including cross-relay duplicates. */
|
|
307
|
+
onevent?: ((event: Event, relayUrl: string) => void) | undefined;
|
|
308
|
+
}): Promise<Event[]>;
|
|
309
|
+
/** Publish to all listed relays; returns per-relay outcomes. */
|
|
310
|
+
publish(relays: string[], event: Event, opts?: {
|
|
311
|
+
timeoutMs?: number | undefined;
|
|
312
|
+
}): Promise<PoolPublishResult[]>;
|
|
313
|
+
/** First successful publish (Promise.any semantics). */
|
|
314
|
+
publishAny(relays: string[], event: Event, opts?: {
|
|
315
|
+
timeoutMs?: number | undefined;
|
|
316
|
+
}): Promise<PoolPublishResult>;
|
|
317
|
+
/**
|
|
318
|
+
* NIP-45 COUNT across relays. Per-relay outcomes; failures do not throw. Counts are not summed —
|
|
319
|
+
* each relay reports independently (may overlap).
|
|
320
|
+
*/
|
|
321
|
+
count(relays: string[], filters: Filter[], opts?: {
|
|
322
|
+
timeoutMs?: number | undefined;
|
|
323
|
+
signal?: AbortSignal | undefined;
|
|
324
|
+
}): Promise<PoolCountResult[]>;
|
|
325
|
+
listRelays(): string[];
|
|
326
|
+
/** Lookup a pooled relay, including disconnected reconnecting entries. */
|
|
327
|
+
getRelay(url: string): Relay | undefined;
|
|
328
|
+
/** Currently connected URLs. Unlike listRelays(), excludes reconnecting/disconnected entries. */
|
|
329
|
+
connectedUrls(): string[];
|
|
330
|
+
}
|
|
331
|
+
//#endregion
|
|
332
|
+
export { PoolPublishResult as a, Relay as c, RelayStatusName as d, SubscribeOptions as f, subscriptionToAsyncIterable as h, PoolOptions as i, RelayOptions as l, SubscriptionHandlers as m, Pool as n, PoolSubscribeOptions as o, Subscription as p, PoolCountResult as r, PublishResult as s, InvalidEventPolicy as t, RelayStatus as u };
|
|
333
|
+
//# sourceMappingURL=pool-B7p_reAm.d.mts.map
|