From a7f2fb06ee11492e552d32125fe06013058daae5 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 17:09:17 -0300 Subject: [PATCH 1/9] feat(relay): send custom error messages - since, until & kind --- src/controllers/nostr/relay.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/controllers/nostr/relay.ts b/src/controllers/nostr/relay.ts index 4d8ab2cb..4f278d64 100644 --- a/src/controllers/nostr/relay.ts +++ b/src/controllers/nostr/relay.ts @@ -77,7 +77,10 @@ function connectStream(socket: WebSocket) { send(['EVENT', subId, event]); } } catch (e) { - if (e instanceof RelayError) { + if ( + e instanceof RelayError || + e.message.slice(-('filter too far into the future'.length)) === 'filter too far into the future' + ) { send(['CLOSED', subId, e.message]); } else { send(['CLOSED', subId, 'error: something went wrong']); From e6c38550c66a668d19b9b27c215ddf4b73b053eb Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 17:15:47 -0300 Subject: [PATCH 2/9] feat: add onError() function hono handler --- src/app.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app.ts b/src/app.ts index 6a2205b4..2e7d8791 100644 --- a/src/app.ts +++ b/src/app.ts @@ -340,6 +340,13 @@ app.get('/', frontendController, indexController); // Fallback app.get('*', publicFiles, staticFiles, frontendController); +app.onError((err, c) => { + if (err.message === 'canceling statement due to statement timeout') { + return c.json({ error: 'Everything will be fine, I mean it. Don\t worry child.' }, 500); + } + return c.json(500); +}); + export default app; export type { AppContext, AppController, AppMiddleware }; From cac5c9c1e0144fc80c20523bb2dfdb5c90611bdb Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 17:17:29 -0300 Subject: [PATCH 3/9] refactor: change timeout error message --- src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 2e7d8791..c47d2579 100644 --- a/src/app.ts +++ b/src/app.ts @@ -342,7 +342,7 @@ app.get('*', publicFiles, staticFiles, frontendController); app.onError((err, c) => { if (err.message === 'canceling statement due to statement timeout') { - return c.json({ error: 'Everything will be fine, I mean it. Don\t worry child.' }, 500); + return c.json({ error: "A timeout happened, don't worry :)" }, 500); } return c.json(500); }); From 360efe089d1799547d9f77e2c94e18c7a238550b Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 17:31:12 -0300 Subject: [PATCH 4/9] test(EventsDB): throw error for large since, until and kinds filter --- src/storages/EventsDB.test.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/storages/EventsDB.test.ts b/src/storages/EventsDB.test.ts index 16b429d4..fe8ffe8a 100644 --- a/src/storages/EventsDB.test.ts +++ b/src/storages/EventsDB.test.ts @@ -191,3 +191,33 @@ Deno.test('inserting replaceable events', async () => { await eventsDB.event(newerEvent); assertEquals(await eventsDB.query([{ kinds: [0] }]), [newerEvent]); }); + +Deno.test("throws a Error when querying an event with a large 'since'", async () => { + const { eventsDB } = await createDB(); + + await assertRejects( + () => eventsDB.query([{ since: 33333333333333 }]), + Error, + 'since filter too far into the future', + ); +}); + +Deno.test("throws a Error when querying an event with a large 'until'", async () => { + const { eventsDB } = await createDB(); + + await assertRejects( + () => eventsDB.query([{ until: 66666666666666 }]), + Error, + 'until filter too far into the future', + ); +}); + +Deno.test("throws a Error when querying an event with a large 'kind'", async () => { + const { eventsDB } = await createDB(); + + await assertRejects( + () => eventsDB.query([{ kinds: [99999999999999] }]), + Error, + 'kind filter too far into the future', + ); +}); From a868512188bdc8af2c1e28fdb1a6866df8347b01 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 18:38:16 -0300 Subject: [PATCH 5/9] refactor: error messages in app.onError() --- src/app.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app.ts b/src/app.ts index c47d2579..4c0ffc7e 100644 --- a/src/app.ts +++ b/src/app.ts @@ -342,9 +342,9 @@ app.get('*', publicFiles, staticFiles, frontendController); app.onError((err, c) => { if (err.message === 'canceling statement due to statement timeout') { - return c.json({ error: "A timeout happened, don't worry :)" }, 500); + return c.json({ error: 'The server was unable to respond in a timely manner' }, 500); } - return c.json(500); + return c.json({ error: 'Something went wrong' }, 500); }); export default app; From 2d017e81026078b9c9c399d10e6afc10817c27a5 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 18:39:22 -0300 Subject: [PATCH 6/9] refactor(relay): remove invalid filter condition --- src/controllers/nostr/relay.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/controllers/nostr/relay.ts b/src/controllers/nostr/relay.ts index 4f278d64..f4193379 100644 --- a/src/controllers/nostr/relay.ts +++ b/src/controllers/nostr/relay.ts @@ -78,8 +78,7 @@ function connectStream(socket: WebSocket) { } } catch (e) { if ( - e instanceof RelayError || - e.message.slice(-('filter too far into the future'.length)) === 'filter too far into the future' + e instanceof RelayError ) { send(['CLOSED', subId, e.message]); } else { From e169749b8279943bef8f63cb8c3046c7f6c4fd09 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 18:39:55 -0300 Subject: [PATCH 7/9] refactor(EventsDB): throw RelayError instead of Error --- src/storages/EventsDB.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/storages/EventsDB.ts b/src/storages/EventsDB.ts index 69959fc0..ce74f20d 100644 --- a/src/storages/EventsDB.ts +++ b/src/storages/EventsDB.ts @@ -147,14 +147,14 @@ class EventsDB implements NStore { for (const filter of filters) { if (filter.since && filter.since >= 2_147_483_647) { - throw new Error('since filter too far into the future'); + throw new RelayError('invalid', 'since filter too far into the future'); } if (filter.until && filter.until >= 2_147_483_647) { - throw new Error('until filter too far into the future'); + throw new RelayError('invalid', 'until filter too far into the future'); } for (const kind of filter.kinds ?? []) { if (kind >= 2_147_483_647) { - throw new Error('kind filter too far into the future'); + throw new RelayError('invalid', 'kind filter too far into the future'); } } } From d3c3ecfd35abc783cac8263062a0d564ae857e35 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 18:40:21 -0300 Subject: [PATCH 8/9] test(EventsDB): refactor to use RelayError instead of Error --- src/storages/EventsDB.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/storages/EventsDB.test.ts b/src/storages/EventsDB.test.ts index fe8ffe8a..32838fa6 100644 --- a/src/storages/EventsDB.test.ts +++ b/src/storages/EventsDB.test.ts @@ -192,32 +192,32 @@ Deno.test('inserting replaceable events', async () => { assertEquals(await eventsDB.query([{ kinds: [0] }]), [newerEvent]); }); -Deno.test("throws a Error when querying an event with a large 'since'", async () => { +Deno.test("throws a RelayError when querying an event with a large 'since'", async () => { const { eventsDB } = await createDB(); await assertRejects( () => eventsDB.query([{ since: 33333333333333 }]), - Error, + RelayError, 'since filter too far into the future', ); }); -Deno.test("throws a Error when querying an event with a large 'until'", async () => { +Deno.test("throws a RelayError when querying an event with a large 'until'", async () => { const { eventsDB } = await createDB(); await assertRejects( () => eventsDB.query([{ until: 66666666666666 }]), - Error, + RelayError, 'until filter too far into the future', ); }); -Deno.test("throws a Error when querying an event with a large 'kind'", async () => { +Deno.test("throws a RelayError when querying an event with a large 'kind'", async () => { const { eventsDB } = await createDB(); await assertRejects( () => eventsDB.query([{ kinds: [99999999999999] }]), - Error, + RelayError, 'kind filter too far into the future', ); }); From ba290354138fa32fc6f948651378f40c674c526a Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 2 Jul 2024 18:43:28 -0300 Subject: [PATCH 9/9] refactor: put conditional into just one line --- src/controllers/nostr/relay.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/controllers/nostr/relay.ts b/src/controllers/nostr/relay.ts index f4193379..4d8ab2cb 100644 --- a/src/controllers/nostr/relay.ts +++ b/src/controllers/nostr/relay.ts @@ -77,9 +77,7 @@ function connectStream(socket: WebSocket) { send(['EVENT', subId, event]); } } catch (e) { - if ( - e instanceof RelayError - ) { + if (e instanceof RelayError) { send(['CLOSED', subId, e.message]); } else { send(['CLOSED', subId, 'error: something went wrong']);