From 9996e5bbd5570b58e7975271158fb3be62a2d09a Mon Sep 17 00:00:00 2001 From: = <=> Date: Thu, 9 Mar 2023 21:51:20 +0000 Subject: [PATCH] refactor RelayManagement --- src/RelayManagement.ts | 27 ++++++++----------- src/fetchEvents.test.ts | 57 ++++++++++++++++++++++++++--------------- src/fetchEvents.ts | 8 +++--- 3 files changed, 51 insertions(+), 41 deletions(-) diff --git a/src/RelayManagement.ts b/src/RelayManagement.ts index 009fee3..8ad12bb 100644 --- a/src/RelayManagement.ts +++ b/src/RelayManagement.ts @@ -1,30 +1,25 @@ import { Event, SimplePool } from 'nostr-tools'; const pool = new SimplePool(); -let currentrelays = [ - 'wss://relay.damus.io', - 'wss://nostr-pub.wellorder.net', - 'wss://nostr-relay.wlvs.space', -]; -export const requestMyProfileFromRelays = async ( - pubkey:string, +export const requestEventsFromRelays = async ( + pubkeys:string[], eventProcesser: (event: Event) => void, - relays?:string[], + relays:string[], + kinds: number[], ) => { - if (relays) currentrelays = relays; const sub = pool.sub( - currentrelays, + relays, [{ - kinds: [0, 2, 10002, 3], - authors: [pubkey], + kinds, + authors: pubkeys, }], ); return new Promise((r) => { sub.on('event', (event:Event) => { if ( - event.pubkey === pubkey - && (event.kind === 0 || event.kind === 2 || event.kind === 10002 || event.kind === 3) + pubkeys.indexOf(event.pubkey) !== -1 + && kinds.indexOf(event.kind) !== -1 ) { eventProcesser(event); } @@ -35,8 +30,8 @@ export const requestMyProfileFromRelays = async ( }); }; -export const publishEventToRelay = async (event:Event):Promise => { - const pub = pool.publish(currentrelays, event); +export const publishEventToRelay = async (event:Event, relays:string[]):Promise => { + const pub = pool.publish(relays, event); return new Promise((r) => { pub.on('ok', () => r(true)); pub.on('failed', () => r(false)); diff --git a/src/fetchEvents.test.ts b/src/fetchEvents.test.ts index c3dc1ea..54354d5 100644 --- a/src/fetchEvents.test.ts +++ b/src/fetchEvents.test.ts @@ -161,14 +161,14 @@ describe('', () => { describe('fetchMyProfileEvents', () => { const fetchCachedProfileEventSpy = jest.spyOn(FetchEvents, 'fetchCachedProfileEvent'); const mockEventProcessor = jest.fn(); - const mockrequestMyProfileFromRelays = jest.spyOn(RelayManagement, 'requestMyProfileFromRelays'); + const mockrequestEventsFromRelays = jest.spyOn(RelayManagement, 'requestEventsFromRelays'); const mockupdateLastFetchDate = jest.spyOn(FetchEvents, 'updateLastFetchDate'); const mocklastFetchDate = jest.spyOn(FetchEvents, 'lastFetchDate'); const mockisUptodate = jest.spyOn(FetchEvents, 'isUptodate'); beforeEach(async () => { fetchCachedProfileEventSpy.mockReset(); mockEventProcessor.mockReset(); - mockrequestMyProfileFromRelays.mockReset(); + mockrequestEventsFromRelays.mockReset(); mockupdateLastFetchDate.mockReset(); mocklastFetchDate.mockReset(); mockisUptodate.mockReset(); @@ -185,8 +185,8 @@ describe('', () => { }); await fetchMyProfileEvents(SampleEvents.kind0.pubkey, mockEventProcessor); }); - test('requestMyProfileFromRelays never called', () => { - expect(mockrequestMyProfileFromRelays).toBeCalledTimes(0); + test('requestEventsFromRelays never called', () => { + expect(mockrequestEventsFromRelays).toBeCalledTimes(0); }); test('updateLastFetchDate never called', () => { expect(mockupdateLastFetchDate).toBeCalledTimes(0); @@ -208,7 +208,7 @@ describe('', () => { describe('and when cached 10002 event is present', () => { const doBefore = async () => { mockisUptodate.mockReturnValue(false); - mockrequestMyProfileFromRelays.mockReset() + mockrequestEventsFromRelays.mockReset() .mockImplementation(async (_pubkey, eventProcessor) => { eventProcessor({ ...SampleEvents.kind0 }); eventProcessor({ ...SampleEvents.kind3 }); @@ -223,7 +223,7 @@ describe('', () => { ], }); await doBefore(); - expect(mockrequestMyProfileFromRelays).toBeCalledWith( + expect(mockrequestEventsFromRelays).toBeCalledWith( expect.anything(), expect.anything(), [ @@ -232,6 +232,7 @@ describe('', () => { 'wss://nostr-pub.wellorder.net', 'wss://nostr.mutinywallet.com', ], + expect.anything(), ); }); test('2 write relays function called with custom relays and 1 default relays + blaster', async () => { @@ -243,7 +244,7 @@ describe('', () => { ], }); await doBefore(); - expect(mockrequestMyProfileFromRelays).toBeCalledWith( + expect(mockrequestEventsFromRelays).toBeCalledWith( expect.anything(), expect.anything(), [ @@ -252,6 +253,7 @@ describe('', () => { 'wss://relay.damus.io', 'wss://nostr.mutinywallet.com', ], + expect.anything(), ); }); test('2 write relays including first defauly relay. function called with custom relays and 1 different default relays + blaster', async () => { @@ -263,7 +265,7 @@ describe('', () => { ], }); await doBefore(); - expect(mockrequestMyProfileFromRelays).toBeCalledWith( + expect(mockrequestEventsFromRelays).toBeCalledWith( expect.anything(), expect.anything(), [ @@ -272,6 +274,7 @@ describe('', () => { 'wss://nostr-pub.wellorder.net', 'wss://nostr.mutinywallet.com', ], + expect.anything(), ); }); test('with 4 write relays function called with all custom relays + blaster', async () => { @@ -285,7 +288,7 @@ describe('', () => { ], }); await doBefore(); - expect(mockrequestMyProfileFromRelays).toBeCalledWith( + expect(mockrequestEventsFromRelays).toBeCalledWith( expect.anything(), expect.anything(), [ @@ -295,6 +298,7 @@ describe('', () => { 'wss://alicerelay.example3.com', 'wss://nostr.mutinywallet.com', ], + expect.anything(), ); }); test('custom read relays ignored', async () => { @@ -308,7 +312,7 @@ describe('', () => { ], }); await doBefore(); - expect(mockrequestMyProfileFromRelays).toBeCalledWith( + expect(mockrequestEventsFromRelays).toBeCalledWith( expect.anything(), expect.anything(), [ @@ -317,6 +321,7 @@ describe('', () => { 'wss://expensive-relay.example2.com', 'wss://nostr.mutinywallet.com', ], + expect.anything(), ); }); }); @@ -324,7 +329,7 @@ describe('', () => { const mockstoreMyProfileEvent = jest.spyOn(FetchEvents, 'storeMyProfileEvent'); beforeEach(async () => { mockisUptodate.mockReturnValue(false); - mockrequestMyProfileFromRelays.mockReset() + mockrequestEventsFromRelays.mockReset() .mockImplementation(async (_pubkey, eventProcessor) => { eventProcessor({ ...SampleEvents.kind0 }); eventProcessor({ ...SampleEvents.kind3 }); @@ -337,18 +342,19 @@ describe('', () => { test('fetchCachedProfileEvent only to be called once to getRelays', () => { expect(fetchCachedProfileEventSpy).toBeCalledTimes(1); }); - test('requestMyProfileFromRelays called', () => { - expect(mockrequestMyProfileFromRelays).toBeCalledTimes(1); + test('requestEventsFromRelays called', () => { + expect(mockrequestEventsFromRelays).toBeCalledTimes(1); }); - test('mockrequestMyProfileFromRelays called with correct pubkey', () => { - expect(mockrequestMyProfileFromRelays).toBeCalledWith( - SampleEvents.kind0.pubkey, + test('mockrequestEventsFromRelays called with correct pubkey', () => { + expect(mockrequestEventsFromRelays).toBeCalledWith( + [SampleEvents.kind0.pubkey], + expect.anything(), expect.anything(), expect.anything(), ); }); - test('mockrequestMyProfileFromRelays called with correct default relays', () => { - expect(mockrequestMyProfileFromRelays).toBeCalledWith( + test('mockrequestEventsFromRelays called with correct default relays', () => { + expect(mockrequestEventsFromRelays).toBeCalledWith( expect.anything(), expect.anything(), [ @@ -357,17 +363,26 @@ describe('', () => { 'wss://nostr-relay.wlvs.space', 'wss://nostr.mutinywallet.com', ], + expect.anything(), ); }); - test('eventProcessor called with events passed through by requestMyProfileFromRelays\'s event processor', async () => { + test('mockrequestEventsFromRelays called with correct kind 0, 2 10002, 3', () => { + expect(mockrequestEventsFromRelays).toBeCalledWith( + expect.anything(), + expect.anything(), + expect.anything(), + [0, 2, 10002, 3], + ); + }); + test('eventProcessor called with events passed through by requestEventsFromRelays\'s event processor', async () => { expect(mockEventProcessor).toBeCalledWith({ ...SampleEvents.kind0 }); expect(mockEventProcessor).toBeCalledWith({ ...SampleEvents.kind3 }); }); - test('storeMyProfileEvent called with events passed through by requestMyProfileFromRelays\'s event processor', async () => { + test('storeMyProfileEvent called with events passed through by requestEventsFromRelays\'s event processor', async () => { expect(mockstoreMyProfileEvent).toBeCalledWith({ ...SampleEvents.kind0 }); expect(mockstoreMyProfileEvent).toBeCalledWith({ ...SampleEvents.kind3 }); }); - test('eventProcessor not called when profile event kind isn\'t found by requestMyProfileFromRelays', async () => { + test('eventProcessor not called when profile event kind isn\'t found by requestEventsFromRelays', async () => { expect(mockEventProcessor).toBeCalledTimes(2); }); }); diff --git a/src/fetchEvents.ts b/src/fetchEvents.ts index 44d990f..26a05c8 100644 --- a/src/fetchEvents.ts +++ b/src/fetchEvents.ts @@ -1,6 +1,6 @@ import { Event, UnsignedEvent } from 'nostr-tools'; import { localStorageGetItem, localStorageSetItem } from './LocalStorage'; -import { publishEventToRelay, requestMyProfileFromRelays } from './RelayManagement'; +import { publishEventToRelay, requestEventsFromRelays } from './RelayManagement'; export const lastFetchDate = ():number | null => { const d = localStorageGetItem('my-profile-last-fetch-date'); @@ -114,10 +114,10 @@ export const fetchMyProfileEvents = async ( ): Promise => { // get events from relays, store them and run profileEventProcesser if (!isUptodate()) { - await requestMyProfileFromRelays(pubkey, (event: Event) => { + await requestEventsFromRelays([pubkey], (event: Event) => { storeMyProfileEvent(event); profileEventProcesser(event); - }, getRelays()); + }, getRelays(), [0, 2, 10002, 3]); // update last-fetch-from-relays date updateLastFetchDate(); } else { @@ -130,7 +130,7 @@ export const fetchMyProfileEvents = async ( }; export const publishEvent = async (event:Event):Promise => { - const r = await publishEventToRelay(event); + const r = await publishEventToRelay(event, getRelays()); if (r) storeMyProfileEvent(event); return r; };