import type { MetadataEvent } from './types' import { isRecord } from './utils' export function extractMetadataJsonFromTag(event: MetadataEvent): Record | 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 | 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 | null { return extractMetadataJsonFromTag(event) ?? extractMetadataJson(event.content) }