UNPKG

nostr-relaypool

Version:

A Nostr RelayPool implementation in TypeScript using only nostr-tools library as a dependency.

288 lines (277 loc) 7 kB
/* 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]}]) ); });