export type UnpackPromise = T extends Promise ? U : T; export type ArgumentType = F extends (arg: infer A) => any ? A : never; export type ReturnType = T extends (...args: any[]) => infer R ? R : any; export class BifrostSubscription { public dispose: () => void; public onData: (fn: (a: T) => void) => void; public onError: (fn: (a: Error) => void) => void; public nextData: (a: T, opts?: { ensureSequentialTimestamp?: number }) => void; public nextError: (e: Error) => void; constructor(p: SubProps) { this.dispose = p.dispose; this.onData = p.onData; this.onError = p.onError; this.nextData = p.nextData; this.nextError = p.nextError; } } export type UnpackBifrostSubscription = T extends BifrostSubscription ? U : T; export type BifrostInstance> = { [K in keyof FunctionsType]: BifrostInstanceFn< ArgumentType, UnpackPromise> >; }; export interface UseCacheFns { getCachedFnResult: (p: { key: string }) => { cachedDateMS: number; value: any } | void; setCachedFnResult: (p: { key: string; value: any }) => void; } export type SubProps = { dispose: () => void; onData: (fn: (a: T) => void) => void; onError: (fn: (a: Error) => void) => void; nextData: (a: T, opts?: { ensureSequentialTimestamp?: number }) => void; nextError: (e: Error) => void; }; export interface BifrostInstanceFn { getClientSubscription: ( p: ParamType, options?: SubscriptionHelperOptions ) => { subscribe: ( fn: (p: { data: UnpackBifrostSubscription; isFromCache: boolean }) => void ) => { unsubscribe: () => void }; }; useClient: ( p: ParamType, memoizationArr: any[], options?: HelperOptions ) => { isLoading: boolean; error: Error; data: ResponseType | undefined; isFromCache: boolean }; fetchClient: (p: ParamType, options?: HelperOptions) => Promise<{ data: ResponseType; isFromCache: boolean }>; useClientSubscription: ( p: ParamType, memoizationArr: any[], options?: SubscriptionHelperOptions ) => { isLoading: boolean; error: Error; data: UnpackBifrostSubscription | undefined; isFromCache: boolean; }; useServer: ( p: ParamType, memoizationArr: any[], options?: HelperOptions ) => { isLoading: boolean; error: Error; data: ResponseType | undefined; isFromCache: boolean }; fetchServer: (p: ParamType, options?: HelperOptions) => Promise<{ data: ResponseType; isFromCache: boolean }>; } export type HttpProcessor = (p: { fnName: string; payload: any }) => Promise; export type Logger = (p: { fnName: string; details: any; error?: Error }) => any; export interface HelperOptions { useCacheOnlyWithinMS?: number; disableCache?: boolean; // If set will ignore options } export interface SubscriptionHelperOptions { disableCache?: boolean; }