diff --git a/docs/util/blossom.md b/docs/util/blossom.md index 66ce9d1..a16064c 100644 --- a/docs/util/blossom.md +++ b/docs/util/blossom.md @@ -84,7 +84,7 @@ const authEvent = makeBlossomAuthEvent({ }) // Sign the auth event with your signer -const signedAuthEvent = await signer.signEvent(authEvent) +const signedAuthEvent = await signer.sign(authEvent) // Upload a file const file = new File(["Hello world"], "hello.txt", { type: "text/plain" }) diff --git a/docs/util/events.md b/docs/util/events.md index 39f213d..a4ffa9e 100644 --- a/docs/util/events.md +++ b/docs/util/events.md @@ -87,6 +87,9 @@ export declare const getIdentifier: (e: EventTemplate) => string | undefined; export declare const getIdOrAddress: (e: HashedEvent) => string; export declare const getIdAndAddress: (e: HashedEvent) => string[]; +// Event deduplication by id or address +export declare const deduplicateEvents: (e: TrustedEvent) => TrustedEvent[]; + // Event type checking export declare const isEphemeral: (e: EventTemplate) => boolean; export declare const isReplaceable: (e: EventTemplate) => boolean; diff --git a/package.json b/package.json index 3d8a0a2..89675ac 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@welshman", "private": true, - "version": "0.4.6", + "version": "0.4.7", "workspaces": [ "packages/*" ], diff --git a/packages/app/package.json b/packages/app/package.json index 6a1195a..9638a48 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/app", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "A collection of svelte stores for use in building nostr client applications.", diff --git a/packages/content/package.json b/packages/content/package.json index d31e37a..a2b3e47 100644 --- a/packages/content/package.json +++ b/packages/content/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/content", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities for parsing nostr note content.", diff --git a/packages/editor/package.json b/packages/editor/package.json index 3a136a2..bc4e5b6 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/editor", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "A batteries-included nostr editor.", diff --git a/packages/feeds/package.json b/packages/feeds/package.json index c5dde58..3312919 100644 --- a/packages/feeds/package.json +++ b/packages/feeds/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/feeds", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "Utilities for building dynamic nostr feeds.", diff --git a/packages/lib/package.json b/packages/lib/package.json index 60a87d9..e95a5a9 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/lib", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities.", diff --git a/packages/net/package.json b/packages/net/package.json index 7c79fd4..0fca113 100644 --- a/packages/net/package.json +++ b/packages/net/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/net", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "Utilities for connecting with nostr relays.", diff --git a/packages/net/src/request.ts b/packages/net/src/request.ts index a0f3db6..c9d09be 100644 --- a/packages/net/src/request.ts +++ b/packages/net/src/request.ts @@ -1,7 +1,6 @@ import { on, uniq, - lte, flatten, addToMapKey, defer, @@ -13,10 +12,10 @@ import { } from "@welshman/lib" import { Filter, - getAddress, unionFilters, matchFilters, TrustedEvent, + deduplicateEvents, getFilterResultCardinality, } from "@welshman/util" import {RelayMessage, ClientMessageType, isRelayEvent, isRelayEose} from "./message.js" @@ -25,20 +24,6 @@ import {SocketEvent, SocketStatus} from "./socket.js" import {netContext} from "./context.js" import {Tracker} from "./tracker.js" -const deduplicateEvents = (events: TrustedEvent[]) => { - const eventsByAddress = new Map() - - for (const event of events) { - const address = getAddress(event) - - if (lte(eventsByAddress.get(address)?.created_at, event.created_at)) { - eventsByAddress.set(address, event) - } - } - - return Array.from(eventsByAddress.values()) -} - export type BaseRequestOptions = { signal?: AbortSignal tracker?: Tracker diff --git a/packages/relay/package.json b/packages/relay/package.json index af51160..220dd5a 100644 --- a/packages/relay/package.json +++ b/packages/relay/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/relay", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "An in-memory nostr relay implementation.", diff --git a/packages/router/package.json b/packages/router/package.json index 03120e6..562dc66 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/router", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities for nostr relay selection.", diff --git a/packages/signer/package.json b/packages/signer/package.json index 1d7a571..37ee25e 100644 --- a/packages/signer/package.json +++ b/packages/signer/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/signer", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "A nostr signer implemenation supporting several login methods.", diff --git a/packages/store/package.json b/packages/store/package.json index 3033d13..2a272e7 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/store", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities based on svelte/store for use with welshman", diff --git a/packages/util/package.json b/packages/util/package.json index 2f8c2e4..87a180c 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/util", - "version": "0.4.6", + "version": "0.4.7", "author": "hodlbod", "license": "MIT", "description": "A collection of nostr-related utilities.", diff --git a/packages/util/src/Events.ts b/packages/util/src/Events.ts index a7d9656..7dfc46b 100644 --- a/packages/util/src/Events.ts +++ b/packages/util/src/Events.ts @@ -1,7 +1,7 @@ import {verifiedSymbol, verifyEvent as verifyEventPure} from "nostr-tools/pure" import {setNostrWasm, verifyEvent as verifyEventWasm} from "nostr-tools/wasm" import {initNostrWasm} from "nostr-wasm" -import {mapVals, first, pick, now} from "@welshman/lib" +import {mapVals, lte, first, pick, now} from "@welshman/lib" import {getReplyTags, getCommentTags, getReplyTagValues, getCommentTagValues} from "./Tags.js" import {getAddress, Address} from "./Address.js" import { @@ -136,6 +136,20 @@ export const getIdOrAddress = (e: HashedEvent) => (isReplaceable(e) ? getAddress export const getIdAndAddress = (e: HashedEvent) => isReplaceable(e) ? [e.id, getAddress(e)] : [e.id] +export const deduplicateEvents = (events: TrustedEvent[]) => { + const eventsByKey = new Map() + + for (const event of events) { + const key = getIdOrAddress(event) + + if (lte(eventsByKey.get(key)?.created_at, event.created_at)) { + eventsByKey.set(key, event) + } + } + + return Array.from(eventsByKey.values()) +} + export const isEphemeral = (e: EventTemplate) => isEphemeralKind(e.kind) export const isReplaceable = (e: EventTemplate) => isReplaceableKind(e.kind)