blaizejs 0.9.2 → 0.10.1

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.
Files changed (27) hide show
  1. package/README.md +302 -1031
  2. package/dist/{chunk-3ICDFF57.js → chunk-C2PTO7BZ.js} +3 -3
  3. package/dist/{chunk-GIZW5W7C.js → chunk-FL7RIGDR.js} +3 -3
  4. package/dist/{chunk-ULIQB554.js → chunk-JEG7DCHT.js} +3 -3
  5. package/dist/{chunk-I5FNWSJS.js → chunk-KK6W6LDB.js} +3 -3
  6. package/dist/chunk-KK6W6LDB.js.map +1 -0
  7. package/dist/{chunk-XIPQPFN5.js → chunk-KTMO67JQ.js} +3 -3
  8. package/dist/index.cjs +15 -16
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +5 -1
  11. package/dist/index.d.ts +5 -1
  12. package/dist/index.js +16 -17
  13. package/dist/index.js.map +1 -1
  14. package/dist/{internal-server-error-DVVTTWHD.js → internal-server-error-RIRTDP3D.js} +3 -3
  15. package/dist/{payload-too-large-error-QGRSATV5.js → payload-too-large-error-6HOOZBD6.js} +3 -3
  16. package/dist/{unsupported-media-type-error-VAT4HTL4.js → unsupported-media-type-error-HSTEA3TX.js} +3 -3
  17. package/dist/{validation-error-N57OM7AM.js → validation-error-V74LVJBA.js} +3 -3
  18. package/package.json +4 -4
  19. package/dist/chunk-I5FNWSJS.js.map +0 -1
  20. /package/dist/{chunk-3ICDFF57.js.map → chunk-C2PTO7BZ.js.map} +0 -0
  21. /package/dist/{chunk-GIZW5W7C.js.map → chunk-FL7RIGDR.js.map} +0 -0
  22. /package/dist/{chunk-ULIQB554.js.map → chunk-JEG7DCHT.js.map} +0 -0
  23. /package/dist/{chunk-XIPQPFN5.js.map → chunk-KTMO67JQ.js.map} +0 -0
  24. /package/dist/{internal-server-error-DVVTTWHD.js.map → internal-server-error-RIRTDP3D.js.map} +0 -0
  25. /package/dist/{payload-too-large-error-QGRSATV5.js.map → payload-too-large-error-6HOOZBD6.js.map} +0 -0
  26. /package/dist/{unsupported-media-type-error-VAT4HTL4.js.map → unsupported-media-type-error-HSTEA3TX.js.map} +0 -0
  27. /package/dist/{validation-error-N57OM7AM.js.map → validation-error-V74LVJBA.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,47 +1,46 @@
1
1
 
2
2
  /**
3
- * blaizejs v0.9.2
3
+ * blaizejs v0.10.1
4
4
  * A blazing-fast, TypeScript-first Node.js framework with HTTP/2 support, file-based routing, powerful middleware system, and end-to-end type safety for building modern APIs.
5
5
  *
6
6
  * Copyright (c) 2026 BlaizeJS Contributors
7
7
  * @license MIT
8
8
  */
9
9
 
10
- import{a as b}from"./chunk-XIPQPFN5.js";import{a as H}from"./chunk-GIZW5W7C.js";import{a as me}from"./chunk-ULIQB554.js";import{a as J}from"./chunk-3ICDFF57.js";import{a as vt,b as N,c as w,d as Tt,e as fe,f as B,g as Ti,h as T}from"./chunk-I5FNWSJS.js";var Et={name:"blaizejs",version:"0.9.2",description:"A blazing-fast, TypeScript-first Node.js framework with HTTP/2 support, file-based routing, powerful middleware system, and end-to-end type safety for building modern APIs.",author:"J.Lea-Jones <jason@careymarcel.com>",repository:{type:"git",url:"https://github.com/jleajones/blaize.git"},homepage:"https://github.com/jleajones/blaize/tree/main/packages/blaize-core#readme",bugs:{url:"https://github.com/jleajones/blaize/issues"},publishConfig:{access:"public"},type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"}},files:["dist"],scripts:{dev:"NODE_ENV=development tsx --watch src/examples/basic.ts",build:"NODE_ENV=production tsup --minify","build:watch":"NODE_ENV=production tsup --watch","type-check":"tsc --noEmit",test:"vitest run --typecheck","test:watch":"vitest","test:coverage":"vitest run --coverage",lint:"eslint .",clean:"rimraf dist"},dependencies:{zod:"^3.24.4"},devDependencies:{"@blaizejs/eslint-config":"workspace:*","@blaizejs/testing-utils":"workspace:*","@blaizejs/tsconfig":"workspace:*","@blaizejs/tsup-config":"workspace:*","@blaizejs/vitest-config":"workspace:*","@types/node":"^22.15.17","@types/selfsigned":"^2.1.0","@vitest/coverage-v8":"^3.1.3",chokidar:"^4.0.3",selfsigned:"^2.4.1",tsx:"^4.19.4",typescript:"^5.8.3","vite-tsconfig-paths":"^5.1.4",vitest:"^3.1.3"},keywords:["nodejs","framework","typescript","http","http2","server","file-based-routing","middleware","plugins","type-safe"],license:"MIT"};import{randomUUID as Rt}from"node:crypto";import{inspect as $r}from"node:util";function Be(e){return e instanceof Error}function Fe(e){return{message:e.message,name:e.name,stack:e.stack}}function ge(e){let t={};for(let[r,n]of Object.entries(e))if(Be(n))t[r]=Fe(n);else if(Array.isArray(n))t[r]=n.map(o=>Be(o)?Fe(o):o);else if(n instanceof Date)t[r]=n;else if(n&&typeof n=="object"){let o={};for(let[i,s]of Object.entries(n))Be(s)?o[i]=Fe(s):o[i]=s;t[r]=o}else t[r]=n;return t}function bt(){let e=new WeakSet;return(t,r)=>{if(typeof r=="object"&&r!==null){if(e.has(r))return"[Circular]";e.add(r)}return r}}var Dr={debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m"},Nr="\x1B[0m",Hr="\x1B[1m",I=class{write(t,r,n){let o=ge(n),a=`${`${Dr[t]}${Hr}[${t.toUpperCase()}]${Nr}`} ${r}`,l=Object.keys(o).length>0?`
10
+ import{a as b}from"./chunk-KTMO67JQ.js";import{a as U}from"./chunk-FL7RIGDR.js";import{a as he}from"./chunk-JEG7DCHT.js";import{a as Y}from"./chunk-C2PTO7BZ.js";import{a as Et,b as q,c as y,d as bt,e as ge,f as F,g as wi,h as T}from"./chunk-KK6W6LDB.js";var xt={name:"blaizejs",version:"0.10.1",description:"A blazing-fast, TypeScript-first Node.js framework with HTTP/2 support, file-based routing, powerful middleware system, and end-to-end type safety for building modern APIs.",author:"J.Lea-Jones <jason@careymarcel.com>",repository:{type:"git",url:"https://github.com/jleajones/blaize.git"},homepage:"https://github.com/jleajones/blaize/tree/main/packages/blaize-core#readme",bugs:{url:"https://github.com/jleajones/blaize/issues"},publishConfig:{access:"public"},type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"}},files:["dist"],scripts:{dev:"NODE_ENV=development tsx --watch src/examples/basic.ts",build:"NODE_ENV=production tsup --minify","build:watch":"NODE_ENV=production tsup --watch","type-check":"tsc --noEmit",test:"vitest run --typecheck","test:watch":"vitest","test:coverage":"vitest run --coverage",lint:"eslint .",clean:"rimraf dist"},dependencies:{zod:"^3.24.4"},devDependencies:{"@blaizejs/eslint-config":"workspace:*","@blaizejs/testing-utils":"workspace:*","@blaizejs/tsconfig":"workspace:*","@blaizejs/tsup-config":"workspace:*","@blaizejs/vitest-config":"workspace:*","@types/node":"^22.15.17","@types/selfsigned":"^2.1.0","@vitest/coverage-v8":"^3.1.3",chokidar:"^4.0.3",selfsigned:"^2.4.1",tsx:"^4.19.4",typescript:"^5.8.3","vite-tsconfig-paths":"^5.1.4",vitest:"^3.1.3"},keywords:["nodejs","framework","typescript","http","http2","server","file-based-routing","middleware","plugins","type-safe"],license:"MIT"};import{randomUUID as Pt}from"node:crypto";import{inspect as Dr}from"node:util";function Le(e){return e instanceof Error}function Oe(e){return{message:e.message,name:e.name,stack:e.stack}}function ye(e){let t={};for(let[r,n]of Object.entries(e))if(Le(n))t[r]=Oe(n);else if(Array.isArray(n))t[r]=n.map(o=>Le(o)?Oe(o):o);else if(n instanceof Date)t[r]=n;else if(n&&typeof n=="object"){let o={};for(let[i,s]of Object.entries(n))Le(s)?o[i]=Oe(s):o[i]=s;t[r]=o}else t[r]=n;return t}function Rt(){let e=new WeakSet;return(t,r)=>{if(typeof r=="object"&&r!==null){if(e.has(r))return"[Circular]";e.add(r)}return r}}var Nr={debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m"},Hr="\x1B[0m",qr="\x1B[1m",$=class{write(t,r,n){let o=ye(n),a=`${`${Nr[t]}${qr}[${t.toUpperCase()}]${Hr}`} ${r}`,l=Object.keys(o).length>0?`
11
11
 
12
- ${$r(o,{colors:!0,depth:3,compact:!1,breakLength:80})}`:"";switch(t){case"error":console.error(a+l);break;case"warn":console.warn(a+l);break;case"debug":case"info":default:console.log(a+l);break}}};var W=class{write(t,r,n){let o=ge(n),i={level:t,message:r,...o},s=JSON.stringify(i,bt());console.log(s)}async flush(){return Promise.resolve()}};var xt={debug:0,info:1,warn:2,error:3},K=class e{config;inheritedMeta;minLevelPriority;constructor(t,r){this.config=t,this.inheritedMeta=Object.freeze(r?{...r}:{}),this.minLevelPriority=xt[t.level]}debug(t,r){this.log("debug",t,r)}info(t,r){this.log("info",t,r)}warn(t,r){this.log("warn",t,r)}error(t,r){this.log("error",t,r)}child(t){let r={...this.inheritedMeta,...t};return new e(this.config,r)}async flush(){await this.config.transport.flush?.()}log(t,r,n){if(!this.shouldLog(t))return;let o={...this.inheritedMeta,...n||{}},i=o;this.config.includeTimestamp&&(i={timestamp:new Date().toISOString(),...o});let s=this.redact(i);this.config.transport.write(t,r,s)}shouldLog(t){return xt[t]>=this.minLevelPriority}redact(t){if(this.config.redactKeys.length===0)return t;let r=new Set(this.config.redactKeys.map(o=>o.toLowerCase())),n={};for(let[o,i]of Object.entries(t))r.has(o.toLowerCase())?n[o]="[REDACTED]":n[o]=i;return n}};function qr(){return process.env.NODE_ENV!=="production"?new I:new W}function M(e){let t=process.env.NODE_ENV!=="production",r={level:e?.level??(t?"debug":"info"),transport:e?.transport??qr(),redactKeys:e?.redactKeys??[],includeTimestamp:e?.includeTimestamp??!0};return new K(r)}var he=class{write(t,r,n){}async flush(){return Promise.resolve()}};var R=M({level:process.env.NODE_ENV==="development"?"debug":"info",transport:new I,includeTimestamp:!0,redactKeys:[]}),Ur=R;function ye(e){let t=M(e);Ur=t,Object.assign(R,t)}function jr(e){if(e==="*")return/^.*$/;let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^:]*");return new RegExp(`^${t}$`)}function Vr(e){if(e instanceof RegExp)return e;if(e.includes("*"))return jr(e);let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`^${t}$`)}var Y=class{serverId;subscriptions=new Map;adapter;adapterUnsubscribe;logger;constructor(t,r){this.serverId=t||Rt(),r?this.logger=r.child({component:"EventBus",serverId:this.serverId}):this.logger=M().child({component:"EventBus",serverId:this.serverId})}async publish(t,r){if(!t||t.trim()==="")throw new Error("Event type cannot be empty");let n={type:t,data:r,timestamp:Date.now(),serverId:this.serverId,correlationId:w()};if(await this.emitToSubscribers(n),this.adapter)try{await this.adapter.publish(n)}catch(o){this.logger.error("Adapter publish failed",{eventType:t,serverId:this.serverId,error:o instanceof Error?o.message:String(o)})}}subscribe(t,r){if(typeof t=="string"&&t.trim()==="")throw new Error("Pattern cannot be empty");let n=Rt(),o=Vr(t),i={id:n,pattern:t,matcher:o,handler:r};this.subscriptions.set(n,i);let s=!1;return()=>{s||(this.subscriptions.delete(n),s=!0)}}async setAdapter(t){this.adapter&&await this.disconnectAdapter(),this.adapter=t,await t.connect(),this.adapterUnsubscribe=await t.subscribe("*",r=>{r.serverId!==this.serverId&&this.emitToSubscribers(r)}),this.logger.info("Adapter connected",{serverId:this.serverId,adapterType:t.constructor.name})}async disconnect(){this.adapter&&await this.disconnectAdapter(),this.subscriptions.clear(),this.logger.info("EventBus disconnected",{serverId:this.serverId})}async disconnectAdapter(){if(this.adapter){this.adapterUnsubscribe&&(this.adapterUnsubscribe(),this.adapterUnsubscribe=void 0);try{await this.adapter.disconnect()}catch(t){this.logger.error("Adapter disconnect failed",{serverId:this.serverId,error:t instanceof Error?t.message:String(t)})}this.adapter=void 0}}async emitToSubscribers(t){let r=[];for(let o of this.subscriptions.values())o.matcher.test(t.type)&&r.push(o.handler);let n=r.map(async o=>{try{await o(t)}catch(i){this.logger.error("Event handler error",{eventType:t.type,serverId:t.serverId,correlationId:t.correlationId,error:i instanceof Error?i.message:String(i),stack:i instanceof Error?i.stack:void 0})}});await Promise.all(n)}};import{z as Wr}from"zod";var q=class extends T{constructor(t,r,n){super("VALIDATION_ERROR",t,400,n??crypto.randomUUID(),r),this.name="EventValidationError"}toJSON(){let t={type:this.type,title:this.title,status:this.status,correlationId:this.correlationId,timestamp:this.timestamp.toISOString()};if(this.details){let r={eventType:this.details.eventType,context:this.details.context};return this.details.zodError&&(r.errors=this.details.zodError.issues.map(n=>({path:n.path.join("."),message:n.message,code:n.code}))),this.details.data!==void 0&&(r.data=this.details.data),{...t,details:r}}return t}toString(){let t=this.details?.context?` during ${this.details.context}`:"",r=this.details?.eventType?` for '${this.details.eventType}'`:"";return`${this.name}: ${this.title}${r}${t} [${this.correlationId}]`}};var Le=class{base;schemas;options;logger;constructor(t,r,n){this.base=t,this.schemas=r.schemas,this.options={schemas:r.schemas,unknownEventBehavior:r.unknownEventBehavior??"warn",onValidationError:r.onValidationError},n?this.logger=n.child({component:"TypedEventBus",serverId:t.serverId}):this.logger=M().child({component:"TypedEventBus",serverId:t.serverId})}async publish(t,r){let n=this.validateEvent(t,r,"publish");await this.base.publish(t,n)}subscribe(t,r){return this.base.subscribe(t,async n=>{try{let o=this.validateEvent(n.type,n.data,"receive"),i={...n,data:o};await r(i)}catch(o){if(o instanceof q){this.logger.error("Receive validation failed, dropping event",{eventType:n.type,serverId:n.serverId,correlationId:n.correlationId,validationErrors:o.details?.zodError?.issues});return}throw this.logger.error("Handler error",{eventType:n.type,error:o instanceof Error?o.message:String(o),stack:o instanceof Error?o.stack:void 0}),o}})}async setAdapter(t){await this.base.setAdapter(t)}async disconnect(){await this.base.disconnect()}get serverId(){return this.base.serverId}validateEvent(t,r,n){let o=this.schemas[t];if(!o)return this.handleUnknownEvent(t,r,n);try{return o.parse(r)}catch(i){let s=new q(`Event validation failed for "${t}"`,{eventType:t,context:n,zodError:i instanceof Wr.ZodError?i:void 0,data:r});throw this.options.onValidationError&&this.options.onValidationError(s),s}}handleUnknownEvent(t,r,n){let o=this.options.unknownEventBehavior;if(o==="error"){let i=new q(`Unknown event type: "${t}"`,{eventType:t,context:n,data:r});throw this.options.onValidationError&&this.options.onValidationError(i),i}return o==="warn"&&this.logger.warn("Unknown event type, allowing through",{eventType:t,context:n}),r}};function Se(e,t,r){return new Le(e,t,r)}function Ct(e,t,r,n,o){if(!e||e.skip&&e.skip(t))return Promise.resolve(r());try{let i=e.execute({ctx:t,next:r,logger:n,eventBus:o});return i instanceof Promise?i:Promise.resolve(i)}catch(i){return Promise.reject(i)}}function Q(e){return e.length===0?async({next:t})=>{await Promise.resolve(t())}:async function(t){let{ctx:r,next:n,logger:o,eventBus:i}=t,s=new Set,a=async c=>{if(c>=e.length)return Promise.resolve(n());let l=e[c],u=()=>{if(s.has(c))throw new Error("next() called multiple times");return s.add(c),a(c+1)},p=o.child({middleware:l?.name||"anonymous"});return Ct(l,r,u,p,i)};return a(0)}}var X=class extends T{constructor(t,r=void 0,n=void 0){super("FORBIDDEN",t,403,n??w(),r)}};function z(e){if(typeof e=="function")return{name:"anonymous",execute:e,debug:!1};let{name:t="anonymous",handler:r,skip:n,debug:o=!1}=e;return{name:t,execute:r,debug:o,...n!==void 0&&{skip:n}}}function Oe(e){return z({name:"state-middleware",handler:e})}function Ae(e){return z({name:"service-middleware",handler:e})}var Qr={origin:!0,methods:["GET","HEAD","PUT","PATCH","POST","DELETE"],credentials:!1,optionsSuccessStatus:204},Zr={origin:!1,methods:["GET","HEAD"],credentials:!1,optionsSuccessStatus:204};function Pt(e){return e===void 0&&(e=process.env.NODE_ENV!=="production"),e?{...Qr}:{...Zr}}function Gr(e=6e4,t=1e3){let r=new Map,n={ttl:e,maxSize:t},o=(p,v,E)=>`${p}:${v}:${E||"anonymous"}`,i=()=>{if(r.size===0)return;let p=null,v=1/0;for(let[E,d]of r.entries())d.lastAccessed<v&&(v=d.lastAccessed,p=E);p&&r.delete(p)};return{get:(p,v,E)=>{let d=o(p,v,E),g=r.get(d);if(!g)return null;let y=Date.now();return y>g.expiresAt?(r.delete(d),null):(g.lastAccessed=y,g.allowed)},set:(p,v,E,d)=>{let g=o(p,E,d),y=Date.now();if(r.has(g)){r.set(g,{allowed:v,expiresAt:y+n.ttl,lastAccessed:y});return}r.size>=n.maxSize&&i(),r.set(g,{allowed:v,expiresAt:y+n.ttl,lastAccessed:y})},clear:()=>{r.clear()},cleanExpired:()=>{let p=Date.now(),v=0;for(let[E,d]of r.entries())p>d.expiresAt&&(r.delete(E),v++);return v},getStats:()=>({size:r.size,maxSize:n.maxSize,ttl:n.ttl})}}var Mt=Gr();function Jr(e){return typeof e=="boolean"||typeof e=="function"?!1:Array.isArray(e)?e.every(t=>typeof t=="string"||t instanceof RegExp):typeof e=="string"||e instanceof RegExp}function Kr(e){return typeof e=="string"?`str:${e}`:e instanceof RegExp?`regex:${e.source}:${e.flags}`:Array.isArray(e)?`array:[${e.map(t=>typeof t=="string"?`str:${t}`:t instanceof RegExp?`regex:${t.source}:${t.flags}`:"unknown").join(",")}]`:"unknown"}async function Yr(e,t){return t==="*"?!0:e===t}async function Xr(e,t){return t.test(e)}async function en(e,t,r,n=100){let o;try{let i=new Promise(a=>{o=setTimeout(()=>{a({timedOut:!0})},n)}),s=await Promise.race([Promise.resolve(t(e,r)).then(a=>({result:a})),i]);return o&&clearTimeout(o),"timedOut"in s?(console.warn(`CORS origin validation function timed out after ${n}ms for origin: ${e}`),!1):s.result}catch(i){return o&&clearTimeout(o),console.error("CORS origin validation function error:",i),!1}}async function zt(e,t,r){let n=t.map(i=>_e(e,i,r));return(await Promise.all(n)).some(i=>i===!0)}async function _e(e,t,r){return typeof t=="string"?Yr(e,t):t instanceof RegExp?Xr(e,t):typeof t=="function"?en(e,t,r):(console.warn("Unknown CORS origin type:",typeof t),!1)}async function ee(e,t,r){if(t===!0)return!0;if(t===!1)return!1;if(Jr(t)){let o=r?.state?.user?.id||r?.state?.userId,i=Kr(t),s=Mt.get(e,i,o);if(s!==null)return s;let a;return Array.isArray(t)?a=await zt(e,t,r):a=await _e(e,t,r),Mt.set(e,a,i,o),a}else return Array.isArray(t)?zt(e,t,r):_e(e,t,r)}function tn(e){let t=e.request.header("origin")||e.request.header("Origin"),r=e.request.header("access-control-request-method")||e.request.header("Access-Control-Request-Method"),n=e.request.header("access-control-request-headers")||e.request.header("Access-Control-Request-Headers"),o=n?n.split(",").map(i=>i.trim().toLowerCase()):void 0;return{origin:t,requestedMethod:r,requestedHeaders:o}}function Ie(e){return e.toUpperCase()}function rn(e,t){return t?(typeof t=="string"?t.split(",").map(n=>n.trim()):t).map(n=>Ie(n)).includes(Ie(e)):["GET","HEAD","PUT","PATCH","POST","DELETE"].includes(Ie(e))}function nn(e,t){if(!e||e.length===0||t===void 0)return!0;let r=typeof t=="string"?t.split(",").map(n=>n.trim().toLowerCase()):t.map(n=>n.toLowerCase());return e.every(n=>r.includes(n.toLowerCase()))}function on(e,t,r,n){n&&(t.origin===!0&&!t.credentials?e.response.header("Access-Control-Allow-Origin","*"):(e.response.header("Access-Control-Allow-Origin",r),e.response.header("Vary","Origin"))),t.credentials&&n&&e.response.header("Access-Control-Allow-Credentials","true");let o=t.methods||["GET","HEAD","PUT","PATCH","POST","DELETE"],i=typeof o=="string"?o:o.join(", ");if(e.response.header("Access-Control-Allow-Methods",i),t.allowedHeaders){let s=typeof t.allowedHeaders=="string"?t.allowedHeaders:t.allowedHeaders.join(", ");e.response.header("Access-Control-Allow-Headers",s)}else{let s=e.request.header("access-control-request-headers")||e.request.header("Access-Control-Request-Headers");s&&e.response.header("Access-Control-Allow-Headers",s)}t.maxAge!==void 0&&t.maxAge>=0&&e.response.header("Access-Control-Max-Age",String(t.maxAge))}async function kt(e,t){let r=tn(e);if(!r.origin||!r.requestedMethod)throw e.response.status(403),new b("Invalid preflight request: missing required headers",{fields:[{field:r.origin?"Access-Control-Request-Method":"Origin",messages:["Required header is missing"]}],errorCount:1,section:"body"});let n=await ee(r.origin,t.origin||!1,e);if(!n)throw e.response.status(403),new b("CORS origin not allowed",{fields:[{field:"Origin",messages:[`Origin '${r.origin}' is not allowed`],rejectedValue:r.origin}],errorCount:1,section:"body"});if(!rn(r.requestedMethod,t.methods))throw e.response.status(403),new b("CORS method not allowed",{fields:[{field:"Access-Control-Request-Method",messages:[`Method '${r.requestedMethod}' is not allowed`],rejectedValue:r.requestedMethod,expectedType:typeof t.methods=="string"?t.methods:t.methods?.join(", ")}],errorCount:1,section:"body"});if(!nn(r.requestedHeaders,t.allowedHeaders)){let i=r.requestedHeaders?.filter(s=>{let a=t.allowedHeaders;return a?!(typeof a=="string"?a.split(",").map(l=>l.trim().toLowerCase()):a.map(l=>l.toLowerCase())).includes(s.toLowerCase()):!1});throw e.response.status(403),new b("CORS headers not allowed",{fields:[{field:"Access-Control-Request-Headers",messages:[`Headers not allowed: ${i?.join(", ")}`],rejectedValue:i}],errorCount:1,section:"body"})}on(e,t,r.origin,n);let o=t.optionsSuccessStatus||204;e.response.status(o),t.preflightContinue||e.response.text("")}function $e(e){return e.request.method==="OPTIONS"&&!!(e.request.header("access-control-request-method")||e.request.header("Access-Control-Request-Method"))}import{z as x}from"zod";var sn=x.enum(["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS","CONNECT","TRACE"]),an=x.union([x.array(sn),x.string().transform(e=>e.split(",").map(t=>t.trim()))]).optional(),Bt=x.union([x.array(x.string()),x.string().transform(e=>e.split(",").map(t=>t.trim()))]).optional(),cn=x.custom(e=>typeof e=="function"&&e.length<=2,{message:"Origin validator must be a function accepting (origin, ctx?) parameters"}),Ft=x.union([x.string(),x.instanceof(RegExp),cn]),ln=x.union([x.boolean(),Ft,x.array(Ft)]),Lt=x.object({origin:ln.optional(),methods:an,allowedHeaders:Bt,exposedHeaders:Bt,credentials:x.boolean().optional(),maxAge:x.number().int().optional(),preflightContinue:x.boolean().optional(),optionsSuccessStatus:x.number().int().min(200).max(299).optional()}).strict(),Ot=x.union([x.boolean(),Lt]).optional();function At(e){try{return typeof e=="boolean"?e===!1?{origin:!1}:{origin:!0}:Lt.parse(e)}catch(t){if(t instanceof x.ZodError){let r=un(t);throw new Error(`Invalid CORS options:
13
- ${r}`)}throw new Error(`Invalid CORS options: ${String(t)}`)}}function un(e){return e.errors.map(r=>` - ${r.path.join(".")||"root"}: ${r.message}`).join(`
14
- `)}function dn(e){return Array.isArray(e)}function _t(e){if(e.credentials===!0&&e.origin!==void 0){if(e.origin===!0||e.origin==="*")throw new Error("CORS security violation: Cannot use wildcard origin (*) with credentials. When credentials are enabled, you must specify explicit origins.");if(dn(e.origin)&&e.origin.some(r=>r==="*"))throw new Error("CORS security violation: Cannot include wildcard origin (*) in array when credentials are enabled.")}}function It(e,t){return e===!0?{...t,origin:!0}:e===!1?{origin:!1}:e?{...t,...e,methods:e.methods??t.methods,allowedHeaders:e.allowedHeaders??t.allowedHeaders,exposedHeaders:e.exposedHeaders??t.exposedHeaders}:t}function pn(e,t,r,n){if(!(!n||!r)&&(t.origin===!0&&!t.credentials?e.response.header("Access-Control-Allow-Origin","*"):(e.response.header("Access-Control-Allow-Origin",r),e.response.header("Vary","Origin")),t.credentials&&e.response.header("Access-Control-Allow-Credentials","true"),t.exposedHeaders)){let o=typeof t.exposedHeaders=="string"?t.exposedHeaders:t.exposedHeaders.join(", ");e.response.header("Access-Control-Expose-Headers",o)}}function we(e){let t=process.env.NODE_ENV==="development",r=Pt(t),n=It(e,r),o=At(n);return _t(o),z({name:"cors",handler:async({ctx:i,next:s})=>{let a=i.request.header("origin")||i.request.header("Origin");if($e(i)){if(await kt(i,o),!o.preflightContinue)return}else{if(!a){await s();return}let c=await ee(a,o.origin||!1,i);if(!c)throw i.response.status(403),new X("CORS validation failed",{reason:"origin_not_allowed",origin:a,allowedOrigins:o.origin});pn(i,o,a,c)}await s()},debug:process.env.DEBUG?.includes("cors")})}var fn=["accept","content-type","user-agent","x-correlation-id"],mn=["authorization","cookie","x-api-key","proxy-authorization"];function gn(e,t){let r={},n=new Set(t.map(i=>i.toLowerCase())),o=new Set(mn.map(i=>i.toLowerCase()));for(let[i,s]of Object.entries(e)){let a=i.toLowerCase();n.has(a)&&(o.has(a)?r[i]="[REDACTED]":r[i]=s)}return r}function $t(e){return z({name:"requestLogger",handler:async({ctx:t,next:r,logger:n})=>{let o=Date.now(),i;"socket"in t.request.raw&&(i=t.request.raw.socket?.remoteAddress);let s={timestamp:new Date().toISOString()};if(i&&(s.ip=i),e?.includeHeaders){let c=e.headerWhitelist||fn,l=t.request.headers(),u=gn(l,c);Object.keys(u).length>0&&(s.headers=u)}if(e?.includeQuery){let c=t.request.query;c&&Object.keys(c).length>0&&(s.query=c)}n.info("Request started",s);let a;try{await r()}catch(c){a=c}finally{let c=Date.now()-o;if(a){let l={duration:c,timestamp:new Date().toISOString()};a instanceof T?l.error={type:a.type,title:a.title,status:a.status,message:a.message,details:a.details,...a.status>=500&&a.stack?{stack:a.stack}:{}}:a instanceof Error?l.error={message:a.message,name:a.name,stack:a.stack}:l.error=String(a),n.error("Request failed",l)}else{let l=t.response.statusCode||200;n.info("Request completed",{statusCode:l,duration:c,timestamp:new Date().toISOString()})}if(a)throw a}}})}function De(e){if(!e.name||typeof e.name!="string")throw new Error("Plugin name must be a non-empty string");if(!e.version||typeof e.version!="string")throw new Error("Plugin version must be a non-empty string");if(typeof e.setup!="function")throw new Error("Plugin setup must be a function");return function(r){let n={...e.defaultConfig||{},...r||{}},o=M().child({plugin:e.name,version:e.version}),i=null,s=!1;return{name:e.name,version:e.version,register:async c=>{if(!s){if(i=e.setup({config:n,logger:o,eventBus:c.eventBus}),i===null||typeof i!="object")throw new Error(`Plugin "${e.name}" setup() must return an object with lifecycle hooks`);s=!0}i?.register?await i.register(c):o.debug("Plugin registered (no register hook)")},initialize:async c=>{if(!s)throw new Error(`Plugin "${e.name}" initialize() called before register(). Plugins must be registered to the server before initialization.`);i?.initialize&&await i.initialize(c)},onServerStart:async c=>{if(!s)throw new Error(`Plugin "${e.name}" onServerStart() called before register(). Plugins must be registered to the server before initialization.`);i?.onServerStart&&await i.onServerStart(c)},onServerStop:async c=>{s&&i?.onServerStop&&await i.onServerStop(c)},terminate:async c=>{s&&i?.terminate&&await i.terminate(c)}}}}import{fileURLToPath as Mn}from"node:url";var ve={};function Dt(e){ve={...ve,...e}}function Nt(){if(!ve.routesDir)throw new Error("Routes directory not configured. Make sure server is properly initialized.");return ve.routesDir}import*as Ht from"node:path";function Te(e,t){e.startsWith("file://")&&(e=e.replace("file://","")),t.startsWith("file://")&&(t=t.replace("file://",""));let r=e.replace(/\\/g,"/"),n=t.replace(/\\/g,"/"),o=n.endsWith("/")?n:`${n}/`,i=r;r.startsWith(o)?i=r.substring(o.length):r.startsWith(n)?(i=r.substring(n.length),i.startsWith("/")&&(i=i.substring(1))):i=Ht.relative(n,r).replace(/\\/g,"/"),i=i.replace(/\.[^.]+$/,"");let s=i.split("/").filter(Boolean),a=[],c=s.map(u=>{if(u.startsWith("[")&&u.endsWith("]")){let p=u.slice(1,-1);return a.push(p),`:${p}`}return u}),l=c.length>0?`/${c.join("/")}`:"/";return l.endsWith("/index")&&(l=l.slice(0,-6)||"/"),{filePath:e,routePath:l,params:a}}import{EventEmitter as Tn}from"node:events";import{z as k}from"zod";var hn=k.enum(["drop-oldest","drop-newest","close"]),yn=k.object({low:k.number().int().positive().describe("Resume threshold in messages"),high:k.number().int().positive().describe("Trigger threshold in messages")}).refine(e=>e.low<e.high,{message:"Low watermark must be less than high watermark",path:["low"]}),Sn=k.object({maxMessages:k.number().int().positive().max(1e5).describe("Maximum number of messages in buffer"),maxBytes:k.number().int().positive().max(100*1024*1024).optional().describe("Maximum buffer size in bytes"),messageTimeout:k.number().int().nonnegative().max(3e5).optional().describe("Message TTL in milliseconds")}),qt=k.object({enabled:k.boolean().default(!0).describe("Enable backpressure management"),strategy:hn.default("drop-oldest").describe("Strategy when buffer reaches high watermark"),watermarks:yn.default({low:100,high:1e3}).describe("Buffer watermark thresholds"),limits:Sn.default({maxMessages:1e4}).describe("Buffer size constraints"),metrics:k.object({enabled:k.boolean().default(!1),interval:k.number().int().positive().default(5e3)}).optional().describe("Metrics collection configuration")}).refine(e=>e.watermarks.high<=e.limits.maxMessages,{message:"High watermark cannot exceed maxMessages limit",path:["watermarks","high"]});var wn={maxConnections:1e4,maxConnectionsPerClient:100,inactiveTimeout:18e5,cleanupInterval:6e4};function vn(e){let t={...wn,...e},r=new Map,n=new Map,o=null,i={},s=f=>{!o&&t.cleanupInterval>0&&(o=setInterval(()=>{f()},t.cleanupInterval),o.unref&&o.unref())},a=()=>{o&&(clearInterval(o),o=null)},c=(f,h)=>{if(!f)return;let C=(n.get(f)||0)+h;C<=0?n.delete(f):n.set(f,C)},l=(f,h,m)=>{if(r.has(f))throw new Error(`Connection with ID ${f} already exists`);if(r.size>=t.maxConnections)throw new Error(`Maximum connection limit reached (${t.maxConnections})`);if(m?.clientIp&&(n.get(m.clientIp)||0)>=t.maxConnectionsPerClient)throw new Error(`Maximum connections per client reached (${t.maxConnectionsPerClient})`);let C=Date.now();r.set(f,{stream:h,connectedAt:C,lastActivity:C,clientIp:m?.clientIp,userAgent:m?.userAgent}),c(m?.clientIp,1),r.size===1&&s(i.cleanup),h.onClose(()=>{u(f)})},u=f=>{let h=r.get(f);h&&(r.delete(f),c(h.clientIp,-1),r.size===0&&a())},p=()=>r.size,v=()=>{let f=Date.now(),h=[];r.forEach((m,C)=>{let O=f-m.lastActivity>t.inactiveTimeout,_r=!m.stream||m.stream.state==="closed"||!m.stream.isWritable;if((O||_r)&&(h.push(C),m.stream&&typeof m.stream.close=="function"))try{m.stream.close()}catch{}}),h.forEach(m=>u(m))},E=f=>r.get(f)?.stream,d=f=>r.has(f),g=()=>Array.from(r.keys()),y=()=>{a(),r.forEach(f=>{if(f.stream&&typeof f.stream.close=="function")try{f.stream.close()}catch{}}),r.clear(),n.clear()};return i.add=l,i.remove=u,i.count=p,i.cleanup=v,i.get=E,i.has=d,i.getIds=g,i.shutdown=y,i}var Ne=null;function Ee(e){return Ne||(Ne=vn(e)),Ne}var te=class extends T{constructor(t,r,n=void 0){super("SSE_BUFFER_OVERFLOW",t,503,n??w(),r)}};var be=class extends T{constructor(t,r=void 0,n=void 0){super("SSE_STREAM_CLOSED",t,410,n??w(),r)}};var En={heartbeatInterval:3e4,maxEventSize:1024*1024,autoClose:!0,maxBufferSize:1e3,bufferStrategy:"drop-oldest"};function Ut(e,t,r,n){let o=[];r&&o.push(`id: ${r}`),n!==void 0&&o.push(`retry: ${n}`),o.push(`event: ${e}`);let s=(t===null?"null":t===void 0?"undefined":typeof t=="string"?t:JSON.stringify(t)).split(`
12
+ ${Dr(o,{colors:!0,depth:3,compact:!1,breakLength:80})}`:"";switch(t){case"error":console.error(a+l);break;case"warn":console.warn(a+l);break;case"debug":case"info":default:console.log(a+l);break}}};var Z=class{write(t,r,n){let o=ye(n),i={level:t,message:r,...o},s=JSON.stringify(i,Rt());console.log(s)}async flush(){return Promise.resolve()}};var Ct={debug:0,info:1,warn:2,error:3},X=class e{config;inheritedMeta;minLevelPriority;constructor(t,r){this.config=t,this.inheritedMeta=Object.freeze(r?{...r}:{}),this.minLevelPriority=Ct[t.level]}debug(t,r){this.log("debug",t,r)}info(t,r){this.log("info",t,r)}warn(t,r){this.log("warn",t,r)}error(t,r){this.log("error",t,r)}child(t){let r={...this.inheritedMeta,...t};return new e(this.config,r)}async flush(){await this.config.transport.flush?.()}log(t,r,n){if(!this.shouldLog(t))return;let o={...this.inheritedMeta,...n||{}},i=o;this.config.includeTimestamp&&(i={timestamp:new Date().toISOString(),...o});let s=this.redact(i);this.config.transport.write(t,r,s)}shouldLog(t){return Ct[t]>=this.minLevelPriority}redact(t){if(this.config.redactKeys.length===0)return t;let r=new Set(this.config.redactKeys.map(o=>o.toLowerCase())),n={};for(let[o,i]of Object.entries(t))r.has(o.toLowerCase())?n[o]="[REDACTED]":n[o]=i;return n}};function Ur(){return process.env.NODE_ENV!=="production"?new $:new Z}function M(e){let t=process.env.NODE_ENV!=="production",r={level:e?.level??(t?"debug":"info"),transport:e?.transport??Ur(),redactKeys:e?.redactKeys??[],includeTimestamp:e?.includeTimestamp??!0};return new X(r)}var Se=class{write(t,r,n){}async flush(){return Promise.resolve()}};var x=M({level:process.env.NODE_ENV==="development"?"debug":"info",transport:new $,includeTimestamp:!0,redactKeys:[]}),jr=x;function ve(e){let t=M(e);jr=t,Object.assign(x,t)}function Vr(e){if(e==="*")return/^.*$/;let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^:]*");return new RegExp(`^${t}$`)}function Wr(e){if(e instanceof RegExp)return e;if(e.includes("*"))return Vr(e);let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`^${t}$`)}var ee=class{serverId;subscriptions=new Map;adapter;adapterUnsubscribe;logger;constructor(t,r){this.serverId=t||Pt(),r?this.logger=r.child({component:"EventBus",serverId:this.serverId}):this.logger=M().child({component:"EventBus",serverId:this.serverId})}async publish(t,r){if(!t||t.trim()==="")throw new Error("Event type cannot be empty");let n={type:t,data:r,timestamp:Date.now(),serverId:this.serverId,correlationId:y()};if(await this.emitToSubscribers(n),this.adapter)try{await this.adapter.publish(n)}catch(o){this.logger.error("Adapter publish failed",{eventType:t,serverId:this.serverId,error:o instanceof Error?o.message:String(o)})}}subscribe(t,r){if(typeof t=="string"&&t.trim()==="")throw new Error("Pattern cannot be empty");let n=Pt(),o=Wr(t),i={id:n,pattern:t,matcher:o,handler:r};this.subscriptions.set(n,i);let s=!1;return()=>{s||(this.subscriptions.delete(n),s=!0)}}async setAdapter(t){this.adapter&&await this.disconnectAdapter(),this.adapter=t,await t.connect(),this.adapterUnsubscribe=await t.subscribe("*",r=>{r.serverId!==this.serverId&&this.emitToSubscribers(r)}),this.logger.info("Adapter connected",{serverId:this.serverId,adapterType:t.constructor.name})}async disconnect(){this.adapter&&await this.disconnectAdapter(),this.subscriptions.clear(),this.logger.info("EventBus disconnected",{serverId:this.serverId})}async disconnectAdapter(){if(this.adapter){this.adapterUnsubscribe&&(this.adapterUnsubscribe(),this.adapterUnsubscribe=void 0);try{await this.adapter.disconnect()}catch(t){this.logger.error("Adapter disconnect failed",{serverId:this.serverId,error:t instanceof Error?t.message:String(t)})}this.adapter=void 0}}async emitToSubscribers(t){let r=[];for(let o of this.subscriptions.values())o.matcher.test(t.type)&&r.push(o.handler);let n=r.map(async o=>{try{await o(t)}catch(i){this.logger.error("Event handler error",{eventType:t.type,serverId:t.serverId,correlationId:t.correlationId,error:i instanceof Error?i.message:String(i),stack:i instanceof Error?i.stack:void 0})}});await Promise.all(n)}};import{z as Qr}from"zod";var j=class extends T{constructor(t,r,n){super("VALIDATION_ERROR",t,400,n??crypto.randomUUID(),r),this.name="EventValidationError"}toJSON(){let t={type:this.type,title:this.title,status:this.status,correlationId:this.correlationId,timestamp:this.timestamp.toISOString()};if(this.details){let r={eventType:this.details.eventType,context:this.details.context};return this.details.zodError&&(r.errors=this.details.zodError.issues.map(n=>({path:n.path.join("."),message:n.message,code:n.code}))),this.details.data!==void 0&&(r.data=this.details.data),{...t,details:r}}return t}toString(){let t=this.details?.context?` during ${this.details.context}`:"",r=this.details?.eventType?` for '${this.details.eventType}'`:"";return`${this.name}: ${this.title}${r}${t} [${this.correlationId}]`}};var _e=class{base;schemas;options;logger;constructor(t,r,n){this.base=t,this.schemas=r.schemas,this.options={schemas:r.schemas,unknownEventBehavior:r.unknownEventBehavior??"warn",onValidationError:r.onValidationError},n?this.logger=n.child({component:"TypedEventBus",serverId:t.serverId}):this.logger=M().child({component:"TypedEventBus",serverId:t.serverId})}async publish(t,r){let n=this.validateEvent(t,r,"publish");await this.base.publish(t,n)}subscribe(t,r){return this.base.subscribe(t,async n=>{try{let o=this.validateEvent(n.type,n.data,"receive"),i={...n,data:o};await r(i)}catch(o){if(o instanceof j){this.logger.error("Receive validation failed, dropping event",{eventType:n.type,serverId:n.serverId,correlationId:n.correlationId,validationErrors:o.details?.zodError?.issues});return}throw this.logger.error("Handler error",{eventType:n.type,error:o instanceof Error?o.message:String(o),stack:o instanceof Error?o.stack:void 0}),o}})}async setAdapter(t){await this.base.setAdapter(t)}async disconnect(){await this.base.disconnect()}get serverId(){return this.base.serverId}validateEvent(t,r,n){let o=this.schemas[t];if(!o)return this.handleUnknownEvent(t,r,n);try{return o.parse(r)}catch(i){let s=new j(`Event validation failed for "${t}"`,{eventType:t,context:n,zodError:i instanceof Qr.ZodError?i:void 0,data:r});throw this.options.onValidationError&&this.options.onValidationError(s),s}}handleUnknownEvent(t,r,n){let o=this.options.unknownEventBehavior;if(o==="error"){let i=new j(`Unknown event type: "${t}"`,{eventType:t,context:n,data:r});throw this.options.onValidationError&&this.options.onValidationError(i),i}return o==="warn"&&this.logger.warn("Unknown event type, allowing through",{eventType:t,context:n}),r}};function we(e,t,r){return new _e(e,t,r)}function Mt(e,t,r,n,o){if(!e||e.skip&&e.skip(t))return Promise.resolve(r());try{let i=e.execute({ctx:t,next:r,logger:n,eventBus:o});return i instanceof Promise?i:Promise.resolve(i)}catch(i){return Promise.reject(i)}}function G(e){return e.length===0?async({next:t})=>{await Promise.resolve(t())}:async function(t){let{ctx:r,next:n,logger:o,eventBus:i}=t,s=new Set,a=async c=>{if(c>=e.length)return Promise.resolve(n());let l=e[c],u=()=>{if(s.has(c))throw new Error("next() called multiple times");return s.add(c),a(c+1)},m=o.child({middleware:l?.name||"anonymous"});return Mt(l,r,u,m,i)};return a(0)}}var te=class extends T{constructor(t,r=void 0,n=void 0){super("FORBIDDEN",t,403,n??y(),r)}};function z(e){if(typeof e=="function")return{name:"anonymous",execute:e,debug:!1};let{name:t="anonymous",handler:r,skip:n,debug:o=!1}=e;return{name:t,execute:r,debug:o,...n!==void 0&&{skip:n}}}function Ae(e){return z({name:"state-middleware",handler:e})}function Ie(e){return z({name:"service-middleware",handler:e})}var Zr={origin:!0,methods:["GET","HEAD","PUT","PATCH","POST","DELETE"],credentials:!1,optionsSuccessStatus:204},Gr={origin:!1,methods:["GET","HEAD"],credentials:!1,optionsSuccessStatus:204};function zt(e){return e===void 0&&(e=process.env.NODE_ENV!=="production"),e?{...Zr}:{...Gr}}function Jr(e=6e4,t=1e3){let r=new Map,n={ttl:e,maxSize:t},o=(m,v,E)=>`${m}:${v}:${E||"anonymous"}`,i=()=>{if(r.size===0)return;let m=null,v=1/0;for(let[E,C]of r.entries())C.lastAccessed<v&&(v=C.lastAccessed,m=E);m&&r.delete(m)};return{get:(m,v,E)=>{let C=o(m,v,E),k=r.get(C);if(!k)return null;let d=Date.now();return d>k.expiresAt?(r.delete(C),null):(k.lastAccessed=d,k.allowed)},set:(m,v,E,C)=>{let k=o(m,E,C),d=Date.now();if(r.has(k)){r.set(k,{allowed:v,expiresAt:d+n.ttl,lastAccessed:d});return}r.size>=n.maxSize&&i(),r.set(k,{allowed:v,expiresAt:d+n.ttl,lastAccessed:d})},clear:()=>{r.clear()},cleanExpired:()=>{let m=Date.now(),v=0;for(let[E,C]of r.entries())m>C.expiresAt&&(r.delete(E),v++);return v},getStats:()=>({size:r.size,maxSize:n.maxSize,ttl:n.ttl})}}var kt=Jr();function Kr(e){return typeof e=="boolean"||typeof e=="function"?!1:Array.isArray(e)?e.every(t=>typeof t=="string"||t instanceof RegExp):typeof e=="string"||e instanceof RegExp}function Yr(e){return typeof e=="string"?`str:${e}`:e instanceof RegExp?`regex:${e.source}:${e.flags}`:Array.isArray(e)?`array:[${e.map(t=>typeof t=="string"?`str:${t}`:t instanceof RegExp?`regex:${t.source}:${t.flags}`:"unknown").join(",")}]`:"unknown"}async function Xr(e,t){return t==="*"?!0:e===t}async function en(e,t){return t.test(e)}async function tn(e,t,r,n=100){let o;try{let i=new Promise(a=>{o=setTimeout(()=>{a({timedOut:!0})},n)}),s=await Promise.race([Promise.resolve(t(e,r)).then(a=>({result:a})),i]);return o&&clearTimeout(o),"timedOut"in s?(console.warn(`CORS origin validation function timed out after ${n}ms for origin: ${e}`),!1):s.result}catch(i){return o&&clearTimeout(o),console.error("CORS origin validation function error:",i),!1}}async function Bt(e,t,r){let n=t.map(i=>$e(e,i,r));return(await Promise.all(n)).some(i=>i===!0)}async function $e(e,t,r){return typeof t=="string"?Xr(e,t):t instanceof RegExp?en(e,t):typeof t=="function"?tn(e,t,r):(console.warn("Unknown CORS origin type:",typeof t),!1)}async function re(e,t,r){if(t===!0)return!0;if(t===!1)return!1;if(Kr(t)){let o=r?.state?.user?.id||r?.state?.userId,i=Yr(t),s=kt.get(e,i,o);if(s!==null)return s;let a;return Array.isArray(t)?a=await Bt(e,t,r):a=await $e(e,t,r),kt.set(e,a,i,o),a}else return Array.isArray(t)?Bt(e,t,r):$e(e,t,r)}function rn(e){let t=e.request.header("origin")||e.request.header("Origin"),r=e.request.header("access-control-request-method")||e.request.header("Access-Control-Request-Method"),n=e.request.header("access-control-request-headers")||e.request.header("Access-Control-Request-Headers"),o=n?n.split(",").map(i=>i.trim().toLowerCase()):void 0;return{origin:t,requestedMethod:r,requestedHeaders:o}}function De(e){return e.toUpperCase()}function nn(e,t){return t?(typeof t=="string"?t.split(",").map(n=>n.trim()):t).map(n=>De(n)).includes(De(e)):["GET","HEAD","PUT","PATCH","POST","DELETE"].includes(De(e))}function on(e,t){if(!e||e.length===0||t===void 0)return!0;let r=typeof t=="string"?t.split(",").map(n=>n.trim().toLowerCase()):t.map(n=>n.toLowerCase());return e.every(n=>r.includes(n.toLowerCase()))}function sn(e,t,r,n){n&&(t.origin===!0&&!t.credentials?e.response.header("Access-Control-Allow-Origin","*"):(e.response.header("Access-Control-Allow-Origin",r),e.response.header("Vary","Origin"))),t.credentials&&n&&e.response.header("Access-Control-Allow-Credentials","true");let o=t.methods||["GET","HEAD","PUT","PATCH","POST","DELETE"],i=typeof o=="string"?o:o.join(", ");if(e.response.header("Access-Control-Allow-Methods",i),t.allowedHeaders){let s=typeof t.allowedHeaders=="string"?t.allowedHeaders:t.allowedHeaders.join(", ");e.response.header("Access-Control-Allow-Headers",s)}else{let s=e.request.header("access-control-request-headers")||e.request.header("Access-Control-Request-Headers");s&&e.response.header("Access-Control-Allow-Headers",s)}t.maxAge!==void 0&&t.maxAge>=0&&e.response.header("Access-Control-Max-Age",String(t.maxAge))}async function Ft(e,t){let r=rn(e);if(!r.origin||!r.requestedMethod)throw e.response.status(403),new b("Invalid preflight request: missing required headers",{fields:[{field:r.origin?"Access-Control-Request-Method":"Origin",messages:["Required header is missing"]}],errorCount:1,section:"body"});let n=await re(r.origin,t.origin||!1,e);if(!n)throw e.response.status(403),new b("CORS origin not allowed",{fields:[{field:"Origin",messages:[`Origin '${r.origin}' is not allowed`],rejectedValue:r.origin}],errorCount:1,section:"body"});if(!nn(r.requestedMethod,t.methods))throw e.response.status(403),new b("CORS method not allowed",{fields:[{field:"Access-Control-Request-Method",messages:[`Method '${r.requestedMethod}' is not allowed`],rejectedValue:r.requestedMethod,expectedType:typeof t.methods=="string"?t.methods:t.methods?.join(", ")}],errorCount:1,section:"body"});if(!on(r.requestedHeaders,t.allowedHeaders)){let i=r.requestedHeaders?.filter(s=>{let a=t.allowedHeaders;return a?!(typeof a=="string"?a.split(",").map(l=>l.trim().toLowerCase()):a.map(l=>l.toLowerCase())).includes(s.toLowerCase()):!1});throw e.response.status(403),new b("CORS headers not allowed",{fields:[{field:"Access-Control-Request-Headers",messages:[`Headers not allowed: ${i?.join(", ")}`],rejectedValue:i}],errorCount:1,section:"body"})}sn(e,t,r.origin,n);let o=t.optionsSuccessStatus||204;e.response.status(o),t.preflightContinue||e.response.text("")}function Ne(e){return e.request.method==="OPTIONS"&&!!(e.request.header("access-control-request-method")||e.request.header("Access-Control-Request-Method"))}import{z as R}from"zod";var an=R.enum(["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS","CONNECT","TRACE"]),cn=R.union([R.array(an),R.string().transform(e=>e.split(",").map(t=>t.trim()))]).optional(),Lt=R.union([R.array(R.string()),R.string().transform(e=>e.split(",").map(t=>t.trim()))]).optional(),ln=R.custom(e=>typeof e=="function"&&e.length<=2,{message:"Origin validator must be a function accepting (origin, ctx?) parameters"}),Ot=R.union([R.string(),R.instanceof(RegExp),ln]),un=R.union([R.boolean(),Ot,R.array(Ot)]),_t=R.object({origin:un.optional(),methods:cn,allowedHeaders:Lt,exposedHeaders:Lt,credentials:R.boolean().optional(),maxAge:R.number().int().optional(),preflightContinue:R.boolean().optional(),optionsSuccessStatus:R.number().int().min(200).max(299).optional()}).strict(),At=R.union([R.boolean(),_t]).optional();function It(e){try{return typeof e=="boolean"?e===!1?{origin:!1}:{origin:!0}:_t.parse(e)}catch(t){if(t instanceof R.ZodError){let r=dn(t);throw new Error(`Invalid CORS options:
13
+ ${r}`)}throw new Error(`Invalid CORS options: ${String(t)}`)}}function dn(e){return e.errors.map(r=>` - ${r.path.join(".")||"root"}: ${r.message}`).join(`
14
+ `)}function pn(e){return Array.isArray(e)}function $t(e){if(e.credentials===!0&&e.origin!==void 0){if(e.origin===!0||e.origin==="*")throw new Error("CORS security violation: Cannot use wildcard origin (*) with credentials. When credentials are enabled, you must specify explicit origins.");if(pn(e.origin)&&e.origin.some(r=>r==="*"))throw new Error("CORS security violation: Cannot include wildcard origin (*) in array when credentials are enabled.")}}function Dt(e,t){return e===!0?{...t,origin:!0}:e===!1?{origin:!1}:e?{...t,...e,methods:e.methods??t.methods,allowedHeaders:e.allowedHeaders??t.allowedHeaders,exposedHeaders:e.exposedHeaders??t.exposedHeaders}:t}function fn(e,t,r,n){if(!(!n||!r)&&(t.origin===!0&&!t.credentials?e.response.header("Access-Control-Allow-Origin","*"):(e.response.header("Access-Control-Allow-Origin",r),e.response.header("Vary","Origin")),t.credentials&&e.response.header("Access-Control-Allow-Credentials","true"),t.exposedHeaders)){let o=typeof t.exposedHeaders=="string"?t.exposedHeaders:t.exposedHeaders.join(", ");e.response.header("Access-Control-Expose-Headers",o)}}function Te(e){let t=process.env.NODE_ENV==="development",r=zt(t),n=Dt(e,r),o=It(n);return $t(o),z({name:"cors",handler:async({ctx:i,next:s})=>{let a=i.request.header("origin")||i.request.header("Origin");if(Ne(i)){if(await Ft(i,o),!o.preflightContinue)return}else{if(!a){await s();return}let c=await re(a,o.origin||!1,i);if(!c)throw i.response.status(403),new te("CORS validation failed",{reason:"origin_not_allowed",origin:a,allowedOrigins:o.origin});fn(i,o,a,c)}await s()},debug:process.env.DEBUG?.includes("cors")})}var mn=["accept","content-type","user-agent","x-correlation-id"],gn=["authorization","cookie","x-api-key","proxy-authorization"];function hn(e,t){let r={},n=new Set(t.map(i=>i.toLowerCase())),o=new Set(gn.map(i=>i.toLowerCase()));for(let[i,s]of Object.entries(e)){let a=i.toLowerCase();n.has(a)&&(o.has(a)?r[i]="[REDACTED]":r[i]=s)}return r}function Nt(e){return z({name:"requestLogger",handler:async({ctx:t,next:r,logger:n})=>{let o=Date.now(),i;"socket"in t.request.raw&&(i=t.request.raw.socket?.remoteAddress);let s={timestamp:new Date().toISOString()};if(i&&(s.ip=i),e?.includeHeaders){let c=e.headerWhitelist||mn,l=t.request.headers(),u=hn(l,c);Object.keys(u).length>0&&(s.headers=u)}if(e?.includeQuery){let c=t.request.query;c&&Object.keys(c).length>0&&(s.query=c)}n.info("Request started",s);let a;try{await r()}catch(c){a=c}finally{let c=Date.now()-o;if(a){let l={duration:c,timestamp:new Date().toISOString()};a instanceof T?l.error={type:a.type,title:a.title,status:a.status,message:a.message,details:a.details,...a.status>=500&&a.stack?{stack:a.stack}:{}}:a instanceof Error?l.error={message:a.message,name:a.name,stack:a.stack}:l.error=String(a),n.error("Request failed",l)}else{let l=t.response.statusCode||200;n.info("Request completed",{statusCode:l,duration:c,timestamp:new Date().toISOString()})}if(a)throw a}}})}function He(e){if(!e.name||typeof e.name!="string")throw new Error("Plugin name must be a non-empty string");if(!e.version||typeof e.version!="string")throw new Error("Plugin version must be a non-empty string");if(typeof e.setup!="function")throw new Error("Plugin setup must be a function");return function(r){let n={...e.defaultConfig||{},...r||{}},o=M().child({plugin:e.name,version:e.version}),i=null,s=!1;return{name:e.name,version:e.version,register:async c=>{if(!s){if(i=e.setup({config:n,logger:o,eventBus:c.eventBus}),i===null||typeof i!="object")throw new Error(`Plugin "${e.name}" setup() must return an object with lifecycle hooks`);s=!0}i?.register?await i.register(c):o.debug("Plugin registered (no register hook)")},initialize:async c=>{if(!s)throw new Error(`Plugin "${e.name}" initialize() called before register(). Plugins must be registered to the server before initialization.`);i?.initialize&&await i.initialize(c)},onServerStart:async c=>{if(!s)throw new Error(`Plugin "${e.name}" onServerStart() called before register(). Plugins must be registered to the server before initialization.`);i?.onServerStart&&await i.onServerStart(c)},onServerStop:async c=>{s&&i?.onServerStop&&await i.onServerStop(c)},terminate:async c=>{s&&i?.terminate&&await i.terminate(c)}}}}import{fileURLToPath as zn}from"node:url";var Ee={};function Ht(e){Ee={...Ee,...e}}function qt(){if(!Ee.routesDir)throw new Error("Routes directory not configured. Make sure server is properly initialized.");return Ee.routesDir}import*as Ut from"node:path";function be(e,t){e.startsWith("file://")&&(e=e.replace("file://","")),t.startsWith("file://")&&(t=t.replace("file://",""));let r=e.replace(/\\/g,"/"),n=t.replace(/\\/g,"/"),o=n.endsWith("/")?n:`${n}/`,i=r;r.startsWith(o)?i=r.substring(o.length):r.startsWith(n)?(i=r.substring(n.length),i.startsWith("/")&&(i=i.substring(1))):i=Ut.relative(n,r).replace(/\\/g,"/"),i=i.replace(/\.[^.]+$/,"");let s=i.split("/").filter(Boolean),a=[],c=s.map(u=>{if(u.startsWith("[")&&u.endsWith("]")){let m=u.slice(1,-1);return a.push(m),`:${m}`}return u}),l=c.length>0?`/${c.join("/")}`:"/";return l.endsWith("/index")&&(l=l.slice(0,-6)||"/"),{filePath:e,routePath:l,params:a}}import{EventEmitter as En}from"node:events";import{z as B}from"zod";var yn=B.enum(["drop-oldest","drop-newest","close"]),Sn=B.object({low:B.number().int().positive().describe("Resume threshold in messages"),high:B.number().int().positive().describe("Trigger threshold in messages")}).refine(e=>e.low<e.high,{message:"Low watermark must be less than high watermark",path:["low"]}),vn=B.object({maxMessages:B.number().int().positive().max(1e5).describe("Maximum number of messages in buffer"),maxBytes:B.number().int().positive().max(100*1024*1024).optional().describe("Maximum buffer size in bytes"),messageTimeout:B.number().int().nonnegative().max(3e5).optional().describe("Message TTL in milliseconds")}),jt=B.object({enabled:B.boolean().default(!0).describe("Enable backpressure management"),strategy:yn.default("drop-oldest").describe("Strategy when buffer reaches high watermark"),watermarks:Sn.default({low:100,high:1e3}).describe("Buffer watermark thresholds"),limits:vn.default({maxMessages:1e4}).describe("Buffer size constraints"),metrics:B.object({enabled:B.boolean().default(!1),interval:B.number().int().positive().default(5e3)}).optional().describe("Metrics collection configuration")}).refine(e=>e.watermarks.high<=e.limits.maxMessages,{message:"High watermark cannot exceed maxMessages limit",path:["watermarks","high"]});var wn={maxConnections:1e4,maxConnectionsPerClient:100,inactiveTimeout:18e5,cleanupInterval:6e4};function Tn(e){let t={...wn,...e},r=new Map,n=new Map,o=null,i={},s=p=>{!o&&t.cleanupInterval>0&&(o=setInterval(()=>{p()},t.cleanupInterval),o.unref&&o.unref())},a=()=>{o&&(clearInterval(o),o=null)},c=(p,g)=>{if(!p)return;let S=(n.get(p)||0)+g;S<=0?n.delete(p):n.set(p,S)},l=(p,g,f)=>{if(r.has(p))throw new Error(`Connection with ID ${p} already exists`);if(r.size>=t.maxConnections)throw new Error(`Maximum connection limit reached (${t.maxConnections})`);if(f?.clientIp&&(n.get(f.clientIp)||0)>=t.maxConnectionsPerClient)throw new Error(`Maximum connections per client reached (${t.maxConnectionsPerClient})`);let S=Date.now();r.set(p,{stream:g,connectedAt:S,lastActivity:S,clientIp:f?.clientIp,userAgent:f?.userAgent}),c(f?.clientIp,1),r.size===1&&s(i.cleanup),g.onClose(()=>{u(p)})},u=p=>{let g=r.get(p);g&&(r.delete(p),c(g.clientIp,-1),r.size===0&&a())},m=()=>r.size,v=()=>{let p=Date.now(),g=[];r.forEach((f,S)=>{let w=p-f.lastActivity>t.inactiveTimeout,O=!f.stream||f.stream.state==="closed"||!f.stream.isWritable;if((w||O)&&(g.push(S),f.stream&&typeof f.stream.close=="function"))try{f.stream.close()}catch{}}),g.forEach(f=>u(f))},E=p=>r.get(p)?.stream,C=p=>r.has(p),k=()=>Array.from(r.keys()),d=()=>{a(),r.forEach(p=>{if(p.stream&&typeof p.stream.close=="function")try{p.stream.close()}catch{}}),r.clear(),n.clear()};return i.add=l,i.remove=u,i.count=m,i.cleanup=v,i.get=E,i.has=C,i.getIds=k,i.shutdown=d,i}var qe=null;function xe(e){return qe||(qe=Tn(e)),qe}var ne=class extends T{constructor(t,r,n=void 0){super("SSE_BUFFER_OVERFLOW",t,503,n??y(),r)}};var Re=class extends T{constructor(t,r=void 0,n=void 0){super("SSE_STREAM_CLOSED",t,410,n??y(),r)}};var bn={heartbeatInterval:3e4,maxEventSize:1024*1024,autoClose:!0,maxBufferSize:1e3,bufferStrategy:"drop-oldest"};function Vt(e,t,r,n){let o=[];r&&o.push(`id: ${r}`),n!==void 0&&o.push(`retry: ${n}`),o.push(`event: ${e}`);let s=(t===null?"null":t===void 0?"undefined":typeof t=="string"?t:JSON.stringify(t)).split(`
15
15
  `);for(let u of s)o.push(`data: ${u}`);o.push("");let a=o.join(`
16
16
  `)+`
17
17
  `,c=4096,l=Buffer.byteLength(a,"utf8");if(l<c){let u=c-l;a+=`: ${"\xB7".repeat(u)}
18
- `}return a}function bn(){let e=Date.now().toString(36),t=Math.random().toString(36).substr(2,9);return`${e}-${t}`}function xn(e,t){let r=t===null?"null":t===void 0?"undefined":typeof t=="string"?t:JSON.stringify(t);return e.length+r.length+50}function Rn(e,t,r,n){let o=0;switch(t){case"drop-oldest":{for(;e.length>=n&&e.length>0;)e.shift(),o++;e.push(r);break}case"drop-newest":{e.length>=n?o=1:e.push(r);break}case"close":break;default:for(;e.length>=n&&e.length>0;)e.shift(),o++;e.push(r)}return{buffer:e,dropped:o}}var He=class{id;_state="connecting";_buffer=[];_closeCallbacks=[];_errorCallbacks=[];_emitter=new Tn;_metrics;_options;_response;_request;_writable=!0;_cleanupExecuted=!1;_eventCounter=0;_lastEventId=null;_heartbeatTimer;_backpressureConfig;_disconnectHandlers=null;constructor(t,r={}){if(this.id=`sse-${bn()}`,this._options={...En,...r},this._response=t.response,this._request=t.request,r.backpressure){let o=qt.safeParse(r.backpressure);o.success&&(this._backpressureConfig=o.data,this._options.maxBufferSize=o.data.limits.maxMessages,this._options.bufferStrategy=o.data.strategy)}let n=t.request.header("last-event-id");n&&(this._eventCounter=parseInt(n)||0,this._lastEventId=n),this._metrics={eventsSent:0,eventsDropped:0,bytesWritten:0,bufferHighWatermark:0,lastEventTime:Date.now()};try{let o=Ee(),i={clientIp:this._request.header("x-forwarded-for")||this._request.header("x-real-ip")||this._request.raw.socket?.remoteAddress,userAgent:this._request.header("user-agent")};o.add(this.id,this,i)}catch(o){throw this._state="closed",this._writable=!1,console.error("[SSE] Failed to register connection:",o),o}this._setupDisconnectHandling(),this._response.status(200).header("Content-Type","text/event-stream").header("Cache-Control","no-cache").header("X-Accel-Buffering","no"),(!this._request.raw.httpVersionMajor||this._request.raw.httpVersionMajor<2)&&this._response.header("Connection","keep-alive"),this._options.heartbeatInterval&&this._options.heartbeatInterval>0&&this._setupHeartbeat(this._options.heartbeatInterval),this._state="connected",this._writeRaw(`: SSE connection established
18
+ `}return a}function xn(){let e=Date.now().toString(36),t=Math.random().toString(36).substr(2,9);return`${e}-${t}`}function Rn(e,t){let r=t===null?"null":t===void 0?"undefined":typeof t=="string"?t:JSON.stringify(t);return e.length+r.length+50}function Cn(e,t,r,n){let o=0;switch(t){case"drop-oldest":{for(;e.length>=n&&e.length>0;)e.shift(),o++;e.push(r);break}case"drop-newest":{e.length>=n?o=1:e.push(r);break}case"close":break;default:for(;e.length>=n&&e.length>0;)e.shift(),o++;e.push(r)}return{buffer:e,dropped:o}}var Ue=class{id;_state="connecting";_buffer=[];_closeCallbacks=[];_errorCallbacks=[];_emitter=new En;_metrics;_options;_response;_request;_writable=!0;_cleanupExecuted=!1;_eventCounter=0;_lastEventId=null;_heartbeatTimer;_backpressureConfig;_disconnectHandlers=null;constructor(t,r={}){if(this.id=`sse-${xn()}`,this._options={...bn,...r},this._response=t.response,this._request=t.request,r.backpressure){let o=jt.safeParse(r.backpressure);o.success&&(this._backpressureConfig=o.data,this._options.maxBufferSize=o.data.limits.maxMessages,this._options.bufferStrategy=o.data.strategy)}let n=t.request.header("last-event-id");n&&(this._eventCounter=parseInt(n)||0,this._lastEventId=n),this._metrics={eventsSent:0,eventsDropped:0,bytesWritten:0,bufferHighWatermark:0,lastEventTime:Date.now()};try{let o=xe(),i={clientIp:this._request.header("x-forwarded-for")||this._request.header("x-real-ip")||this._request.raw.socket?.remoteAddress,userAgent:this._request.header("user-agent")};o.add(this.id,this,i)}catch(o){throw this._state="closed",this._writable=!1,console.error("[SSE] Failed to register connection:",o),o}this._setupDisconnectHandling(),this._response.status(200).header("Content-Type","text/event-stream").header("Cache-Control","no-cache").header("X-Accel-Buffering","no"),(!this._request.raw.httpVersionMajor||this._request.raw.httpVersionMajor<2)&&this._response.header("Connection","keep-alive"),this._options.heartbeatInterval&&this._options.heartbeatInterval>0&&this._setupHeartbeat(this._options.heartbeatInterval),this._state="connected",this._writeRaw(`: SSE connection established
19
19
 
20
- `)}_registerConnection(){try{let t=Ee(),r={clientIp:this._request.header("x-forwarded-for")||this._request.header("x-real-ip")||this._request.raw.socket?.remoteAddress,userAgent:this._request.header("user-agent")};t.add(this.id,this,r)}catch(t){throw this._state="closed",this._writable=!1,t}}_setupHeartbeat(t){this._heartbeatTimer=global.setInterval(()=>{this.isWritable&&Date.now()-this._metrics.lastEventTime>t*.9&&this.ping(`heartbeat ${new Date().toISOString()}`)},t),this._heartbeatTimer.unref&&this._heartbeatTimer.unref()}_setupDisconnectHandling(){let t=this._request.raw,r=this._response.raw,n=()=>{this._options.autoClose&&this._state!=="closed"&&this.close()};this._disconnectHandlers={req:{close:n,error:n},res:{close:n,error:n}},t.on("close",this._disconnectHandlers.req.close),t.on("error",this._disconnectHandlers.req.error),r.on("close",this._disconnectHandlers.res.close),r.on("error",this._disconnectHandlers.res.error)}_writeRaw(t){if(!this._writable||this._state==="closed")return!1;try{let r=this._response.raw,n;if("write"in r&&typeof r.write=="function")n=r.write(t);else throw new Error("Response stream does not support write operation");return n&&(this._metrics.bytesWritten+=Buffer.byteLength(t)),n}catch(r){return this._writable=!1,this._handleError(r),!1}}async _flushBuffer(){for(;this._buffer.length>0&&this._writable;){let t=this._buffer.shift();if(!t)break;let r=Ut(t.event,t.data,t.id);this._writeRaw(r)?(this._metrics.eventsSent++,this._metrics.lastEventTime=Date.now()):(this._buffer.unshift(t),await this._waitForDrain())}}_waitForDrain(){return new Promise(t=>{this._response.raw.once("drain",t)})}_handleError(t){this._errorCallbacks.forEach(r=>{try{r(t)}catch(n){console.error("Error in error callback:",n)}}),this._writable&&this.sendError(t)}_executeCleanup(){if(this._cleanupExecuted)return;if(this._cleanupExecuted=!0,this._heartbeatTimer&&(global.clearInterval(this._heartbeatTimer),this._heartbeatTimer=void 0),this._disconnectHandlers){let r=this._request.raw,n=this._response.raw;r.removeListener("close",this._disconnectHandlers.req.close),r.removeListener("error",this._disconnectHandlers.req.error),n.removeListener("close",this._disconnectHandlers.res.close),n.removeListener("error",this._disconnectHandlers.res.error),this._disconnectHandlers=null}try{Ee().remove(this.id)}catch(r){console.error("Registry cleanup error:",r)}let t=[...this._closeCallbacks];for(let r of t)try{let n=r();n&&typeof n.then=="function"&&n.catch(o=>{console.error("Error in async close callback:",o)})}catch(n){console.error("Error in close callback:",n)}this._closeCallbacks=[],this._errorCallbacks=[],this._buffer=[],this._emitter.removeAllListeners()}get state(){return this._state}get bufferSize(){return this._buffer.length}get isWritable(){return this._writable&&this._state==="connected"}send(t,r){if(!this.isWritable)throw new be("Cannot send event to closed stream",{clientId:this.id,closedAt:new Date().toISOString(),closeReason:"server-close",canReconnect:!1});let n=String(++this._eventCounter);this._lastEventId=n;let o=w(),i=xn(t,r),s=this._options.maxEventSize;if(i>s)throw new te("Event size exceeds maximum allowed",{currentSize:i,maxSize:s,strategy:"close",clientId:this.id,eventsDropped:0,triggeringEvent:t});let a={id:n,event:t,data:r,size:i,timestamp:Date.now(),correlationId:o},c=this._backpressureConfig?this._backpressureConfig.watermarks.high:this._options.maxBufferSize;if(this._buffer.length>=c){if(this._options.bufferStrategy==="close"){let u=this._buffer.length;throw this.close(),new te("Buffer overflow - stream closed",{currentSize:u,maxSize:c,strategy:"close",clientId:this.id})}let l=Rn(this._buffer,this._options.bufferStrategy,a,c);this._buffer=l.buffer,this._metrics.eventsDropped+=l.dropped,l.dropped>0&&console.warn(`SSE stream ${this.id}: Dropped ${l.dropped} events due to buffer overflow`)}else this._buffer.push(a);this._metrics.bufferHighWatermark=Math.max(this._metrics.bufferHighWatermark,this._buffer.length),this._emitter.emit("event"),this._flushBuffer().catch(l=>{this._handleError(l)})}sendError(t){if(!this.isWritable)return;let r={message:t.message,name:t.name,correlationId:w(),timestamp:new Date().toISOString(),stack:process.env.NODE_ENV==="development"?t.stack:void 0};try{this.send("error",r)}catch(n){console.error("Failed to send error event:",n)}}close(){if(this._state!=="closed"){this._state="closed",this._writable=!1,this._emitter.emit("close");try{let t=Ut("close",{reason:"stream-closed",reconnect:!1}),r=this._response.raw;"write"in r&&typeof r.write=="function"&&r.write(t)}catch{}try{let t=this._response.raw;!t.writableEnded&&typeof t.end=="function"&&t.end()}catch(t){console.error("Error ending response:",t)}this._executeCleanup()}}onClose(t){if(this._state==="closed")try{let r=t();r&&typeof r.then=="function"&&r.catch(n=>{console.error("Error in close callback:",n)})}catch(r){console.error("Error in close callback:",r)}else this._closeCallbacks.push(t)}ping(t){if(!this.isWritable)return;let r=t?`: ${t}
20
+ `)}_registerConnection(){try{let t=xe(),r={clientIp:this._request.header("x-forwarded-for")||this._request.header("x-real-ip")||this._request.raw.socket?.remoteAddress,userAgent:this._request.header("user-agent")};t.add(this.id,this,r)}catch(t){throw this._state="closed",this._writable=!1,t}}_setupHeartbeat(t){this._heartbeatTimer=global.setInterval(()=>{this.isWritable&&Date.now()-this._metrics.lastEventTime>t*.9&&this.ping(`heartbeat ${new Date().toISOString()}`)},t),this._heartbeatTimer.unref&&this._heartbeatTimer.unref()}_setupDisconnectHandling(){let t=this._request.raw,r=this._response.raw,n=()=>{this._options.autoClose&&this._state!=="closed"&&this.close()};this._disconnectHandlers={req:{close:n,error:n},res:{close:n,error:n}},t.on("close",this._disconnectHandlers.req.close),t.on("error",this._disconnectHandlers.req.error),r.on("close",this._disconnectHandlers.res.close),r.on("error",this._disconnectHandlers.res.error)}_writeRaw(t){if(!this._writable||this._state==="closed")return!1;try{let r=this._response.raw,n;if("write"in r&&typeof r.write=="function")n=r.write(t);else throw new Error("Response stream does not support write operation");return n&&(this._metrics.bytesWritten+=Buffer.byteLength(t)),n}catch(r){return this._writable=!1,this._handleError(r),!1}}async _flushBuffer(){for(;this._buffer.length>0&&this._writable;){let t=this._buffer.shift();if(!t)break;let r=Vt(t.event,t.data,t.id);this._writeRaw(r)?(this._metrics.eventsSent++,this._metrics.lastEventTime=Date.now()):(this._buffer.unshift(t),await this._waitForDrain())}}_waitForDrain(){return new Promise(t=>{this._response.raw.once("drain",t)})}_handleError(t){this._errorCallbacks.forEach(r=>{try{r(t)}catch(n){console.error("Error in error callback:",n)}}),this._writable&&this.sendError(t)}_executeCleanup(){if(this._cleanupExecuted)return;if(this._cleanupExecuted=!0,this._heartbeatTimer&&(global.clearInterval(this._heartbeatTimer),this._heartbeatTimer=void 0),this._disconnectHandlers){let r=this._request.raw,n=this._response.raw;r.removeListener("close",this._disconnectHandlers.req.close),r.removeListener("error",this._disconnectHandlers.req.error),n.removeListener("close",this._disconnectHandlers.res.close),n.removeListener("error",this._disconnectHandlers.res.error),this._disconnectHandlers=null}try{xe().remove(this.id)}catch(r){console.error("Registry cleanup error:",r)}let t=[...this._closeCallbacks];for(let r of t)try{let n=r();n&&typeof n.then=="function"&&n.catch(o=>{console.error("Error in async close callback:",o)})}catch(n){console.error("Error in close callback:",n)}this._closeCallbacks=[],this._errorCallbacks=[],this._buffer=[],this._emitter.removeAllListeners()}get state(){return this._state}get bufferSize(){return this._buffer.length}get isWritable(){return this._writable&&this._state==="connected"}send(t,r){if(!this.isWritable)throw new Re("Cannot send event to closed stream",{clientId:this.id,closedAt:new Date().toISOString(),closeReason:"server-close",canReconnect:!1});let n=String(++this._eventCounter);this._lastEventId=n;let o=y(),i=Rn(t,r),s=this._options.maxEventSize;if(i>s)throw new ne("Event size exceeds maximum allowed",{currentSize:i,maxSize:s,strategy:"close",clientId:this.id,eventsDropped:0,triggeringEvent:t});let a={id:n,event:t,data:r,size:i,timestamp:Date.now(),correlationId:o},c=this._backpressureConfig?this._backpressureConfig.watermarks.high:this._options.maxBufferSize;if(this._buffer.length>=c){if(this._options.bufferStrategy==="close"){let u=this._buffer.length;throw this.close(),new ne("Buffer overflow - stream closed",{currentSize:u,maxSize:c,strategy:"close",clientId:this.id})}let l=Cn(this._buffer,this._options.bufferStrategy,a,c);this._buffer=l.buffer,this._metrics.eventsDropped+=l.dropped,l.dropped>0&&console.warn(`SSE stream ${this.id}: Dropped ${l.dropped} events due to buffer overflow`)}else this._buffer.push(a);this._metrics.bufferHighWatermark=Math.max(this._metrics.bufferHighWatermark,this._buffer.length),this._emitter.emit("event"),this._flushBuffer().catch(l=>{this._handleError(l)})}sendError(t){if(!this.isWritable)return;let r={message:t.message,name:t.name,correlationId:y(),timestamp:new Date().toISOString(),stack:process.env.NODE_ENV==="development"?t.stack:void 0};try{this.send("error",r)}catch(n){console.error("Failed to send error event:",n)}}close(){if(this._state!=="closed"){this._state="closed",this._writable=!1,this._emitter.emit("close");try{let t=Vt("close",{reason:"stream-closed",reconnect:!1}),r=this._response.raw;"write"in r&&typeof r.write=="function"&&r.write(t)}catch{}try{let t=this._response.raw;!t.writableEnded&&typeof t.end=="function"&&t.end()}catch(t){console.error("Error ending response:",t)}this._executeCleanup()}}onClose(t){if(this._state==="closed")try{let r=t();r&&typeof r.then=="function"&&r.catch(n=>{console.error("Error in close callback:",n)})}catch(r){console.error("Error in close callback:",r)}else this._closeCallbacks.push(t)}ping(t){if(!this.isWritable)return;let r=t?`: ${t}
21
21
 
22
22
  `:`: ping
23
23
 
24
24
  `;this._writeRaw(r)}setRetry(t){if(this.isWritable){if(t<0||!Number.isFinite(t))throw new Error("Retry interval must be a positive number");this._writeRaw(`retry: ${Math.floor(t)}
25
25
 
26
- `)}}flush(){this.isWritable&&this._flushBuffer().catch(t=>{this._handleError(t)})}getMetrics(){return{...this._metrics}}async*[Symbol.asyncIterator](){for(;this.isWritable;){for(;this._buffer.length>0;){let t=this._buffer.shift();t&&(yield t)}await new Promise(t=>{let r=()=>{(this._buffer.length>0||!this.isWritable)&&(this._emitter.off("event",r),this._emitter.off("close",r),t())};this._emitter.on("event",r),this._emitter.on("close",r)})}}};function jt(e,t){return new He(e,t)}var xe=class extends T{constructor(t,r,n){super("SSE_NOT_ACCEPTABLE",t,406,n||w(),r)}};function Cn(e){if(!e.handler||typeof e.handler!="function")throw new Error("SSE route handler must be a function");if(e.middleware&&!Array.isArray(e.middleware))throw new Error("Middleware for SSE route must be an array");if(e.schema){let{params:t,query:r,events:n}=e.schema;if(t&&(!t._def||typeof t.parse!="function"))throw new Error("Params schema for SSE must be a valid Zod schema");if(r&&(!r._def||typeof r.parse!="function"))throw new Error("Query schema for SSE must be a valid Zod schema");if(n){if(typeof n=="object"&&!n._def){for(let[o,i]of Object.entries(n))if(!i||typeof i!="object"||!i._def||typeof i.parse!="function")throw new Error(`Event schema for '${o}' must be a valid Zod schema`)}else if(!(n._def&&typeof n.parse=="function"))throw new Error("Events schema for SSE must be a valid Zod schema or event map")}}}function Pn(e,t){let r=Object.create(e),n=e.send.bind(e);return r.send=function(o,i){let s=t[o];if(s)try{let a=s.parse(i);n(o,a)}catch(a){e.sendError(new Error(`Event '${o}' validation failed: ${a instanceof Error?a.message:String(a)}`))}else n(o,i)},r}var Vt=()=>e=>{Cn(e);let t=A();return{GET:{handler:async({ctx:n,params:o,logger:i,eventBus:s})=>{let a=n.request.header("accept");if(a&&!a.includes("text/event-stream")&&!a.includes("*/*"))throw new xe("This endpoint requires Server-Sent Events support",{acceptHeader:a,requiredHeader:"text/event-stream",endpoint:n.request.path});if(e.schema)try{e.schema.params&&(o=e.schema.params.parse(o)),e.schema.query&&(n.request.query=e.schema.query.parse(n.request.query))}catch(p){throw i.error("[SSE] Validation error:",{error:p}),p}let c=jt(n,e.options),l=i.child({streamId:c.id,streamState:"connected",eventStream:!0}),u=e.schema?.events&&typeof e.schema.events=="object"&&!e.schema.events._def?Pn(c,e.schema.events):c;n.request.raw.on("close",()=>u.close());try{await e.handler({stream:u,ctx:n,params:o,logger:l,eventBus:s})}catch(p){throw l.error("[SSE] Handler error - THIS IS THE REAL ERROR:",{error:p}),l.error("[SSE] Stack trace:",{stack:p instanceof Error?p.stack:"No stack"}),u.isWritable&&u.sendError(p instanceof Error?p:new Error(String(p))),u.close(),p}},schema:e.schema?.params||e.schema?.query?{params:e.schema?.params,query:e.schema?.query}:void 0,middleware:e.middleware,options:e.options},SSE:{schema:{params:e.schema?.params,query:e.schema?.query,events:e.schema?.events}},path:t}};function zn(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(o,i)=>i;let r=new Error().stack[3];if(!r||typeof r.getFileName!="function")throw new Error("Unable to determine caller file frame");let n=r.getFileName();if(!n)throw new Error("Unable to determine caller file name");return n.startsWith("file://")?Mn(n):n}finally{Error.prepareStackTrace=e}}function A(){let e=zn(),t=Nt(),r=Te(e,t);return console.log(`\u{1F50E} Parsed route path: ${r.routePath} from file: ${e}`),r.routePath}var qe=()=>e=>{U("GET",e);let t=A();return{GET:e,path:t}},Ue=()=>e=>{U("POST",e);let t=A();return{POST:e,path:t}},je=()=>e=>{U("PUT",e);let t=A();return{PUT:e,path:t}},Ve=()=>e=>{U("DELETE",e);let t=A();return{DELETE:e,path:t}},We=()=>e=>{U("PATCH",e);let t=A();return{PATCH:e,path:t}},Qe=()=>e=>{U("HEAD",e);let t=A();return{HEAD:e,path:t}},Ze=()=>e=>{U("OPTIONS",e);let t=A();return{OPTIONS:e,path:t}};function U(e,t){if(!t.handler||typeof t.handler!="function")throw new Error(`Handler for method ${e} must be a function`);if(t.middleware&&!Array.isArray(t.middleware))throw new Error(`Middleware for method ${e} must be an array`);switch(t.schema&&kn(e,t.schema),e){case"GET":case"HEAD":case"DELETE":t.schema?.body&&console.warn(`Warning: ${e} requests typically don't have request bodies`);break}}function kn(e,t){let{params:r,query:n,body:o,response:i}=t;if(r&&(!r._def||typeof r.parse!="function"))throw new Error(`Params schema for ${e} must be a valid Zod schema`);if(n&&(!n._def||typeof n.parse!="function"))throw new Error(`Query schema for ${e} must be a valid Zod schema`);if(o&&(!o._def||typeof o.parse!="function"))throw new Error(`Body schema for ${e} must be a valid Zod schema`);if(i&&(!i._def||typeof i.parse!="function"))throw new Error(`Response schema for ${e} must be a valid Zod schema`)}function Wt(){return{get:qe(),post:Ue(),put:je(),delete:Ve(),patch:We(),head:Qe(),options:Ze(),sse:Vt()}}function Z(e,t,r){let n=t.exec(e);if(!n)return{};let o={};for(let i=0;i<r.length;i++)o[r[i]]=n[i+1]||"";return o}function re(e){let t=[];if(e==="/")return{pattern:/^\/$/,paramNames:[]};let r=e.replace(/([.+*?^$(){}|\\])/g,"\\$1");return r=r.replace(/\/:([^/]+)/g,(o,i)=>(t.push(i),"/([^/]+)")).replace(/\/\[([^\]]+)\]/g,(o,i)=>(t.push(i),"/([^/]+)")),r=`${r}(?:/)?`,{pattern:new RegExp(`^${r}$`),paramNames:t}}function Re(e){let t=[];for(let[r,n]of Object.entries(e))if(n!=null){let o=encodeURIComponent(r),i=encodeURIComponent(String(n));t.push(`${o}=${i}`)}return t.length>0?`?${t.join("&")}`:""}function Ge(e,t={},r={}){let n={},o={...r},i=[];e.replace(/\/:([^/]+)/g,(c,l)=>(i.push(l),"/"));for(let[c,l]of Object.entries(t))i.includes(c)?n[c]=l:o[c]=l;let s=e;for(let[c,l]of Object.entries(n))s=s.replace(`:${c}`,encodeURIComponent(String(l)));let a=Re(o);return s+a}function ne(){let e=[];return{add(t,r,n){let{pattern:o,paramNames:i}=re(t),s={path:t,method:r,pattern:o,paramNames:i,routeOptions:n},a=e.findIndex(c=>i.length<c.paramNames.length);a===-1?e.push(s):e.splice(a,0,s)},remove(t){for(let r=e.length-1;r>=0;r--)e[r].path===t&&e.splice(r,1)},clear(){e.length=0},match(t,r){let n=t.split("?")[0];if(!n)return null;for(let i of e){if(i.method!==r)continue;if(i.pattern.exec(n)){let a=Z(t,i.pattern,i.paramNames);return{route:i.routeOptions,params:a}}}return e.find(i=>i.method!==r&&i.pattern.test(t))?{route:null,params:{},methodNotAllowed:!0,allowedMethods:e.filter(i=>i.pattern.test(t)).map(i=>i.method)}:null},getRoutes(){return e.map(t=>({path:t.path,method:t.method}))},findRoutes(t){return e.filter(r=>r.pattern.test(t)).map(r=>({path:r.path,method:r.method,params:Z(t,r.pattern,r.paramNames)}))}}}import{AsyncLocalStorage as ii}from"node:async_hooks";import{randomUUID as si}from"node:crypto";import ai from"node:events";import*as Ke from"node:fs";import*as pr from"node:http";import*as fr from"node:http2";import*as _ from"node:fs";import*as Ce from"node:path";import*as Qt from"selfsigned";async function Zt(){let e=Ce.join(process.cwd(),".blaizejs","certs"),t=Ce.join(e,"dev.key"),r=Ce.join(e,"dev.cert");if(_.existsSync(t)&&_.existsSync(r))return{keyFile:t,certFile:r};_.existsSync(e)||_.mkdirSync(e,{recursive:!0});let i=Qt.generate([{name:"commonName",value:"localhost"}],{days:365,algorithm:"sha256",keySize:2048,extensions:[{name:"basicConstraints",cA:!0},{name:"keyUsage",keyCertSign:!0,digitalSignature:!0,nonRepudiation:!0,keyEncipherment:!0,dataEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:7,ip:"127.0.0.1"}]}]});return _.writeFileSync(t,Buffer.from(i.private,"utf-8")),_.writeFileSync(r,Buffer.from(i.cert,"utf-8")),console.log(`
26
+ `)}}flush(){this.isWritable&&this._flushBuffer().catch(t=>{this._handleError(t)})}getMetrics(){return{...this._metrics}}async*[Symbol.asyncIterator](){for(;this.isWritable;){for(;this._buffer.length>0;){let t=this._buffer.shift();t&&(yield t)}await new Promise(t=>{let r=()=>{(this._buffer.length>0||!this.isWritable)&&(this._emitter.off("event",r),this._emitter.off("close",r),t())};this._emitter.on("event",r),this._emitter.on("close",r)})}}};function Wt(e,t){return new Ue(e,t)}var Ce=class extends T{constructor(t,r,n){super("SSE_NOT_ACCEPTABLE",t,406,n||y(),r)}};function Pn(e){if(!e.handler||typeof e.handler!="function")throw new Error("SSE route handler must be a function");if(e.middleware&&!Array.isArray(e.middleware))throw new Error("Middleware for SSE route must be an array");if(e.schema){let{params:t,query:r,events:n}=e.schema;if(t&&(!t._def||typeof t.parse!="function"))throw new Error("Params schema for SSE must be a valid Zod schema");if(r&&(!r._def||typeof r.parse!="function"))throw new Error("Query schema for SSE must be a valid Zod schema");if(n){if(typeof n=="object"&&!n._def){for(let[o,i]of Object.entries(n))if(!i||typeof i!="object"||!i._def||typeof i.parse!="function")throw new Error(`Event schema for '${o}' must be a valid Zod schema`)}else if(!(n._def&&typeof n.parse=="function"))throw new Error("Events schema for SSE must be a valid Zod schema or event map")}}}function Mn(e,t){let r=Object.create(e),n=e.send.bind(e);return r.send=function(o,i){let s=t[o];if(s)try{let a=s.parse(i);n(o,a)}catch(a){e.sendError(new Error(`Event '${o}' validation failed: ${a instanceof Error?a.message:String(a)}`))}else n(o,i)},r}var Qt=()=>e=>{Pn(e);let t=A();return{GET:{handler:async({ctx:n,params:o,logger:i,eventBus:s})=>{let a=n.request.header("accept");if(a&&!a.includes("text/event-stream")&&!a.includes("*/*"))throw new Ce("This endpoint requires Server-Sent Events support",{acceptHeader:a,requiredHeader:"text/event-stream",endpoint:n.request.path});if(e.schema)try{e.schema.params&&(o=e.schema.params.parse(o)),e.schema.query&&(n.request.query=e.schema.query.parse(n.request.query))}catch(m){throw i.error("[SSE] Validation error:",{error:m}),m}let c=Wt(n,e.options),l=i.child({streamId:c.id,streamState:"connected",eventStream:!0}),u=e.schema?.events&&typeof e.schema.events=="object"&&!e.schema.events._def?Mn(c,e.schema.events):c;n.request.raw.on("close",()=>u.close());try{await e.handler({stream:u,ctx:n,params:o,logger:l,eventBus:s})}catch(m){throw l.error("[SSE] Handler error - THIS IS THE REAL ERROR:",{error:m}),l.error("[SSE] Stack trace:",{stack:m instanceof Error?m.stack:"No stack"}),u.isWritable&&u.sendError(m instanceof Error?m:new Error(String(m))),u.close(),m}},schema:e.schema?.params||e.schema?.query?{params:e.schema?.params,query:e.schema?.query}:void 0,middleware:e.middleware,options:e.options},SSE:{schema:{params:e.schema?.params,query:e.schema?.query,events:e.schema?.events}},path:t}};function kn(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(o,i)=>i;let r=new Error().stack[3];if(!r||typeof r.getFileName!="function")throw new Error("Unable to determine caller file frame");let n=r.getFileName();if(!n)throw new Error("Unable to determine caller file name");return n.startsWith("file://")?zn(n):n}finally{Error.prepareStackTrace=e}}function A(){let e=kn(),t=qt(),r=be(e,t);return console.log(`\u{1F50E} Parsed route path: ${r.routePath} from file: ${e}`),r.routePath}var je=()=>e=>{V("GET",e);let t=A();return{GET:e,path:t}},Ve=()=>e=>{V("POST",e);let t=A();return{POST:e,path:t}},We=()=>e=>{V("PUT",e);let t=A();return{PUT:e,path:t}},Qe=()=>e=>{V("DELETE",e);let t=A();return{DELETE:e,path:t}},Ze=()=>e=>{V("PATCH",e);let t=A();return{PATCH:e,path:t}},Ge=()=>e=>{V("HEAD",e);let t=A();return{HEAD:e,path:t}},Je=()=>e=>{V("OPTIONS",e);let t=A();return{OPTIONS:e,path:t}};function V(e,t){if(!t.handler||typeof t.handler!="function")throw new Error(`Handler for method ${e} must be a function`);if(t.middleware&&!Array.isArray(t.middleware))throw new Error(`Middleware for method ${e} must be an array`);switch(t.schema&&Bn(e,t.schema),e){case"GET":case"HEAD":case"DELETE":t.schema?.body&&console.warn(`Warning: ${e} requests typically don't have request bodies`);break}}function Bn(e,t){let{params:r,query:n,body:o,response:i}=t;if(r&&(!r._def||typeof r.parse!="function"))throw new Error(`Params schema for ${e} must be a valid Zod schema`);if(n&&(!n._def||typeof n.parse!="function"))throw new Error(`Query schema for ${e} must be a valid Zod schema`);if(o&&(!o._def||typeof o.parse!="function"))throw new Error(`Body schema for ${e} must be a valid Zod schema`);if(i&&(!i._def||typeof i.parse!="function"))throw new Error(`Response schema for ${e} must be a valid Zod schema`)}function Zt(){return{get:je(),post:Ve(),put:We(),delete:Qe(),patch:Ze(),head:Ge(),options:Je(),sse:Qt()}}function J(e,t,r){let n=t.exec(e);if(!n)return{};let o={};for(let i=0;i<r.length;i++)o[r[i]]=n[i+1]||"";return o}function oe(e){let t=[];if(e==="/")return{pattern:/^\/$/,paramNames:[]};let r=e.replace(/([.+*?^$(){}|\\])/g,"\\$1");return r=r.replace(/\/:([^/]+)/g,(o,i)=>(t.push(i),"/([^/]+)")).replace(/\/\[([^\]]+)\]/g,(o,i)=>(t.push(i),"/([^/]+)")),r=`${r}(?:/)?`,{pattern:new RegExp(`^${r}$`),paramNames:t}}function Pe(e){let t=[];for(let[r,n]of Object.entries(e))if(n!=null){let o=encodeURIComponent(r),i=encodeURIComponent(String(n));t.push(`${o}=${i}`)}return t.length>0?`?${t.join("&")}`:""}function Ke(e,t={},r={}){let n={},o={...r},i=[];e.replace(/\/:([^/]+)/g,(c,l)=>(i.push(l),"/"));for(let[c,l]of Object.entries(t))i.includes(c)?n[c]=l:o[c]=l;let s=e;for(let[c,l]of Object.entries(n))s=s.replace(`:${c}`,encodeURIComponent(String(l)));let a=Pe(o);return s+a}function ie(){let e=[];return{add(t,r,n){let{pattern:o,paramNames:i}=oe(t),s={path:t,method:r,pattern:o,paramNames:i,routeOptions:n},a=e.findIndex(c=>i.length<c.paramNames.length);a===-1?e.push(s):e.splice(a,0,s)},remove(t){for(let r=e.length-1;r>=0;r--)e[r].path===t&&e.splice(r,1)},clear(){e.length=0},match(t,r){let n=t.split("?")[0];if(!n)return null;for(let i of e){if(i.method!==r)continue;if(i.pattern.exec(n)){let a=J(t,i.pattern,i.paramNames);return{route:i.routeOptions,params:a}}}return e.find(i=>i.method!==r&&i.pattern.test(t))?{route:null,params:{},methodNotAllowed:!0,allowedMethods:e.filter(i=>i.pattern.test(t)).map(i=>i.method)}:null},getRoutes(){return e.map(t=>({path:t.path,method:t.method}))},findRoutes(t){return e.filter(r=>r.pattern.test(t)).map(r=>({path:r.path,method:r.method,params:J(t,r.pattern,r.paramNames)}))}}}import{AsyncLocalStorage as ii}from"node:async_hooks";import{randomUUID as si}from"node:crypto";import ai from"node:events";import*as Xe from"node:fs";import*as mr from"node:http";import*as gr from"node:http2";import*as I from"node:fs";import*as Me from"node:path";import*as Gt from"selfsigned";async function Jt(){let e=Me.join(process.cwd(),".blaizejs","certs"),t=Me.join(e,"dev.key"),r=Me.join(e,"dev.cert");if(I.existsSync(t)&&I.existsSync(r))return{keyFile:t,certFile:r};I.existsSync(e)||I.mkdirSync(e,{recursive:!0});let i=Gt.generate([{name:"commonName",value:"localhost"}],{days:365,algorithm:"sha256",keySize:2048,extensions:[{name:"basicConstraints",cA:!0},{name:"keyUsage",keyCertSign:!0,digitalSignature:!0,nonRepudiation:!0,keyEncipherment:!0,dataEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:7,ip:"127.0.0.1"}]}]});return I.writeFileSync(t,Buffer.from(i.private,"utf-8")),I.writeFileSync(r,Buffer.from(i.cert,"utf-8")),console.log(`
27
27
  \u{1F512} Generated self-signed certificates for development at ${e}
28
- `),{keyFile:t,certFile:r}}var F=class extends Error{constructor(t="\u274C Response has already been sent"){super(t),this.name="ResponseSentError"}},oe=class extends F{constructor(t="Cannot set header after response has been sent"){super(t)}},Pe=class extends F{constructor(t="Cannot set content type after response has been sent"){super(t)}},Me=class extends F{constructor(t="Invalide URL"){super(t)}};import{AsyncLocalStorage as Bn}from"node:async_hooks";var Fn=new Bn;function Gt(e,t){return Fn.run(e,t)}import*as tr from"node:crypto";import{createWriteStream as In}from"node:fs";import{tmpdir as $n}from"node:os";import{join as Dn}from"node:path";import{Readable as er}from"node:stream";var Ln=/boundary=([^;]+)/i,On=/Content-Disposition:\s*form-data;\s*name="([^"]+)"(?:;[\s\r\n]*filename="([^"]*)")?/i,An=/Content-Type:\s*([^\r\n]+)/i,_n=/multipart\/form-data/i;function Jt(e){let t=e.match(Ln);if(!t||!t[1])return null;let r=t[1].trim();return r.startsWith('"')&&r.endsWith('"')&&(r=r.slice(1,-1)),r||null}function Kt(e){let t=e.match(On);return!t||!t[1]?null:{name:t[1],filename:t[2]!==void 0?t[2]:void 0}}function Yt(e){let t=e.match(An);return t&&t[1]?.trim()?t[1].trim():"application/octet-stream"}function Xt(e){return _n.test(e)}var Nn={maxFileSize:10*1024*1024,maxFiles:10,maxFieldSize:1*1024*1024,allowedMimeTypes:[],allowedExtensions:[],strategy:"stream",tempDir:$n(),computeHash:!1};function Hn(e,t={}){return{boundary:Buffer.from(`--${e}`),options:{...Nn,...t},fields:new Map,files:new Map,buffer:Buffer.alloc(0),stage:"boundary",currentHeaders:"",currentField:null,currentFilename:void 0,currentMimetype:"application/octet-stream",currentContentLength:0,fileCount:0,fieldCount:0,currentBufferChunks:[],currentStream:null,currentTempPath:null,currentWriteStream:null,streamController:null,cleanupTasks:[],hasFoundValidBoundary:!1,hasProcessedAnyPart:!1,isFinished:!1}}async function qn(e,t){let r=Buffer.concat([e.buffer,t]),n={...e,buffer:r};for(;n.buffer.length>0&&!n.isFinished;){let o=await Un(n);if(o===n)break;n=o}return n}async function Un(e){switch(e.stage){case"boundary":return jn(e);case"headers":return Vn(e);case"content":return Wn(e);default:{let{InternalServerError:t}=await import("./internal-server-error-DVVTTWHD.js");throw new t("Invalid parser stage",{operation:e.stage})}}}function jn(e){let t=e.buffer.indexOf(e.boundary);if(t===-1)return e;let r=!0,n=e.buffer.subarray(t+e.boundary.length);return n.length>=2&&n.subarray(0,2).equals(Buffer.from("--"))?{...e,buffer:n,hasFoundValidBoundary:r,isFinished:!0,stage:"boundary"}:(n.length>=2&&n.subarray(0,2).equals(Buffer.from(`\r
29
- `))&&(n=n.subarray(2)),{...e,buffer:n,hasFoundValidBoundary:r,stage:"headers",currentHeaders:""})}async function Vn(e){let t=e.buffer.indexOf(`\r
28
+ `),{keyFile:t,certFile:r}}var L=class extends Error{constructor(t="\u274C Response has already been sent"){super(t),this.name="ResponseSentError"}},se=class extends L{constructor(t="Cannot set header after response has been sent"){super(t)}},ze=class extends L{constructor(t="Cannot set content type after response has been sent"){super(t)}},ke=class extends L{constructor(t="Invalide URL"){super(t)}};import{AsyncLocalStorage as Fn}from"node:async_hooks";var Ln=new Fn;function Kt(e,t){return Ln.run(e,t)}import*as nr from"node:crypto";import{createWriteStream as $n}from"node:fs";import{tmpdir as Dn}from"node:os";import{join as Nn}from"node:path";import{Readable as rr}from"node:stream";var On=/boundary=([^;]+)/i,_n=/Content-Disposition:\s*form-data;\s*name="([^"]+)"(?:;[\s\r\n]*filename="([^"]*)")?/i,An=/Content-Type:\s*([^\r\n]+)/i,In=/multipart\/form-data/i;function Yt(e){let t=e.match(On);if(!t||!t[1])return null;let r=t[1].trim();return r.startsWith('"')&&r.endsWith('"')&&(r=r.slice(1,-1)),r||null}function Xt(e){let t=e.match(_n);return!t||!t[1]?null:{name:t[1],filename:t[2]!==void 0?t[2]:void 0}}function er(e){let t=e.match(An);return t&&t[1]?.trim()?t[1].trim():"application/octet-stream"}function tr(e){return In.test(e)}var Hn={maxFileSize:10*1024*1024,maxFiles:10,maxFieldSize:1*1024*1024,allowedMimeTypes:[],allowedExtensions:[],strategy:"stream",tempDir:Dn(),computeHash:!1};function qn(e,t={}){return{boundary:Buffer.from(`--${e}`),options:{...Hn,...t},fields:new Map,files:new Map,buffer:Buffer.alloc(0),stage:"boundary",currentHeaders:"",currentField:null,currentFilename:void 0,currentMimetype:"application/octet-stream",currentContentLength:0,fileCount:0,fieldCount:0,currentBufferChunks:[],currentStream:null,currentTempPath:null,currentWriteStream:null,streamController:null,cleanupTasks:[],hasFoundValidBoundary:!1,hasProcessedAnyPart:!1,isFinished:!1}}async function Un(e,t){let r=Buffer.concat([e.buffer,t]),n={...e,buffer:r};for(;n.buffer.length>0&&!n.isFinished;){let o=await jn(n);if(o===n)break;n=o}return n}async function jn(e){switch(e.stage){case"boundary":return Vn(e);case"headers":return Wn(e);case"content":return Qn(e);default:{let{InternalServerError:t}=await import("./internal-server-error-RIRTDP3D.js");throw new t("Invalid parser stage",{operation:e.stage})}}}function Vn(e){let t=e.buffer.indexOf(e.boundary);if(t===-1)return e;let r=!0,n=e.buffer.subarray(t+e.boundary.length);return n.length>=2&&n.subarray(0,2).equals(Buffer.from("--"))?{...e,buffer:n,hasFoundValidBoundary:r,isFinished:!0,stage:"boundary"}:(n.length>=2&&n.subarray(0,2).equals(Buffer.from(`\r
29
+ `))&&(n=n.subarray(2)),{...e,buffer:n,hasFoundValidBoundary:r,stage:"headers",currentHeaders:""})}async function Wn(e){let t=e.buffer.indexOf(`\r
30
30
  \r
31
- `);if(t===-1)return e;let r=e.buffer.subarray(0,t).toString("utf8"),n=e.buffer.subarray(t+4),o=Kt(r);if(!o){let{ValidationError:a}=await import("./validation-error-N57OM7AM.js");throw new a("Missing or invalid Content-Disposition header")}let i=Yt(r),s=o.filename!==void 0;if(s&&e.fileCount>=e.options.maxFiles){let{PayloadTooLargeError:a}=await import("./payload-too-large-error-QGRSATV5.js");throw new a("Too many files in upload",{fileCount:e.fileCount+1,maxFiles:e.options.maxFiles,filename:o.filename})}if(s&&e.options.allowedMimeTypes.length>0&&!e.options.allowedMimeTypes.includes(i)){let{UnsupportedMediaTypeError:a}=await import("./unsupported-media-type-error-VAT4HTL4.js");throw new a("File type not allowed",{receivedMimeType:i,allowedMimeTypes:e.options.allowedMimeTypes,filename:o.filename})}return{...e,buffer:n,stage:"content",currentHeaders:r,currentField:o.name,currentFilename:o.filename,currentMimetype:i,currentContentLength:0,fileCount:s?e.fileCount+1:e.fileCount,fieldCount:s?e.fieldCount:e.fieldCount+1,currentBufferChunks:[]}}async function Wn(e){let t=e.buffer.indexOf(e.boundary),r,n=!1,o=e.buffer;if(t===-1){let s=Math.max(0,e.buffer.length-e.boundary.length);if(s===0)return e;r=e.buffer.subarray(0,s),o=e.buffer.subarray(s)}else{let s=Math.max(0,t-2);r=e.buffer.subarray(0,s),o=e.buffer.subarray(t),n=!0}let i={...e,buffer:o};return r.length>0&&(i=await Qn(i,r)),n&&(i=await Jn(i),i={...i,stage:"boundary",hasProcessedAnyPart:!0}),i}async function Qn(e,t){let r=e.currentContentLength+t.length,n=e.currentFilename!==void 0?e.options.maxFileSize:e.options.maxFieldSize;if(r>n){let o=e.currentFilename!==void 0,{PayloadTooLargeError:i}=await import("./payload-too-large-error-QGRSATV5.js"),s=e.currentField?{contentType:o?"file":"field",currentSize:r,maxSize:n,field:e.currentField,filename:e.currentFilename}:{contentType:o?"file":"field",currentSize:r,maxSize:n,filename:e.currentFilename};throw new i(`${o?"File":"Field"} size exceeds limit`,s)}return e.currentFilename!==void 0?Zn(e,t,r):{...e,currentContentLength:r,currentBufferChunks:[...e.currentBufferChunks,t]}}async function Zn(e,t,r){switch(e.options.strategy){case"memory":return{...e,currentContentLength:r,currentBufferChunks:[...e.currentBufferChunks,t]};case"stream":return e.streamController&&e.streamController.enqueue(t),{...e,currentContentLength:r};case"temp":return e.currentWriteStream&&await to(e.currentWriteStream,t),{...e,currentContentLength:r};default:{let{ValidationError:n}=await import("./validation-error-N57OM7AM.js");throw new n("Invalid parsing strategy")}}}async function Gn(e){if(e.currentFilename===void 0)return e;switch(e.options.strategy){case"memory":return{...e,currentBufferChunks:[]};case"stream":{let t=null,r=new ReadableStream({start:n=>{t=n}});return{...e,currentStream:r,streamController:t}}case"temp":{let t=Dn(e.options.tempDir,`upload-${tr.randomUUID()}`),r=In(t),n=async()=>{try{let{unlink:o}=await import("node:fs/promises");await o(t)}catch(o){console.warn(`Failed to cleanup temp file: ${t}`,o)}};return{...e,currentTempPath:t,currentWriteStream:r,cleanupTasks:[...e.cleanupTasks,n]}}default:{let{ValidationError:t}=await import("./validation-error-N57OM7AM.js");throw new t("Invalid file processing strategy")}}}async function Jn(e){return e.currentField?e.currentFilename!==void 0?Kn(e):Yn(e):ie(e)}async function Kn(e){if(!e.currentField||e.currentFilename===void 0)return ie(e);let t,r,n;switch(e.options.strategy){case"memory":r=Buffer.concat(e.currentBufferChunks),t=er.from(r);break;case"stream":e.streamController&&e.streamController.close(),t=e.currentStream;break;case"temp":e.currentWriteStream&&await nr(e.currentWriteStream),n=e.currentTempPath,t=er.from(Buffer.alloc(0));break;default:{let{ValidationError:s}=await import("./validation-error-N57OM7AM.js");throw new s("Invalid file finalization strategy")}}let o={originalname:e.currentFilename,encoding:"7bit",fieldname:e.currentField,mimetype:e.currentMimetype,size:e.currentContentLength,stream:t,buffer:r,tempPath:n},i=rr(e.files,e.currentField,o);return{...ie(e),files:i}}function Yn(e){if(!e.currentField)return ie(e);let t=Buffer.concat(e.currentBufferChunks).toString("utf8"),r=rr(e.fields,e.currentField,t);return{...ie(e),fields:r}}function ie(e){return{...e,currentField:null,currentFilename:void 0,currentContentLength:0,currentBufferChunks:[],currentStream:null,streamController:null,currentTempPath:null,currentWriteStream:null}}function rr(e,t,r){let n=new Map(e),o=n.get(t)||[];return n.set(t,[...o,r]),n}async function Xn(e){if(!e.hasFoundValidBoundary){let{ValidationError:n}=await import("./validation-error-N57OM7AM.js");throw new n("No valid multipart boundary found")}if(e.hasFoundValidBoundary&&!e.hasProcessedAnyPart){let{ValidationError:n}=await import("./validation-error-N57OM7AM.js");throw new n("Empty multipart request")}let t={};for(let[n,o]of e.fields.entries())t[n]=o.length===1?o[0]:o;let r={};for(let[n,o]of e.files.entries())r[n]=o.length===1?o[0]:o;return{fields:t,files:r}}async function eo(e){await Promise.allSettled(e.cleanupTasks.map(t=>t())),e.streamController&&e.streamController.close(),e.currentWriteStream&&await nr(e.currentWriteStream)}async function to(e,t){return new Promise((r,n)=>{e.write(t,o=>{o?n(o):r()})})}async function nr(e){return new Promise(t=>{e.end(()=>t())})}async function or(e,t={}){let r=e.headers["content-type"]||"",n=Jt(r);if(!n){let{UnsupportedMediaTypeError:i}=await import("./unsupported-media-type-error-VAT4HTL4.js");throw new i("Missing boundary in multipart content-type",{receivedContentType:r,expectedFormat:"multipart/form-data; boundary=..."})}let o=Hn(n,t);o.currentFilename!==void 0&&(o=await Gn(o));try{for await(let i of e)o=await qn(o,i);return Xn(o)}finally{await eo(o)}}var se="Content-Type";function ro(e){let t=e.url||"/",r=e.headers.host||"localhost",o=`${e.socket&&e.socket.encrypted?"https":"http"}://${r}${t.startsWith("/")?"":"/"}${t}`;try{let i=new URL(o),s=i.pathname,a={};return i.searchParams.forEach((c,l)=>{a[l]!==void 0?Array.isArray(a[l])?a[l].push(c):a[l]=[a[l],c]:a[l]=c}),{path:s,url:i,query:a}}catch(i){throw console.warn(`Invalid URL: ${o}`,i),new Me(`Invalid URL: ${o}`)}}function no(e){return"stream"in e||"httpVersionMajor"in e&&e.httpVersionMajor===2}function oo(e){let t=e.socket&&e.socket.encrypted,r=e.headers["x-forwarded-proto"];return r?Array.isArray(r)?r[0]?.split(",")[0]?.trim()||"http":r.split(",")[0]?.trim()||"http":t?"https":"http"}async function ir(e,t,r){let{path:n,url:o,query:i}=ro(e),s=e.method||"GET",a=no(e),c=oo(e),l={},u={...r.initialState||{}},p={...r.initialServices||{}},v={sent:!1},E={request:io(e,{path:n,url:o,query:i,params:l,method:s,isHttp2:a,protocol:c}),response:{},state:u,services:p};return E.response=ao(t,v,E),r.parseBody&&await So(e,E,r),E}function io(e,t){return{raw:e,...t,header:sr(e),headers:so(e),body:void 0,files:void 0}}function sr(e){return t=>{let r=e.headers[t.toLowerCase()];return Array.isArray(r)?r.join(", "):r||void 0}}function so(e){let t=sr(e);return r=>r&&Array.isArray(r)&&r.length>0?r.reduce((n,o)=>(n[o]=t(o),n),{}):Object.entries(e.headers).reduce((n,[o,i])=>(n[o]=Array.isArray(i)?i.join(", "):i||void 0,n),{})}function ae(e,t){if(t.correlationId){let r=N(),n=String(t.correlationId);e.setHeader(r,n)}}function ao(e,t,r){return{raw:e,get statusCode(){return e.statusCode||200},get sent(){return t.sent},status:co(e,t,r),header:lo(e,t,r),headers:uo(e,t,r),type:po(e,t,r),json:fo(e,t,r.state),text:mo(e,t,r.state),html:go(e,t,r.state),redirect:ho(e,t,r.state),stream:yo(e,t,r.state)}}function co(e,t,r){return function(o){if(t.sent)throw new F;return e.statusCode=o,r.response}}function lo(e,t,r){return function(o,i){if(t.sent)throw new oe;return e.setHeader(o,i),r.response}}function uo(e,t,r){return function(o){if(t.sent)throw new oe;for(let[i,s]of Object.entries(o))e.setHeader(i,s);return r.response}}function po(e,t,r){return function(o){if(t.sent)throw new Pe;return e.setHeader(se,o),r.response}}function fo(e,t,r){return function(o,i){if(t.sent)throw new F;i!==void 0&&(e.statusCode=i),ae(e,r),e.setHeader(se,"application/json"),e.end(JSON.stringify(o)),t.sent=!0}}function mo(e,t,r){return function(o,i){if(t.sent)throw new F;i!==void 0&&(e.statusCode=i),ae(e,r),e.setHeader(se,"text/plain"),e.end(o),t.sent=!0}}function go(e,t,r){return function(o,i){if(t.sent)throw new F;i!==void 0&&(e.statusCode=i),ae(e,r),e.setHeader(se,"text/html"),e.end(o),t.sent=!0}}function ho(e,t,r){return function(o,i=302){if(t.sent)throw new F;ae(e,r),e.statusCode=i,e.setHeader("Location",o),e.end(),t.sent=!0}}function yo(e,t,r){return function(o,i={}){if(t.sent)throw new F;if(i.status!==void 0&&(e.statusCode=i.status),ae(e,r),i.contentType&&e.setHeader(se,i.contentType),i.headers)for(let[s,a]of Object.entries(i.headers))e.setHeader(s,a);o.pipe(e),o.on("end",()=>{t.sent=!0}),o.on("error",s=>{console.error("Stream error:",s),t.sent||(e.statusCode=500,e.end("Stream error"),t.sent=!0)})}}async function So(e,t,r){if(wo(e.method))return;let n=e.headers["content-type"]||"",o=parseInt(e.headers["content-length"]||"0",10);if(o===0)return;let i=r.bodyLimits;if(n.includes("application/json")){if(o>i.json)throw new H("JSON body exceeds size limit",{currentSize:o,maxSize:i.json,contentType:"application/json"},w());await vo(e,t)}else if(n.includes("application/x-www-form-urlencoded")){if(o>i.form)throw new H("Form body exceeds size limit",{currentSize:o,maxSize:i.form,contentType:"application/x-www-form-urlencoded"},w());await To(e,t)}else if(n.includes("text/")){if(o>i.text)throw new H("Text body exceeds size limit",{currentSize:o,maxSize:i.text,contentType:n},w());await bo(e,t)}else if(Xt(n))await xo(e,t,i.multipart);else{if(o>i.raw)throw new H("Request body exceeds size limit",{currentSize:o,maxSize:i.raw,contentType:n||"unknown"},w());return}}function wo(e){return["GET","HEAD","OPTIONS"].includes(e||"GET")}async function vo(e,t){let r=await Je(e);if(!r){console.warn("Empty body, skipping JSON parsing");return}if(r.trim()==="null"){console.warn('Body is the string "null"'),t.request.body=null;return}try{let n=JSON.parse(r);t.request.body=n}catch(n){throw new b("Invalid JSON in request body",{fields:[{field:"body",messages:["Request body contains malformed JSON",n instanceof Error?n.message:"JSON parse failed"]}],errorCount:1,section:"body"},w())}}async function To(e,t){let r=await Je(e);if(r)try{t.request.body=Eo(r)}catch(n){throw new b("Request body contains malformed form data",{fields:[{field:"body",messages:["Invalid URL-encoded form data",n instanceof Error?n.message:"Form parse failed"]}],errorCount:1,section:"body"},w())}}function Eo(e){let t=new URLSearchParams(e),r={};return t.forEach((n,o)=>{r[o]!==void 0?Array.isArray(r[o])?r[o].push(n):r[o]=[r[o],n]:r[o]=n}),r}async function bo(e,t){let r=await Je(e);r&&(t.request.body=r)}async function xo(e,t,r){try{let n=r,o=await or(e,{strategy:"stream",maxFileSize:n.maxFileSize,maxFiles:n.maxFiles,maxFieldSize:n.maxFieldSize});t.request.multipart=o,t.request.files=o.files,t.request.body=o.fields}catch(n){throw n instanceof H||n instanceof me?n:new me("Failed to parse multipart/form-data",{receivedContentType:e.headers["content-type"],expectedFormat:"multipart/form-data; boundary=..."},w())}}async function Je(e){return new Promise((t,r)=>{let n=[];e.on("data",o=>{n.push(Buffer.isBuffer(o)?o:Buffer.from(o))}),e.on("end",()=>{t(Buffer.concat(n).toString("utf8"))}),e.on("error",o=>{r(o)})})}var j=class extends T{constructor(t,r=void 0,n=void 0){super("NOT_FOUND",t,404,n??w(),r)}};function Ro(e){return e instanceof T}function ar(e){if(Ro(e))return{type:e.type,title:e.title,status:e.status,correlationId:e.correlationId,timestamp:e.timestamp.toISOString(),details:e.details};let t=w(),r;e instanceof Error?r=e.message:e==null?r="Unknown error occurred":r=String(e);let n=new J("Internal Server Error",{originalMessage:r},t);return{type:n.type,title:n.title,status:n.status,correlationId:n.correlationId,timestamp:n.timestamp.toISOString(),details:n.details}}function cr(e){let t=N(),r={[t]:e(t)};return fe(r)}function lr(e,t){let r=N();e(r,t)}function ur(e={}){let{debug:t=!1}=e;return z({name:"ErrorBoundary",debug:t,handler:async({ctx:r,next:n,logger:o})=>{try{await n()}catch(i){if(r.response.sent){t&&o.error("Error occurred after response was sent:",{error:i});return}t&&o.error("Error boundary caught error:",{error:i});let s=cr(r.request.header),a=ar(i);a.correlationId=s,lr(r.response.header,s),r.response.status(a.status).json(a)}}})}function dr(e){return async(t,r)=>{let n=fe(t.headers);try{await Tt(n,async()=>{let o=await ir(t,r,{parseBody:!0,initialState:{correlationId:n},bodyLimits:e.bodyLimits}),i=e._logger.child({correlationId:n,method:o.request.method,path:o.request.path}),a=[ur()];"corsOptions"in e&&e.corsOptions!==!1&&a.push(we(e.corsOptions)),a.push(...e.middleware);let c=Q(a),l=async()=>{if(!o.response.sent&&(await e.router.handleRequest(o,i,e.eventBus),!r.headersSent&&!o.response.sent))throw new j(`Route not found: ${o.request.method} ${o.request.path}`)};await Gt(o,async()=>{await c({ctx:o,next:l,logger:i,eventBus:e.eventBus})})})}catch(o){e._logger.error("Unhandled request error",{error:o,correlationId:n});let i=N();if(r.headersSent||r.stream?.headersSent){e._logger.error("Headers already sent, cannot send error response");return}"stream"in r&&typeof r.stream?.respond=="function"?(r.stream.respond({":status":500,"content-type":"application/json",[i.toLowerCase()]:n}),r.stream.end(JSON.stringify({error:"Internal Server Error",message:"An unexpected error occurred while processing the request",correlationId:n}))):(r.setHeader(i,n),r.writeHead(500,{"Content-Type":"application/json"}),r.end(JSON.stringify({error:"Internal Server Error",message:"An unexpected error occurred while processing the request",correlationId:n})))}}}async function Co(e){if(!e.enabled)return{};let{keyFile:t,certFile:r}=e,n=process.env.NODE_ENV==="development",o=!t||!r;if(o&&n)return await Zt();if(o)throw new Error("HTTP/2 requires SSL certificates. Provide keyFile and certFile in http2 options. In development, set NODE_ENV=development to generate them automatically.");return{keyFile:t,certFile:r}}function Po(e,t){if(!e)return pr.createServer();let r={allowHTTP1:!0};try{t.keyFile&&(r.key=Ke.readFileSync(t.keyFile)),t.certFile&&(r.cert=Ke.readFileSync(t.certFile))}catch(n){throw new Error(`Failed to read certificate files: ${n instanceof Error?n.message:String(n)}`)}return fr.createSecureServer(r)}function Mo(e,t,r,n){return new Promise((o,i)=>{e.listen(t,r,()=>{let a=`${n?"https":"http"}://${r}:${t}`;R.info(`
31
+ `);if(t===-1)return e;let r=e.buffer.subarray(0,t).toString("utf8"),n=e.buffer.subarray(t+4),o=Xt(r);if(!o){let{ValidationError:a}=await import("./validation-error-V74LVJBA.js");throw new a("Missing or invalid Content-Disposition header")}let i=er(r),s=o.filename!==void 0;if(s&&e.fileCount>=e.options.maxFiles){let{PayloadTooLargeError:a}=await import("./payload-too-large-error-6HOOZBD6.js");throw new a("Too many files in upload",{fileCount:e.fileCount+1,maxFiles:e.options.maxFiles,filename:o.filename})}if(s&&e.options.allowedMimeTypes.length>0&&!e.options.allowedMimeTypes.includes(i)){let{UnsupportedMediaTypeError:a}=await import("./unsupported-media-type-error-HSTEA3TX.js");throw new a("File type not allowed",{receivedMimeType:i,allowedMimeTypes:e.options.allowedMimeTypes,filename:o.filename})}return{...e,buffer:n,stage:"content",currentHeaders:r,currentField:o.name,currentFilename:o.filename,currentMimetype:i,currentContentLength:0,fileCount:s?e.fileCount+1:e.fileCount,fieldCount:s?e.fieldCount:e.fieldCount+1,currentBufferChunks:[]}}async function Qn(e){let t=e.buffer.indexOf(e.boundary),r,n=!1,o=e.buffer;if(t===-1){let s=Math.max(0,e.buffer.length-e.boundary.length);if(s===0)return e;r=e.buffer.subarray(0,s),o=e.buffer.subarray(s)}else{let s=Math.max(0,t-2);r=e.buffer.subarray(0,s),o=e.buffer.subarray(t),n=!0}let i={...e,buffer:o};return r.length>0&&(i=await Zn(i,r)),n&&(i=await Kn(i),i={...i,stage:"boundary",hasProcessedAnyPart:!0}),i}async function Zn(e,t){let r=e.currentContentLength+t.length,n=e.currentFilename!==void 0?e.options.maxFileSize:e.options.maxFieldSize;if(r>n){let o=e.currentFilename!==void 0,{PayloadTooLargeError:i}=await import("./payload-too-large-error-6HOOZBD6.js"),s=e.currentField?{contentType:o?"file":"field",currentSize:r,maxSize:n,field:e.currentField,filename:e.currentFilename}:{contentType:o?"file":"field",currentSize:r,maxSize:n,filename:e.currentFilename};throw new i(`${o?"File":"Field"} size exceeds limit`,s)}return e.currentFilename!==void 0?Gn(e,t,r):{...e,currentContentLength:r,currentBufferChunks:[...e.currentBufferChunks,t]}}async function Gn(e,t,r){switch(e.options.strategy){case"memory":return{...e,currentContentLength:r,currentBufferChunks:[...e.currentBufferChunks,t]};case"stream":return e.streamController&&e.streamController.enqueue(t),{...e,currentContentLength:r};case"temp":return e.currentWriteStream&&await ro(e.currentWriteStream,t),{...e,currentContentLength:r};default:{let{ValidationError:n}=await import("./validation-error-V74LVJBA.js");throw new n("Invalid parsing strategy")}}}async function Jn(e){if(e.currentFilename===void 0)return e;switch(e.options.strategy){case"memory":return{...e,currentBufferChunks:[]};case"stream":{let t=null,r=new ReadableStream({start:n=>{t=n}});return{...e,currentStream:r,streamController:t}}case"temp":{let t=Nn(e.options.tempDir,`upload-${nr.randomUUID()}`),r=$n(t),n=async()=>{try{let{unlink:o}=await import("node:fs/promises");await o(t)}catch(o){console.warn(`Failed to cleanup temp file: ${t}`,o)}};return{...e,currentTempPath:t,currentWriteStream:r,cleanupTasks:[...e.cleanupTasks,n]}}default:{let{ValidationError:t}=await import("./validation-error-V74LVJBA.js");throw new t("Invalid file processing strategy")}}}async function Kn(e){return e.currentField?e.currentFilename!==void 0?Yn(e):Xn(e):ae(e)}async function Yn(e){if(!e.currentField||e.currentFilename===void 0)return ae(e);let t,r,n;switch(e.options.strategy){case"memory":r=Buffer.concat(e.currentBufferChunks),t=rr.from(r);break;case"stream":e.streamController&&e.streamController.close(),t=e.currentStream;break;case"temp":e.currentWriteStream&&await ir(e.currentWriteStream),n=e.currentTempPath,t=rr.from(Buffer.alloc(0));break;default:{let{ValidationError:s}=await import("./validation-error-V74LVJBA.js");throw new s("Invalid file finalization strategy")}}let o={originalname:e.currentFilename,encoding:"7bit",fieldname:e.currentField,mimetype:e.currentMimetype,size:e.currentContentLength,stream:t,buffer:r,tempPath:n},i=or(e.files,e.currentField,o);return{...ae(e),files:i}}function Xn(e){if(!e.currentField)return ae(e);let t=Buffer.concat(e.currentBufferChunks).toString("utf8"),r=or(e.fields,e.currentField,t);return{...ae(e),fields:r}}function ae(e){return{...e,currentField:null,currentFilename:void 0,currentContentLength:0,currentBufferChunks:[],currentStream:null,streamController:null,currentTempPath:null,currentWriteStream:null}}function or(e,t,r){let n=new Map(e),o=n.get(t)||[];return n.set(t,[...o,r]),n}async function eo(e){if(!e.hasFoundValidBoundary){let{ValidationError:n}=await import("./validation-error-V74LVJBA.js");throw new n("No valid multipart boundary found")}if(e.hasFoundValidBoundary&&!e.hasProcessedAnyPart){let{ValidationError:n}=await import("./validation-error-V74LVJBA.js");throw new n("Empty multipart request")}let t={};for(let[n,o]of e.fields.entries())t[n]=o.length===1?o[0]:o;let r={};for(let[n,o]of e.files.entries())r[n]=o.length===1?o[0]:o;return{fields:t,files:r}}async function to(e){await Promise.allSettled(e.cleanupTasks.map(t=>t())),e.streamController&&e.streamController.close(),e.currentWriteStream&&await ir(e.currentWriteStream)}async function ro(e,t){return new Promise((r,n)=>{e.write(t,o=>{o?n(o):r()})})}async function ir(e){return new Promise(t=>{e.end(()=>t())})}async function sr(e,t={}){let r=e.headers["content-type"]||"",n=Yt(r);if(!n){let{UnsupportedMediaTypeError:i}=await import("./unsupported-media-type-error-HSTEA3TX.js");throw new i("Missing boundary in multipart content-type",{receivedContentType:r,expectedFormat:"multipart/form-data; boundary=..."})}let o=qn(n,t);o.currentFilename!==void 0&&(o=await Jn(o));try{for await(let i of e)o=await Un(o,i);return eo(o)}finally{await to(o)}}var ce="Content-Type";function no(e){let t=e.url||"/",r=e.headers.host||"localhost",o=`${e.socket&&e.socket.encrypted?"https":"http"}://${r}${t.startsWith("/")?"":"/"}${t}`;try{let i=new URL(o),s=i.pathname,a={};return i.searchParams.forEach((c,l)=>{a[l]!==void 0?Array.isArray(a[l])?a[l].push(c):a[l]=[a[l],c]:a[l]=c}),{path:s,url:i,query:a}}catch(i){throw console.warn(`Invalid URL: ${o}`,i),new ke(`Invalid URL: ${o}`)}}function oo(e){return"stream"in e||"httpVersionMajor"in e&&e.httpVersionMajor===2}function io(e){let t=e.socket&&e.socket.encrypted,r=e.headers["x-forwarded-proto"];return r?Array.isArray(r)?r[0]?.split(",")[0]?.trim()||"http":r.split(",")[0]?.trim()||"http":t?"https":"http"}async function ar(e,t,r){let{path:n,url:o,query:i}=no(e),s=e.method||"GET",a=oo(e),c=io(e),l={},u={...r.initialState||{}},m={...r.initialServices||{}},v={sent:!1},E={request:so(e,{path:n,url:o,query:i,params:l,method:s,isHttp2:a,protocol:c}),response:{},state:u,services:m};return E.response=co(t,v,E),r.parseBody&&await vo(e,E,r),E}function so(e,t){return{raw:e,...t,header:cr(e),headers:ao(e),body:void 0,files:void 0}}function cr(e){return t=>{let r=e.headers[t.toLowerCase()];return Array.isArray(r)?r.join(", "):r||void 0}}function ao(e){let t=cr(e);return r=>r&&Array.isArray(r)&&r.length>0?r.reduce((n,o)=>(n[o]=t(o),n),{}):Object.entries(e.headers).reduce((n,[o,i])=>(n[o]=Array.isArray(i)?i.join(", "):i||void 0,n),{})}function le(e,t){if(t.correlationId){let r=q(),n=String(t.correlationId);e.setHeader(r,n)}}function co(e,t,r){return{raw:e,get statusCode(){return e.statusCode||200},get sent(){return t.sent},status:lo(e,t,r),header:uo(e,t,r),headers:po(e,t,r),type:fo(e,t,r),json:mo(e,t,r.state),text:go(e,t,r.state),html:ho(e,t,r.state),redirect:yo(e,t,r.state),stream:So(e,t,r.state)}}function lo(e,t,r){return function(o){if(t.sent)throw new L;return e.statusCode=o,r.response}}function uo(e,t,r){return function(o,i){if(t.sent)throw new se;return e.setHeader(o,i),r.response}}function po(e,t,r){return function(o){if(t.sent)throw new se;for(let[i,s]of Object.entries(o))e.setHeader(i,s);return r.response}}function fo(e,t,r){return function(o){if(t.sent)throw new ze;return e.setHeader(ce,o),r.response}}function mo(e,t,r){return function(o,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),le(e,r),e.setHeader(ce,"application/json"),e.end(JSON.stringify(o)),t.sent=!0}}function go(e,t,r){return function(o,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),le(e,r),e.setHeader(ce,"text/plain"),e.end(o),t.sent=!0}}function ho(e,t,r){return function(o,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),le(e,r),e.setHeader(ce,"text/html"),e.end(o),t.sent=!0}}function yo(e,t,r){return function(o,i=302){if(t.sent)throw new L;le(e,r),e.statusCode=i,e.setHeader("Location",o),e.end(),t.sent=!0}}function So(e,t,r){return function(o,i={}){if(t.sent)throw new L;if(i.status!==void 0&&(e.statusCode=i.status),le(e,r),i.contentType&&e.setHeader(ce,i.contentType),i.headers)for(let[s,a]of Object.entries(i.headers))e.setHeader(s,a);o.pipe(e),o.on("end",()=>{t.sent=!0}),o.on("error",s=>{console.error("Stream error:",s),t.sent||(e.statusCode=500,e.end("Stream error"),t.sent=!0)})}}async function vo(e,t,r){if(wo(e.method))return;let n=e.headers["content-type"]||"",o=parseInt(e.headers["content-length"]||"0",10);if(o===0)return;let i=r.bodyLimits;if(n.includes("application/json")){if(o>i.json)throw new U("JSON body exceeds size limit",{currentSize:o,maxSize:i.json,contentType:"application/json"},y());await To(e,t)}else if(n.includes("application/x-www-form-urlencoded")){if(o>i.form)throw new U("Form body exceeds size limit",{currentSize:o,maxSize:i.form,contentType:"application/x-www-form-urlencoded"},y());await Eo(e,t)}else if(n.includes("text/")){if(o>i.text)throw new U("Text body exceeds size limit",{currentSize:o,maxSize:i.text,contentType:n},y());await xo(e,t)}else if(tr(n))await Ro(e,t,i.multipart);else{if(o>i.raw)throw new U("Request body exceeds size limit",{currentSize:o,maxSize:i.raw,contentType:n||"unknown"},y());return}}function wo(e){return["GET","HEAD","OPTIONS"].includes(e||"GET")}async function To(e,t){let r=await Ye(e);if(!r){console.warn("Empty body, skipping JSON parsing");return}if(r.trim()==="null"){console.warn('Body is the string "null"'),t.request.body=null;return}try{let n=JSON.parse(r);t.request.body=n}catch(n){throw new b("Invalid JSON in request body",{fields:[{field:"body",messages:["Request body contains malformed JSON",n instanceof Error?n.message:"JSON parse failed"]}],errorCount:1,section:"body"},y())}}async function Eo(e,t){let r=await Ye(e);if(r)try{t.request.body=bo(r)}catch(n){throw new b("Request body contains malformed form data",{fields:[{field:"body",messages:["Invalid URL-encoded form data",n instanceof Error?n.message:"Form parse failed"]}],errorCount:1,section:"body"},y())}}function bo(e){let t=new URLSearchParams(e),r={};return t.forEach((n,o)=>{r[o]!==void 0?Array.isArray(r[o])?r[o].push(n):r[o]=[r[o],n]:r[o]=n}),r}async function xo(e,t){let r=await Ye(e);r&&(t.request.body=r)}async function Ro(e,t,r){try{let n=r,o=await sr(e,{strategy:"stream",maxFileSize:n.maxFileSize,maxFiles:n.maxFiles,maxFieldSize:n.maxFieldSize});t.request.multipart=o,t.request.files=o.files,t.request.body=o.fields}catch(n){throw n instanceof U||n instanceof he?n:new he("Failed to parse multipart/form-data",{receivedContentType:e.headers["content-type"],expectedFormat:"multipart/form-data; boundary=..."},y())}}async function Ye(e){return new Promise((t,r)=>{let n=[];e.on("data",o=>{n.push(Buffer.isBuffer(o)?o:Buffer.from(o))}),e.on("end",()=>{t(Buffer.concat(n).toString("utf8"))}),e.on("error",o=>{r(o)})})}var W=class extends T{constructor(t,r=void 0,n=void 0){super("NOT_FOUND",t,404,n??y(),r)}};function Co(e){return e instanceof T}function lr(e){if(Co(e))return{type:e.type,title:e.title,status:e.status,correlationId:e.correlationId,timestamp:e.timestamp.toISOString(),details:e.details};let t=y(),r;e instanceof Error?r=e.message:e==null?r="Unknown error occurred":r=String(e);let n=new Y("Internal Server Error",{originalMessage:r},t);return{type:n.type,title:n.title,status:n.status,correlationId:n.correlationId,timestamp:n.timestamp.toISOString(),details:n.details}}function ur(e){let t=q(),r={[t]:e(t)};return ge(r)}function dr(e,t){let r=q();e(r,t)}function pr(e={}){let{debug:t=!1}=e;return z({name:"ErrorBoundary",debug:t,handler:async({ctx:r,next:n,logger:o})=>{try{await n()}catch(i){if(r.response.sent){t&&o.error("Error occurred after response was sent:",{error:i});return}t&&o.error("Error boundary caught error:",{error:i});let s=ur(r.request.header),a=lr(i);a.correlationId=s,dr(r.response.header,s),r.response.status(a.status).json(a)}}})}function fr(e){return async(t,r)=>{let n=ge(t.headers);try{await bt(n,async()=>{let o=await ar(t,r,{parseBody:!0,initialState:{correlationId:n},bodyLimits:e.bodyLimits}),i=e._logger.child({correlationId:n,method:o.request.method,path:o.request.path}),a=[pr()];"corsOptions"in e&&e.corsOptions!==!1&&a.push(Te(e.corsOptions)),a.push(...e.middleware);let c=G(a),l=async()=>{if(!o.response.sent&&(await e.router.handleRequest(o,i,e.eventBus),!r.headersSent&&!o.response.sent))throw new W(`Route not found: ${o.request.method} ${o.request.path}`)};await Kt(o,async()=>{await c({ctx:o,next:l,logger:i,eventBus:e.eventBus})})})}catch(o){e._logger.error("Unhandled request error",{error:o,correlationId:n});let i=q();if(r.headersSent||r.stream?.headersSent){e._logger.error("Headers already sent, cannot send error response");return}"stream"in r&&typeof r.stream?.respond=="function"?(r.stream.respond({":status":500,"content-type":"application/json",[i.toLowerCase()]:n}),r.stream.end(JSON.stringify({error:"Internal Server Error",message:"An unexpected error occurred while processing the request",correlationId:n}))):(r.setHeader(i,n),r.writeHead(500,{"Content-Type":"application/json"}),r.end(JSON.stringify({error:"Internal Server Error",message:"An unexpected error occurred while processing the request",correlationId:n})))}}}async function Po(e){if(!e.enabled)return{};let{keyFile:t,certFile:r}=e,n=process.env.NODE_ENV==="development",o=!t||!r;if(o&&n)return await Jt();if(o)throw new Error("HTTP/2 requires SSL certificates. Provide keyFile and certFile in http2 options. In development, set NODE_ENV=development to generate them automatically.");return{keyFile:t,certFile:r}}function Mo(e,t){if(!e)return mr.createServer();let r={allowHTTP1:!0};try{t.keyFile&&(r.key=Xe.readFileSync(t.keyFile)),t.certFile&&(r.cert=Xe.readFileSync(t.certFile))}catch(n){throw new Error(`Failed to read certificate files: ${n instanceof Error?n.message:String(n)}`)}return gr.createSecureServer(r)}function zo(e,t,r,n){return new Promise((o,i)=>{e.listen(t,r,()=>{let a=`${n?"https":"http"}://${r}:${t}`;x.info(`
32
32
  \u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}
33
33
 
34
34
  \u26A1 BlaizeJS DEVELOPMENT SERVER HOT AND READY \u26A1
35
35
 
36
36
  \u{1F680} Server: ${a}
37
37
  \u{1F525} Hot Reload: Enabled
38
- \u{1F6E0}\uFE0F Mode: Development
39
-
38
+ \u{1F6E0}\uFE0F Mode: ${process.env.NODE_ENV==="development"?"Development":"Production"}
40
39
  Time to build something amazing! \u{1F680}
41
40
 
42
41
  \u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}
43
- `),o()}),e.on("error",s=>{R.error("Server error:",{error:s,host:r,port:t}),i(s)})})}async function zo(e){for(let t of e.plugins)typeof t.initialize=="function"&&await t.initialize(e)}async function mr(e,t){if(!e.server)try{let r=t.port,n=t.host;await zo(e);let o=t.http2||{enabled:!0},i=!!o.enabled,s=await Co(o);t.http2&&s.keyFile&&s.certFile&&(t.http2.keyFile=s.keyFile,t.http2.certFile=s.certFile);let a=Po(i,s);e.server=a,e.port=r,e.host=n;let c=dr(e);a.on("request",c),await Mo(a,r,n,i)}catch(r){throw R.error("Failed to start server:",{error:r}),r}}var ze=!1;async function gr(e,t={}){let r=e.server,n=e.events;if(ze){console.log("\u26A0\uFE0F Shutdown already in progress, ignoring duplicate shutdown request");return}if(!r)return;ze=!0;let o=t.timeout||5e3;try{if(t.onStopping&&await t.onStopping(),n.emit("stopping"),e.router&&typeof e.router.close=="function"){console.log("\u{1F50C} Closing router watchers...");try{await Promise.race([e.router.close(),new Promise((a,c)=>setTimeout(()=>c(new Error("Router close timeout")),2e3))]),console.log("\u2705 Router watchers closed")}catch(a){console.error("\u274C Error closing router watchers:",a)}}try{await Promise.race([e.pluginManager.onServerStop(e,r),new Promise((a,c)=>setTimeout(()=>c(new Error("Plugin stop timeout")),2e3))])}catch(a){console.error("\u274C Plugin stop timeout:",a)}if(e.eventBus){console.log("\u{1F50C} Disconnecting EventBus...");try{await Promise.race([e.eventBus.disconnect(),new Promise((a,c)=>setTimeout(()=>c(new Error("EventBus disconnect timeout")),2e3))]),console.log("\u2705 EventBus disconnected")}catch(a){console.error("\u274C Error disconnecting EventBus:",a)}}let i=new Promise((a,c)=>{r.close(l=>{if(l)return c(l);a()})}),s=new Promise((a,c)=>{setTimeout(()=>{c(new Error("Server shutdown timeout"))},o)});await Promise.race([i,s]);try{await Promise.race([e.pluginManager.terminatePlugins(e),new Promise((a,c)=>setTimeout(()=>c(new Error("Plugin terminate timeout")),1e3))])}catch(a){console.error("\u274C Plugin terminate timeout:",a)}t.onStopped&&await t.onStopped(),n.emit("stopped"),e.server=null,console.log("\u2705 Graceful shutdown completed"),ze=!1}catch(i){throw ze=!1,console.error("\u26A0\uFE0F Shutdown error (forcing exit):",i),r&&typeof r.close=="function"&&r.close(),process.env.NODE_ENV==="development"&&(console.log("\u{1F504} Forcing exit for development restart..."),process.exit(0)),n.emit("error",i),i}}function hr(e){if(process.env.NODE_ENV==="development"){let r=()=>{console.log("\u{1F4E4} SIGINT received, forcing exit for development restart..."),process.exit(0)},n=()=>{console.log("\u{1F4E4} SIGTERM received, forcing exit for development restart..."),process.exit(0)};return process.on("SIGINT",r),process.on("SIGTERM",n),{unregister:()=>{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",n)}}}else{let r=()=>{console.log("\u{1F4E4} SIGINT received, starting graceful shutdown..."),e().catch(console.error)},n=()=>{console.log("\u{1F4E4} SIGTERM received, starting graceful shutdown..."),e().catch(console.error)};return process.on("SIGINT",r),process.on("SIGTERM",n),{unregister:()=>{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",n)}}}}import{z as S}from"zod";var ko=S.custom(e=>e!==null&&typeof e=="object"&&"execute"in e&&typeof e.execute=="function",{message:"Expected middleware to have an execute function"}),Bo=S.custom(e=>e!==null&&typeof e=="object"&&"register"in e&&typeof e.register=="function",{message:"Expected a valid plugin object with a register method"}),Fo=S.object({enabled:S.boolean().optional().default(!0),keyFile:S.string().optional(),certFile:S.string().optional()}).refine(e=>e.enabled&&process.env.NODE_ENV==="production"?e.keyFile&&e.certFile:!0,{message:"When HTTP/2 is enabled (outside of development mode), both keyFile and certFile must be provided"}),Lo=S.object({headerName:S.string().regex(/^[a-z][a-z0-9-]*$/,{message:"Header name must start with a letter and contain only lowercase letters, numbers, and hyphens"}).optional(),generator:S.function().args().returns(S.string()).optional()}).optional(),Oo=S.object({maxFileSize:S.number().positive().default(50*1024*1024),maxTotalSize:S.number().positive().default(100*1024*1024),maxFiles:S.number().positive().int().default(10),maxFieldSize:S.number().positive().default(1024*1024)}),Ao=S.object({json:S.number().positive().default(512*1024),form:S.number().positive().default(1024*1024),text:S.number().positive().default(5*1024*1024),raw:S.number().positive().default(10*1024*1024),multipart:Oo}),_o=S.object({includeHeaders:S.boolean().optional(),headerWhitelist:S.array(S.string().min(1)).optional(),includeQuery:S.boolean().optional()}).optional(),Io=S.object({level:S.enum(["debug","info","warn","error"]).optional(),transport:S.any().optional(),redactKeys:S.array(S.string().min(1)).optional(),includeTimestamp:S.boolean().optional(),requestLogging:S.boolean().optional(),requestLoggerOptions:_o}).optional(),$o=S.object({port:S.number().int().positive().optional().default(3e3),host:S.string().optional().default("localhost"),routesDir:S.string().optional().default("./routes"),http2:Fo.optional().default({enabled:!0}),eventSchemas:S.record(S.any()).optional().default({}),middleware:S.array(ko).optional().default([]),plugins:S.array(Bo).optional().default([]),correlation:Lo,cors:Ot,bodyLimits:Ao,logging:Io,serverId:S.string().min(1).optional()});function yr(e){try{return $o.parse(e)}catch(t){if(t instanceof S.ZodError){let r=t.format();throw new Error(`Invalid server options: ${JSON.stringify(r,null,2)}`)}throw new Error(`Invalid server options: ${String(t)}`)}}function Sr(e={}){let{continueOnError:t=!0,onError:r}=e;function n(o,i,s){let a=`Plugin ${o.name} failed during ${i}: ${s.message}`;if(r?r(o,i,s):R.error(`[PluginLifecycle] ${a}`,{plugin:o.name,phase:i,error:{message:s.message,stack:s.stack,name:s.name}}),!t)throw new Error(a)}return{async initializePlugins(o){R.debug("[PluginLifecycle] Initializing plugins",{count:o.plugins.length});for(let i of o.plugins)if(i.initialize)try{R.debug("[PluginLifecycle] Initializing plugin",{plugin:i.name}),await i.initialize(o)}catch(s){n(i,"initialize",s)}R.info("[PluginLifecycle] Plugins initialized",{count:o.plugins.length,plugins:o.plugins.map(i=>i.name)})},async terminatePlugins(o){R.debug("[PluginLifecycle] Terminating plugins",{count:o.plugins.length});let i=[...o.plugins].reverse();for(let s of i)if(s.terminate)try{R.debug("[PluginLifecycle] Terminating plugin",{plugin:s.name}),await s.terminate(o)}catch(a){n(s,"terminate",a)}R.info("[PluginLifecycle] Plugins terminated",{count:i.length})},async onServerStart(o,i){R.debug("[PluginLifecycle] Notifying plugins of server start");for(let s of o.plugins)if(s.onServerStart)try{R.debug("[PluginLifecycle] Notifying plugin of server start",{plugin:s.name}),await s.onServerStart(i)}catch(a){n(s,"onServerStart",a)}},async onServerStop(o,i){R.debug("[PluginLifecycle] Notifying plugins of server stop...");let s=[...o.plugins].reverse();for(let a of s)if(a.onServerStop)try{R.debug(`[PluginLifecycle] Notifying plugin of server stop: ${a.name}`),await a.onServerStop(i)}catch(c){n(a,"onServerStop",c)}}}}var L=class extends Error{constructor(r,n){super(`Plugin validation error${r?` for "${r}"`:""}: ${n}`);this.pluginName=r;this.name="PluginValidationError"}};var Do=new Set(["core","server","router","middleware","context","blaize","blaizejs"]),No=/^[a-z]([a-z0-9-]*[a-z0-9])?$/,Ho=/^\d+\.\d+\.\d+(?:-[a-zA-Z0-9-.]+)?(?:\+[a-zA-Z0-9-.]+)?$/;function Ye(e,t={}){let{requireVersion:r=!0,validateNameFormat:n=!0,checkReservedNames:o=!0}=t;if(!e||typeof e!="object")throw new L("","Plugin must be an object");let i=e;if(!i.name||typeof i.name!="string")throw new L("","Plugin must have a name (string)");if(n&&!No.test(i.name))throw new L(i.name,"Plugin name must be lowercase letters, numbers, and hyphens only");if(o&&Do.has(i.name.toLowerCase()))throw new L(i.name,`Plugin name "${i.name}" is reserved`);if(r){if(!i.version||typeof i.version!="string")throw new L(i.name,"Plugin must have a version (string)");if(!Ho.test(i.version))throw new L(i.name,'Plugin version must follow semantic versioning (e.g., "1.0.0")')}if(!i.register||typeof i.register!="function")throw new L(i.name,"Plugin must have a register method (function)");let s=["initialize","terminate","onServerStart","onServerStop"];for(let a of s)if(i[a]&&typeof i[a]!="function")throw new L(i.name,`Plugin ${a} must be a function if provided`)}import*as vr from"node:crypto";import*as Tr from"node:fs/promises";async function qo(e){let t=`?t=${Date.now()}`,r=e+t;try{let n=await import(r);return console.log("\u2705 Successfully imported module"),n}catch(n){let o=n instanceof Error?n.message:String(n);return console.log("\u26A0\uFE0F Error importing with cache buster, trying original path:",o),import(e)}}async function wr(e,t){try{let r=Te(e,t),n=await qo(e);console.log("\u{1F4E6} Module exports:",Object.keys(n));let o=[];if(n.default&&typeof n.default=="object"){let i={...n.default,path:r.routePath};o.push(i)}return Object.entries(n).forEach(([i,s])=>{if(i==="default"||!s||typeof s!="object")return;let a=s;if(Uo(a)){let c={...a,path:r.routePath};o.push(c)}}),o.length===0?(console.warn(`Route file ${e} does not export any valid route definitions`),[]):(console.log(`\u2705 Successfully Loaded ${o.length} route(s)`),o)}catch(r){return console.error(`Failed to load route module ${e}:`,r),[]}}function Uo(e){return!e||typeof e!="object"?!1:["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].some(n=>e[n]&&typeof e[n]=="object"&&e[n].handler)}var ce=new Map;async function le(e,t,r=!0){let o=(await Tr.stat(e)).mtime.getTime(),i=ce.get(e);if(r&&i&&i.timestamp===o)return i.routes;let s=await wr(e,t);if(r){let a=br(s);ce.set(e,{routes:s,timestamp:o,hash:a})}return s}function Er(e,t){let r=ce.get(e);if(!r)return!0;let n=br(t);return r.hash!==n}function Xe(e){e?ce.delete(e):ce.clear()}function br(e){let t=e.map(o=>({path:o.path,methods:Object.keys(o).filter(i=>i!=="path").sort().map(i=>{let s=o[i],a=s?.handler?s.handler.toString():null;return{method:i,handler:a,middleware:s?.middleware?s.middleware.length:0,hasSchema:!!s?.schema,schemaKeys:s?.schema?Object.keys(s.schema).sort():[]}})})),r=JSON.stringify(t);return vr.createHash("md5").update(r).digest("hex")}import*as Rr from"node:os";import*as ke from"node:fs/promises";import*as G from"node:path";async function xr(e,t={}){let r=G.isAbsolute(e)?e:G.resolve(process.cwd(),e);console.log("Creating router with routes directory:",r);try{if(!(await ke.stat(r)).isDirectory())throw new Error(`Route directory is not a directory: ${r}`)}catch(s){throw s.code==="ENOENT"?new Error(`Route directory not found: ${r}`):s}let n=[],o=t.ignore||["node_modules",".git"];async function i(s){let a=await ke.readdir(s,{withFileTypes:!0});for(let c of a){let l=G.join(s,c.name);c.isDirectory()&&o.includes(c.name)||(c.isDirectory()?await i(l):jo(c.name)&&n.push(l))}}return await i(r),n}function jo(e){return!e.startsWith("_")&&(e.endsWith(".ts")||e.endsWith(".js"))}async function Vo(e,t,r=Math.max(1,Math.floor(Rr.cpus().length/2))){let n=Wo(e,r),o=[];for(let i of n){let a=(await Promise.allSettled(i.map(c=>t(c)))).filter(c=>c.status==="fulfilled").map(c=>c.value);o.push(...a)}return o}async function Cr(e){let t=await xr(e);return(await Vo(t,n=>le(n,e))).flat()}function Wo(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}var $={fileChanges:0,totalReloadTime:0,averageReloadTime:0,slowReloads:[]};function Pr(e,t){let r=Date.now()-t;if($.fileChanges++,$.totalReloadTime+=r,$.averageReloadTime=$.totalReloadTime/$.fileChanges,r>100&&($.slowReloads.push({file:e,time:r}),$.slowReloads.length>10&&$.slowReloads.shift()),process.env.NODE_ENV==="development"){let n=r<50?"\u26A1":r<100?"\u{1F504}":"\u{1F40C}";console.log(`${n} Route reload: ${e} (${r}ms)`)}}function et(e,t){return console.log(`Tracking performance for: ${t}`),async(...r)=>{let n=Date.now();try{let o=await e(...r);return Pr(t,n),o}catch(o){throw Pr(t,n),o}}}import*as tt from"node:path";import{watch as Qo}from"chokidar";function rt(e,t={}){let r=t.debounceMs||16,n=new Map;function o(u,p){return(...v)=>{let E=n.get(p);E&&clearTimeout(E);let d=setTimeout(()=>{u(...v),n.delete(p)},r);n.set(p,d)}}let i=new Map;async function s(u){try{let p=i.get(u),v=await le(u,e,!1);if(!v||v.length===0||p&&!Er(u,v))return;await le(u,e,!0);let E=tt.normalize(u);p?(i.set(u,v),t.onRouteChanged&&t.onRouteChanged(E,v)):(i.set(u,v),t.onRouteAdded&&t.onRouteAdded(E,v))}catch(p){console.log(`\u26A0\uFE0F Error processing file ${u}:`,p),c(p)}}function a(u){let p=tt.normalize(u),v=i.get(p);v&&v.length>0&&t.onRouteRemoved&&t.onRouteRemoved(p,v),i.delete(p)}function c(u){t.onError&&u instanceof Error?t.onError(u):console.error("\u26A0\uFE0F Route watcher error:",u)}let l=Qo(e,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:50,pollInterval:10},usePolling:!1,atomic:!0,followSymlinks:!1,depth:10,ignored:[/(^|[/\\])\../,/node_modules/,/\.git/,/\.DS_Store/,/Thumbs\.db/,/\.(test|spec)\.(ts|js)$/,/\.d\.ts$/,/\.map$/,/~$/,...t.ignore||[]]});return l.on("add",u=>{o(s,u)(u)}).on("change",u=>{o(s,u)(u)}).on("unlink",u=>{o(a,u)(u)}).on("error",c),{close:()=>(n.forEach(u=>clearTimeout(u)),n.clear(),l.close()),getRoutes:()=>{let u=[];for(let p of i.values())u.push(...p);return u},getRoutesByFile:()=>new Map(i)}}import{z as ei}from"zod";import{z as Zo}from"zod";function nt(e,t){return t instanceof Zo.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Go}from"zod";function Mr(e,t){return t instanceof Go.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Jo}from"zod";function ot(e,t){return t instanceof Jo.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Ko}from"zod";function it(e,t){return t instanceof Ko.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Yo}from"zod";function st(e,t){return t instanceof Yo.ZodObject?t.strict().parse(e):t.parse(e)}import{z as V}from"zod";var at={B:1,KB:1024,MB:1024**2,GB:1024**3,TB:1024**4,KiB:1024,MiB:1024**2,GiB:1024**3,TiB:1024**4};function ct(e){if(typeof e=="number"){if(isNaN(e))throw new b("Invalid size format: NaN is not a valid size");if(!isFinite(e))throw new b("Size cannot be Infinity");if(e<0)throw new b("Size cannot be negative");return Math.round(e)}let t=e.trim();if(!t)throw new b("Invalid size format: empty string");let r=/^(-?[\d.]+)\s*([A-Za-z]+)?$/,n=t.match(r);if(!n)throw new b(`Invalid size format: "${e}"`);let[,o,i]=n,s=parseFloat(o);if(isNaN(s))throw new b(`Invalid size format: "${e}" contains invalid number`);if(!isFinite(s))throw new b("Size cannot be Infinity");if(s<0)throw new b("Size cannot be negative");if(!i)return Math.round(s);let a=i.replace(/^([kmgt])(i)?b$/i,(u,p,v)=>`${p.toUpperCase()}${v?"i":""}B`);if(!(a in at))throw new b(`Invalid size unit: ${i}. Supported units: ${Object.keys(at).join(", ")}`);let c=at[a],l=s*c;return Math.round(l)}function ue(e,t=2){if(e===0)return"0 B";let r=e<0,n=Math.abs(e),o=["B","KB","MB","GB","TB"],i=0,s=n;for(;s>=1024&&i<o.length-1;)s/=1024,i++;let a=s%1===0?s.toString():s.toFixed(t).replace(/\.?0+$/,"");return`${r?"-":""}${a} ${o[i]}`}function Xo(e,t){if(e===t)return!0;if(t.endsWith("/*")){let r=t.slice(0,-2);return e.split("/")[0]===r}return!1}function zr(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.fieldname=="string"&&typeof t.originalname=="string"&&typeof t.encoding=="string"&&typeof t.mimetype=="string"&&typeof t.size=="number"&&(t.buffer===void 0||Buffer.isBuffer(t.buffer))}function kr(e){let t=e?.maxSize!==void 0?typeof e.maxSize=="number"?e.maxSize:ct(e.maxSize):void 0,r=e?.minSize!==void 0?typeof e.minSize=="number"?e.minSize:ct(e.minSize):void 0,o=V.custom(i=>zr(i),{message:"Expected an uploaded file object"}).superRefine((i,s)=>{if(!zr(i)){s.addIssue({code:V.ZodIssueCode.custom,message:"Expected an uploaded file object"});return}let a=i;e?.accept&&e.accept.length>0&&(e.accept.some(l=>Xo(a.mimetype,l))||s.addIssue({code:V.ZodIssueCode.custom,message:`Invalid file type "${a.mimetype}". Accepted types: ${e.accept.join(", ")}`})),r!==void 0&&a.size<r&&s.addIssue({code:V.ZodIssueCode.custom,message:`File size ${ue(a.size)} is below minimum ${ue(r)}`}),t!==void 0&&a.size>t&&s.addIssue({code:V.ZodIssueCode.custom,message:`File size ${ue(a.size)} exceeds maximum ${ue(t)}`}),a.size<0&&s.addIssue({code:V.ZodIssueCode.custom,message:"File size cannot be negative"}),(!a.mimetype||a.mimetype.trim()==="")&&s.addIssue({code:V.ZodIssueCode.custom,message:"File must have a MIME type"})});return o._isFileSchema=!0,o}function lt(e,t=!1){return z({name:"RequestValidator",debug:t,handler:async({ctx:r,next:n})=>{if(e.params&&r.request.params)try{r.request.params=ot(r.request.params,e.params)}catch(o){let i=de(o),s=i.reduce((a,c)=>a+c.messages.length,0);throw new b("Request validation failed",{fields:i,errorCount:s,section:"params"})}if(e.query&&r.request.query)try{r.request.query=it(r.request.query,e.query)}catch(o){let i=de(o),s=i.reduce((a,c)=>a+c.messages.length,0);throw new b("Request validation failed",{fields:i,errorCount:s,section:"query"})}if(e.body)try{r.request.body=nt(r.request.body,e.body)}catch(o){let i=de(o),s=i.reduce((a,c)=>a+c.messages.length,0);throw new b("Request validation failed",{fields:i,errorCount:s,section:"body"})}if(e.files)try{r.request.files=Mr(r.request.files,e.files)}catch(o){let i=de(o),s=i.reduce((a,c)=>a+c.messages.length,0);throw new b("Request validation failed",{fields:i,errorCount:s,section:"files"})}await n()}})}function ti(e){return e!==null&&typeof e=="object"&&"type"in e&&"status"in e&&"correlationId"in e&&"timestamp"in e}function ut(e){return z({name:"ResponseValidator",handler:async({ctx:t,next:r})=>{let n=t.response.json,o=!0;t.response.json=(i,s)=>{if(!o||ti(i))return n.call(t.response,i,s);try{let a=st(i,e);return n.call(t.response,a,s)}catch(a){throw o=!1,new J("Response validation failed",{validationError:de(a),hint:"The handler returned data that does not match the response schema"})}};try{await r()}catch(i){throw o=!1,t.response.json=n,i}finally{t.response.json=n}}})}function de(e){if(e instanceof ei.ZodError){let t=new Map;for(let r of e.issues){let n=r.path.length>0?r.path.join("."):"root";t.has(n)||t.set(n,[]),t.get(n).push(r.message)}return Array.from(t.entries()).map(([r,n])=>({field:r,messages:n}))}return e instanceof Error?[{field:"unknown",messages:[e.message]}]:[{field:"unknown",messages:[String(e)]}]}async function dt(e,t,r,n,o){let i=[...t.middleware||[]];t.schema&&((t.schema.params||t.schema.query||t.schema.body)&&i.unshift(lt(t.schema)),t.schema.response&&i.push(ut(t.schema.response))),await Q([...i])({ctx:e,next:async()=>{let a=n.child({route:e.request.path,method:e.request.method}),c=await t.handler({ctx:e,params:r,logger:a,eventBus:o});!e.response.sent&&c!==void 0&&e.response.json(c)},logger:n,eventBus:o})}function Br(){return{routesByPath:new Map,routesByFile:new Map,pathToFile:new Map}}function D(e,t,r){console.log(`Updating routes from file: ${t}`);let n=e.routesByFile.get(t)||new Set,o=new Set(r.map(l=>l.path)),i=r.filter(l=>!n.has(l.path)),s=Array.from(n).filter(l=>!o.has(l)),c=r.filter(l=>n.has(l.path)).filter(l=>{let u=e.routesByPath.get(l.path);return!u||!ni(u,l)});return ri(e,t,{added:i,removed:s,changed:c}),{added:i,removed:s,changed:c}}function Fr(e){return Array.from(e.routesByPath.values())}function ri(e,t,r){let{added:n,removed:o,changed:i}=r;o.forEach(a=>{e.routesByPath.delete(a),e.pathToFile.delete(a)}),[...n,...i].forEach(a=>{e.routesByPath.set(a.path,a),e.pathToFile.set(a.path,t)});let s=new Set([...n.map(a=>a.path),...i.map(a=>a.path),...Array.from(e.routesByFile.get(t)||[]).filter(a=>!o.includes(a))]);s.size>0?e.routesByFile.set(t,s):e.routesByFile.delete(t)}function ni(e,t){if(e.path!==t.path)return!1;let r=Object.keys(e).filter(o=>o!=="path").sort(),n=Object.keys(t).filter(o=>o!=="path").sort();return r.length!==n.length?!1:r.every(o=>{let i=e[o],s=t[o];return typeof i==typeof s})}function pt(e,t){Object.entries(e).forEach(([r,n])=>{r==="path"||!n||t.add(e.path,r,n)})}function pe(e,t){"remove"in t&&typeof t.remove=="function"?t.remove(e):console.warn("Matcher does not support selective removal, consider adding remove() method")}function Lr(e,t){pe(e.path,t),pt(e,t)}var oi={routesDir:"./routes",basePath:"/",watchMode:process.env.NODE_ENV==="development"};function Or(e){let t={...oi,...e};e.basePath&&!e.basePath.startsWith("/")&&console.warn("Base path does nothing");let r=Br(),n=ne(),o=!1,i=null,s=null,a=new Set([t.routesDir]);function c(d){console.log(`
44
- \u{1F527} APPLYING MATCHER CHANGES:`),console.log(` Adding ${d.added.length} routes`),console.log(` Removing ${d.removed.length} routes`),console.log(` Updating ${d.changed.length} routes`),d.removed.forEach(g=>{console.log(` \u2796 Removing: ${g}`),pe(g,n)}),d.added.forEach(g=>{let y=Object.keys(g).filter(f=>f!=="path");console.log(` \u2795 Adding: ${g.path} [${y.join(", ")}]`),pt(g,n)}),d.changed.forEach(g=>{let y=Object.keys(g).filter(f=>f!=="path");console.log(` \u{1F504} Updating: ${g.path} [${y.join(", ")}]`),Lr(g,n)}),console.log(`\u2705 Matcher changes applied
45
- `)}function l(d,g){try{let y=D(r,g,d);return c(y),y}catch(y){throw console.error(`\u26A0\uFE0F Route conflicts from ${g}:`,y),y}}async function u(d,g,y){try{let f=await Cr(d),h=f.map(C=>y?{...C,path:`${y}${C.path}`}:C),m=l(h,g);console.log(`Loaded ${f.length} routes from ${g}${y?` with prefix ${y}`:""} (${m.added.length} added, ${m.changed.length} changed, ${m.removed.length} removed)`)}catch(f){throw console.error(`\u26A0\uFE0F Failed to load routes from ${g}:`,f),f}}async function p(){return o||i||(i=(async()=>{try{await Promise.all(Array.from(a).map(d=>u(d,d))),t.watchMode&&v(),o=!0}catch(d){throw console.error("\u26A0\uFE0F Failed to initialize router:",d),d}})()),i}function v(){s||(s=new Map);for(let d of a)if(!s.has(d)){let g=rt(d,{debounceMs:16,ignore:["node_modules",".git"],onRouteAdded:(y,f)=>{try{let h=D(r,y,f);c(h)}catch(h){console.error(`Error adding routes from ${d}:`,h)}},onRouteChanged:et(async(y,f)=>{try{console.log(`Processing changes for ${y}`);let h=D(r,y,f);console.log(`Changes detected: ${h.added.length} added, ${h.changed.length} changed, ${h.removed.length} removed`),c(h),console.log(`Route changes applied: ${h.added.length} added, ${h.changed.length} changed, ${h.removed.length} removed`)}catch(h){console.error(`\u26A0\uFE0F Error updating routes from ${d}:`,h)}},d),onRouteRemoved:(y,f)=>{console.log(`File removed: ${y} with ${f.length} routes`);try{f.forEach(h=>{pe(h.path,n)}),Xe(y)}catch(h){console.error(`\u26A0\uFE0F Error removing routes from ${y}:`,h)}},onError:y=>{console.error(`\u26A0\uFE0F Route watcher error for ${d}:`,y)}});s.set(d,g)}}function E(d,g){s||(s=new Map);let y=rt(d,{debounceMs:16,ignore:["node_modules",".git"],onRouteAdded:(f,h)=>{try{let m=h.map(O=>g?{...O,path:`${g}${O.path}`}:O),C=D(r,f,m);c(C)}catch(m){console.error(`\u26A0\uFE0F Error adding routes from ${d}:`,m)}},onRouteChanged:et(async(f,h)=>{try{let m=h.map(O=>g?{...O,path:`${g}${O.path}`}:O),C=D(r,f,m);c(C)}catch(m){console.error(`\u26A0\uFE0F Error updating routes from ${d}:`,m)}},d),onRouteRemoved:(f,h)=>{try{h.forEach(m=>{let C=g?`${g}${m.path}`:m.path;pe(C,n)}),Xe(f)}catch(m){console.error(`Error removing routes from ${f}:`,m)}},onError:f=>{console.error(`\u26A0\uFE0F Route watcher error for ${d}:`,f)}});return s.set(d,y),y}return p().catch(d=>{console.error("\u26A0\uFE0F Failed to initialize router on creation:",d)}),{async handleRequest(d,g,y){o||(console.log("\u{1F504} Router not initialized, initializing..."),await p());let{method:f,path:h}=d.request;console.log(`
46
- \u{1F4E5} Handling request: ${f} ${h}`);let m=n.match(h,f);if(!m)throw console.log(`\u274C No match found for: ${f} ${h}`),new j("Not found");if(console.log(`\u2705 Route matched: ${f} ${h}`),console.log(` Params: ${JSON.stringify(m.params)}`),m.methodNotAllowed){d.response.status(405).json({error:"\u274C Method Not Allowed",allowed:m.allowedMethods}),m.allowedMethods&&m.allowedMethods.length>0&&d.response.header("Allow",m.allowedMethods.join(", "));return}d.request.params=m.params,await dt(d,m.route,m.params,g,y)},getRoutes(){return Fr(r)},addRoute(d){let g=D(r,"programmatic",[d]);c(g)},addRoutes(d){let g=D(r,"programmatic",d);return c(g),g},async addRouteDirectory(d,g={}){if(a.has(d)){console.warn(`Route directory ${d} already registered`);return}a.add(d),o&&(await u(d,d,g.prefix),t.watchMode&&E(d,g.prefix))},getRouteConflicts(){return[]},async close(){if(s){for(let d of s.values())await d.close();s.clear()}}}}var P={port:3e3,host:"localhost",routesDir:"./routes",http2:{enabled:!0},eventSchemas:{},middleware:[],plugins:[],bodyLimits:{json:512*1024,form:1024*1024,text:5*1024*1024,raw:10*1024*1024,multipart:{maxFileSize:50*1024*1024,maxTotalSize:100*1024*1024,maxFiles:10,maxFieldSize:1024*1024}}};function ci(e={}){let t={port:e.port??P.port,host:e.host??P.host,routesDir:e.routesDir??P.routesDir,http2:{enabled:e.http2?.enabled??P.http2.enabled,keyFile:e.http2?.keyFile,certFile:e.http2?.certFile},eventSchemas:e.eventSchemas||P.eventSchemas,middleware:e.middleware??P.middleware,plugins:e.plugins??P.plugins,correlation:e.correlation,cors:e.cors,bodyLimits:e.bodyLimits?{json:e.bodyLimits.json??P.bodyLimits.json,form:e.bodyLimits.form??P.bodyLimits.form,text:e.bodyLimits.text??P.bodyLimits.text,raw:e.bodyLimits.raw??P.bodyLimits.raw,multipart:{maxFileSize:e.bodyLimits.multipart?.maxFileSize??P.bodyLimits.multipart.maxFileSize,maxTotalSize:e.bodyLimits.multipart?.maxTotalSize??P.bodyLimits.multipart.maxTotalSize,maxFiles:e.bodyLimits.multipart?.maxFiles??P.bodyLimits.multipart.maxFiles,maxFieldSize:e.bodyLimits.multipart?.maxFieldSize??P.bodyLimits.multipart.maxFieldSize}}:P.bodyLimits,logging:e.logging||P.logging,serverId:e.serverId};try{let r=yr(t);return Dt({routesDir:r.routesDir}),r}catch(r){throw r instanceof Error?new Error(`Failed to create server: ${r.message}`):new Error(`Failed to create server: ${String(r)}`)}}function li(e){e.correlation&&vt(e.correlation.headerName,e.correlation.generator)}function ui(e,t){return async()=>(li(t),await di(e),await e.pluginManager.initializePlugins(e),await mr(e,t),await e.pluginManager.onServerStart(e,e.server),pi(e),e)}async function di(e){for(let t of e.plugins)await t.register(e)}function pi(e){let t=hr(()=>e.close());e._signalHandlers=t,e.events.emit("started")}function fi(e){return async t=>{if(!e.server)return;let r={...t};e._signalHandlers&&(e._signalHandlers.unregister(),delete e._signalHandlers),await gr(e,r)}}function mi(e){return t=>{let r=Array.isArray(t)?t:[t];return e.middleware.push(...r),e}}function gi(e){return async t=>{if(Array.isArray(t))for(let r of t)Ye(r),e.plugins.push(r),await r.register(e);else Ye(t),e.plugins.push(t),await t.register(e);return e}}function ft(e={}){let t=ci(e),{port:r,host:n,middleware:o,plugins:i,cors:s,bodyLimits:a,serverId:c}=t,l=c||si(),u=M(t.logging||{});ye(t.logging||{});let p=Array.isArray(o)?[...o]:[],v=Array.isArray(i)?[...i]:[],E=new ii,d=Or({routesDir:t.routesDir,watchMode:process.env.NODE_ENV==="development"}),g=Sr({continueOnError:!0}),y=new ai,f=new Y(l,u),h=Se(f,{schemas:t.eventSchemas},u),m={server:null,port:r,host:n,context:E,events:y,plugins:[...v],middleware:[...p],corsOptions:s,bodyLimits:a,_signalHandlers:{unregister:()=>{}},_logger:u,use:()=>m,register:async()=>m,listen:async()=>m,close:async()=>{},router:d,pluginManager:g,eventBus:h,serverId:l};return m.listen=ui(m,t),m.close=fi(m),m.use=mi(m),m.register=gi(m),m}function Ar(e){return{}}function Ll(e){return typeof e=="object"&&e!==null&&"name"in e&&"execute"in e&&typeof e.name=="string"&&typeof e.execute=="function"}function Ol(e){return typeof e=="object"&&e!==null&&"name"in e&&"version"in e&&"register"in e&&typeof e.name=="string"&&typeof e.version=="string"&&typeof e.register=="function"}function Al(e){return e}function _l(e){return e}function Il(...e){return e}function $l(...e){return e}var mt=class extends T{constructor(t,r=void 0,n=void 0){super("UNAUTHORIZED",t,401,n??w(),r)}};var gt=class extends T{constructor(t,r=void 0,n=void 0){super("CONFLICT",t,409,n??w(),r)}};var ht=class extends T{constructor(t,r=void 0,n=void 0){super("RATE_LIMITED",t,429,n??w(),r)}};var yt=class extends T{constructor(t,r,n){super("UPLOAD_TIMEOUT",t,408,n??w(),r)}};var St=class extends T{constructor(t,r,n){super("UNPROCESSABLE_ENTITY",t,422,n??w(),r)}};var wt=class extends T{constructor(t,r=void 0,n=void 0){super("SERVICE_UNAVAILABLE",t,503,n??w(),r)}};var hi=Et.version,yi={createServer:ft,inferContext:Ar},Si={createDeleteRoute:Ve,createGetRoute:qe,createHeadRoute:Qe,createOptionsRoute:Ze,createPatchRoute:We,createPostRoute:Ue,createPutRoute:je,createRouteFactory:Wt,createMatcher:ne,extractParams:Z,compilePathPattern:re,paramsToQuery:Re,buildUrl:Ge},wi={createMiddleware:z,createServiceMiddleware:Ae,createStateMiddleware:Oe,compose:Q,cors:we,requestLoggerMiddleware:$t},vi={createPlugin:De},Iu={createTypedEventBus:Se,createServer:ft,createMiddleware:z,createServiceMiddleware:Ae,createStateMiddleware:Oe,createPlugin:De,getCorrelationId:w,configureGlobalLogger:ye,createLogger:M,logger:R,file:kr,Server:yi,Router:Si,Middleware:wi,Plugins:vi,VERSION:hi};export{Iu as Blaize,T as BlaizeError,gt as ConflictError,I as ConsoleTransport,Ti as ErrorSeverity,B as ErrorType,q as EventValidationError,X as ForbiddenError,J as InternalServerError,W as JSONTransport,K as Logger,Y as MemoryEventBus,wi as MiddlewareAPI,j as NotFoundError,he as NullTransport,H as PayloadTooLargeError,vi as PluginsAPI,ht as RateLimitError,yt as RequestTimeoutError,Si as RouterAPI,yi as ServerAPI,wt as ServiceNotAvailableError,mt as UnauthorizedError,St as UnprocessableEntityError,me as UnsupportedMediaTypeError,hi as VERSION,b as ValidationError,Al as asMiddlewareArray,_l as asPluginArray,Ge as buildUrl,re as compilePathPattern,Q as compose,ye as configureGlobalLogger,we as cors,Ve as createDeleteRoute,qe as createGetRoute,Qe as createHeadRoute,M as createLogger,ne as createMatcher,z as createMiddleware,Il as createMiddlewareArray,Ze as createOptionsRoute,We as createPatchRoute,De as createPlugin,$l as createPluginArray,Ue as createPostRoute,je as createPutRoute,Wt as createRouteFactory,ft as createServer,Ae as createServiceMiddleware,Oe as createStateMiddleware,Se as createTypedEventBus,Z as extractParams,kr as file,w as getCorrelationId,Ar as inferContext,Ll as isMiddleware,Ol as isPlugin,R as logger,Re as paramsToQuery,$t as requestLoggerMiddleware};
42
+ `),o()}),e.on("error",s=>{x.error("Server error:",{error:s,host:r,port:t}),i(s)})})}async function hr(e,t){if(!e.server)try{let r=t.port,n=t.host,o=t.http2||{enabled:!0},i=!!o.enabled,s=await Po(o);t.http2&&s.keyFile&&s.certFile&&(t.http2.keyFile=s.keyFile,t.http2.certFile=s.certFile);let a=Mo(i,s);e.server=a,e.port=r,e.host=n;let c=fr(e);a.on("request",c),await zo(a,r,n,i)}catch(r){throw x.error("Failed to start server:",{error:r}),r}}var Be=!1;async function yr(e,t={}){let r=e.server,n=e.events;if(Be){console.log("\u26A0\uFE0F Shutdown already in progress, ignoring duplicate shutdown request");return}if(!r)return;Be=!0;let o=t.timeout||5e3;try{if(t.onStopping&&await t.onStopping(),n.emit("stopping"),e.router&&typeof e.router.close=="function"){console.log("\u{1F50C} Closing router watchers...");try{await Promise.race([e.router.close(),new Promise((a,c)=>setTimeout(()=>c(new Error("Router close timeout")),2e3))]),console.log("\u2705 Router watchers closed")}catch(a){console.error("\u274C Error closing router watchers:",a)}}try{await Promise.race([e.pluginManager.onServerStop(e,r),new Promise((a,c)=>setTimeout(()=>c(new Error("Plugin stop timeout")),2e3))])}catch(a){console.error("\u274C Plugin stop timeout:",a)}if(e.eventBus){console.log("\u{1F50C} Disconnecting EventBus...");try{await Promise.race([e.eventBus.disconnect(),new Promise((a,c)=>setTimeout(()=>c(new Error("EventBus disconnect timeout")),2e3))]),console.log("\u2705 EventBus disconnected")}catch(a){console.error("\u274C Error disconnecting EventBus:",a)}}let i=new Promise((a,c)=>{r.close(l=>{if(l)return c(l);a()})}),s=new Promise((a,c)=>{setTimeout(()=>{c(new Error("Server shutdown timeout"))},o)});await Promise.race([i,s]);try{await Promise.race([e.pluginManager.terminatePlugins(e),new Promise((a,c)=>setTimeout(()=>c(new Error("Plugin terminate timeout")),1e3))])}catch(a){console.error("\u274C Plugin terminate timeout:",a)}t.onStopped&&await t.onStopped(),n.emit("stopped"),e.server=null,console.log("\u2705 Graceful shutdown completed"),Be=!1}catch(i){throw Be=!1,console.error("\u26A0\uFE0F Shutdown error (forcing exit):",i),r&&typeof r.close=="function"&&r.close(),process.env.NODE_ENV==="development"&&(console.log("\u{1F504} Forcing exit for development restart..."),process.exit(0)),n.emit("error",i),i}}function Sr(e){if(process.env.NODE_ENV==="development"){let r=()=>{console.log("\u{1F4E4} SIGINT received, forcing exit for development restart..."),process.exit(0)},n=()=>{console.log("\u{1F4E4} SIGTERM received, forcing exit for development restart..."),process.exit(0)};return process.on("SIGINT",r),process.on("SIGTERM",n),{unregister:()=>{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",n)}}}else{let r=()=>{console.log("\u{1F4E4} SIGINT received, starting graceful shutdown..."),e().catch(console.error)},n=()=>{console.log("\u{1F4E4} SIGTERM received, starting graceful shutdown..."),e().catch(console.error)};return process.on("SIGINT",r),process.on("SIGTERM",n),{unregister:()=>{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",n)}}}}import{z as h}from"zod";var ko=h.custom(e=>e!==null&&typeof e=="object"&&"execute"in e&&typeof e.execute=="function",{message:"Expected middleware to have an execute function"}),Bo=h.custom(e=>e!==null&&typeof e=="object"&&"register"in e&&typeof e.register=="function",{message:"Expected a valid plugin object with a register method"}),Fo=h.object({enabled:h.boolean().optional().default(!0),keyFile:h.string().optional(),certFile:h.string().optional()}).refine(e=>e.enabled&&process.env.NODE_ENV==="production"?e.keyFile&&e.certFile:!0,{message:"When HTTP/2 is enabled (outside of development mode), both keyFile and certFile must be provided"}),Lo=h.object({headerName:h.string().regex(/^[a-z][a-z0-9-]*$/,{message:"Header name must start with a letter and contain only lowercase letters, numbers, and hyphens"}).optional(),generator:h.function().args().returns(h.string()).optional()}).optional(),Oo=h.object({maxFileSize:h.number().positive().default(50*1024*1024),maxTotalSize:h.number().positive().default(100*1024*1024),maxFiles:h.number().positive().int().default(10),maxFieldSize:h.number().positive().default(1024*1024)}),_o=h.object({json:h.number().positive().default(512*1024),form:h.number().positive().default(1024*1024),text:h.number().positive().default(5*1024*1024),raw:h.number().positive().default(10*1024*1024),multipart:Oo}),Ao=h.object({includeHeaders:h.boolean().optional(),headerWhitelist:h.array(h.string().min(1)).optional(),includeQuery:h.boolean().optional()}).optional(),Io=h.object({level:h.enum(["debug","info","warn","error"]).optional(),transport:h.any().optional(),redactKeys:h.array(h.string().min(1)).optional(),includeTimestamp:h.boolean().optional(),requestLogging:h.boolean().optional(),requestLoggerOptions:Ao}).optional(),$o=h.object({port:h.number().int().positive().optional().default(3e3),host:h.string().optional().default("localhost"),routesDir:h.string().optional().default("./routes"),http2:Fo.optional().default({enabled:!0}),eventSchemas:h.record(h.any()).optional().default({}),middleware:h.array(ko).optional().default([]),plugins:h.array(Bo).optional().default([]),correlation:Lo,cors:At,bodyLimits:_o,logging:Io,serverId:h.string().min(1).optional()});function vr(e){try{return $o.parse(e)}catch(t){if(t instanceof h.ZodError){let r=t.format();throw new Error(`Invalid server options: ${JSON.stringify(r,null,2)}`)}throw new Error(`Invalid server options: ${String(t)}`)}}function wr(e={}){let{continueOnError:t=!0,onError:r}=e;function n(o,i,s){let a=`Plugin ${o.name} failed during ${i}: ${s.message}`;if(r?r(o,i,s):x.error(`[PluginLifecycle] ${a}`,{plugin:o.name,phase:i,error:{message:s.message,stack:s.stack,name:s.name}}),!t)throw new Error(a)}return{async registerPlugins(o){x.debug("[PluginLifecycle] Registering plugins",{count:o.plugins.length});for(let i of o.plugins)try{x.debug("[PluginLifecycle] Registering plugin",{plugin:i.name}),await i.register(o)}catch(s){throw n(i,"register",s),s}x.info("[PluginLifecycle] Plugins registered",{count:o.plugins.length,plugins:o.plugins.map(i=>i.name)})},async initializePlugins(o){x.debug("[PluginLifecycle] Initializing plugins",{count:o.plugins.length});for(let i of o.plugins)if(i.initialize)try{x.debug("[PluginLifecycle] Initializing plugin",{plugin:i.name}),await i.initialize(o)}catch(s){n(i,"initialize",s)}x.info("[PluginLifecycle] Plugins initialized",{count:o.plugins.length,plugins:o.plugins.map(i=>i.name)})},async terminatePlugins(o){x.debug("[PluginLifecycle] Terminating plugins",{count:o.plugins.length});let i=[...o.plugins].reverse();for(let s of i)if(s.terminate)try{x.debug("[PluginLifecycle] Terminating plugin",{plugin:s.name}),await s.terminate(o)}catch(a){n(s,"terminate",a)}x.info("[PluginLifecycle] Plugins terminated",{count:i.length})},async onServerStart(o,i){x.debug("[PluginLifecycle] Notifying plugins of server start");for(let s of o.plugins)if(s.onServerStart)try{x.debug("[PluginLifecycle] Notifying plugin of server start",{plugin:s.name}),await s.onServerStart(i)}catch(a){n(s,"onServerStart",a)}},async onServerStop(o,i){x.debug("[PluginLifecycle] Notifying plugins of server stop...");let s=[...o.plugins].reverse();for(let a of s)if(a.onServerStop)try{x.debug(`[PluginLifecycle] Notifying plugin of server stop: ${a.name}`),await a.onServerStop(i)}catch(c){n(a,"onServerStop",c)}}}}var _=class extends Error{constructor(r,n){super(`Plugin validation error${r?` for "${r}"`:""}: ${n}`);this.pluginName=r;this.name="PluginValidationError"}};var Do=new Set(["core","server","router","middleware","context","blaize","blaizejs"]),No=/^[a-z]([a-z0-9-]*[a-z0-9])?$/,Ho=/^\d+\.\d+\.\d+(?:-[a-zA-Z0-9-.]+)?(?:\+[a-zA-Z0-9-.]+)?$/;function et(e,t={}){let{requireVersion:r=!0,validateNameFormat:n=!0,checkReservedNames:o=!0}=t;if(!e||typeof e!="object")throw new _("","Plugin must be an object");let i=e;if(!i.name||typeof i.name!="string")throw new _("","Plugin must have a name (string)");if(n&&!No.test(i.name))throw new _(i.name,"Plugin name must be lowercase letters, numbers, and hyphens only");if(o&&Do.has(i.name.toLowerCase()))throw new _(i.name,`Plugin name "${i.name}" is reserved`);if(r){if(!i.version||typeof i.version!="string")throw new _(i.name,"Plugin must have a version (string)");if(!Ho.test(i.version))throw new _(i.name,'Plugin version must follow semantic versioning (e.g., "1.0.0")')}if(!i.register||typeof i.register!="function")throw new _(i.name,"Plugin must have a register method (function)");let s=["initialize","terminate","onServerStart","onServerStop"];for(let a of s)if(i[a]&&typeof i[a]!="function")throw new _(i.name,`Plugin ${a} must be a function if provided`)}import*as Er from"node:crypto";import*as br from"node:fs/promises";async function qo(e){let t=`?t=${Date.now()}`,r=e+t;try{let n=await import(r);return console.log("\u2705 Successfully imported module"),n}catch(n){let o=n instanceof Error?n.message:String(n);return console.log("\u26A0\uFE0F Error importing with cache buster, trying original path:",o),import(e)}}async function Tr(e,t){try{let r=be(e,t),n=await qo(e);console.log("\u{1F4E6} Module exports:",Object.keys(n));let o=[];if(n.default&&typeof n.default=="object"){let i={...n.default,path:r.routePath};o.push(i)}return Object.entries(n).forEach(([i,s])=>{if(i==="default"||!s||typeof s!="object")return;let a=s;if(Uo(a)){let c={...a,path:r.routePath};o.push(c)}}),o.length===0?(console.warn(`Route file ${e} does not export any valid route definitions`),[]):(console.log(`\u2705 Successfully Loaded ${o.length} route(s)`),o)}catch(r){return console.error(`Failed to load route module ${e}:`,r),[]}}function Uo(e){return!e||typeof e!="object"?!1:["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].some(n=>e[n]&&typeof e[n]=="object"&&e[n].handler)}var ue=new Map;async function de(e,t,r=!0){let o=(await br.stat(e)).mtime.getTime(),i=ue.get(e);if(r&&i&&i.timestamp===o)return i.routes;let s=await Tr(e,t);if(r){let a=Rr(s);ue.set(e,{routes:s,timestamp:o,hash:a})}return s}function xr(e,t){let r=ue.get(e);if(!r)return!0;let n=Rr(t);return r.hash!==n}function tt(e){e?ue.delete(e):ue.clear()}function Rr(e){let t=e.map(o=>({path:o.path,methods:Object.keys(o).filter(i=>i!=="path").sort().map(i=>{let s=o[i],a=s?.handler?s.handler.toString():null;return{method:i,handler:a,middleware:s?.middleware?s.middleware.length:0,hasSchema:!!s?.schema,schemaKeys:s?.schema?Object.keys(s.schema).sort():[]}})})),r=JSON.stringify(t);return Er.createHash("md5").update(r).digest("hex")}import*as Pr from"node:os";import*as Fe from"node:fs/promises";import*as K from"node:path";async function Cr(e,t={}){let r=K.isAbsolute(e)?e:K.resolve(process.cwd(),e);console.log("Creating router with routes directory:",r);try{if(!(await Fe.stat(r)).isDirectory())throw new Error(`Route directory is not a directory: ${r}`)}catch(s){throw s.code==="ENOENT"?new Error(`Route directory not found: ${r}`):s}let n=[],o=t.ignore||["node_modules",".git"];async function i(s){let a=await Fe.readdir(s,{withFileTypes:!0});for(let c of a){let l=K.join(s,c.name);c.isDirectory()&&o.includes(c.name)||(c.isDirectory()?await i(l):jo(c.name)&&n.push(l))}}return await i(r),n}function jo(e){return!e.startsWith("_")&&(e.endsWith(".ts")||e.endsWith(".js"))}async function Vo(e,t,r=Math.max(1,Math.floor(Pr.cpus().length/2))){let n=Wo(e,r),o=[];for(let i of n){let a=(await Promise.allSettled(i.map(c=>t(c)))).filter(c=>c.status==="fulfilled").map(c=>c.value);o.push(...a)}return o}async function Mr(e){let t=await Cr(e);return(await Vo(t,n=>de(n,e))).flat()}function Wo(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}var D={fileChanges:0,totalReloadTime:0,averageReloadTime:0,slowReloads:[]};function zr(e,t){let r=Date.now()-t;if(D.fileChanges++,D.totalReloadTime+=r,D.averageReloadTime=D.totalReloadTime/D.fileChanges,r>100&&(D.slowReloads.push({file:e,time:r}),D.slowReloads.length>10&&D.slowReloads.shift()),process.env.NODE_ENV==="development"){let n=r<50?"\u26A1":r<100?"\u{1F504}":"\u{1F40C}";console.log(`${n} Route reload: ${e} (${r}ms)`)}}function rt(e,t){return console.log(`Tracking performance for: ${t}`),async(...r)=>{let n=Date.now();try{let o=await e(...r);return zr(t,n),o}catch(o){throw zr(t,n),o}}}import*as nt from"node:path";import{watch as Qo}from"chokidar";function ot(e,t={}){let r=t.debounceMs||16,n=new Map;function o(u,m){return(...v)=>{let E=n.get(m);E&&clearTimeout(E);let C=setTimeout(()=>{u(...v),n.delete(m)},r);n.set(m,C)}}let i=new Map;async function s(u){try{let m=i.get(u),v=await de(u,e,!1);if(!v||v.length===0||m&&!xr(u,v))return;await de(u,e,!0);let E=nt.normalize(u);m?(i.set(u,v),t.onRouteChanged&&t.onRouteChanged(E,v)):(i.set(u,v),t.onRouteAdded&&t.onRouteAdded(E,v))}catch(m){console.log(`\u26A0\uFE0F Error processing file ${u}:`,m),c(m)}}function a(u){let m=nt.normalize(u),v=i.get(m);v&&v.length>0&&t.onRouteRemoved&&t.onRouteRemoved(m,v),i.delete(m)}function c(u){t.onError&&u instanceof Error?t.onError(u):console.error("\u26A0\uFE0F Route watcher error:",u)}let l=Qo(e,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:50,pollInterval:10},usePolling:!1,atomic:!0,followSymlinks:!1,depth:10,ignored:[/(^|[/\\])\../,/node_modules/,/\.git/,/\.DS_Store/,/Thumbs\.db/,/\.(test|spec)\.(ts|js)$/,/\.d\.ts$/,/\.map$/,/~$/,...t.ignore||[]]});return l.on("add",u=>{o(s,u)(u)}).on("change",u=>{o(s,u)(u)}).on("unlink",u=>{o(a,u)(u)}).on("error",c),{close:()=>(n.forEach(u=>clearTimeout(u)),n.clear(),l.close()),getRoutes:()=>{let u=[];for(let m of i.values())u.push(...m);return u},getRoutesByFile:()=>new Map(i)}}import{z as ei}from"zod";import{z as Zo}from"zod";function it(e,t){return t instanceof Zo.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Go}from"zod";function kr(e,t){return t instanceof Go.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Jo}from"zod";function st(e,t){return t instanceof Jo.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Ko}from"zod";function at(e,t){return t instanceof Ko.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Yo}from"zod";function ct(e,t){return t instanceof Yo.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Q}from"zod";var lt={B:1,KB:1024,MB:1024**2,GB:1024**3,TB:1024**4,KiB:1024,MiB:1024**2,GiB:1024**3,TiB:1024**4};function ut(e){if(typeof e=="number"){if(isNaN(e))throw new b("Invalid size format: NaN is not a valid size");if(!isFinite(e))throw new b("Size cannot be Infinity");if(e<0)throw new b("Size cannot be negative");return Math.round(e)}let t=e.trim();if(!t)throw new b("Invalid size format: empty string");let r=/^(-?[\d.]+)\s*([A-Za-z]+)?$/,n=t.match(r);if(!n)throw new b(`Invalid size format: "${e}"`);let[,o,i]=n,s=parseFloat(o);if(isNaN(s))throw new b(`Invalid size format: "${e}" contains invalid number`);if(!isFinite(s))throw new b("Size cannot be Infinity");if(s<0)throw new b("Size cannot be negative");if(!i)return Math.round(s);let a=i.replace(/^([kmgt])(i)?b$/i,(u,m,v)=>`${m.toUpperCase()}${v?"i":""}B`);if(!(a in lt))throw new b(`Invalid size unit: ${i}. Supported units: ${Object.keys(lt).join(", ")}`);let c=lt[a],l=s*c;return Math.round(l)}function pe(e,t=2){if(e===0)return"0 B";let r=e<0,n=Math.abs(e),o=["B","KB","MB","GB","TB"],i=0,s=n;for(;s>=1024&&i<o.length-1;)s/=1024,i++;let a=s%1===0?s.toString():s.toFixed(t).replace(/\.?0+$/,"");return`${r?"-":""}${a} ${o[i]}`}function Xo(e,t){if(e===t)return!0;if(t.endsWith("/*")){let r=t.slice(0,-2);return e.split("/")[0]===r}return!1}function Br(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.fieldname=="string"&&typeof t.originalname=="string"&&typeof t.encoding=="string"&&typeof t.mimetype=="string"&&typeof t.size=="number"&&(t.buffer===void 0||Buffer.isBuffer(t.buffer))}function Fr(e){let t=e?.maxSize!==void 0?typeof e.maxSize=="number"?e.maxSize:ut(e.maxSize):void 0,r=e?.minSize!==void 0?typeof e.minSize=="number"?e.minSize:ut(e.minSize):void 0,o=Q.custom(i=>Br(i),{message:"Expected an uploaded file object"}).superRefine((i,s)=>{if(!Br(i)){s.addIssue({code:Q.ZodIssueCode.custom,message:"Expected an uploaded file object"});return}let a=i;e?.accept&&e.accept.length>0&&(e.accept.some(l=>Xo(a.mimetype,l))||s.addIssue({code:Q.ZodIssueCode.custom,message:`Invalid file type "${a.mimetype}". Accepted types: ${e.accept.join(", ")}`})),r!==void 0&&a.size<r&&s.addIssue({code:Q.ZodIssueCode.custom,message:`File size ${pe(a.size)} is below minimum ${pe(r)}`}),t!==void 0&&a.size>t&&s.addIssue({code:Q.ZodIssueCode.custom,message:`File size ${pe(a.size)} exceeds maximum ${pe(t)}`}),a.size<0&&s.addIssue({code:Q.ZodIssueCode.custom,message:"File size cannot be negative"}),(!a.mimetype||a.mimetype.trim()==="")&&s.addIssue({code:Q.ZodIssueCode.custom,message:"File must have a MIME type"})});return o._isFileSchema=!0,o}function dt(e,t=!1){return z({name:"RequestValidator",debug:t,handler:async({ctx:r,next:n})=>{if(e.params&&r.request.params)try{r.request.params=st(r.request.params,e.params)}catch(o){let i=fe(o),s=i.reduce((a,c)=>a+c.messages.length,0);throw new b("Request validation failed",{fields:i,errorCount:s,section:"params"})}if(e.query&&r.request.query)try{r.request.query=at(r.request.query,e.query)}catch(o){let i=fe(o),s=i.reduce((a,c)=>a+c.messages.length,0);throw new b("Request validation failed",{fields:i,errorCount:s,section:"query"})}if(e.body)try{r.request.body=it(r.request.body,e.body)}catch(o){let i=fe(o),s=i.reduce((a,c)=>a+c.messages.length,0);throw new b("Request validation failed",{fields:i,errorCount:s,section:"body"})}if(e.files)try{r.request.files=kr(r.request.files,e.files)}catch(o){let i=fe(o),s=i.reduce((a,c)=>a+c.messages.length,0);throw new b("Request validation failed",{fields:i,errorCount:s,section:"files"})}await n()}})}function ti(e){return e!==null&&typeof e=="object"&&"type"in e&&"status"in e&&"correlationId"in e&&"timestamp"in e}function pt(e){return z({name:"ResponseValidator",handler:async({ctx:t,next:r})=>{let n=t.response.json,o=!0;t.response.json=(i,s)=>{if(!o||ti(i))return n.call(t.response,i,s);try{let a=ct(i,e);return n.call(t.response,a,s)}catch(a){throw o=!1,new Y("Response validation failed",{validationError:fe(a),hint:"The handler returned data that does not match the response schema"})}};try{await r()}catch(i){throw o=!1,t.response.json=n,i}finally{t.response.json=n}}})}function fe(e){if(e instanceof ei.ZodError){let t=new Map;for(let r of e.issues){let n=r.path.length>0?r.path.join("."):"root";t.has(n)||t.set(n,[]),t.get(n).push(r.message)}return Array.from(t.entries()).map(([r,n])=>({field:r,messages:n}))}return e instanceof Error?[{field:"unknown",messages:[e.message]}]:[{field:"unknown",messages:[String(e)]}]}async function ft(e,t,r,n,o){let i=[...t.middleware||[]];t.schema&&((t.schema.params||t.schema.query||t.schema.body)&&i.unshift(dt(t.schema)),t.schema.response&&i.push(pt(t.schema.response))),await G([...i])({ctx:e,next:async()=>{let a=n.child({route:e.request.path,method:e.request.method}),c=await t.handler({ctx:e,params:r,logger:a,eventBus:o});!e.response.sent&&c!==void 0&&e.response.json(c)},logger:n,eventBus:o})}function Lr(){return{routesByPath:new Map,routesByFile:new Map,pathToFile:new Map}}function N(e,t,r){console.log(`Updating routes from file: ${t}`);let n=e.routesByFile.get(t)||new Set,o=new Set(r.map(l=>l.path)),i=r.filter(l=>!n.has(l.path)),s=Array.from(n).filter(l=>!o.has(l)),c=r.filter(l=>n.has(l.path)).filter(l=>{let u=e.routesByPath.get(l.path);return!u||!ni(u,l)});return ri(e,t,{added:i,removed:s,changed:c}),{added:i,removed:s,changed:c}}function Or(e){return Array.from(e.routesByPath.values())}function ri(e,t,r){let{added:n,removed:o,changed:i}=r;o.forEach(a=>{e.routesByPath.delete(a),e.pathToFile.delete(a)}),[...n,...i].forEach(a=>{e.routesByPath.set(a.path,a),e.pathToFile.set(a.path,t)});let s=new Set([...n.map(a=>a.path),...i.map(a=>a.path),...Array.from(e.routesByFile.get(t)||[]).filter(a=>!o.includes(a))]);s.size>0?e.routesByFile.set(t,s):e.routesByFile.delete(t)}function ni(e,t){if(e.path!==t.path)return!1;let r=Object.keys(e).filter(o=>o!=="path").sort(),n=Object.keys(t).filter(o=>o!=="path").sort();return r.length!==n.length?!1:r.every(o=>{let i=e[o],s=t[o];return typeof i==typeof s})}function mt(e,t){Object.entries(e).forEach(([r,n])=>{r==="path"||!n||t.add(e.path,r,n)})}function me(e,t){"remove"in t&&typeof t.remove=="function"?t.remove(e):console.warn("Matcher does not support selective removal, consider adding remove() method")}function _r(e,t){me(e.path,t),mt(e,t)}var oi={routesDir:"./routes",basePath:"/",watchMode:process.env.NODE_ENV==="development"};function Ar(e){let t={...oi,...e};e.basePath&&!e.basePath.startsWith("/")&&console.warn("Base path does nothing");let r=Lr(),n=ie(),o=!1,i=null,s=null,a=new Set([t.routesDir]);function c(d){console.log(`
43
+ \u{1F527} APPLYING MATCHER CHANGES:`),console.log(` Adding ${d.added.length} routes`),console.log(` Removing ${d.removed.length} routes`),console.log(` Updating ${d.changed.length} routes`),d.removed.forEach(p=>{console.log(` \u2796 Removing: ${p}`),me(p,n)}),d.added.forEach(p=>{let g=Object.keys(p).filter(f=>f!=="path");console.log(` \u2795 Adding: ${p.path} [${g.join(", ")}]`),mt(p,n)}),d.changed.forEach(p=>{let g=Object.keys(p).filter(f=>f!=="path");console.log(` \u{1F504} Updating: ${p.path} [${g.join(", ")}]`),_r(p,n)}),console.log(`\u2705 Matcher changes applied
44
+ `)}function l(d,p){try{let g=N(r,p,d);return c(g),g}catch(g){throw console.error(`\u26A0\uFE0F Route conflicts from ${p}:`,g),g}}async function u(d,p,g){try{let f=await Mr(d),S=f.map(O=>g?{...O,path:`${g}${O.path}`}:O),w=l(S,p);console.log(`Loaded ${f.length} routes from ${p}${g?` with prefix ${g}`:""} (${w.added.length} added, ${w.changed.length} changed, ${w.removed.length} removed)`)}catch(f){throw console.error(`\u26A0\uFE0F Failed to load routes from ${p}:`,f),f}}async function m(){return o||i||(i=(async()=>{try{await Promise.all(Array.from(a).map(d=>u(d,d))),t.watchMode&&v(),o=!0}catch(d){throw console.error("\u26A0\uFE0F Failed to initialize router:",d),d}})()),i}function v(){s||(s=new Map);for(let d of a)if(!s.has(d)){let p=ot(d,{debounceMs:16,ignore:["node_modules",".git"],onRouteAdded:(g,f)=>{try{let S=N(r,g,f);c(S)}catch(S){console.error(`Error adding routes from ${d}:`,S)}},onRouteChanged:rt(async(g,f)=>{try{console.log(`Processing changes for ${g}`);let S=N(r,g,f);console.log(`Changes detected: ${S.added.length} added, ${S.changed.length} changed, ${S.removed.length} removed`),c(S),console.log(`Route changes applied: ${S.added.length} added, ${S.changed.length} changed, ${S.removed.length} removed`)}catch(S){console.error(`\u26A0\uFE0F Error updating routes from ${d}:`,S)}},d),onRouteRemoved:(g,f)=>{console.log(`File removed: ${g} with ${f.length} routes`);try{f.forEach(S=>{me(S.path,n)}),tt(g)}catch(S){console.error(`\u26A0\uFE0F Error removing routes from ${g}:`,S)}},onError:g=>{console.error(`\u26A0\uFE0F Route watcher error for ${d}:`,g)}});s.set(d,p)}}function E(d,p){s||(s=new Map);let g=ot(d,{debounceMs:16,ignore:["node_modules",".git"],onRouteAdded:(f,S)=>{try{let w=S.map(H=>p?{...H,path:`${p}${H.path}`}:H),O=N(r,f,w);c(O)}catch(w){console.error(`\u26A0\uFE0F Error adding routes from ${d}:`,w)}},onRouteChanged:rt(async(f,S)=>{try{let w=S.map(H=>p?{...H,path:`${p}${H.path}`}:H),O=N(r,f,w);c(O)}catch(w){console.error(`\u26A0\uFE0F Error updating routes from ${d}:`,w)}},d),onRouteRemoved:(f,S)=>{try{S.forEach(w=>{let O=p?`${p}${w.path}`:w.path;me(O,n)}),tt(f)}catch(w){console.error(`Error removing routes from ${f}:`,w)}},onError:f=>{console.error(`\u26A0\uFE0F Route watcher error for ${d}:`,f)}});return s.set(d,g),g}let C=m();return C.catch(()=>{}),{ready:C,async handleRequest(d,p,g){await i;let{method:f,path:S}=d.request;console.log(`
45
+ \u{1F4E5} Handling request: ${f} ${S}`);let w=n.match(S,f);if(!w)throw console.log(`\u274C No match found for: ${f} ${S}`),new W("Not found");if(console.log(`\u2705 Route matched: ${f} ${S}`),console.log(` Params: ${JSON.stringify(w.params)}`),w.methodNotAllowed){d.response.status(405).json({error:"\u274C Method Not Allowed",allowed:w.allowedMethods}),w.allowedMethods&&w.allowedMethods.length>0&&d.response.header("Allow",w.allowedMethods.join(", "));return}d.request.params=w.params,await ft(d,w.route,w.params,p,g)},getRoutes(){return Or(r)},addRoute(d){let p=N(r,"programmatic",[d]);c(p)},addRoutes(d){let p=N(r,"programmatic",d);return c(p),p},async addRouteDirectory(d,p={}){if(a.has(d)){console.warn(`Route directory ${d} already registered`);return}a.add(d),o&&(await u(d,d,p.prefix),t.watchMode&&E(d,p.prefix))},getRouteConflicts(){return[]},async close(){if(s){for(let d of s.values())await d.close();s.clear()}}}}var P={port:3e3,host:"localhost",routesDir:"./routes",http2:{enabled:!0},eventSchemas:{},middleware:[],plugins:[],bodyLimits:{json:512*1024,form:1024*1024,text:5*1024*1024,raw:10*1024*1024,multipart:{maxFileSize:50*1024*1024,maxTotalSize:100*1024*1024,maxFiles:10,maxFieldSize:1024*1024}}};function ci(e={}){let t={port:e.port??P.port,host:e.host??P.host,routesDir:e.routesDir??P.routesDir,http2:{enabled:e.http2?.enabled??P.http2.enabled,keyFile:e.http2?.keyFile,certFile:e.http2?.certFile},eventSchemas:e.eventSchemas||P.eventSchemas,middleware:e.middleware??P.middleware,plugins:e.plugins??P.plugins,correlation:e.correlation,cors:e.cors,bodyLimits:e.bodyLimits?{json:e.bodyLimits.json??P.bodyLimits.json,form:e.bodyLimits.form??P.bodyLimits.form,text:e.bodyLimits.text??P.bodyLimits.text,raw:e.bodyLimits.raw??P.bodyLimits.raw,multipart:{maxFileSize:e.bodyLimits.multipart?.maxFileSize??P.bodyLimits.multipart.maxFileSize,maxTotalSize:e.bodyLimits.multipart?.maxTotalSize??P.bodyLimits.multipart.maxTotalSize,maxFiles:e.bodyLimits.multipart?.maxFiles??P.bodyLimits.multipart.maxFiles,maxFieldSize:e.bodyLimits.multipart?.maxFieldSize??P.bodyLimits.multipart.maxFieldSize}}:P.bodyLimits,logging:e.logging||P.logging,serverId:e.serverId};try{let r=vr(t);return Ht({routesDir:r.routesDir}),r}catch(r){throw r instanceof Error?new Error(`Failed to create server: ${r.message}`):new Error(`Failed to create server: ${String(r)}`)}}function li(e){e.correlation&&Et(e.correlation.headerName,e.correlation.generator)}function ui(e,t){return async()=>(li(t),await e.pluginManager.registerPlugins(e),await e.pluginManager.initializePlugins(e),await hr(e,t),await e.pluginManager.onServerStart(e,e.server),di(e),e)}function di(e){let t=Sr(()=>e.close());e._signalHandlers=t,e.events.emit("started")}function pi(e){return async t=>{if(!e.server)return;let r={...t};e._signalHandlers&&(e._signalHandlers.unregister(),delete e._signalHandlers),await yr(e,r)}}function fi(e){return t=>{let r=Array.isArray(t)?t:[t];return e.middleware.push(...r),e}}function mi(e){return async t=>{if(Array.isArray(t))for(let r of t)et(r),e.plugins.push(r);else et(t),e.plugins.push(t);return e}}function gt(e={}){let t=ci(e),{port:r,host:n,middleware:o,plugins:i,cors:s,bodyLimits:a,serverId:c}=t,l=c||si(),u=M(t.logging||{});ve(t.logging||{});let m=Array.isArray(o)?[...o]:[],v=Array.isArray(i)?[...i]:[],E=new ii,C=Ar({routesDir:t.routesDir,watchMode:process.env.NODE_ENV==="development"}),k=wr({continueOnError:!0}),d=new ai,p=new ee(l,u),g=we(p,{schemas:t.eventSchemas},u),f={server:null,port:r,host:n,context:E,events:d,plugins:[...v],middleware:[...m],corsOptions:s,bodyLimits:a,_signalHandlers:{unregister:()=>{}},_logger:u,use:()=>f,register:async()=>f,listen:async()=>f,close:async()=>{},router:C,pluginManager:k,eventBus:g,serverId:l};return f.listen=ui(f,t),f.close=pi(f),f.use=fi(f),f.register=mi(f),f}function Ir(e){return{}}function Fl(e){return typeof e=="object"&&e!==null&&"name"in e&&"execute"in e&&typeof e.name=="string"&&typeof e.execute=="function"}function Ll(e){return typeof e=="object"&&e!==null&&"name"in e&&"version"in e&&"register"in e&&typeof e.name=="string"&&typeof e.version=="string"&&typeof e.register=="function"}function Ol(e){return e}function _l(e){return e}function Al(...e){return e}function Il(...e){return e}var ht=class extends T{constructor(t,r=void 0,n=void 0){super("UNAUTHORIZED",t,401,n??y(),r)}};var yt=class extends T{constructor(t,r=void 0,n=void 0){super("CONFLICT",t,409,n??y(),r)}};var St=class extends T{constructor(t,r=void 0,n=void 0){super("RATE_LIMITED",t,429,n??y(),r)}};var vt=class extends T{constructor(t,r,n){super("UPLOAD_TIMEOUT",t,408,n??y(),r)}};var wt=class extends T{constructor(t,r,n){super("UNPROCESSABLE_ENTITY",t,422,n??y(),r)}};var Tt=class extends T{constructor(t,r=void 0,n=void 0){super("SERVICE_UNAVAILABLE",t,503,n??y(),r)}};var gi=xt.version,hi={createServer:gt,inferContext:Ir},yi={createDeleteRoute:Qe,createGetRoute:je,createHeadRoute:Ge,createOptionsRoute:Je,createPatchRoute:Ze,createPostRoute:Ve,createPutRoute:We,createRouteFactory:Zt,createMatcher:ie,extractParams:J,compilePathPattern:oe,paramsToQuery:Pe,buildUrl:Ke},Si={createMiddleware:z,createServiceMiddleware:Ie,createStateMiddleware:Ae,compose:G,cors:Te,requestLoggerMiddleware:Nt},vi={createPlugin:He},Au={createTypedEventBus:we,createServer:gt,createMiddleware:z,createServiceMiddleware:Ie,createStateMiddleware:Ae,createPlugin:He,getCorrelationId:y,configureGlobalLogger:ve,createLogger:M,logger:x,file:Fr,Server:hi,Router:yi,Middleware:Si,Plugins:vi,VERSION:gi};export{Au as Blaize,T as BlaizeError,yt as ConflictError,$ as ConsoleTransport,wi as ErrorSeverity,F as ErrorType,j as EventValidationError,te as ForbiddenError,Y as InternalServerError,Z as JSONTransport,X as Logger,ee as MemoryEventBus,Si as MiddlewareAPI,W as NotFoundError,Se as NullTransport,U as PayloadTooLargeError,vi as PluginsAPI,St as RateLimitError,vt as RequestTimeoutError,yi as RouterAPI,hi as ServerAPI,Tt as ServiceNotAvailableError,ht as UnauthorizedError,wt as UnprocessableEntityError,he as UnsupportedMediaTypeError,gi as VERSION,b as ValidationError,Ol as asMiddlewareArray,_l as asPluginArray,Ke as buildUrl,oe as compilePathPattern,G as compose,ve as configureGlobalLogger,Te as cors,Qe as createDeleteRoute,je as createGetRoute,Ge as createHeadRoute,M as createLogger,ie as createMatcher,z as createMiddleware,Al as createMiddlewareArray,Je as createOptionsRoute,Ze as createPatchRoute,He as createPlugin,Il as createPluginArray,Ve as createPostRoute,We as createPutRoute,Zt as createRouteFactory,gt as createServer,Ie as createServiceMiddleware,Ae as createStateMiddleware,we as createTypedEventBus,J as extractParams,Fr as file,y as getCorrelationId,Ir as inferContext,Fl as isMiddleware,Ll as isPlugin,x as logger,Pe as paramsToQuery,Nt as requestLoggerMiddleware};
47
46
  //# sourceMappingURL=index.js.map