diff --git a/src/controllers/error.ts b/src/controllers/error.ts index fa5e4d32..8c07fc93 100644 --- a/src/controllers/error.ts +++ b/src/controllers/error.ts @@ -1,6 +1,11 @@ import { ErrorHandler } from '@hono/hono'; +import { HTTPException } from '@hono/hono/http-exception'; export const errorHandler: ErrorHandler = (err, c) => { + if (err instanceof HTTPException) { + return c.json({ error: err.message }, err.status); + } + console.error(err); if (err.message === 'canceling statement due to statement timeout') { diff --git a/src/signers/ConnectSigner.ts b/src/signers/ConnectSigner.ts index d4cf6032..6501bb8b 100644 --- a/src/signers/ConnectSigner.ts +++ b/src/signers/ConnectSigner.ts @@ -1,4 +1,5 @@ // deno-lint-ignore-file require-await +import { HTTPException } from '@hono/hono/http-exception'; import { NConnectSigner, NostrEvent, NostrSigner } from '@nostrify/nostrify'; import { Storages } from '@/storages.ts'; @@ -27,30 +28,78 @@ export class ConnectSigner implements NostrSigner { async signEvent(event: Omit): Promise { const signer = await this.signer; - return signer.signEvent(event); + try { + return await signer.signEvent(event); + } catch (e) { + if (e.name === 'AbortError') { + throw new HTTPException(408, { message: 'The event was not signed quickly enough' }); + } else { + throw e; + } + } } readonly nip04 = { encrypt: async (pubkey: string, plaintext: string): Promise => { const signer = await this.signer; - return signer.nip04.encrypt(pubkey, plaintext); + try { + return await signer.nip04.encrypt(pubkey, plaintext); + } catch (e) { + if (e.name === 'AbortError') { + throw new HTTPException(408, { + message: 'Text was not encrypted quickly enough', + }); + } else { + throw e; + } + } }, decrypt: async (pubkey: string, ciphertext: string): Promise => { const signer = await this.signer; - return signer.nip04.decrypt(pubkey, ciphertext); + try { + return await signer.nip04.decrypt(pubkey, ciphertext); + } catch (e) { + if (e.name === 'AbortError') { + throw new HTTPException(408, { + message: 'Text was not decrypted quickly enough', + }); + } else { + throw e; + } + } }, }; readonly nip44 = { encrypt: async (pubkey: string, plaintext: string): Promise => { const signer = await this.signer; - return signer.nip44.encrypt(pubkey, plaintext); + try { + return await signer.nip44.encrypt(pubkey, plaintext); + } catch (e) { + if (e.name === 'AbortError') { + throw new HTTPException(408, { + message: 'Text was not encrypted quickly enough', + }); + } else { + throw e; + } + } }, decrypt: async (pubkey: string, ciphertext: string): Promise => { const signer = await this.signer; - return signer.nip44.decrypt(pubkey, ciphertext); + try { + return await signer.nip44.decrypt(pubkey, ciphertext); + } catch (e) { + if (e.name === 'AbortError') { + throw new HTTPException(408, { + message: 'Text was not decrypted quickly enough', + }); + } else { + throw e; + } + } }, }; diff --git a/src/signers/ReadOnlySigner.ts b/src/signers/ReadOnlySigner.ts index 56c32c45..54449fab 100644 --- a/src/signers/ReadOnlySigner.ts +++ b/src/signers/ReadOnlySigner.ts @@ -7,7 +7,7 @@ export class ReadOnlySigner implements NostrSigner { async signEvent(): Promise { throw new HTTPException(401, { - message: 'Log out and back in', + message: 'Log in with Nostr Connect to sign events', }); }