flowchart TB Start([Client makes HTTP request]) --> Setup{setupCache called?} Setup -->|No| DirectAxios[Direct Axios Request] Setup -->|Yes| ReqInterceptor[Request Interceptor] ReqInterceptor --> CheckCache{Check Cache State} CheckCache -->|cached & fresh| CachedAdapter[Custom Cached Adapter] CheckCache -->|empty/stale/must-revalidate| MarkLoading[Mark as 'loading' in storage] CheckCache -->|loading by another request| WaitForOther[Wait for other request] WaitForOther --> OtherResolved{Other request resolved?} OtherResolved -->|Success| CachedAdapter OtherResolved -->|Failed| MarkLoading MarkLoading --> RealAdapter[Real Axios Adapter
HTTP request to server] CachedAdapter --> ResInterceptor[Response Interceptor
onFulfilled] RealAdapter --> ServerResponse{Server Response} ServerResponse -->|Success| ResInterceptor ServerResponse -->|Error| ResErrorInterceptor[Response Interceptor
onRejected] ResInterceptor --> IsCached{Response from cache?} IsCached -->|Yes| ReturnCached[Return cached response] IsCached -->|No| ProcessResponse[Process server response] ProcessResponse --> TestPredicate{Cache predicate
passes?} TestPredicate -->|No| RejectCache[Reject cache entry] TestPredicate -->|Yes| InterpretHeaders{interpretHeader
enabled?} InterpretHeaders -->|Yes| ParseHeaders[Parse Cache-Control,
Expires headers] InterpretHeaders -->|No| UseConfigTTL[Use config.ttl] ParseHeaders --> CheckCacheability{Should cache?} CheckCacheability -->|dont cache| RejectCache CheckCacheability -->|Yes| CalculateTTL[Calculate TTL & staleTtl] UseConfigTTL --> CalculateTTL CalculateTTL --> SaveCache[Save to storage as 'cached'] SaveCache --> ResolveWaiting[Resolve waiting requests] ResolveWaiting --> ReturnResponse[Return server response] RejectCache --> RejectWaiting[Reject waiting requests] RejectWaiting --> ReturnResponse ResErrorInterceptor --> CheckStaleIfError{staleIfError enabled
& stale data exists?} CheckStaleIfError -->|Yes| ReturnStale[Return stale data] CheckStaleIfError -->|No| RejectError[Reject & throw error] ReturnStale --> EndSuccess ReturnCached --> EndSuccess ReturnResponse --> EndSuccess([Response returned to client]) RejectError --> EndError([Error thrown to client]) DirectAxios --> EndSuccess style Start fill:#e1f5e1 style EndSuccess fill:#e1f5e1 style EndError fill:#ffe1e1 style CachedAdapter fill:#fff4e1 style ReqInterceptor fill:#e1f0ff style ResInterceptor fill:#e1f0ff style ResErrorInterceptor fill:#ffe1f0