@adonix.org/cloud-spark 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -296,7 +296,8 @@ Register the built-in CORS middleware as follows:
296
296
  :page_facing_up: index.ts
297
297
 
298
298
  ```ts
299
- import { BasicWorker, cors } from "@adonix.org/cloud-spark";
299
+ import { BasicWorker } from "@adonix.org/cloud-spark";
300
+ import { cors } from "@adonix.org/cloud-spark/cors";
300
301
 
301
302
  class MyWorker extends BasicWorker {
302
303
  /**
@@ -346,7 +347,8 @@ Register the built-in cache middleware as follows:
346
347
  :page_facing_up: index.ts
347
348
 
348
349
  ```ts
349
- import { BasicWorker, cache, CacheControl, JsonResponse, Time } from "@adonix.org/cloud-spark";
350
+ import { BasicWorker, CacheControl, JsonResponse, Time } from "@adonix.org/cloud-spark";
351
+ import { cache } from "@adonix.org/cloud-spark/cache";
350
352
 
351
353
  class MyWorker extends BasicWorker {
352
354
  /**
@@ -425,7 +427,8 @@ Register the built-in websocket middleware as follows:
425
427
  :page_facing_up: index.ts
426
428
 
427
429
  ```ts
428
- import { GET, PathParams, RouteWorker, websocket } from "@adonix.org/cloud-spark";
430
+ import { GET, PathParams, RouteWorker } from "@adonix.org/cloud-spark";
431
+ import { websocket } from "@adonix.org/cloud-spark/websocket";
429
432
 
430
433
  class ChatWorker extends RouteWorker {
431
434
  /**
@@ -459,7 +462,7 @@ class ChatWorker extends RouteWorker {
459
462
 
460
463
  /**
461
464
  * The request has already been validated by the
462
- * WebSocket middleware, so dispatch the WebSocket
465
+ * WebSocket middleware, so dispatch the WebSocket
463
466
  * upgrade request to the Durable Object.
464
467
  */
465
468
  return stub.fetch(this.request);
@@ -654,17 +657,11 @@ The following is a simple chat with hibernation example:
654
657
  :page_facing_up: index.ts
655
658
 
656
659
  ```ts
660
+ import { GET, PathParams, RouteWorker, WebSocketUpgrade } from "@adonix.org/cloud-spark";
661
+ import { WebSocketSessions } from "@adonix.org/cloud-spark/sessions";
662
+ import { websocket } from "@adonix.org/cloud-spark/websocket";
657
663
  import { DurableObject } from "cloudflare:workers";
658
664
 
659
- import {
660
- GET,
661
- PathParams,
662
- RouteWorker,
663
- websocket,
664
- WebSocketSessions,
665
- WebSocketUpgrade,
666
- } from "@adonix.org/cloud-spark";
667
-
668
665
  /**
669
666
  * Metadata attached to each session.
670
667
  */
@@ -0,0 +1,58 @@
1
+ import { b as Middleware } from './middleware-CfKw8AlN.js';
2
+
3
+ /**
4
+ * Configuration options for the cache middleware.
5
+ */
6
+ interface CacheInit {
7
+ /**
8
+ * Name of the cache storage to use.
9
+ * If omitted, the default cache is used.
10
+ */
11
+ name?: string;
12
+ /**
13
+ * Function that maps the incoming request
14
+ * to a cache key.
15
+ */
16
+ getKey: (request: Request) => URL;
17
+ }
18
+
19
+ /**
20
+ * Creates a Vary-aware caching middleware for Workers.
21
+ *
22
+ * This middleware:
23
+ * - Caches `GET` requests **only**.
24
+ * - Respects the `Vary` header of responses, ensuring that requests
25
+ * with different headers (e.g., `Accept-Language`) receive the correct cached response.
26
+ * - Skips caching for non-cacheable responses (e.g., error responses or
27
+ * responses with `Vary: *`).
28
+ *
29
+ * @param init Optional cache configuration object.
30
+ * @param init.name Optional name of the cache to use. If omitted, the default cache is used.
31
+ * @param init.getKey Optional function to compute a custom cache key from a request.
32
+ *
33
+ * @returns A {@link Middleware} instance that can be used in your middleware chain.
34
+ */
35
+ declare function cache(init?: Partial<CacheInit>): Middleware;
36
+
37
+ /**
38
+ * Returns a new URL with its query parameters sorted into a stable order.
39
+ *
40
+ * This is used for cache key generation: URLs that differ only in the
41
+ * order of their query parameters will normalize to the same key.
42
+ *
43
+ * @param request - The incoming Request whose URL will be normalized.
44
+ * @returns A new URL with query parameters sorted by name.
45
+ */
46
+ declare function sortSearchParams(request: Request): URL;
47
+ /**
48
+ * Returns a new URL with all query parameters removed.
49
+ *
50
+ * This is used when query parameters are not relevant to cache lookups,
51
+ * ensuring that variants of the same resource share a single cache entry.
52
+ *
53
+ * @param request - The incoming Request whose URL will be normalized.
54
+ * @returns A new URL with no query parameters.
55
+ */
56
+ declare function stripSearchParams(request: Request): URL;
57
+
58
+ export { cache, sortSearchParams, stripSearchParams };
package/dist/cache.js CHANGED
@@ -1,3 +1,3 @@
1
- import {StatusCodes}from'http-status-codes/build/es/status-codes';import te from'cache-control-parser';import {getReasonPhrase}from'http-status-codes/build/es/utils-functions';function x(t){return typeof t=="string"}function J(t){return typeof t=="number"&&!Number.isNaN(t)}function Z(t){if(typeof t!="object"||t===null)throw new TypeError("CacheInit must be an object.");let{name:e,getKey:r}=t;Te(e),ge(r);}function Te(t){if(t!==void 0&&!x(t))throw new TypeError("Cache name must be a string.")}function ge(t){if(t!==void 0&&typeof t!="function")throw new TypeError("getKey must be a function.")}function Q(t){if(!(t instanceof URL))throw new TypeError("getKey must return a URL.")}function ee(t){let e=new URL(t.url);return e.searchParams.sort(),e.hash="",e}function De(t){let e=new URL(t.url);return e.search="",e.hash="",e}var A=class{rules=[];use(...e){return this.rules.push(...e),this}execute(e,r){return this.rules.reduceRight((n,i)=>()=>i.apply(e,n),()=>r())()}};var f={parse:te.parse,stringify:te.stringify,DISABLE:Object.freeze({"no-cache":true,"no-store":true,"must-revalidate":true,"max-age":0})};var re=(c=>(c.GET="GET",c.PUT="PUT",c.HEAD="HEAD",c.POST="POST",c.PATCH="PATCH",c.DELETE="DELETE",c.OPTIONS="OPTIONS",c))(re||{}),{GET:_,PUT:We,HEAD:se,POST:Ue,PATCH:ke,DELETE:Fe,OPTIONS:Ke}=re;var o={ACCEPT:"accept",ACCEPT_ENCODING:"accept-encoding",ACCEPT_LANGUAGE:"accept-language",AUTHORIZATION:"authorization",CACHE_CONTROL:"cache-control",CONTENT_DISPOSITION:"content-disposition",CONTENT_ENCODING:"content-encoding",CONTENT_LANGUAGE:"content-language",CONTENT_LENGTH:"content-length",CONTENT_RANGE:"content-range",CONTENT_TYPE:"content-type",CONTENT_MD5:"content-md5",COOKIE:"cookie",ETAG:"etag",IF_MATCH:"if-match",IF_MODIFIED_SINCE:"if-modified-since",IF_NONE_MATCH:"if-none-match",IF_UNMODIFIED_SINCE:"if-unmodified-since",LAST_MODIFIED:"last-modified",ORIGIN:"origin",RANGE:"range",SET_COOKIE:"set-cookie",VARY:"vary",UPGRADE:"upgrade",INTERNAL_VARIANT_SET:"internal-variant-set"},ne=[o.CONTENT_TYPE,o.CONTENT_LENGTH,o.CONTENT_RANGE,o.CONTENT_ENCODING,o.CONTENT_LANGUAGE,o.CONTENT_DISPOSITION,o.CONTENT_MD5],oe=[o.CONTENT_LENGTH,o.CONTENT_RANGE];function R(t,e){return t<e?-1:t>e?1:0}function k(t,e,r){let s=Array.isArray(r)?r:[r],n=Array.from(new Set(s.map(i=>i.trim()))).filter(i=>i.length).sort(R);if(!n.length){t.delete(e);return}t.set(e,n.join(", "));}function ie(t,e,r){let s=Array.isArray(r)?r:[r];if(s.length===0)return;let i=d(t,e).concat(s.map(a=>a.trim()));k(t,e,i);}function d(t,e){let r=t.get(e)?.split(",").map(s=>s.trim()).filter(s=>s.length>0)??[];return Array.from(new Set(r)).sort(R)}function F(t,e){for(let r of e)t.delete(r);}var Re="https://vary",Oe="*";function ae(t,e){if(e.status!==StatusCodes.OK||t.method!==_||t.headers.has(o.AUTHORIZATION)||t.headers.has(o.COOKIE)||h(t.headers)["no-store"]||!e.headers.has(o.CACHE_CONTROL))return false;let s=h(e.headers),n=s["s-maxage"]??s["max-age"];if(n===void 0||n===0||s["no-store"]||s["no-cache"]||s.private||e.headers.has(o.SET_COOKIE)||K(e).includes(Oe))return false;if(e.headers.has(o.INTERNAL_VARIANT_SET))throw new Error("Found conflicting vary header.");if(e.headers.has(o.CONTENT_RANGE))throw new Error("Found content-range header on 200 OK. Must use 206 Partial Content");return true}function h(t){return f.parse(t.get(o.CACHE_CONTROL)??"")}function K(t){return C(d(t.headers,o.VARY))}function C(t){let e=t.map(r=>r.toLowerCase()).filter(r=>r!==o.ACCEPT_ENCODING).sort(R);return Array.from(new Set(e))}function E(t,e,r){let s=[],n=C(e);for(let a of n){let c=t.headers.get(a);c!==null&&s.push([a,xe(a,c)]);}let i=Ae(JSON.stringify([r.toString(),s]));return new URL(i,Re).toString()}function xe(t,e){switch(t.toLowerCase()){case o.ACCEPT:case o.ACCEPT_LANGUAGE:case o.ORIGIN:return e.toLowerCase();default:return e}}function Ae(t){let e=new TextEncoder().encode(t),r="";for(let s of e)r+=String.fromCodePoint(s);return btoa(r).replaceAll("+","-").replaceAll("/","_").replace(/={1,2}$/,"")}var _e=/^bytes=(\d{1,12})-(\d{0,12})$/,ce="W/",ue="*";function de(t){let e=t.headers.get(o.RANGE);if(!e)return;let r=_e.exec(e);if(!r)return;let s=Number(r[1]),n=r[2]===""?void 0:Number(r[2]);return n===void 0?{start:s}:{start:s,end:n}}function pe(t,e){return t.length>0&&!me(t,e,ue)}function fe(t,e){return me(t,le(e),ue)}function me(t,...e){return t.some(r=>e.includes(r))}function I(t){if(!x(t))return;let e=Date.parse(t);return Number.isNaN(e)?void 0:e}function le(t){return t.startsWith(ce)?t.slice(2):t}function B(t){return {ifMatch:d(t,o.IF_MATCH).filter(e=>!e.startsWith(ce)),ifNoneMatch:d(t,o.IF_NONE_MATCH).map(le),ifModifiedSince:t.get(o.IF_MODIFIED_SINCE),ifUnmodifiedSince:t.get(o.IF_UNMODIFIED_SINCE)}}function he(t){let{ifNoneMatch:e,ifMatch:r,ifModifiedSince:s,ifUnmodifiedSince:n}=B(t);return e.length>0||r.length>0||s!==null||n!==null}function Ce(t){let e=t.get(o.CONTENT_LENGTH);if(e===null||e.trim()==="")return;let r=Number(e);if(J(r))return r}var y=class{async apply(e,r){let s=h(e.request.headers);if(!s["no-store"]&&!((s["no-cache"]||s["max-age"]===0)&&!he(e.request.headers)))return r()}};var q="utf-8";function $(t,e){return !e||t.toLowerCase().includes("charset=")?t:`${t}; charset=${e.toLowerCase()}`}var Y=class{headers=new Headers;status=StatusCodes.OK;statusText;webSocket;mediaType=$("text/plain",q);get responseInit(){return {headers:this.headers,status:this.status,statusText:this.statusText??getReasonPhrase(this.status),webSocket:this.webSocket,encodeBody:"automatic"}}setHeader(e,r){k(this.headers,e,r);}mergeHeader(e,r){ie(this.headers,e,r);}addContentType(){this.headers.get(o.CONTENT_TYPE)||this.setHeader(o.CONTENT_TYPE,this.mediaType);}filterHeaders(){this.status===StatusCodes.NO_CONTENT?F(this.headers,oe):this.status===StatusCodes.NOT_MODIFIED&&F(this.headers,ne);}},z=class extends Y{constructor(r){super();this.cache=r;}addCacheHeader(){this.cache&&this.setHeader(o.CACHE_CONTROL,f.stringify(this.cache));}},l=class extends z{constructor(r=null,s){super(s);this.body=r;}async response(){this.addCacheHeader();let r=[StatusCodes.NO_CONTENT,StatusCodes.NOT_MODIFIED].includes(this.status)?null:this.body;return r&&this.addContentType(),this.filterHeaders(),new Response(r,this.responseInit)}};var T=class extends l{constructor(e){super(),this.status=StatusCodes.NOT_MODIFIED,this.headers=new Headers(e.headers);}},X=class extends l{constructor(e=null,r,s=StatusCodes.OK){super(e,r),this.status=s;}},S=class extends X{constructor(e={},r,s=StatusCodes.OK){super(JSON.stringify(e),r,s),this.mediaType=$("application/json",q);}};var H=class extends l{constructor(e){super(),this.status=e.status,this.statusText=e.statusText,this.headers=new Headers(e.headers);}};var j=class extends S{constructor(r,s){let n={status:r,error:getReasonPhrase(r),details:s??""};super(n,f.DISABLE,r);this.details=s;}};var g=class extends j{constructor(e){super(StatusCodes.PRECONDITION_FAILED,e);}};var N=class{async apply(e,r){let s=await r();if(!s||s.status!==StatusCodes.OK)return s;let n=this.getHeader(s);if(n===void 0)return s;let i=B(e.request.headers);return this.response(s,n,i)}};var w=class extends N{getHeader(e){return e.headers.get(o.ETAG)??void 0}},b=class extends w{async response(e,r,s){return pe(s.ifMatch,r)?new g(`ETag: ${r}`).response():e}},L=class extends w{async response(e,r,s){if(s.ifNoneMatch.length===0)return e;if(fe(s.ifNoneMatch,r))return new T(e).response()}};var P=class{async apply(e,r){if(e.request.method===_)return r();if(e.request.method===se){let s=await r();return s?new H(s).response():void 0}}};var D=class extends N{getHeader(e){return I(e.headers.get(o.LAST_MODIFIED))}},V=class extends D{async response(e,r,s){let n=I(s.ifModifiedSince);if(n===void 0)return e;if(r<=n)return new T(e).response()}},G=class extends D{async response(e,r,s){let n=I(s.ifUnmodifiedSince);return n===void 0?e:r>n?new g(`Last-Modified: ${new Date(r).toUTCString()}`).response():e}};var v=class{async apply(e,r){let s=de(e.request);if(s&&(s.start!==0||s.end===0))return;let n=await r();if(!n||n.status!==StatusCodes.OK||!s||s.end===void 0)return n;let i=Ce(n.headers);if(i&&s.end===i-1)return n}};var M=class{async apply(e,r){let s=e.request.headers;if(!s.has(o.AUTHORIZATION)&&!s.has(o.COOKIE))return r()}};var W=class{async apply(e,r){if(!e.request.headers.has(o.UPGRADE))return r()}};var p=class t extends l{_isModified=false;constructor(e){let r=C(e);if(r.length===0)throw new Error("The filtered vary array is empty.");super(),this.setHeader(o.INTERNAL_VARIANT_SET,r);}static new(e){return new t(C(e))}static restore(e){if(!t.isVariantResponse(e))throw new Error("The source response is not a variant response");let r=t.new(d(e.headers,o.INTERNAL_VARIANT_SET)),s=e.headers.get(o.CACHE_CONTROL);return s&&(r.cache=f.parse(s)),r}get vary(){return d(this.headers,o.INTERNAL_VARIANT_SET)}get isModified(){return this._isModified}append(e){let r=this.vary.length;this.mergeHeader(o.INTERNAL_VARIANT_SET,C(e)),this._isModified=this.vary.length!==r;}static isVariantResponse(e){return e.headers.has(o.INTERNAL_VARIANT_SET)}expireAfter(e){let r=h(e.headers),s=r["s-maxage"]??r["max-age"];if(s===void 0)return;let n=this.cache?.["s-maxage"];(n===void 0||s>n)&&(this.cache={"s-maxage":s},this._isModified=true);}};var U=class{init;constructor(e){let{name:r,getKey:s=ee}=e;this.init={name:r?.trim()||void 0,getKey:s};}async handle(e,r){let s=this.init.name?await caches.open(this.init.name):caches.default,i=await new A().use(new y).use(new P).use(new W).use(new M).use(new v).use(new V).use(new L).use(new G).use(new b).execute(e,()=>this.getCached(s,e.request));if(i)return i;let a=await r();return e.ctx.waitUntil(this.setCached(s,e.request,a)),a}async getCached(e,r){let s=this.getCacheKey(r),n=await e.match(s.toString());if(!n)return;if(!p.isVariantResponse(n))return n;let i=p.restore(n).vary,a=E(r,i,s);return e.match(a)}async setCached(e,r,s){if(!ae(r,s))return;let n=this.getCacheKey(r),i=s.clone(),a=K(i),c=await e.match(n),Ee=c&&p.isVariantResponse(c);if(!c){if(a.length===0){await e.put(n,i);return}let u=p.new(a);u.expireAfter(i),await e.put(n,await u.response()),await e.put(E(r,u.vary,n),i);return}if(Ee){let u=p.restore(c);u.expireAfter(i),a.length>0&&(u.append(a),u.isModified&&await e.put(n,await u.response())),await e.put(E(r,u.vary,n),i);return}if(a.length===0){await e.put(n,i);return}let O=p.new(a);O.expireAfter(c),O.expireAfter(i),await e.put(n,await O.response()),await e.put(E(r,O.vary,n),i),await e.put(E(r,[],n),c);}getCacheKey(e){let r=this.init.getKey(e);return Q(r),r.hash="",r}};function Cr(t={}){return Z(t),new U(t)}
2
- export{Cr as cache,ee as sortSearchParams,De as stripSearchParams};//# sourceMappingURL=cache.js.map
1
+ import {StatusCodes}from'http-status-codes/build/es/status-codes';import te from'cache-control-parser';import {getReasonPhrase}from'http-status-codes/build/es/utils-functions';function x(t){return typeof t=="string"}function J(t){return typeof t=="number"&&!Number.isNaN(t)}function Z(t){if(typeof t!="object"||t===null)throw new TypeError("CacheInit must be an object.");let{name:e,getKey:r}=t;Te(e),ge(r);}function Te(t){if(t!==void 0&&!x(t))throw new TypeError("Cache name must be a string.")}function ge(t){if(t!==void 0&&typeof t!="function")throw new TypeError("getKey must be a function.")}function Q(t){if(!(t instanceof URL))throw new TypeError("getKey must return a URL.")}function ee(t){let e=new URL(t.url);return e.searchParams.sort(),e.hash="",e}function we(t){let e=new URL(t.url);return e.search="",e.hash="",e}var A=class{rules=[];use(...e){return this.rules.push(...e),this}execute(e,r){return this.rules.reduceRight((n,i)=>()=>i.apply(e,n),()=>r())()}};var m={parse:te.parse,stringify:te.stringify,DISABLE:Object.freeze({"no-cache":true,"no-store":true,"must-revalidate":true,"max-age":0})};var re=(c=>(c.GET="GET",c.PUT="PUT",c.HEAD="HEAD",c.POST="POST",c.PATCH="PATCH",c.DELETE="DELETE",c.OPTIONS="OPTIONS",c))(re||{}),{GET:_,PUT:Ve,HEAD:se,POST:Ge,PATCH:ve,DELETE:Me,OPTIONS:We}=re;var o={ACCEPT:"accept",ACCEPT_ENCODING:"accept-encoding",ACCEPT_LANGUAGE:"accept-language",AUTHORIZATION:"authorization",CACHE_CONTROL:"cache-control",CONTENT_DISPOSITION:"content-disposition",CONTENT_ENCODING:"content-encoding",CONTENT_LANGUAGE:"content-language",CONTENT_LENGTH:"content-length",CONTENT_RANGE:"content-range",CONTENT_TYPE:"content-type",CONTENT_MD5:"content-md5",COOKIE:"cookie",ETAG:"etag",IF_MATCH:"if-match",IF_MODIFIED_SINCE:"if-modified-since",IF_NONE_MATCH:"if-none-match",IF_UNMODIFIED_SINCE:"if-unmodified-since",LAST_MODIFIED:"last-modified",ORIGIN:"origin",RANGE:"range",SET_COOKIE:"set-cookie",VARY:"vary",UPGRADE:"upgrade",INTERNAL_VARIANT_SET:"internal-variant-set"},ne=[o.CONTENT_TYPE,o.CONTENT_LENGTH,o.CONTENT_RANGE,o.CONTENT_ENCODING,o.CONTENT_LANGUAGE,o.CONTENT_DISPOSITION,o.CONTENT_MD5],oe=[o.CONTENT_LENGTH,o.CONTENT_RANGE];function R(t,e){return t<e?-1:t>e?1:0}function k(t,e,r){let s=Array.isArray(r)?r:[r],n=Array.from(new Set(s.map(i=>i.trim()))).filter(i=>i.length).sort(R);if(!n.length){t.delete(e);return}t.set(e,n.join(", "));}function ie(t,e,r){let s=Array.isArray(r)?r:[r];if(s.length===0)return;let i=p(t,e).concat(s.map(a=>a.trim()));k(t,e,i);}function p(t,e){let r=t.get(e)?.split(",").map(s=>s.trim()).filter(s=>s.length>0)??[];return Array.from(new Set(r)).sort(R)}function F(t,e){for(let r of e)t.delete(r);}var Ne="https://vary",Re="*";function ae(t,e){if(e.status!==StatusCodes.OK||t.method!==_||t.headers.has(o.AUTHORIZATION)||t.headers.has(o.COOKIE)||h(t.headers)["no-store"]||!e.headers.has(o.CACHE_CONTROL))return false;let s=h(e.headers),n=s["s-maxage"]??s["max-age"];if(n===void 0||n===0||s["no-store"]||s["no-cache"]||s.private||e.headers.has(o.SET_COOKIE)||K(e).includes(Re))return false;if(e.headers.has(o.INTERNAL_VARIANT_SET))throw new Error("Found conflicting vary header.");if(e.headers.has(o.CONTENT_RANGE))throw new Error("Found content-range header on 200 OK. Must use 206 Partial Content");return true}function h(t){return m.parse(t.get(o.CACHE_CONTROL)??"")}function K(t){return C(p(t.headers,o.VARY))}function C(t){let e=t.map(r=>r.toLowerCase()).filter(r=>r!==o.ACCEPT_ENCODING).sort(R);return Array.from(new Set(e))}function E(t,e,r){let s=[],n=C(e);for(let a of n){let c=t.headers.get(a);c!==null&&s.push([a,Oe(a,c)]);}let i=xe(JSON.stringify([r.toString(),s]));return new URL(i,Ne).toString()}function Oe(t,e){switch(t.toLowerCase()){case o.ACCEPT:case o.ACCEPT_LANGUAGE:case o.ORIGIN:return e.toLowerCase();default:return e}}function xe(t){let e=new TextEncoder().encode(t),r="";for(let s of e)r+=String.fromCodePoint(s);return btoa(r).replaceAll("+","-").replaceAll("/","_").replace(/={1,2}$/,"")}var Ae=/^bytes=(\d{1,12})-(\d{0,12})$/,ce="W/",ue="*";function de(t){let e=t.headers.get(o.RANGE);if(!e)return;let r=Ae.exec(e);if(!r)return;let s=Number(r[1]),n=r[2]===""?void 0:Number(r[2]);return n===void 0?{start:s}:{start:s,end:n}}function pe(t,e){return t.length>0&&!me(t,e,ue)}function fe(t,e){return me(t,le(e),ue)}function me(t,...e){return t.some(r=>e.includes(r))}function I(t){if(!x(t))return;let e=Date.parse(t);return Number.isNaN(e)?void 0:e}function le(t){return t.startsWith(ce)?t.slice(2):t}function B(t){return {ifMatch:p(t,o.IF_MATCH).filter(e=>!e.startsWith(ce)),ifNoneMatch:p(t,o.IF_NONE_MATCH).map(le),ifModifiedSince:t.get(o.IF_MODIFIED_SINCE),ifUnmodifiedSince:t.get(o.IF_UNMODIFIED_SINCE)}}function he(t){let{ifNoneMatch:e,ifMatch:r,ifModifiedSince:s,ifUnmodifiedSince:n}=B(t);return e.length>0||r.length>0||s!==null||n!==null}function Ce(t){let e=t.get(o.CONTENT_LENGTH);if(e===null||e.trim()==="")return;let r=Number(e);if(J(r))return r}var y=class{async apply(e,r){let s=h(e.request.headers);if(!s["no-store"]&&!((s["no-cache"]||s["max-age"]===0)&&!he(e.request.headers)))return r()}};var q="utf-8";function $(t,e){return !e||t.toLowerCase().includes("charset=")?t:`${t}; charset=${e.toLowerCase()}`}var Y=class{headers=new Headers;status=StatusCodes.OK;statusText;webSocket;mediaType=$("text/plain",q);get responseInit(){return {headers:this.headers,status:this.status,statusText:this.statusText??getReasonPhrase(this.status),webSocket:this.webSocket,encodeBody:"automatic"}}setHeader(e,r){k(this.headers,e,r);}mergeHeader(e,r){ie(this.headers,e,r);}addContentType(){this.headers.get(o.CONTENT_TYPE)||this.setHeader(o.CONTENT_TYPE,this.mediaType);}filterHeaders(){this.status===StatusCodes.NO_CONTENT?F(this.headers,oe):this.status===StatusCodes.NOT_MODIFIED&&F(this.headers,ne);}},z=class extends Y{constructor(r){super();this.cache=r;}addCacheHeader(){this.cache&&this.setHeader(o.CACHE_CONTROL,m.stringify(this.cache));}},l=class extends z{constructor(r=null,s){super(s);this.body=r;}async response(){this.addCacheHeader();let r=[StatusCodes.NO_CONTENT,StatusCodes.NOT_MODIFIED].includes(this.status)?null:this.body;return r&&this.addContentType(),this.filterHeaders(),new Response(r,this.responseInit)}};var T=class extends l{constructor(e){super(),this.status=StatusCodes.NOT_MODIFIED,this.headers=new Headers(e.headers);}},X=class extends l{constructor(e=null,r,s=StatusCodes.OK){super(e,r),this.status=s;}},S=class extends X{constructor(e={},r,s=StatusCodes.OK){super(JSON.stringify(e),r,s),this.mediaType=$("application/json",q);}};var H=class extends l{constructor(e){super(),this.status=e.status,this.statusText=e.statusText,this.headers=new Headers(e.headers);}};var j=class extends S{constructor(r,s){let n={status:r,error:getReasonPhrase(r),details:s??""};super(n,m.DISABLE,r);this.details=s;}};var g=class extends j{constructor(e){super(StatusCodes.PRECONDITION_FAILED,e);}};var N=class{async apply(e,r){let s=await r();if(!s||s.status!==StatusCodes.OK)return s;let n=this.getHeader(s);if(n===void 0)return s;let i=B(e.request.headers);return this.response(s,n,i)}};var w=class extends N{getHeader(e){return e.headers.get(o.ETAG)??void 0}},b=class extends w{async response(e,r,s){return pe(s.ifMatch,r)?new g(`ETag: ${r}`).response():e}},L=class extends w{async response(e,r,s){if(s.ifNoneMatch.length===0)return e;if(fe(s.ifNoneMatch,r))return new T(e).response()}};var P=class{async apply(e,r){if(e.request.method===_)return r();if(e.request.method===se){let s=await r();return s?new H(s).response():void 0}}};var D=class extends N{getHeader(e){return I(e.headers.get(o.LAST_MODIFIED))}},V=class extends D{async response(e,r,s){let n=I(s.ifModifiedSince);if(n===void 0)return e;if(r<=n)return new T(e).response()}},G=class extends D{async response(e,r,s){let n=I(s.ifUnmodifiedSince);return n===void 0?e:r>n?new g(`Last-Modified: ${new Date(r).toUTCString()}`).response():e}};var v=class{async apply(e,r){let s=de(e.request);if(s&&(s.start!==0||s.end===0))return;let n=await r();if(!n||n.status!==StatusCodes.OK||!s||s.end===void 0)return n;let i=Ce(n.headers);if(i&&s.end===i-1)return n}};var M=class{async apply(e,r){let s=e.request.headers;if(!s.has(o.AUTHORIZATION)&&!s.has(o.COOKIE))return r()}};var W=class{async apply(e,r){if(!e.request.headers.has(o.UPGRADE))return r()}};var f=class t extends l{_isModified=false;constructor(e){let r=C(e);if(r.length===0)throw new Error("The filtered vary array is empty.");super(),this.setHeader(o.INTERNAL_VARIANT_SET,r);}static new(e){return new t(C(e))}static restore(e){if(!t.isVariantResponse(e))throw new Error("The source response is not a variant response");let r=t.new(p(e.headers,o.INTERNAL_VARIANT_SET)),s=e.headers.get(o.CACHE_CONTROL);return s&&(r.cache=m.parse(s)),r}get vary(){return p(this.headers,o.INTERNAL_VARIANT_SET)}get isModified(){return this._isModified}append(e){let r=this.vary.length;this.mergeHeader(o.INTERNAL_VARIANT_SET,C(e)),this._isModified=this.vary.length!==r;}static isVariantResponse(e){return e.headers.has(o.INTERNAL_VARIANT_SET)}expireAfter(e){let r=h(e.headers),s=r["s-maxage"]??r["max-age"];if(s===void 0)return;let n=this.cache?.["s-maxage"];(n===void 0||s>n)&&(this.cache={"s-maxage":s},this._isModified=true);}};var U=class{init;constructor(e){let{name:r,getKey:s=ee}=e;this.init={name:r?.trim()||void 0,getKey:s};}async handle(e,r){let s=this.init.name?await caches.open(this.init.name):caches.default,i=await new A().use(new y).use(new P).use(new W).use(new M).use(new v).use(new V).use(new L).use(new G).use(new b).execute(e,()=>this.getCached(s,e.request));if(i)return i;let a=await r();return e.ctx.waitUntil(this.setCached(s,e.request,a)),a}async getCached(e,r){let s=this.getCacheKey(r),n=await e.match(s.toString());if(!n)return;if(!f.isVariantResponse(n))return n;let i=f.restore(n).vary,a=E(r,i,s);return e.match(a)}async setCached(e,r,s){if(!ae(r,s))return;let n=this.getCacheKey(r),i=s.clone(),a=K(i),c=await e.match(n),Ee=c&&f.isVariantResponse(c);if(!c){if(a.length===0){await e.put(n,i);return}let d=f.new(a);d.expireAfter(i),await e.put(n,await d.response()),await e.put(E(r,d.vary,n),i);return}if(Ee){let d=f.restore(c);d.expireAfter(i),a.length>0&&(d.append(a),d.isModified&&await e.put(n,await d.response())),await e.put(E(r,d.vary,n),i);return}if(a.length===0){await e.put(n,i);return}let O=f.new(a);O.expireAfter(c),O.expireAfter(i),await e.put(n,await O.response()),await e.put(E(r,O.vary,n),i),await e.put(E(r,[],n),c);}getCacheKey(e){let r=this.init.getKey(e);return Q(r),r.hash="",r}};function Er(t={}){return Z(t),new U(t)}
2
+ export{Er as cache,ee as sortSearchParams,we as stripSearchParams};//# sourceMappingURL=cache.js.map
3
3
  //# sourceMappingURL=cache.js.map