applesauce-loaders 0.0.0-next-20241213171848 → 0.10.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.
package/README.md CHANGED
@@ -20,10 +20,23 @@ export const rxNostr = createRxNostr({
20
20
  connectionStrategy: "lazy-keep",
21
21
  });
22
22
 
23
+ // create method to load events from the cache relay
24
+ function cacheRequest(filters: Filter[]) {
25
+ return new Observable((observer) => {
26
+ const sub = cacheRelay.subscribe(filters, {
27
+ onevent: (event) => observer.next(event),
28
+ oneose: () => {
29
+ sub.close();
30
+ observer.complete();
31
+ },
32
+ });
33
+ });
34
+ }
35
+
23
36
  const replaceableLoader = new ReplaceableLoader(rxNostr, {
24
37
  bufferTime: 1000,
25
- // cache relays will always be checked first
26
- cacheRelays: ["ws://localhost:4869/"],
38
+ // check the cache first for events
39
+ cacheRequest: cacheRequest,
27
40
  // lookup relays are used as a fallback if the event cant be found
28
41
  lookupRelays: ["wss://purplepag.es/"],
29
42
  });
@@ -1,9 +1,9 @@
1
1
  import { AddressPointerWithoutD } from "applesauce-core/helpers";
2
- import { LazyFilter } from "rx-nostr";
2
+ import { Filter } from "nostr-tools";
3
3
  /** Converts an array of address pointers to a filter */
4
- export declare function createFilterFromAddressPointers(pointers: AddressPointerWithoutD[]): LazyFilter;
4
+ export declare function createFilterFromAddressPointers(pointers: AddressPointerWithoutD[]): Filter;
5
5
  /** Takes a set of address pointers, groups them, then returns filters for the groups */
6
- export declare function createFiltersFromAddressPointers(pointers: AddressPointerWithoutD[]): LazyFilter[];
6
+ export declare function createFiltersFromAddressPointers(pointers: AddressPointerWithoutD[]): Filter[];
7
7
  /** Checks if a relay will understand an address pointer */
8
8
  export declare function isLoadableAddressPointer<T extends AddressPointerWithoutD>(pointer: T): boolean;
9
9
  /** Group an array of address pointers by kind */
@@ -1,4 +1,6 @@
1
+ import { Observable } from "rxjs";
1
2
  import { EventPacket, RxNostr } from "rx-nostr";
3
+ import { Filter, NostrEvent } from "nostr-tools";
2
4
  import { logger } from "applesauce-core";
3
5
  import { Loader } from "./loader.js";
4
6
  export type LoadableAddressPointer = {
@@ -11,14 +13,15 @@ export type LoadableAddressPointer = {
11
13
  /** Load this address pointer even if it has already been loaded */
12
14
  force?: boolean;
13
15
  };
16
+ export type CacheRequest = (filters: Filter[]) => Observable<NostrEvent>;
14
17
  export type ReplaceableLoaderOptions = {
15
18
  /**
16
19
  * Time interval to buffer requests in ms
17
20
  * @default 1000
18
21
  */
19
22
  bufferTime?: number;
20
- /** The cache relays to check first */
21
- cacheRelays?: string[];
23
+ /** Request events from the cache first */
24
+ cacheRequest?: CacheRequest;
22
25
  /** Fallback lookup relays to check when event cant be found */
23
26
  lookupRelays?: string[];
24
27
  };
@@ -1,11 +1,11 @@
1
- import { share, tap, from, filter, bufferTime, map } from "rxjs";
1
+ import { share, tap, from, filter, bufferTime, map, mergeMap } from "rxjs";
2
2
  import { getEventUID, getReplaceableUID, markFromCache } from "applesauce-core/helpers";
3
3
  import { logger } from "applesauce-core";
4
4
  import { nanoid } from "nanoid";
5
5
  import { Loader } from "./loader.js";
6
6
  import { generatorSequence } from "../operators/generator-sequence.js";
7
7
  import { replaceableRequest } from "../operators/address-pointers-request.js";
8
- import { getAddressPointerId, getRelaysFromPointers, isLoadableAddressPointer } from "../helpers/address-pointer.js";
8
+ import { createFiltersFromAddressPointers, getAddressPointerId, getRelaysFromPointers, isLoadableAddressPointer, } from "../helpers/address-pointer.js";
9
9
  import { unique } from "../helpers/array.js";
10
10
  /** deep clone a loadable pointer to ensure its safe to modify */
11
11
  function cloneLoadablePointer(pointer) {
@@ -38,11 +38,17 @@ function* cacheFirstSequence(rxNostr, pointers, log, opts) {
38
38
  return false;
39
39
  };
40
40
  // first attempt, load from cache relays
41
- if (opts?.cacheRelays && opts?.cacheRelays.length > 0) {
42
- log(`Checking cache`, opts.cacheRelays, remaining);
43
- const results = yield from([remaining]).pipe(replaceableRequest(rxNostr, id, opts.cacheRelays),
41
+ if (opts?.cacheRequest) {
42
+ log(`Checking cache`, remaining);
43
+ const results = yield from([remaining]).pipe(
44
+ // convert pointers to filters
45
+ map(createFiltersFromAddressPointers),
46
+ // make requests
47
+ mergeMap((filters) => opts.cacheRequest(filters)),
44
48
  // mark the event as from the cache
45
- tap((p) => markFromCache(p.event)));
49
+ tap((event) => markFromCache(event)),
50
+ // convert to event packets
51
+ map((e) => ({ event: e, from: "cache", subId: "cache", type: "EVENT" })));
46
52
  if (handleResults(results))
47
53
  return;
48
54
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "applesauce-loaders",
3
- "version": "0.0.0-next-20241213171848",
3
+ "version": "0.10.0",
4
4
  "description": "A collection of observable based loaders built on rx-nostr",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -36,7 +36,7 @@
36
36
  }
37
37
  },
38
38
  "dependencies": {
39
- "applesauce-core": "0.0.0-next-20241213171848",
39
+ "applesauce-core": "^0.10.0",
40
40
  "nanoid": "^5.0.9",
41
41
  "nostr-tools": "^2.10.3",
42
42
  "rx-nostr": "^3.4.1",