defer loading of relay records (#440)

This commit is contained in:
BlowaterNostr 2024-03-26 16:50:08 +08:00 committed by GitHub
parent 8604dcd405
commit 8d6aa9f043
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 50 additions and 19 deletions

View File

@ -241,6 +241,22 @@ export class App {
forever(sync_kind_1(this.pool, this.database)); forever(sync_kind_1(this.pool, this.database));
} }
(async () => {
await this.database.waitRelayRecordToLoad();
render(
<AppComponent
eventBus={this.eventBus}
model={this.model}
pool={this.pool}
popOverInputChan={this.popOverInputChan}
rightPanelInputChan={this.rightPanelInputChan}
installPrompt={installPrompt}
toastInputChan={this.toastInputChan}
/>,
document.body,
);
})();
// Database // Database
(async () => { (async () => {
let i = 0; let i = 0;

View File

@ -104,9 +104,7 @@ Deno.test("Relay Record", async () => {
await stream.pop(); await stream.pop();
await stream.pop(); await stream.pop();
await stream.pop();
const isCanceled = await sleep(10, stream.pop());
assertEquals(isCanceled, not_cancelled);
}); });
Deno.test("mark removed event", async () => { Deno.test("mark removed event", async () => {

View File

@ -72,8 +72,22 @@ export class Database_View implements ProfileSetter, ProfileGetter, EventRemover
private readonly eventMarker: EventMarker, private readonly eventMarker: EventMarker,
private readonly events: Map<string, Parsed_Event>, private readonly events: Map<string, Parsed_Event>,
private readonly removedEvents: Set<string>, private readonly removedEvents: Set<string>,
private readonly relayRecords: Map<string, Set<string>>, ) {
) {} this.relay_record_loaded = new Promise(async (resolve) => {
const all_records = await relayRecorder.getAllRelayRecords();
for (const [event_id, relays] of all_records.entries()) {
const set = this.relayRecords.get(event_id);
if (set) {
for (const relay of relays) {
set.add(relay);
}
} else {
this.relayRecords.set(event_id, relays);
}
}
resolve(undefined);
});
}
static async New( static async New(
eventsAdapter: EventsAdapter, eventsAdapter: EventsAdapter,
@ -101,9 +115,7 @@ export class Database_View implements ProfileSetter, ProfileGetter, EventRemover
} }
console.log("Datebase_View:parsed", Date.now() - t); console.log("Datebase_View:parsed", Date.now() - t);
const all_removed_events = await eventMarker.getAllMarks(); const all_removed_events = await eventMarker.getAllMarks();
const all_relay_records = await relayAdapter.getAllRelayRecords();
// Construct the View // Construct the View
const db = new Database_View( const db = new Database_View(
eventsAdapter, eventsAdapter,
@ -111,7 +123,6 @@ export class Database_View implements ProfileSetter, ProfileGetter, EventRemover
eventMarker, eventMarker,
initialEvents, initialEvents,
new Set(all_removed_events.map((mark) => mark.event_id)), new Set(all_removed_events.map((mark) => mark.event_id)),
all_relay_records,
); );
console.log("Datebase_View:New time spent", Date.now() - t); console.log("Datebase_View:New time spent", Date.now() - t);
for (const e of db.events.values()) { for (const e of db.events.values()) {
@ -153,6 +164,8 @@ export class Database_View implements ProfileSetter, ProfileGetter, EventRemover
await this.eventMarker.markEvent(id, "removed"); await this.eventMarker.markEvent(id, "removed");
} }
private relayRecords = new Map<string, Set<string>>();
private relay_record_loaded: Promise<void>;
getRelayRecord(eventID: string) { getRelayRecord(eventID: string) {
const relays = this.relayRecords.get(eventID); const relays = this.relayRecords.get(eventID);
if (relays == undefined) { if (relays == undefined) {
@ -161,6 +174,19 @@ export class Database_View implements ProfileSetter, ProfileGetter, EventRemover
return relays; return relays;
} }
private async recordRelay(eventID: string, url: string) {
await this.relayRecorder.setRelayRecord(eventID, url);
const records = this.relayRecords.get(eventID);
if (records) {
const size = records.size;
records.add(url);
return records.size > size;
} else {
this.relayRecords.set(eventID, new Set([url]));
return true;
}
}
getProfilesByText(name: string): Profile_Nostr_Event[] { getProfilesByText(name: string): Profile_Nostr_Event[] {
const result = []; const result = [];
for (const event of this.profiles.values()) { for (const event of this.profiles.values()) {
@ -276,17 +302,8 @@ export class Database_View implements ProfileSetter, ProfileGetter, EventRemover
return res; return res;
} }
private async recordRelay(eventID: string, url: string) { async waitRelayRecordToLoad(): Promise<void> {
await this.relayRecorder.setRelayRecord(eventID, url); return this.relay_record_loaded;
const records = this.relayRecords.get(eventID);
if (records) {
const size = records.size;
records.add(url);
return records.size > size;
} else {
this.relayRecords.set(eventID, new Set([url]));
return true;
}
} }
} }