optimize performance
This commit is contained in:
parent
cc943fed50
commit
f0740cb6ca
@ -26,8 +26,6 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel
|
||||
window: options.window,
|
||||
now: options.now ?? unixNow(),
|
||||
});
|
||||
const [trackingEvents, setTrackingEvent] = useState<u256[]>([]);
|
||||
const [trackingParentEvents, setTrackingParentEvents] = useState<u256[]>([]);
|
||||
const pref = useLogin().preferences;
|
||||
|
||||
const createBuilder = useCallback(() => {
|
||||
@ -132,34 +130,8 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel
|
||||
latest.clear();
|
||||
}, [options.relay]);
|
||||
|
||||
const subNext = useMemo(() => {
|
||||
const rb = new RequestBuilder(`timeline-related:${subject.type}:${subject.discriminator}`);
|
||||
if (trackingEvents.length > 0) {
|
||||
rb.withFilter()
|
||||
.kinds(
|
||||
pref.enableReactions
|
||||
? [EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt]
|
||||
: [EventKind.ZapReceipt, EventKind.Repost]
|
||||
)
|
||||
.tag("e", trackingEvents);
|
||||
}
|
||||
if (trackingParentEvents.length > 0) {
|
||||
rb.withFilter().ids(trackingParentEvents);
|
||||
}
|
||||
return rb.numFilters > 0 ? rb : null;
|
||||
}, [trackingEvents, pref, subject.type]);
|
||||
|
||||
const related = useRequestBuilder<FlatNoteStore>(FlatNoteStore, subNext);
|
||||
|
||||
useEffect(() => {
|
||||
if (main.data && main.data.length > 0) {
|
||||
setTrackingEvent(s => {
|
||||
const ids = (main.data ?? []).map(a => a.id);
|
||||
if (ids.some(a => !s.includes(a))) {
|
||||
return Array.from(new Set([...s, ...ids]));
|
||||
}
|
||||
return s;
|
||||
});
|
||||
function getParentEvents() {
|
||||
if (main.data) {
|
||||
const repostsByKind6 = main.data
|
||||
.filter(a => a.kind === EventKind.Repost && a.content === "")
|
||||
.map(a => a.tags.find(b => b[0] === "e"))
|
||||
@ -172,18 +144,31 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel
|
||||
.map(a => a.tags.find(tagFilterOfTextRepost(a)))
|
||||
.filter(a => a)
|
||||
.map(a => unwrap(a)[1]);
|
||||
const reposts = [...repostsByKind6, ...repostsByKind1];
|
||||
if (reposts.length > 0) {
|
||||
setTrackingParentEvents(s => {
|
||||
if (reposts.some(a => !s.includes(a))) {
|
||||
const temp = new Set([...s, ...reposts]);
|
||||
return Array.from(temp);
|
||||
}
|
||||
return s;
|
||||
});
|
||||
}
|
||||
return [...repostsByKind6, ...repostsByKind1];
|
||||
}
|
||||
}, [main]);
|
||||
return [];
|
||||
}
|
||||
|
||||
const subNext = useMemo(() => {
|
||||
const rb = new RequestBuilder(`timeline-related:${subject.type}:${subject.discriminator}`);
|
||||
const trackingEvents = main.data?.map(a => a.id) ?? [];
|
||||
if (trackingEvents.length > 0) {
|
||||
rb.withFilter()
|
||||
.kinds(
|
||||
pref.enableReactions
|
||||
? [EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt]
|
||||
: [EventKind.ZapReceipt, EventKind.Repost]
|
||||
)
|
||||
.tag("e", trackingEvents);
|
||||
}
|
||||
const trackingParentEvents = getParentEvents();
|
||||
if (trackingParentEvents.length > 0) {
|
||||
rb.withFilter().ids(trackingParentEvents);
|
||||
}
|
||||
return rb.numFilters > 0 ? rb : null;
|
||||
}, [main.data, pref, subject.type]);
|
||||
|
||||
const related = useRequestBuilder<FlatNoteStore>(FlatNoteStore, subNext);
|
||||
|
||||
return {
|
||||
main: main.data,
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { v4 as uuid } from "uuid";
|
||||
import debug from "debug";
|
||||
import { Connection, ReqFilter, Nips, TaggedRawEvent } from ".";
|
||||
import { unixNowMs, unwrap } from "./Utils";
|
||||
import { reqFilterEq, unixNowMs, unwrap } from "./Utils";
|
||||
import { NoteStore } from "./NoteCollection";
|
||||
import { flatMerge } from "./RequestMerger";
|
||||
import { BuiltRawReqFilter } from "./RequestBuilder";
|
||||
@ -46,7 +46,6 @@ class QueryTrace {
|
||||
forceEose() {
|
||||
this.eose = unixNowMs();
|
||||
this.#wasForceClosed = true;
|
||||
this.#fnProgress();
|
||||
this.sendClose();
|
||||
}
|
||||
|
||||
@ -163,7 +162,13 @@ export class Query implements QueryBase {
|
||||
}
|
||||
|
||||
get flatFilters() {
|
||||
return this.#tracing.flatMap(a => a.filters).flatMap(expandFilter);
|
||||
const f: Array<ReqFilter> = [];
|
||||
for (const x of this.#tracing.flatMap(a => a.filters)) {
|
||||
if (!f.some(a => reqFilterEq(a, x))) {
|
||||
f.push(x);
|
||||
}
|
||||
}
|
||||
return f.flatMap(expandFilter);
|
||||
}
|
||||
|
||||
get feed() {
|
||||
|
@ -96,11 +96,11 @@ export class RequestBuilder {
|
||||
/**
|
||||
* Detects a change in request from a previous set of filters
|
||||
*/
|
||||
buildDiff(relays: RelayCache, filters: Array<FlatReqFilter>): Array<BuiltRawReqFilter> {
|
||||
buildDiff(relays: RelayCache, prev: Array<FlatReqFilter>): Array<BuiltRawReqFilter> {
|
||||
const start = unixNowMs();
|
||||
|
||||
const next = this.#builders.flatMap(f => expandFilter(f.filter))
|
||||
const diff = diffFilters(filters, next);
|
||||
const next = this.#builders.flatMap(f => expandFilter(f.filter));
|
||||
const diff = diffFilters(prev, next);
|
||||
const ts = (unixNowMs() - start);
|
||||
this.#log("buildDiff %s %d ms", this.id, ts);
|
||||
if (diff.changed) {
|
||||
@ -205,7 +205,7 @@ export class RequestFilterBuilder {
|
||||
|
||||
tag(key: "e" | "p" | "d" | "t" | "r", value?: Array<string>) {
|
||||
if (!value) return this;
|
||||
this.#filter[`#${key}`] = value;
|
||||
this.#filter[`#${key}`] = appendDedupe(this.#filter[`#${key}`], value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -6,21 +6,23 @@ export function diffFilters(prev: Array<FlatReqFilter>, next: Array<FlatReqFilte
|
||||
const added = [];
|
||||
const removed = [];
|
||||
|
||||
for (let x = 0; x < next.length; x++) {
|
||||
const px = prev.findIndex(a => flatFilterEq(a, next[x]));
|
||||
prev = [...prev];
|
||||
next = [...next];
|
||||
for (const n of next) {
|
||||
const px = prev.findIndex(a => flatFilterEq(a, n));
|
||||
if (px !== -1) {
|
||||
prev.splice(px, 1);
|
||||
} else {
|
||||
added.push(next[x]);
|
||||
added.push(n);
|
||||
}
|
||||
}
|
||||
if (calcRemoved) {
|
||||
for (let x = 0; x < prev.length; x++) {
|
||||
const px = next.findIndex(a => flatFilterEq(a, prev[x]));
|
||||
for (const p of prev) {
|
||||
const px = next.findIndex(a => flatFilterEq(a, p));
|
||||
if (px !== -1) {
|
||||
next.splice(px, 1);
|
||||
} else {
|
||||
removed.push(prev[x]);
|
||||
removed.push(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -86,6 +86,16 @@ export function flatFilterEq(a: FlatReqFilter, b: FlatReqFilter): boolean {
|
||||
&& a["#r"] === b["#r"];
|
||||
}
|
||||
|
||||
export function countMembers(a: any) {
|
||||
let ret = 0;
|
||||
for (const [k, v] of Object.entries(a)) {
|
||||
if (Array.isArray(v)) {
|
||||
ret += v.length;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
export function equalProp(a: string | number | Array<string | number> | undefined, b: string | number | Array<string | number> | undefined) {
|
||||
if ((a !== undefined && b === undefined) || (a === undefined && b !== undefined)) {
|
||||
return false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user