UNPKG

@thisisagile/easy

Version:

Straightforward library for building domain-driven microservice architectures

52 lines (32 loc) 2.03 kB
import { cacheAge, CacheAge, isCacheAge } from '../types/CacheAge'; import { on } from '../types/Constructor'; import { entries } from '../types/Object'; import { ifDefined } from '../utils/If'; export class CacheControl { name = 'Cache-Control'; protected constructor( readonly enabled = true, private directives: Record<string, boolean | CacheAge | undefined> = {} ) {} static disabled = () => new CacheControl(false); static OneSecond = () => new CacheControl().maxAge(1).staleWhileRevalidate(1); static fiveSeconds = () => new CacheControl().maxAge(5).staleWhileRevalidate(5); static tenSeconds = () => new CacheControl().maxAge(10).staleWhileRevalidate(10); static thirtySeconds = () => new CacheControl().maxAge(30).staleWhileRevalidate(30); static sixtySeconds = () => new CacheControl().maxAge(60).staleWhileRevalidate(60); static custom = (maxAge?: CacheAge, staleWhileRevalidate?: CacheAge) => new CacheControl().maxAge(maxAge).staleWhileRevalidate(staleWhileRevalidate); readonly maxAge = (ca?: CacheAge): this => on(this, t => (t.directives['max-age'] = ca)); readonly sharedMaxAge = (ca?: CacheAge): this => on(this, t => (t.directives['s-maxage'] = ca)); readonly noCache = (a?: boolean): this => on(this, t => (t.directives['no-cache'] = a)); readonly mustRevalidate = (a?: boolean): this => on(this, t => (t.directives['must-revalidate'] = a)); readonly private = (a?: boolean): this => on(this, t => (t.directives['private'] = a)); readonly public = (a?: boolean): this => on(this, t => (t.directives['public'] = a)); readonly immutable = (a?: boolean): this => on(this, t => (t.directives['immutable'] = a)); readonly staleWhileRevalidate = (ca?: CacheAge): this => on(this, t => (t.directives['stale-while-revalidate'] = ca)); value = (): string => this.toString(); toString(): string { return entries(this.directives) .mapDefined(([k, v]) => ifDefined(v, isCacheAge(v) ? `${k}=${cacheAge.toSeconds(v)}` : k)) .join(','); } }