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

47 lines
1.6 KiB
TypeScript

import type { MetadataEvent } from './types'
import { isRecord } from './utils'
export function extractMetadataJsonFromTag(event: MetadataEvent): Record<string, unknown> | null {
const jsonTag = event.tags.find((tag) => tag[0] === 'json')
if (!jsonTag?.[1]) {
return null
}
try {
const parsed: unknown = JSON.parse(jsonTag[1])
return isRecord(parsed) ? parsed : null
} catch (e) {
console.error('[metadataExtractor] Error parsing JSON metadata from tag:', e)
return null
}
}
export function extractMetadataJson(content: string): Record<string, unknown> | null {
const invisibleJsonMatch = content.match(/[\u200B\u200C]\[Metadata JSON\][\u200B\u200C]\n[\u200B\u200C](.+)[\u200B\u200C]$/s)
if (invisibleJsonMatch?.[1]) {
try {
const cleanedJson = invisibleJsonMatch[1].replace(/[\u200B\u200C\u200D\u200E\u200F]/g, '').trim()
const parsed: unknown = JSON.parse(cleanedJson)
return isRecord(parsed) ? parsed : null
} catch (e) {
console.error('[metadataExtractor] Error parsing metadata JSON from invisible content:', e)
}
}
const jsonMatch = content.match(/\[Metadata JSON\]\n(.+)$/s)
if (jsonMatch?.[1]) {
try {
const parsed: unknown = JSON.parse(jsonMatch[1].trim())
return isRecord(parsed) ? parsed : null
} catch (e) {
console.error('[metadataExtractor] Error parsing metadata JSON from content:', e)
return null
}
}
return null
}
export function getMetadataFromEvent(event: MetadataEvent & { content: string }): Record<string, unknown> | null {
return extractMetadataJsonFromTag(event) ?? extractMetadataJson(event.content)
}