{"_id":"@asenajs/ergenecore","_rev":"13-3c059b1f06758b88608b0cf170be8b9e","name":"@asenajs/ergenecore","dist-tags":{"latest":"4.0.0"},"versions":{"1.0.0":{"name":"@asenajs/ergenecore","version":"1.0.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@1.0.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"85954d3c8488b07d0d4b71730f75aa55439973ba","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-1.0.0.tgz","fileCount":57,"integrity":"sha512-XiDAgCf3bYnkt/nz5TpVwVlNga5tRNh9Gg077suXVrMC5FJTlZ1qchCKwsFjgwMDXOwDIRubqPFhFPRfG7ukNw==","signatures":[{"sig":"MEQCIF5ajnpH7/SA/V+YzhMvHBTdGlZlEQ2yK7jM0IB7eOV+AiAjguGtS2DMGfHG7uy80tABRpH+MOufj3E8FJV7JakGTw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":247050},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"398d47eb922b1fb730fd60f8335890992488f6e3","scripts":{"test":"bun test","build":"bun run clean && tsc","clean":"rm -rf dist","benchmark":"bun run benchmark/run-benchmark.ts","test:watch":"bun test --watch","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"11.6.2","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"24.9.0","dependencies":{"zod":"^4.1.12"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.1","prettier":"^3.6.2","@types/bun":"latest","@changesets/cli":"^2.29.7","eslint-plugin-n":"^16.6.2","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.4","@typescript-eslint/eslint-plugin":"^6.21.0"},"peerDependencies":{"typescript":"^5.8.2","@asenajs/asena":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_1.0.0_1760632283218_0.19400547753467712","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@asenajs/ergenecore","version":"1.1.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@1.1.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"19c33308d693946925ab603252409ea35ef87945","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-1.1.0.tgz","fileCount":57,"integrity":"sha512-tBg4CBfJQWIQU7lgk1mrfQLY4/4Wex4RLxjfyCMYLzUAgUUikN+RViVtYET7xUSFqssRZ9FIRxihUsbsIO2UPw==","signatures":[{"sig":"MEQCIAjbeRyKZfV5EpRaHgeeRiQkQPU8HUhFBNzXS7Y0ShWnAiB7kNpdUug5gWdrQ28vzXcfMlbVtRMoZ4Mfqm6pzQhr8w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248006},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"905a36eb08a47c911ec70d2bc894e58f7830f55e","scripts":{"test":"bun test","build":"bun run clean && tsc","clean":"rm -rf dist","benchmark":"bun run benchmark/run-benchmark.ts","test:watch":"bun test --watch","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"11.6.2","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"24.9.0","dependencies":{"zod":"^4.1.12"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.1","prettier":"^3.6.2","@types/bun":"latest","@changesets/cli":"^2.29.7","eslint-plugin-n":"^16.6.2","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.4","@typescript-eslint/eslint-plugin":"^6.21.0"},"peerDependencies":{"typescript":"^5.8.2","@asenajs/asena":"^0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_1.1.0_1761007559127_0.3110664830378387","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@asenajs/ergenecore","version":"1.2.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@1.2.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"2f688e08b78e8023bdebe6c3f46d83533c61b5c8","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-1.2.0.tgz","fileCount":57,"integrity":"sha512-xYtKDxO3L0mPR1tPP/ayNyTjVfX/goTTFkk4O+zyT3ZZIFTv9egrqCrZjE+I9pKu2hiJbEiqHFEivbqddRslTw==","signatures":[{"sig":"MEYCIQCyjUP+kCkWdv5ZeckbZu7Kbgyj5ladRGTC2CplZOuhOQIhAJL8BJmXeSWGpoUQQash4EtD6ZkAwzQsOX+wljhHLbLl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248156},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"a4a12843033fec8a1d677ddba7cc6662fb63473b","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"11.6.2","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"25.1.0","dependencies":{"zod":"^4.1.12"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.0","prettier":"^3.6.2","@types/bun":"latest","@asenajs/asena":"latest","@changesets/cli":"^2.29.7","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.46.2","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.4","@typescript-eslint/parser":"^8.46.2","@typescript-eslint/eslint-plugin":"^8.46.2"},"peerDependencies":{"typescript":"^5.8.2","@asenajs/asena":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_1.2.0_1762120906082_0.20830084074988364","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@asenajs/ergenecore","version":"1.3.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@1.3.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"e86ce76a4c70345221eb2d4a931f8e5516918991","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-1.3.0.tgz","fileCount":69,"integrity":"sha512-NLBvH5nQwIX5gmQSfpvE0atw4q53OkwmY+5TfCzzjlkZlauLPyJP90FZlpk5xqjL/qgQM+qe7hXyk/QMKQ7Vdw==","signatures":[{"sig":"MEQCIDmYjeQwyGeqv3WI0qO6thgakXiYpOCLoKFKKAZruz7JAiA8XeOKEGd1bCoEoZ3zIR4TV+5LoApjQMmZGKvhdtASRw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":272732},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"342b1831bbb00151ad21dac545dff69edec42ee9","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"11.12.1","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"25.9.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","prettier":"^3.8.1","@types/bun":"latest","@asenajs/asena":"^0.7.0","@changesets/cli":"^2.30.0","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.58.0","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.0","@typescript-eslint/eslint-plugin":"^8.58.0"},"peerDependencies":{"typescript":"^5.8.2","@asenajs/asena":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_1.3.0_1775520812246_0.30584106697969116","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@asenajs/ergenecore","version":"1.3.1","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@1.3.1","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"6a4dca50f29044c839af153a28097db8a16cea3a","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-1.3.1.tgz","fileCount":69,"integrity":"sha512-jUyRS8yxeDUyGCFtRO+vfHvYyUX17vj1Af/29i1ah4S3+0yY5v455f74GZvH71DMUbHMex1qsuxd+43FlhCftQ==","signatures":[{"sig":"MEUCIBnzWF1/sR5j0/+PV8vbDAjRu4BPrD7W8qurU3xz73MGAiEAozVDu+1LOBi2bMxl8QzvfYKgwd9fyPIJEM1ZBW8zGZw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277424},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"32a3d0d2af698a2d6f2b93886f2e692f36517e33","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"11.12.1","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"25.9.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","prettier":"^3.8.2","@types/bun":"latest","@asenajs/asena":"^0.7.1","@changesets/cli":"^2.30.0","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.58.1","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"peerDependencies":{"typescript":"^5.9.3","@asenajs/asena":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_1.3.1_1775938308546_0.5105550142965252","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@asenajs/ergenecore","version":"1.4.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@1.4.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"a514d558e866a8128e9656eb533250fac5260853","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-1.4.0.tgz","fileCount":69,"integrity":"sha512-DrAIkSGnPDX9VwXePAhPWFywtz8FcsnbTztRgiN6shPzmv6yX3vtamPLBkMqwx7iMFHfFUBPah/T9OmZz+uZmA==","signatures":[{"sig":"MEQCID/LVN5M7D5k2hBvOtJ1Nde8ZiovlpapMxSZfXsTzSplAiAo731dbqzIUC5JjQhaLeBRw1SoVxyrozrrcxeRrB1N7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278768},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"6370abd721864fd5f6ce8bd053635086078e1c78","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"12.0.1","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"26.5.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","prettier":"^3.8.2","@types/bun":"latest","@asenajs/asena":"^0.8.0","@changesets/cli":"^2.30.0","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.58.1","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"peerDependencies":{"typescript":"^5.9.3","@asenajs/asena":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_1.4.0_1785006040399_0.6273414814411076","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@asenajs/ergenecore","version":"1.5.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@1.5.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"cbe1530f69aaff36f98c004552b000b1386748c7","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-1.5.0.tgz","fileCount":69,"integrity":"sha512-eBzSNZXFgByThnBVTAZ6WZBleO24Zu7CilP2IzkunJB8vQrqmnFhSRXVFHDiMAXJyafsd2IjVwrv3wCIN5qRug==","signatures":[{"sig":"MEUCIQCkkglL/AtzkJ0hYtXx5QxGRR35eGDTcaVdEhJ390UiagIgGasasDo5v/RLlk4j9MNDj7mRluJrKH1w0XxICyjYAsA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":283679},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"d727504095909e0ddc516d8bf81f147720974cc9","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"12.0.1","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"26.5.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","prettier":"^3.8.2","@types/bun":"latest","@asenajs/asena":"^0.8.1","@changesets/cli":"^2.30.0","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.58.1","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"peerDependencies":{"typescript":"^5.9.3","@asenajs/asena":"^0.8.1"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_1.5.0_1785090271733_0.906637743610341","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@asenajs/ergenecore","version":"2.0.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@2.0.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"b5102e5493b5025771a636b14a3fb6227069daaa","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-2.0.0.tgz","fileCount":69,"integrity":"sha512-ngyeyaMTkoLGnRQDxMNWIMYvW3q+tugnFi/79N+zLSXHj2Z42+mdtN3unERazEFPXiqzB/fsDBNMx+ueuQV/8Q==","signatures":[{"sig":"MEQCIDRYsDB7uBGLnJZGWcLAzKBSnSoYQ2MscGKWjG8aaoIPAiBaSuCZveF3Fc39bu00inbvZyGpzF+A/wdQuM1g+jMs0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":290498},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","engines":{"bun":">=1.3.12"},"gitHead":"c40a36c38174388ced562c78284b483eb632774d","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","check:fix":"bun run lint:fix && bun run format","typecheck":"tsc -p tsconfig.typecheck.json","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"12.0.1","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"26.5.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","prettier":"^3.8.2","@types/bun":"latest","@asenajs/asena":"^0.9.0","@changesets/cli":"^2.30.0","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.58.1","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"peerDependencies":{"typescript":"^5.9.3","@asenajs/asena":"^0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_2.0.0_1785196322974_0.6329844357717607","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@asenajs/ergenecore","version":"3.0.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@3.0.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"927e18587b6293a3880a8f854bc1f6c39d60d5f7","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-3.0.0.tgz","fileCount":69,"integrity":"sha512-fX57Wnl6yDEyLGVYPONsgtGsL0mm/rwXiD365qOIRFwXtKqcFOBBmJBocALjC8lXicC4yxomTN61GoJWNyCurQ==","signatures":[{"sig":"MEYCIQCF6NLDdkCVXPeWxe1DL1ifjHpbf3+NJBBC1wSmyUaoHAIhAMx8NimhIdDjMvVxhpCz4GavVU+j8RguajR/aEppbLBK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":293004},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","engines":{"bun":">=1.3.12"},"gitHead":"e2b4385894c9e2846d57caf0710d50e482800d3d","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","typecheck":"tsc -p tsconfig.typecheck.json","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"12.0.1","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","eslint":"^9.39.4","prettier":"^3.8.2","@types/bun":"latest","typescript":"^5.9.3","@asenajs/asena":"^0.10.0","@changesets/cli":"^2.30.0","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.58.1","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"peerDependencies":{"zod":"^4.3.6","typescript":"^5.9.3","@asenajs/asena":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_3.0.0_1785360296609_0.3698894442453631","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@asenajs/ergenecore","version":"3.1.0","author":"LibirSoft","license":"MIT","_id":"@asenajs/ergenecore@3.1.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"8a82f70f93958df16f886e371950105e1fc63799","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-3.1.0.tgz","fileCount":69,"integrity":"sha512-ceUK8hzrK74vyMAztp6sE3tBG2RouoszPj47j0W/RDpUU4KJjYTmKdJdTpEgXF3YhLw6MSIp9teYsPkG3La8BA==","signatures":[{"sig":"MEUCIQCQTwQ/xFkA1OgDrdPBV/J9XAnZnsq3PcBc9lj1BUNnggIgLdphy0K/ioWfqsTJksFM+0m0lILyMbSp3GUFalBADRw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":302860},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","shasum":"8a82f70f93958df16f886e371950105e1fc63799","engines":{"bun":">=1.3.12"},"scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","typecheck":"tsc -p tsconfig.typecheck.json","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_integrity":"sha512-ceUK8hzrK74vyMAztp6sE3tBG2RouoszPj47j0W/RDpUU4KJjYTmKdJdTpEgXF3YhLw6MSIp9teYsPkG3La8BA==","_npmVersion":"10.8.3","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","eslint":"^9.39.4","prettier":"^3.8.2","@types/bun":"latest","typescript":"^5.9.3","@asenajs/asena":"^0.10.1","@changesets/cli":"^2.30.0","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.58.1","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"peerDependencies":{"zod":"^4.3.6","typescript":"^5.9.3","@asenajs/asena":"^0.10.1"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_3.1.0_1786916861808_0.3683293471510318","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@asenajs/ergenecore","version":"3.2.0","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@3.2.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"62cde2dc62d6430091cfc5c7522d3ad07caa3670","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-3.2.0.tgz","fileCount":69,"integrity":"sha512-T1JiypGJJ0XNcQnBhhsk7uKkh0JgOBT01teClxkWJrCI3hKxESbdtKE6VIVFRdCK2YR+DZVXLlAWVnZ5unmH2w==","signatures":[{"sig":"MEUCIFDNa2BRkHGjCzltDErI4Ru2r2tXXL/Si3L2FooDqmY+AiEAuFES4tD3LeXgWjRErzjkeDF1gHeB0KehUe4BjP7a7jI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311633},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","engines":{"bun":">=1.3.12"},"gitHead":"d929434acec70c6f7f2573351b771d8139e43906","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","typecheck":"tsc -p tsconfig.typecheck.json","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"12.0.2","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"26.7.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","eslint":"^9.39.5","prettier":"^3.9.6","@types/bun":"latest","typescript":"^5.9.3","@asenajs/asena":"^0.10.1","@changesets/cli":"^2.31.1","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.67.0","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.67.0","@typescript-eslint/eslint-plugin":"^8.67.0"},"peerDependencies":{"zod":"^4.3.6","typescript":"^5.9.3","@asenajs/asena":"^0.10.1"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_3.2.0_1787160488999_0.8364460794093556","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"@asenajs/ergenecore","version":"3.2.1","author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/ergenecore@3.2.1","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"dist":{"shasum":"d02ff6a3e3c76eea6a729cad0783631f6ee24550","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-3.2.1.tgz","fileCount":69,"integrity":"sha512-ZpE4iZh80vkJXPk8GuwDPGL83p3JD/okW4TGnA33+b988x8DDkJ9IKujUzR/Mm6wtcITfZP6rK+EAdDuuLOhaQ==","signatures":[{"sig":"MEUCIHhE0FbjTZvs2V/41TUuTcZpSytniB/BGva4ad3GVFbCAiEAxuP0O+iWAEwjy2wXa3nKJzRmXAmOiTbSpu/mPaRgAwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313706},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","engines":{"bun":">=1.3.12"},"gitHead":"3ccf4278eea41b752448c90350af235a086be3ad","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","benchmark":"bun run benchmark/run-benchmark.ts","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","typecheck":"tsc -p tsconfig.typecheck.json","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"_npmVersion":"12.0.2","description":"Ergenecore is native bun server adapter for asenajs","directories":{},"_nodeVersion":"26.7.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","eslint":"^9.39.5","prettier":"^3.9.6","@types/bun":"latest","typescript":"^5.9.3","@asenajs/asena":"^0.10.1","@changesets/cli":"^2.31.1","eslint-plugin-n":"^16.6.2","typescript-eslint":"^8.67.0","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.67.0","@typescript-eslint/eslint-plugin":"^8.67.0"},"peerDependencies":{"zod":"^4.3.6","typescript":"^5.9.3","@asenajs/asena":"^0.10.1"},"_npmOperationalInternal":{"tmp":"tmp/ergenecore_3.2.1_1787397520499_0.257506927629211","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@asenajs/ergenecore","module":"index.ts","description":"Ergenecore is native bun server adapter for asenajs","main":"dist/index.js","types":"dist/index.d.ts","version":"4.0.0","author":{"name":"LibirSoft"},"license":"MIT","engines":{"bun":">=1.4.0"},"scripts":{"test":"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage","build":"bun run clean && tsc","typecheck":"tsc -p tsconfig.typecheck.json","clean":"rm -rf dist","prepublishOnly":"bun run build","benchmark":"bun run benchmark/run-benchmark.ts","benchmark:native":"bun run benchmark/native-bun.ts","benchmark:ergenecore":"bun run benchmark/ergenecore.ts","lint":"eslint .","lint:fix":"eslint . --fix","format":"prettier --write .","format:check":"prettier --check .","check":"bun run lint && bun run format:check","check:fix":"bun run lint:fix && bun run format","changeset":"changeset","version":"changeset version","release":"bun run build && changeset publish"},"devDependencies":{"@asenajs/asena":"^0.11.0","@changesets/cli":"^2.31.1","@types/bun":"latest","@typescript-eslint/eslint-plugin":"^8.68.0","@typescript-eslint/parser":"^8.68.0","eslint":"^9.39.5","eslint-config-alloy":"^5.1.2","eslint-config-prettier":"^9.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-n":"^16.6.2","eslint-plugin-prettier":"^5.5.6","eslint-plugin-promise":"^6.6.0","prettier":"^3.9.6","typescript":"^5.9.3","typescript-eslint":"^8.68.0","zod":"^4.4.3"},"peerDependencies":{"@asenajs/asena":"^0.11.0","typescript":"^5.9.3","zod":"^4.3.6"},"gitHead":"b2b284d27201ab80e3c191f360bdcaf21e202252","_id":"@asenajs/ergenecore@4.0.0","_nodeVersion":"26.7.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-BNRClCCHdrQcoPzCbPLoBMZMDD77KSMS/MZ3FJR1/2QdaMHUcMG8iLqRH+WNu7/LDyMaHH/50JXOIXD5a/8gfg==","shasum":"9572998165f642cf49c104b9ce37569dab16eea9","tarball":"https://registry.npmjs.org/@asenajs/ergenecore/-/ergenecore-4.0.0.tgz","fileCount":69,"unpackedSize":316380,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDG55bN4L1ViqmMC2rYbZoTEhV+TfIg8oX6mK/ajKMb+AIgBBsCjkKPr5akO7KUjwjwdGafdB5r6MFE79uDpcSAIcs="}]},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"directories":{},"maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ergenecore_4.0.0_1787695280614_0.4131597459340397"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-16T16:31:23.120Z","modified":"2026-08-25T22:01:20.984Z","1.0.0":"2025-10-16T16:31:23.422Z","1.1.0":"2025-10-21T00:45:59.343Z","1.2.0":"2025-11-02T22:01:46.289Z","1.3.0":"2026-04-07T00:13:32.414Z","1.3.1":"2026-04-11T20:11:48.705Z","1.4.0":"2026-07-25T19:00:40.534Z","1.5.0":"2026-07-26T18:24:31.913Z","2.0.0":"2026-07-27T23:52:03.126Z","3.0.0":"2026-07-29T21:24:56.879Z","3.1.0":"2026-08-16T21:47:41.951Z","3.2.0":"2026-08-19T17:28:09.156Z","3.2.1":"2026-08-22T11:18:40.649Z","4.0.0":"2026-08-25T22:01:20.763Z"},"author":{"name":"LibirSoft"},"license":"MIT","description":"Ergenecore is native bun server adapter for asenajs","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"readme":"# Asena Ergenecore Adapter\n\n[![Version](https://img.shields.io/badge/version-4.0.0-blue.svg)](https://asena.sh)\n[![Bun Version](https://img.shields.io/badge/Bun-1.4%2B-blueviolet)](https://bun.sh)\n\n**Blazing-fast** native Bun adapter for [Asena.js](https://github.com/asenajs/asena) - Built exclusively with Bun's native APIs for maximum performance.\n\nBuilt on Bun runtime for exceptional performance:\n\n| Framework                | Requests/sec          | Latency (avg) |\n|--------------------------|-----------------------|---------------|\n| **Asena + Ergenecore**   | **294962.61**         | **1.34ms**    |\n| Hono                     | 266476.83             | 1.49ms        |\n| **Asena + Hono-adapter** | **233182.35**         | **1.70ms**    |\n| NestJS (Bun)             | 100975.20             | 3.92ms        |\n| NestJS (Node)            | 88083.22              | 5.33ms        |\n\n> Benchmark: 12 threads, 400 connections, 120s duration, Hello World endpoint\n\n\n## Features\n\n- ⚡ **Zero Dependencies** - no runtime dependencies at all; Zod is a peer your project owns\n- 🚀 **SIMD-Accelerated** - Native Bun router with SIMD-optimized matching\n- 🔌 **Full Adapter Support** - HTTP, WebSocket, Middleware, Validation\n- 📦 **Zero-Copy File Serving** - Bun.file() for optimal static file performance\n- 🎯 **TypeScript First** - Complete type safety out of the box\n- ✅ **90%+ Test Coverage** - Thoroughly tested with 212+ passing tests\n- 🧩 **Controller-Based** - Seamless integration with Asena decorators\n\n## Why Ergenecore?\n\nErgenecore is the **fastest** Asena adapter because it:\n- Uses Bun's **native HTTP server** (`Bun.serve()`)\n- Leverages **SIMD-accelerated routing** (no framework overhead)\n- Implements **zero-copy** file serving with `Bun.file()`\n- Has **no runtime dependencies at all** (Zod is a peer your project owns)\n- Is optimized for **Bun runtime** exclusively\n\n## Requirements\n\n- [Bun](https://bun.sh) v1.4 or higher\n- [@asenajs/asena](https://github.com/AsenaJs/Asena) v0.11.0 or higher (peer dependency)\n- [Zod](https://zod.dev) v4.3.6 or higher (peer dependency)\n- TypeScript v5.9.3 or higher (peer dependency)\n\n## Installation\n\n```bash\nbun add @asenajs/ergenecore zod\n```\n\n`zod` is a **peer dependency** - the adapter defines the validation contract, your project owns the\nlibrary and its version.\n\n| Package manager | Command |\n|:--|:--|\n| bun, npm 7+, pnpm 8+ | `bun add zod` — peers auto-install, but declare them anyway so they survive a clean install |\n| yarn 1 | `yarn add zod` — **required**, yarn 1 does not install peers for you |\n\n\n## Quick Start\n\n### Basic Server Setup\n\n```typescript\nimport { AsenaServerFactory } from '@asenajs/asena';\nimport { createErgenecoreAdapter } from '@asenajs/ergenecore/factory';\nimport { logger } from './logger';\n\n// Create adapter with factory function\nconst adapter = createErgenecoreAdapter();\n\n// Create and start server\nconst server = await AsenaServerFactory.create({\n  adapter,\n  logger,\n  port: 3000\n});\n\nawait server.start();\n```\n\n### Controller Example\n\n```typescript\nimport { Controller } from '@asenajs/asena/decorators';\nimport { Get, Post, Put, Delete } from '@asenajs/asena/decorators/http';\nimport type { Context } from '@asenajs/ergenecore/types';\n\n@Controller('/users')\nexport class UserController {\n  @Get({ path: '/' })\n  async list(context: Context) {\n    const page = (await context.getQuery('page')) ?? '1';\n    return context.send({ users: [], page });\n  }\n\n  @Get({ path: '/:id' })\n  async getById(context: Context) {\n    const id = context.getParam('id');\n    return context.send({ id, name: 'John Doe' });\n  }\n\n  @Post({ path: '/' })\n  async create(context: Context) {\n    const body = await context.getBody();\n    return context.send({ created: true, data: body }, 201);\n  }\n\n  @Put({ path: '/:id' })\n  async update(context: Context) {\n    const id = context.getParam('id');\n    const body = await context.getBody();\n    return context.send({ id, updated: true, data: body });\n  }\n\n  @Delete({ path: '/:id' })\n  async delete(context: Context) {\n    const id = context.getParam('id');\n    return context.send({ id, deleted: true }, 204);\n  }\n}\n```\n\n## API Documentation\n\n### Factory Functions\n\n#### `createErgenecoreAdapter(options?)`\n\nCreates a new Ergenecore adapter instance with optional configuration.\n\n```typescript\nimport { AsenaServerFactory } from '@asenajs/asena';\nimport { createErgenecoreAdapter } from '@asenajs/ergenecore/factory';\nimport { logger } from './logger';\n\nconst adapter = createErgenecoreAdapter({\n  hostname: 'localhost',\n  enableWebSocket: true\n});\n\nconst server = await AsenaServerFactory.create({\n  adapter,\n  logger,\n  port: 3000\n});\n\nawait server.start();\n```\n\n**Options:**\n- `hostname` (string): Server hostname (default: undefined)\n- `logger` (ServerLogger): Custom logger instance (optional, can be passed to AsenaServerFactory)\n- `enableWebSocket` (boolean): Enable WebSocket support (default: true)\n- `websocketAdapter` (ErgenecoreWebsocketAdapter): Custom WebSocket adapter\n\n#### `createProductionAdapter(options?)`\n\nCreates a production-optimized adapter with sensible defaults.\n\n```typescript\nimport { AsenaServerFactory } from '@asenajs/asena';\nimport { createProductionAdapter } from '@asenajs/ergenecore/factory';\nimport { logger } from './logger';\n\nconst adapter = createProductionAdapter({\n  hostname: '0.0.0.0'\n});\n\nconst server = await AsenaServerFactory.create({\n  adapter,\n  logger,\n  port: 8080\n});\n\nawait server.start();\n```\n\n#### `createDevelopmentAdapter(options?)`\n\nCreates a development-friendly adapter with verbose logging.\n\n```typescript\nimport { AsenaServerFactory } from '@asenajs/asena';\nimport { createDevelopmentAdapter } from '@asenajs/ergenecore/factory';\nimport { logger } from './logger';\n\nconst adapter = createDevelopmentAdapter();\n\nconst server = await AsenaServerFactory.create({\n  adapter,\n  logger,\n  port: 3000\n});\n\nawait server.start();\n```\n\n### Context API\n\nThe `Context` type provides access to request/response handling:\n\n```typescript\nimport type { Context } from '@asenajs/ergenecore/types';\n\n// Get route parameters\nconst id = context.getParam('id');\n\n// Get query parameters (undefined when absent, '' when present but empty, e.g. \"?page=\")\nconst page = await context.getQuery('page');\n\n// Get request body\nconst body = await context.getBody();\n\n// Get a multipart/urlencoded body\nconst form = await context.getParseBody();\n\n// Get headers\nconst auth = context.getHeader('authorization');\n\n// Send JSON response\nreturn context.send({ success: true });\n\n// Send with custom status\nreturn context.send({ error: 'Not found' }, 404);\n\n// Set a response header (replaces any value already set for that header)\ncontext.setResponseHeader('X-Request-Id', 'abc');\n\n// Append to a response header, keeping existing values - for multi-valued\n// headers such as Vary and Link (Set-Cookie is not supported here; use setCookie)\ncontext.appendResponseHeader('Vary', 'Origin');\n\n// Set cookies\ncontext.setCookie('session', 'abc123', {\n  httpOnly: true,\n  secure: true,\n  maxAge: 86400\n});\n\n// Get cookies\nconst session = context.getCookie('session');\n```\n\n### Middleware\n\n#### Custom Middleware\n\n```typescript\nimport { Middleware } from '@asenajs/asena/decorators';\nimport { Controller } from '@asenajs/asena/decorators';\nimport { Get } from '@asenajs/asena/decorators/http';\nimport { MiddlewareService, type Context } from '@asenajs/ergenecore';\n\n@Middleware()\nexport class AuthMiddleware extends MiddlewareService {\n  async handle(context: Context, next: () => Promise<void>): Promise<any> {\n    const token = context.getHeader('authorization');\n\n    if (!token) {\n      return context.send({ error: 'Unauthorized' }, 401);\n    }\n\n    // Verify token and set user in context\n    context.setValue('userId', 123);\n\n    await next();\n  }\n}\n\n// Use in route\n@Controller('/admin')\nexport class AdminController {\n  @Get({ path: '/dashboard', middlewares: [AuthMiddleware] })\n  async dashboard(context: Context) {\n    const userId = context.getValue('userId');\n    return context.send({ userId, message: 'Admin dashboard' });\n  }\n}\n```\n\n#### CORS Middleware\n\nErgenecore comes with a built-in CORS middleware for handling Cross-Origin Resource Sharing:\n\n```typescript\nimport { Middleware } from '@asenajs/asena/decorators';\nimport { CorsMiddleware } from '@asenajs/ergenecore';\n\n// Allow all origins (default)\n@Middleware()\nexport class GlobalCors extends CorsMiddleware {\n  constructor() {\n    super(); // Defaults to { origin: '*' }\n  }\n}\n\n// Whitelist specific origins\n@Middleware()\nexport class RestrictedCors extends CorsMiddleware {\n  constructor() {\n    super({\n      origin: ['https://example.com', 'https://app.example.com'],\n      credentials: true,\n      methods: ['GET', 'POST', 'PUT', 'DELETE'],\n      allowedHeaders: ['Content-Type', 'Authorization'],\n      exposedHeaders: ['X-Total-Count'],\n      maxAge: 86400 // 24 hours\n    });\n  }\n}\n\n// Dynamic origin validation\n@Middleware()\nexport class DynamicCors extends CorsMiddleware {\n  constructor() {\n    super({\n      origin: (origin: string) => {\n        // Allow all subdomains of example.com\n        return origin.endsWith('.example.com') || origin === 'https://example.com';\n      },\n      credentials: true\n    });\n  }\n}\n\n// Use globally in server config\nimport { Config } from '@asenajs/asena/decorators';\nimport { ConfigService } from '@asenajs/ergenecore';\n\n@Config()\nexport class ServerConfig extends ConfigService {\n  middlewares = [GlobalCors];\n}\n\n// Or use per-route\n@Controller('/api')\nexport class ApiController {\n  @Get({ path: '/public', middlewares: [RestrictedCors] })\n  async publicData(context: Context) {\n    return context.send({ data: 'public' });\n  }\n}\n```\n\n#### Rate Limiter Middleware\n\nErgenecore includes a Token Bucket-based rate limiter for controlling request rates and preventing abuse:\n\n```typescript\nimport { Middleware } from '@asenajs/asena/decorators';\nimport { RateLimiterMiddleware } from '@asenajs/ergenecore';\n\n// General API rate limiter (100 requests per minute)\n@Middleware()\nexport class ApiRateLimiter extends RateLimiterMiddleware {\n  constructor() {\n    super({\n      capacity: 100,\n      refillRate: 100 / 60, // 100 requests per minute\n    });\n  }\n}\n\n// Strict rate limiter for sensitive endpoints (5 requests per minute)\n@Middleware()\nexport class StrictRateLimiter extends RateLimiterMiddleware {\n  constructor() {\n    super({\n      capacity: 5,\n      refillRate: 5 / 60, // 5 requests per minute\n      message: 'Too many login attempts. Please try again later.',\n    });\n  }\n}\n\n// Custom rate limiter with advanced options\n@Middleware()\nexport class CustomRateLimiter extends RateLimiterMiddleware {\n  constructor() {\n    super({\n      capacity: 50,\n      refillRate: 50 / 60, // 50 requests per minute\n\n      // Rate limit by user ID instead of IP\n      keyGenerator: (ctx) => ctx.state.user?.id || 'anonymous',\n\n      // Skip rate limiting for admin users\n      skip: (ctx) => ctx.state.user?.role === 'admin',\n\n      // Expensive operations cost more tokens\n      cost: (ctx) => ctx.req.url.includes('/search') ? 5 : 1,\n\n      // Custom response message\n      message: 'Rate limit exceeded. Please slow down.',\n      statusCode: 429,\n\n      // Cleanup inactive buckets every 60 seconds\n      cleanupInterval: 60000,\n      bucketTTL: 600000 // 10 minutes\n    });\n  }\n}\n\n// Use globally\nimport { Config } from '@asenajs/asena/decorators';\nimport { ConfigService } from '@asenajs/ergenecore';\n\n@Config()\nexport class ServerConfig extends ConfigService {\n  middlewares = [ApiRateLimiter];\n}\n\n// Use per-controller\n@Controller('/api', { middlewares: [ApiRateLimiter] })\nexport class ApiController {\n  @Get({ path: '/users' })\n  async getUsers(context: Context) {\n    return context.send({ users: [] });\n  }\n}\n\n// Use per-route for stricter limits\n@Controller('/auth')\nexport class AuthController {\n  @Post({ path: '/login', middlewares: [StrictRateLimiter] })\n  async login(context: Context) {\n    const body = await context.getBody();\n    // Login logic\n    return context.send({ token: 'abc123' });\n  }\n}\n```\n\n**Rate Limiter Options:**\n- `capacity` (number): Maximum token bucket size (burst capacity). Default: `100`\n- `refillRate` (number): Tokens refilled per second. Default: `10`\n- `keyGenerator` (function): Custom function to identify clients. Default: IP-based\n- `message` (string): Custom error message. Default: `'Rate limit exceeded. Please try again later.'`\n- `statusCode` (number): HTTP status code for rate limit response. Default: `429`\n- `cost` (number | function): Token cost per request. Default: `1`\n- `skip` (function): Skip rate limiting based on context. Default: `undefined`\n- `cleanupInterval` (number): Cleanup interval in milliseconds. Default: `60000` (1 minute)\n- `bucketTTL` (number): Inactive bucket TTL in milliseconds. Default: `600000` (10 minutes)\n\n**Rate Limit Headers:**\n\nThe middleware automatically sets standard rate limit headers:\n- `X-RateLimit-Limit`: Requests allowed per minute\n- `X-RateLimit-Remaining`: Remaining tokens in bucket\n- `X-RateLimit-Reset`: Unix timestamp when bucket resets\n- `Retry-After`: Seconds to wait before retrying (on 429 response)\n\n### Validation with Zod\n\n```typescript\nimport { Controller, Middleware } from '@asenajs/asena/decorators';\nimport { Post } from '@asenajs/asena/decorators/http';\nimport { ValidationService, type Context, type ValidationSchema, type ValidationSchemaWithHook } from '@asenajs/ergenecore';\nimport { z } from 'zod';\n\n@Middleware({ validator: true })\nexport class CreateUserValidator extends ValidationService {\n  json(): ValidationSchema | ValidationSchemaWithHook {\n    return z.object({\n      name: z.string({ message: 'Name is required' }).min(3).max(50),\n      email: z.string({ message: 'Email is required' }).email(),\n      age: z.number({ message: 'Age must be a number' }).min(18)\n    });\n  }\n}\n\n// Use in controller\n@Controller('/users')\nexport class UserController {\n  @Post({ path: '/', validator: CreateUserValidator })\n  async create(context: Context) {\n    const body = await context.getBody();\n\n    // Body is automatically validated by Asena\n    return context.send({ created: true, data: body }, 201);\n  }\n}\n```\n\n**Note:** The `json()` method can also return a Promise for async validation schemas:\n```typescript\nasync json(): Promise<ValidationSchema | ValidationSchemaWithHook> {\n  return z.object({ /* schema */ });\n}\n```\n### Combining Middleware and Validation\n\n```typescript\nimport { Controller, Middleware } from '@asenajs/asena/decorators';\nimport { Post } from '@asenajs/asena/decorators/http';\nimport {\n  MiddlewareService,\n  ValidationService,\n  type Context,\n  type ValidationSchema,\n  type ValidationSchemaWithHook\n} from '@asenajs/ergenecore';\nimport { z } from 'zod';\n\n// Authentication middleware\n@Middleware()\nexport class AuthMiddleware extends MiddlewareService {\n  async handle(context: Context, next: () => Promise<void>): Promise<any> {\n    const token = context.getHeader('authorization');\n\n    if (!token) {\n      return context.send({ error: 'Unauthorized' }, 401);\n    }\n\n    // Verify token and set user\n    context.setValue('userId', 123);\n    await next();\n  }\n}\n\n// Validation\n@Middleware({ validator: true })\nexport class CreatePostValidator extends ValidationService {\n  json(): ValidationSchema | ValidationSchemaWithHook {\n    return z.object({\n      title: z.string({ message: 'Title is required' }).min(5),\n      content: z.string({ message: 'Content is required' }).min(10)\n    });\n  }\n}\n\n// Controller with both middleware and validation\n@Controller('/posts')\nexport class PostController {\n  @Post({ path: '/', validator: CreatePostValidator, middlewares: [AuthMiddleware] })\n  async create(context: Context) {\n    const body = await context.getBody();\n    const userId = context.getValue('userId');\n\n    return context.send({\n      created: true,\n      userId,\n      post: body\n    }, 201);\n  }\n}\n```\n\n### WebSocket Support\n\n```typescript\nimport { WebSocket } from '@asenajs/asena/web-socket';\nimport { AsenaWebSocketService } from '@asenajs/asena/web-socket';\nimport type { Socket } from '@asenajs/asena/web-socket';\n\n@WebSocket({ path: '/chat', name: 'ChatSocket' })\nexport class ChatSocket extends AsenaWebSocketService<void> {\n  protected async onOpen(ws: Socket<void>): Promise<void> {\n    console.log('Client connected:', ws.id);\n    ws.send('Welcome to chat!');\n  }\n\n  protected async onMessage(ws: Socket<void>, message: string): Promise<void> {\n    console.log('Received:', message);\n\n    // Echo message back to client\n    ws.send(`Echo: ${message}`);\n  }\n\n  protected async onClose(ws: Socket<void>): Promise<void> {\n    console.log('Client disconnected:', ws.id);\n  }\n}\n```\n\n### Static File Serving\n\n```typescript\nimport { Controller } from '@asenajs/asena/decorators';\nimport { Get } from '@asenajs/asena/decorators/http';\nimport { StaticServe, StaticServeService } from '@asenajs/asena/static';\nimport type { Context } from '@asenajs/ergenecore/types';\n\n@StaticServe({ root: './public' })\nexport class StaticMiddleware extends StaticServeService {\n  rewriteRequestPath(path: string): string {\n    return path.replace(/^\\/static\\/|^static\\//, '');\n  }\n\n  onFound(_path: string, _context: Context): void | Promise<void> {\n    console.log('File found and served');\n  }\n\n  onNotFound(path: string, context: Context): void | Promise<void> {\n    console.log(`${path} not found, requested: ${context.getRequest().url}`);\n  }\n}\n\n// Use in controller\n@Controller('/static')\nexport class StaticController {\n  @Get({ path: '/*', staticServe: StaticMiddleware })\n  static() {}\n}\n```\n\n### Error Handling\n\n```typescript\nimport { Config } from '@asenajs/asena/decorators';\nimport { Inject } from '@asenajs/asena/decorators/ioc';\nimport { ConfigService, type Context } from '@asenajs/ergenecore';\n\n@Config()\nexport class ServerConfig extends ConfigService {\n  onError(error: Error, context: Context): Response | Promise<Response> {\n    console.error('Error:', error);\n\n    return context.send({\n      error: error.message,\n      stack: process.env.NODE_ENV === 'development' ? error.stack : undefined\n    }, 500);\n  }\n}\n\n// With custom exception mapper\nimport { isValidationError } from '@asenajs/asena/adapter';\n\nexport class ExceptionMapper {\n  map(error: Error, context: Context): Response {\n    // Request validation failures arrive here like any other error.\n    // Check this before the generic `isHttpException()` branch - a ValidationError is an\n    // HTTP exception too, so the generic branch would otherwise swallow it\n    if (isValidationError(error)) {\n      return context.send({ error: 'Validation failed', details: error.issues }, 400);\n    }\n\n    return context.send({ error: 'Internal server error' }, 500);\n  }\n}\n\n@Config()\nexport class ServerConfigWithMapper extends ConfigService {\n  @Inject('ExceptionMapper')\n  private mapper: ExceptionMapper;\n\n  onError(error: Error, context: Context): Response | Promise<Response> {\n    return this.mapper.map(error, context);\n  }\n}\n```\n\n## Contributing\n\nContributions are welcome! Please follow these guidelines:\n\n1. Follow the **TDD approach** (write tests first)\n2. Maintain **90%+ test coverage**\n3. Use **Bun native APIs** only (no runtime dependencies; Zod is a peer)\n4. Follow the **CLAUDE.md** guidelines\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Related Projects\n\n- [Asena.js](https://asena.sh) - The core framework\n- [Bun](https://bun.sh) - The JavaScript runtime\n\n---\n\n**Built with ⚡ by the Asena.js team**\n","readmeFilename":"README.md"}