mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-11-04 11:52:25 +00:00
Optimize channel profile event lookup with author index
- Replaced `NostrClient.rawEvents` standard Map with `EventsMap` - Implemented `EventsMap` to maintain an author-based index - Updated `js/channelProfile.js` to use `getEventsByAuthor` for efficient lookup - Added unit tests for `EventsMap` - Added benchmark script verifying ~15x performance improvement (637ms -> 41ms for 1M events) Co-authored-by: PR0M3TH3AN <[email protected]>
This commit is contained in:
1 parent
566c2dbf89
commit
67aa8ad2aa
5 files changed
+282
-5
No files matched your search
@@ -0,0 +1,79 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert';
|
||||
import { EventsMap } from '../../js/nostr/eventsMap.js';
|
||||
|
||||
test('EventsMap functionality', async (t) => {
|
||||
await t.test('indexes events by author on set', () => {
|
||||
const map = new EventsMap();
|
||||
const event1 = { id: '1', pubkey: 'abc', kind: 1 };
|
||||
const event2 = { id: '2', pubkey: 'abc', kind: 1 };
|
||||
const event3 = { id: '3', pubkey: 'def', kind: 1 };
|
||||
|
||||
map.set(event1.id, event1);
|
||||
map.set(event2.id, event2);
|
||||
map.set(event3.id, event3);
|
||||
|
||||
const abcEvents = map.getEventsByAuthor('abc');
|
||||
assert.strictEqual(abcEvents.length, 2);
|
||||
assert.ok(abcEvents.includes(event1));
|
||||
assert.ok(abcEvents.includes(event2));
|
||||
|
||||
const defEvents = map.getEventsByAuthor('def');
|
||||
assert.strictEqual(defEvents.length, 1);
|
||||
assert.ok(defEvents.includes(event3));
|
||||
});
|
||||
|
||||
await t.test('updates index on delete', () => {
|
||||
const map = new EventsMap();
|
||||
const event1 = { id: '1', pubkey: 'abc', kind: 1 };
|
||||
map.set(event1.id, event1);
|
||||
|
||||
assert.strictEqual(map.getEventsByAuthor('abc').length, 1);
|
||||
|
||||
map.delete(event1.id);
|
||||
assert.strictEqual(map.getEventsByAuthor('abc').length, 0);
|
||||
});
|
||||
|
||||
await t.test('updates index on overwrite with different object', () => {
|
||||
const map = new EventsMap();
|
||||
const event1 = { id: '1', pubkey: 'abc', kind: 1 };
|
||||
const event1Update = { id: '1', pubkey: 'abc', kind: 1, content: 'update' };
|
||||
|
||||
map.set(event1.id, event1);
|
||||
assert.ok(map.getEventsByAuthor('abc').includes(event1));
|
||||
|
||||
map.set(event1.id, event1Update);
|
||||
const abcEvents = map.getEventsByAuthor('abc');
|
||||
assert.strictEqual(abcEvents.length, 1);
|
||||
assert.ok(abcEvents.includes(event1Update));
|
||||
assert.ok(!abcEvents.includes(event1));
|
||||
});
|
||||
|
||||
await t.test('clears index on clear', () => {
|
||||
const map = new EventsMap();
|
||||
const event1 = { id: '1', pubkey: 'abc', kind: 1 };
|
||||
map.set(event1.id, event1);
|
||||
|
||||
map.clear();
|
||||
assert.strictEqual(map.getEventsByAuthor('abc').length, 0);
|
||||
assert.strictEqual(map.size, 0);
|
||||
});
|
||||
|
||||
await t.test('normalizes pubkeys', () => {
|
||||
const map = new EventsMap();
|
||||
const event1 = { id: '1', pubkey: 'ABC', kind: 1 };
|
||||
map.set(event1.id, event1);
|
||||
|
||||
assert.strictEqual(map.getEventsByAuthor('abc').length, 1);
|
||||
assert.strictEqual(map.getEventsByAuthor('ABC').length, 1);
|
||||
assert.strictEqual(map.getEventsByAuthor(' abc ').length, 1);
|
||||
});
|
||||
|
||||
await t.test('handles non-event objects gracefully', () => {
|
||||
const map = new EventsMap();
|
||||
map.set('1', null);
|
||||
map.set('2', { foo: 'bar' }); // No pubkey
|
||||
|
||||
assert.strictEqual(map.getEventsByAuthor('undefined').length, 0);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user