# Nostr Events The Events module provides comprehensive type definitions and utilities for working with Nostr events, including helper functions for event creation, validation, and manipulation. ## Event Types Hierarchy ```typescript // Base event with content and tags interface EventContent { tags: string[][] content: string } // Base event with kind interface EventTemplate extends EventContent { kind: number } // Event with timestamp interface StampedEvent extends EventTemplate { created_at: number } // Event with author interface OwnedEvent extends StampedEvent { pubkey: string } // Event with ID interface HashedEvent extends OwnedEvent { id: string } // Event with signature interface SignedEvent extends HashedEvent { sig: string [verifiedSymbol]?: boolean } // Event with wrapped content interface UnwrappedEvent extends HashedEvent { wrap: SignedEvent } // Event that can be either signed or wrapped type TrustedEvent = HashedEvent & { sig?: string wrap?: SignedEvent [verifiedSymbol]?: boolean } ``` ## Event Creation ### Create Basic Event ```typescript import { createEvent } from '@welshman/util' const event = createEvent( 1, // kind { content: "Hello Nostr!", tags: [["t", "nostr"]], created_at: now() // Optional, defaults to current time } ) ``` ## Type Guards ```typescript // Check event types isEventTemplate(event): boolean isStampedEvent(event): boolean isOwnedEvent(event): boolean isHashedEvent(event): boolean isSignedEvent(event): boolean isUnwrappedEvent(event): boolean isTrustedEvent(event): boolean ``` ## Event Type Conversion ```typescript // Convert to specific event types asEventTemplate(event): EventTemplate asStampedEvent(event): StampedEvent asOwnedEvent(event): OwnedEvent asHashedEvent(event): HashedEvent asSignedEvent(event): SignedEvent asUnwrappedEvent(event): UnwrappedEvent asTrustedEvent(event): TrustedEvent ``` ## Event Utilities ### Event Validation ```typescript // Check if event has valid signature hasValidSignature(event: SignedEvent): boolean // Get event identifier (d tag) getIdentifier(event: EventTemplate): string | undefined ``` ### Event References ```typescript // Get event ID or address getIdOrAddress(event: HashedEvent): string // Get both ID and address (if replaceable) getIdAndAddress(event: HashedEvent): string[] ``` ### Event Type Checking ```typescript // Check event properties isEphemeral(event: EventTemplate): boolean isReplaceable(event: EventTemplate): boolean isPlainReplaceable(event: EventTemplate): boolean isParameterizedReplaceable(event: EventTemplate): boolean ``` ### Thread & Reply Handling ```typescript // Get thread information getAncestors(event: EventTemplate): { roots: string[], replies: string[] } // Get parent references getParentIdsAndAddrs(event: EventTemplate): string[] getParentIdOrAddr(event: EventTemplate): string | undefined getParentId(event: EventTemplate): string | undefined getParentAddr(event: EventTemplate): string | undefined // Check reply relationship isChildOf(child: EventTemplate, parent: HashedEvent): boolean ``` ## Examples ### Creating and Processing Events ```typescript // Create new event const event = createEvent(1, { content: "Hello world!", tags: [["t", "greeting"]] }) // Process based on type if (isSignedEvent(event)) { // Handle signed event if (hasValidSignature(event)) { processValidEvent(event) } } else if (isUnwrappedEvent(event)) { // Handle wrapped event processWrappedEvent(event) } ``` ### Working with Threads ```typescript // Get thread context const ancestors = getAncestors(event) const rootId = ancestors.roots[0] const replyTo = ancestors.replies[0] // Check threading if (isChildOf(event, parentEvent)) { // Handle reply } ``` ### Type Conversion ```typescript // Convert to needed type const template = asEventTemplate(event) const stamped = asStampedEvent(event) const owned = asOwnedEvent(event) const hashed = asHashedEvent(event) const signed = asSignedEvent(event) ```