UNPKG

azion

Version:

Azion Packages for Edge Computing.

2 lines (1 loc) 8.02 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("cookie"),c=require("./presets/next/handler.cjs");function p(a,{url:e,cookies:s,headers:t}){switch(a.type){case"host":return e.hostname===a.value;case"header":return a.value!==void 0?!!t.get(a.key)?.match(a.value):t.has(a.key);case"cookie":{const r=s[a.key];return a.value!==void 0?!!r?.match(a.value):r!==void 0}case"query":return a.value!==void 0?!!e.searchParams.get(a.key)?.match(a.value):e.searchParams.has(a.key)}}async function m(a,e="none",s=!1){return await a.run(e)==="error"||!s&&a.status&&a.status>=400?m(a,"error",!0):{path:a.path,status:a.status,headers:a.headers,searchParams:a.searchParams,body:a.body}}function f(a){switch(a){case"none":return"filesystem";case"filesystem":return"rewrite";case"rewrite":return"resource";case"resource":return"miss";default:return"miss"}}async function w(a,{request:e,assetsFetcher:s,ctx:t},{path:r,searchParams:i}){let n;const o=new URL(e.url);c.applySearchParams(o.searchParams,i);const h=new Request(o,e);try{switch(a?.type){case"function":case"middleware":{n=await a.entrypoint.default(h,t);break}case"override":{n=c.createMutableResponse(await s.fetch(c.createRouteRequest(h,a.path??r))),a.headers&&c.applyHeaders(n.headers,a.headers);break}case"static":{n=await s.fetch(c.createRouteRequest(h,r));break}case"node":{n=await globalThis.runNodeCustomServer(h);break}default:n=new Response("Not Found",{status:404})}}catch(u){return console.error(u),new Response("Internal Server Error",{status:500})}return c.createMutableResponse(n)}function k(a,e){const s="^//?(?:",t=")/(.*)";return!a.startsWith(s)||!a.endsWith(t)?!1:a.slice(s.length,-t.length).split("|").every(i=>i in e)}class g{constructor(e,s,t,r){this.routes=e,this.output=s,this.reqCtx=t,this.url=new URL(t.request.url),this.cookies=R.parse(t.request.headers.get("cookie")||""),this.path=this.url.pathname||"/",this.headers={normal:new Headers,important:new Headers},this.searchParams=new URLSearchParams,c.applySearchParams(this.searchParams,this.url.searchParams),this.checkPhaseCounter=0,this.middlewareInvoked=[],this.locales=new Set(r.i18n.locales),this.hasIndexFunctions=r.hasIndexFunctions,this.defaultLocale=r.i18n.defaultLocale}checkRouteMatch(e,s){const t=c.matchPCRE(e.src,this.path,e.caseSensitive);if(!t.match||e.methods&&!e.methods.map(i=>i.toUpperCase()).includes(this.reqCtx.request.method.toUpperCase()))return;const r={url:this.url,cookies:this.cookies,headers:this.reqCtx.request.headers};if(!e.has?.find(i=>!p(i,r))&&!e.missing?.find(i=>p(i,r))&&!(s&&e.status!==this.status))return t}processMiddlewareResp(e){const s="x-middleware-override-headers",t=e.headers.get(s);if(t){const h=new Set(t.split(",").map(u=>u.trim()));for(const u of h.keys()){const l=`x-middleware-request-${u}`,d=e.headers.get(l);this.reqCtx.request.headers.get(u)!==d&&(d?this.reqCtx.request.headers.set(u,d):this.reqCtx.request.headers.delete(u)),e.headers.delete(l)}e.headers.delete(s)}const r="x-middleware-rewrite",i=e.headers.get(r);if(i){const h=new URL(i,this.url);this.path=h.pathname,c.applySearchParams(this.searchParams,h.searchParams),e.headers.delete(r)}const n="x-middleware-next";e.headers.get(n)?e.headers.delete(n):!i&&!e.headers.has("location")&&(this.body=e.body,this.status=e.status),c.applyHeaders(this.headers.normal,e.headers),this.headers.middlewareLocation=e.headers.get("location")}async runRouteMiddleware(e){if(!e)return!0;const s=e&&this.output[e];if(!s||s.type!=="middleware")return this.status=500,!1;const t=await w(s,this.reqCtx,{path:this.path,searchParams:this.searchParams,headers:this.headers,status:this.status});return this.middlewareInvoked.push(e),t.status===500?(this.status=t.status,!1):(this.processMiddlewareResp(t),!0)}applyRouteOverrides(e){e.override&&(this.status=void 0,this.headers.normal=new Headers,this.headers.important=new Headers)}applyRouteHeaders(e,s,t){e.headers&&(c.applyHeaders(this.headers.normal,e.headers,{match:s,captureGroupKeys:t}),e.important&&c.applyHeaders(this.headers.important,e.headers,{match:s,captureGroupKeys:t}))}applyRouteStatus(e){e.status&&(this.status=e.status)}applyRouteDest(e,s,t){if(this.locales.has(this.path.replace("/",""))&&this.hasIndexFunctions.length>0&&(this.path=`${this.path}/`),!e.dest||this.defaultLocale===e.dest?.replace("/",""))return this.path;const r=this.path;this.path=c.applyPCREMatches(e.dest,s,t),/\/index\.rsc$/i.test(this.path)&&!/\/(?:index)?$/i.test(r)&&(this.path=r);const i=/\.rsc$/i.test(this.path),n=this.path in this.output;i&&!n&&(this.path=this.path.replace(/\.rsc/i,""));const o=new URL(this.path,this.url);return c.applySearchParams(this.searchParams,o.searchParams),c.isUrl(this.path)||(this.path=o.pathname),r}applyLocaleRedirects(e){if(!e.locale?.redirect||(this.locales||(this.locales={}),!/^\^(.)*$/.test(e.src)&&e.src!==this.path)||this.headers.normal.has("location"))return;const{locale:{redirect:t,cookie:r}}=e,i=r&&this.cookies[r],n=c.parseAcceptLanguage(i??""),o=c.parseAcceptLanguage(this.reqCtx.request.headers.get("accept-language")??""),l=[...n,...o].map(d=>t[d]).filter(Boolean)[0];l&&!this.path.startsWith(l)&&(this.headers.normal.set("location",l),this.status=307)}getLocaleFriendlyRoute(e,s){return!this.locales||s!=="miss"?e:/^\//.test(e.src)&&e.src.slice(1)in this.locales?{...e,src:`^${e.src}$`}:k(e.src,this.locales)?{...e,src:e.src.replace(/\/\(\.\*\)$/,"(?:/(.*))?$")}:e}async checkRoute(e,s){const t=this.getLocaleFriendlyRoute(s,e),r=this.checkRouteMatch(t,e==="error");if(!r?.match||t.middlewarePath&&this.middlewareInvoked.includes(t.middlewarePath))return"skip";const{match:i,captureGroupKeys:n}=r;if(this.applyRouteOverrides(t),this.applyLocaleRedirects(t),!await this.runRouteMiddleware(t.middlewarePath))return"error";if(this.body!==void 0)return"done";this.applyRouteHeaders(t,i,n),this.applyRouteStatus(t);const h=this.applyRouteDest(t,i,n);if(t.check&&!c.isUrl(this.path))if(h===this.path){if(e!=="miss")return await this.checkPhase(f(e));this.status=404}else if(e==="miss"){if(!(this.path in this.output))return await this.checkPhase("filesystem");this.status===404&&(this.status=void 0)}else return await this.checkPhase("none");return t.continue?"next":"done"}async checkPhase(e){if(this.checkPhaseCounter++>=50)return console.error(`Routing encountered an infinite loop while checking ${this.url.pathname}`),this.status=500,"error";this.middlewareInvoked=[];let s=!0;for(const i of this.routes[e]){const n=await this.checkRoute(e,i);if(n==="error")return"error";if(n==="done"){s=!1;break}}if(e==="hit"||c.isUrl(this.path)||this.headers.normal.has("location"))return"done";if(e==="none")for(const i of this.locales){const n=new RegExp(`/${i}(/.*)`),h=this.path.match(n)?.[1];if(h&&h in this.output){this.path=h;break}}let t=this.path in this.output;if(e==="rewrite"&&!t&&this.path.endsWith("/")){const i=this.path.replace(/\/$/,"");t=i in this.output,t&&(this.path=i)}if(e==="miss"&&!t){const i=!this.status||this.status<400;this.status=i?404:this.status}let r="miss";return t||e==="miss"||e==="error"?r="hit":s&&(r=f(e)),await this.checkPhase(r)}async run(e="none"){this.checkPhaseCounter=0;const s=await this.checkPhase(e);return c.isUrl(this.path)&&this.headers.normal.set("location",this.path),this.headers.normal.has("location")&&(!this.status||this.status<300||this.status>=400)&&(this.status=307),s}}async function y(a,{path:e="/404",status:s,headers:t,searchParams:r,body:i},n){const o=t.normal.get("location");if(o){if(o!==t.middlewareLocation){const l=[...r.keys()].length?`?${r.toString()}`:"";t.normal.set("location",`${o??"/"}${l}`)}return new Response(null,{status:s,headers:t.normal})}let h=i!==void 0?new Response(i,{status:s}):await w(n[e],a,{path:e,searchParams:r});const u=t.normal;return c.applyHeaders(u,h.headers),c.applyHeaders(u,t.important),h=new Response(h.body,{...h,status:s||h.status,headers:u}),h}async function P(a,e,s,t){const r=new g(e.routes,s,a,t),i=await m(r);return y(a,i,s)}exports.generateResponse=y;exports.handleRequest=P;