@zuplo/runtime 5.1762.0 → 5.1763.0
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/index.minified.js +1 -1
- package/package.json +1 -1
package/index.minified.js
CHANGED
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
`,pad:c,indent:c+d}:p={newline:"@@__STRINGIFY_OBJECT_NEW_LINE__@@",newlineOrSpace:"@@__STRINGIFY_OBJECT_NEW_LINE_OR_SPACE__@@",pad:"@@__STRINGIFY_OBJECT_PAD__@@",indent:"@@__STRINGIFY_OBJECT_INDENT__@@"};let h=s(m=>{if(u.inlineCharacterLimit===void 0)return m;let w=m.replace(new RegExp(p.newline,"g"),"").replace(new RegExp(p.newlineOrSpace,"g")," ").replace(new RegExp(p.pad+"|"+p.indent,"g"),"");return w.length<=u.inlineCharacterLimit?w:m.replace(new RegExp(p.newline+"|"+p.newlineOrSpace,"g"),`
|
|
54
54
|
`).replace(new RegExp(p.pad,"g"),c).replace(new RegExp(p.indent,"g"),c+d)},"expandWhiteSpace");if(r.includes(a))return'"[Circular]"';if(a==null||typeof a=="number"||typeof a=="boolean"||typeof a=="function"||typeof a=="symbol"||Fo(a))return String(a);if(a instanceof Date)return`new Date('${a.toISOString()}')`;if(l>o)return"...";if(Array.isArray(a)){if(a.length===0)return"[]";r.push(a);let m="["+p.newline+a.map((w,R)=>{let I=a.length-1===R?p.newline:","+p.newlineOrSpace,x=i(w,u,c+d,l+1);return u.transform&&(x=u.transform(a,R,x)),p.indent+x+I}).join("")+p.pad+"]";return r.pop(),h(m)}if(Qe(a)){let m=Bo(a);if(u.filter&&(m=m.filter(R=>u.filter?.(a,R))),m.length===0)return"{}";r.push(a);let w="{"+p.newline+m.map((R,I)=>{let x=m.length-1===I?p.newline:","+p.newlineOrSpace,L=typeof R=="symbol",F=!L&&/^[a-z$_][$\w]*$/i.test(R),_=L||F?R:i(R,u,"",l+1),V=i(a[R],u,c+d,l+1);return u.transform&&(V=u.transform(a,R,V)),p.indent+String(_)+": "+V+x}).join("")+p.pad+"}";return r.pop(),h(w)}return a=a.replace(/\\/g,"\\\\"),a=String(a).replace(/[\r\n]/g,m=>m===`
|
|
55
55
|
`?"\\n":"\\r"),u.singleQuotes===!1?(a=a.replace(/"/g,'\\"'),`"${a}"`):(a=a.replace(/'/g,"\\'"),`'${a}'`)},"stringify")(t,e,n,0)}s(_t,"stringifyObject");function he(t){return t.map(e=>z(e))}s(he,"makeErrorsSerializable");function _e(t){if(t.length===0)return"<no data provided to log>";let e=t[0];return typeof e=="string"?e:e instanceof Error?e.message:ce(z(e))}s(_e,"extractBestMessage");function ui(t){let e=[];return t.forEach(n=>{if(typeof n=="string")e.push(n);else if(Xe(n))if(n.stack)e.push(n.stack);else{let r=_t(z(n));e.push(r)}else if(typeof n=="object"){let r=_t(n);e.push(r)}else{let r=or(n);e.push(r)}}),e.join(`
|
|
56
|
-
`)}s(ui,"messagesToMultilineText");function ce(t){return typeof t=="string"?t:JSON.stringify(t)}s(ce,"stringifyNonString");function or(t){return typeof t=="string"?t:t===null?"null":typeof t>"u"?"undefined":typeof t=="number"||typeof t=="boolean"||typeof t=="bigint"||typeof t=="symbol"?t.toString():typeof t=="function"?`[function ${t.name}]`:typeof t=="object"&&Array.isArray(t)?`[array ${t.length}]`:t instanceof Error?`${t.name??"Error"}: ${t.message??"unknown"}`:typeof t=="object"?Gn(t):"unknown"}s(or,"stringifyNonStringToText");var kt=require("jose");async function Y(t,e,n){for(let r=0;r<=t.retries;r++){let o=fetch(e,n);if(r===t.retries)return o;let i=await o;if(i.status<500&&i.status!==429)return i;t?.logger?.error("Request failed, retrying",{method:typeof e=="string"?"GET":e.method,url:typeof e=="string"?e:e.url,status:i.status}),await new Promise(a=>setTimeout(a,t.retryDelayMs*Math.pow(2,r)))}throw new g("An unknown error occurred, ensure retries is not negative")}s(Y,"fetchRetry");async function ie({serviceAccount:t,audience:e,expirationTime:n="1h",payload:r={}}){let{clientEmail:o,privateKeyId:i,privateKey:a}=t;return await new kt.SignJWT(r).setProtectedHeader({alg:"RS256",kid:i}).setIssuer(o).setSubject(o).setAudience(e).setIssuedAt().setExpirationTime(n).sign(a)}s(ie,"getTokenFromGcpServiceAccount");async function ci(t,e,n){return li(t,{token:e,returnSecureToken:!0},n)}s(ci,"exchangeFirebaseJwtForIdToken");async function Dt(t,e,n){return li(t,{grant_type:"urn:ietf:params:oauth:grant-type:jwt-bearer",assertion:e},n)}s(Dt,"exchangeGgpJwtForIdToken");async function li(t,e,n){let r=await Y(n,t,{method:"POST",headers:{"Content-Type":"application/json"},redirect:"follow",body:JSON.stringify(e)});if(r.status!==200){let i;try{let a=await r.text(),u=JSON.parse(a);i={cause:u.error??u}}catch{}throw new E({message:"Could not get token from Google Identity",extensionMembers:i})}return await r.json()}s(li,"fetchToken");var G=class t{static{s(this,"GcpServiceAccount")}#e;#t;constructor({serviceAccount:e,privateKey:n}){this.#t=e,this.#e=n}static async init(e){let n=JSON.parse(e),r=await(0,kt.importPKCS8)(n.private_key.trim(),"RS256");return new t({serviceAccount:n,privateKey:r})}get type(){return this.#t.type}get projectId(){return this.#t.project_id}get privateKeyId(){return this.#t.private_key_id}get privateKey(){return this.#e}get clientEmail(){return this.#t.client_email}get clientId(){return this.#t.client_id}get authUri(){return this.#t.auth_uri}get tokenUrl(){return this.#t.token_url}get authProviderX509CertUrl(){return this.#t.auth_provider_x509_cert_url}get clientX509CertUrl(){return this.#t.client_x509_cert_url}get universalDomain(){return this.#t.universe_domain}};var Ht=class extends H{constructor(n){super();this.options=n}static{s(this,"GoogleCloudLoggingPlugin")}getTransport(){return new ot(this.options)}},Yu="https://logging.googleapis.com/v2/entries:write?alt=json",ir={error:"ERROR",warn:"WARNING",info:"INFO",debug:"DEBUG"},ot=class{static{s(this,"GoogleLogTransport")}constructor(e){this.#n=e.logName,this.#e=e.serviceAccountJson,this.#o=y.instance.loggingEnvironmentType,this.#i=y.instance.loggingEnvironmentStage,this.#r=y.instance.deploymentName}#e;#t;#n;#r;#o;#i;async init(){this.#t=await G.init(this.#e)}log(e,n){if(!this.#t)throw new T("Invalid state - Google log transport is not initialized");if(e.messages.length===0)return;let r={allMessages:he(e.messages)},o=this.#t.projectId??"zuplo-production",i={logName:this.#n,resource:{type:"global"},severity:ir[e.level],timestamp:e.timestamp,trace:`projects/${o}/traces/${e.requestId}`,labels:{requestId:e.requestId,buildId:e.buildId,source:e.logSource,loggingId:e.loggingId,logOwner:e.logOwner,environment:this.#r,environmentType:this.#o,environmentStage:this.#i}};e.rayId&&(i.labels.rayId=e.rayId);let a=_e(r.allMessages);i.jsonPayload={...r,message:a},this.batcher.enqueue(i),n.waitUntil(this.batcher.waitUntilFlushed())}dispatchFunction=async e=>{if(e.length===0)return;this.#t||(this.#t=await G.init(this.#e));let n=await ie({serviceAccount:this.#t,audience:"https://logging.googleapis.com/google.logging.v2.LoggingServiceV2"}),r=await fetch(Yu,{method:"POST",body:JSON.stringify({entries:e}),headers:{Authorization:`Bearer ${n}`,"content-type":"application/json;charset=UTF-8"}});r.ok||console.error(r.status,r.statusText,await r.text())};batcher=new C("google-log-transport",1,this.dispatchFunction)};var Ut="gcp";function Nt(t){let e={allMessages:he(t.messages)},n="zuplo-production",r=_e(e.allMessages),o={logName:`projects/${n}/logs/runtime-user`,message:r,severity:ir[t.level],timestamp:t.timestamp,"logging.googleapis.com/labels":{buildId:t.buildId,source:t.logSource,loggingId:t.loggingId,logOwner:t.logOwner},"logging.googleapis.com/trace":`projects/${n}/traces/${t.requestId}`,allMessages:e.allMessages};return t.rayId&&(o["logging.googleapis.com/labels"].rayId=t.rayId),o}s(Nt,"gcpLogFormat");var it=class{static{s(this,"ConsoleTransport")}constructor(e,n){this.#e=e??console,this.#t=n}#e;#t;log(e){if(this.#t===Ut){if(e.messages.length===0)return;this.#e[e.level].apply(null,[Nt(e)])}else this.#e[e.level].apply(null,[...e.messages,{logOwner:e.logOwner,logSource:e.logSource,level:e.level,timestamp:e.timestamp,loggingId:e.loggingId,rayId:e.rayId,requestId:e.requestId,buildId:e.buildId}])}};var Mt=class extends H{constructor(n){super();this.options=n}static{s(this,"DataDogLoggingPlugin")}getTransport(){return new st(this.options)}},sr="__ddtags",ar="__ddattr",ur=s(t=>t.replaceAll(",","_").replaceAll(":","_"),"cleanTagText"),Qu=s(t=>{let e=Object.keys(t),n=[];return e.forEach(r=>{let o=t[r];o==null?n.push(ur(r)):n.push(`${ur(r)}:${ur(o.toString())}`)}),n.join(",")},"formatTags"),st=class{static{s(this,"DataDogTransport")}constructor(e){this.#e=e.apiKey,this.#t=e.url??"https://http-intake.logs.datadoghq.com/api/v2/logs",this.#r=y.instance.loggingEnvironmentType,this.#o=y.instance.loggingEnvironmentStage,this.#n=y.instance.deploymentName}#e;#t;#n;#r;#o;log(e,n){let r={},o=n.custom[sr];o&&typeof o=="object"&&Object.assign(r,o);let i=[...e.messages],a=e.messages.findIndex(m=>m[sr]!==void 0);a>-1&&(Object.assign(r,i[a][sr]),i.splice(a,1));let u={},c=n.custom[ar];c&&typeof c=="object"&&Object.assign(u,c);let l=e.messages.findIndex(m=>m[ar]!==void 0);l>-1&&(Object.assign(u,i[l][ar]),i.splice(l,1));let d=he(i),h={message:{...{...e,activityId:e.requestId,trace:e.requestId},messages:d},ddsource:"Zuplo",hostname:new URL(n.originalRequest.url).hostname,msg:_e(d),service:e.loggingId,ddtags:Qu(r),environment:this.#n,environment_type:this.#r,environment_stage:this.#o};Object.assign(h,u),this.batcher.enqueue(h),n.waitUntil(this.batcher.waitUntilFlushed())}dispatchFunction=async e=>{e.length!==0&&await fetch(this.#t,{method:"POST",body:JSON.stringify([...e]),headers:{"content-type":"application/json","DD-API-KEY":this.#e}})};batcher=new C("data-dog-transport",10,this.dispatchFunction)};var at=class{static{s(this,"ProcessTransport")}constructor(e,n){this.#e=e,this.#t=n}#e;#t;log(e){if(this.#t===Ut){if(e.messages.length===0)return;this.#e[e.level].apply(null,[Nt(e)])}else this.#e[e.level].apply(null,[...e.messages,{logOwner:e.logOwner,logSource:e.logSource,timestamp:e.timestamp,loggingId:e.loggingId,rayId:e.rayId,requestId:e.requestId,buildId:e.buildId,vectorClock:e.vectorClock}])}};var Xu=s(({url:t,remoteLogToken:e,loggingId:n,sendOnlyErrors:r})=>async o=>{let i;if(r===!0?i=o.filter(a=>a.level==="error"):i=o,i.length!==0)try{await fetch(`${t}/publish/${n}`,{method:"POST",body:JSON.stringify({timestamp:Date.now(),type:"log",message:i.map(a=>({...a,messages:he(a.messages)}))}),headers:{"content-type":"application/json",authentication:`Bearer ${e}`,"user-agent":y.instance.systemUserAgent,"zp-dn":y.instance.deploymentName??"unknown"}})}catch(a){console.error(a)}},"dispatchFunction"),Zt,qt=class{static{s(this,"RemoteLogTransport")}constructor(e){Zt||(Zt=new C("remote-log-transport",1,Xu(e)))}log(e,n){Zt.enqueue(e),n.waitUntil(Zt.waitUntilFlushed())}};var ec={internal:1,trace:2,debug:5,info:9,warn:13,error:17,fatal:21},di=s((t,e)=>n=>{let r={};return r.deploymentName=t,r.labels={requestId:n.requestId,source:n.logSource,loggingId:n.loggingId,logOwner:n.logOwner},r.rayId=n.rayId??"",r.runtime={buildId:e.BUILD_ID,buildTimestamp:e.TIMESTAMP,gitSHA:e.GIT_SHA,version:e.ZUPLO_VERSION},r.atomicCounter=n.vectorClock,{timestamp:n.timestamp,observerdTimestamp:n.timestamp,traceId:n.requestId,severityText:n.level,severityNumber:ec[n.level],body:n.messages,attributes:r}},"unifiedFormatter");var tc=s(({url:t,remoteLogToken:e,deploymentName:n,build:r})=>async o=>{if(o.length===0)return;let i=di(n,r);try{await fetch(`${t}/v1/runtime-logs`,{method:"POST",body:JSON.stringify({entries:o.map(i)}),headers:{"content-type":"application/json",authentication:`Bearer ${e}`,"user-agent":y.instance.systemUserAgent,"zp-dn":y.instance.deploymentName??"unknown"}})}catch(a){console.error(a)}},"dispatchFunction"),$t,Ft=class{static{s(this,"UnifiedLogTransport")}constructor(e){$t||($t=new C("unified-log-transport",1,tc(e)))}async log(e,n){$t.enqueue(e),n.waitUntil($t.waitUntilFlushed())}};var cr=(0,pi.debug)("zuplo:logging"),Bt=class t{static{s(this,"LogInitializer")}systemCoreLogger;userCoreLogger;constructor({systemCoreLogger:e,userCoreLogger:n}){this.systemCoreLogger=e,this.userCoreLogger=n}static async init(e){let n=await t.setupSystemCoreLogger(y.instance,e),r=await t.setupUserCoreLogger(y.instance,e);return new t({systemCoreLogger:n,userCoreLogger:r})}static async setupSystemCoreLogger(e,n){let{build:r}=e;cr("Gateway.setupSystemCoreLogger");let o=[],i=n.getService(tt);return i?o.push(new at(i.logger,e.logFormat)):e.isDeno&&o.push(new it(console,e.logFormat)),e.isCloudflare&&e.deploymentName&&e.remoteLogToken&&o.push(new Ft({url:e.remoteLogURL,deploymentName:e.deploymentName,remoteLogToken:e.remoteLogToken,build:e.build})),await Promise.all(o.map(async a=>{a.init&&await a.init()})),new nt(e.systemLogLevel,"system",e.loggingId,r.BUILD_ID,o)}static async setupUserCoreLogger(e,n){cr("Gateway.setupUserCoreLogger");let r=[],{runtime:o,build:i}=e,a=n.getService(tt);if(a&&a.captureUserLogs===!0?r.push(new at(a.logger,e.logFormat)):e.isDeno&&r.push(new it(console,e.logFormat)),e.remoteLogToken&&e.loggingId&&r.push(new qt({loggingId:e.loggingId,url:e.remoteLogURL,remoteLogToken:e.remoteLogToken,sendOnlyErrors:e.isCloudflare})),o.GCP_USER_LOG_NAME&&o.GCP_USER_LOG_SVC_ACCT_JSON&&r.push(new ot({serviceAccountJson:o.GCP_USER_LOG_SVC_ACCT_JSON,logName:o.GCP_USER_LOG_NAME})),o.ZUPLO_USER_LOGGER_DATA_DOG_API_KEY){let u=o.ZUPLO_USER_LOGGER_DATA_DOG_URL;r.push(new st({apiKey:o.ZUPLO_USER_LOGGER_DATA_DOG_API_KEY,url:u}))}return ge.forEach(u=>{u instanceof H&&r.push(u.getTransport())}),await Promise.all(r.map(async u=>{u.init&&await u.init()})),new nt(e.userLogLevel,"user",e.loggingId,i.BUILD_ID,r)}createRequestLoggers(e,n,r,o,i){cr("Gateway.createRequestLoggers");let a=new Lt(r,o,i),u=new rt(e,n,this.systemCoreLogger,a);return{userRequestLogger:new rt(e,n,this.userCoreLogger,a),systemRequestLogger:u}}};var Ie=class{static{s(this,"UserRouteConfiguration")}constructor(e){this.path=e.path,this.methods=e.methods,this.label=e.label,this.key=e.key,this.handler=e.handler,this.corsPolicy=e.corsPolicy,this.custom=e.custom,this.version=e.version,this.policies=e.policies,this.excludeFromOpenApi=e.excludeFromOpenApi,this.pathPattern=e.pathPattern,e.raw?(this.#e=e.raw(),this.operationId=this.raw()?.operationId,this.summary=this.raw()?.summary,this.tags=this.raw()?.tags,this.parameters=this.raw()?.parameters,this.responses=this.raw()?.responses):(this.operationId=e.operationId,this.summary=e.summary,this.tags=e.tags,this.parameters=e.parameters,this.responses=e.responses)}raw(){return this.#e}#e;label;key;path;summary;operationId;tags;parameters;responses;excludeFromOpenApi;pathPattern;custom;methods;handler;corsPolicy;version;policies};var lr=class{static{s(this,"RouterEntry")}constructor(e,n,r,o){this.fullPath=e,this.urlPattern=n,this.config=r,this.executableHandler=o}fullPath;urlPattern;config;executableHandler},ke=class{static{s(this,"LookupResult")}constructor(e,n,r){this.routeConfiguration=e,this.params=r??{},this.executableHandler=n}executableHandler;routeConfiguration;params},dr=class extends Error{static{s(this,"RouterError")}constructor(e,n){super(e,n)}},De=class{static{s(this,"Router")}constructor(e){this.routeEntries=[],this.versions=e}versions;routeEntries;addRoute(e,n){if(!(e instanceof Ie||e instanceof k))throw new T("Config must be a UserRouteConfiguration or SystemRouteConfiguration");let r=this.versions.find(i=>i.name===e.version)?.pathPrefix,o;"pathPattern"in e&&e.pathPattern?o=`${r??""}${e.pathPattern}`:o=`${r??""}${e.path}`;try{let i=new URLPattern({pathname:o}),a=new lr(o,i,e,n);Object.freeze(a.config),this.routeEntries.push(a)}catch(i){throw new dr(`addRoute-error: Invalid path '${o}'. '${i.message}'`,{cause:i})}}lookup(e,n){if(typeof e>"u")throw new g(`Invalid request - Method was undefined. Path: '${n}'`);let r=this.routeEntries.filter(o=>o.config.methods.includes(e));if(r.length!==0)for(let o=0;o<r.length;o++){let i=r[o],u=i.urlPattern.exec({pathname:n});if(u!==null)return new ke(i.config,i.executableHandler,u.pathname.groups)}}lookupByPathOnly(e){let n=[];for(let r=0;r<this.routeEntries.length;r++){let o=this.routeEntries[r],a=o.urlPattern.exec({pathname:e});if(a!==null){let u=new ke(o.config,o.executableHandler,a.pathname.groups);n.push(u)}}return n}};var se=(0,mi.debug)("zuplo:runtime"),nc=s(t=>{let e=t.findIndex(n=>n.name===Ye.name);return e>-1?[...t.splice(e),Ye]:[...t,Ye]},"setupSystemNoVersion"),N=class t{constructor(e,n,r,o){this.routeData=e;this.runtimeSettings=n;this.schemaValidator=o;se("Gateway.constructor"),this.#n=this.setupRoutes(),this.#o=this.setupErrorHandler(),this.#t=r}static{s(this,"Gateway")}static#e;static async initialize(e,n,r,o,i){if(se("Gateway.initialize"),!t.#e){await qo(i);let a=await Bt.init(r),u=e(),c={...u,corsPolicies:Wo(u.corsPolicies)},l=new t(c,n,a,o);t.#e=l}return t.#e}static purgeGatewayCache(){se("Gateway.purgeGatewayCache"),t.#e=void 0}static get instance(){if(!t.#e)throw new T("Gateway cannot be used before it is initialized");return t.#e}instanceId=crypto.randomUUID();#t;#n;#r=[At,Ct,j];#o;setupRoutes=()=>{se("Gateway.setupRoutes");let e=this.routeData,n=nc(e.versions),r=new De(n);if(e.routes.length===0)return zn(r,this),er(r,this),Qn(r,this),Ko(r,this),r;let{enabled:o}=this.runtimeSettings.developerPortal;o&&(oi(r,this),ri(r,this)),zn(r,this),er(r,this),Qn(r,this);for(let i of ge)i instanceof ue&&i.registerRoutes(r,this);return e.routes.forEach(i=>{let a;if(typeof i.handler?.module=="object"&&(a=i.handler?.module[i.handler.export]),typeof a!="function")throw new g(`Invalid state - No handler on route for path '${i.path}'`);let u=new D({processors:this.#r,handler:a,gateway:this}),c=new Ie(i);r.addRoute(c,u.execute)}),Jo(r,this),r};setupErrorHandler=()=>{let e;if(typeof this.routeData.requestErrorHandler?.module=="object"){if(e=this.routeData.requestErrorHandler.module[this.routeData.requestErrorHandler.export],typeof e!="function")throw new g("Invalid state - Module and export set for 'errorHandler' is not a function")}else e=s((n,r,o)=>this.#i(n,r,o),"errorHandler");return e};errorHandler(e,n,r){try{return this.#o(e,n,r)}catch(o){return se("An error occurred in the user's errorHandler",o),this.#i(e,n,o)}}#i(e,n,r){se("Gateway.internalErrorResponse");let o={};if(y.instance.isDeno){if(r instanceof E&&r.extensionMembers)o=r.extensionMembers;else if(r.cause){let i=z(r.cause);"stack"in i&&(i.stack=ai(i.stack)),o={cause:i}}}return P.internalServerError(e,n,{detail:r.message,...o})}#s(e){let n=new Headers(e.headers);return go.forEach(r=>{n.delete(r)}),y.instance.isDeno&&fo.forEach(r=>{n.delete(r)}),new Request(e,{headers:n})}async handleRequest(e,n){let r=e.headers.get(Ve)??e.headers.get(io),o=e.headers.get(Se);if(!r){r=crypto.randomUUID();let I=new Headers(e.headers);I.set(Ve,r),e=new Request(e,{headers:I})}if(["GET","HEAD"].includes(e.method)&&e.body){let I=new Headers(e.headers);I.set(so,"true"),e=new Request(e,{headers:I,body:null})}let i={},{userRequestLogger:a,systemRequestLogger:u}=this.#t.createRequestLoggers(r,o,n,i,e),c=new URL(e.url),l=c.pathname,d=this.#n.lookup(e.method,l);if(!d)throw new T(`Invalid state - no route match - should have been picked up by the not found handler, path: '${l}'`);let p=new jt(e.headers),h=this.#s(e),m=new A(h,{params:d.params}),w=new zt({logger:a,route:d.routeConfiguration,requestId:r,fetchEvent:n,custom:i,incomingRequestProperties:p}),R=B.initialize(w,m);if(d.routeConfiguration===Xn&&Ke.value?.notFoundHandler!==void 0){let I=this.#n.lookupByPathOnly(l);R.pathOnlyMatches=I.map(x=>x.routeConfiguration).filter(x=>x instanceof Ie)}try{if(S.addLogger(w,u),y.instance.build.COMPATIBILITY_FLAGS.doNotRunHooksOnSystemRoutes?!Je(c):!c.pathname.startsWith("/__zuplo")){let L=await No(m,w);if(L instanceof Response)return L;{let F=B.getContextExtensions(w);m=L,F.latestRequest=m}}Je(c)&&a.debug(`Request received '${c.pathname}'`,{method:e.method,url:c.pathname,hostname:c.hostname,route:d.routeConfiguration.path});let I=d.executableHandler;rc(I,d,e),se("Gateway.handleRequest - call user handler");let x=await I(m,w);if(se("Gateway.handleRequest - user handler"),!(x instanceof Response))throw new E(`Invalid Response type from the request handler: ${typeof x}`);if(x.bodyUsed)throw new E("The response object has already been used. Return a new response instead.");if(x.headers.get(Ve)===null&&!x.webSocket){let L=new Headers(x.headers);return L.set(Ve,r),new Response(x.body,{status:x.status,statusText:x.statusText,headers:L,cf:x.cf})}else return x}catch(I){return se("Gateway - error executing handler",I),I instanceof E?(a.error(I),u.warn(I)):u.error(I),await this.#i(m,w,I)}}};function rc(t,e,n){if(se("Gateway.checkHandler"),!t)throw typeof e.routeConfiguration>"u"?new g(`Invalid state - no routeConfiguration for '${n.method}:${n.url}`):new g(`Invalid state. No handler for request '${n.method}':'${e.routeConfiguration.path}'`)}s(rc,"checkHandler");var gi=s(async(t,e,n)=>{let r=N.instance.routeData.policies,o=et([t],r);if(o.length===0)throw new E(`Invalid 'invokeInboundPolicy call' - no policy '${t}' found.`);let i=o[0];return i.handler(e,n,i.options,t)},"invokeInboundPolicy");var jt=class{static{s(this,"HeaderIncomingRequestProperties")}#e;constructor(e){this.#e=e}get asn(){try{let e=this.#e.get(Cn);if(typeof e=="string")return parseInt(e)}catch{}}get asOrganization(){return this.#e.get(An)??void 0}get city(){return this.#e.get(xn)??this.#e.get(ao)??void 0}get continent(){return this.#e.get(vn)??this.#e.get(uo)??void 0}get country(){return this.#e.get(On)??this.#e.get(co)??void 0}get latitude(){return this.#e.get(Sn)??this.#e.get(po)??void 0}get longitude(){return this.#e.get(Tn)??this.#e.get(lo)??void 0}get colo(){return this.#e.get(Ln)??void 0}get postalCode(){return this.#e.get(_n)??void 0}get metroCode(){return this.#e.get(kn)??void 0}get region(){return this.#e.get(Dn)??void 0}get regionCode(){return this.#e.get(Hn)??void 0}get timezone(){return this.#e.get(Un)??void 0}toJSON(){return{asn:this.asn,asOrganization:this.asOrganization,city:this.city,continent:this.continent,country:this.country,latitude:this.latitude,longitude:this.longitude,colo:this.colo,postalCode:this.postalCode,metroCode:this.metroCode,region:this.region,regionCode:this.regionCode,timezone:this.timezone}}},Ce=class extends Event{static{s(this,"ResponseSendingEvent")}constructor(e,n){super("responseSending"),this.request=e,this.mutableResponse=n}request;mutableResponse},Ae=class extends Event{static{s(this,"ResponseSentEvent")}constructor(e,n){super("responseSent"),this.request=e,this.response=n}request;response},B=class t{static{s(this,"ZuploContextExtensions")}static#e=new WeakMap;static initialize(e,n){if(!t.#e.has(e)){let r=new t(n);return t.#e.set(e,r),r}throw new Error(`ZuploContextExtensions already initialized for context with requestId '${e.requestId}'`)}static getContextExtensions(e){let n=t.#e.get(e);if(!n)throw new E(`Invalid state, could not get ZuploContext extensions for context with requestId '${e.requestId}'`);return n}latestRequest;pathOnlyMatches;#t;#n;constructor(e){this.latestRequest=e,this.#t=[],this.#n=[]}addResponseSendingHook(e){this.#n.push(e)}addResponseSendingFinalHook(e){this.#t.push(e)}onResponseSendingFinal=async(e,n,r)=>{for(let o of this.#t)await o(e,n,r)};onResponseSending=async(e,n,r)=>{let o=e;for(let i of this.#n)o=await i(e,n,r);return o}},zt=class extends EventTarget{static{s(this,"SystemZuploContext")}constructor({logger:e,route:n,requestId:r,fetchEvent:o,custom:i,incomingRequestProperties:a}){super(),this.log=Object.freeze(e),this.route=n,this.requestId=r,this.custom=i,this.incomingRequestProperties=a,this.#e=o,this.invokeInboundPolicy=(u,c)=>gi(u,c,this),this.waitUntil=u=>{this.#e.waitUntil(u)},this.addResponseSendingHook=u=>{B.getContextExtensions(this).addResponseSendingHook(u)},this.addResponseSendingFinalHook=u=>{B.getContextExtensions(this).addResponseSendingFinalHook(u)},Object.freeze(this)}#e;requestId;log;route;custom;incomingRequestProperties;invokeInboundPolicy;waitUntil;addResponseSendingHook;addResponseSendingFinalHook;addEventListener(e,n,r){let o=s(i=>{try{typeof n=="function"?n(i):n.handleEvent(i)}catch(a){throw this.log.error(`Error invoking event ${e}. See following logs for details.`),a}},"wrapped");super.addEventListener(e,o,r)}};var le=class t{static{s(this,"ContextData")}static#e;#t;constructor(e){this.#t=e}set(e,n){t.set(e,this.#t,n)}get(e){return t.get(e,this.#t)}static set(e,n,r){t.#e||(t.#e=new WeakMap);let o=t.#e.get(e);o||(o=new Map),o.set(n,r),t.#e.set(e,o)}static get(e,n){return t.#e||(t.#e=new WeakMap),t.#e.get(e)?.get(n)}};var oc=["ZUPLO_USER_LOGGER_DATA_DOG_API_KEY","ZUPLO_USER_LOGGER_DATA_DOG_URL","ZUPLO_LOG_LEVEL","ZUPLO_HANDLER_WRITE_LOG_LEVEL"];function pr(t){return t.startsWith("__ZUPLO")||t.startsWith("ZUPLO_")?!oc.includes(t)&&!t.startsWith("ZUPLO_PUBLIC_"):!1}s(pr,"isRestrictedEnvVariableName");function mr(t){return!!t.startsWith("ZUPLO_")}s(mr,"isZuploReadableEnvVariableName");var M=new Proxy({},{get(t,e){if(pr(String(e))&&!mr(String(e)))return;let n=globalThis,r;return n.process?r=n.process.env[e]:r=n[e],r}});var hi=Oe(Re());var X=(0,hi.debug)("zuplo:runtime:external-service");function yi(){let t,{__ZUPLO_EXTERNAL_SERVICE_TOKEN:e}=y.instance.runtime;if(e&&e!=="undefined")try{let n=atob(e);t=JSON.parse(n)}catch{}return t}s(yi,"getServiceAuth");async function bi(t){let e=yi();if(!e)throw X("There is no external service auth configured for this zup."),new E("There are no external services configured for this zup.");if(typeof t!="string")throw X("Cannot call external service with Request object"),new E("Currently, we only support fetch(<some_string>, ...).");let r=new URL(t).hostname,o={};o["CF-Access-Client-Id"]=e.clientId,o["CF-Access-Client-Secret"]=e.clientSecret;let i;if(e.customServiceMapping&&e.customServiceMapping[r])i=`https://${e.customServiceMapping[r]}`;else if(y.instance.useSha256ServiceRouting){X("Using sha256 service routing");let a=y.instance.build;if(a.ACCOUNT_NAME&&a.PROJECT_NAME&&a.ENVIRONMENT_TYPE)i=`https://${await Ri(r,a.ACCOUNT_NAME,a.PROJECT_NAME,a.ENVIRONMENT_TYPE)}.zuptunnel.com`;else throw X("Cannot use sha256 service routing, missing build variables"),new E("Failed to generate fully qualified tunnel url.")}else i=`https://${r}.zuptunnel.com`;return{serviceBaseUrl:i,tunnelHeaders:o}}s(bi,"externalServiceTunnelConfig");async function wi(t,e){let n=yi();if(n)if(X(`Using external service auth. ClientId: ${n.clientId})`),typeof t=="string"){let r=new URL(t),o=r.hostname,i=e??{},a=new Headers(i.headers||{});a.set("CF-Access-Client-Id",n.clientId),a.set("CF-Access-Client-Secret",n.clientSecret),i.headers=a;let u;if(n.customServiceMapping&&n.customServiceMapping[o])u=`https://${n.customServiceMapping[o]}`;else if(y.instance.useSha256ServiceRouting){X("Using sha256 service routing");let d=y.instance.build;if(d.ACCOUNT_NAME&&d.PROJECT_NAME&&d.ENVIRONMENT_TYPE)u=`https://${await Ri(o,d.ACCOUNT_NAME,d.PROJECT_NAME,d.ENVIRONMENT_TYPE)}.zuptunnel.com`;else throw X("Cannot use sha256 service routing, missing build variables"),new E("Failed to generate fully qualified tunnel url.")}else u=`https://${o}.zuptunnel.com`;let c=new URL(`${u}${r.pathname}${r.search}`);X(`Calling external service: ${c.toString()}`);let l=await He(c.toString(),i);if(l.status===403&&l.headers.get("cf-access-domain")!==null)throw console.error("403 Forbidden when calling external service.",{clientId:n.clientId,tunnelHost:u}),new E("Could not connect to secure tunnel.");return l}else throw X("Cannot call external service with Request object"),new E("Currently, we only support fetch(<some_string>, ...).");else throw X("There is no external service auth configured for this zup."),new E("There are no external services configured for this zup.")}s(wi,"externalServiceHandler");async function Ri(t,e,n,r){let o=t.toLowerCase(),i=e.toLowerCase(),a=n.toLowerCase(),u=ic(r);X(`Hashing service name: ${i}-${o}.${i}-${a}-${u}`);let c=await fi(`${i}-${o}`),l=await fi(`${i}-${a}-${u}`);return`${c}.${l}`}s(Ri,"hashServiceName");async function fi(t){let e=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",e);return Array.from(new Uint8Array(n)).map(i=>i.toString(16).padStart(2,"0")).join("").slice(0,-1)}s(fi,"hashSegment");function ic(t){let e=t.toLowerCase();switch(e){case"production":case"preview":return e;default:return"working-copy"}}s(ic,"sanitizeEnvironmentType");var Pi=new Map;Pi.set("service:",wi);var He=globalThis.fetch;globalThis.fetch=function(t,e){let n=sc(e);if(typeof t=="string"){let r=new URL(t),o=Pi.get(r.protocol);return o?o(t,n):He(t,n)}else return He(t,n)};var sc=s(t=>{if(!t||t instanceof Request)return t;let e=t;if(!e.zuplo)return t;let n=t;return n.cf={cacheEverything:e.zuplo?.cacheEverything,cacheTtl:e.zuplo?.cacheTtlSeconds},delete t.zuplo,t},"transformInit");var Ei=s(()=>{N.purgeGatewayCache()},"purgeGatewayCache"),Vt=class{constructor(e,n,r,o,i,a,u){this.routeLoader=e;this.buildEnvironment=n;this.runtimeEnvironment=r;this.runtimeSettings=o;this.serviceProvider=i;this.schemaValidations=a;this.runtimeInit=u}static{s(this,"Handler")}requestHandler=async(e,n)=>{y.initialize(this.buildEnvironment,this.runtimeEnvironment);let r;try{r=await N.initialize(this.routeLoader,this.runtimeSettings,this.serviceProvider,this.schemaValidations,this.runtimeInit)}catch(o){console.error("Error initializing gateway.",o);let i="Error initializing gateway. Check your 'zuplo.runtime.ts' for errors or contact support.";o instanceof g&&(i=o.message);let a={status:500,title:"Gateway Initialization Error",type:"https://httpproblems.com/http-status/500",detail:i,instance:e.url,trace:{timestamp:Date.now(),rayId:e.headers.get("cf-ray")??void 0,buildId:this.buildEnvironment.BUILD_ID},message:y.instance.isDeno?o.message:void 0};return new Response(JSON.stringify(a,null,2),{status:500,headers:{"content-type":"application/json"}})}return r.handleRequest(e,n)}};var Li=Oe(Re());function ac(t){for(var e=[],n=0;n<t.length;){var r=t[n];if(r==="*"||r==="+"||r==="?"){e.push({type:"MODIFIER",index:n,value:t[n++]});continue}if(r==="\\"){e.push({type:"ESCAPED_CHAR",index:n++,value:t[n++]});continue}if(r==="{"){e.push({type:"OPEN",index:n,value:t[n++]});continue}if(r==="}"){e.push({type:"CLOSE",index:n,value:t[n++]});continue}if(r===":"){for(var o="",i=n+1;i<t.length;){var a=t.charCodeAt(i);if(a>=48&&a<=57||a>=65&&a<=90||a>=97&&a<=122||a===95){o+=t[i++];continue}break}if(!o)throw new TypeError("Missing parameter name at ".concat(n));e.push({type:"NAME",index:n,value:o}),n=i;continue}if(r==="("){var u=1,c="",i=n+1;if(t[i]==="?")throw new TypeError('Pattern cannot start with "?" at '.concat(i));for(;i<t.length;){if(t[i]==="\\"){c+=t[i++]+t[i++];continue}if(t[i]===")"){if(u--,u===0){i++;break}}else if(t[i]==="("&&(u++,t[i+1]!=="?"))throw new TypeError("Capturing groups are not allowed at ".concat(i));c+=t[i++]}if(u)throw new TypeError("Unbalanced pattern at ".concat(n));if(!c)throw new TypeError("Missing pattern at ".concat(n));e.push({type:"PATTERN",index:n,value:c}),n=i;continue}e.push({type:"CHAR",index:n,value:t[n++]})}return e.push({type:"END",index:n,value:""}),e}s(ac,"lexer");function gr(t,e){e===void 0&&(e={});for(var n=ac(t),r=e.prefixes,o=r===void 0?"./":r,i="[^".concat(cc(e.delimiter||"/#?"),"]+?"),a=[],u=0,c=0,l="",d=s(function(K){if(c<n.length&&n[c].type===K)return n[c++].value},"tryConsume"),p=s(function(K){var J=d(K);if(J!==void 0)return J;var xe=n[c],ve=xe.type,Pn=xe.index;throw new TypeError("Unexpected ".concat(ve," at ").concat(Pn,", expected ").concat(K))},"mustConsume"),h=s(function(){for(var K="",J;J=d("CHAR")||d("ESCAPED_CHAR");)K+=J;return K},"consumeText");c<n.length;){var m=d("CHAR"),w=d("NAME"),R=d("PATTERN");if(w||R){var I=m||"";o.indexOf(I)===-1&&(l+=I,I=""),l&&(a.push(l),l=""),a.push({name:w||u++,prefix:I,suffix:"",pattern:R||i,modifier:d("MODIFIER")||""});continue}var x=m||d("ESCAPED_CHAR");if(x){l+=x;continue}l&&(a.push(l),l="");var L=d("OPEN");if(L){var I=h(),F=d("NAME")||"",_=d("PATTERN")||"",V=h();p("CLOSE"),a.push({name:F||(_?u++:""),pattern:F&&!_?i:_,prefix:I,suffix:V,modifier:d("MODIFIER")||""});continue}p("END")}return a}s(gr,"parse");function Ii(t,e){return uc(gr(t,e),e)}s(Ii,"compile");function uc(t,e){e===void 0&&(e={});var n=lc(e),r=e.encode,o=r===void 0?function(c){return c}:r,i=e.validate,a=i===void 0?!0:i,u=t.map(function(c){if(typeof c=="object")return new RegExp("^(?:".concat(c.pattern,")$"),n)});return function(c){for(var l="",d=0;d<t.length;d++){var p=t[d];if(typeof p=="string"){l+=p;continue}var h=c?c[p.name]:void 0,m=p.modifier==="?"||p.modifier==="*",w=p.modifier==="*"||p.modifier==="+";if(Array.isArray(h)){if(!w)throw new TypeError('Expected "'.concat(p.name,'" to not repeat, but got an array'));if(h.length===0){if(m)continue;throw new TypeError('Expected "'.concat(p.name,'" to not be empty'))}for(var R=0;R<h.length;R++){var I=o(h[R],p);if(a&&!u[d].test(I))throw new TypeError('Expected all "'.concat(p.name,'" to match "').concat(p.pattern,'", but got "').concat(I,'"'));l+=p.prefix+I+p.suffix}continue}if(typeof h=="string"||typeof h=="number"){var I=o(String(h),p);if(a&&!u[d].test(I))throw new TypeError('Expected "'.concat(p.name,'" to match "').concat(p.pattern,'", but got "').concat(I,'"'));l+=p.prefix+I+p.suffix;continue}if(!m){var x=w?"an array":"a string";throw new TypeError('Expected "'.concat(p.name,'" to be ').concat(x))}}return l}}s(uc,"tokensToFunction");function cc(t){return t.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1")}s(cc,"escapeString");function lc(t){return t&&t.sensitive?"":"i"}s(lc,"flags");var Ti=Oe(Re());var dc=(0,Ti.debug)("zuplo:runtime"),hr=new TextEncoder,xi={appstream2:"appstream",cloudhsmv2:"cloudhsm",email:"ses",marketplace:"aws-marketplace",mobile:"AWSMobileHubService",pinpoint:"mobiletargeting",queue:"sqs","git-codecommit":"codecommit","mturk-requester-sandbox":"mturk-requester","personalize-runtime":"personalize"},pc=["authorization","content-type","content-length","user-agent","presigned-expires","expect","x-amzn-trace-id","range","connection"],Ue=class{static{s(this,"AwsClient")}accessKeyId;secretAccessKey;sessionToken;service;region;cache;retries;initRetryMs;constructor({accessKeyId:e,secretAccessKey:n,sessionToken:r,service:o,region:i,cache:a,retries:u,initRetryMs:c}){if(e==null)throw new TypeError("accessKeyId is a required option");if(n==null)throw new TypeError("secretAccessKey is a required option");this.accessKeyId=e,this.secretAccessKey=n,this.sessionToken=r,this.service=o,this.region=i,this.cache=a||new Map,this.retries=u??0,this.initRetryMs=c||50}async sign(e,n){let r=new yr(Object.assign({url:e},n,this,n&&n.aws)),o=Object.assign({},n,await r.sign());return delete o.aws,{url:o.url.toString(),request:o}}async fetch(e,n){dc("AWS fetch",e);for(let r=0;r<=this.retries;r++){let{url:o,request:i}=await this.sign(e,n),a=fetch(o,i);if(r===this.retries)return a;let u=await a;if(u.status<500&&u.status!==429)return u;await new Promise(c=>setTimeout(c,Math.random()*this.initRetryMs*Math.pow(2,r)))}throw new g("An unknown error occurred, ensure retries is not negative")}},yr=class{static{s(this,"AwsV4Signer")}method;url;headers;body;accessKeyId;secretAccessKey;sessionToken;service;region;cache;datetime;signQuery;appendSessionToken;signableHeaders;signedHeaders;canonicalHeaders;credentialString;encodedPath;encodedSearch;constructor({method:e,url:n,headers:r,body:o,accessKeyId:i,secretAccessKey:a,sessionToken:u,service:c,region:l,cache:d,datetime:p,signQuery:h,appendSessionToken:m,allHeaders:w,singleEncode:R}){if(n==null)throw new TypeError("url is a required option");if(i==null)throw new TypeError("accessKeyId is a required option");if(a==null)throw new TypeError("secretAccessKey is a required option");this.method=e||(o?"POST":"GET"),this.url=new URL(n),this.headers=new Headers(r||{}),this.body=o,this.accessKeyId=i,this.secretAccessKey=a,this.sessionToken=u;let I,x;(!c||!l)&&([I,x]=mc(this.url,this.headers)),this.service=c||I||"",this.region=l||x||"us-east-1",this.cache=d||new Map,this.datetime=p||new Date().toISOString().replace(/[:-]|\.\d{3}/g,""),this.signQuery=h,this.appendSessionToken=m||this.service==="iotdevicegateway",this.headers.delete("Host");let L=this.signQuery?this.url.searchParams:this.headers;if(this.service==="s3"&&!this.headers.has("X-Amz-Content-Sha256")&&this.headers.set("X-Amz-Content-Sha256","UNSIGNED-PAYLOAD"),L.set("X-Amz-Date",this.datetime),this.sessionToken&&!this.appendSessionToken&&L.set("X-Amz-Security-Token",this.sessionToken),this.signableHeaders=["host",...this.headers.keys()].filter(_=>w||!pc.includes(_)).sort(),this.signedHeaders=this.signableHeaders.join(";"),this.canonicalHeaders=this.signableHeaders.map(_=>_+":"+(_==="host"?this.url.host:(this.headers.get(_)||"").replace(/\s+/g," "))).join(`
|
|
56
|
+
`)}s(ui,"messagesToMultilineText");function ce(t){return typeof t=="string"?t:JSON.stringify(t)}s(ce,"stringifyNonString");function or(t){return typeof t=="string"?t:t===null?"null":typeof t>"u"?"undefined":typeof t=="number"||typeof t=="boolean"||typeof t=="bigint"||typeof t=="symbol"?t.toString():typeof t=="function"?`[function ${t.name}]`:typeof t=="object"&&Array.isArray(t)?`[array ${t.length}]`:t instanceof Error?`${t.name??"Error"}: ${t.message??"unknown"}`:typeof t=="object"?Gn(t):"unknown"}s(or,"stringifyNonStringToText");var kt=require("jose");async function Y(t,e,n){for(let r=0;r<=t.retries;r++){let o=fetch(e,n);if(r===t.retries)return o;let i=await o;if(i.status<500&&i.status!==429)return i;t?.logger?.error("Request failed, retrying",{method:typeof e=="string"?"GET":e.method,url:typeof e=="string"?e:e.url,status:i.status}),await new Promise(a=>setTimeout(a,t.retryDelayMs*Math.pow(2,r)))}throw new g("An unknown error occurred, ensure retries is not negative")}s(Y,"fetchRetry");async function ie({serviceAccount:t,audience:e,expirationTime:n="1h",payload:r={}}){let{clientEmail:o,privateKeyId:i,privateKey:a}=t;return await new kt.SignJWT(r).setProtectedHeader({alg:"RS256",kid:i}).setIssuer(o).setSubject(o).setAudience(e).setIssuedAt().setExpirationTime(n).sign(a)}s(ie,"getTokenFromGcpServiceAccount");async function ci(t,e,n){return li(t,{token:e,returnSecureToken:!0},n)}s(ci,"exchangeFirebaseJwtForIdToken");async function Dt(t,e,n){return li(t,{grant_type:"urn:ietf:params:oauth:grant-type:jwt-bearer",assertion:e},n)}s(Dt,"exchangeGgpJwtForIdToken");async function li(t,e,n){let r=await Y(n,t,{method:"POST",headers:{"Content-Type":"application/json"},redirect:"follow",body:JSON.stringify(e)});if(r.status!==200){let i;try{let a=await r.text(),u=JSON.parse(a);i={cause:u.error??u}}catch{}throw new E({message:"Could not get token from Google Identity",extensionMembers:i})}return await r.json()}s(li,"fetchToken");var G=class t{static{s(this,"GcpServiceAccount")}#e;#t;constructor({serviceAccount:e,privateKey:n}){this.#t=e,this.#e=n}static async init(e){let n=JSON.parse(e),r=await(0,kt.importPKCS8)(n.private_key.trim(),"RS256");return new t({serviceAccount:n,privateKey:r})}get type(){return this.#t.type}get projectId(){return this.#t.project_id}get privateKeyId(){return this.#t.private_key_id}get privateKey(){return this.#e}get clientEmail(){return this.#t.client_email}get clientId(){return this.#t.client_id}get authUri(){return this.#t.auth_uri}get tokenUrl(){return this.#t.token_url}get authProviderX509CertUrl(){return this.#t.auth_provider_x509_cert_url}get clientX509CertUrl(){return this.#t.client_x509_cert_url}get universalDomain(){return this.#t.universe_domain}};var Ht=class extends H{constructor(n){super();this.options=n}static{s(this,"GoogleCloudLoggingPlugin")}getTransport(){return new ot(this.options)}},Yu="https://logging.googleapis.com/v2/entries:write?alt=json",ir={error:"ERROR",warn:"WARNING",info:"INFO",debug:"DEBUG"},ot=class{static{s(this,"GoogleLogTransport")}constructor(e){this.#n=e.logName,this.#e=e.serviceAccountJson,this.#o=y.instance.loggingEnvironmentType,this.#i=y.instance.loggingEnvironmentStage,this.#r=y.instance.deploymentName}#e;#t;#n;#r;#o;#i;async init(){this.#t=await G.init(this.#e)}log(e,n){if(!this.#t)throw new T("Invalid state - Google log transport is not initialized");if(e.messages.length===0)return;let r={allMessages:he(e.messages)},o=this.#t.projectId??"zuplo-production",i={logName:this.#n,resource:{type:"global"},severity:ir[e.level],timestamp:e.timestamp,trace:`projects/${o}/traces/${e.requestId}`,labels:{requestId:e.requestId,buildId:e.buildId,source:e.logSource,loggingId:e.loggingId,logOwner:e.logOwner,environment:this.#r,environmentType:this.#o,environmentStage:this.#i}};e.rayId&&(i.labels.rayId=e.rayId);let a=_e(r.allMessages);i.jsonPayload={...r,message:a},this.batcher.enqueue(i),n.waitUntil(this.batcher.waitUntilFlushed())}dispatchFunction=async e=>{if(e.length===0)return;this.#t||(this.#t=await G.init(this.#e));let n=await ie({serviceAccount:this.#t,audience:"https://logging.googleapis.com/google.logging.v2.LoggingServiceV2"}),r=await fetch(Yu,{method:"POST",body:JSON.stringify({entries:e}),headers:{Authorization:`Bearer ${n}`,"content-type":"application/json;charset=UTF-8"}});r.ok||console.error(r.status,r.statusText,await r.text())};batcher=new C("google-log-transport",1,this.dispatchFunction)};var Ut="gcp";function Nt(t){let e={allMessages:he(t.messages)},n="zuplo-production",r=_e(e.allMessages),o={logName:`projects/${n}/logs/runtime-user`,message:r,severity:ir[t.level],timestamp:t.timestamp,"logging.googleapis.com/labels":{buildId:t.buildId,source:t.logSource,loggingId:t.loggingId,logOwner:t.logOwner},"logging.googleapis.com/trace":`projects/${n}/traces/${t.requestId}`,allMessages:e.allMessages};return t.rayId&&(o["logging.googleapis.com/labels"].rayId=t.rayId),o}s(Nt,"gcpLogFormat");var it=class{static{s(this,"ConsoleTransport")}constructor(e,n){this.#e=e??console,this.#t=n}#e;#t;log(e){if(this.#t===Ut){if(e.messages.length===0)return;this.#e[e.level].apply(null,[Nt(e)])}else this.#e[e.level].apply(null,[...e.messages,{logOwner:e.logOwner,logSource:e.logSource,level:e.level,timestamp:e.timestamp,loggingId:e.loggingId,rayId:e.rayId,requestId:e.requestId,buildId:e.buildId}])}};var Mt=class extends H{constructor(n){super();this.options=n}static{s(this,"DataDogLoggingPlugin")}getTransport(){return new st(this.options)}},sr="__ddtags",ar="__ddattr",ur=s(t=>t.replaceAll(",","_").replaceAll(":","_"),"cleanTagText"),Qu=s(t=>{let e=Object.keys(t),n=[];return e.forEach(r=>{let o=t[r];o==null?n.push(ur(r)):n.push(`${ur(r)}:${ur(o.toString())}`)}),n.join(",")},"formatTags"),st=class{static{s(this,"DataDogTransport")}constructor(e){this.#e=e.apiKey,this.#t=e.url??"https://http-intake.logs.datadoghq.com/api/v2/logs",this.#r=y.instance.loggingEnvironmentType,this.#o=y.instance.loggingEnvironmentStage,this.#n=y.instance.deploymentName}#e;#t;#n;#r;#o;log(e,n){let r={},o=n.custom[sr];o&&typeof o=="object"&&Object.assign(r,o);let i=[...e.messages],a=e.messages.findIndex(m=>m[sr]!==void 0);a>-1&&(Object.assign(r,i[a][sr]),i.splice(a,1));let u={},c=n.custom[ar];c&&typeof c=="object"&&Object.assign(u,c);let l=e.messages.findIndex(m=>m[ar]!==void 0);l>-1&&(Object.assign(u,i[l][ar]),i.splice(l,1));let d=he(i),h={message:{...{...e,activityId:e.requestId,trace:e.requestId},messages:d},ddsource:"Zuplo",hostname:new URL(n.originalRequest.url).hostname,msg:_e(d),service:e.loggingId,ddtags:Qu(r),environment:this.#n,environment_type:this.#r,environment_stage:this.#o};Object.assign(h,u),this.batcher.enqueue(h),n.waitUntil(this.batcher.waitUntilFlushed())}dispatchFunction=async e=>{e.length!==0&&await fetch(this.#t,{method:"POST",body:JSON.stringify([...e]),headers:{"content-type":"application/json","DD-API-KEY":this.#e}})};batcher=new C("data-dog-transport",10,this.dispatchFunction)};var at=class{static{s(this,"ProcessTransport")}constructor(e,n){this.#e=e,this.#t=n}#e;#t;log(e){if(this.#t===Ut){if(e.messages.length===0)return;this.#e[e.level].apply(null,[Nt(e)])}else this.#e[e.level].apply(null,[...e.messages,{logOwner:e.logOwner,logSource:e.logSource,timestamp:e.timestamp,loggingId:e.loggingId,rayId:e.rayId,requestId:e.requestId,buildId:e.buildId,vectorClock:e.vectorClock}])}};var Xu=s(({url:t,remoteLogToken:e,loggingId:n,sendOnlyErrors:r})=>async o=>{let i;if(r===!0?i=o.filter(a=>a.level==="error"):i=o,i.length!==0)try{await fetch(`${t}/publish/${n}`,{method:"POST",body:JSON.stringify({timestamp:Date.now(),type:"log",message:i.map(a=>({...a,messages:he(a.messages)}))}),headers:{"content-type":"application/json",authentication:`Bearer ${e}`,"user-agent":y.instance.systemUserAgent,"zp-dn":y.instance.deploymentName??"unknown"}})}catch(a){console.error(a)}},"dispatchFunction"),Zt,qt=class{static{s(this,"RemoteLogTransport")}constructor(e){Zt||(Zt=new C("remote-log-transport",1,Xu(e)))}log(e,n){Zt.enqueue(e),n.waitUntil(Zt.waitUntilFlushed())}};var ec={internal:1,trace:2,debug:5,info:9,warn:13,error:17,fatal:21},di=s((t,e)=>n=>{let r={};return r.deploymentName=t,r.labels={requestId:n.requestId,source:n.logSource,loggingId:n.loggingId,logOwner:n.logOwner},r.rayId=n.rayId??"",r.runtime={buildId:e.BUILD_ID,buildTimestamp:e.TIMESTAMP,gitSHA:e.GIT_SHA,version:e.ZUPLO_VERSION},r.atomicCounter=n.vectorClock,{timestamp:n.timestamp,observerdTimestamp:n.timestamp,traceId:n.requestId,severityText:n.level,severityNumber:ec[n.level],body:n.messages,attributes:r}},"unifiedFormatter");var tc=s(({url:t,remoteLogToken:e,deploymentName:n,build:r})=>async o=>{if(o.length===0)return;let i=di(n,r);try{await fetch(`${t}/v1/runtime-logs`,{method:"POST",body:JSON.stringify({entries:o.map(i)}),headers:{"content-type":"application/json",authentication:`Bearer ${e}`,"user-agent":y.instance.systemUserAgent,"zp-dn":y.instance.deploymentName??"unknown"}})}catch(a){console.error(a)}},"dispatchFunction"),$t,Ft=class{static{s(this,"UnifiedLogTransport")}constructor(e){$t||($t=new C("unified-log-transport",1,tc(e)))}async log(e,n){$t.enqueue(e),n.waitUntil($t.waitUntilFlushed())}};var cr=(0,pi.debug)("zuplo:logging"),Bt=class t{static{s(this,"LogInitializer")}systemCoreLogger;userCoreLogger;constructor({systemCoreLogger:e,userCoreLogger:n}){this.systemCoreLogger=e,this.userCoreLogger=n}static async init(e){let n=await t.setupSystemCoreLogger(y.instance,e),r=await t.setupUserCoreLogger(y.instance,e);return new t({systemCoreLogger:n,userCoreLogger:r})}static async setupSystemCoreLogger(e,n){let{build:r}=e;cr("Gateway.setupSystemCoreLogger");let o=[],i=n.getService(tt);return i?o.push(new at(i.logger,e.logFormat)):e.isDeno&&o.push(new it(console,e.logFormat)),e.isCloudflare&&e.deploymentName&&e.remoteLogToken&&o.push(new Ft({url:e.remoteLogURL,deploymentName:e.deploymentName,remoteLogToken:e.remoteLogToken,build:e.build})),await Promise.all(o.map(async a=>{a.init&&await a.init()})),new nt(e.systemLogLevel,"system",e.loggingId,r.BUILD_ID,o)}static async setupUserCoreLogger(e,n){cr("Gateway.setupUserCoreLogger");let r=[],{runtime:o,build:i}=e,a=n.getService(tt);if(a&&a.captureUserLogs===!0?r.push(new at(a.logger,e.logFormat)):e.isDeno&&r.push(new it(console,e.logFormat)),e.remoteLogToken&&e.loggingId&&r.push(new qt({loggingId:e.loggingId,url:e.remoteLogURL,remoteLogToken:e.remoteLogToken,sendOnlyErrors:e.isCloudflare})),o.GCP_USER_LOG_NAME&&o.GCP_USER_LOG_SVC_ACCT_JSON&&r.push(new ot({serviceAccountJson:o.GCP_USER_LOG_SVC_ACCT_JSON,logName:o.GCP_USER_LOG_NAME})),o.ZUPLO_USER_LOGGER_DATA_DOG_API_KEY){let u=o.ZUPLO_USER_LOGGER_DATA_DOG_URL;r.push(new st({apiKey:o.ZUPLO_USER_LOGGER_DATA_DOG_API_KEY,url:u}))}return ge.forEach(u=>{u instanceof H&&r.push(u.getTransport())}),await Promise.all(r.map(async u=>{u.init&&await u.init()})),new nt(e.userLogLevel,"user",e.loggingId,i.BUILD_ID,r)}createRequestLoggers(e,n,r,o,i){cr("Gateway.createRequestLoggers");let a=new Lt(r,o,i),u=new rt(e,n,this.systemCoreLogger,a);return{userRequestLogger:new rt(e,n,this.userCoreLogger,a),systemRequestLogger:u}}};var Ie=class{static{s(this,"UserRouteConfiguration")}constructor(e){this.path=e.path,this.methods=e.methods,this.label=e.label,this.key=e.key,this.handler=e.handler,this.corsPolicy=e.corsPolicy,this.custom=e.custom,this.version=e.version,this.policies=e.policies,this.excludeFromOpenApi=e.excludeFromOpenApi,this.pathPattern=e.pathPattern,e.raw?(this.#e=e.raw(),this.operationId=this.raw()?.operationId,this.summary=this.raw()?.summary,this.tags=this.raw()?.tags,this.parameters=this.raw()?.parameters,this.responses=this.raw()?.responses):(this.operationId=e.operationId,this.summary=e.summary,this.tags=e.tags,this.parameters=e.parameters,this.responses=e.responses)}raw(){return this.#e}#e;label;key;path;summary;operationId;tags;parameters;responses;excludeFromOpenApi;pathPattern;custom;methods;handler;corsPolicy;version;policies};var lr=class{static{s(this,"RouterEntry")}constructor(e,n,r,o){this.fullPath=e,this.urlPattern=n,this.config=r,this.executableHandler=o}fullPath;urlPattern;config;executableHandler},ke=class{static{s(this,"LookupResult")}constructor(e,n,r){this.routeConfiguration=e,this.params=r??{},this.executableHandler=n}executableHandler;routeConfiguration;params},dr=class extends Error{static{s(this,"RouterError")}constructor(e,n){super(e,n)}},De=class{static{s(this,"Router")}constructor(e){this.routeEntries=[],this.versions=e}versions;routeEntries;addRoute(e,n){if(!(e instanceof Ie||e instanceof k))throw new T("Config must be a UserRouteConfiguration or SystemRouteConfiguration");let r=this.versions.find(i=>i.name===e.version)?.pathPrefix,o;"pathPattern"in e&&e.pathPattern?o=`${r??""}${e.pathPattern}`:o=`${r??""}${e.path}`;try{let i=new URLPattern({pathname:o}),a=new lr(o,i,e,n);Object.freeze(a.config),this.routeEntries.push(a)}catch(i){throw new dr(`addRoute-error: Invalid path '${o}'. '${i.message}'`,{cause:i})}}lookup(e,n){if(typeof e>"u")throw new g(`Invalid request - Method was undefined. Path: '${n}'`);let r=this.routeEntries.filter(o=>o.config.methods.includes(e));if(r.length!==0)for(let o=0;o<r.length;o++){let i=r[o],u=i.urlPattern.exec({pathname:n});if(u!==null)return new ke(i.config,i.executableHandler,u.pathname.groups)}}lookupByPathOnly(e){let n=[];for(let r=0;r<this.routeEntries.length;r++){let o=this.routeEntries[r],a=o.urlPattern.exec({pathname:e});if(a!==null){let u=new ke(o.config,o.executableHandler,a.pathname.groups);n.push(u)}}return n}};var se=(0,mi.debug)("zuplo:runtime"),nc=s(t=>{let e=t.findIndex(n=>n.name===Ye.name);return e>-1?[...t.splice(e),Ye]:[...t,Ye]},"setupSystemNoVersion"),N=class t{constructor(e,n,r,o){this.routeData=e;this.runtimeSettings=n;this.schemaValidator=o;se("Gateway.constructor"),this.#n=this.setupRoutes(),this.#o=this.setupErrorHandler(),this.#t=r}static{s(this,"Gateway")}static#e;static async initialize(e,n,r,o,i){if(se("Gateway.initialize"),!t.#e){await qo(i);let a=await Bt.init(r),u=e(),c={...u,corsPolicies:Wo(u.corsPolicies)},l=new t(c,n,a,o);t.#e=l}return t.#e}static purgeGatewayCache(){se("Gateway.purgeGatewayCache"),t.#e=void 0}static get instance(){if(!t.#e)throw new T("Gateway cannot be used before it is initialized");return t.#e}instanceId=crypto.randomUUID();#t;#n;#r=[At,Ct,j];#o;setupRoutes=()=>{se("Gateway.setupRoutes");let e=this.routeData,n=nc(e.versions),r=new De(n);if(e.routes.length===0)return zn(r,this),er(r,this),Qn(r,this),Ko(r,this),r;let{enabled:o}=this.runtimeSettings.developerPortal;o&&(oi(r,this),ri(r,this)),zn(r,this),er(r,this),Qn(r,this);for(let i of ge)i instanceof ue&&i.registerRoutes(r,this);return e.routes.forEach(i=>{let a;if(typeof i.handler?.module=="object"&&(a=i.handler?.module[i.handler.export]),typeof a!="function")throw new g(`Invalid state - No handler on route for path '${i.path}'`);let u=new D({processors:this.#r,handler:a,gateway:this}),c=new Ie(i);r.addRoute(c,u.execute)}),Jo(r,this),r};setupErrorHandler=()=>{let e;if(typeof this.routeData.requestErrorHandler?.module=="object"){if(e=this.routeData.requestErrorHandler.module[this.routeData.requestErrorHandler.export],typeof e!="function")throw new g("Invalid state - Module and export set for 'errorHandler' is not a function")}else e=s((n,r,o)=>this.#i(n,r,o),"errorHandler");return e};errorHandler(e,n,r){try{return this.#o(e,n,r)}catch(o){return se("An error occurred in the user's errorHandler",o),this.#i(e,n,o)}}#i(e,n,r){se("Gateway.internalErrorResponse");let o={};if(y.instance.isDeno){if(r instanceof E&&r.extensionMembers)o=r.extensionMembers;else if(r.cause){let i=z(r.cause);"stack"in i&&(i.stack=ai(i.stack)),o={cause:i}}}return P.internalServerError(e,n,{detail:r.message,...o})}#s(e){let n=new Headers(e.headers);return go.forEach(r=>{n.delete(r)}),y.instance.isDeno&&fo.forEach(r=>{n.delete(r)}),new Request(e,{headers:n})}async handleRequest(e,n){let r=e.headers.get(Ve)??e.headers.get(io),o=e.headers.get(Se);if(!r){r=crypto.randomUUID();let I=new Headers(e.headers);I.set(Ve,r),e=new Request(e,{headers:I})}if(["GET","HEAD"].includes(e.method)&&e.body){let I=new Headers(e.headers);I.set(so,"true"),e=new Request(e,{headers:I,body:null})}let i={},{userRequestLogger:a,systemRequestLogger:u}=this.#t.createRequestLoggers(r,o,n,i,e),c=new URL(e.url),l=c.pathname,d=this.#n.lookup(e.method,l);if(!d)throw new T(`Invalid state - no route match - should have been picked up by the not found handler, path: '${l}'`);let p=new jt(e.headers),h=this.#s(e),m=new A(h,{params:d.params}),w=new zt({logger:a,route:d.routeConfiguration,requestId:r,fetchEvent:n,custom:i,incomingRequestProperties:p}),R=B.initialize(w,m);if(d.routeConfiguration===Xn&&Ke.value?.notFoundHandler!==void 0){let I=this.#n.lookupByPathOnly(l);R.pathOnlyMatches=I.map(x=>x.routeConfiguration).filter(x=>x instanceof Ie)}try{if(S.addLogger(w,u),y.instance.build.COMPATIBILITY_FLAGS.doNotRunHooksOnSystemRoutes?!Je(c):!c.pathname.startsWith("/__zuplo")){let L=await No(m,w);if(L instanceof Response)return L;{let F=B.getContextExtensions(w);m=L,F.latestRequest=m}}Je(c)||a.debug(`Request received '${c.pathname}'`,{method:e.method,url:c.pathname,hostname:c.hostname,route:d.routeConfiguration.path});let I=d.executableHandler;rc(I,d,e),se("Gateway.handleRequest - call user handler");let x=await I(m,w);if(se("Gateway.handleRequest - user handler"),!(x instanceof Response))throw new E(`Invalid Response type from the request handler: ${typeof x}`);if(x.bodyUsed)throw new E("The response object has already been used. Return a new response instead.");if(x.headers.get(Ve)===null&&!x.webSocket){let L=new Headers(x.headers);return L.set(Ve,r),new Response(x.body,{status:x.status,statusText:x.statusText,headers:L,cf:x.cf})}else return x}catch(I){return se("Gateway - error executing handler",I),I instanceof E?(a.error(I),u.warn(I)):u.error(I),await this.#i(m,w,I)}}};function rc(t,e,n){if(se("Gateway.checkHandler"),!t)throw typeof e.routeConfiguration>"u"?new g(`Invalid state - no routeConfiguration for '${n.method}:${n.url}`):new g(`Invalid state. No handler for request '${n.method}':'${e.routeConfiguration.path}'`)}s(rc,"checkHandler");var gi=s(async(t,e,n)=>{let r=N.instance.routeData.policies,o=et([t],r);if(o.length===0)throw new E(`Invalid 'invokeInboundPolicy call' - no policy '${t}' found.`);let i=o[0];return i.handler(e,n,i.options,t)},"invokeInboundPolicy");var jt=class{static{s(this,"HeaderIncomingRequestProperties")}#e;constructor(e){this.#e=e}get asn(){try{let e=this.#e.get(Cn);if(typeof e=="string")return parseInt(e)}catch{}}get asOrganization(){return this.#e.get(An)??void 0}get city(){return this.#e.get(xn)??this.#e.get(ao)??void 0}get continent(){return this.#e.get(vn)??this.#e.get(uo)??void 0}get country(){return this.#e.get(On)??this.#e.get(co)??void 0}get latitude(){return this.#e.get(Sn)??this.#e.get(po)??void 0}get longitude(){return this.#e.get(Tn)??this.#e.get(lo)??void 0}get colo(){return this.#e.get(Ln)??void 0}get postalCode(){return this.#e.get(_n)??void 0}get metroCode(){return this.#e.get(kn)??void 0}get region(){return this.#e.get(Dn)??void 0}get regionCode(){return this.#e.get(Hn)??void 0}get timezone(){return this.#e.get(Un)??void 0}toJSON(){return{asn:this.asn,asOrganization:this.asOrganization,city:this.city,continent:this.continent,country:this.country,latitude:this.latitude,longitude:this.longitude,colo:this.colo,postalCode:this.postalCode,metroCode:this.metroCode,region:this.region,regionCode:this.regionCode,timezone:this.timezone}}},Ce=class extends Event{static{s(this,"ResponseSendingEvent")}constructor(e,n){super("responseSending"),this.request=e,this.mutableResponse=n}request;mutableResponse},Ae=class extends Event{static{s(this,"ResponseSentEvent")}constructor(e,n){super("responseSent"),this.request=e,this.response=n}request;response},B=class t{static{s(this,"ZuploContextExtensions")}static#e=new WeakMap;static initialize(e,n){if(!t.#e.has(e)){let r=new t(n);return t.#e.set(e,r),r}throw new Error(`ZuploContextExtensions already initialized for context with requestId '${e.requestId}'`)}static getContextExtensions(e){let n=t.#e.get(e);if(!n)throw new E(`Invalid state, could not get ZuploContext extensions for context with requestId '${e.requestId}'`);return n}latestRequest;pathOnlyMatches;#t;#n;constructor(e){this.latestRequest=e,this.#t=[],this.#n=[]}addResponseSendingHook(e){this.#n.push(e)}addResponseSendingFinalHook(e){this.#t.push(e)}onResponseSendingFinal=async(e,n,r)=>{for(let o of this.#t)await o(e,n,r)};onResponseSending=async(e,n,r)=>{let o=e;for(let i of this.#n)o=await i(e,n,r);return o}},zt=class extends EventTarget{static{s(this,"SystemZuploContext")}constructor({logger:e,route:n,requestId:r,fetchEvent:o,custom:i,incomingRequestProperties:a}){super(),this.log=Object.freeze(e),this.route=n,this.requestId=r,this.custom=i,this.incomingRequestProperties=a,this.#e=o,this.invokeInboundPolicy=(u,c)=>gi(u,c,this),this.waitUntil=u=>{this.#e.waitUntil(u)},this.addResponseSendingHook=u=>{B.getContextExtensions(this).addResponseSendingHook(u)},this.addResponseSendingFinalHook=u=>{B.getContextExtensions(this).addResponseSendingFinalHook(u)},Object.freeze(this)}#e;requestId;log;route;custom;incomingRequestProperties;invokeInboundPolicy;waitUntil;addResponseSendingHook;addResponseSendingFinalHook;addEventListener(e,n,r){let o=s(i=>{try{typeof n=="function"?n(i):n.handleEvent(i)}catch(a){throw this.log.error(`Error invoking event ${e}. See following logs for details.`),a}},"wrapped");super.addEventListener(e,o,r)}};var le=class t{static{s(this,"ContextData")}static#e;#t;constructor(e){this.#t=e}set(e,n){t.set(e,this.#t,n)}get(e){return t.get(e,this.#t)}static set(e,n,r){t.#e||(t.#e=new WeakMap);let o=t.#e.get(e);o||(o=new Map),o.set(n,r),t.#e.set(e,o)}static get(e,n){return t.#e||(t.#e=new WeakMap),t.#e.get(e)?.get(n)}};var oc=["ZUPLO_USER_LOGGER_DATA_DOG_API_KEY","ZUPLO_USER_LOGGER_DATA_DOG_URL","ZUPLO_LOG_LEVEL","ZUPLO_HANDLER_WRITE_LOG_LEVEL"];function pr(t){return t.startsWith("__ZUPLO")||t.startsWith("ZUPLO_")?!oc.includes(t)&&!t.startsWith("ZUPLO_PUBLIC_"):!1}s(pr,"isRestrictedEnvVariableName");function mr(t){return!!t.startsWith("ZUPLO_")}s(mr,"isZuploReadableEnvVariableName");var M=new Proxy({},{get(t,e){if(pr(String(e))&&!mr(String(e)))return;let n=globalThis,r;return n.process?r=n.process.env[e]:r=n[e],r}});var hi=Oe(Re());var X=(0,hi.debug)("zuplo:runtime:external-service");function yi(){let t,{__ZUPLO_EXTERNAL_SERVICE_TOKEN:e}=y.instance.runtime;if(e&&e!=="undefined")try{let n=atob(e);t=JSON.parse(n)}catch{}return t}s(yi,"getServiceAuth");async function bi(t){let e=yi();if(!e)throw X("There is no external service auth configured for this zup."),new E("There are no external services configured for this zup.");if(typeof t!="string")throw X("Cannot call external service with Request object"),new E("Currently, we only support fetch(<some_string>, ...).");let r=new URL(t).hostname,o={};o["CF-Access-Client-Id"]=e.clientId,o["CF-Access-Client-Secret"]=e.clientSecret;let i;if(e.customServiceMapping&&e.customServiceMapping[r])i=`https://${e.customServiceMapping[r]}`;else if(y.instance.useSha256ServiceRouting){X("Using sha256 service routing");let a=y.instance.build;if(a.ACCOUNT_NAME&&a.PROJECT_NAME&&a.ENVIRONMENT_TYPE)i=`https://${await Ri(r,a.ACCOUNT_NAME,a.PROJECT_NAME,a.ENVIRONMENT_TYPE)}.zuptunnel.com`;else throw X("Cannot use sha256 service routing, missing build variables"),new E("Failed to generate fully qualified tunnel url.")}else i=`https://${r}.zuptunnel.com`;return{serviceBaseUrl:i,tunnelHeaders:o}}s(bi,"externalServiceTunnelConfig");async function wi(t,e){let n=yi();if(n)if(X(`Using external service auth. ClientId: ${n.clientId})`),typeof t=="string"){let r=new URL(t),o=r.hostname,i=e??{},a=new Headers(i.headers||{});a.set("CF-Access-Client-Id",n.clientId),a.set("CF-Access-Client-Secret",n.clientSecret),i.headers=a;let u;if(n.customServiceMapping&&n.customServiceMapping[o])u=`https://${n.customServiceMapping[o]}`;else if(y.instance.useSha256ServiceRouting){X("Using sha256 service routing");let d=y.instance.build;if(d.ACCOUNT_NAME&&d.PROJECT_NAME&&d.ENVIRONMENT_TYPE)u=`https://${await Ri(o,d.ACCOUNT_NAME,d.PROJECT_NAME,d.ENVIRONMENT_TYPE)}.zuptunnel.com`;else throw X("Cannot use sha256 service routing, missing build variables"),new E("Failed to generate fully qualified tunnel url.")}else u=`https://${o}.zuptunnel.com`;let c=new URL(`${u}${r.pathname}${r.search}`);X(`Calling external service: ${c.toString()}`);let l=await He(c.toString(),i);if(l.status===403&&l.headers.get("cf-access-domain")!==null)throw console.error("403 Forbidden when calling external service.",{clientId:n.clientId,tunnelHost:u}),new E("Could not connect to secure tunnel.");return l}else throw X("Cannot call external service with Request object"),new E("Currently, we only support fetch(<some_string>, ...).");else throw X("There is no external service auth configured for this zup."),new E("There are no external services configured for this zup.")}s(wi,"externalServiceHandler");async function Ri(t,e,n,r){let o=t.toLowerCase(),i=e.toLowerCase(),a=n.toLowerCase(),u=ic(r);X(`Hashing service name: ${i}-${o}.${i}-${a}-${u}`);let c=await fi(`${i}-${o}`),l=await fi(`${i}-${a}-${u}`);return`${c}.${l}`}s(Ri,"hashServiceName");async function fi(t){let e=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",e);return Array.from(new Uint8Array(n)).map(i=>i.toString(16).padStart(2,"0")).join("").slice(0,-1)}s(fi,"hashSegment");function ic(t){let e=t.toLowerCase();switch(e){case"production":case"preview":return e;default:return"working-copy"}}s(ic,"sanitizeEnvironmentType");var Pi=new Map;Pi.set("service:",wi);var He=globalThis.fetch;globalThis.fetch=function(t,e){let n=sc(e);if(typeof t=="string"){let r=new URL(t),o=Pi.get(r.protocol);return o?o(t,n):He(t,n)}else return He(t,n)};var sc=s(t=>{if(!t||t instanceof Request)return t;let e=t;if(!e.zuplo)return t;let n=t;return n.cf={cacheEverything:e.zuplo?.cacheEverything,cacheTtl:e.zuplo?.cacheTtlSeconds},delete t.zuplo,t},"transformInit");var Ei=s(()=>{N.purgeGatewayCache()},"purgeGatewayCache"),Vt=class{constructor(e,n,r,o,i,a,u){this.routeLoader=e;this.buildEnvironment=n;this.runtimeEnvironment=r;this.runtimeSettings=o;this.serviceProvider=i;this.schemaValidations=a;this.runtimeInit=u}static{s(this,"Handler")}requestHandler=async(e,n)=>{y.initialize(this.buildEnvironment,this.runtimeEnvironment);let r;try{r=await N.initialize(this.routeLoader,this.runtimeSettings,this.serviceProvider,this.schemaValidations,this.runtimeInit)}catch(o){console.error("Error initializing gateway.",o);let i="Error initializing gateway. Check your 'zuplo.runtime.ts' for errors or contact support.";o instanceof g&&(i=o.message);let a={status:500,title:"Gateway Initialization Error",type:"https://httpproblems.com/http-status/500",detail:i,instance:e.url,trace:{timestamp:Date.now(),rayId:e.headers.get("cf-ray")??void 0,buildId:this.buildEnvironment.BUILD_ID},message:y.instance.isDeno?o.message:void 0};return new Response(JSON.stringify(a,null,2),{status:500,headers:{"content-type":"application/json"}})}return r.handleRequest(e,n)}};var Li=Oe(Re());function ac(t){for(var e=[],n=0;n<t.length;){var r=t[n];if(r==="*"||r==="+"||r==="?"){e.push({type:"MODIFIER",index:n,value:t[n++]});continue}if(r==="\\"){e.push({type:"ESCAPED_CHAR",index:n++,value:t[n++]});continue}if(r==="{"){e.push({type:"OPEN",index:n,value:t[n++]});continue}if(r==="}"){e.push({type:"CLOSE",index:n,value:t[n++]});continue}if(r===":"){for(var o="",i=n+1;i<t.length;){var a=t.charCodeAt(i);if(a>=48&&a<=57||a>=65&&a<=90||a>=97&&a<=122||a===95){o+=t[i++];continue}break}if(!o)throw new TypeError("Missing parameter name at ".concat(n));e.push({type:"NAME",index:n,value:o}),n=i;continue}if(r==="("){var u=1,c="",i=n+1;if(t[i]==="?")throw new TypeError('Pattern cannot start with "?" at '.concat(i));for(;i<t.length;){if(t[i]==="\\"){c+=t[i++]+t[i++];continue}if(t[i]===")"){if(u--,u===0){i++;break}}else if(t[i]==="("&&(u++,t[i+1]!=="?"))throw new TypeError("Capturing groups are not allowed at ".concat(i));c+=t[i++]}if(u)throw new TypeError("Unbalanced pattern at ".concat(n));if(!c)throw new TypeError("Missing pattern at ".concat(n));e.push({type:"PATTERN",index:n,value:c}),n=i;continue}e.push({type:"CHAR",index:n,value:t[n++]})}return e.push({type:"END",index:n,value:""}),e}s(ac,"lexer");function gr(t,e){e===void 0&&(e={});for(var n=ac(t),r=e.prefixes,o=r===void 0?"./":r,i="[^".concat(cc(e.delimiter||"/#?"),"]+?"),a=[],u=0,c=0,l="",d=s(function(K){if(c<n.length&&n[c].type===K)return n[c++].value},"tryConsume"),p=s(function(K){var J=d(K);if(J!==void 0)return J;var xe=n[c],ve=xe.type,Pn=xe.index;throw new TypeError("Unexpected ".concat(ve," at ").concat(Pn,", expected ").concat(K))},"mustConsume"),h=s(function(){for(var K="",J;J=d("CHAR")||d("ESCAPED_CHAR");)K+=J;return K},"consumeText");c<n.length;){var m=d("CHAR"),w=d("NAME"),R=d("PATTERN");if(w||R){var I=m||"";o.indexOf(I)===-1&&(l+=I,I=""),l&&(a.push(l),l=""),a.push({name:w||u++,prefix:I,suffix:"",pattern:R||i,modifier:d("MODIFIER")||""});continue}var x=m||d("ESCAPED_CHAR");if(x){l+=x;continue}l&&(a.push(l),l="");var L=d("OPEN");if(L){var I=h(),F=d("NAME")||"",_=d("PATTERN")||"",V=h();p("CLOSE"),a.push({name:F||(_?u++:""),pattern:F&&!_?i:_,prefix:I,suffix:V,modifier:d("MODIFIER")||""});continue}p("END")}return a}s(gr,"parse");function Ii(t,e){return uc(gr(t,e),e)}s(Ii,"compile");function uc(t,e){e===void 0&&(e={});var n=lc(e),r=e.encode,o=r===void 0?function(c){return c}:r,i=e.validate,a=i===void 0?!0:i,u=t.map(function(c){if(typeof c=="object")return new RegExp("^(?:".concat(c.pattern,")$"),n)});return function(c){for(var l="",d=0;d<t.length;d++){var p=t[d];if(typeof p=="string"){l+=p;continue}var h=c?c[p.name]:void 0,m=p.modifier==="?"||p.modifier==="*",w=p.modifier==="*"||p.modifier==="+";if(Array.isArray(h)){if(!w)throw new TypeError('Expected "'.concat(p.name,'" to not repeat, but got an array'));if(h.length===0){if(m)continue;throw new TypeError('Expected "'.concat(p.name,'" to not be empty'))}for(var R=0;R<h.length;R++){var I=o(h[R],p);if(a&&!u[d].test(I))throw new TypeError('Expected all "'.concat(p.name,'" to match "').concat(p.pattern,'", but got "').concat(I,'"'));l+=p.prefix+I+p.suffix}continue}if(typeof h=="string"||typeof h=="number"){var I=o(String(h),p);if(a&&!u[d].test(I))throw new TypeError('Expected "'.concat(p.name,'" to match "').concat(p.pattern,'", but got "').concat(I,'"'));l+=p.prefix+I+p.suffix;continue}if(!m){var x=w?"an array":"a string";throw new TypeError('Expected "'.concat(p.name,'" to be ').concat(x))}}return l}}s(uc,"tokensToFunction");function cc(t){return t.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1")}s(cc,"escapeString");function lc(t){return t&&t.sensitive?"":"i"}s(lc,"flags");var Ti=Oe(Re());var dc=(0,Ti.debug)("zuplo:runtime"),hr=new TextEncoder,xi={appstream2:"appstream",cloudhsmv2:"cloudhsm",email:"ses",marketplace:"aws-marketplace",mobile:"AWSMobileHubService",pinpoint:"mobiletargeting",queue:"sqs","git-codecommit":"codecommit","mturk-requester-sandbox":"mturk-requester","personalize-runtime":"personalize"},pc=["authorization","content-type","content-length","user-agent","presigned-expires","expect","x-amzn-trace-id","range","connection"],Ue=class{static{s(this,"AwsClient")}accessKeyId;secretAccessKey;sessionToken;service;region;cache;retries;initRetryMs;constructor({accessKeyId:e,secretAccessKey:n,sessionToken:r,service:o,region:i,cache:a,retries:u,initRetryMs:c}){if(e==null)throw new TypeError("accessKeyId is a required option");if(n==null)throw new TypeError("secretAccessKey is a required option");this.accessKeyId=e,this.secretAccessKey=n,this.sessionToken=r,this.service=o,this.region=i,this.cache=a||new Map,this.retries=u??0,this.initRetryMs=c||50}async sign(e,n){let r=new yr(Object.assign({url:e},n,this,n&&n.aws)),o=Object.assign({},n,await r.sign());return delete o.aws,{url:o.url.toString(),request:o}}async fetch(e,n){dc("AWS fetch",e);for(let r=0;r<=this.retries;r++){let{url:o,request:i}=await this.sign(e,n),a=fetch(o,i);if(r===this.retries)return a;let u=await a;if(u.status<500&&u.status!==429)return u;await new Promise(c=>setTimeout(c,Math.random()*this.initRetryMs*Math.pow(2,r)))}throw new g("An unknown error occurred, ensure retries is not negative")}},yr=class{static{s(this,"AwsV4Signer")}method;url;headers;body;accessKeyId;secretAccessKey;sessionToken;service;region;cache;datetime;signQuery;appendSessionToken;signableHeaders;signedHeaders;canonicalHeaders;credentialString;encodedPath;encodedSearch;constructor({method:e,url:n,headers:r,body:o,accessKeyId:i,secretAccessKey:a,sessionToken:u,service:c,region:l,cache:d,datetime:p,signQuery:h,appendSessionToken:m,allHeaders:w,singleEncode:R}){if(n==null)throw new TypeError("url is a required option");if(i==null)throw new TypeError("accessKeyId is a required option");if(a==null)throw new TypeError("secretAccessKey is a required option");this.method=e||(o?"POST":"GET"),this.url=new URL(n),this.headers=new Headers(r||{}),this.body=o,this.accessKeyId=i,this.secretAccessKey=a,this.sessionToken=u;let I,x;(!c||!l)&&([I,x]=mc(this.url,this.headers)),this.service=c||I||"",this.region=l||x||"us-east-1",this.cache=d||new Map,this.datetime=p||new Date().toISOString().replace(/[:-]|\.\d{3}/g,""),this.signQuery=h,this.appendSessionToken=m||this.service==="iotdevicegateway",this.headers.delete("Host");let L=this.signQuery?this.url.searchParams:this.headers;if(this.service==="s3"&&!this.headers.has("X-Amz-Content-Sha256")&&this.headers.set("X-Amz-Content-Sha256","UNSIGNED-PAYLOAD"),L.set("X-Amz-Date",this.datetime),this.sessionToken&&!this.appendSessionToken&&L.set("X-Amz-Security-Token",this.sessionToken),this.signableHeaders=["host",...this.headers.keys()].filter(_=>w||!pc.includes(_)).sort(),this.signedHeaders=this.signableHeaders.join(";"),this.canonicalHeaders=this.signableHeaders.map(_=>_+":"+(_==="host"?this.url.host:(this.headers.get(_)||"").replace(/\s+/g," "))).join(`
|
|
57
57
|
`),this.credentialString=[this.datetime.slice(0,8),this.region,this.service,"aws4_request"].join("/"),this.signQuery&&(this.service==="s3"&&!L.has("X-Amz-Expires")&&L.set("X-Amz-Expires","86400"),L.set("X-Amz-Algorithm","AWS4-HMAC-SHA256"),L.set("X-Amz-Credential",this.accessKeyId+"/"+this.credentialString),L.set("X-Amz-SignedHeaders",this.signedHeaders)),this.service==="s3")try{this.encodedPath=decodeURIComponent(this.url.pathname.replace(/\+/g," "))}catch{this.encodedPath=this.url.pathname}else this.encodedPath=this.url.pathname.replace(/\/+/g,"/");R||(this.encodedPath=encodeURIComponent(this.encodedPath).replace(/%2F/g,"/")),this.encodedPath=Oi(this.encodedPath);let F=new Set;this.encodedSearch=[...this.url.searchParams].filter(([_])=>{if(!_)return!1;if(this.service==="s3"){if(F.has(_))return!1;F.add(_)}return!0}).map(_=>_.map(V=>Oi(encodeURIComponent(V)))).sort(([_,V],[K,J])=>_<K?-1:_>K?1:V<J?-1:V>J?1:0).map(_=>_.join("=")).join("&")}async sign(){return this.signQuery?(this.url.searchParams.set("X-Amz-Signature",await this.signature()),this.sessionToken&&this.appendSessionToken&&this.url.searchParams.set("X-Amz-Security-Token",this.sessionToken)):this.headers.set("Authorization",await this.authHeader()),{method:this.method,url:this.url,headers:this.headers,body:this.body}}async authHeader(){return["AWS4-HMAC-SHA256 Credential="+this.accessKeyId+"/"+this.credentialString,"SignedHeaders="+this.signedHeaders,"Signature="+await this.signature()].join(", ")}async signature(){let e=this.datetime.slice(0,8),n=[this.secretAccessKey,e,this.region,this.service].join(),r=this.cache.get(n);if(!r){let o=await ut("AWS4"+this.secretAccessKey,e),i=await ut(o,this.region),a=await ut(i,this.service);r=await ut(a,"aws4_request"),this.cache.set(n,r)}return fr(await ut(r,await this.stringToSign()))}async stringToSign(){return["AWS4-HMAC-SHA256",this.datetime,this.credentialString,fr(await vi(await this.canonicalString()))].join(`
|
|
58
58
|
`)}async canonicalString(){return[this.method.toUpperCase(),this.encodedPath,this.encodedSearch,this.canonicalHeaders+`
|
|
59
59
|
`,this.signedHeaders,await this.hexBodyHash()].join(`
|