2026-01-13 14:49:19 +01:00

69 lines
1.9 KiB
TypeScript

import type { Event } from 'nostr-tools'
export function isRecord(value: unknown): value is Record<string, unknown> {
return typeof value === 'object' && value !== null && !Array.isArray(value)
}
export function readPayerPubkeyFromZapReceipt(event: Event): string | undefined {
const descriptionTag = readTagValue(event, 'description')
if (!descriptionTag) {
return undefined
}
try {
const parsed: unknown = JSON.parse(descriptionTag)
return isRecord(parsed) && typeof parsed.pubkey === 'string' ? parsed.pubkey : undefined
} catch (e) {
console.error('[metadataExtractor] Error parsing zap receipt description tag:', e)
return undefined
}
}
export function firstString(...values: unknown[]): string | undefined {
for (const value of values) {
if (typeof value === 'string') {
return value
}
}
return undefined
}
export function firstNumber(...values: unknown[]): number | undefined {
for (const value of values) {
if (typeof value === 'number') {
return value
}
}
return undefined
}
export function readTagValue(event: Event, key: string): string | undefined {
return event.tags.find((tag) => tag[0] === key)?.[1]
}
export function readZapReceiptKind(event: Event): string | undefined {
if (event.kind !== 9735) {
return undefined
}
return readTagValue(event, 'kind_type')
}
export function readAmountSats(event: Event): number | undefined {
const amountTag = readTagValue(event, 'amount')
if (!amountTag) {
return undefined
}
const millisats = Number.parseInt(amountTag, 10)
if (Number.isNaN(millisats)) {
return undefined
}
return millisats / 1000
}
export function readPaymentHash(event: Event): string {
return readTagValue(event, 'payment_hash') ?? event.id
}
export function resolveSponsoringArticleId(params: { articleTag: string | undefined; eTag: string | undefined }): string | undefined {
return params.articleTag ?? params.eTag
}