flowchart TB Start([Header Interpreter Entry]) --> CheckHeaders{Headers exist?} CheckHeaders -->|No| ReturnNotEnough["Return 'not enough headers'"] CheckHeaders -->|Yes| GetCacheControl[Extract Cache-Control header] GetCacheControl --> HasCacheControl{Cache-Control
header exists?} HasCacheControl -->|Yes| ParseCC[Parse Cache-Control using cache-parser] ParseCC --> CheckNoCache{Has no-cache
OR no-store?} CheckNoCache -->|Yes| ReturnDontCache["Return 'dont cache'"] CheckNoCache -->|No| CheckPrivate{Has private
AND location is server?} CheckPrivate -->|Yes| ReturnDontCache CheckPrivate -->|No| CheckImmutable{Has immutable
directive?} CheckImmutable -->|Yes| ReturnYear["Return cache: 1 year
(31,536,000,000 ms)
Immutable = very long cache"] CheckImmutable -->|No| CheckMaxAge{Has max-age
directive?} CheckMaxAge -->|Yes| CheckAge{Has Age
header?} CheckAge -->|Yes| CalcWithAge["Calculate: (max-age - age) * 1000
Subtract age from max-age"] CheckAge -->|No| CalcNoAge["Calculate: max-age * 1000
Full max-age time"] CalcWithAge --> CheckStale CalcNoAge --> CheckStale CheckStale{Has max-stale OR
stale-while-revalidate?} CheckStale -->|max-stale| ReturnWithMaxStale["Return:
cache: calculated TTL
stale: max-stale * 1000"] CheckStale -->|stale-while-revalidate| ReturnWithSWR["Return:
cache: calculated TTL
stale: stale-while-revalidate * 1000"] CheckStale -->|No| ReturnJustCache["Return:
cache: calculated TTL
stale: undefined"] CheckMaxAge -->|No| CheckExpires HasCacheControl -->|No| CheckExpires CheckExpires{Has Expires
header?} CheckExpires -->|Yes| ParseExpires[Parse Expires date] ParseExpires --> CalcExpires["Calculate: Date.parse(expires) - Date.now()"] CalcExpires --> CheckPositive{Milliseconds >= 0?} CheckPositive -->|Yes| ReturnExpires["Return:
cache: calculated milliseconds"] CheckPositive -->|No| ReturnDontCache CheckExpires -->|No| ReturnNotEnough ReturnNotEnough --> End([Return to caller]) ReturnDontCache --> End ReturnYear --> End ReturnWithMaxStale --> End ReturnWithSWR --> End ReturnJustCache --> End ReturnExpires --> End Note1[Cache-Control Directives Priority:
1. no-cache/no-store/private → dont cache
2. immutable → 1 year
3. max-age + max-stale → cache + stale
4. max-age + stale-while-revalidate → cache + stale
5. max-age only → cache only] Note2[Age Header:
Indicates response age in seconds
Subtracted from max-age to get remaining time
Common in CDN/proxy responses] Note3[Stale Directives:
max-stale: Preferred for background revalidation
stale-while-revalidate: Alternative stale extension
Both extend usability beyond TTL] Note4[Expires Header:
Fallback if no Cache-Control
HTTP/1.0 compatibility
Less precise than max-age] Note5[Return Values:
'dont cache' → Reject caching
'not enough headers' → Use config.ttl
Number/Object → Use calculated TTL] style Start fill:#e1f5e1 style End fill:#e1f5e1 style ReturnDontCache fill:#ffe1e1 style ReturnNotEnough fill:#fff4e1 style ReturnYear fill:#d1ffe1 style ReturnWithMaxStale fill:#d1ffe1 style ReturnWithSWR fill:#d1ffe1 style ReturnJustCache fill:#d1ffe1 style ReturnExpires fill:#d1ffe1 style Note1 fill:#e1f0ff,stroke:#333,stroke-width:2px style Note2 fill:#e1f0ff,stroke:#333,stroke-width:2px style Note3 fill:#e1f0ff,stroke:#333,stroke-width:2px style Note4 fill:#e1f0ff,stroke:#333,stroke-width:2px style Note5 fill:#e1f0ff,stroke:#333,stroke-width:2px