nostr-relaypool
Version:
A Nostr RelayPool implementation in TypeScript using only nostr-tools library as a dependency.
288 lines (277 loc) • 7 kB
text/typescript
/* eslint-env jest */
import {mergeSimilarAndRemoveEmptyFilters} from "./merge-similar-filters";
import type {Filter} from "nostr-tools";
test("Merge filters automatically", () => {
let filters: Filter[] = [
{authors: ["pub1"], kinds: [0, 2]},
{ids: ["1"]},
{"#p": ["p1", "p2"]},
{authors: ["pub2"], kinds: [0, 2]},
{ids: ["5"]},
{"#p": ["p2", "p3"]},
];
let result = mergeSimilarAndRemoveEmptyFilters(filters);
expect(result).toEqual([
{authors: ["pub1", "pub2"], kinds: [0, 2]},
{ids: ["1", "5"]},
{"#p": ["p1", "p2", "p3"]},
]);
});
test("Don't merge filters using different relays and different ids", () => {
let filters: (Filter & {relay?: string})[] = [
{ids: ["1"]},
{ids: ["2"], relay: "wss://nostr-dev.wellorder.net/"},
];
let result = mergeSimilarAndRemoveEmptyFilters(filters);
expect(result).toEqual(filters);
});
test("Remove empty filters", () => {
let filters: (Filter & {relay?: string})[] = [
{ids: []},
{authors: [], relay: "wss://nostr-dev.wellorder.net/"},
];
let result = mergeSimilarAndRemoveEmptyFilters(filters);
expect(result).toEqual([]);
});
test("concat error", () => {
let filters: (Filter & {relay?: string})[] = [
{
authors: [
"00000000827ffaa94bfea288c3dfce4422c794fbb96625b6b31e9049f729d700",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"692e7e4b3aa182c35c4346932e4daeb3554fa7e5854244222a0688a405cba107",
],
},
{
authors: [
"887645fef0ce0c3c1218d2f5d8e6132a19304cdc57cd20281d082f38cfea0072",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"8914e1ea4774091b9bb5439d6eef2e4eb95064d618ded5ef473d2e976b782a22",
],
},
{
authors: [
"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"7b91e4aa186780422ffa16671f8e19af7d58281a4a78bd74cfdb56742dae4945",
],
},
{
authors: [
"887645fef0ce0c3c1218d2f5d8e6132a19304cdc57cd20281d082f38cfea0072",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"984acbcbdd9fba397d4537a20d0f2a4dd0bc9a6278e35465f2e3b109087d7ece",
],
},
{
authors: [
"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"7e0e1feef76aa793be725fe5f0f2534c13ea8b8b40c995ea91f70a638aad0eab",
],
},
{
authors: [
"887645fef0ce0c3c1218d2f5d8e6132a19304cdc57cd20281d082f38cfea0072",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"0e329a10e7c2cbce3a206a76a4b4c932426902b3fbb548ae042ca0f38e011ef2",
],
},
{
authors: [
"63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"18f19a4e982bc1058aab98692ad1bb2eb3ac214a21bcd37676ad5d588fc0dd5d",
],
},
{
authors: [
"63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"39b9e6dc5a539debac289c36cb887d90d13d85ed3371d2f1233b9c34c025c4a5",
],
},
{
authors: [
"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"b48d5c8ebac25830779d22f654213f993d939c8159fa53248d3ec69a48a7f20b",
],
},
{
authors: [
"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"04a2825b574a818ee48701f70bd875f8a0c8f7cb07a7286baab0e96577b107f1",
],
},
{
authors: [
"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"d72af132bad9d332c469195cc80b084da54be085cabc33d911d371d64894c033",
],
},
{
authors: [
"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"09c646ebfdcba8f31701ec9a74af65bd230d2c6aeff8388b3cf3171797af2e95",
],
},
{
authors: [
"63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"8fda8ee4d719dfeab389ba13f4e46addcb65dc9ff7ffdd48875ad5889dceb118",
],
},
{
authors: [
"887645fef0ce0c3c1218d2f5d8e6132a19304cdc57cd20281d082f38cfea0072",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"467ea9860198b370b6867102685fb3accf55a592a710806ad938a0fed0879b44",
],
},
{
kinds: [1, 6, 7],
"#e": [
"fb2f0cd0b53557bcc85be2b3430d4c443d907a064968a1485aaa3d39bb010196",
],
},
{
authors: [
"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
],
kinds: [0, 3],
},
{
kinds: [1, 6, 7],
"#e": [
"7e0e1feef76aa793be725fe5f0f2534c13ea8b8b40c995ea91f70a638aad0eab",
],
},
{
authors: [
"00000000827ffaa94bfea288c3dfce4422c794fbb96625b6b31e9049f729d700",
],
kinds: [0, 3],
},
{
authors: [
"00000000827ffaa94bfea288c3dfce4422c794fbb96625b6b31e9049f729d700",
],
kinds: [0, 3],
},
{
authors: [
"887645fef0ce0c3c1218d2f5d8e6132a19304cdc57cd20281d082f38cfea0072",
],
kinds: [0, 3],
},
{
authors: [
"887645fef0ce0c3c1218d2f5d8e6132a19304cdc57cd20281d082f38cfea0072",
],
kinds: [0, 3],
},
];
let _result = mergeSimilarAndRemoveEmptyFilters(filters);
expect(_result.length).toBe(2);
});
test("benchmark_merge", () => {
let filters: Filter[] = [];
for (let i = 0; i < 3000; i++) {
filters.push({authors: [i.toString()], kinds: [0, 2]});
filters.push({ids: [i.toString()]});
filters.push({"#p": [i.toString(), (i + 1).toString()]});
}
let start = Date.now();
let _result = mergeSimilarAndRemoveEmptyFilters(filters);
let time = Date.now() - start;
console.log("mergeSimilarAndRemoveEmptyFilters benchmark", time);
expect(time).toBeLessThan(100);
expect(_result.length).toBe(3);
});
test("merge3", () => {
let filters: Filter[] = [
{authors: ["pub1"], kinds: [0]},
{authors: ["pub2"], kinds: [0]},
{authors: ["pub3"], kinds: [0]},
];
let result = mergeSimilarAndRemoveEmptyFilters(filters);
expect(result.length).toBe(1);
expect(JSON.stringify(result)).toBe(
JSON.stringify([{authors: ["pub1", "pub2", "pub3"], kinds: [0]}])
);
});