Feed Compiler
The FeedCompiler class transforms feed definitions into optimized RequestItem[] arrays containing filters and relay selections for efficient event fetching.
Types
typescript
export type FeedCompilerOptions = {
signer?: ISigner
signal?: AbortSignal
context?: AdapterContext
getPubkeysForScope: (scope: Scope) => string[]
getPubkeysForWOTRange: (minWOT: number, maxWOT: number) => string[]
}FeedCompiler Class
typescript
export class FeedCompiler {
constructor(readonly options: FeedCompilerOptions)
// Check if a feed can be compiled
canCompile(feed: Feed): boolean
// Compile a feed into request items
async compile(feed: Feed): Promise<RequestItem[]>
}Compilation Logic
Basic Feed Types
- ID feeds →
{filters: [{ids: [...]}]} - Kind feeds →
{filters: [{kinds: [...]}]} - Author feeds →
{filters: [{authors: [...]}]} - Tag feeds →
{filters: [{[key]: [...values]}]} - Address feeds → Converts to ID filters using
getIdFilters() - Relay feeds →
{relays: [...urls]} - Global feeds →
{filters: [{}]}
Time-based Feeds
- CreatedAt feeds → Processes
since/untilwith optional relative timestamps - Scope feeds → Resolves to author filters using
getPubkeysForScope() - WOT feeds → Resolves to author filters using
getPubkeysForWOTRange() - Search feeds →
{filters: [{search: "term"}]}
Complex Feed Types
- DVM feeds → Requests DVM responses and converts result tags to feeds
- List feeds → Fetches list events and converts their tags to feeds
- Label feeds → Fetches label events (kind 1985) and converts tags to feeds
Set Operations
- Union feeds → Merges all sub-feed results, optimizing by relay
- Intersection feeds → Finds overlapping filters and relays across sub-feeds
Usage
typescript
import { FeedCompiler, makeAuthorFeed, makeKindFeed } from '@welshman/feeds'
const compiler = new FeedCompiler({
getPubkeysForScope: (scope) => [...], // Your scope resolution logic
getPubkeysForWOTRange: (min, max) => [...], // Your WOT logic
context: adapterContext,
signal: abortSignal
})
// Compile a simple feed
const feed = makeAuthorFeed("pubkey1", "pubkey2")
const requests = await compiler.compile(feed)
// => [{filters: [{authors: ["pubkey1", "pubkey2"]}]}]
// Check if feed can be compiled
if (compiler.canCompile(feed)) {
const requests = await compiler.compile(feed)
}