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