import { RawReqFilter } from "@snort/nostr"; export function diffFilters(a: Array, b: Array) { const result: Array = []; let anyChanged = false; for (const [i, bN] of b.entries()) { const prev: Record = a[i]; if (!prev) { result.push(bN); anyChanged = true; } else { // Critical keys changing means the entire filter has changed const criticalKeys = ["since", "until", "limit"]; let anyCriticalKeyChanged = false; for (const [k, v] of Object.entries(bN)) { if (Array.isArray(v)) { const prevArray = prev[k] as Array; const thisArray = v as Array; const added = thisArray.filter(a => !prevArray.includes(a)); // support adding new values to array, removing values is ignored since we only care about getting new values result[i] = { ...result[i], [k]: added.length === 0 ? prevArray : added }; if (added.length > 0) { anyChanged = true; } } else if (prev[k] !== v) { result[i] = { ...result[i], [k]: v }; if (criticalKeys.includes(k)) { anyCriticalKeyChanged = anyChanged = true; break; } } } if (anyCriticalKeyChanged) { result[i] = bN; } } } return { filters: result, changed: anyChanged, }; }