47 lines
1.6 KiB
TypeScript
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)
|
|
}
|