69 lines
1.9 KiB
TypeScript
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
|
|
}
|