refactor: RequestBuilder
This commit is contained in:
43
packages/app/src/System/RequestSplitter.ts
Normal file
43
packages/app/src/System/RequestSplitter.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import { RawReqFilter } from "@snort/nostr";
|
||||
|
||||
export function diffFilters(a: Array<RawReqFilter>, b: Array<RawReqFilter>) {
|
||||
const result: Array<RawReqFilter> = [];
|
||||
let anyChanged = false;
|
||||
for (const [i, bN] of b.entries()) {
|
||||
const prev: Record<string, string | number | string[] | number[] | undefined> = 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<string | number>;
|
||||
const thisArray = v as Array<string | number>;
|
||||
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,
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user