Compare commits

...

1 Commits

Author SHA1 Message Date
013bf46e1f feat: pass context to feed post-processors
Post-processors now receive Context as their 2nd parameter,
allowing them to use contextual data (time, location, etc.)
when producing enhancements.

Co-authored-by: Ona <no-reply@ona.com>
2026-03-01 17:06:58 +00:00
3 changed files with 14 additions and 16 deletions

View File

@@ -177,7 +177,7 @@ export class FeedEngine<TItems extends FeedItem = FeedItem> {
items: processedItems, items: processedItems,
groupedItems, groupedItems,
errors: postProcessorErrors, errors: postProcessorErrors,
} = await this.applyPostProcessors(items as TItems[], errors) } = await this.applyPostProcessors(items as TItems[], context, errors)
const result: FeedResult<TItems> = { const result: FeedResult<TItems> = {
context, context,
@@ -294,6 +294,7 @@ export class FeedEngine<TItems extends FeedItem = FeedItem> {
private async applyPostProcessors( private async applyPostProcessors(
items: TItems[], items: TItems[],
context: Context,
errors: SourceError[], errors: SourceError[],
): Promise<{ items: TItems[]; groupedItems: ItemGroup[]; errors: SourceError[] }> { ): Promise<{ items: TItems[]; groupedItems: ItemGroup[]; errors: SourceError[] }> {
let currentItems = items let currentItems = items
@@ -303,7 +304,7 @@ export class FeedEngine<TItems extends FeedItem = FeedItem> {
for (const processor of this.postProcessors) { for (const processor of this.postProcessors) {
const snapshot = currentItems const snapshot = currentItems
try { try {
const enhancement = await processor(currentItems) const enhancement = await processor(currentItems, context)
if (enhancement.additionalItems?.length) { if (enhancement.additionalItems?.length) {
// Post-processors operate on FeedItem[] without knowledge of TItems. // Post-processors operate on FeedItem[] without knowledge of TItems.
@@ -399,7 +400,7 @@ export class FeedEngine<TItems extends FeedItem = FeedItem> {
items: processedItems, items: processedItems,
groupedItems, groupedItems,
errors: postProcessorErrors, errors: postProcessorErrors,
} = await this.applyPostProcessors(items as TItems[], errors) } = await this.applyPostProcessors(items as TItems[], this.context, errors)
const result: FeedResult<TItems> = { const result: FeedResult<TItems> = {
context: this.context, context: this.context,

View File

@@ -333,9 +333,7 @@ describe("FeedPostProcessor", () => {
}, },
} }
const engine = new FeedEngine() const engine = new FeedEngine().register(source).registerPostProcessor(async () => {
.register(source)
.registerPostProcessor(async () => {
callCount++ callCount++
return {} return {}
}) })
@@ -377,9 +375,7 @@ describe("FeedPostProcessor", () => {
}, },
} }
const engine = new FeedEngine() const engine = new FeedEngine().register(source).registerPostProcessor(async () => {
.register(source)
.registerPostProcessor(async () => {
callCount++ callCount++
return {} return {}
}) })

View File

@@ -1,3 +1,4 @@
import type { Context } from "./context"
import type { FeedItem } from "./feed" import type { FeedItem } from "./feed"
export interface ItemGroup { export interface ItemGroup {
@@ -20,4 +21,4 @@ export interface FeedEnhancement {
* A function that transforms feed items and produces enhancement directives. * A function that transforms feed items and produces enhancement directives.
* Use named functions for meaningful error attribution. * Use named functions for meaningful error attribution.
*/ */
export type FeedPostProcessor = (items: FeedItem[]) => Promise<FeedEnhancement> export type FeedPostProcessor = (items: FeedItem[], context: Context) => Promise<FeedEnhancement>