diff --git a/package-lock.json b/package-lock.json index 8bb4d62..b6a3028 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3059,10 +3059,10 @@ }, "packages/feeds": { "name": "@welshman/feeds", - "version": "0.0.4", + "version": "0.0.5", "license": "MIT", "dependencies": { - "@welshman/util": "0.0.5" + "@welshman/util": "0.0.6" }, "devDependencies": { "gts": "^5.0.1", @@ -3072,7 +3072,7 @@ }, "packages/lib": { "name": "@welshman/lib", - "version": "0.0.4", + "version": "0.0.5", "license": "MIT", "dependencies": { "@scure/base": "^1.1.6", @@ -3096,11 +3096,11 @@ }, "packages/net": { "name": "@welshman/net", - "version": "0.0.4", + "version": "0.0.5", "license": "MIT", "dependencies": { - "@welshman/lib": "0.0.4", - "@welshman/util": "0.0.5", + "@welshman/lib": "0.0.5", + "@welshman/util": "0.0.6", "isomorphic-ws": "^5.0.0", "ws": "^8.16.0" }, @@ -3112,10 +3112,10 @@ }, "packages/util": { "name": "@welshman/util", - "version": "0.0.5", + "version": "0.0.6", "license": "MIT", "dependencies": { - "@welshman/lib": "0.0.4", + "@welshman/lib": "0.0.5", "nostr-tools": "^2.3.2" }, "devDependencies": { diff --git a/packages/feeds/loader.ts b/packages/feeds/loader.ts index f7cdfee..0addfa2 100644 --- a/packages/feeds/loader.ts +++ b/packages/feeds/loader.ts @@ -39,11 +39,6 @@ export class FeedLoader { } async _getRequestsLoader(requests: RequestItem[], {onEvent, onExhausted}: LoadOpts) { - // Empty requests are not a no-op, they're a global feed - if (requests.length === 0) { - requests = [{}] - } - const seen = new Set() const exhausted = new Set() const loaders = await Promise.all( diff --git a/packages/feeds/package.json b/packages/feeds/package.json index 899cae6..259016b 100644 --- a/packages/feeds/package.json +++ b/packages/feeds/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/feeds", - "version": "0.0.4", + "version": "0.0.5", "author": "hodlbod", "license": "MIT", "description": "Utilities for building dynamic nostr feeds.", @@ -31,6 +31,6 @@ "typescript": "~5.1.6" }, "dependencies": { - "@welshman/util": "0.0.5" + "@welshman/util": "0.0.6" } } diff --git a/packages/lib/Tools.ts b/packages/lib/Tools.ts index 9440ea1..c9ff5fd 100644 --- a/packages/lib/Tools.ts +++ b/packages/lib/Tools.ts @@ -186,17 +186,19 @@ export const uniqBy = (f: (x: T) => any, xs: T[]) => { export const sortBy = (f: (x: T) => number, xs: T[]) => xs.sort((a: T, b: T) => f(a) - f(b)) -export const groupBy = (f: (x: T) => string, xs: T[]) => { - const r: Record = {} +export const groupBy = (f: (x: T) => K, xs: T[]) => { + const r = new Map() for (const x of xs) { const k = f(x) + let v = r.get(k) - if (!r[k]) { - r[k] = [] + if (!v) { + v = [] + r.set(k, v) } - r[k].push(x) + v.push(x) } return r diff --git a/packages/lib/package.json b/packages/lib/package.json index db3e833..3c158a2 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/lib", - "version": "0.0.4", + "version": "0.0.5", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities.", diff --git a/packages/net/Subscribe.ts b/packages/net/Subscribe.ts index 01c1df8..98e64c9 100644 --- a/packages/net/Subscribe.ts +++ b/packages/net/Subscribe.ts @@ -78,7 +78,7 @@ export const mergeSubscriptions = (subs: Subscription[]) => { const completedRelays = new Set() const mergedSubscriptions = [] - for (const group of Object.values(groupBy(calculateSubscriptionGroup, subs))) { + for (const group of groupBy(calculateSubscriptionGroup, subs).values()) { for (const relay of uniq(group.flatMap((sub: Subscription) => sub.request.relays))) { const abortedSubs = new Set() const callerSubs = group.filter((sub: Subscription) => sub.request.relays.includes(relay)) diff --git a/packages/net/package.json b/packages/net/package.json index 47db335..e93b0f5 100644 --- a/packages/net/package.json +++ b/packages/net/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/net", - "version": "0.0.4", + "version": "0.0.5", "author": "hodlbod", "license": "MIT", "description": "Utilities for connecting with nostr relays.", @@ -31,8 +31,8 @@ "typescript": "~5.1.6" }, "dependencies": { - "@welshman/lib": "0.0.4", - "@welshman/util": "0.0.5", + "@welshman/lib": "0.0.5", + "@welshman/util": "0.0.6", "isomorphic-ws": "^5.0.0", "ws": "^8.16.0" } diff --git a/packages/util/Filters.ts b/packages/util/Filters.ts index feba1ea..9c2cfcc 100644 --- a/packages/util/Filters.ts +++ b/packages/util/Filters.ts @@ -79,7 +79,7 @@ export const calculateFilterGroup = ({since, until, limit, search, ...filter}: F export const unionFilters = (filters: Filter[]) => { const result = [] - for (const group of Object.values(groupBy(calculateFilterGroup, filters))) { + for (const group of groupBy(calculateFilterGroup, filters).values()) { const newFilter: Record = {} for (const k of Object.keys(group[0])) { diff --git a/packages/util/Repository.ts b/packages/util/Repository.ts index 521a96c..63083d9 100644 --- a/packages/util/Repository.ts +++ b/packages/util/Repository.ts @@ -1,6 +1,6 @@ import {throttle} from 'throttle-debounce' import type {IReadable, Subscriber, Invalidator} from '@welshman/lib' -import {Derived, Emitter, sortBy, customStore, inc, first, chunk, sleep, uniq, omit, now, range, identity} from '@welshman/lib' +import {Derived, flatten, Emitter, sortBy, customStore, inc, first, chunk, sleep, uniq, omit, now, range, identity} from '@welshman/lib' import {DELETE} from './Kinds' import {EPOCH, matchFilter, getIdFilters, matchFilters} from './Filters' import {isReplaceable, isTrustedEvent} from './Events' @@ -67,7 +67,7 @@ export class Repository extends Emitter implements IReadable { } filter(filters: Filter[], {includeDeleted = false} = {}) { - const getValue = () => Array.from(this.query(filters, {includeDeleted})) + const getValue = () => this.query(filters, {includeDeleted}) return customStore({ get: getValue, @@ -132,7 +132,8 @@ export class Repository extends Emitter implements IReadable { return this.filter(getIdFilters([idOrAddress]), {includeDeleted: true}).derived(first) } - *query(filters: Filter[], {includeDeleted = false} = {}) { + query(filters: Filter[], {includeDeleted = false} = {}) { + const result: TrustedEvent[][] = [] for (let filter of filters) { let events: TrustedEvent[] = Array.from(this.eventsById.values()) @@ -165,10 +166,9 @@ export class Repository extends Emitter implements IReadable { } } - let i = 0 - + const chunk: TrustedEvent[] = [] for (const event of sortBy((e: TrustedEvent) => -e.created_at, events)) { - if (filter.limit && i > filter.limit) { + if (filter.limit && chunk.length >= filter.limit) { break } @@ -177,11 +177,14 @@ export class Repository extends Emitter implements IReadable { } if (matchFilter(filter, event)) { - yield event - i += 1 + chunk.push(event) } } + + result.push(chunk) } + + return uniq(flatten(result)) } publish(event: TrustedEvent) { diff --git a/packages/util/package.json b/packages/util/package.json index ba89f68..463384e 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/util", - "version": "0.0.5", + "version": "0.0.6", "author": "hodlbod", "license": "MIT", "description": "A collection of nostr-related utilities.", @@ -31,7 +31,7 @@ "typescript": "~5.1.6" }, "dependencies": { - "@welshman/lib": "0.0.4", + "@welshman/lib": "0.0.5", "nostr-tools": "^2.3.2" } }