mirror of
https://github.com/kennethnym/aris.git
synced 2026-03-20 17:11:17 +00:00
feat: replace flat context with tuple-keyed store
Context keys are now tuples instead of strings, inspired by
React Query's query keys. This prevents context collisions
when multiple instances of the same source type are registered.
Sources write to structured keys like
["aris.google-calendar", "nextEvent", { account: "work" }]
and consumers can query by prefix via context.find().
Co-authored-by: Ona <no-reply@ona.com>
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
import type { Context } from "./context"
|
||||
import type { ContextEntry } from "./context"
|
||||
import type { DataSource } from "./data-source"
|
||||
import type { FeedItem } from "./feed"
|
||||
import type { ReconcileResult } from "./reconciler"
|
||||
|
||||
import { Context } from "./context"
|
||||
import { Reconciler } from "./reconciler"
|
||||
|
||||
export interface FeedControllerConfig {
|
||||
@@ -40,7 +41,7 @@ const DEFAULT_DEBOUNCE_MS = 100
|
||||
* })
|
||||
*
|
||||
* // Context update triggers debounced reconcile
|
||||
* controller.pushContextUpdate({ [LocationKey]: location })
|
||||
* controller.pushContextUpdate([[LocationKey, location]])
|
||||
*
|
||||
* // Direct reconcile (no debounce)
|
||||
* const result = await controller.reconcile()
|
||||
@@ -59,7 +60,7 @@ export class FeedController<TItems extends FeedItem = never> {
|
||||
private stopped = false
|
||||
|
||||
constructor(config?: FeedControllerConfig) {
|
||||
this.context = config?.initialContext ?? { time: new Date() }
|
||||
this.context = config?.initialContext ?? new Context()
|
||||
this.debounceMs = config?.debounceMs ?? DEFAULT_DEBOUNCE_MS
|
||||
this.timeout = config?.timeout
|
||||
}
|
||||
@@ -94,9 +95,10 @@ export class FeedController<TItems extends FeedItem = never> {
|
||||
}
|
||||
}
|
||||
|
||||
/** Merges update into context and schedules a debounced reconcile. */
|
||||
pushContextUpdate(update: Partial<Context>): void {
|
||||
this.context = { ...this.context, ...update, time: new Date() }
|
||||
/** Merges entries into context and schedules a debounced reconcile. */
|
||||
pushContextUpdate(entries: readonly ContextEntry[]): void {
|
||||
this.context.time = new Date()
|
||||
this.context.set(entries)
|
||||
this.scheduleReconcile()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user