applesauce-core 0.12.0 → 1.0.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 +28 -10
- package/dist/event-store/__tests__/event-store.test.js +83 -1
- package/dist/event-store/database.d.ts +1 -0
- package/dist/event-store/database.js +7 -8
- package/dist/event-store/event-store.d.ts +4 -0
- package/dist/event-store/event-store.js +61 -22
- package/dist/event-store/interface.d.ts +11 -5
- package/dist/helpers/__tests__/bookmarks.test.d.ts +1 -0
- package/dist/helpers/__tests__/bookmarks.test.js +88 -0
- package/dist/helpers/__tests__/comment.test.js +14 -0
- package/dist/helpers/__tests__/contacts.test.d.ts +1 -0
- package/dist/helpers/__tests__/contacts.test.js +34 -0
- package/dist/helpers/__tests__/events.test.d.ts +1 -0
- package/dist/helpers/__tests__/events.test.js +32 -0
- package/dist/helpers/__tests__/mutes.test.d.ts +1 -0
- package/dist/helpers/__tests__/mutes.test.js +55 -0
- package/dist/helpers/bookmarks.d.ts +6 -1
- package/dist/helpers/bookmarks.js +52 -7
- package/dist/helpers/comment.d.ts +7 -3
- package/dist/helpers/comment.js +6 -1
- package/dist/helpers/contacts.d.ts +11 -0
- package/dist/helpers/contacts.js +34 -0
- package/dist/helpers/event.d.ts +8 -3
- package/dist/helpers/event.js +21 -13
- package/dist/helpers/lists.d.ts +40 -12
- package/dist/helpers/lists.js +62 -23
- package/dist/helpers/mutes.d.ts +8 -0
- package/dist/helpers/mutes.js +66 -5
- package/dist/helpers/nip-19.d.ts +14 -0
- package/dist/helpers/nip-19.js +29 -0
- package/dist/helpers/pointers.js +6 -6
- package/dist/observable/__tests__/listen-latest-updates.test.d.ts +1 -0
- package/dist/observable/__tests__/listen-latest-updates.test.js +55 -0
- package/dist/observable/defined.d.ts +3 -0
- package/dist/observable/defined.js +5 -0
- package/dist/observable/get-observable-value.d.ts +4 -1
- package/dist/observable/get-observable-value.js +4 -1
- package/dist/observable/index.d.ts +3 -1
- package/dist/observable/index.js +3 -1
- package/dist/observable/listen-latest-updates.d.ts +5 -0
- package/dist/observable/listen-latest-updates.js +12 -0
- package/dist/queries/blossom.js +1 -6
- package/dist/queries/bookmarks.d.ts +5 -5
- package/dist/queries/bookmarks.js +18 -17
- package/dist/queries/channels.js +41 -53
- package/dist/queries/comments.js +6 -9
- package/dist/queries/contacts.d.ts +6 -1
- package/dist/queries/contacts.js +21 -9
- package/dist/queries/index.d.ts +1 -0
- package/dist/queries/index.js +1 -0
- package/dist/queries/mailboxes.js +4 -7
- package/dist/queries/mutes.d.ts +6 -6
- package/dist/queries/mutes.js +20 -19
- package/dist/queries/pins.d.ts +1 -0
- package/dist/queries/pins.js +4 -6
- package/dist/queries/profile.js +1 -6
- package/dist/queries/reactions.js +11 -14
- package/dist/queries/relays.d.ts +27 -0
- package/dist/queries/relays.js +44 -0
- package/dist/queries/simple.js +5 -22
- package/dist/queries/thread.js +45 -51
- package/dist/queries/user-status.js +23 -29
- package/dist/queries/zaps.js +10 -13
- package/dist/query-store/query-store.d.ts +7 -6
- package/dist/query-store/query-store.js +13 -8
- package/package.json +3 -3
- package/dist/observable/share-latest-value.d.ts +0 -6
- package/dist/observable/share-latest-value.js +0 -24
package/dist/queries/comments.js
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { COMMENT_KIND, getEventUID } from "../helpers/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { isAddressableKind } from "nostr-tools/kinds";
|
|
3
3
|
/** Returns all NIP-22 comment replies for the event */
|
|
4
4
|
export function CommentsQuery(parent) {
|
|
5
|
-
return {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
filter["#a"] = [getEventUID(parent)];
|
|
11
|
-
return events.timeline(filter);
|
|
12
|
-
},
|
|
5
|
+
return (events) => {
|
|
6
|
+
const filter = { kinds: [COMMENT_KIND], "#e": [parent.id] };
|
|
7
|
+
if (isAddressableKind(parent.kind))
|
|
8
|
+
filter["#a"] = [getEventUID(parent)];
|
|
9
|
+
return events.timeline(filter);
|
|
13
10
|
};
|
|
14
11
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import { ProfilePointer } from "nostr-tools/nip19";
|
|
2
2
|
import { Query } from "../query-store/index.js";
|
|
3
|
-
|
|
3
|
+
/** A query that returns all contacts for a user */
|
|
4
|
+
export declare function ContactsQuery(pubkey: string): Query<ProfilePointer[] | undefined>;
|
|
5
|
+
/** A query that returns all public contacts for a user */
|
|
6
|
+
export declare function PublicContactsQuery(pubkey: string): Query<ProfilePointer[] | undefined>;
|
|
7
|
+
/** A query that returns all hidden contacts for a user */
|
|
8
|
+
export declare function HiddenContactsQuery(pubkey: string): Query<ProfilePointer[] | null | undefined>;
|
package/dist/queries/contacts.js
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import { kinds } from "nostr-tools";
|
|
2
2
|
import { map } from "rxjs/operators";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
import { getContacts, getHiddenContacts, getPublicContacts } from "../helpers/contacts.js";
|
|
4
|
+
import { listenLatestUpdates } from "../observable/index.js";
|
|
5
|
+
/** A query that returns all contacts for a user */
|
|
6
|
+
export function ContactsQuery(pubkey) {
|
|
7
|
+
return (events) => events.replaceable(kinds.Contacts, pubkey).pipe(
|
|
8
|
+
// listen for event updates (hidden tags unlocked)
|
|
9
|
+
listenLatestUpdates(events),
|
|
10
|
+
// Get all contacts
|
|
11
|
+
map((e) => e && getContacts(e)));
|
|
12
|
+
}
|
|
13
|
+
/** A query that returns all public contacts for a user */
|
|
14
|
+
export function PublicContactsQuery(pubkey) {
|
|
15
|
+
return (events) => events.replaceable(kinds.Contacts, pubkey).pipe(map((e) => e && getPublicContacts(e)));
|
|
16
|
+
}
|
|
17
|
+
/** A query that returns all hidden contacts for a user */
|
|
18
|
+
export function HiddenContactsQuery(pubkey) {
|
|
19
|
+
return (events) => events.replaceable(kinds.Contacts, pubkey).pipe(
|
|
20
|
+
// listen for event updates (hidden tags unlocked)
|
|
21
|
+
listenLatestUpdates(events),
|
|
22
|
+
// Get hidden contacts
|
|
23
|
+
map((e) => e && (getHiddenContacts(e) ?? null)));
|
|
12
24
|
}
|
package/dist/queries/index.d.ts
CHANGED
package/dist/queries/index.js
CHANGED
|
@@ -3,11 +3,8 @@ import { map } from "rxjs/operators";
|
|
|
3
3
|
import { getInboxes, getOutboxes } from "../helpers/mailboxes.js";
|
|
4
4
|
/** A query that gets and parses the inbox and outbox relays for a pubkey */
|
|
5
5
|
export function MailboxesQuery(pubkey) {
|
|
6
|
-
return {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
outboxes: getOutboxes(event),
|
|
11
|
-
})),
|
|
12
|
-
};
|
|
6
|
+
return (events) => events.replaceable(kinds.RelayList, pubkey).pipe(map((event) => event && {
|
|
7
|
+
inboxes: getInboxes(event),
|
|
8
|
+
outboxes: getOutboxes(event),
|
|
9
|
+
}));
|
|
13
10
|
}
|
package/dist/queries/mutes.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Mutes } from "../helpers/mutes.js";
|
|
2
2
|
import { Query } from "../query-store/index.js";
|
|
3
|
-
|
|
4
|
-
export declare function
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
/** A query that returns all a users muted things */
|
|
4
|
+
export declare function MuteQuery(pubkey: string): Query<Mutes | undefined>;
|
|
5
|
+
/** A query that returns all a users public muted things */
|
|
6
|
+
export declare function PublicMuteQuery(pubkey: string): Query<Mutes | undefined>;
|
|
7
|
+
/** A query that returns all a users hidden muted things */
|
|
8
|
+
export declare function HiddenMuteQuery(pubkey: string): Query<Mutes | null | undefined>;
|
package/dist/queries/mutes.js
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import { kinds } from "nostr-tools";
|
|
2
2
|
import { map } from "rxjs/operators";
|
|
3
|
-
import { getHiddenMutedThings, getMutedThings } from "../helpers/mutes.js";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { getHiddenMutedThings, getMutedThings, getPublicMutedThings } from "../helpers/mutes.js";
|
|
4
|
+
import { listenLatestUpdates } from "../observable/listen-latest-updates.js";
|
|
5
|
+
/** A query that returns all a users muted things */
|
|
6
|
+
export function MuteQuery(pubkey) {
|
|
7
|
+
return (events) => events.replaceable(kinds.Mutelist, pubkey).pipe(
|
|
8
|
+
// listen for event updates (hidden tags unlocked)
|
|
9
|
+
listenLatestUpdates(events),
|
|
10
|
+
// Get all muted things
|
|
11
|
+
map((event) => event && getMutedThings(event)));
|
|
10
12
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
};
|
|
13
|
+
/** A query that returns all a users public muted things */
|
|
14
|
+
export function PublicMuteQuery(pubkey) {
|
|
15
|
+
return (events) => events.replaceable(kinds.Mutelist, pubkey).pipe(map((event) => event && getPublicMutedThings(event)));
|
|
16
|
+
}
|
|
17
|
+
/** A query that returns all a users hidden muted things */
|
|
18
|
+
export function HiddenMuteQuery(pubkey) {
|
|
19
|
+
return (events) => events.replaceable(kinds.Mutelist, pubkey).pipe(
|
|
20
|
+
// listen for event updates (hidden tags unlocked)
|
|
21
|
+
listenLatestUpdates(events),
|
|
22
|
+
// Get hidden muted things
|
|
23
|
+
map((event) => event && getHiddenMutedThings(event)));
|
|
23
24
|
}
|
package/dist/queries/pins.d.ts
CHANGED
package/dist/queries/pins.js
CHANGED
|
@@ -2,11 +2,9 @@ import { kinds } from "nostr-tools";
|
|
|
2
2
|
import { map } from "rxjs/operators";
|
|
3
3
|
import { isETag, processTags } from "../helpers/tags.js";
|
|
4
4
|
import { getEventPointerFromETag } from "../helpers/pointers.js";
|
|
5
|
+
/** A query that returns all pinned pointers for a user */
|
|
5
6
|
export function UserPinnedQuery(pubkey) {
|
|
6
|
-
return
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
.replaceable(kinds.Pinlist, pubkey)
|
|
10
|
-
.pipe(map((event) => event && processTags(event.tags.filter(isETag), getEventPointerFromETag))),
|
|
11
|
-
};
|
|
7
|
+
return (events) => events
|
|
8
|
+
.replaceable(kinds.Pinlist, pubkey)
|
|
9
|
+
.pipe(map((event) => event && processTags(event.tags.filter(isETag), getEventPointerFromETag)));
|
|
12
10
|
}
|
package/dist/queries/profile.js
CHANGED
|
@@ -3,10 +3,5 @@ import { filter, map } from "rxjs/operators";
|
|
|
3
3
|
import { getProfileContent, isValidProfile } from "../helpers/profile.js";
|
|
4
4
|
/** A query that gets and parses the kind 0 metadata for a pubkey */
|
|
5
5
|
export function ProfileQuery(pubkey) {
|
|
6
|
-
return
|
|
7
|
-
key: pubkey,
|
|
8
|
-
run: (events) => {
|
|
9
|
-
return events.replaceable(kinds.Metadata, pubkey).pipe(filter(isValidProfile), map((event) => event && getProfileContent(event)));
|
|
10
|
-
},
|
|
11
|
-
};
|
|
6
|
+
return (events) => events.replaceable(kinds.Metadata, pubkey).pipe(filter(isValidProfile), map((event) => event && getProfileContent(event)));
|
|
12
7
|
}
|
|
@@ -2,18 +2,15 @@ import { kinds } from "nostr-tools";
|
|
|
2
2
|
import { getEventUID, isReplaceable } from "../helpers/event.js";
|
|
3
3
|
/** A query that returns all reactions to an event (supports replaceable events) */
|
|
4
4
|
export function ReactionsQuery(event) {
|
|
5
|
-
return
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
]),
|
|
18
|
-
};
|
|
5
|
+
return (events) => events.timeline(isReplaceable(event.kind)
|
|
6
|
+
? [
|
|
7
|
+
{ kinds: [kinds.Reaction], "#e": [event.id] },
|
|
8
|
+
{ kinds: [kinds.Reaction], "#a": [getEventUID(event)] },
|
|
9
|
+
]
|
|
10
|
+
: [
|
|
11
|
+
{
|
|
12
|
+
kinds: [kinds.Reaction],
|
|
13
|
+
"#e": [event.id],
|
|
14
|
+
},
|
|
15
|
+
]);
|
|
19
16
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AddressPointer } from "nostr-tools/nip19";
|
|
2
|
+
import { ReadListTags } from "../helpers/lists.js";
|
|
3
|
+
import { Query } from "../query-store/query-store.js";
|
|
4
|
+
/**
|
|
5
|
+
* A query that returns all favorite relays for a pubkey
|
|
6
|
+
* @param pubkey - The pubkey to get the favorite relays for
|
|
7
|
+
* @param type - Which types of tags to read
|
|
8
|
+
*/
|
|
9
|
+
export declare function FavoriteRelays(pubkey: string, type?: ReadListTags): Query<string[] | undefined>;
|
|
10
|
+
/**
|
|
11
|
+
* A query that returns all favorite relay sets for a pubkey
|
|
12
|
+
* @param pubkey - The pubkey to get the favorite relay sets for
|
|
13
|
+
* @param type - Which types of tags to read
|
|
14
|
+
*/
|
|
15
|
+
export declare function FavoriteRelaySets(pubkey: string, type?: ReadListTags): Query<AddressPointer[] | undefined>;
|
|
16
|
+
/**
|
|
17
|
+
* A query that returns all search relays for a pubkey
|
|
18
|
+
* @param pubkey - The pubkey to get the search relays for
|
|
19
|
+
* @param type - Which types of tags to read
|
|
20
|
+
*/
|
|
21
|
+
export declare function SearchRelays(pubkey: string, type?: ReadListTags): Query<string[] | undefined>;
|
|
22
|
+
/**
|
|
23
|
+
* A query that returns all blocked relays for a pubkey
|
|
24
|
+
* @param pubkey - The pubkey to get the blocked relays for
|
|
25
|
+
* @param type - Which types of tags to read
|
|
26
|
+
*/
|
|
27
|
+
export declare function BlockedRelays(pubkey: string, type?: ReadListTags): Query<string[] | undefined>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { kinds } from "nostr-tools";
|
|
2
|
+
import { identity, map } from "rxjs";
|
|
3
|
+
import { FAVORITE_RELAYS_KIND, getAddressPointersFromList, getRelaysFromList } from "../helpers/lists.js";
|
|
4
|
+
import { listenLatestUpdates } from "../observable/listen-latest-updates.js";
|
|
5
|
+
/**
|
|
6
|
+
* A query that returns all favorite relays for a pubkey
|
|
7
|
+
* @param pubkey - The pubkey to get the favorite relays for
|
|
8
|
+
* @param type - Which types of tags to read
|
|
9
|
+
*/
|
|
10
|
+
export function FavoriteRelays(pubkey, type) {
|
|
11
|
+
return (events) => {
|
|
12
|
+
return events.replaceable(FAVORITE_RELAYS_KIND, pubkey).pipe(type !== "public" ? listenLatestUpdates(events) : map(identity), map((e) => e && getRelaysFromList(e, type)));
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A query that returns all favorite relay sets for a pubkey
|
|
17
|
+
* @param pubkey - The pubkey to get the favorite relay sets for
|
|
18
|
+
* @param type - Which types of tags to read
|
|
19
|
+
*/
|
|
20
|
+
export function FavoriteRelaySets(pubkey, type) {
|
|
21
|
+
return (events) => {
|
|
22
|
+
return events.replaceable(FAVORITE_RELAYS_KIND, pubkey).pipe(type !== "public" ? listenLatestUpdates(events) : map(identity), map((e) => e && getAddressPointersFromList(e, type)));
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A query that returns all search relays for a pubkey
|
|
27
|
+
* @param pubkey - The pubkey to get the search relays for
|
|
28
|
+
* @param type - Which types of tags to read
|
|
29
|
+
*/
|
|
30
|
+
export function SearchRelays(pubkey, type) {
|
|
31
|
+
return (events) => {
|
|
32
|
+
return events.replaceable(kinds.SearchRelaysList, pubkey).pipe(type !== "public" ? listenLatestUpdates(events) : map(identity), map((e) => e && getRelaysFromList(e, type)));
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A query that returns all blocked relays for a pubkey
|
|
37
|
+
* @param pubkey - The pubkey to get the blocked relays for
|
|
38
|
+
* @param type - Which types of tags to read
|
|
39
|
+
*/
|
|
40
|
+
export function BlockedRelays(pubkey, type) {
|
|
41
|
+
return (events) => {
|
|
42
|
+
return events.replaceable(kinds.BlockedRelaysList, pubkey).pipe(type !== "public" ? listenLatestUpdates(events) : map(identity), map((e) => e && getRelaysFromList(e, type)));
|
|
43
|
+
};
|
|
44
|
+
}
|
package/dist/queries/simple.js
CHANGED
|
@@ -1,38 +1,21 @@
|
|
|
1
|
-
import hash_sum from "hash-sum";
|
|
2
|
-
import { getReplaceableUID } from "../helpers/event.js";
|
|
3
1
|
/** Creates a Query that returns a single event or undefined */
|
|
4
2
|
export function SingleEventQuery(id) {
|
|
5
|
-
return
|
|
6
|
-
key: id,
|
|
7
|
-
run: (events) => events.event(id),
|
|
8
|
-
};
|
|
3
|
+
return (events) => events.event(id);
|
|
9
4
|
}
|
|
10
5
|
/** Creates a Query that returns a multiple events in a map */
|
|
11
6
|
export function MultipleEventsQuery(ids) {
|
|
12
|
-
return
|
|
13
|
-
key: ids.join(","),
|
|
14
|
-
run: (events) => events.events(ids),
|
|
15
|
-
};
|
|
7
|
+
return (events) => events.events(ids);
|
|
16
8
|
}
|
|
17
9
|
/** Creates a Query returning the latest version of a replaceable event */
|
|
18
10
|
export function ReplaceableQuery(kind, pubkey, d) {
|
|
19
|
-
return
|
|
20
|
-
key: getReplaceableUID(kind, pubkey, d),
|
|
21
|
-
run: (events) => events.replaceable(kind, pubkey, d),
|
|
22
|
-
};
|
|
11
|
+
return (events) => events.replaceable(kind, pubkey, d);
|
|
23
12
|
}
|
|
24
13
|
/** Creates a Query that returns an array of sorted events matching the filters */
|
|
25
14
|
export function TimelineQuery(filters, includeOldVersion) {
|
|
26
15
|
filters = Array.isArray(filters) ? filters : [filters];
|
|
27
|
-
return
|
|
28
|
-
key: hash_sum(filters) + (includeOldVersion ? "-history" : ""),
|
|
29
|
-
run: (events) => events.timeline(filters, includeOldVersion),
|
|
30
|
-
};
|
|
16
|
+
return (events) => events.timeline(filters, includeOldVersion);
|
|
31
17
|
}
|
|
32
18
|
/** Creates a Query that returns a directory of events by their UID */
|
|
33
19
|
export function ReplaceableSetQuery(pointers) {
|
|
34
|
-
return
|
|
35
|
-
key: hash_sum(pointers),
|
|
36
|
-
run: (events) => events.replaceableSet(pointers),
|
|
37
|
-
};
|
|
20
|
+
return (events) => events.replaceableSet(pointers);
|
|
38
21
|
}
|
package/dist/queries/thread.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { kinds } from "nostr-tools";
|
|
2
|
-
import {
|
|
2
|
+
import { isAddressableKind } from "nostr-tools/kinds";
|
|
3
3
|
import { map } from "rxjs/operators";
|
|
4
4
|
import { getNip10References, interpretThreadTags } from "../helpers/threading.js";
|
|
5
5
|
import { getCoordinateFromAddressPointer, isAddressPointer, isEventPointer } from "../helpers/pointers.js";
|
|
6
|
-
import { getEventUID,
|
|
6
|
+
import { getEventUID, createReplaceableAddress, getTagValue, isEvent } from "../helpers/event.js";
|
|
7
7
|
import { COMMENT_KIND } from "../helpers/comment.js";
|
|
8
8
|
const defaultOptions = {
|
|
9
9
|
kinds: [kinds.ShortTextNote],
|
|
@@ -32,61 +32,55 @@ export function ThreadQuery(root, opts) {
|
|
|
32
32
|
rootFilter.ids = [root.id];
|
|
33
33
|
replyFilter["#e"] = [root.id];
|
|
34
34
|
}
|
|
35
|
-
return {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
return (events) => events.filters([rootFilter, replyFilter]).pipe(map((event) => {
|
|
36
|
+
if (!items.has(getEventUID(event))) {
|
|
37
|
+
const refs = getNip10References(event);
|
|
38
|
+
const replies = parentReferences.get(getEventUID(event)) || new Set();
|
|
39
|
+
const item = { event, refs, replies };
|
|
40
|
+
for (const child of replies) {
|
|
41
|
+
child.parent = item;
|
|
42
|
+
}
|
|
43
|
+
// add item to parent
|
|
44
|
+
if (refs.reply?.e || refs.reply?.a) {
|
|
45
|
+
let uid = refs.reply.e ? refs.reply.e.id : getCoordinateFromAddressPointer(refs.reply.a);
|
|
46
|
+
item.parent = items.get(uid);
|
|
47
|
+
if (item.parent) {
|
|
48
|
+
item.parent.replies.add(item);
|
|
44
49
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
let
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
// parent isn't created yet, store ref for later
|
|
54
|
-
let set = parentReferences.get(uid);
|
|
55
|
-
if (!set) {
|
|
56
|
-
set = new Set();
|
|
57
|
-
parentReferences.set(uid, set);
|
|
58
|
-
}
|
|
59
|
-
set.add(item);
|
|
50
|
+
else {
|
|
51
|
+
// parent isn't created yet, store ref for later
|
|
52
|
+
let set = parentReferences.get(uid);
|
|
53
|
+
if (!set) {
|
|
54
|
+
set = new Set();
|
|
55
|
+
parentReferences.set(uid, set);
|
|
60
56
|
}
|
|
57
|
+
set.add(item);
|
|
61
58
|
}
|
|
62
|
-
// add item to map
|
|
63
|
-
items.set(getEventUID(event), item);
|
|
64
59
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
// add item to map
|
|
61
|
+
items.set(getEventUID(event), item);
|
|
62
|
+
}
|
|
63
|
+
return { root: items.get(rootUID), all: items };
|
|
64
|
+
}));
|
|
68
65
|
}
|
|
69
66
|
/** A query that gets all legacy and NIP-10, and NIP-22 replies for an event */
|
|
70
67
|
export function RepliesQuery(event, overrideKinds) {
|
|
71
|
-
return {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
});
|
|
89
|
-
}));
|
|
90
|
-
},
|
|
68
|
+
return (events) => {
|
|
69
|
+
const kinds = overrideKinds || event.kind === 1 ? [1, COMMENT_KIND] : [COMMENT_KIND];
|
|
70
|
+
const filter = { kinds };
|
|
71
|
+
if (isEvent(parent) || isEventPointer(event))
|
|
72
|
+
filter["#e"] = [event.id];
|
|
73
|
+
const address = isAddressableKind(event.kind)
|
|
74
|
+
? createReplaceableAddress(event.kind, event.pubkey, getTagValue(event, "d"))
|
|
75
|
+
: undefined;
|
|
76
|
+
if (address) {
|
|
77
|
+
filter["#a"] = [address];
|
|
78
|
+
}
|
|
79
|
+
return events.timeline(filter).pipe(map((events) => {
|
|
80
|
+
return events.filter((e) => {
|
|
81
|
+
const refs = interpretThreadTags(e.tags);
|
|
82
|
+
return refs.reply?.e?.[1] === event.id || refs.reply?.a?.[1] === address;
|
|
83
|
+
});
|
|
84
|
+
}));
|
|
91
85
|
};
|
|
92
86
|
}
|
|
@@ -4,36 +4,30 @@ import { getUserStatusPointer } from "../helpers/user-status.js";
|
|
|
4
4
|
import { getReplaceableIdentifier } from "../helpers/event.js";
|
|
5
5
|
/** Creates a Query that returns a parsed {@link UserStatus} for a certain type */
|
|
6
6
|
export function UserStatusQuery(pubkey, type = "general") {
|
|
7
|
-
return {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
20
|
-
})),
|
|
21
|
-
};
|
|
7
|
+
return (events) => events.replaceable(kinds.UserStatuses, pubkey, type).pipe(map((event) => {
|
|
8
|
+
if (!event)
|
|
9
|
+
return undefined;
|
|
10
|
+
const pointer = getUserStatusPointer(event);
|
|
11
|
+
if (!pointer)
|
|
12
|
+
return null;
|
|
13
|
+
return {
|
|
14
|
+
...pointer,
|
|
15
|
+
event,
|
|
16
|
+
content: event.content,
|
|
17
|
+
};
|
|
18
|
+
}));
|
|
22
19
|
}
|
|
23
20
|
/** Creates a Query that returns a directory of parsed {@link UserStatus} for a pubkey */
|
|
24
21
|
export function UserStatusesQuery(pubkey) {
|
|
25
|
-
return {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}, {});
|
|
37
|
-
})),
|
|
38
|
-
};
|
|
22
|
+
return (events) => events.timeline([{ kinds: [kinds.UserStatuses], authors: [pubkey] }]).pipe(map((events) => {
|
|
23
|
+
return events.reduce((dir, event) => {
|
|
24
|
+
try {
|
|
25
|
+
const d = getReplaceableIdentifier(event);
|
|
26
|
+
return { ...dir, [d]: { event, ...getUserStatusPointer(event), content: event.content } };
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return dir;
|
|
30
|
+
}
|
|
31
|
+
}, {});
|
|
32
|
+
}));
|
|
39
33
|
}
|
package/dist/queries/zaps.js
CHANGED
|
@@ -4,18 +4,15 @@ import { getCoordinateFromAddressPointer, isAddressPointer } from "../helpers/po
|
|
|
4
4
|
import { isValidZap } from "../helpers/zap.js";
|
|
5
5
|
/** A query that gets all zap events for an event */
|
|
6
6
|
export function EventZapsQuery(id) {
|
|
7
|
-
return {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return events.timeline([{ kinds: [kinds.Zap], "#e": [id] }]).pipe(map((events) => events.filter(isValidZap)));
|
|
18
|
-
}
|
|
19
|
-
},
|
|
7
|
+
return (events) => {
|
|
8
|
+
if (isAddressPointer(id)) {
|
|
9
|
+
return events
|
|
10
|
+
.timeline([{ kinds: [kinds.Zap], "#a": [getCoordinateFromAddressPointer(id)] }])
|
|
11
|
+
.pipe(map((events) => events.filter(isValidZap)));
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
id = typeof id === "string" ? id : id.id;
|
|
15
|
+
return events.timeline([{ kinds: [kinds.Zap], "#e": [id] }]).pipe(map((events) => events.filter(isValidZap)));
|
|
16
|
+
}
|
|
20
17
|
};
|
|
21
18
|
}
|
|
@@ -3,13 +3,10 @@ import { Filter, NostrEvent } from "nostr-tools";
|
|
|
3
3
|
import type { AddressPointer, EventPointer } from "nostr-tools/nip19";
|
|
4
4
|
import { IEventStore } from "../event-store/interface.js";
|
|
5
5
|
import * as Queries from "../queries/index.js";
|
|
6
|
-
export type Query<T extends unknown> =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
/** The meat of the query, this should return an Observables that subscribes to the eventStore in some way */
|
|
10
|
-
run: (events: IEventStore, store: QueryStore) => Observable<T>;
|
|
6
|
+
export type Query<T extends unknown> = (events: IEventStore, store: QueryStore) => Observable<T>;
|
|
7
|
+
export type QueryConstructor<T extends unknown, Args extends Array<any>> = ((...args: Args) => Query<T>) & {
|
|
8
|
+
getKey?: (...args: Args) => string;
|
|
11
9
|
};
|
|
12
|
-
export type QueryConstructor<T extends unknown, Args extends Array<any>> = (...args: Args) => Query<T>;
|
|
13
10
|
export declare class QueryStore {
|
|
14
11
|
static Queries: typeof Queries;
|
|
15
12
|
store: IEventStore;
|
|
@@ -38,6 +35,10 @@ export declare class QueryStore {
|
|
|
38
35
|
timeline(filters: Filter | Filter[], keepOldVersions?: boolean): Observable<import("nostr-tools").Event[] | undefined>;
|
|
39
36
|
/** Creates a ProfileQuery */
|
|
40
37
|
profile(pubkey: string): Observable<import("../helpers/profile.js").ProfileContent | undefined>;
|
|
38
|
+
/** Creates a ContactsQuery */
|
|
39
|
+
contacts(pubkey: string): Observable<import("nostr-tools/nip19").ProfilePointer[] | undefined>;
|
|
40
|
+
/** Creates a MuteQuery */
|
|
41
|
+
mutes(pubkey: string): Observable<import("../helpers/mutes.js").Mutes | undefined>;
|
|
41
42
|
/** Creates a ReactionsQuery */
|
|
42
43
|
reactions(event: NostrEvent): Observable<import("nostr-tools").Event[] | undefined>;
|
|
43
44
|
/** Creates a MailboxesQuery */
|