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
|
-
//
|
|
26
|
-
|
|
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 {
|
|
2
|
+
import { Filter } from "nostr-tools";
|
|
3
3
|
/** Converts an array of address pointers to a filter */
|
|
4
|
-
export declare function createFilterFromAddressPointers(pointers: AddressPointerWithoutD[]):
|
|
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[]):
|
|
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
|
-
/**
|
|
21
|
-
|
|
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?.
|
|
42
|
-
log(`Checking cache`,
|
|
43
|
-
const results = yield from([remaining]).pipe(
|
|
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((
|
|
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.
|
|
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.
|
|
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",
|