mirror of
https://github.com/kennethnym/aris.git
synced 2026-03-20 00:51:20 +00:00
Manages FeedEngine instances per user with auto-registration of sources from FeedSourceProvider implementations. - Add FeedSourceProvider interface - Add FeedEngineService with providers array injection - Update LocationService to implement FeedSourceProvider Co-authored-by: Ona <no-reply@ona.com>
76 lines
1.7 KiB
TypeScript
76 lines
1.7 KiB
TypeScript
import { FeedEngine, type FeedResult, type FeedSource, type FeedSubscriber } from "@aris/core"
|
|
|
|
/**
|
|
* Provides a FeedSource instance for a user.
|
|
*/
|
|
export interface FeedSourceProvider {
|
|
feedSourceForUser(userId: string): FeedSource
|
|
}
|
|
|
|
/**
|
|
* Manages FeedEngine instances per user.
|
|
*
|
|
* Receives FeedSource instances from injected providers and wires them
|
|
* into per-user engines. Engines are auto-started on creation.
|
|
*/
|
|
export class FeedEngineService {
|
|
private engines = new Map<string, FeedEngine>()
|
|
|
|
constructor(private readonly providers: FeedSourceProvider[]) {}
|
|
|
|
/**
|
|
* Get or create a FeedEngine for a user.
|
|
* Automatically registers sources and starts the engine.
|
|
*/
|
|
engineForUser(userId: string): FeedEngine {
|
|
let engine = this.engines.get(userId)
|
|
if (!engine) {
|
|
engine = this.createEngine(userId)
|
|
this.engines.set(userId, engine)
|
|
}
|
|
return engine
|
|
}
|
|
|
|
/**
|
|
* Refresh a user's feed.
|
|
*/
|
|
async refresh(userId: string): Promise<FeedResult> {
|
|
const engine = this.engineForUser(userId)
|
|
return engine.refresh()
|
|
}
|
|
|
|
/**
|
|
* Subscribe to feed updates for a user.
|
|
* Returns unsubscribe function.
|
|
*/
|
|
subscribe(userId: string, callback: FeedSubscriber): () => void {
|
|
const engine = this.engineForUser(userId)
|
|
return engine.subscribe(callback)
|
|
}
|
|
|
|
/**
|
|
* Remove a user's FeedEngine.
|
|
* Stops the engine and cleans up resources.
|
|
*/
|
|
removeUser(userId: string): void {
|
|
const engine = this.engines.get(userId)
|
|
if (engine) {
|
|
engine.stop()
|
|
this.engines.delete(userId)
|
|
}
|
|
}
|
|
|
|
private createEngine(userId: string): FeedEngine {
|
|
const engine = new FeedEngine()
|
|
|
|
for (const provider of this.providers) {
|
|
const source = provider.feedSourceForUser(userId)
|
|
engine.register(source)
|
|
}
|
|
|
|
engine.start()
|
|
|
|
return engine
|
|
}
|
|
}
|