bug: profile loading bugs

This commit is contained in:
Kieran 2023-04-04 15:27:49 +01:00
parent 39dbfe1183
commit c515636616
Signed by: Kieran
GPG Key ID: DE71CEB3925BE941
4 changed files with 36 additions and 15 deletions

View File

@ -49,19 +49,34 @@ class UserProfileCache extends FeedCache<MetadataCache> {
*/
async update(m: MetadataCache) {
const existing = this.getFromCache(m.pubkey);
const refresh = existing && existing.created === m.created && existing.loaded < m.loaded;
const refresh = existing && existing.loaded < m.loaded;
const updateType = (() => {
if (!existing) {
return "new_profile";
}
if (existing.created < m.created) {
return "updated_profile";
}
if (refresh) {
return "refresh_profile";
}
return "no_change";
})();
console.debug(`Updating ${m.pubkey} ${updateType}`, m);
if (!existing || existing.created < m.created || refresh) {
// fetch zapper key
const lnurl = m.lud16 || m.lud06;
if (lnurl) {
try {
const svc = new LNURL(lnurl);
await svc.load();
m.zapService = svc.zapperPubkey;
} catch {
console.debug("Failed to load LNURL for zapper pubkey", lnurl);
if (!refresh) {
// fetch zapper key
const lnurl = m.lud16 || m.lud06;
if (lnurl) {
try {
const svc = new LNURL(lnurl);
await svc.load();
m.zapService = svc.zapperPubkey;
} catch {
console.debug("Failed to load LNURL for zapper pubkey", lnurl);
}
// ignored
}
// ignored
}
this.cache.set(m.pubkey, m);

View File

@ -50,13 +50,16 @@ class ProfileLoaderService {
const sub = new RequestBuilder(`profiles`);
sub
.withOptions({
skipDiff: true,
})
.withFilter()
.kinds([EventKind.SetMetadata])
.authors([...missing]);
const q = System.Query<PubkeyReplaceableNoteStore>(PubkeyReplaceableNoteStore, sub);
// never release this callback, it will stop firing anyway after eose
const releaseOnEvent = q.onEvent(async ev => {
q.onEvent(async ev => {
for (const e of ev) {
const profile = mapEventToProfile(e);
if (profile) {
@ -70,8 +73,8 @@ class ProfileLoaderService {
if (!q.loading) {
clearTimeout(timeout);
resolve(q.getSnapshotData() ?? []);
release();
}
release();
});
timeout = setTimeout(() => {
release();
@ -79,7 +82,6 @@ class ProfileLoaderService {
}, 5_000);
});
releaseOnEvent();
const couldNotFetch = [...missing].filter(a => !results.some(b => b.pubkey === a));
if (couldNotFetch.length > 0) {
console.debug("No profiles: ", couldNotFetch);

View File

@ -35,6 +35,10 @@ export interface BuiltRawReqFilter {
export interface RequestBuilderOptions {
leaveOpen?: boolean;
relays?: Array<string>;
/**
* Do not apply diff logic and always use full filters for query
*/
skipDiff?: boolean;
}
/**

View File

@ -218,7 +218,7 @@ export class NostrSystem {
q.unCancel();
const diff = diffFilters(q.request.filters, filters);
if (!diff.changed) {
if (!diff.changed && !req.options?.skipDiff) {
this.#changed();
return unwrap(this.Feeds.get(req.id)) as Readonly<T>;
} else {