@hyper-fetch/core
Version:
Cache, Queue and Persist your requests no matter if you are online or offline!
88 lines (85 loc) • 3.26 kB
text/typescript
import type EventEmitter from "events";
import type { CacheValueType } from "cache";
import { getInvalidateByKey, getInvalidateKey, getCacheByKey, getCacheKey, getDeleteKey, getDeleteByKey } from "cache";
import type { AdapterInstance } from "adapter";
/** Create the cache event emitters and listeners for data changes, invalidation, and deletion. */
export const getCacheEvents = (emitter: EventEmitter) => ({
/**
* Set cache data
* @param data
*/
emitCacheData: <Response, Error, Adapter extends AdapterInstance>(
data: CacheValueType<Response, Error, Adapter> & { cached: boolean },
isTriggeredExternally = false,
): void => {
emitter.emit(getCacheKey(), data, isTriggeredExternally);
emitter.emit(getCacheByKey(data.cacheKey), data, isTriggeredExternally);
},
/**
* Invalidate cache values event
*/
emitInvalidation: (cacheKey: string, isTriggeredExternally = false): void => {
emitter.emit(getInvalidateKey(), cacheKey, isTriggeredExternally);
emitter.emit(getInvalidateByKey(cacheKey), isTriggeredExternally);
},
/**
* Delete of cache values
*/
emitDelete: (cacheKey: string, isTriggeredExternally = false): void => {
emitter.emit(getDeleteKey(), cacheKey, isTriggeredExternally);
emitter.emit(getDeleteByKey(cacheKey), isTriggeredExternally);
},
/**
* Cache data listener for all keys
* @param callback
* @returns
*/
onData: <Response, Error, Adapter extends AdapterInstance>(
callback: (data: CacheValueType<Response, Error, Adapter> & { cached: boolean }) => void,
): VoidFunction => {
emitter.on(getCacheKey(), callback);
return () => emitter.removeListener(getCacheKey(), callback);
},
/**
* Cache data listener filtered by a specific cache key
* @param cacheKey
* @param callback
* @returns
*/
onDataByKey: <Response, Error, Adapter extends AdapterInstance>(
cacheKey: string,
callback: (data: CacheValueType<Response, Error, Adapter>) => void,
): VoidFunction => {
emitter.on(getCacheByKey(cacheKey), callback);
return () => emitter.removeListener(getCacheByKey(cacheKey), callback);
},
/**
* Cache invalidation listener
* @param callback
* @returns
*/
onInvalidate: (callback: (cacheKey: string) => void): VoidFunction => {
emitter.on(getInvalidateKey(), callback);
return () => emitter.removeListener(getInvalidateKey(), callback);
},
/**
* Cache invalidation listener
* @param cacheKey
* @param callback
* @returns
*/
onInvalidateByKey: (cacheKey: string, callback: () => void): VoidFunction => {
emitter.on(getInvalidateByKey(cacheKey), callback);
return () => emitter.removeListener(getInvalidateByKey(cacheKey), callback);
},
/** Cache deletion listener for all keys */
onDelete: (callback: (cacheKey: string) => void): VoidFunction => {
emitter.on(getDeleteKey(), callback);
return () => emitter.removeListener(getDeleteKey(), callback);
},
/** Cache deletion listener filtered by a specific cache key */
onDeleteByKey: (cacheKey: string, callback: () => void): VoidFunction => {
emitter.on(getDeleteByKey(cacheKey), callback);
return () => emitter.removeListener(getDeleteByKey(cacheKey), callback);
},
});