applesauce-loaders 4.2.0 → 5.0.2
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 +51 -0
- package/dist/helpers/address-pointer.d.ts +2 -3
- package/dist/helpers/address-pointer.js +3 -3
- package/dist/helpers/cache.d.ts +2 -1
- package/dist/helpers/cache.js +1 -1
- package/dist/helpers/upstream.d.ts +2 -1
- package/dist/loaders/address-loader.d.ts +1 -1
- package/dist/loaders/address-loader.js +1 -1
- package/dist/loaders/event-loader.d.ts +3 -3
- package/dist/loaders/event-loader.js +2 -1
- package/dist/loaders/index.d.ts +1 -0
- package/dist/loaders/index.js +1 -0
- package/dist/loaders/reactions-loader.d.ts +1 -1
- package/dist/loaders/reactions-loader.js +12 -5
- package/dist/loaders/social-graph.d.ts +3 -3
- package/dist/loaders/social-graph.js +5 -4
- package/dist/loaders/tag-value-loader.d.ts +2 -2
- package/dist/loaders/tag-value-loader.js +3 -2
- package/dist/loaders/timeline-loader.d.ts +5 -3
- package/dist/loaders/timeline-loader.js +5 -2
- package/dist/loaders/unified-event-loader.d.ts +18 -0
- package/dist/loaders/unified-event-loader.js +46 -0
- package/dist/loaders/user-lists-loader.d.ts +2 -2
- package/dist/loaders/user-lists-loader.js +2 -2
- package/dist/loaders/zaps-loader.d.ts +1 -1
- package/dist/loaders/zaps-loader.js +12 -5
- package/dist/types.d.ts +4 -5
- package/package.json +4 -5
package/README.md
CHANGED
|
@@ -94,6 +94,51 @@ eventLoader({
|
|
|
94
94
|
});
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
+
## Unified Event Loader
|
|
98
|
+
|
|
99
|
+
The Unified Event Loader is a single loader that can handle both `EventPointer` and `AddressPointer` types. It automatically routes to the appropriate loader (`createEventLoader` for events by ID, `createAddressLoader` for addressable/replaceable events) based on the pointer type.
|
|
100
|
+
|
|
101
|
+
This is the recommended approach when setting up loaders for an EventStore, as it provides a single loader that works with the unified `eventLoader` property.
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
import { createUnifiedEventLoader, createEventLoaderForStore } from "applesauce-loaders/loaders";
|
|
105
|
+
import { EventStore } from "applesauce-core";
|
|
106
|
+
import { RelayPool } from "applesauce-relay";
|
|
107
|
+
|
|
108
|
+
const eventStore = new EventStore();
|
|
109
|
+
const pool = new RelayPool();
|
|
110
|
+
|
|
111
|
+
// Option 1: Create and assign manually
|
|
112
|
+
const unifiedLoader = createUnifiedEventLoader(pool, {
|
|
113
|
+
eventStore,
|
|
114
|
+
bufferTime: 1000,
|
|
115
|
+
followRelayHints: true,
|
|
116
|
+
extraRelays: ["wss://relay.example.com"],
|
|
117
|
+
lookupRelays: ["wss://purplepag.es", "wss://index.hzrd149.com"],
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
eventStore.eventLoader = unifiedLoader;
|
|
121
|
+
|
|
122
|
+
// Option 2: Use the convenience function (recommended)
|
|
123
|
+
createEventLoaderForStore(eventStore, pool, {
|
|
124
|
+
bufferTime: 1000,
|
|
125
|
+
followRelayHints: true,
|
|
126
|
+
extraRelays: ["wss://relay.example.com"],
|
|
127
|
+
lookupRelays: ["wss://purplepag.es", "wss://index.hzrd149.com"],
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Now the event store can load both events by ID and addressable events
|
|
131
|
+
eventStore.event({ id: "event_id" }).subscribe((event) => {
|
|
132
|
+
console.log("Loaded event:", event);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
eventStore.replaceable({ kind: 0, pubkey: "pubkey" }).subscribe((profile) => {
|
|
136
|
+
console.log("Loaded profile:", profile);
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
The unified loader accepts all options from both `EventPointerLoaderOptions` and `AddressLoaderOptions`, making it easy to configure both types of loading in one place.
|
|
141
|
+
|
|
97
142
|
## Timeline Loader
|
|
98
143
|
|
|
99
144
|
The Timeline Loader is designed for fetching paginated Nostr events in chronological order. It maintains state between calls, allowing you to efficiently load timeline events in blocks until you reach a specific timestamp or exhaust available events.
|
|
@@ -181,6 +226,12 @@ All loaders accept these common configuration options:
|
|
|
181
226
|
- `followRelayHints`: Whether to follow relay hints (default true)
|
|
182
227
|
- `extraRelays`: An array of relays to always fetch from
|
|
183
228
|
|
|
229
|
+
### Unified Event Loader Options
|
|
230
|
+
|
|
231
|
+
The unified event loader accepts all options from both Event Loader and Address Loader options, plus:
|
|
232
|
+
|
|
233
|
+
- `lookupRelays`: Fallback lookup relays to check when event can't be found (from Address Loader)
|
|
234
|
+
|
|
184
235
|
### Timeline Loader Options
|
|
185
236
|
|
|
186
237
|
- `limit`: Maximum number of events to request per filter
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { AddressPointer } from "nostr-tools/nip19";
|
|
1
|
+
import { Filter } from "applesauce-core/helpers/filter";
|
|
2
|
+
import { AddressPointer, AddressPointerWithoutD } from "applesauce-core/helpers/pointers";
|
|
4
3
|
/** Converts an array of address pointers to a filter */
|
|
5
4
|
export declare function createFilterFromAddressPointers(pointers: AddressPointerWithoutD[] | AddressPointer[]): Filter;
|
|
6
5
|
/** Takes a set of address pointers, groups them, then returns filters for the groups */
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { isAddressableKind, isReplaceableKind } from "
|
|
1
|
+
import { isAddressableKind, isReplaceableKind } from "applesauce-core/helpers/event";
|
|
2
2
|
import { unique } from "./array.js";
|
|
3
3
|
/** Converts an array of address pointers to a filter */
|
|
4
4
|
export function createFilterFromAddressPointers(pointers) {
|
|
5
5
|
const filter = {};
|
|
6
6
|
filter.kinds = unique(pointers.map((p) => p.kind));
|
|
7
7
|
filter.authors = unique(pointers.map((p) => p.pubkey));
|
|
8
|
-
const identifiers = unique(pointers.map((p) => p.identifier).filter((d) =>
|
|
8
|
+
const identifiers = unique(pointers.map((p) => p.identifier).filter((d) => d !== undefined));
|
|
9
9
|
if (identifiers.length > 0)
|
|
10
10
|
filter["#d"] = identifiers;
|
|
11
11
|
return filter;
|
|
@@ -29,7 +29,7 @@ export function createFiltersFromAddressPointers(pointers) {
|
|
|
29
29
|
/** Checks if a relay will understand an address pointer */
|
|
30
30
|
export function isLoadableAddressPointer(pointer) {
|
|
31
31
|
if (isAddressableKind(pointer.kind))
|
|
32
|
-
return
|
|
32
|
+
return pointer.identifier !== undefined;
|
|
33
33
|
else
|
|
34
34
|
return isReplaceableKind(pointer.kind);
|
|
35
35
|
}
|
package/dist/helpers/cache.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
2
|
+
import { Filter } from "applesauce-core/helpers/filter";
|
|
2
3
|
import { Observable } from "rxjs";
|
|
3
4
|
import { CacheRequest } from "../types.js";
|
|
4
5
|
/** Calls the cache request and converts the reponse into an observable */
|
package/dist/helpers/cache.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { markFromCache } from "applesauce-core/helpers";
|
|
1
|
+
import { markFromCache } from "applesauce-core/helpers/event";
|
|
2
2
|
import { from, isObservable, of, switchMap, tap } from "rxjs";
|
|
3
3
|
/** Calls the cache request and converts the reponse into an observable */
|
|
4
4
|
export function unwrapCacheRequest(request, filters) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
2
|
+
import { Filter } from "applesauce-core/helpers/filter";
|
|
1
3
|
import { Observable } from "rxjs";
|
|
2
4
|
import { NostrRequest, UpstreamPool } from "../types.js";
|
|
3
|
-
import { Filter, NostrEvent } from "nostr-tools";
|
|
4
5
|
/** Makes a nostr request on the upstream pool */
|
|
5
6
|
export declare function makeUpstreamRequest(pool: UpstreamPool, relays: string[], filters: Filter[]): Observable<NostrEvent>;
|
|
6
7
|
/** Wraps an upstream pool and returns a NostrRequest */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { filterDuplicateEvents } from "applesauce-core";
|
|
2
|
-
import { NostrEvent } from "
|
|
2
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
3
3
|
import { Observable } from "rxjs";
|
|
4
4
|
import { CacheRequest, NostrRequest, UpstreamPool } from "../types.js";
|
|
5
5
|
export type LoadableAddressPointer = {
|
|
@@ -115,7 +115,7 @@ export function createAddressLoader(pool, opts) {
|
|
|
115
115
|
// Filter resutls based on requests
|
|
116
116
|
(pointer, event) => event.kind === pointer.kind &&
|
|
117
117
|
event.pubkey === pointer.pubkey &&
|
|
118
|
-
(pointer.identifier ? getReplaceableIdentifier(event) === pointer.identifier : true),
|
|
118
|
+
(pointer.identifier !== undefined ? getReplaceableIdentifier(event) === pointer.identifier : true),
|
|
119
119
|
// Pass all events through the store if provided, or use EventMemory for deduplication by default
|
|
120
120
|
opts?.eventStore === null ? identity : filterDuplicateEvents(opts?.eventStore || new EventMemory()));
|
|
121
121
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
2
|
+
import { EventPointer } from "applesauce-core/helpers/pointers";
|
|
3
|
+
import { filterDuplicateEvents } from "applesauce-core/observable";
|
|
4
4
|
import { Observable } from "rxjs";
|
|
5
5
|
import { CacheRequest, NostrRequest, UpstreamPool } from "../types.js";
|
|
6
6
|
export type LoadableEventPointer = EventPointer & {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { EventMemory
|
|
1
|
+
import { EventMemory } from "applesauce-core/event-store";
|
|
2
|
+
import { filterDuplicateEvents } from "applesauce-core/observable";
|
|
2
3
|
import { bufferTime, catchError, EMPTY, identity, merge, tap } from "rxjs";
|
|
3
4
|
import { makeCacheRequest } from "../helpers/cache.js";
|
|
4
5
|
import { consolidateEventPointers } from "../helpers/event-pointer.js";
|
package/dist/loaders/index.d.ts
CHANGED
|
@@ -5,5 +5,6 @@ export * from "./reactions-loader.js";
|
|
|
5
5
|
export * from "./social-graph.js";
|
|
6
6
|
export * from "./tag-value-loader.js";
|
|
7
7
|
export * from "./timeline-loader.js";
|
|
8
|
+
export * from "./unified-event-loader.js";
|
|
8
9
|
export * from "./user-lists-loader.js";
|
|
9
10
|
export * from "./zaps-loader.js";
|
package/dist/loaders/index.js
CHANGED
|
@@ -5,5 +5,6 @@ export * from "./reactions-loader.js";
|
|
|
5
5
|
export * from "./social-graph.js";
|
|
6
6
|
export * from "./tag-value-loader.js";
|
|
7
7
|
export * from "./timeline-loader.js";
|
|
8
|
+
export * from "./unified-event-loader.js";
|
|
8
9
|
export * from "./user-lists-loader.js";
|
|
9
10
|
export * from "./zaps-loader.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { getReplaceableAddress,
|
|
2
|
-
import {
|
|
1
|
+
import { getReplaceableAddress, isReplaceable, kinds } from "applesauce-core/helpers/event";
|
|
2
|
+
import { getSeenRelays, mergeRelaySets } from "applesauce-core/helpers/relays";
|
|
3
|
+
import { EMPTY } from "rxjs";
|
|
3
4
|
import { wrapUpstreamPool } from "../helpers/upstream.js";
|
|
4
5
|
import { createTagValueLoader } from "./tag-value-loader.js";
|
|
5
6
|
/** Creates a loader that loads reaction events for a given event */
|
|
@@ -11,8 +12,14 @@ export function createReactionsLoader(pool, opts) {
|
|
|
11
12
|
return (event, relays) => {
|
|
12
13
|
if (opts?.useSeenRelays ?? true)
|
|
13
14
|
relays = mergeRelaySets(relays, getSeenRelays(event));
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
if (isReplaceable(event.kind)) {
|
|
16
|
+
const address = getReplaceableAddress(event);
|
|
17
|
+
if (!address)
|
|
18
|
+
return EMPTY;
|
|
19
|
+
return addressableLoader({ value: address, relays });
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return eventLoader({ value: event.id, relays });
|
|
23
|
+
}
|
|
17
24
|
};
|
|
18
25
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
2
|
+
import { ProfilePointer } from "applesauce-core/helpers/pointers";
|
|
3
|
+
import { mapEventsToStore } from "applesauce-core/observable";
|
|
4
4
|
import { Observable } from "rxjs";
|
|
5
5
|
import { AddressPointerLoader } from "./address-loader.js";
|
|
6
6
|
/** A loader that loads the social graph of a user out to a set distance */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { getPublicContacts } from "applesauce-core/helpers";
|
|
2
|
+
import { kinds } from "applesauce-core/helpers/event";
|
|
3
|
+
import { mergeRelaySets } from "applesauce-core/helpers/relays";
|
|
4
|
+
import { mapEventsToStore } from "applesauce-core/observable";
|
|
4
5
|
import { firstValueFrom, identity, isObservable, lastValueFrom, toArray } from "rxjs";
|
|
5
6
|
import { wrapGeneratorFunction } from "../operators/generator.js";
|
|
6
7
|
/** Create a social graph loader */
|
|
@@ -30,7 +31,7 @@ export function createSocialGraphLoader(addressLoader, opts) {
|
|
|
30
31
|
toArray()));
|
|
31
32
|
if (events.length === 0)
|
|
32
33
|
return;
|
|
33
|
-
const contacts =
|
|
34
|
+
const contacts = getPublicContacts(events[events.length - 1]);
|
|
34
35
|
// if the distance is greater than 0, add the contacts to the queue
|
|
35
36
|
if (pointer.distance > 0) {
|
|
36
37
|
for (const contact of contacts) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
2
|
+
import { filterDuplicateEvents } from "applesauce-core/observable";
|
|
3
3
|
import { Observable } from "rxjs";
|
|
4
4
|
import { CacheRequest, NostrRequest, UpstreamPool } from "../types.js";
|
|
5
5
|
export type TagValuePointer = {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { EventMemory
|
|
2
|
-
import { mergeRelaySets } from "applesauce-core/helpers";
|
|
1
|
+
import { EventMemory } from "applesauce-core/event-store";
|
|
2
|
+
import { mergeRelaySets } from "applesauce-core/helpers/relays";
|
|
3
|
+
import { filterDuplicateEvents } from "applesauce-core/observable";
|
|
3
4
|
import { bufferTime, EMPTY, identity, merge } from "rxjs";
|
|
4
5
|
import { unique } from "../helpers/array.js";
|
|
5
6
|
import { makeCacheRequest } from "../helpers/cache.js";
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
2
|
+
import { Filter } from "applesauce-core/helpers/filter";
|
|
3
|
+
import { ProfilePointer } from "applesauce-core/helpers/pointers";
|
|
4
|
+
import { FilterMap, OutboxMap } from "applesauce-core/helpers/relay-selection";
|
|
5
|
+
import { mapEventsToStore } from "applesauce-core/observable";
|
|
4
6
|
import { Observable, OperatorFunction } from "rxjs";
|
|
5
7
|
import { CacheRequest, TimelessFilter, UpstreamPool } from "../types.js";
|
|
6
8
|
/** A loader that optionally takes a timestamp to load till and returns a stream of events */
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { logger as baseLogger
|
|
2
|
-
import {
|
|
1
|
+
import { logger as baseLogger } from "applesauce-core";
|
|
2
|
+
import { EventMemory } from "applesauce-core/event-store";
|
|
3
|
+
import { isFilterEqual, mergeFilters } from "applesauce-core/helpers/filter";
|
|
4
|
+
import { createFilterMap } from "applesauce-core/helpers/relay-selection";
|
|
5
|
+
import { filterDuplicateEvents } from "applesauce-core/observable";
|
|
3
6
|
import { nanoid } from "nanoid";
|
|
4
7
|
import { BehaviorSubject, distinctUntilChanged, EMPTY, filter, finalize, identity, isObservable, map, merge, mergeMap, Observable, of, share, switchMap, tap, } from "rxjs";
|
|
5
8
|
import { makeCacheRequest } from "../helpers/cache.js";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { filterDuplicateEvents, IMissingEventLoader } from "applesauce-core";
|
|
2
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
3
|
+
import { Observable } from "rxjs";
|
|
4
|
+
import { UpstreamPool } from "../types.js";
|
|
5
|
+
import { AddressLoaderOptions, LoadableAddressPointer } from "./address-loader.js";
|
|
6
|
+
import { EventPointerLoaderOptions, LoadableEventPointer } from "./event-loader.js";
|
|
7
|
+
export type UnifiedEventLoaderOptions = Partial<EventPointerLoaderOptions & AddressLoaderOptions>;
|
|
8
|
+
export type UnifiedEventLoader = (pointer: LoadableEventPointer | LoadableAddressPointer) => Observable<NostrEvent>;
|
|
9
|
+
/**
|
|
10
|
+
* Create a unified event loader that can handle both EventPointer and AddressPointer types.
|
|
11
|
+
* Internally routes to createEventLoader for EventPointer and createAddressLoader for AddressPointer.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createUnifiedEventLoader(pool: UpstreamPool, opts?: UnifiedEventLoaderOptions): UnifiedEventLoader;
|
|
14
|
+
/**
|
|
15
|
+
* Creates a {@link UnifiedEventLoader} that will be used to load events that are not found in the store
|
|
16
|
+
* @returns The created loader
|
|
17
|
+
*/
|
|
18
|
+
export declare function createEventLoaderForStore(store: IMissingEventLoader & Parameters<typeof filterDuplicateEvents>[0], pool: UpstreamPool, opts?: Omit<UnifiedEventLoaderOptions, "eventStore">): UnifiedEventLoader;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { isEventPointer } from "applesauce-core/helpers/pointers";
|
|
2
|
+
import { createAddressLoader } from "./address-loader.js";
|
|
3
|
+
import { createEventLoader } from "./event-loader.js";
|
|
4
|
+
/**
|
|
5
|
+
* Create a unified event loader that can handle both EventPointer and AddressPointer types.
|
|
6
|
+
* Internally routes to createEventLoader for EventPointer and createAddressLoader for AddressPointer.
|
|
7
|
+
*/
|
|
8
|
+
export function createUnifiedEventLoader(pool, opts) {
|
|
9
|
+
// Create both loaders with the appropriate options
|
|
10
|
+
const eventLoader = createEventLoader(pool, {
|
|
11
|
+
bufferTime: opts?.bufferTime,
|
|
12
|
+
bufferSize: opts?.bufferSize,
|
|
13
|
+
eventStore: opts?.eventStore,
|
|
14
|
+
cacheRequest: opts?.cacheRequest,
|
|
15
|
+
followRelayHints: opts?.followRelayHints,
|
|
16
|
+
extraRelays: opts?.extraRelays,
|
|
17
|
+
});
|
|
18
|
+
const addressLoader = createAddressLoader(pool, {
|
|
19
|
+
bufferTime: opts?.bufferTime,
|
|
20
|
+
bufferSize: opts?.bufferSize,
|
|
21
|
+
eventStore: opts?.eventStore,
|
|
22
|
+
cacheRequest: opts?.cacheRequest,
|
|
23
|
+
followRelayHints: opts?.followRelayHints,
|
|
24
|
+
extraRelays: opts?.extraRelays,
|
|
25
|
+
lookupRelays: opts?.lookupRelays,
|
|
26
|
+
});
|
|
27
|
+
// Return a unified loader that routes based on pointer type
|
|
28
|
+
return (pointer) => {
|
|
29
|
+
// Check if it's an EventPointer (has 'id' property)
|
|
30
|
+
if (isEventPointer(pointer)) {
|
|
31
|
+
return eventLoader(pointer);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return addressLoader(pointer);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Creates a {@link UnifiedEventLoader} that will be used to load events that are not found in the store
|
|
40
|
+
* @returns The created loader
|
|
41
|
+
*/
|
|
42
|
+
export function createEventLoaderForStore(store, pool, opts) {
|
|
43
|
+
const loader = createUnifiedEventLoader(pool, { ...opts, eventStore: store });
|
|
44
|
+
store.eventLoader = loader;
|
|
45
|
+
return loader;
|
|
46
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mapEventsToStore } from "applesauce-core";
|
|
2
|
-
import { NostrEvent } from "
|
|
3
|
-
import { ProfilePointer } from "
|
|
2
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
3
|
+
import { ProfilePointer } from "applesauce-core/helpers/pointers";
|
|
4
4
|
import { Observable } from "rxjs";
|
|
5
5
|
import { CacheRequest, UpstreamPool } from "../types.js";
|
|
6
6
|
/** A list of NIP-51 list kinds that most clients will use */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mapEventsToStore } from "applesauce-core";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { kinds } from "applesauce-core/helpers/event";
|
|
3
|
+
import { mergeRelaySets } from "applesauce-core/helpers/relays";
|
|
4
4
|
import { EMPTY, identity, merge } from "rxjs";
|
|
5
5
|
import { makeCacheRequest } from "../helpers/cache.js";
|
|
6
6
|
import { unwrap } from "../helpers/loaders.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { getReplaceableAddress,
|
|
2
|
-
import {
|
|
1
|
+
import { getReplaceableAddress, isReplaceable, kinds } from "applesauce-core/helpers/event";
|
|
2
|
+
import { getSeenRelays, mergeRelaySets } from "applesauce-core/helpers/relays";
|
|
3
|
+
import { EMPTY } from "rxjs";
|
|
3
4
|
import { wrapUpstreamPool } from "../helpers/upstream.js";
|
|
4
5
|
import { createTagValueLoader } from "./tag-value-loader.js";
|
|
5
6
|
/** Creates a loader that loads zap events for a given event */
|
|
@@ -11,8 +12,14 @@ export function createZapsLoader(pool, opts) {
|
|
|
11
12
|
return (event, relays) => {
|
|
12
13
|
if (opts?.useSeenRelays ?? true)
|
|
13
14
|
relays = mergeRelaySets(relays, getSeenRelays(event));
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
if (isReplaceable(event.kind)) {
|
|
16
|
+
const address = getReplaceableAddress(event);
|
|
17
|
+
if (!address)
|
|
18
|
+
return EMPTY;
|
|
19
|
+
return addressableLoader({ value: address, relays });
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return eventLoader({ value: event.id, relays });
|
|
23
|
+
}
|
|
17
24
|
};
|
|
18
25
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NostrEvent } from "applesauce-core/helpers/event";
|
|
2
|
+
import { Filter } from "applesauce-core/helpers/filter";
|
|
2
3
|
import { Observable } from "rxjs";
|
|
3
4
|
/** A flexible method for requesting events from a cache */
|
|
4
5
|
export type CacheRequest = (filters: Filter[]) => Observable<NostrEvent> | Promise<NostrEvent | NostrEvent[]> | NostrEvent | NostrEvent[];
|
|
6
|
+
/** A method for requesting events from multiple relays */
|
|
7
|
+
export type NostrRequest = (relays: string[], filters: Filter[]) => Observable<NostrEvent>;
|
|
5
8
|
/** A flexible type for the upstream relay pool */
|
|
6
9
|
export type UpstreamPool = NostrRequest | {
|
|
7
10
|
request: NostrRequest;
|
|
8
11
|
};
|
|
9
|
-
/** A method for requesting events from a relay or cache` */
|
|
10
|
-
export type FilterRequest = (filters: Filter[]) => Observable<NostrEvent>;
|
|
11
|
-
/** A method for requesting events from multiple relays */
|
|
12
|
-
export type NostrRequest = (relays: string[], filters: Filter[]) => Observable<NostrEvent>;
|
|
13
12
|
/** A filter that is does not have a since or until */
|
|
14
13
|
export type TimelessFilter = Omit<Filter, "since" | "until">;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "applesauce-loaders",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.2",
|
|
4
4
|
"description": "A collection of observable based loaders built on rx-nostr",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -52,17 +52,16 @@
|
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"applesauce-core": "^
|
|
55
|
+
"applesauce-core": "^5.0.0",
|
|
56
56
|
"nanoid": "^5.0.9",
|
|
57
|
-
"nostr-tools": "~2.17",
|
|
58
57
|
"rxjs": "^7.8.1"
|
|
59
58
|
},
|
|
60
59
|
"devDependencies": {
|
|
61
60
|
"@hirez_io/observer-spy": "^2.2.0",
|
|
62
|
-
"applesauce-signers": "^
|
|
61
|
+
"applesauce-signers": "^5.0.0",
|
|
63
62
|
"rimraf": "^6.0.1",
|
|
64
63
|
"typescript": "^5.8.3",
|
|
65
|
-
"vitest": "^
|
|
64
|
+
"vitest": "^4.0.15",
|
|
66
65
|
"vitest-websocket-mock": "^0.5.0"
|
|
67
66
|
},
|
|
68
67
|
"funding": {
|