import type { GroupLoader } from '../GroupLoader'; import type { Loader } from '../Loader'; import type { GetManyResult } from './SyncDataSources'; export interface CommonCacheConfiguration { ttlLeftBeforeRefreshInMsecs?: number; ttlCacheTtl?: number; ttlCacheSize?: number; ttlInMsecs: number | undefined; } export interface GroupCacheConfiguration extends CommonCacheConfiguration { ttlCacheGroupSize?: number; } export type CacheEntry = { key: string; value: LoadedValue; }; export interface WriteCache { set: (key: string, value: LoadedValue | null) => Promise; setMany: (entries: readonly CacheEntry[]) => Promise; delete: (key: string) => Promise; deleteMany: (keys: string[]) => Promise; clear: () => Promise; close: () => Promise; } export interface Cache extends WriteCache { readonly ttlLeftBeforeRefreshInMsecs?: number; readonly expirationTimeLoadingOperation: Loader; get: (key: string) => Promise; getMany: (keys: string[]) => Promise>; getExpirationTime: (key: string) => Promise; } export interface GroupWriteCache { setForGroup: (key: string, value: LoadedValue | null, group: string) => Promise; setManyForGroup: (entries: readonly CacheEntry[], group: string) => Promise; deleteGroup: (group: string) => Promise; deleteFromGroup: (key: string, group: string) => Promise; clear: () => Promise; close: () => Promise; } export interface GroupCache extends GroupWriteCache { readonly ttlLeftBeforeRefreshInMsecs?: number; readonly expirationTimeLoadingGroupedOperation: GroupLoader; getFromGroup: (key: string, group: string) => Promise; getManyFromGroup: (keys: string[], group: string) => Promise>; getExpirationTimeFromGroup: (key: string, group: string) => Promise; } /** * Data source interface for retrieving values. * * Return value semantics: * - Return the actual value when found * - Return `null` to indicate "value was resolved but is empty" - this WILL be cached * - Return `undefined` to indicate "value was not resolved" - this will NOT be cached, * and the next data source in the sequence will be queried */ export interface DataSource { get: (loadParams: LoadParams) => Promise; getMany: (keys: string[], loadParams?: LoadManyParams) => Promise; name: string; } /** * Group data source interface for retrieving values within groups. * * Return value semantics: * - Return the actual value when found * - Return `null` to indicate "value was resolved but is empty" - this WILL be cached * - Return `undefined` to indicate "value was not resolved" - this will NOT be cached, * and the next data source in the sequence will be queried */ export interface GroupDataSource { getFromGroup: (loadParams: LoadParams, group: string) => Promise; getManyFromGroup: (keys: string[], group: string, loadParams?: LoadManyParams) => Promise; name: string; }