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