Skip to content

Repository files navigation

SharedCache

CInpm versionTypeScriptLicense: MITcodecovNode.jsDenoBunWinterCGRFC Compliant

A standards-compliant HTTP cache implementation for server-side applications.

SharedCache is an HTTP caching library that follows Web Standards and HTTP specifications. It implements a cache interface similar to the Web Cache API but optimized for server-side shared caching scenarios.

📋 Table of Contents

✨ Key Features

  • 📋 RFC Compliance: Supports RFC 5861 directives like stale-if-error and stale-while-revalidate
  • 🎯 Smart Caching: Handles complex HTTP scenarios including Vary headers, proxy revalidation, and authenticated responses
  • 🔧 Flexible Storage: Pluggable storage backend supporting memory, Redis, or any custom key-value store
  • 🚀 Enhanced Fetch: Extends the standard fetch API with caching capabilities while maintaining full compatibility
  • 🔌 Middleware Origin: createCacheHandler for in-process handlers (e.g. middleware next())
  • 🎛️ Custom Cache Keys: Cache key customization supporting device types, cookies, headers, and URL components
  • Shared Cache Optimization: Prioritizes s-maxage over max-age for shared cache performance
  • 🌍 Universal Runtime: Compatible with WinterCG environments including Node.js, Deno, Bun, and Edge Runtime

🤔 Why SharedCache?

While the Web fetch API has become ubiquitous in server-side JavaScript, existing browser Cache APIs are designed for single-user scenarios. Server-side applications need shared caches that serve multiple users efficiently.

SharedCache provides:

  • Server-Optimized Caching: Designed for multi-user server environments
  • Standards Compliance: Follows HTTP specifications and server-specific patterns
  • Production Ready: Battle-tested patterns from CDN and proxy implementations

⚡ Quick Decision Guide

✅ Use SharedCache When:

  • Node.js environments - Native caches API not available
  • API response caching - Need to reduce backend load and improve response times
  • Cross-runtime portability - Want consistent caching across Node.js, Deno, Bun
  • Custom storage backends - Need Redis, database, or distributed caching solutions
  • Meta-framework development - Building applications that deploy to multiple environments

❌ Don't Use SharedCache When:

  • Edge runtimes with native caches - Cloudflare Workers, Vercel Edge already provide caches API
  • Browser applications - Use the native Web Cache API instead (unless you need HTTP cache control directives support)
  • Simple in-memory caching - Consider lighter alternatives like lru-cache directly
  • Single-request caching - Basic memoization might be sufficient

📦 Installation

npm install @web-widget/shared-cache
# Using yarn
yarn add @web-widget/shared-cache
# Using pnpm
pnpm add @web-widget/shared-cache

🚀 Quick Start

import{CacheStorage,createFetch,typeKVStorage,}from'@web-widget/shared-cache';import{LRUCache}from'lru-cache';constcreateLRUCache=(): KVStorage=>{conststore=newLRUCache<string,any>({max: 1024});return{asyncget(cacheKey: string){returnstore.get(cacheKey);},asyncset(cacheKey: string,value: any,ttl?: number){store.set(cacheKey,value,{ ttl });},asyncdelete(cacheKey: string){returnstore.delete(cacheKey);},};};constcaches=newCacheStorage(createLRUCache());asyncfunctionexample(){constcache=awaitcaches.open('api-cache-v1');constfetch=createFetch(cache,{defaults: {cacheControlOverride: 's-maxage=300',ignoreRequestCacheControl: true,},});constresponse1=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// First request: networkconstresponse2=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// Second request: cacheconsole.log(response2.headers.get('x-cache-status'));// "HIT"}example();

Core APIs

ExportPurpose
createFetchOutbound HTTP fetch with caching
createCacheHandlerIn-process origin (middleware / SSR)
CacheStorage / CacheCache storage and operations
KVStoragePluggable storage backend interface

Every response includes an x-cache-status header (HIT, MISS, UPDATING, STALE, …) for debugging. See the configuration guide for the full status table.

📋 Standards Compliance

SharedCache is built for production HTTP caching with full adherence to web standards:

StandardStatusCoverage
RFC 7234 (HTTP Caching)✅ Fully Compliant100%
RFC 5861 (stale-* extensions)✅ Fully Compliant100%
Web Cache API✅ SubsetCore methods (match, put, delete)
WinterCG✅ Fully Supported100%

Highlights:

  • RFC 7234: Cache-Control directives, GET/HEAD caching, Vary processing, conditional requests
  • RFC 5861: stale-while-revalidate and stale-if-error via createFetch
  • Web Cache API: Core methods with HTTP semantics; match() / delete() support ignoreMethod (same subset as Cloudflare Workers Cache API)
  • Security: Requests with Authorization headers are not cached unless the response explicitly allows it (public, s-maxage, etc.)

Powered by http-cache-semantics for RFC-compliant cache policy evaluation.

→ Full standards compliance guide — Web Cache API details, security notes, and implementation status.

☁️ Cloudflare Comparison

SharedCache is designed for origin-side caching (application servers with pluggable KVStorage such as Redis or S3), not as a replacement for Cloudflare's global edge cache. Where it helps to align with Cloudflare semantics, the library mirrors familiar patterns from the CDN and Workers Cache API:

  • Cache Key — public cacheKeyRules (search, header, cookie, device) vs Cloudflare Cache Rules
  • Cache Statusx-cache-status (HIT, MISS, UPDATING, STALE, …) vs CF-Cache-Status
  • Workers Cache APImatch() / delete() with ignoreMethod only; no ignoreSearch / ignoreVary
  • StorageKVStorage at the origin vs platform-managed edge / Workers cache

→ Full comparison guide — quick reference table and detailed notes.

📖 Documentation

GuideDescription
ExamplesRedis, multi-tenant, authentication, and custom storage patterns
ConfigurationGlobal setup, sharedCache options, cache key rules, and monitoring
API ReferenceComplete API signatures and type definitions
LoggingLogger setup, log levels, and debugging techniques
FAQStorage backends, edge runtimes, Vary performance, and more
Standards ComplianceRFC details, Web Cache API subset, and security notes
Cloudflare ComparisonMapping to Cloudflare Cache Rules and Workers Cache API

🤝 Who's Using SharedCache

🙏 Acknowledgments

SharedCache draws inspiration from industry-leading caching implementations:

📄 License

MIT License - see LICENSE file for details.

About

🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - web-widget/shared-cache: 🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support · GitHub
Skip to content

Repository files navigation

SharedCache

CInpm versionTypeScriptLicense: MITcodecovNode.jsDenoBunWinterCGRFC Compliant

A standards-compliant HTTP cache implementation for server-side applications.

SharedCache is an HTTP caching library that follows Web Standards and HTTP specifications. It implements a cache interface similar to the Web Cache API but optimized for server-side shared caching scenarios.

📋 Table of Contents

✨ Key Features

  • 📋 RFC Compliance: Supports RFC 5861 directives like stale-if-error and stale-while-revalidate
  • 🎯 Smart Caching: Handles complex HTTP scenarios including Vary headers, proxy revalidation, and authenticated responses
  • 🔧 Flexible Storage: Pluggable storage backend supporting memory, Redis, or any custom key-value store
  • 🚀 Enhanced Fetch: Extends the standard fetch API with caching capabilities while maintaining full compatibility
  • 🔌 Middleware Origin: createCacheHandler for in-process handlers (e.g. middleware next())
  • 🎛️ Custom Cache Keys: Cache key customization supporting device types, cookies, headers, and URL components
  • Shared Cache Optimization: Prioritizes s-maxage over max-age for shared cache performance
  • 🌍 Universal Runtime: Compatible with WinterCG environments including Node.js, Deno, Bun, and Edge Runtime

🤔 Why SharedCache?

While the Web fetch API has become ubiquitous in server-side JavaScript, existing browser Cache APIs are designed for single-user scenarios. Server-side applications need shared caches that serve multiple users efficiently.

SharedCache provides:

  • Server-Optimized Caching: Designed for multi-user server environments
  • Standards Compliance: Follows HTTP specifications and server-specific patterns
  • Production Ready: Battle-tested patterns from CDN and proxy implementations

⚡ Quick Decision Guide

✅ Use SharedCache When:

  • Node.js environments - Native caches API not available
  • API response caching - Need to reduce backend load and improve response times
  • Cross-runtime portability - Want consistent caching across Node.js, Deno, Bun
  • Custom storage backends - Need Redis, database, or distributed caching solutions
  • Meta-framework development - Building applications that deploy to multiple environments

❌ Don't Use SharedCache When:

  • Edge runtimes with native caches - Cloudflare Workers, Vercel Edge already provide caches API
  • Browser applications - Use the native Web Cache API instead (unless you need HTTP cache control directives support)
  • Simple in-memory caching - Consider lighter alternatives like lru-cache directly
  • Single-request caching - Basic memoization might be sufficient

📦 Installation

npm install @web-widget/shared-cache
# Using yarn
yarn add @web-widget/shared-cache
# Using pnpm
pnpm add @web-widget/shared-cache

🚀 Quick Start

import{CacheStorage,createFetch,typeKVStorage,}from'@web-widget/shared-cache';import{LRUCache}from'lru-cache';constcreateLRUCache=(): KVStorage=>{conststore=newLRUCache<string,any>({max: 1024});return{asyncget(cacheKey: string){returnstore.get(cacheKey);},asyncset(cacheKey: string,value: any,ttl?: number){store.set(cacheKey,value,{ ttl });},asyncdelete(cacheKey: string){returnstore.delete(cacheKey);},};};constcaches=newCacheStorage(createLRUCache());asyncfunctionexample(){constcache=awaitcaches.open('api-cache-v1');constfetch=createFetch(cache,{defaults: {cacheControlOverride: 's-maxage=300',ignoreRequestCacheControl: true,},});constresponse1=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// First request: networkconstresponse2=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// Second request: cacheconsole.log(response2.headers.get('x-cache-status'));// "HIT"}example();

Core APIs

ExportPurpose
createFetchOutbound HTTP fetch with caching
createCacheHandlerIn-process origin (middleware / SSR)
CacheStorage / CacheCache storage and operations
KVStoragePluggable storage backend interface

Every response includes an x-cache-status header (HIT, MISS, UPDATING, STALE, …) for debugging. See the configuration guide for the full status table.

📋 Standards Compliance

SharedCache is built for production HTTP caching with full adherence to web standards:

StandardStatusCoverage
RFC 7234 (HTTP Caching)✅ Fully Compliant100%
RFC 5861 (stale-* extensions)✅ Fully Compliant100%
Web Cache API✅ SubsetCore methods (match, put, delete)
WinterCG✅ Fully Supported100%

Highlights:

  • RFC 7234: Cache-Control directives, GET/HEAD caching, Vary processing, conditional requests
  • RFC 5861: stale-while-revalidate and stale-if-error via createFetch
  • Web Cache API: Core methods with HTTP semantics; match() / delete() support ignoreMethod (same subset as Cloudflare Workers Cache API)
  • Security: Requests with Authorization headers are not cached unless the response explicitly allows it (public, s-maxage, etc.)

Powered by http-cache-semantics for RFC-compliant cache policy evaluation.

→ Full standards compliance guide — Web Cache API details, security notes, and implementation status.

☁️ Cloudflare Comparison

SharedCache is designed for origin-side caching (application servers with pluggable KVStorage such as Redis or S3), not as a replacement for Cloudflare's global edge cache. Where it helps to align with Cloudflare semantics, the library mirrors familiar patterns from the CDN and Workers Cache API:

  • Cache Key — public cacheKeyRules (search, header, cookie, device) vs Cloudflare Cache Rules
  • Cache Statusx-cache-status (HIT, MISS, UPDATING, STALE, …) vs CF-Cache-Status
  • Workers Cache APImatch() / delete() with ignoreMethod only; no ignoreSearch / ignoreVary
  • StorageKVStorage at the origin vs platform-managed edge / Workers cache

→ Full comparison guide — quick reference table and detailed notes.

📖 Documentation

GuideDescription
ExamplesRedis, multi-tenant, authentication, and custom storage patterns
ConfigurationGlobal setup, sharedCache options, cache key rules, and monitoring
API ReferenceComplete API signatures and type definitions
LoggingLogger setup, log levels, and debugging techniques
FAQStorage backends, edge runtimes, Vary performance, and more
Standards ComplianceRFC details, Web Cache API subset, and security notes
Cloudflare ComparisonMapping to Cloudflare Cache Rules and Workers Cache API

🤝 Who's Using SharedCache

🙏 Acknowledgments

SharedCache draws inspiration from industry-leading caching implementations:

📄 License

MIT License - see LICENSE file for details.

About

🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - web-widget/shared-cache: 🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support · GitHub
Skip to content

Repository files navigation

SharedCache

CInpm versionTypeScriptLicense: MITcodecovNode.jsDenoBunWinterCGRFC Compliant

A standards-compliant HTTP cache implementation for server-side applications.

SharedCache is an HTTP caching library that follows Web Standards and HTTP specifications. It implements a cache interface similar to the Web Cache API but optimized for server-side shared caching scenarios.

📋 Table of Contents

✨ Key Features

  • 📋 RFC Compliance: Supports RFC 5861 directives like stale-if-error and stale-while-revalidate
  • 🎯 Smart Caching: Handles complex HTTP scenarios including Vary headers, proxy revalidation, and authenticated responses
  • 🔧 Flexible Storage: Pluggable storage backend supporting memory, Redis, or any custom key-value store
  • 🚀 Enhanced Fetch: Extends the standard fetch API with caching capabilities while maintaining full compatibility
  • 🔌 Middleware Origin: createCacheHandler for in-process handlers (e.g. middleware next())
  • 🎛️ Custom Cache Keys: Cache key customization supporting device types, cookies, headers, and URL components
  • Shared Cache Optimization: Prioritizes s-maxage over max-age for shared cache performance
  • 🌍 Universal Runtime: Compatible with WinterCG environments including Node.js, Deno, Bun, and Edge Runtime

🤔 Why SharedCache?

While the Web fetch API has become ubiquitous in server-side JavaScript, existing browser Cache APIs are designed for single-user scenarios. Server-side applications need shared caches that serve multiple users efficiently.

SharedCache provides:

  • Server-Optimized Caching: Designed for multi-user server environments
  • Standards Compliance: Follows HTTP specifications and server-specific patterns
  • Production Ready: Battle-tested patterns from CDN and proxy implementations

⚡ Quick Decision Guide

✅ Use SharedCache When:

  • Node.js environments - Native caches API not available
  • API response caching - Need to reduce backend load and improve response times
  • Cross-runtime portability - Want consistent caching across Node.js, Deno, Bun
  • Custom storage backends - Need Redis, database, or distributed caching solutions
  • Meta-framework development - Building applications that deploy to multiple environments

❌ Don't Use SharedCache When:

  • Edge runtimes with native caches - Cloudflare Workers, Vercel Edge already provide caches API
  • Browser applications - Use the native Web Cache API instead (unless you need HTTP cache control directives support)
  • Simple in-memory caching - Consider lighter alternatives like lru-cache directly
  • Single-request caching - Basic memoization might be sufficient

📦 Installation

npm install @web-widget/shared-cache
# Using yarn
yarn add @web-widget/shared-cache
# Using pnpm
pnpm add @web-widget/shared-cache

🚀 Quick Start

import{CacheStorage,createFetch,typeKVStorage,}from'@web-widget/shared-cache';import{LRUCache}from'lru-cache';constcreateLRUCache=(): KVStorage=>{conststore=newLRUCache<string,any>({max: 1024});return{asyncget(cacheKey: string){returnstore.get(cacheKey);},asyncset(cacheKey: string,value: any,ttl?: number){store.set(cacheKey,value,{ ttl });},asyncdelete(cacheKey: string){returnstore.delete(cacheKey);},};};constcaches=newCacheStorage(createLRUCache());asyncfunctionexample(){constcache=awaitcaches.open('api-cache-v1');constfetch=createFetch(cache,{defaults: {cacheControlOverride: 's-maxage=300',ignoreRequestCacheControl: true,},});constresponse1=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// First request: networkconstresponse2=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// Second request: cacheconsole.log(response2.headers.get('x-cache-status'));// "HIT"}example();

Core APIs

ExportPurpose
createFetchOutbound HTTP fetch with caching
createCacheHandlerIn-process origin (middleware / SSR)
CacheStorage / CacheCache storage and operations
KVStoragePluggable storage backend interface

Every response includes an x-cache-status header (HIT, MISS, UPDATING, STALE, …) for debugging. See the configuration guide for the full status table.

📋 Standards Compliance

SharedCache is built for production HTTP caching with full adherence to web standards:

StandardStatusCoverage
RFC 7234 (HTTP Caching)✅ Fully Compliant100%
RFC 5861 (stale-* extensions)✅ Fully Compliant100%
Web Cache API✅ SubsetCore methods (match, put, delete)
WinterCG✅ Fully Supported100%

Highlights:

  • RFC 7234: Cache-Control directives, GET/HEAD caching, Vary processing, conditional requests
  • RFC 5861: stale-while-revalidate and stale-if-error via createFetch
  • Web Cache API: Core methods with HTTP semantics; match() / delete() support ignoreMethod (same subset as Cloudflare Workers Cache API)
  • Security: Requests with Authorization headers are not cached unless the response explicitly allows it (public, s-maxage, etc.)

Powered by http-cache-semantics for RFC-compliant cache policy evaluation.

→ Full standards compliance guide — Web Cache API details, security notes, and implementation status.

☁️ Cloudflare Comparison

SharedCache is designed for origin-side caching (application servers with pluggable KVStorage such as Redis or S3), not as a replacement for Cloudflare's global edge cache. Where it helps to align with Cloudflare semantics, the library mirrors familiar patterns from the CDN and Workers Cache API:

  • Cache Key — public cacheKeyRules (search, header, cookie, device) vs Cloudflare Cache Rules
  • Cache Statusx-cache-status (HIT, MISS, UPDATING, STALE, …) vs CF-Cache-Status
  • Workers Cache APImatch() / delete() with ignoreMethod only; no ignoreSearch / ignoreVary
  • StorageKVStorage at the origin vs platform-managed edge / Workers cache

→ Full comparison guide — quick reference table and detailed notes.

📖 Documentation

GuideDescription
ExamplesRedis, multi-tenant, authentication, and custom storage patterns
ConfigurationGlobal setup, sharedCache options, cache key rules, and monitoring
API ReferenceComplete API signatures and type definitions
LoggingLogger setup, log levels, and debugging techniques
FAQStorage backends, edge runtimes, Vary performance, and more
Standards ComplianceRFC details, Web Cache API subset, and security notes
Cloudflare ComparisonMapping to Cloudflare Cache Rules and Workers Cache API

🤝 Who's Using SharedCache

🙏 Acknowledgments

SharedCache draws inspiration from industry-leading caching implementations:

📄 License

MIT License - see LICENSE file for details.

About

🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - web-widget/shared-cache: 🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support · GitHub
Skip to content

Repository files navigation

SharedCache

CInpm versionTypeScriptLicense: MITcodecovNode.jsDenoBunWinterCGRFC Compliant

A standards-compliant HTTP cache implementation for server-side applications.

SharedCache is an HTTP caching library that follows Web Standards and HTTP specifications. It implements a cache interface similar to the Web Cache API but optimized for server-side shared caching scenarios.

📋 Table of Contents

✨ Key Features

  • 📋 RFC Compliance: Supports RFC 5861 directives like stale-if-error and stale-while-revalidate
  • 🎯 Smart Caching: Handles complex HTTP scenarios including Vary headers, proxy revalidation, and authenticated responses
  • 🔧 Flexible Storage: Pluggable storage backend supporting memory, Redis, or any custom key-value store
  • 🚀 Enhanced Fetch: Extends the standard fetch API with caching capabilities while maintaining full compatibility
  • 🔌 Middleware Origin: createCacheHandler for in-process handlers (e.g. middleware next())
  • 🎛️ Custom Cache Keys: Cache key customization supporting device types, cookies, headers, and URL components
  • Shared Cache Optimization: Prioritizes s-maxage over max-age for shared cache performance
  • 🌍 Universal Runtime: Compatible with WinterCG environments including Node.js, Deno, Bun, and Edge Runtime

🤔 Why SharedCache?

While the Web fetch API has become ubiquitous in server-side JavaScript, existing browser Cache APIs are designed for single-user scenarios. Server-side applications need shared caches that serve multiple users efficiently.

SharedCache provides:

  • Server-Optimized Caching: Designed for multi-user server environments
  • Standards Compliance: Follows HTTP specifications and server-specific patterns
  • Production Ready: Battle-tested patterns from CDN and proxy implementations

⚡ Quick Decision Guide

✅ Use SharedCache When:

  • Node.js environments - Native caches API not available
  • API response caching - Need to reduce backend load and improve response times
  • Cross-runtime portability - Want consistent caching across Node.js, Deno, Bun
  • Custom storage backends - Need Redis, database, or distributed caching solutions
  • Meta-framework development - Building applications that deploy to multiple environments

❌ Don't Use SharedCache When:

  • Edge runtimes with native caches - Cloudflare Workers, Vercel Edge already provide caches API
  • Browser applications - Use the native Web Cache API instead (unless you need HTTP cache control directives support)
  • Simple in-memory caching - Consider lighter alternatives like lru-cache directly
  • Single-request caching - Basic memoization might be sufficient

📦 Installation

npm install @web-widget/shared-cache
# Using yarn
yarn add @web-widget/shared-cache
# Using pnpm
pnpm add @web-widget/shared-cache

🚀 Quick Start

import{CacheStorage,createFetch,typeKVStorage,}from'@web-widget/shared-cache';import{LRUCache}from'lru-cache';constcreateLRUCache=(): KVStorage=>{conststore=newLRUCache<string,any>({max: 1024});return{asyncget(cacheKey: string){returnstore.get(cacheKey);},asyncset(cacheKey: string,value: any,ttl?: number){store.set(cacheKey,value,{ ttl });},asyncdelete(cacheKey: string){returnstore.delete(cacheKey);},};};constcaches=newCacheStorage(createLRUCache());asyncfunctionexample(){constcache=awaitcaches.open('api-cache-v1');constfetch=createFetch(cache,{defaults: {cacheControlOverride: 's-maxage=300',ignoreRequestCacheControl: true,},});constresponse1=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// First request: networkconstresponse2=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// Second request: cacheconsole.log(response2.headers.get('x-cache-status'));// "HIT"}example();

Core APIs

ExportPurpose
createFetchOutbound HTTP fetch with caching
createCacheHandlerIn-process origin (middleware / SSR)
CacheStorage / CacheCache storage and operations
KVStoragePluggable storage backend interface

Every response includes an x-cache-status header (HIT, MISS, UPDATING, STALE, …) for debugging. See the configuration guide for the full status table.

📋 Standards Compliance

SharedCache is built for production HTTP caching with full adherence to web standards:

StandardStatusCoverage
RFC 7234 (HTTP Caching)✅ Fully Compliant100%
RFC 5861 (stale-* extensions)✅ Fully Compliant100%
Web Cache API✅ SubsetCore methods (match, put, delete)
WinterCG✅ Fully Supported100%

Highlights:

  • RFC 7234: Cache-Control directives, GET/HEAD caching, Vary processing, conditional requests
  • RFC 5861: stale-while-revalidate and stale-if-error via createFetch
  • Web Cache API: Core methods with HTTP semantics; match() / delete() support ignoreMethod (same subset as Cloudflare Workers Cache API)
  • Security: Requests with Authorization headers are not cached unless the response explicitly allows it (public, s-maxage, etc.)

Powered by http-cache-semantics for RFC-compliant cache policy evaluation.

→ Full standards compliance guide — Web Cache API details, security notes, and implementation status.

☁️ Cloudflare Comparison

SharedCache is designed for origin-side caching (application servers with pluggable KVStorage such as Redis or S3), not as a replacement for Cloudflare's global edge cache. Where it helps to align with Cloudflare semantics, the library mirrors familiar patterns from the CDN and Workers Cache API:

  • Cache Key — public cacheKeyRules (search, header, cookie, device) vs Cloudflare Cache Rules
  • Cache Statusx-cache-status (HIT, MISS, UPDATING, STALE, …) vs CF-Cache-Status
  • Workers Cache APImatch() / delete() with ignoreMethod only; no ignoreSearch / ignoreVary
  • StorageKVStorage at the origin vs platform-managed edge / Workers cache

→ Full comparison guide — quick reference table and detailed notes.

📖 Documentation

GuideDescription
ExamplesRedis, multi-tenant, authentication, and custom storage patterns
ConfigurationGlobal setup, sharedCache options, cache key rules, and monitoring
API ReferenceComplete API signatures and type definitions
LoggingLogger setup, log levels, and debugging techniques
FAQStorage backends, edge runtimes, Vary performance, and more
Standards ComplianceRFC details, Web Cache API subset, and security notes
Cloudflare ComparisonMapping to Cloudflare Cache Rules and Workers Cache API

🤝 Who's Using SharedCache

🙏 Acknowledgments

SharedCache draws inspiration from industry-leading caching implementations:

📄 License

MIT License - see LICENSE file for details.

About

🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - web-widget/shared-cache: 🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support · GitHub
Skip to content

Repository files navigation

SharedCache

CInpm versionTypeScriptLicense: MITcodecovNode.jsDenoBunWinterCGRFC Compliant

A standards-compliant HTTP cache implementation for server-side applications.

SharedCache is an HTTP caching library that follows Web Standards and HTTP specifications. It implements a cache interface similar to the Web Cache API but optimized for server-side shared caching scenarios.

📋 Table of Contents

✨ Key Features

  • 📋 RFC Compliance: Supports RFC 5861 directives like stale-if-error and stale-while-revalidate
  • 🎯 Smart Caching: Handles complex HTTP scenarios including Vary headers, proxy revalidation, and authenticated responses
  • 🔧 Flexible Storage: Pluggable storage backend supporting memory, Redis, or any custom key-value store
  • 🚀 Enhanced Fetch: Extends the standard fetch API with caching capabilities while maintaining full compatibility
  • 🔌 Middleware Origin: createCacheHandler for in-process handlers (e.g. middleware next())
  • 🎛️ Custom Cache Keys: Cache key customization supporting device types, cookies, headers, and URL components
  • Shared Cache Optimization: Prioritizes s-maxage over max-age for shared cache performance
  • 🌍 Universal Runtime: Compatible with WinterCG environments including Node.js, Deno, Bun, and Edge Runtime

🤔 Why SharedCache?

While the Web fetch API has become ubiquitous in server-side JavaScript, existing browser Cache APIs are designed for single-user scenarios. Server-side applications need shared caches that serve multiple users efficiently.

SharedCache provides:

  • Server-Optimized Caching: Designed for multi-user server environments
  • Standards Compliance: Follows HTTP specifications and server-specific patterns
  • Production Ready: Battle-tested patterns from CDN and proxy implementations

⚡ Quick Decision Guide

✅ Use SharedCache When:

  • Node.js environments - Native caches API not available
  • API response caching - Need to reduce backend load and improve response times
  • Cross-runtime portability - Want consistent caching across Node.js, Deno, Bun
  • Custom storage backends - Need Redis, database, or distributed caching solutions
  • Meta-framework development - Building applications that deploy to multiple environments

❌ Don't Use SharedCache When:

  • Edge runtimes with native caches - Cloudflare Workers, Vercel Edge already provide caches API
  • Browser applications - Use the native Web Cache API instead (unless you need HTTP cache control directives support)
  • Simple in-memory caching - Consider lighter alternatives like lru-cache directly
  • Single-request caching - Basic memoization might be sufficient

📦 Installation

npm install @web-widget/shared-cache
# Using yarn
yarn add @web-widget/shared-cache
# Using pnpm
pnpm add @web-widget/shared-cache

🚀 Quick Start

import{CacheStorage,createFetch,typeKVStorage,}from'@web-widget/shared-cache';import{LRUCache}from'lru-cache';constcreateLRUCache=(): KVStorage=>{conststore=newLRUCache<string,any>({max: 1024});return{asyncget(cacheKey: string){returnstore.get(cacheKey);},asyncset(cacheKey: string,value: any,ttl?: number){store.set(cacheKey,value,{ ttl });},asyncdelete(cacheKey: string){returnstore.delete(cacheKey);},};};constcaches=newCacheStorage(createLRUCache());asyncfunctionexample(){constcache=awaitcaches.open('api-cache-v1');constfetch=createFetch(cache,{defaults: {cacheControlOverride: 's-maxage=300',ignoreRequestCacheControl: true,},});constresponse1=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// First request: networkconstresponse2=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// Second request: cacheconsole.log(response2.headers.get('x-cache-status'));// "HIT"}example();

Core APIs

ExportPurpose
createFetchOutbound HTTP fetch with caching
createCacheHandlerIn-process origin (middleware / SSR)
CacheStorage / CacheCache storage and operations
KVStoragePluggable storage backend interface

Every response includes an x-cache-status header (HIT, MISS, UPDATING, STALE, …) for debugging. See the configuration guide for the full status table.

📋 Standards Compliance

SharedCache is built for production HTTP caching with full adherence to web standards:

StandardStatusCoverage
RFC 7234 (HTTP Caching)✅ Fully Compliant100%
RFC 5861 (stale-* extensions)✅ Fully Compliant100%
Web Cache API✅ SubsetCore methods (match, put, delete)
WinterCG✅ Fully Supported100%

Highlights:

  • RFC 7234: Cache-Control directives, GET/HEAD caching, Vary processing, conditional requests
  • RFC 5861: stale-while-revalidate and stale-if-error via createFetch
  • Web Cache API: Core methods with HTTP semantics; match() / delete() support ignoreMethod (same subset as Cloudflare Workers Cache API)
  • Security: Requests with Authorization headers are not cached unless the response explicitly allows it (public, s-maxage, etc.)

Powered by http-cache-semantics for RFC-compliant cache policy evaluation.

→ Full standards compliance guide — Web Cache API details, security notes, and implementation status.

☁️ Cloudflare Comparison

SharedCache is designed for origin-side caching (application servers with pluggable KVStorage such as Redis or S3), not as a replacement for Cloudflare's global edge cache. Where it helps to align with Cloudflare semantics, the library mirrors familiar patterns from the CDN and Workers Cache API:

  • Cache Key — public cacheKeyRules (search, header, cookie, device) vs Cloudflare Cache Rules
  • Cache Statusx-cache-status (HIT, MISS, UPDATING, STALE, …) vs CF-Cache-Status
  • Workers Cache APImatch() / delete() with ignoreMethod only; no ignoreSearch / ignoreVary
  • StorageKVStorage at the origin vs platform-managed edge / Workers cache

→ Full comparison guide — quick reference table and detailed notes.

📖 Documentation

GuideDescription
ExamplesRedis, multi-tenant, authentication, and custom storage patterns
ConfigurationGlobal setup, sharedCache options, cache key rules, and monitoring
API ReferenceComplete API signatures and type definitions
LoggingLogger setup, log levels, and debugging techniques
FAQStorage backends, edge runtimes, Vary performance, and more
Standards ComplianceRFC details, Web Cache API subset, and security notes
Cloudflare ComparisonMapping to Cloudflare Cache Rules and Workers Cache API

🤝 Who's Using SharedCache

🙏 Acknowledgments

SharedCache draws inspiration from industry-leading caching implementations:

📄 License

MIT License - see LICENSE file for details.

About

🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - web-widget/shared-cache: 🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support · GitHub
Skip to content

Repository files navigation

SharedCache

CInpm versionTypeScriptLicense: MITcodecovNode.jsDenoBunWinterCGRFC Compliant

A standards-compliant HTTP cache implementation for server-side applications.

SharedCache is an HTTP caching library that follows Web Standards and HTTP specifications. It implements a cache interface similar to the Web Cache API but optimized for server-side shared caching scenarios.

📋 Table of Contents

✨ Key Features

  • 📋 RFC Compliance: Supports RFC 5861 directives like stale-if-error and stale-while-revalidate
  • 🎯 Smart Caching: Handles complex HTTP scenarios including Vary headers, proxy revalidation, and authenticated responses
  • 🔧 Flexible Storage: Pluggable storage backend supporting memory, Redis, or any custom key-value store
  • 🚀 Enhanced Fetch: Extends the standard fetch API with caching capabilities while maintaining full compatibility
  • 🔌 Middleware Origin: createCacheHandler for in-process handlers (e.g. middleware next())
  • 🎛️ Custom Cache Keys: Cache key customization supporting device types, cookies, headers, and URL components
  • Shared Cache Optimization: Prioritizes s-maxage over max-age for shared cache performance
  • 🌍 Universal Runtime: Compatible with WinterCG environments including Node.js, Deno, Bun, and Edge Runtime

🤔 Why SharedCache?

While the Web fetch API has become ubiquitous in server-side JavaScript, existing browser Cache APIs are designed for single-user scenarios. Server-side applications need shared caches that serve multiple users efficiently.

SharedCache provides:

  • Server-Optimized Caching: Designed for multi-user server environments
  • Standards Compliance: Follows HTTP specifications and server-specific patterns
  • Production Ready: Battle-tested patterns from CDN and proxy implementations

⚡ Quick Decision Guide

✅ Use SharedCache When:

  • Node.js environments - Native caches API not available
  • API response caching - Need to reduce backend load and improve response times
  • Cross-runtime portability - Want consistent caching across Node.js, Deno, Bun
  • Custom storage backends - Need Redis, database, or distributed caching solutions
  • Meta-framework development - Building applications that deploy to multiple environments

❌ Don't Use SharedCache When:

  • Edge runtimes with native caches - Cloudflare Workers, Vercel Edge already provide caches API
  • Browser applications - Use the native Web Cache API instead (unless you need HTTP cache control directives support)
  • Simple in-memory caching - Consider lighter alternatives like lru-cache directly
  • Single-request caching - Basic memoization might be sufficient

📦 Installation

npm install @web-widget/shared-cache
# Using yarn
yarn add @web-widget/shared-cache
# Using pnpm
pnpm add @web-widget/shared-cache

🚀 Quick Start

import{CacheStorage,createFetch,typeKVStorage,}from'@web-widget/shared-cache';import{LRUCache}from'lru-cache';constcreateLRUCache=(): KVStorage=>{conststore=newLRUCache<string,any>({max: 1024});return{asyncget(cacheKey: string){returnstore.get(cacheKey);},asyncset(cacheKey: string,value: any,ttl?: number){store.set(cacheKey,value,{ ttl });},asyncdelete(cacheKey: string){returnstore.delete(cacheKey);},};};constcaches=newCacheStorage(createLRUCache());asyncfunctionexample(){constcache=awaitcaches.open('api-cache-v1');constfetch=createFetch(cache,{defaults: {cacheControlOverride: 's-maxage=300',ignoreRequestCacheControl: true,},});constresponse1=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// First request: networkconstresponse2=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// Second request: cacheconsole.log(response2.headers.get('x-cache-status'));// "HIT"}example();

Core APIs

ExportPurpose
createFetchOutbound HTTP fetch with caching
createCacheHandlerIn-process origin (middleware / SSR)
CacheStorage / CacheCache storage and operations
KVStoragePluggable storage backend interface

Every response includes an x-cache-status header (HIT, MISS, UPDATING, STALE, …) for debugging. See the configuration guide for the full status table.

📋 Standards Compliance

SharedCache is built for production HTTP caching with full adherence to web standards:

StandardStatusCoverage
RFC 7234 (HTTP Caching)✅ Fully Compliant100%
RFC 5861 (stale-* extensions)✅ Fully Compliant100%
Web Cache API✅ SubsetCore methods (match, put, delete)
WinterCG✅ Fully Supported100%

Highlights:

  • RFC 7234: Cache-Control directives, GET/HEAD caching, Vary processing, conditional requests
  • RFC 5861: stale-while-revalidate and stale-if-error via createFetch
  • Web Cache API: Core methods with HTTP semantics; match() / delete() support ignoreMethod (same subset as Cloudflare Workers Cache API)
  • Security: Requests with Authorization headers are not cached unless the response explicitly allows it (public, s-maxage, etc.)

Powered by http-cache-semantics for RFC-compliant cache policy evaluation.

→ Full standards compliance guide — Web Cache API details, security notes, and implementation status.

☁️ Cloudflare Comparison

SharedCache is designed for origin-side caching (application servers with pluggable KVStorage such as Redis or S3), not as a replacement for Cloudflare's global edge cache. Where it helps to align with Cloudflare semantics, the library mirrors familiar patterns from the CDN and Workers Cache API:

  • Cache Key — public cacheKeyRules (search, header, cookie, device) vs Cloudflare Cache Rules
  • Cache Statusx-cache-status (HIT, MISS, UPDATING, STALE, …) vs CF-Cache-Status
  • Workers Cache APImatch() / delete() with ignoreMethod only; no ignoreSearch / ignoreVary
  • StorageKVStorage at the origin vs platform-managed edge / Workers cache

→ Full comparison guide — quick reference table and detailed notes.

📖 Documentation

GuideDescription
ExamplesRedis, multi-tenant, authentication, and custom storage patterns
ConfigurationGlobal setup, sharedCache options, cache key rules, and monitoring
API ReferenceComplete API signatures and type definitions
LoggingLogger setup, log levels, and debugging techniques
FAQStorage backends, edge runtimes, Vary performance, and more
Standards ComplianceRFC details, Web Cache API subset, and security notes
Cloudflare ComparisonMapping to Cloudflare Cache Rules and Workers Cache API

🤝 Who's Using SharedCache

🙏 Acknowledgments

SharedCache draws inspiration from industry-leading caching implementations:

📄 License

MIT License - see LICENSE file for details.

About

🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - web-widget/shared-cache: 🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support · GitHub
Skip to content

Repository files navigation

SharedCache

CInpm versionTypeScriptLicense: MITcodecovNode.jsDenoBunWinterCGRFC Compliant

A standards-compliant HTTP cache implementation for server-side applications.

SharedCache is an HTTP caching library that follows Web Standards and HTTP specifications. It implements a cache interface similar to the Web Cache API but optimized for server-side shared caching scenarios.

📋 Table of Contents

✨ Key Features

  • 📋 RFC Compliance: Supports RFC 5861 directives like stale-if-error and stale-while-revalidate
  • 🎯 Smart Caching: Handles complex HTTP scenarios including Vary headers, proxy revalidation, and authenticated responses
  • 🔧 Flexible Storage: Pluggable storage backend supporting memory, Redis, or any custom key-value store
  • 🚀 Enhanced Fetch: Extends the standard fetch API with caching capabilities while maintaining full compatibility
  • 🔌 Middleware Origin: createCacheHandler for in-process handlers (e.g. middleware next())
  • 🎛️ Custom Cache Keys: Cache key customization supporting device types, cookies, headers, and URL components
  • Shared Cache Optimization: Prioritizes s-maxage over max-age for shared cache performance
  • 🌍 Universal Runtime: Compatible with WinterCG environments including Node.js, Deno, Bun, and Edge Runtime

🤔 Why SharedCache?

While the Web fetch API has become ubiquitous in server-side JavaScript, existing browser Cache APIs are designed for single-user scenarios. Server-side applications need shared caches that serve multiple users efficiently.

SharedCache provides:

  • Server-Optimized Caching: Designed for multi-user server environments
  • Standards Compliance: Follows HTTP specifications and server-specific patterns
  • Production Ready: Battle-tested patterns from CDN and proxy implementations

⚡ Quick Decision Guide

✅ Use SharedCache When:

  • Node.js environments - Native caches API not available
  • API response caching - Need to reduce backend load and improve response times
  • Cross-runtime portability - Want consistent caching across Node.js, Deno, Bun
  • Custom storage backends - Need Redis, database, or distributed caching solutions
  • Meta-framework development - Building applications that deploy to multiple environments

❌ Don't Use SharedCache When:

  • Edge runtimes with native caches - Cloudflare Workers, Vercel Edge already provide caches API
  • Browser applications - Use the native Web Cache API instead (unless you need HTTP cache control directives support)
  • Simple in-memory caching - Consider lighter alternatives like lru-cache directly
  • Single-request caching - Basic memoization might be sufficient

📦 Installation

npm install @web-widget/shared-cache
# Using yarn
yarn add @web-widget/shared-cache
# Using pnpm
pnpm add @web-widget/shared-cache

🚀 Quick Start

import{CacheStorage,createFetch,typeKVStorage,}from'@web-widget/shared-cache';import{LRUCache}from'lru-cache';constcreateLRUCache=(): KVStorage=>{conststore=newLRUCache<string,any>({max: 1024});return{asyncget(cacheKey: string){returnstore.get(cacheKey);},asyncset(cacheKey: string,value: any,ttl?: number){store.set(cacheKey,value,{ ttl });},asyncdelete(cacheKey: string){returnstore.delete(cacheKey);},};};constcaches=newCacheStorage(createLRUCache());asyncfunctionexample(){constcache=awaitcaches.open('api-cache-v1');constfetch=createFetch(cache,{defaults: {cacheControlOverride: 's-maxage=300',ignoreRequestCacheControl: true,},});constresponse1=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// First request: networkconstresponse2=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// Second request: cacheconsole.log(response2.headers.get('x-cache-status'));// "HIT"}example();

Core APIs

ExportPurpose
createFetchOutbound HTTP fetch with caching
createCacheHandlerIn-process origin (middleware / SSR)
CacheStorage / CacheCache storage and operations
KVStoragePluggable storage backend interface

Every response includes an x-cache-status header (HIT, MISS, UPDATING, STALE, …) for debugging. See the configuration guide for the full status table.

📋 Standards Compliance

SharedCache is built for production HTTP caching with full adherence to web standards:

StandardStatusCoverage
RFC 7234 (HTTP Caching)✅ Fully Compliant100%
RFC 5861 (stale-* extensions)✅ Fully Compliant100%
Web Cache API✅ SubsetCore methods (match, put, delete)
WinterCG✅ Fully Supported100%

Highlights:

  • RFC 7234: Cache-Control directives, GET/HEAD caching, Vary processing, conditional requests
  • RFC 5861: stale-while-revalidate and stale-if-error via createFetch
  • Web Cache API: Core methods with HTTP semantics; match() / delete() support ignoreMethod (same subset as Cloudflare Workers Cache API)
  • Security: Requests with Authorization headers are not cached unless the response explicitly allows it (public, s-maxage, etc.)

Powered by http-cache-semantics for RFC-compliant cache policy evaluation.

→ Full standards compliance guide — Web Cache API details, security notes, and implementation status.

☁️ Cloudflare Comparison

SharedCache is designed for origin-side caching (application servers with pluggable KVStorage such as Redis or S3), not as a replacement for Cloudflare's global edge cache. Where it helps to align with Cloudflare semantics, the library mirrors familiar patterns from the CDN and Workers Cache API:

  • Cache Key — public cacheKeyRules (search, header, cookie, device) vs Cloudflare Cache Rules
  • Cache Statusx-cache-status (HIT, MISS, UPDATING, STALE, …) vs CF-Cache-Status
  • Workers Cache APImatch() / delete() with ignoreMethod only; no ignoreSearch / ignoreVary
  • StorageKVStorage at the origin vs platform-managed edge / Workers cache

→ Full comparison guide — quick reference table and detailed notes.

📖 Documentation

GuideDescription
ExamplesRedis, multi-tenant, authentication, and custom storage patterns
ConfigurationGlobal setup, sharedCache options, cache key rules, and monitoring
API ReferenceComplete API signatures and type definitions
LoggingLogger setup, log levels, and debugging techniques
FAQStorage backends, edge runtimes, Vary performance, and more
Standards ComplianceRFC details, Web Cache API subset, and security notes
Cloudflare ComparisonMapping to Cloudflare Cache Rules and Workers Cache API

🤝 Who's Using SharedCache

🙏 Acknowledgments

SharedCache draws inspiration from industry-leading caching implementations:

📄 License

MIT License - see LICENSE file for details.

About

🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - web-widget/shared-cache: 🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support · GitHub
Skip to content

Repository files navigation

SharedCache

CInpm versionTypeScriptLicense: MITcodecovNode.jsDenoBunWinterCGRFC Compliant

A standards-compliant HTTP cache implementation for server-side applications.

SharedCache is an HTTP caching library that follows Web Standards and HTTP specifications. It implements a cache interface similar to the Web Cache API but optimized for server-side shared caching scenarios.

📋 Table of Contents

✨ Key Features

  • 📋 RFC Compliance: Supports RFC 5861 directives like stale-if-error and stale-while-revalidate
  • 🎯 Smart Caching: Handles complex HTTP scenarios including Vary headers, proxy revalidation, and authenticated responses
  • 🔧 Flexible Storage: Pluggable storage backend supporting memory, Redis, or any custom key-value store
  • 🚀 Enhanced Fetch: Extends the standard fetch API with caching capabilities while maintaining full compatibility
  • 🔌 Middleware Origin: createCacheHandler for in-process handlers (e.g. middleware next())
  • 🎛️ Custom Cache Keys: Cache key customization supporting device types, cookies, headers, and URL components
  • Shared Cache Optimization: Prioritizes s-maxage over max-age for shared cache performance
  • 🌍 Universal Runtime: Compatible with WinterCG environments including Node.js, Deno, Bun, and Edge Runtime

🤔 Why SharedCache?

While the Web fetch API has become ubiquitous in server-side JavaScript, existing browser Cache APIs are designed for single-user scenarios. Server-side applications need shared caches that serve multiple users efficiently.

SharedCache provides:

  • Server-Optimized Caching: Designed for multi-user server environments
  • Standards Compliance: Follows HTTP specifications and server-specific patterns
  • Production Ready: Battle-tested patterns from CDN and proxy implementations

⚡ Quick Decision Guide

✅ Use SharedCache When:

  • Node.js environments - Native caches API not available
  • API response caching - Need to reduce backend load and improve response times
  • Cross-runtime portability - Want consistent caching across Node.js, Deno, Bun
  • Custom storage backends - Need Redis, database, or distributed caching solutions
  • Meta-framework development - Building applications that deploy to multiple environments

❌ Don't Use SharedCache When:

  • Edge runtimes with native caches - Cloudflare Workers, Vercel Edge already provide caches API
  • Browser applications - Use the native Web Cache API instead (unless you need HTTP cache control directives support)
  • Simple in-memory caching - Consider lighter alternatives like lru-cache directly
  • Single-request caching - Basic memoization might be sufficient

📦 Installation

npm install @web-widget/shared-cache
# Using yarn
yarn add @web-widget/shared-cache
# Using pnpm
pnpm add @web-widget/shared-cache

🚀 Quick Start

import{CacheStorage,createFetch,typeKVStorage,}from'@web-widget/shared-cache';import{LRUCache}from'lru-cache';constcreateLRUCache=(): KVStorage=>{conststore=newLRUCache<string,any>({max: 1024});return{asyncget(cacheKey: string){returnstore.get(cacheKey);},asyncset(cacheKey: string,value: any,ttl?: number){store.set(cacheKey,value,{ ttl });},asyncdelete(cacheKey: string){returnstore.delete(cacheKey);},};};constcaches=newCacheStorage(createLRUCache());asyncfunctionexample(){constcache=awaitcaches.open('api-cache-v1');constfetch=createFetch(cache,{defaults: {cacheControlOverride: 's-maxage=300',ignoreRequestCacheControl: true,},});constresponse1=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// First request: networkconstresponse2=awaitfetch('https://httpbin.org/response-headers?cache-control=max-age%3D604800');// Second request: cacheconsole.log(response2.headers.get('x-cache-status'));// "HIT"}example();

Core APIs

ExportPurpose
createFetchOutbound HTTP fetch with caching
createCacheHandlerIn-process origin (middleware / SSR)
CacheStorage / CacheCache storage and operations
KVStoragePluggable storage backend interface

Every response includes an x-cache-status header (HIT, MISS, UPDATING, STALE, …) for debugging. See the configuration guide for the full status table.

📋 Standards Compliance

SharedCache is built for production HTTP caching with full adherence to web standards:

StandardStatusCoverage
RFC 7234 (HTTP Caching)✅ Fully Compliant100%
RFC 5861 (stale-* extensions)✅ Fully Compliant100%
Web Cache API✅ SubsetCore methods (match, put, delete)
WinterCG✅ Fully Supported100%

Highlights:

  • RFC 7234: Cache-Control directives, GET/HEAD caching, Vary processing, conditional requests
  • RFC 5861: stale-while-revalidate and stale-if-error via createFetch
  • Web Cache API: Core methods with HTTP semantics; match() / delete() support ignoreMethod (same subset as Cloudflare Workers Cache API)
  • Security: Requests with Authorization headers are not cached unless the response explicitly allows it (public, s-maxage, etc.)

Powered by http-cache-semantics for RFC-compliant cache policy evaluation.

→ Full standards compliance guide — Web Cache API details, security notes, and implementation status.

☁️ Cloudflare Comparison

SharedCache is designed for origin-side caching (application servers with pluggable KVStorage such as Redis or S3), not as a replacement for Cloudflare's global edge cache. Where it helps to align with Cloudflare semantics, the library mirrors familiar patterns from the CDN and Workers Cache API:

  • Cache Key — public cacheKeyRules (search, header, cookie, device) vs Cloudflare Cache Rules
  • Cache Statusx-cache-status (HIT, MISS, UPDATING, STALE, …) vs CF-Cache-Status
  • Workers Cache APImatch() / delete() with ignoreMethod only; no ignoreSearch / ignoreVary
  • StorageKVStorage at the origin vs platform-managed edge / Workers cache

→ Full comparison guide — quick reference table and detailed notes.

📖 Documentation

GuideDescription
ExamplesRedis, multi-tenant, authentication, and custom storage patterns
ConfigurationGlobal setup, sharedCache options, cache key rules, and monitoring
API ReferenceComplete API signatures and type definitions
LoggingLogger setup, log levels, and debugging techniques
FAQStorage backends, edge runtimes, Vary performance, and more
Standards ComplianceRFC details, Web Cache API subset, and security notes
Cloudflare ComparisonMapping to Cloudflare Cache Rules and Workers Cache API

🤝 Who's Using SharedCache

🙏 Acknowledgments

SharedCache draws inspiration from industry-leading caching implementations:

📄 License

MIT License - see LICENSE file for details.

About

🚀 Standards-compliant HTTP cache implementation for server-side JavaScript with RFC 7234 compliance and cross-runtime support

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages