mirror of
https://github.com/nbd-wtf/nostr-tools.git
synced 2025-12-12 18:08:52 +00:00
Add a symbol to verified events
This commit is contained in:
30
event.ts
30
event.ts
@@ -5,6 +5,9 @@ import { bytesToHex } from '@noble/hashes/utils'
|
|||||||
import { getPublicKey } from './keys.ts'
|
import { getPublicKey } from './keys.ts'
|
||||||
import { utf8Encoder } from './utils.ts'
|
import { utf8Encoder } from './utils.ts'
|
||||||
|
|
||||||
|
/** Designates a verified event signature. */
|
||||||
|
export const verifiedSymbol = Symbol('verified')
|
||||||
|
|
||||||
/** @deprecated Use numbers instead. */
|
/** @deprecated Use numbers instead. */
|
||||||
/* eslint-disable no-unused-vars */
|
/* eslint-disable no-unused-vars */
|
||||||
export enum Kind {
|
export enum Kind {
|
||||||
@@ -35,20 +38,26 @@ export enum Kind {
|
|||||||
FileMetadata = 1063,
|
FileMetadata = 1063,
|
||||||
}
|
}
|
||||||
|
|
||||||
export type EventTemplate<K extends number = number> = {
|
export interface Event<K extends number = number> {
|
||||||
kind: K
|
kind: K
|
||||||
tags: string[][]
|
tags: string[][]
|
||||||
content: string
|
content: string
|
||||||
created_at: number
|
created_at: number
|
||||||
}
|
|
||||||
|
|
||||||
export type UnsignedEvent<K extends number = number> = EventTemplate<K> & {
|
|
||||||
pubkey: string
|
pubkey: string
|
||||||
}
|
|
||||||
|
|
||||||
export type Event<K extends number = number> = UnsignedEvent<K> & {
|
|
||||||
id: string
|
id: string
|
||||||
sig: string
|
sig: string
|
||||||
|
[verifiedSymbol]?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export type EventTemplate<K extends number = number> = Pick<Event<K>, 'kind' | 'tags' | 'content' | 'created_at'>
|
||||||
|
export type UnsignedEvent<K extends number = number> = Pick<
|
||||||
|
Event<K>,
|
||||||
|
'kind' | 'tags' | 'content' | 'created_at' | 'pubkey'
|
||||||
|
>
|
||||||
|
|
||||||
|
/** An event whose signature has been verified. */
|
||||||
|
export interface VerifiedEvent<K extends number = number> extends Event<K> {
|
||||||
|
[verifiedSymbol]: true
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getBlankEvent(): EventTemplate<Kind.Blank>
|
export function getBlankEvent(): EventTemplate<Kind.Blank>
|
||||||
@@ -103,9 +112,12 @@ export function validateEvent<T>(event: T): event is T & UnsignedEvent<number> {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
export function verifySignature(event: Event<number>): boolean {
|
/** Verify the event's signature. This function mutates the event with a `verified` symbol, making it idempotent. */
|
||||||
|
export function verifySignature<K extends number>(event: Event<K>): event is VerifiedEvent<K> {
|
||||||
|
if (typeof event[verifiedSymbol] === 'boolean') return event[verifiedSymbol]
|
||||||
try {
|
try {
|
||||||
return schnorr.verify(event.sig, getEventHash(event), event.pubkey)
|
event[verifiedSymbol] = schnorr.verify(event.sig, getEventHash(event), event.pubkey)
|
||||||
|
return event[verifiedSymbol]
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user