Simplify client plugin interfaces
tests / tests (push) Failing after 5m11s

This commit is contained in:
Jon Staab
2026-06-18 11:48:14 -07:00
parent eb451d795b
commit dfeb7a747b
+3 -43
View File
@@ -24,46 +24,6 @@ export const projection = <T>($: Readable<T>, get = getter($)) => ({$, get})
export const projectFrom = <S, U>(src: Projection<S>, read: ($: S) => U): Projection<U> =>
projection(derived(src.$, read), () => read(src.get()))
/**
* Synchronous read access to a keyed collection's current value. Shared by
* collections that own a map (`MapPlugin`) and those that are read-only views
* over the repository (`DerivedPlugin`).
*/
export interface ReadableMap<T> {
get(key: string): Maybe<T>
}
/**
* Direct get/set access to a keyed collection the plugin owns. Extends the read
* accessors with mutation plus change notification. Only collections that own
* their map implement this — repository-backed collections are read-only.
*/
export interface Mappable<T> extends ReadableMap<T> {
set(key: string, value: T): void
delete(key: string): void
clear(): void
onItem(subscriber: (key: string, value: Maybe<T>) => void): Unsubscriber
}
/**
* Lazy, async loading of items by key from the network, with per-key caching
* and backoff (`load`) or a cache-bypassing refresh (`forceLoad`).
*/
export interface Loadable<T> {
load(key: string, ...args: any[]): Promise<Maybe<T>>
forceLoad(key: string, ...args: any[]): Promise<Maybe<T>>
}
/**
* Reactive derivations over a keyed collection: the whole map (`index`), its
* values (`all`), and a per-key on-demand store (`one`).
*/
export interface Derivable<T> {
index: Projection<ItemsByKey<T>>
all: Projection<T[]>
one(key?: string, ...args: any[]): Readable<Maybe<T>>
}
/**
* Base class for a reactive, keyed collection of "local" (non-event) data —
* things like relay stats or NIP-11 profiles that aren't backed by the
@@ -73,7 +33,7 @@ export interface Derivable<T> {
* snapshot via `.get()`. Per-key access is `one(key)`, a plain on-demand store
* (snapshot with svelte's `get(...)`, or read `get(key)` directly).
*/
export class MapPlugin<T> implements Mappable<T>, Derivable<T> {
export class MapPlugin<T> {
protected store = writable(new Map<string, T>())
index: Projection<ItemsByKey<T>>
all: Projection<T[]>
@@ -143,7 +103,7 @@ export class MapPlugin<T> implements Mappable<T>, Derivable<T> {
* network. Subclasses implement `fetch`; `load`/`forceLoad`/`one` are derived
* from it (with per-key caching and backoff via `makeLoadItem`).
*/
export abstract class LoadableMapPlugin<T> extends MapPlugin<T> implements Loadable<T> {
export abstract class LoadableMapPlugin<T> extends MapPlugin<T> {
load: (key: string, ...args: any[]) => Promise<Maybe<T>>
forceLoad: (key: string, ...args: any[]) => Promise<Maybe<T>>
@@ -181,7 +141,7 @@ export type DerivedPluginOptions<T> = {
* `index` (map) and `all` (values) are `Projection`s — subscribe via `.$`,
* snapshot via `.get()`. Per-key access is `one(key)`, a plain on-demand store.
*/
export abstract class DerivedPlugin<T> implements ReadableMap<T>, Loadable<T>, Derivable<T> {
export abstract class DerivedPlugin<T> {
index: Projection<ItemsByKey<T>>
all: Projection<T[]>
one: (key?: string, ...args: any[]) => Readable<Maybe<T>>