/** Parsed imeta entry from NIP-94 tags. */ export interface ImetaEntry { url: string; thumbnail?: string; mime?: string; /** Summary text (used as webxdc app name for webxdc attachments). */ summary?: string; /** Webxdc session UUID — present when the attachment is a stateful webxdc app. */ webxdc?: string; /** Pixel dimensions from NIP-94 `dim` tag, e.g. "1280x720". */ dim?: string; /** Blurhash placeholder from NIP-94 `blurhash` tag. */ blurhash?: string; } /** Parse all imeta tags into a map keyed by URL. Works for any event kind. */ export function parseImetaMap(tags: string[][]): Map { const map = new Map(); for (const tag of tags) { if (tag[0] !== 'imeta') continue; const entry: Record = {}; for (let i = 1; i < tag.length; i++) { const part = tag[i]; const spaceIdx = part.indexOf(' '); if (spaceIdx === -1) continue; const key = part.slice(0, spaceIdx); const value = part.slice(spaceIdx + 1); entry[key] = value; } if (entry.url) { map.set(entry.url, { url: entry.url, thumbnail: entry.image, mime: entry.m, summary: entry.summary, webxdc: entry.webxdc, dim: entry.dim, blurhash: entry.blurhash, }); } } return map; }