From 556ea69dddb027c6f799fb7ba7a6d951cef60fce Mon Sep 17 00:00:00 2001 From: Sandwich <299465+dskvr@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:20:07 +0100 Subject: [PATCH 1/3] add NIP-119 compat --- packages/worker-relay/src/types.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/worker-relay/src/types.ts b/packages/worker-relay/src/types.ts index b5a0a64e..1ed2c9e0 100644 --- a/packages/worker-relay/src/types.ts +++ b/packages/worker-relay/src/types.ts @@ -101,8 +101,8 @@ export function eventMatchesFilter(ev: NostrEvent, filter: ReqFilter) { if (!(filter.kinds?.includes(ev.kind) ?? true)) { return false; } - const tags = Object.entries(filter).filter(([k]) => k.startsWith("#")); - for (const [k, v] of tags) { + const orTags = Object.entries(filter).filter(([k]) => k.startsWith("#")); + for (const [k, v] of orTags) { const vargs = v as Array; for (const x of vargs) { if (!ev.tags.find(a => a[0] === k.slice(1) && a[1] === x)) { @@ -110,6 +110,13 @@ export function eventMatchesFilter(ev: NostrEvent, filter: ReqFilter) { } } } + const andTags = Object.entries(filter).filter(([k]) => k.startsWith("&")); + for (const [k, v] of andTags) { + const allMatch = (v as string[]).every(x => ev.tags.some(tag => tag[0] === k.slice(1) && tag[1] === x)); + if (!allMatch) { + return false; + } + } return true; } From 7002647ffc85338ded3c5b8ef4e7ddcb128e6b08 Mon Sep 17 00:00:00 2001 From: Sandwich <299465+dskvr@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:39:21 +0100 Subject: [PATCH 2/3] emulate code style --- packages/worker-relay/src/types.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/worker-relay/src/types.ts b/packages/worker-relay/src/types.ts index 1ed2c9e0..a04bab7c 100644 --- a/packages/worker-relay/src/types.ts +++ b/packages/worker-relay/src/types.ts @@ -112,7 +112,8 @@ export function eventMatchesFilter(ev: NostrEvent, filter: ReqFilter) { } const andTags = Object.entries(filter).filter(([k]) => k.startsWith("&")); for (const [k, v] of andTags) { - const allMatch = (v as string[]).every(x => ev.tags.some(tag => tag[0] === k.slice(1) && tag[1] === x)); + const vargs = v as Array; + const allMatch = vargs.every(x => ev.tags.some(tag => tag[0] === k.slice(1) && tag[1] === x)); if (!allMatch) { return false; } From 497e12c644527e37515befa057ac1f5dcbd58dc0 Mon Sep 17 00:00:00 2001 From: Sandwich <299465+dskvr@users.noreply.github.com> Date: Thu, 14 Nov 2024 13:14:11 +0100 Subject: [PATCH 3/3] add sql AND tags filter --- packages/worker-relay/src/sqlite/sqlite-relay.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/worker-relay/src/sqlite/sqlite-relay.ts b/packages/worker-relay/src/sqlite/sqlite-relay.ts index 40ba81f8..7e7614e8 100644 --- a/packages/worker-relay/src/sqlite/sqlite-relay.ts +++ b/packages/worker-relay/src/sqlite/sqlite-relay.ts @@ -325,9 +325,9 @@ export class SqliteRelay extends EventEmitter implements Rel operation = "delete"; } let sql = `${operation} from events`; - const tags = Object.entries(req).filter(([k]) => k.startsWith("#")); + const orTags = Object.entries(req).filter(([k]) => k.startsWith("#")); let tx = 0; - for (const [key, values] of tags) { + for (const [key, values] of orTags) { const vArray = values as Array; sql += ` inner join tags t_${tx} on events.id = t_${tx}.event_id and t_${tx}.key = ? and t_${tx}.value in (${this.#repeatParams( vArray.length, @@ -336,6 +336,15 @@ export class SqliteRelay extends EventEmitter implements Rel params.push(...vArray); tx++; } + const andTags = Object.entries(req).filter(([k]) => k.startsWith("&")); + for (const [key, values] of andTags) { + for (const value of values as Array) { + sql += ` inner join tags t_${tx} on events.id = t_${tx}.event_id and t_${tx}.key = ? and t_${tx}.value = ?`; + params.push(key.slice(1)); + params.push(value); + tx++; + } + } if (req.search) { sql += " inner join search_content on search_content.id = events.id"; conditions.push("search_content match ?");