import type { BuildCachedSnapshot, BuildNetworkSnapshot, CachePolicyImplementation, CachePolicyType } from './CachePolicy'; import type { Snapshot } from './interfaces/Snapshot'; import type { Store, StoreMetadata } from './interfaces/Store'; import type { FetchResponse, ResourceRequest } from './network'; import type { KeySchema, NormalizedKeyMetadata } from './interfaces/queryability'; import type { SnapshotRefreshReason } from './store/InMemoryStore'; interface BaseEvent { timestamp: number; } interface EndEventBase extends BaseEvent { hasError: boolean; duration: number; } export interface AdapterLookupStartEvent extends BaseEvent { type: 'adapter-lookup-start'; cachePolicy: CachePolicyType; } export interface AdapterLookupEndEvent extends EndEventBase { type: 'adapter-lookup-end'; } export interface CacheLookupStartEvent extends BaseEvent { type: 'cache-lookup-start'; } export interface CacheLookupEndEvent extends EndEventBase { type: 'cache-lookup-end'; wasResultAsync: boolean; snapshotState?: string; } export interface NetworkLookupStartEvent extends BaseEvent { type: 'network-lookup-start'; } export interface NetworkLookupEndEvent extends EndEventBase { type: 'network-lookup-end'; } export interface NetworkRequestStartEvent extends BaseEvent { type: 'network-request-start'; uuid: string; request: ResourceRequest; } export interface NetworkRequestEndEvent extends BaseEvent { type: 'network-request-end'; uuid: string; duration: number; response: FetchResponse; } export interface NetworkRequestErrorEvent extends BaseEvent { type: 'network-request-error'; uuid: string; duration: number; error: unknown; } export interface CustomAdapterEvent extends BaseEvent { type: 'custom'; namespace: string; data: T; } export interface EnvironmentAdapterEvent extends BaseEvent { type: 'environment'; environment: string; data: D; } export interface CacheMissOutOfTtlEvent extends BaseEvent { type: 'cache-miss-out-of-ttl'; recordId: string | NormalizedKeyMetadata; recordMetadata: StoreMetadata; oldSnapshot: Snapshot; newSnapshot: Snapshot; } export interface DataOutOfTtlDurationUpdateEvent { type: 'data-out-of-ttl-duration-update'; recordId: string | NormalizedKeyMetadata; lastExpiredDuration: number; storeResolveResultState: 'not-present' | 'stale'; } export interface StoreResetEvent extends BaseEvent { type: 'store-reset'; } export interface StorePublishEvent extends BaseEvent { type: 'store-publish'; store: Store; key: NormalizedKeyMetadata; keySchema: KeySchema; } interface SnapshotEvent extends BaseEvent { subscriptionId: number; snapshot: Snapshot; } export interface StoreSnapshotSubscribeEvent extends SnapshotEvent { type: 'store-snapshot-subscribe'; } export interface StoreSnapshotUnubscribeEvent extends SnapshotEvent { type: 'store-snapshot-unsubscribe'; } export interface StoreSnapshotRebuildEvent extends SnapshotEvent { type: 'store-snapshot-rebuild'; } export interface StoreSnapshotEmitEvent extends SnapshotEvent { type: 'store-snapshot-emit'; } export interface StoreSnapshotRefreshEvent extends SnapshotEvent { type: 'store-snapshot-refresh'; reason: SnapshotRefreshReason; } type StoreSnapshotEvent = StoreSnapshotSubscribeEvent | StoreSnapshotUnubscribeEvent | StoreSnapshotRebuildEvent | StoreSnapshotEmitEvent | StoreSnapshotRefreshEvent; export type LuvioAdapterEvent = CustomAdapterEvent | EnvironmentAdapterEvent | AdapterLookupStartEvent | AdapterLookupEndEvent | CacheMissOutOfTtlEvent | CacheLookupStartEvent | CacheLookupEndEvent | NetworkLookupStartEvent | NetworkLookupEndEvent | NetworkRequestStartEvent | NetworkRequestEndEvent | NetworkRequestErrorEvent; export type LuvioStoreEvent = CacheMissOutOfTtlEvent | DataOutOfTtlDurationUpdateEvent | StoreResetEvent | StorePublishEvent | StoreSnapshotEvent; export interface LuvioAdapterEventObserver { onAdapterEvent?(event: LuvioAdapterEvent): void; onEnvironmentEvent?(event: EnvironmentAdapterEvent): void; onCustomAdapterEvent?(event: CustomAdapterEvent): void; } export interface LuvioStoreEventObserver { onCacheMissOutOfTtl?(event: CacheMissOutOfTtlEvent): void; onDataOutOfTtlDurationUpdate?(event: DataOutOfTtlDurationUpdateEvent): void; onStoreReset?(event: StoreResetEvent): void; onStorePublish?(event: StorePublishEvent): void; onStoreSnapshotEvent?(event: StoreSnapshotEvent): void; } export declare function cachePolicyImplWithEvents(cachePolicyImplementation: CachePolicyImplementation, cachePolicyType: CachePolicyType, eventObservers: LuvioAdapterEventObserver[]): CachePolicyImplementation; export declare function buildCachedSnapshotWithEvents(buildCachedSnapshot: BuildCachedSnapshot, eventObservers: LuvioAdapterEventObserver[]): BuildCachedSnapshot; export declare function buildNetworkSnapshotWithEvents(buildNetworkSnapshot: BuildNetworkSnapshot, eventObservers: LuvioAdapterEventObserver[]): BuildNetworkSnapshot; export declare function emitLuvioStoreEvent(event: LuvioStoreEvent, observers?: LuvioStoreEventObserver[]): void; export declare function emitAdapterEvent(event: LuvioAdapterEvent, observers?: LuvioAdapterEventObserver[]): void; export declare const createCustomAdapterEventEmitter: (namespace: string, observers?: LuvioAdapterEventObserver[]) => (eventData: T) => void; export declare function wrapFunctionInEvents T | Promise, T>(fn: F, eventObservers: LuvioAdapterEventObserver[], startEvent: LuvioAdapterEvent, buildResultEvent: (result: T | Error, wasError: boolean, wasAsync: boolean, startEvent: LuvioAdapterEvent) => LuvioAdapterEvent): F; export {};