From a55fb8465fb2b96dcbce61ec789759bf49ad4013 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 9 Jun 2023 23:00:57 -0300 Subject: [PATCH] mergeFilters() --- filter.test.ts | 37 +++++++++++++++++++++++++++++++++---- filter.ts | 34 ++++++++++++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/filter.test.ts b/filter.test.ts index 35744ec..b7f9cea 100644 --- a/filter.test.ts +++ b/filter.test.ts @@ -1,4 +1,4 @@ -import {matchFilter, matchFilters} from './filter.ts' +import {matchFilter, matchFilters, mergeFilters} from './filter.ts' import {buildEvent} from './test-helpers.ts' describe('Filter', () => { @@ -18,7 +18,7 @@ describe('Filter', () => { kind: 1, pubkey: 'abc', created_at: 150, - tags: [['tag', 'value']], + tags: [['tag', 'value']] }) const result = matchFilter(filter, event) @@ -162,7 +162,12 @@ describe('Filter', () => { {authors: ['abc'], limit: 3} ] - const event = buildEvent({id: '123', kind: 1, pubkey: 'abc', created_at: 150}) + const event = buildEvent({ + id: '123', + kind: 1, + pubkey: 'abc', + created_at: 150 + }) const result = matchFilters(filters, event) @@ -189,11 +194,35 @@ describe('Filter', () => { {kinds: [1], limit: 2}, {authors: ['abc'], limit: 3} ] - const event = buildEvent({id: '456', kind: 2, pubkey: 'def', created_at: 200}) + const event = buildEvent({ + id: '456', + kind: 2, + pubkey: 'def', + created_at: 200 + }) const result = matchFilters(filters, event) expect(result).toEqual(false) }) }) + + describe('mergeFilters', () => { + it('should merge filters', () => { + expect( + mergeFilters( + {ids: ['a', 'b'], limit: 3}, + {authors: ['x'], ids: ['b', 'c']} + ) + ).toEqual({ids: ['a', 'b', 'c'], limit: 3, authors: ['x']}) + + expect( + mergeFilters( + {kinds: [1], since: 15, until: 30}, + {since: 10, kinds: [7], until: 15}, + {kinds: [9, 10]} + ) + ).toEqual({kinds: [1, 7, 9, 10], since: 10, until: 30}) + }) + }) }) diff --git a/filter.ts b/filter.ts index f233a34..d6fe610 100644 --- a/filter.ts +++ b/filter.ts @@ -56,3 +56,37 @@ export function matchFilters( } return false } + +export function mergeFilters(...filters: Filter[]): Filter { + let result: Filter = {} + for (let i = 0; i < filters.length; i++) { + let filter = filters[i] + Object.entries(filter).forEach(([property, values]) => { + if ( + property === 'kinds' || + property === 'ids' || + property === 'authors' || + property[0] === '#' + ) { + // @ts-ignore + result[property] = result[property] || [] + // @ts-ignore + for (let v = 0; v < values.length; v++) { + // @ts-ignore + let value = values[v] + // @ts-ignore + if (!result[property].includes(value)) result[property].push(value) + } + } + }) + + if (filter.limit && (!result.limit || filter.limit > result.limit)) + result.limit = filter.limit + if (filter.until && (!result.until || filter.until > result.until)) + result.until = filter.until + if (filter.since && (!result.since || filter.since < result.since)) + result.since = filter.since + } + + return result +} diff --git a/package.json b/package.json index 79fc0c0..dc028c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nostr-tools", - "version": "1.11.2", + "version": "1.12.0", "description": "Tools for making a Nostr client.", "repository": { "type": "git",