Imported as a linear vendor commit so forge rebases do not replay the upstream root tree. git-subtree-dir: third_party/pi git-subtree-split: d981de1229ef899957bbe968bc8dcda02a21f477
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import type { Api, Model } from "./types.ts";
|
|
|
|
export interface ModelsStoreEntry {
|
|
models: readonly Model<Api>[];
|
|
/** Unix timestamp from the remote catalog's Last-Modified header. */
|
|
lastModified?: number;
|
|
/** Unix timestamp of the last completed remote check. */
|
|
checkedAt?: number;
|
|
/**
|
|
* Opaque validator from the remote catalog's ETag header, stored verbatim
|
|
* (quotes included) and echoed back as If-None-Match.
|
|
*/
|
|
etag?: string;
|
|
}
|
|
|
|
export interface ModelsStoreOperationOptions {
|
|
signal?: AbortSignal;
|
|
}
|
|
|
|
/** Persistent model catalogs keyed by provider ID. */
|
|
export interface ModelsStore {
|
|
read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined>;
|
|
write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void>;
|
|
delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void>;
|
|
}
|
|
|
|
export class InMemoryModelsStore implements ModelsStore {
|
|
private readonly entries = new Map<string, ModelsStoreEntry>();
|
|
|
|
async read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {
|
|
options?.signal?.throwIfAborted();
|
|
const entry = this.entries.get(providerId);
|
|
return entry ? structuredClone(entry) : undefined;
|
|
}
|
|
|
|
async write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {
|
|
options?.signal?.throwIfAborted();
|
|
this.entries.set(providerId, structuredClone(entry));
|
|
}
|
|
|
|
async delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {
|
|
options?.signal?.throwIfAborted();
|
|
this.entries.delete(providerId);
|
|
}
|
|
}
|