From 693c7cc7bfa5333c8ac64b45466fdc48d23c1c92 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 29 Apr 2023 21:48:22 -0500 Subject: [PATCH] Sign events from app context --- src/api/statuses.ts | 14 ++++++-------- src/event.ts | 21 +++++++++++++++------ src/publisher.ts | 7 ++----- src/sign.ts | 17 +++++++++++++++++ 4 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 src/sign.ts diff --git a/src/api/statuses.ts b/src/api/statuses.ts index 7689b5e..45696cc 100644 --- a/src/api/statuses.ts +++ b/src/api/statuses.ts @@ -1,8 +1,9 @@ import { type AppContext, AppController } from '@/app.ts'; import { validator, z } from '@/deps.ts'; import { type Event } from '@/event.ts'; -import { getAncestors, getDescendants, getEvent } from '../client.ts'; +import { signEvent } from '@/sign.ts'; +import { getAncestors, getDescendants, getEvent } from '../client.ts'; import publish from '../publisher.ts'; import { toStatus } from '../transmute.ts'; @@ -22,22 +23,19 @@ const statusController: AppController = async (c) => { }; const createStatusController = validator('json', async (value, c: AppContext) => { - const pubkey = c.get('pubkey')!; - const seckey = c.get('seckey'); const result = createStatusSchema.safeParse(value); - if (result.success && seckey) { + if (result.success) { const { data } = result; - const event: Event<1> = { + const event = await signEvent<1>({ kind: 1, - pubkey: pubkey, content: data.status, tags: [], created_at: Math.floor(new Date().getTime() / 1000), - }; + }, c); - publish(event, seckey); + publish(event); return c.json(await toStatus(event)); } else { diff --git a/src/event.ts b/src/event.ts index 2b4ff62..f80bd15 100644 --- a/src/event.ts +++ b/src/event.ts @@ -1,13 +1,22 @@ -interface Event { - id?: string; - sig?: string; +interface EventTemplate { kind: K; tags: string[][]; - pubkey: string; content: string; created_at: number; } -type SignedEvent = Event & { id: string; sig: string }; +interface UnsignedEvent extends EventTemplate { + pubkey: string; +} -export type { Event, SignedEvent }; +interface Event extends UnsignedEvent { + id?: string; + sig?: string; +} + +interface SignedEvent extends Event { + id: string; + sig: string; +} + +export type { Event, EventTemplate, SignedEvent, UnsignedEvent }; diff --git a/src/publisher.ts b/src/publisher.ts index f937224..ad74556 100644 --- a/src/publisher.ts +++ b/src/publisher.ts @@ -1,13 +1,10 @@ -import { getEventHash, getSignature } from '@/deps.ts'; -import { type Event } from '@/event.ts'; +import { type SignedEvent } from '@/event.ts'; import { pool } from './client.ts'; import { publishRelays } from './config.ts'; /** Publish an event to the Nostr relay. */ -function publish(event: Event, privatekey: string, relays = publishRelays): void { - event.id = getEventHash(event); - event.sig = getSignature(event, privatekey); +function publish(event: SignedEvent, relays = publishRelays): void { console.log('Publishing event', event); try { pool.publish(event, relays); diff --git a/src/sign.ts b/src/sign.ts new file mode 100644 index 0000000..d781953 --- /dev/null +++ b/src/sign.ts @@ -0,0 +1,17 @@ +import { type AppContext } from '@/app.ts'; +import { getEventHash, getPublicKey, getSignature } from '@/deps.ts'; + +import type { Event, EventTemplate, SignedEvent } from '@/event.ts'; + +/** Sign Nostr event using the app context. */ +async function signEvent(event: EventTemplate, c: AppContext): Promise> { + const seckey = c.get('seckey')!; + + (event as Event).pubkey = getPublicKey(seckey); + (event as Event).id = getEventHash(event as Event); + (event as Event).sig = getSignature(event as Event, seckey); + + return event as SignedEvent; +} + +export { signEvent };