SelfRefreshingCache
SelfRefreshingCache
A cache which automatically refreshes itself if the value is found to be stale.
interface SelfRefreshingCache<V, RefreshArgs extends any[] = []> {
value(...refreshArgs: RefreshArgs | [undefined] | []): Promise<V>;
memoize<Args extends any[], R>(
args: Args,
refreshArgs: RefreshArgs,
fn: (value: V, ...args: Args) => R,
): Promise<R>;
refresh(...args: RefreshArgs): Promise<V>;
}
value
(refreshArgs: RefreshArgs | [undefined] | []) => Promise<V>
The current value of the cache. If the value is stale, the data will be refreshed and then the fresh value will be returned.
memoize
(args: Args, refreshArgs: RefreshArgs, fn: (value: V, ...args: Args) => R) => Promise<R>
Allows a memoized function to be defined. For the given arguments, the fn
function will
be invoked only once and its output cached and returned.
The results cache is cleared along with the rest of the cache according to the configured
ttl
value.
refresh
(args: RefreshArgs) => Promise<V>
Force a refresh of the value, e.g. when it is known that the value has changed such as after an update operation to the source data in the database.
SelfRefreshingCacheConfig
Configuration options for creating a SelfRefreshingCache.
interface SelfRefreshingCacheConfig<V, RefreshArgs extends any[]> {
name: string;
ttl: number;
refresh: {
fn: (...args: RefreshArgs) => Promise<V>;
/**
* Default arguments, passed to refresh function
*/
defaultArgs: RefreshArgs;
};
getTimeFn?: () => number;
}
name
string
The name of the cache, used for logging purposes.
e.g. 'MyService.cachedValue'
.
ttl
number
The time-to-live (ttl) in milliseconds for the cache. After this time, the value will be considered stale and will be refreshed the next time it is accessed.
refresh
{ fn: (...args: RefreshArgs) => Promise<V>; /** * Default arguments, passed to refresh function */ defaultArgs: RefreshArgs; }
The function which is used to refresh the value of the cache. This function should return a Promise which resolves to the new value.
getTimeFn
() => number
Intended for unit testing the SelfRefreshingCache only.
By default uses () => new Date().getTime()
createSelfRefreshingCache
Creates a SelfRefreshingCache object, which is used to cache a single frequently-accessed value. In this type
of cache, the function used to populate the value (refreshFn
) is defined during the creation of the cache, and
it is immediately used to populate the initial value.
From there, when the .value
property is accessed, it will return a value from the cache, and if the
value has expired, it will automatically run the refreshFn
to update the value and then return the
fresh value.
Example
import { createSelfRefreshingCache } from '@vendure/core';
@Injectable()
export class PublicChannelService {
private publicChannel: SelfRefreshingCache<Channel, [RequestContext]>;
async init() {
this.publicChannel = await createSelfRefreshingCache<Channel, [RequestContext]>({
name: 'PublicChannelService.publicChannel',
ttl: 1000 * 60 * 60, // 1 hour
refresh: {
fn: async (ctx: RequestContext) => {
return this.channelService.getPublicChannel(ctx);
},
defaultArgs: [RequestContext.empty()],
},
});
}
function createSelfRefreshingCache<V, RefreshArgs extends any[]>(config: SelfRefreshingCacheConfig<V, RefreshArgs>, refreshArgs?: RefreshArgs): Promise<SelfRefreshingCache<V, RefreshArgs>>
Parameters
config
SelfRefreshingCacheConfig<V, RefreshArgs>
refreshArgs
RefreshArgs