applesauce-relay 0.0.0-next-20250718173521 → 0.0.0-next-20250723224513
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/dist/group.d.ts +1 -1
- package/dist/group.js +2 -2
- package/dist/pool.d.ts +1 -1
- package/dist/pool.js +2 -2
- package/dist/relay.d.ts +1 -3
- package/dist/relay.js +13 -21
- package/dist/types.d.ts +3 -3
- package/package.json +3 -3
package/dist/group.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare class RelayGroup implements IGroup {
|
|
|
9
9
|
/** Make a request to all relays */
|
|
10
10
|
req(filters: FilterInput, id?: string): Observable<SubscriptionResponse>;
|
|
11
11
|
/** Send an event to all relays */
|
|
12
|
-
event(event: NostrEvent
|
|
12
|
+
event(event: NostrEvent): Observable<PublishResponse>;
|
|
13
13
|
/** Publish an event to all relays with retries ( default 3 retries ) */
|
|
14
14
|
publish(event: NostrEvent, opts?: PublishOptions): Promise<PublishResponse[]>;
|
|
15
15
|
/** Request events from all relays with retries ( default 3 retries ) */
|
package/dist/group.js
CHANGED
|
@@ -28,8 +28,8 @@ export class RelayGroup {
|
|
|
28
28
|
return this.mergeEOSE(...requests);
|
|
29
29
|
}
|
|
30
30
|
/** Send an event to all relays */
|
|
31
|
-
event(event
|
|
32
|
-
return merge(...this.relays.map((relay) => relay.event(event
|
|
31
|
+
event(event) {
|
|
32
|
+
return merge(...this.relays.map((relay) => relay.event(event).pipe(
|
|
33
33
|
// Catch error and return as PublishResponse
|
|
34
34
|
catchError((err) => of({ ok: false, from: relay.url, message: err?.message || "Unknown error" })))));
|
|
35
35
|
}
|
package/dist/pool.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare class RelayPool implements IPool {
|
|
|
20
20
|
/** Make a REQ to multiple relays that does not deduplicate events */
|
|
21
21
|
req(relays: string[], filters: FilterInput, id?: string): Observable<SubscriptionResponse>;
|
|
22
22
|
/** Send an EVENT message to multiple relays */
|
|
23
|
-
event(relays: string[], event: NostrEvent
|
|
23
|
+
event(relays: string[], event: NostrEvent): Observable<PublishResponse>;
|
|
24
24
|
/** Publish an event to multiple relays */
|
|
25
25
|
publish(relays: string[], event: NostrEvent, opts?: PublishOptions): Promise<PublishResponse[]>;
|
|
26
26
|
/** Request events from multiple relays */
|
package/dist/pool.js
CHANGED
|
@@ -55,8 +55,8 @@ export class RelayPool {
|
|
|
55
55
|
return this.group(relays).req(filters, id);
|
|
56
56
|
}
|
|
57
57
|
/** Send an EVENT message to multiple relays */
|
|
58
|
-
event(relays, event
|
|
59
|
-
return this.group(relays).event(event
|
|
58
|
+
event(relays, event) {
|
|
59
|
+
return this.group(relays).event(event);
|
|
60
60
|
}
|
|
61
61
|
/** Publish an event to multiple relays */
|
|
62
62
|
publish(relays, event, opts) {
|
package/dist/relay.d.ts
CHANGED
|
@@ -79,9 +79,7 @@ export declare class Relay implements IRelay {
|
|
|
79
79
|
/** Create a REQ observable that emits events or "EOSE" or errors */
|
|
80
80
|
req(filters: FilterInput, id?: string): Observable<SubscriptionResponse>;
|
|
81
81
|
/** Send an EVENT or AUTH message and return an observable of PublishResponse that completes or errors */
|
|
82
|
-
event(event: NostrEvent,
|
|
83
|
-
verb?: "EVENT" | "AUTH";
|
|
84
|
-
}): Observable<PublishResponse>;
|
|
82
|
+
event(event: NostrEvent, verb?: "EVENT" | "AUTH"): Observable<PublishResponse>;
|
|
85
83
|
/** send and AUTH message */
|
|
86
84
|
auth(event: NostrEvent): Promise<PublishResponse>;
|
|
87
85
|
/** Authenticate with the relay using a signer */
|
package/dist/relay.js
CHANGED
|
@@ -2,7 +2,7 @@ import { logger } from "applesauce-core";
|
|
|
2
2
|
import { simpleTimeout } from "applesauce-core/observable";
|
|
3
3
|
import { nanoid } from "nanoid";
|
|
4
4
|
import { nip42 } from "nostr-tools";
|
|
5
|
-
import { BehaviorSubject, catchError, combineLatest, defer, endWith, filter, finalize, from,
|
|
5
|
+
import { BehaviorSubject, catchError, combineLatest, defer, endWith, filter, finalize, from, ignoreElements, isObservable, lastValueFrom, map, merge, mergeMap, mergeWith, NEVER, of, retry, scan, share, shareReplay, Subject, switchMap, take, takeUntil, tap, throwError, timeout, timer, } from "rxjs";
|
|
6
6
|
import { webSocket } from "rxjs/webSocket";
|
|
7
7
|
import { ensureHttpURL } from "applesauce-core/helpers";
|
|
8
8
|
import { completeOnEose } from "./operators/complete-on-eose.js";
|
|
@@ -286,8 +286,7 @@ export class Relay {
|
|
|
286
286
|
return this.waitForReady(this.waitForAuth(this.authRequiredForRead$, observable));
|
|
287
287
|
}
|
|
288
288
|
/** Send an EVENT or AUTH message and return an observable of PublishResponse that completes or errors */
|
|
289
|
-
event(event,
|
|
290
|
-
const verb = opts?.verb || "EVENT";
|
|
289
|
+
event(event, verb = "EVENT") {
|
|
291
290
|
const base = defer(() => {
|
|
292
291
|
// Send event when subscription starts
|
|
293
292
|
this.socket.next([verb, event]);
|
|
@@ -317,27 +316,13 @@ export class Relay {
|
|
|
317
316
|
if (verb === "AUTH")
|
|
318
317
|
return this.waitForReady(observable);
|
|
319
318
|
else
|
|
320
|
-
return this.waitForReady(this.waitForAuth(this.authRequiredForPublish$, observable))
|
|
321
|
-
// If retry is set, add a pipeline for retrying the event
|
|
322
|
-
opts?.retries
|
|
323
|
-
? pipe(
|
|
324
|
-
// If the relay responds with auth-required, throw an error for the retry operator to handle
|
|
325
|
-
mergeMap((result) => {
|
|
326
|
-
if (result.ok === false && result.message?.startsWith("auth-required:"))
|
|
327
|
-
return throwError(() => new Error(result.message));
|
|
328
|
-
return of(result);
|
|
329
|
-
}),
|
|
330
|
-
// Retry the event until it succeeds or the number of retries is reached
|
|
331
|
-
retry(opts.retries))
|
|
332
|
-
: identity);
|
|
319
|
+
return this.waitForReady(this.waitForAuth(this.authRequiredForPublish$, observable));
|
|
333
320
|
}
|
|
334
321
|
/** send and AUTH message */
|
|
335
322
|
auth(event) {
|
|
336
|
-
return lastValueFrom(this.event(event,
|
|
323
|
+
return lastValueFrom(this.event(event, "AUTH").pipe(
|
|
337
324
|
// update authenticated
|
|
338
|
-
tap((result) =>
|
|
339
|
-
this.authenticationResponse$.next(result);
|
|
340
|
-
})));
|
|
325
|
+
tap((result) => this.authenticationResponse$.next(result))));
|
|
341
326
|
}
|
|
342
327
|
/** Authenticate with the relay using a signer */
|
|
343
328
|
authenticate(signer) {
|
|
@@ -363,7 +348,14 @@ export class Relay {
|
|
|
363
348
|
}
|
|
364
349
|
/** Publishes an event to the relay and retries when relay errors or responds with auth-required ( default 3 retries ) */
|
|
365
350
|
publish(event, opts) {
|
|
366
|
-
return lastValueFrom(this.event(event
|
|
351
|
+
return lastValueFrom(this.event(event).pipe(mergeMap((result) => {
|
|
352
|
+
// If the relay responds with auth-required, throw an error for the retry operator to handle
|
|
353
|
+
if (result.ok === false && result.message?.startsWith("auth-required:"))
|
|
354
|
+
return throwError(() => new Error(result.message));
|
|
355
|
+
return of(result);
|
|
356
|
+
}),
|
|
357
|
+
// Retry the publish until it succeeds or the number of retries is reached
|
|
358
|
+
retry(opts?.retries ?? 3)));
|
|
367
359
|
}
|
|
368
360
|
/** Static method to fetch the NIP-11 information document for a relay */
|
|
369
361
|
static fetchInformationDocument(url) {
|
package/dist/types.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ export interface IRelay extends MultiplexWebSocket {
|
|
|
39
39
|
/** Send a REQ message */
|
|
40
40
|
req(filters: FilterInput, id?: string): Observable<SubscriptionResponse>;
|
|
41
41
|
/** Send an EVENT message */
|
|
42
|
-
event(event: NostrEvent
|
|
42
|
+
event(event: NostrEvent): Observable<PublishResponse>;
|
|
43
43
|
/** Send an AUTH message */
|
|
44
44
|
auth(event: NostrEvent): Promise<PublishResponse>;
|
|
45
45
|
/** Authenticate with the relay using a signer */
|
|
@@ -63,7 +63,7 @@ export interface IGroup {
|
|
|
63
63
|
/** Send a REQ message */
|
|
64
64
|
req(filters: FilterInput, id?: string): Observable<SubscriptionResponse>;
|
|
65
65
|
/** Send an EVENT message */
|
|
66
|
-
event(event: NostrEvent
|
|
66
|
+
event(event: NostrEvent): Observable<PublishResponse>;
|
|
67
67
|
/** Send an EVENT message with retries */
|
|
68
68
|
publish(event: NostrEvent, opts?: {
|
|
69
69
|
retries?: number;
|
|
@@ -87,7 +87,7 @@ export interface IPool {
|
|
|
87
87
|
/** Send a REQ message */
|
|
88
88
|
req(relays: string[], filters: FilterInput, id?: string): Observable<SubscriptionResponse>;
|
|
89
89
|
/** Send an EVENT message */
|
|
90
|
-
event(relays: string[], event: NostrEvent
|
|
90
|
+
event(relays: string[], event: NostrEvent): Observable<PublishResponse>;
|
|
91
91
|
/** Send an EVENT message to relays with retries */
|
|
92
92
|
publish(relays: string[], event: NostrEvent, opts?: {
|
|
93
93
|
retries?: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "applesauce-relay",
|
|
3
|
-
"version": "0.0.0-next-
|
|
3
|
+
"version": "0.0.0-next-20250723224513",
|
|
4
4
|
"description": "nostr relay communication framework built on rxjs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -54,14 +54,14 @@
|
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"@noble/hashes": "^1.7.1",
|
|
57
|
-
"applesauce-core": "
|
|
57
|
+
"applesauce-core": "0.0.0-next-20250723224513",
|
|
58
58
|
"nanoid": "^5.0.9",
|
|
59
59
|
"nostr-tools": "^2.13",
|
|
60
60
|
"rxjs": "^7.8.1"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@hirez_io/observer-spy": "^2.2.0",
|
|
64
|
-
"applesauce-signers": "0.0.0-next-
|
|
64
|
+
"applesauce-signers": "0.0.0-next-20250723224513",
|
|
65
65
|
"@vitest/expect": "^3.1.1",
|
|
66
66
|
"typescript": "^5.7.3",
|
|
67
67
|
"vitest": "^3.2.3",
|