{"_id":"topbit","_rev":"46-bf78a8bd8a8bdb711da3700a42af9ae2","name":"topbit","dist-tags":{"latest":"3.7.1"},"versions":{"1.0.0":{"name":"topbit","version":"1.0.0","keywords":["web"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@1.0.0","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/nodebit#readme","bugs":{"url":"https://github.com/master-genius/nodebit/issues"},"dist":{"shasum":"1443089e86413817f1843f9cfd53ec42d30b97b4","tarball":"https://registry.npmjs.org/topbit/-/topbit-1.0.0.tgz","fileCount":2,"integrity":"sha512-R0KU8Z2h1VxlIRsKWV5j2VlYIxDeesDEeSyaWlrBaIo+R1be2UlZTzdiqXtbqT/X6PoUfmwr4ASH5qnqfvX7DQ==","signatures":[{"sig":"MEUCIQDJMoOTJ1c7azDFXvOPKzA/wLudJgI6D8V4fB0RuXsdoQIgNZTVRy+Frp3KYold5B4gTlGW8PqnzIhLn/sRtRwhm8g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":553},"main":"main.js","type":"commonjs","scripts":{"test":"echo ok"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/nodebit.git","type":"git"},"_npmVersion":"11.6.2","description":"webserver","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.11.3"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_1.0.0_1764784118544_0.37419996707093794","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"topbit","version":"2.0.0","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@2.0.0","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"8b3f990dce7463c95378d4c11fb942aeae38d594","tarball":"https://registry.npmjs.org/topbit/-/topbit-2.0.0.tgz","fileCount":70,"integrity":"sha512-I3It7sOzBoR1tj68qq7ZlSRW4ESFKBMGG7LrDsXJQ/h4TZKv+3SSW+COyDljDvMG1YQ6BiOzJbTLh0ROT2CqPw==","signatures":[{"sig":"MEQCIAwtRT3l3cA/zfI5JdyLsryK+DIMW/PytyptubRD0ZOrAiAs/p7IR4WL443WUb+GujmuTzbcNoI/wTDGrVIm5K9qMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":994449},"main":"src/topbit.js","type":"commonjs","scripts":{"test":"echo ok"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_2.0.0_1764787485564_0.756515693352859","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"topbit","version":"3.0.0","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.0","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"255772bc89f89e5bac442ed172f52e6704c13340","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.0.tgz","fileCount":88,"integrity":"sha512-zoaYsngvSX+Zcu5z5EJoMotd06mtuFSXHsiBAJ7BWmPRa9Wkct8Sm1NMsj6S5o/UDMDHVaV1gzcG197DC6ozWQ==","signatures":[{"sig":"MEUCIQDXapdoc2SvA5R0TvdpEQdQ/zpK8JNj/JORWTKJnS4RcwIgFWl/DsqrOAVwhrsJpO0IaWc8Ll5KxoEkzqKgUIelNOo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3672025},"main":"src/topbit.js","type":"commonjs","gitHead":"044ee2b85de4cce7c96561e5b9958c41444cb6a1","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.0_1764857962315_0.45833703706283635","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"topbit","version":"3.0.1","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.1","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"988cd7be066afea439d2cff8328a7d97149e6c21","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.1.tgz","fileCount":88,"integrity":"sha512-JkZpctEmz9mhADrMJ+ZRf8DPybEuNbTlVRfF9xb1tkPKwIVy3T/TT+c1E6lVEdA7S8v1MS02qKviUA9G9frocg==","signatures":[{"sig":"MEQCIGMlIjC8nlqW+xfvcFb5a2Ujf8alnzUQyaJhoY5yXPmkAiBe5Aw7SiMHTR98uptTeJvzcGMOVvN1gn7ge7/9MVEq7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2086240},"main":"src/topbit.js","type":"commonjs","gitHead":"2def55e8e76a1efee6453a7efa8f311aa9d9d9fa","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.1_1764859544861_0.8240490219845207","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"topbit","version":"3.0.2","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.2","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"ed4c73d5ba4cc6aefd47761d31f5493a8394030d","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.2.tgz","fileCount":95,"integrity":"sha512-X+edXnXch2BZmQkXUroeb65MkbrlDllykEfuIDB5tWgyGKm8KsFAFZt+jt+PmYzoNqoHq0mAGzelU6Eq04jmtw==","signatures":[{"sig":"MEYCIQD5w2O3MkhsIyxZhXrNC7ljDHWMvKOqiEVoP4VLhWM+ewIhAING7b3Qcnn+2wV/XQ9vyjTcpP8wAFOmE1smH7MefkJ4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2090486},"main":"src/topbit.js","type":"commonjs","gitHead":"dd065d1546b9b2d83bc443d7439c07faf69570f3","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.2_1764897153294_0.7951060272414887","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"topbit","version":"3.0.3","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.3","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"caf1c733cc94deae748d1dd4eec003de6c0d37a2","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.3.tgz","fileCount":97,"integrity":"sha512-M9FVusbwQTPkT+1zD0R9ucYC10Vq2FBMJev3RkDWbt3GTqwuDSeKc0bnlaT0MEM1CQEiIB4zZHeCghPEIh6WOw==","signatures":[{"sig":"MEUCIQCtotksBAkNSHULNrXCdTGMx/ZPf0VaNr1SVZTyrjOIcQIgfmbdYVYpNDA6XTtMaSPNxhxrBlf+0EVu3mGdbbInzuw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":823722},"main":"src/topbit.js","type":"commonjs","gitHead":"e93be13f7f103564380bec08eb3e550f6fdc741c","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.3_1764916245201_0.6390622192742634","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"topbit","version":"3.0.4","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.4","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"4c7b56cf1982f5ed4793d7e58b2621161f817b38","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.4.tgz","fileCount":97,"integrity":"sha512-UXdX4mBlUm5TjrM/HRIf5fxsOqn6reyKfukMJQz2PWSy6O0/H7UXZ3FqGaqmwA7YtCt8QWTvnA58KWlFiEZiog==","signatures":[{"sig":"MEUCIQC0BKHhB7qaQFpWwC/5Vh1jy0bo0agfQn+tjHASbPs46gIgBw1fXfMVO0ql8uaVBlIyh5DvkGQa16v2tjDMRcUCOjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":823704},"main":"src/topbit.js","type":"commonjs","gitHead":"3a47e31c6b1a575702c963ba6ffaa920f0c5353c","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.4_1764997849463_0.2137111628421542","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"topbit","version":"3.0.5","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.5","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"7a97024f9136f3c3d95ba12b85fa25532ecbd5e5","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.5.tgz","fileCount":99,"integrity":"sha512-ujFSGZjluuL/GnjYxs0fY6LkgdYIS+4262rA1EbVlpG9RqwZircQNXg7mqYNft1eh9MrMFajqC3+MmosPjtmXQ==","signatures":[{"sig":"MEYCIQCBUKNzMSEQjNnXGijO2yHhaTJql0BgWil+u4EBe9RVqgIhALoesUitiPjh+jTVvc9zXXBnlePj6hx7e/7zERPww4mb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":817391},"main":"src/topbit.js","type":"commonjs","gitHead":"58e68d8a416a9088becc8e10b3fdf9682e31800e","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.5_1765041194814_0.7486941597161483","host":"s3://npm-registry-packages-npm-production"}},"3.0.6":{"name":"topbit","version":"3.0.6","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.6","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"e56e20908e377a6ff7d90c94dbd7e1d8a4dce4d1","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.6.tgz","fileCount":104,"integrity":"sha512-DXJYo1ha/vJhuEXrarV2rbFLC5h0R1K7JNO+ypMQgo0V4y6Li5I+S/EvB2TEeFMnOtLKr6lto5kzqx/SDp2vaQ==","signatures":[{"sig":"MEYCIQCO99TxSviLo3Stvo6WqGNW+DyEHnyMseY2LvfXRpcrAgIhAOe/JXfOE6MS76w6iwP89C/HJcydlr5TZCVG5JZx3fw3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":774440},"main":"src/topbit.js","type":"commonjs","gitHead":"227ecfc97342b1549e9ffe56a534a0dd87fbe9ff","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.6_1765048752054_0.11961535352251484","host":"s3://npm-registry-packages-npm-production"}},"3.0.7":{"name":"topbit","version":"3.0.7","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.7","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"e9fa2839ceb1d6d406f91e39307f9353d81f1ff9","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.7.tgz","fileCount":105,"integrity":"sha512-yKE18FNopgUV8DxY6XIw/dkzYZHXkKaya/Z1DWVZkuweXsYYgBtG9BfUQeydpFiqa3VvqYezCiTzc0bd4iLp8g==","signatures":[{"sig":"MEUCIBcWV7oG6GaWlPZRSXRizewN8EoCo67LLV1UICi+jJYYAiEAu+NXhLItOl4eAw1luaeqnfqpYtDE0UX6hudyQ6f+duc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":848411},"main":"src/topbit.js","type":"commonjs","gitHead":"ca9a9b7745ca8e8cacfea306654c7cb212b66da6","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.7_1765114184918_0.7844839115475182","host":"s3://npm-registry-packages-npm-production"}},"3.0.8":{"name":"topbit","version":"3.0.8","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.0.8","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"33ad50807fc7dbe51eed26b70a8047f8eb875650","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.0.8.tgz","fileCount":105,"integrity":"sha512-lx7f7ys2mMamEDXJF1TfBA3uAJskPKoZttdrewpgTa7x1p1xiwN/wTFv8x+H+eXB4i0LhsCrQU9RPx2QG4F8zQ==","signatures":[{"sig":"MEQCIEn8dWrEBrIkFRSdfqPw6KsnTf9gelKTEi+oW1w05TNKAiAzJGMOe6b1GCIyP3i/XlelXE91ga4Xh0PSnXV/pKyn8g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":845848},"main":"src/topbit.js","type":"commonjs","gitHead":"b4cb2de1f1c7405376bddbf58b3e7bd23add79a5","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.0.8_1765116252947_0.4637696661725059","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"topbit","version":"3.1.0","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.0","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"a3020a38309fce8019771ee3a74f282479abd6a3","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.0.tgz","fileCount":106,"integrity":"sha512-TrmjDqSmc+Y7yp+BFlRtYiFaLHlycE/N+5KpgJUEfftyJif+gjDeXt0YvTNJMV8W6hR4Z9PDSro2QZTwzcG5wQ==","signatures":[{"sig":"MEUCIQCSW9BczMXtlDXe1jLhlvzazgJkWwQDAjUm9P4DPV+qBQIgFoOc0NltZSaA+4P2XNOkrDLoMlItE+cbLGqLES8cWT4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":848359},"main":"src/topbit.js","type":"commonjs","gitHead":"be6c7201ef2d0d5f52f6f035ea6157937f3280c0","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.0_1765250827984_0.8414699007877691","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"topbit","version":"3.1.1","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.1","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"2bd6605bdd1a654a5e138b52a146528001dfd63c","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.1.tgz","fileCount":106,"integrity":"sha512-E7K9KlIEa5wd6GnIr/ksWKwCWAEg1t9bl0wlUZxgLEukocauWRuy1EIX9ewrpKiYVOw47zO7U8GagRwLlwouJQ==","signatures":[{"sig":"MEUCIE2EZqqgMjejyR3G9arUMtEFxIffEUfvMow/7Vtzo/QqAiEAwCoBACxkLiE5DdsbVwsN15E7EISXn3ctwHeucZClCl4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":843188},"main":"src/topbit.js","type":"commonjs","gitHead":"5f924ce3b1f6d1737bd648194f4d743e74502860","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.1_1765290378655_0.46874478750107307","host":"s3://npm-registry-packages-npm-production"}},"3.1.2":{"name":"topbit","version":"3.1.2","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.2","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"e04b46dac0dd82bd12cb3d32c2a78beb262b846b","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.2.tgz","fileCount":106,"integrity":"sha512-5qhPxhQaP1ucyx7s6whqBNImKJotKU1Q4Sn4HDw3rMHhxs9q0JMcOOJeA3cW2+vQAiMR82ZwwfQT1Nv83I2QMQ==","signatures":[{"sig":"MEUCIQDDmsXEcQG9PKnuihtbHKJQCad8+QcOPkJXlgKJarJITgIgF379JQQv2v8yG9Pz/Co3/1XKFshgh2eC/gre06MptDk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":845425},"main":"src/topbit.js","type":"commonjs","gitHead":"5f924ce3b1f6d1737bd648194f4d743e74502860","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.2_1765300719306_0.40946036287552623","host":"s3://npm-registry-packages-npm-production"}},"3.1.3":{"name":"topbit","version":"3.1.3","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.3","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"a737d4f4011840c116c0f815a08ecd4a01bcdd7e","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.3.tgz","fileCount":106,"integrity":"sha512-lORHLR5hUaORBZycPUt+t3+bDDIsA0XORl9kFrl+T2o69zfVVre9rX7WgmaJ3FzrlLujHKGfnRWNydG60tk6Rg==","signatures":[{"sig":"MEYCIQDeVnk1g8JqXhwiyOes+eVEGf81cbWOtEAqGl0PmgmeVQIhAMCuhgIriqcYoUV3l8uUy5j1QjS3t5a77rRO7/zI8sfU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":844567},"main":"src/topbit.js","type":"commonjs","gitHead":"219167bb7fd6db41a0305b4a0d3bd7fb25ec0b2b","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.3_1765302076019_0.18226116304506168","host":"s3://npm-registry-packages-npm-production"}},"3.1.4":{"name":"topbit","version":"3.1.4","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.4","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"0ed4203769d51eab679b1be3eccc9dd4a8760b3a","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.4.tgz","fileCount":106,"integrity":"sha512-QBuFx8483VUa8T6Nr0WGiChzglMV7y5Vo/2oiDL8IK8ai6n7aL6PX0YyTpthRm0QqOdtseVHRz3BxJW8QOwktw==","signatures":[{"sig":"MEUCICelJywch3xF8uU1LG7d9IK8RpEiWzRaMiqThyVL7JTtAiEAvh/3t1VezWYJOdk4K9pCmiuBKjVb8erOKphE6GDR7MU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":845809},"main":"src/topbit.js","type":"commonjs","gitHead":"3ffdf50ebc3d05f1022928013cae706a2fe65372","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.4_1765349497829_0.7572240855264087","host":"s3://npm-registry-packages-npm-production"}},"3.1.5":{"name":"topbit","version":"3.1.5","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.5","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"f4024f0ac0b98ff6268e354abaf52a177f675299","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.5.tgz","fileCount":107,"integrity":"sha512-+/KXzAM4oBc72Xp3vQq/ACvLQ/STj96aVCXuu3qryfmO8235yFn9mLjYm7sk/+2Dwq5NkS2ve9wdRkV/STsbJw==","signatures":[{"sig":"MEUCIQDiwKqGyd38ynoxmVxO6wyGhPAuRgmbCadcZe1LuANYoQIgbzwFETAVx7Ja9AMg5wxWTTdiM8qpeXW63O7TYOlnP7I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":848593},"main":"src/topbit.js","type":"commonjs","gitHead":"70b0574a7dc1a02bc578cd23ef33aeb968cb850f","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.5_1765355289186_0.4182818895748939","host":"s3://npm-registry-packages-npm-production"}},"3.1.6":{"name":"topbit","version":"3.1.6","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.6","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"05885e75865482b0867e1013e2d8bb238e08b88f","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.6.tgz","fileCount":107,"integrity":"sha512-R3OQNaQ+SIo0FE2ToJYkrdgVer3/X9lKxqNW4ZxZsuUL54GGF2bYoiLqkEJze20/dy1whL7tk9jE3T+h9tZvwQ==","signatures":[{"sig":"MEYCIQDXazqPY0J5ip/7g7GzvXYmxlTFN2XubjhcH30ltZMKdgIhAMoyishLsz9LpyX2ecehWYiNkWVRUUNlMsFSKYkBGq2W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":848581},"main":"src/topbit.js","type":"commonjs","gitHead":"51d97fd042dabc2d931d4104b6ad5de0801190d3","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.6_1765394370480_0.5156613992566113","host":"s3://npm-registry-packages-npm-production"}},"3.1.7":{"name":"topbit","version":"3.1.7","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.7","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"afbc05a12867230a426d183d413f8e1325d690d2","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.7.tgz","fileCount":107,"integrity":"sha512-ehWHKQlexCdrz7USDHXYiT2fXf4RQh3IM3nRTJxzZIyzcTAg17xH5usmeyZkJ1MuEY5oid7i7UuvndA3znfFDQ==","signatures":[{"sig":"MEUCIQCxlQVi69YAeyZIPB0EzLnFJgKo5SJIEPQmnGXWYfJFagIgJotV4RY3pV/wHaEzINXYhsEea+eg1Lip7pQDR9iaMc8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":850729},"main":"src/topbit.js","type":"commonjs","gitHead":"8d5f4c6b77556d9aa15a641e7a3b02d976f0a963","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.7_1765717759134_0.18351544556195143","host":"s3://npm-registry-packages-npm-production"}},"3.1.8":{"name":"topbit","version":"3.1.8","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.8","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"aaf1155a30f42f76594fed15b44b9a66e72a35fd","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.8.tgz","fileCount":107,"integrity":"sha512-LvaQT/+k7GIUqROq4Sh1rs0IJfhRtu2JZPIdqelpbP6/o1pqSNsEduuoU6ObdJzaR2VdmNmVpwOOtIBDR9xDLA==","signatures":[{"sig":"MEQCIBRKs5oHp1lrHJ0oSihgplgycYQGp6vxJpwut4ZnbR6wAiBMwbSyGI6P3OCW/Pvzemn9wZMm+Hri5F8DwIsqeJ3GnA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":851035},"main":"src/topbit.js","type":"commonjs","gitHead":"0a0e3ff63c354c26523516d7d33a87de1479b8cc","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.8_1765862087057_0.6913382622504658","host":"s3://npm-registry-packages-npm-production"}},"3.1.9":{"name":"topbit","version":"3.1.9","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.1.9","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"a2bdbd8c27ae9bee380572e286c47d63f3924017","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.1.9.tgz","fileCount":107,"integrity":"sha512-Kj0ixrBNyLfEOT28LnUV0DzsNSMnVgAoKkzfoxkZ9i82sMYKSX2dhnSesob9zztyvU4cDLLixoSCPAyb/VFTAw==","signatures":[{"sig":"MEQCIGQ5HEsAMUBzsfRF4ze8JgsifZghJn70zfgLqA5puRZ6AiB2nVH1dDYXqdg3wvNGW4bXHHbvEcehTIPXvtOaYjPyNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":852076},"main":"src/topbit.js","type":"commonjs","gitHead":"183eb0c92c77797d1bed3de667d7f402e73eaf81","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.1.9_1765870100474_0.7589515215587195","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"topbit","version":"3.2.0","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.0","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"696e0740e2db9d0a3a84f41ecc68ddd55bb6a0e1","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.0.tgz","fileCount":107,"integrity":"sha512-wNCb2GZfIjiAbuEblHZD1Y9nR+nqy5vwZAB4BjWvwtw0EYnX24pkNEdC9tpKhG4QvCzIm5jHl3y/AQogsCPmCQ==","signatures":[{"sig":"MEYCIQDmYXuYDxRWzHIhqiZ0k6H3J9y7GTLRBr81qhz2mHW0BAIhAMlvEUQw1ZOwOWTE3JsIJcdk3JBUh0wPHx8WnhRLJnYM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":853271},"main":"src/topbit.js","type":"commonjs","gitHead":"d3b359767fce9edb19c2a23f098e6aafe7196f22","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.0_1766125334248_0.5804301712036735","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"topbit","version":"3.2.1","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.1","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"13fce28a34518fc0505a4f6ab7ac683bc8dcd246","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.1.tgz","fileCount":107,"integrity":"sha512-9ImuDK/hbb5bcJUUmtKxoOvyP2y8eyoxQ13JfU6OFHkAXyCw5OZUDjAxk/u3jxs/rcS9Fbbt4O/+uthhrnrqUA==","signatures":[{"sig":"MEUCIQC7WkuEb3q9bffl2i4x8rPj6+kSbDXk4sdEQsKXW83J2QIgaMLrLzc02OspSqwPFhrWR4JIwahmOo6z6kXAkTxXrLw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":851814},"main":"src/topbit.js","type":"commonjs","gitHead":"993d203fad5ec66b0c728253d8b064b2818c3e37","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.1_1766329586914_0.2946346165688867","host":"s3://npm-registry-packages-npm-production"}},"3.2.2":{"name":"topbit","version":"3.2.2","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.2","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"f62434656c5a66dd86fb4b56202ea5f5df50fe46","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.2.tgz","fileCount":107,"integrity":"sha512-YOjLG/iXrD67FQBFaP51EEC9PnZPxuKzckSbCb+Ygn6OHzS7E2Z5VU9l9KBMohbEpCQPEpLr00IAa8Yor6qaXA==","signatures":[{"sig":"MEUCIQD53nubVbX9wUssQ66VsA2hFeC1UnFpSl1UzFrFvo22PwIgUhK7TdRrelIzG7qHJLDYpbVDMlFymFuE+f1F6lSv20Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":852152},"main":"src/topbit.js","type":"commonjs","gitHead":"82ecf48105fd2a6dd50a506847a2452ab3510464","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.6.2","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.2.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.2_1767445045343_0.189802059603974","host":"s3://npm-registry-packages-npm-production"}},"3.2.3":{"name":"topbit","version":"3.2.3","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.3","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"5a4b735d35b0da282c2eb43e38f7d52e14433d8a","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.3.tgz","fileCount":108,"integrity":"sha512-wEbbxG9PUo9L2dPYCBngZ9YIhgcaqZddipgwRFBxEHqcRuht8mTfowbPem/U0pUOALbXZxXy+qcpSjI1XnDrTg==","signatures":[{"sig":"MEYCIQCBNOBQAJ4PufnCx36JIe9uQa9i0nxF7Tav30gVQFxBzgIhAKvjmiI+WgsJsmtsn7tGstUbAjcAdEMyqVqwrChYi1/4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":855301},"main":"src/topbit.js","type":"commonjs","gitHead":"6626a689ee6295d47270b10875dc4143f3028b51","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.8.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.5.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.3_1770268472291_0.3964653303738952","host":"s3://npm-registry-packages-npm-production"}},"3.2.4":{"name":"topbit","version":"3.2.4","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.4","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"0bfb85eb9daf95fb40af4f2168dc8c995bc8b9e4","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.4.tgz","fileCount":108,"integrity":"sha512-IQDN7YO4Uv6xqZrFxgYwMPaH7Ypg0odwHEAWPEpKuicM/LWYjrU/s3/W7sx/VA3uR6zKTew3HdRdPPyFCaj1ew==","signatures":[{"sig":"MEQCIC1jDi6yRNhir4RdCaCiRM25qYKX9mGWbBOZTzr7c5mhAiBj+i/2wmMIca35hkQuXcMvdva81Ul7Xfw7Oj++q8PndQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":855371},"main":"src/topbit.js","type":"commonjs","gitHead":"4490802127941847f50967aadacc9e5b5789a233","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.8.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.6.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.4_1770650538052_0.9275747094129336","host":"s3://npm-registry-packages-npm-production"}},"3.2.5":{"name":"topbit","version":"3.2.5","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.5","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"82fa4b769c3490abdc6d16090dfd5f57242fc1ee","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.5.tgz","fileCount":108,"integrity":"sha512-Qv9zRP5lrjnQ7S6gBDNxIJPoX2gjlgOZVo0bBd33rCF74ww7SbBsTH5kbuTkJhVKAg/qf3xTjTmETyhC/A9L6g==","signatures":[{"sig":"MEYCIQDw0scyxky+C6l/Sd4EAV/U+FicRH3GKrz+qa5qTuECewIhALw+kv6LzLWyD3g/HyIGG7s1y9mTTwUFBIVepJbsdloy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":855997},"main":"src/topbit.js","type":"commonjs","gitHead":"c1aef02fc78f2f113095d742b1dde0e8cbf4667a","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.8.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.6.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.5_1770651433518_0.8169252725462348","host":"s3://npm-registry-packages-npm-production"}},"3.2.6":{"name":"topbit","version":"3.2.6","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.6","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"4c20b7df160b403d8d9703825b009903f0064691","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.6.tgz","fileCount":108,"integrity":"sha512-afBCVs69SqJLDtiJ3xUO05Sq/Nd6Qias8gd+2sXdmBp8JYBDZr7WuBX+pSZogq1enl+goRr9+4xN1LGT+i7uAA==","signatures":[{"sig":"MEUCIQC1N5JodICCMoXXjtWncedvLvjf0tJKFsL6EZo3WQL6HgIgM9fLktoRGuZ1Nez3TRpi5uQXDo+xWoNEX4uaquCaz/g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":857008},"main":"src/topbit.js","type":"commonjs","gitHead":"ccfb2602b8c698eff11cfaeb9c142d489e111813","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.11.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.8.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.6_1773471810757_0.4061673741134597","host":"s3://npm-registry-packages-npm-production"}},"3.2.7":{"name":"topbit","version":"3.2.7","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.7","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"3e182718a706f56e770de6d421ed2bd94da4429d","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.7.tgz","fileCount":109,"integrity":"sha512-PSdKHTVo9jWVzUbOU1EM7lA3boasZPnqvfQgk8y+SUE0q3NG46wa8QvWnzyqFIf5p9BBAHxOBF3etRLqfE/u2Q==","signatures":[{"sig":"MEQCID+QCAKusjmX1DY2MlZWRkDJneQywwO2GmJAG8b1W7QaAiAWm7f60lNhZmNTQvOfJo4CM7W2SN8PaOZXUDbCPDf7bQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876172},"main":"src/topbit.js","type":"commonjs","gitHead":"2c4a205b8e5e57349230c6f282fd29c032f46aa8","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.12.1","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.9.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.7_1776937079920_0.9139428515591086","host":"s3://npm-registry-packages-npm-production"}},"3.2.8":{"name":"topbit","version":"3.2.8","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.8","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"3cfd1df6106ed08b13669dbe543a5b52bf0aeab1","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.8.tgz","fileCount":109,"integrity":"sha512-v2u7ipZbJ0/30VbZemsv9G5TigWKwAaMLF7nevDeoLqgVCO6dJp8kS4nw3AFvEgWouRK70Xtp4ex9XSJQAyFPA==","signatures":[{"sig":"MEUCIQD4SsFUUwFCQwTHwAgtyGAmGZzoOFdWaHrqjqfcgqqfPAIgAv+HoHHB23RTTxaS23M1TvPeW4yIeWkee5FArHUyMVo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876497},"main":"src/topbit.js","type":"commonjs","gitHead":"2cc9d31893eb596000f55d36265ed2c813fad4cc","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.12.1","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.9.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.8_1777351950808_0.3869338721468081","host":"s3://npm-registry-packages-npm-production"}},"3.2.9":{"name":"topbit","version":"3.2.9","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.2.9","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"6418b98d72837acc57a6f90e6450f86bde23d913","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.2.9.tgz","fileCount":109,"integrity":"sha512-hTj2ARKdr0/yIFnD/aFYJUla45py53kwNAQ3XI+cXuKdWa71TyzfqdxrbZ9ApYWi0WYCtMjvaf2gd1ldTzgmtg==","signatures":[{"sig":"MEUCIDUMqackHcUkb76SD241XvLskClkHv4BRaoYyYL6YB23AiEA4IzuFGwbF4ekpg5qzRr6vwwRI+k3FOqnTV0p3B/b67E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876496},"main":"src/topbit.js","type":"commonjs","gitHead":"b615f2e7cc0fce2ab23da050326b0b163d9b374a","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.12.1","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.9.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.2.9_1777592845171_0.6088173334639879","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"topbit","version":"3.3.0","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.0","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"b33a6a040a8ba1dde4807b077cbc67d0dbfcefde","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.0.tgz","fileCount":109,"integrity":"sha512-CsY3BO8nYJZnzfI4i03v+KTi+8JyzIZZIRJgIzOsX9nBG1Z5I0EhaP34ZtBKXIKkY4U5wBH4NXgVu2/tZ3rkMA==","signatures":[{"sig":"MEUCIQDsBFLKOv+5lJQa9BRG9BYrR61+1cWPidHdAMC8wBSGrQIgMSbAza23KASz9YGqx0oNp48drGq/RBf2QjnuhwbPYH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876947},"main":"src/topbit.js","type":"commonjs","gitHead":"182fd05e24341d85daa64a6585bafd5744a554fd","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.12.1","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"25.9.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.0_1779335120692_0.02508068719374612","host":"s3://npm-registry-packages-npm-production"}},"3.3.1":{"name":"topbit","version":"3.3.1","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.1","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"8f9b0c3d6c4f0ef77168c7e7fbe8d47fcbaa3a52","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.1.tgz","fileCount":109,"integrity":"sha512-HFmBNTFX/vE5RUFWeVodgzu2B/g8ZSfvjIwHZZ2g1WqNbwHr0kgxY6196N81cczT6V8Tp1NWECn2hfDgY2okfw==","signatures":[{"sig":"MEUCIQDBKBRkelU25dsi5FTaroxgs+26uz8LDv7jE44uPdbB8wIgXTW91cJkbih78MfsL2atXcK6Dy6wPcapAow8qVbGkuk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":878293},"main":"src/topbit.js","type":"commonjs","gitHead":"f3f7cd0915dd25db371e19c61292cbfb6a0aa8a4","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.16.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.3.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.1_1781150350138_0.5421923168308924","host":"s3://npm-registry-packages-npm-production"}},"3.3.2":{"name":"topbit","version":"3.3.2","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.2","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"eb71bbe51a39e3216ab9c80b3d0b78cb5ed8eb66","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.2.tgz","fileCount":109,"integrity":"sha512-1m0xLxCxe01N5RBv5w9EkSswFPKVl2IIW/4Cft8fndoBFTTcN9Srcsw0Fn/Ly/+HVki6qtp6symKxjbOYMThbg==","signatures":[{"sig":"MEYCIQDRTjqGh4NOwbHP7Gs5odSKZi9vP26uabHvdPcizl05mgIhAPJORW1hLzojvmj4ze+m2wY1FSqjhFWw3fPtVsCiTj7I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":878414},"main":"src/topbit.js","type":"commonjs","gitHead":"9b01d6919f13939a96fe8417b9206ec37eba9a73","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.16.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.3.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.2_1781185888837_0.7494272378447746","host":"s3://npm-registry-packages-npm-production"}},"3.3.3":{"name":"topbit","version":"3.3.3","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.3","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"171630d86b8434d8293244a1dbf3be136c4dce74","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.3.tgz","fileCount":109,"integrity":"sha512-Tx1RFGgEjqoeo8aEPYWzrtYJwBnu10HeHvKg/R4qVsKpaZX3iUG59R9rt3vzZkc2w4WTwqT41haYMeGnTFp5zQ==","signatures":[{"sig":"MEYCIQCZgA1jXulY37MfxPWaCrLCh5IP0Da9B1oRg7SLzq3LPgIhAOCKe8dhU7cmpdlQKCyy9Fp8JqEHqGVJKKHSGPyUxoB4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":878414},"main":"src/topbit.js","type":"commonjs","gitHead":"ada3ec62cbc2b655a536b30bcdb0bd36a39c2fbc","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.16.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.3.1","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.3_1782801501015_0.6814521865438721","host":"s3://npm-registry-packages-npm-production"}},"3.3.4":{"name":"topbit","version":"3.3.4","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.4","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"2a554a4827d6c4b6d173a7f5cbd068bbb2e03d96","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.4.tgz","fileCount":109,"integrity":"sha512-WxNrK1e4IW3cLx60Lw+I21qGzMu0XDQ6ItXJDoXrML+g4zZl9Qtazq/sRzF55hdaM4CSobyO1U/xKQK40j87bQ==","signatures":[{"sig":"MEYCIQCIdy89XqscFj2qwhMe8CsJ1iXqgq+2aF1JK4BsReT1cQIhAIG/hreGgpFdMxdlrbrPGBodZa129C5qW3yRLCphtznE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":883474},"main":"src/topbit.js","type":"commonjs","gitHead":"5a6e48ab2027271836d6bea9f0330ce57b491f07","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.17.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.5.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.4_1785488620628_0.08961397542233351","host":"s3://npm-registry-packages-npm-production"}},"3.3.5":{"name":"topbit","version":"3.3.5","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.5","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"ee4850b75e03d6b78ba3618ce018acabde0c1070","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.5.tgz","fileCount":109,"integrity":"sha512-A7UTEkA9UtOyWuyD2UxG2ZZK5B4ZirdWNaNPCtGQuA6MXDEwYwI/Qw9eTs2ATIpFGD9u9Wc+feV7dquJKcSH/g==","signatures":[{"sig":"MEQCIEZH16Tt5YABTgBtzRpM2E9mDIhzbk5KmeXvUo5yKdJtAiBv0UN7/ngz0/RVEMvTBUDJ4BRAOmAoemr73pKA3LrzsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":883663},"main":"src/topbit.js","type":"commonjs","gitHead":"c4e8c1e3755bb4156c80b20c6426f4ee9d4b82ce","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.17.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.5.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.5_1785672151163_0.7298157823494118","host":"s3://npm-registry-packages-npm-production"}},"3.3.7":{"name":"topbit","version":"3.3.7","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.7","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"8a5ce95b67ce14acbe42d6a448a7dffd85a949fd","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.7.tgz","fileCount":110,"integrity":"sha512-PdaFzcq9pOopA/nRxvwFULXcYKoHhVWEa6Ti0PppEdtsQm92B69TrbpdZrYaaf3FZF8ix3HfgpaFKhzydPuWGQ==","signatures":[{"sig":"MEUCIEpQc07jbURXSx26LCeRyNFA4oLYXMBcfK4KawziFgGQAiEA9he+E7UV0MXN8LVFbN8JP4WK+UxrbUVw3AZwhGt/9CM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":919560},"main":"src/topbit.js","type":"commonjs","gitHead":"43d686d858d9edaead274898c7f22165f7f9d8a2","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.19.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.7.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.7_1786288881739_0.3663681581003073","host":"s3://npm-registry-packages-npm-production"}},"3.3.8":{"name":"topbit","version":"3.3.8","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.8","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"75d9cc48ce041f069a865b4a83bcae5acf2955cf","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.8.tgz","fileCount":139,"integrity":"sha512-x7TaZPxJ7dliPFcO3uPQcdI65o3EX0ffOXQ1UNkfb7L9ts6FMFP25xVqxdzXOfpgVbjfXi2W0jbBB+Z7MbUnzA==","signatures":[{"sig":"MEUCIGDFwDV9YGboey1fpl3sG/g+MBn7MU2tGy2oZ22vue6iAiEAnAt6GlsciYYMZ3jxiXMWQE0R5E72U8htFQut8gKAuIk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1114400},"main":"src/topbit.js","type":"commonjs","gitHead":"3b03f1afe52153509753602d34652e04e6f7f33b","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.19.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.7.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.8_1786646775741_0.7502880690769105","host":"s3://npm-registry-packages-npm-production"}},"3.3.9":{"name":"topbit","version":"3.3.9","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.3.9","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"829796a4fdef8288d717c7bc54c4fe252e02242e","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.3.9.tgz","fileCount":145,"integrity":"sha512-LTJWwp9I2fXyxJyJ1KiBa9kJaVuW736SC2+DXZTcQyoVpK9bGnyB5lK9z7hyXLYE8VRPvWsbNOUTNY4HuAjk5A==","signatures":[{"sig":"MEYCIQDKkeRXG1KodcfpwfiGAj6IY4jGe6HwDzuQtzvR9tKGXgIhAMAoDBv0ykIPSzm2ONID4r+5oymA1JsRPMX9nefAJNUq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1155084},"main":"src/topbit.js","type":"commonjs","gitHead":"99d2fc2881db1b29296e2e9c6c9f2d0b43915dac","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.19.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.7.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.3.9_1786906790403_0.7820052286025176","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"topbit","version":"3.4.0","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.4.0","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"7a1daac5b8490018ccdaadb2be6633b0214b6c85","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.4.0.tgz","fileCount":150,"integrity":"sha512-7CDRcPTJisJE2gFF0yXRLqkMG22S/hSm0Ppem+iePSGe6D/SEJqHRc/ND/01gOUW24+cHe7nnpyl3nrQ21sQQw==","signatures":[{"sig":"MEYCIQDOkm7zXrlbCA0PPyEXptjEZqxXGHKqsyMcvMKcyd2hlgIhAPKCeljadRVFuRtcBhjwZ97EfBvNFEqEAsf8MVmpoIy6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1213357},"main":"src/topbit.js","type":"commonjs","gitHead":"1d67591be8701896ce13af5504664fcef5833b7b","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.19.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.7.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.4.0_1787166690530_0.541576530980679","host":"s3://npm-registry-packages-npm-production"}},"3.4.1":{"name":"topbit","version":"3.4.1","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.4.1","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"453ca8d2986c32095ec5fcb700b190f2e3ae0bf2","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.4.1.tgz","fileCount":153,"integrity":"sha512-SKlnwhZKE+Ina+kdcPrn7lXUaQuOlgNVV688fHgYkJvZjB0m6Bk88a290YpVMl3FvRMfsl/JMhUwkjs2mJ7mBQ==","signatures":[{"sig":"MEUCIEp31kfMRvfBOUiisoz5z2pbXSYViAkejt8U8oN93Gf8AiEAzzCZpkcgnd8jo2d9109hUjHqFZQnbDxttfqjkj2kGGk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1233390},"main":"src/topbit.js","type":"commonjs","gitHead":"3660b627fc74bc8c019e273557c20621f5df50c9","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.19.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.7.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.4.1_1787285538206_0.7625066427784102","host":"s3://npm-registry-packages-npm-production"}},"3.6.5":{"name":"topbit","version":"3.6.5","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.6.5","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"26d54be314d95ecd1ca99f4c3fefbd7d787d7941","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.6.5.tgz","fileCount":166,"integrity":"sha512-dNZZLlJ4Uu0A0R8VPqLuxAFRd+Oad8J+XUGmxYNcUI7OzpWtDB36WWbDih+PZeCu9uBFGrIf7onT7k7KeJbQ7A==","signatures":[{"sig":"MEUCIQCVQrMJfPBnaZzWQb1zCpNHzBRwVzeoqTXf5+ZOo21qdAIgdyHDyekv/Sj6wzi3r8kjnEvgM4BV4II421Ld8LfDEEw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1353179},"main":"src/topbit.js","type":"commonjs","gitHead":"e2fa6817ca81e921f9076bddb3e874e6c475e1f6","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.19.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.7.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.6.5_1787351539606_0.6586531608320036","host":"s3://npm-registry-packages-npm-production"}},"3.6.6":{"name":"topbit","version":"3.6.6","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.6.6","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"c4711eab4f26c76787feb34084fe09412db9eec0","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.6.6.tgz","fileCount":168,"integrity":"sha512-KeABVcw07PwrHYSOO64+fsdDYULKFn9ouYZX+BO/P3YCAihFl+FGSAUbXwE1b3QWfOBsPE59DO/5FrVclLVlNg==","signatures":[{"sig":"MEUCIQDoYgcdu6d4BIALgVGRn3kUDHwxTA74c+AGDR3cigUucQIgdhlHFmEgretkrc8CAIVUcFjXwk52yFcAEftB25MfLbI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1327315},"main":"src/topbit.js","type":"commonjs","gitHead":"4f849142e4adefcfae7452833261bb829c73ee38","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.19.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.7.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.6.6_1787374308649_0.7439291169519466","host":"s3://npm-registry-packages-npm-production"}},"3.7.0":{"name":"topbit","version":"3.7.0","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"author":{"name":"BraveWang"},"license":"ISC","_id":"topbit@3.7.0","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"bin":{"tbload":"bin/loadinfo.sh","new-route":"bin/new-ctl.js","topbit-new-app":"bin/newapp.js"},"dist":{"shasum":"9907add31b5ea20d265215061653aa1ac3aaab96","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.7.0.tgz","fileCount":194,"integrity":"sha512-gw11UkjRD7c+ghlJMvir6lnsI/V6MvXWXGPvX9C1uJqJ0NtSDPYGsWrwlmaAnCKE0O7QHUjTy/nssFh/pErCsw==","signatures":[{"sig":"MEUCIFehnpVEK1dyvwPIG5YlgXcii+7p35/p1itteokrLML5AiEAhNKX9FiQ5cGoVgr5Td5dB1UOKwRcyj5qDMAl1sHAQcU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1519934},"main":"src/topbit.js","type":"commonjs","gitHead":"379d45bf1e89dd27f2b8f3dd5505df2422383fc8","scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"repository":{"url":"git+https://github.com/master-genius/topbit.git","type":"git"},"_npmVersion":"11.19.0","description":"A Server-side web framework support http/1.1 and http/2","directories":{"src":"src"},"_nodeVersion":"26.7.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/topbit_3.7.0_1787504531703_0.21651841713341913","host":"s3://npm-registry-packages-npm-production"}},"3.7.1":{"name":"topbit","version":"3.7.1","description":"A Server-side web framework support http/1.1 and http/2","main":"src/topbit.js","directories":{"src":"src"},"bin":{"tbload":"bin/loadinfo.sh","topbit-new-app":"bin/newapp.js","new-route":"bin/new-ctl.js"},"scripts":{"test":"node test/test-ext.js","test-route":"node test/test-route.js"},"keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"homepage":"https://github.com/master-genius/topbit#readme","bugs":{"url":"https://github.com/master-genius/topbit/issues"},"repository":{"type":"git","url":"git+https://github.com/master-genius/topbit.git"},"license":"ISC","author":{"name":"BraveWang"},"type":"commonjs","dependencies":{},"devDependencies":{},"gitHead":"975d7f81cbfa630b5bbfd7555b038c6e60a1cd8e","_id":"topbit@3.7.1","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-fBQ2t2/NNe+KmuMNF2GZKFdz01GrzTwnHwFoLBPzFPcsW65n9NKnfPZtbxsjAC5R+9YXzr+2HNSwRvG4ufN1Yw==","shasum":"2358e254fb30c07a4701f50d64b3c486709f5181","tarball":"https://registry.npmjs.org/topbit/-/topbit-3.7.1.tgz","fileCount":146,"unpackedSize":1198769,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDHjLxtNcUslUpBBgMKTKX9mboRw9sat0br5YlOhuUjsAIgQIgKAy8vmkS/Oxq8WKHtHXpvo5y8gmzO+hnrRt//umc="}]},"_npmUser":{"name":"ant-army","email":"1146040444@qq.com"},"maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/topbit_3.7.1_1787765654053_0.4884280768215239"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-03T17:48:38.544Z","modified":"2026-08-26T17:34:14.411Z","1.0.0":"2025-12-03T17:48:38.722Z","2.0.0":"2025-12-03T18:44:45.806Z","3.0.0":"2025-12-04T14:19:22.614Z","3.0.1":"2025-12-04T14:45:45.128Z","3.0.2":"2025-12-05T01:12:33.505Z","3.0.3":"2025-12-05T06:30:45.383Z","3.0.4":"2025-12-06T05:10:49.661Z","3.0.5":"2025-12-06T17:13:14.989Z","3.0.6":"2025-12-06T19:19:12.229Z","3.0.7":"2025-12-07T13:29:45.109Z","3.0.8":"2025-12-07T14:04:13.195Z","3.1.0":"2025-12-09T03:27:08.242Z","3.1.1":"2025-12-09T14:26:18.893Z","3.1.2":"2025-12-09T17:18:39.510Z","3.1.3":"2025-12-09T17:41:16.220Z","3.1.4":"2025-12-10T06:51:38.029Z","3.1.5":"2025-12-10T08:28:09.403Z","3.1.6":"2025-12-10T19:19:30.771Z","3.1.7":"2025-12-14T13:09:19.321Z","3.1.8":"2025-12-16T05:14:47.301Z","3.1.9":"2025-12-16T07:28:20.659Z","3.2.0":"2025-12-19T06:22:14.429Z","3.2.1":"2025-12-21T15:06:27.125Z","3.2.2":"2026-01-03T12:57:25.575Z","3.2.3":"2026-02-05T05:14:32.481Z","3.2.4":"2026-02-09T15:22:18.237Z","3.2.5":"2026-02-09T15:37:13.753Z","3.2.6":"2026-03-14T07:03:30.916Z","3.2.7":"2026-04-23T09:38:00.119Z","3.2.8":"2026-04-28T04:52:31.035Z","3.2.9":"2026-04-30T23:47:25.400Z","3.3.0":"2026-05-21T03:45:20.901Z","3.3.1":"2026-06-11T03:59:10.348Z","3.3.2":"2026-06-11T13:51:28.980Z","3.3.3":"2026-06-30T06:38:21.200Z","3.3.4":"2026-07-31T09:03:40.791Z","3.3.5":"2026-08-02T12:02:31.351Z","3.3.7":"2026-08-09T15:21:21.915Z","3.3.8":"2026-08-13T18:46:15.964Z","3.3.9":"2026-08-16T18:59:50.565Z","3.4.0":"2026-08-19T19:11:30.756Z","3.4.1":"2026-08-21T04:12:18.424Z","3.6.5":"2026-08-21T22:32:19.809Z","3.6.6":"2026-08-22T04:51:48.835Z","3.7.0":"2026-08-23T17:02:11.916Z","3.7.1":"2026-08-26T17:34:14.250Z"},"bugs":{"url":"https://github.com/master-genius/topbit/issues"},"author":{"name":"BraveWang"},"license":"ISC","homepage":"https://github.com/master-genius/topbit#readme","keywords":["top","topbit","tit","tibit","titbit","tidbit","bit","http","server","http/1.1","http/2","http2","web","middleware","framework","tidbit","proxy","http2proxy","mvc","api","webserver","backend","serverside"],"repository":{"type":"git","url":"git+https://github.com/master-genius/topbit.git"},"description":"A Server-side web framework support http/1.1 and http/2","maintainers":[{"name":"ant-army","email":"1146040444@qq.com"}],"readme":"![](images/topbit.webp)\n\n# Topbit\n\n#### [🪭 中文文档 ☯️](README.cn.md)\n\nTopbit is a server-side Web framework based on Node.js. It has no third-party dependencies and is optimized for extreme performance with a unique routing and middleware grouping execution mechanism.\n\n**Core Features:**\n\n*   **Request Context Design:** Shields interface differences.\n*   **Global Middleware Pattern.**\n*   **Route Grouping and Naming.**\n*   **Group-Based Middleware Execution:** Middleware is matched and executed based on request methods and route groups.\n*   **Daemon Mode:** Supports multi-process clustering and automated worker process load adjustment.\n*   **Load Monitoring:** Displays child process load status.\n*   **Body Parsing:** Parses body data by default.\n*   **HTTP/1.1 & HTTP/2:** Supports enabling HTTP/1.1 or HTTP/2 via configuration. Allows simultaneous support for HTTP/2 and HTTP/1.1.\n*   **HTTPS Support:** Supports HTTPS configuration (HTTP/2 service requires HTTPS).\n*   **Request Limiting:** Limits the maximum number of visits per single IP within a specific time period.\n*   **IP Blacklist and Whitelist.**\n*   **Memory Management:** In cluster mode, monitors child processes and restarts them if they exceed the maximum memory limit.\n*   **Auto-Scaling:** Optional automatic load mode: creates new child processes to handle requests based on load and restores the initial state when idle.\n*   **Security:** Default settings related to network security to avoid DDoS attacks and other network security issues at the software service level.\n\n## 📦Installation\n\n```javascript\nnpm i topbit\n```\n\nYou can also install via yarn:\n\n```javascript\nyarn add topbit\n```\n\n## Minimal Example\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n  debug: true\n})\n\n//in debug mode, output service info\napp.printServInfo().run(1234)\n```\n\nWhen no routes are added, Topbit adds a default route:\n\n`/*`\n\nVisiting via a browser will show a very simple page. This is merely for initial understanding and documentation access; it will not affect actual development.\n\n## Add a Route\n\n``` JavaScript\n'use strict'\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n  debug: true\n})\n\n\napp.get('/', async ctx => {\n  ctx.to('success')\n})\n\n// Defaults to listening on 0.0.0.0, parameters are consistent with the native listen interface.\napp.printServInfo().run(1234)\n\n```\n\n`ctx.data` is the response data to be returned. You can also use `ctx.to(data)`.\n> Actually, `ctx.to()` internally sets the value of `ctx.data`. **Using `ctx.to()` to set return data is recommended.**\n\n## Using Import\n\nIn `.mjs` files, you can use ES6 import:\n\n```javascript\nimport Topbit from 'topbit'\n\nconst app = new Topbit({\n  debug: true\n})\n\napp.get('/', async ctx => {\n    ctx.to('success')\n})\n\napp.printServInfo().run(1234)\n\n```\n\n## Routes and Request Types\n\nThe HTTP start line defines the request type, also known as the Request Method. Current request methods:\n```\nGET POST PUT PATCH DELETE OPTIONS  TRACE HEAD\n```\n\nThe first 6 are the most commonly used. For each request type, the router has a corresponding lowercase function for mounting routes. For convenience, after initializing the app, you can use the shortcut calls with the same names on the `app` instance. (The framework supports these types.)\n\n**Example:**\n\n``` JavaScript\n\n'use strict'\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n  debug: true\n})\n\napp.get('/', async c => {\n  c.to('success')\n})\n\napp.get('/p', async c => {\n  c.to(`${c.method} ${c.routepath}`)\n})\n\napp.post('/', async c => {\n  // Return uploaded data\n  c.to(c.body)\n})\n\napp.put('/p', async c => {\n  c.to({\n    method : c.method,\n    body : c.body,\n    query : c.query\n  })\n})\n\n// Defaults to listening on 0.0.0.0\napp.printServInfo().run(8080)\n\n```\n\n## Get URL Parameters\n\n- Query strings in the URL (parameters like `?a=1&b=2`) are parsed into `c.query`.\n- Form submitted data is parsed into `c.body`.\n\n> The content-type for forms is `application/x-www-form-urlencoded`.\n\n``` JavaScript\n'use strict';\n\nconst Topbit = require('topbit');\n\nlet app = new Topbit({\n    debug: true\n})\n\napp.get('/q', async c => {\n  // Query strings after ? in URL are parsed into query.\n  // Returns JSON text, main difference is content-type in header is text/json\n  c.to(c.query)\n})\n\napp.post('/p', async c => {\n  // Data submitted via POST/PUT is saved to body. \n  // If it's a form, it is automatically parsed; otherwise, raw text value is saved.\n  // Middleware can be used to handle various data types.\n  c.to(c.body)\n})\n\napp.run(2019)\n\n```\n\n## Get POST Data\n\nRequests that submit body data are POST and PUT. In front-end pages, this is usually form submission or asynchronous requests.\n\n- Form submitted data is parsed into `c.body`.\n\n> Form content-type is `application/x-www-form-urlencoded`.\n\n> Asynchronous request data often has a content-type of `application/json`.\n\nFor both types above, `c.body` will be an object.\n\n``` JavaScript\n'use strict'\n\nconst Topbit = require('topbit')\n\nlet app = new Topbit({debug: true})\n\napp.post('/p', async c => {\n  // POST/PUT data saved to body. Forms are auto-parsed to object.\n  // Middleware can be used to process various data.\n  c.to(c.body)\n});\n\napp.run(2019)\n\n```\n\n## About content-type\n\n**application/x-www-form-urlencoded**\n\nBasic form types are parsed into `c.body` as a JS object.\n\n**text/\\***\n\nIf content-type is `text/*` (starts with text/), such as `text/json`, the framework does not parse it. It simply converts the uploaded data to a string in utf8 format and assigns it to `c.body`. Subsequent processing is decided by the developer.\n\n**multipart/form-data;boundary=xxx**\n\nIf content-type is a file upload type, it is parsed by default. The parsed file objects are placed in `c.files`, accessible via `c.getFile`.\n\n**application/json**\n\nThis type will be parsed using `JSON.parse`.\n\n**Other types**\n\nIf content-type is any other type, `c.body` defaults to point to `c.rawBody`, which is the rawest Buffer data.\n\nThe framework provides basic core support. Other types need to be handled by the developer or via extensions.\n\nTo be easy to use while leaving enough space for developers, you can completely discard the default body parsing by setting the initialization option `parseBody` to `false`. You can also extend upon this.\n\nThe body parsing module is essentially a middleware designed to facilitate extension and replacement.\n\n## to Function Returning Data\n\nThe `to` function is a wrapper for `c.data`; it sets the value of `c.data`. There are two aliases: `ok` and `oo`. You can choose freely based on the scenario.\n\n``` JavaScript\n\napp.get('/', async c => {\n  c.to('success')\n})\n\napp.get('/randerr', async c => {\n  let n = parseInt(Math.random() * 10)\n  if (n >= 5) {\n    c.ok('success')\n  } else {\n    // Return 404 status code\n    /*\n      Equivalent to:\n        c.status(404).data = 'not found'\n    */\n   // You can use chain calls in versions above v22.4.6.\n    c.status(404).oo('not found')\n  }\n})\n\napp.run(1234)\n\n```\n\n## Chain Calls\n\nYou can use chain calls for `setHeader`, `status`, and `sendHeader`.\n\n```javascript\n\napp.get('/', async c => {\n\n  c.setHeader('content-type', 'text/plain; charset=utf-8')\n    .setHeader('x-server', 'nodejs server')\n    .status(200)\n    .to(`${Date.now()} Math.random()}`)\n\n})\n\n```\n\n## Route Parameters\n\n``` JavaScript\napp.get('/:name/:id', async c => {\n  // Use : to indicate route parameters, request params are parsed into c.param\n  let username = c.param.name;\n  let uid = c.param.id;\n  c.to(`${username} ${id}`)\n})\n\napp.run(8000)\n```\n\n## Wildcard Path Parameters\n\n`*` represents any path, but it must appear at the end of the route.\n\n``` JavaScript\n\napp.get('/static/*', async c => {\n  // Any path represented by * is parsed into c.param.starPath\n  let spath = c.param.starPath\n\n  c.to(spath)\n})\n\n```\n\n----\n\n## Route Lookup Rules\n\n----\n\nThe route lookup process strictly controls the order of parameterized routes and routes with `*`, rather than matching based on addition order.\n\nApplications developed with previous versions are unaffected; there are no compatibility issues. Stricter ordering reduces the likelihood of conflicts.\n\nRoute Lookup Strategy:\n\n1.  Ordinary string paths.\n2.  Parameterized routes (routes with fewer parameters match first).\n3.  Routes with `*` (matched in longest-to-shortest pattern).\n\n```\nExample:\nExisting routes: /x/y/:id  /x/y/* /x/*  /x/:key/:id\n\n/x/y/123 matches /x/y/:id first, stops matching.\n\n/x/y/123/345 matches /x/y/* first, stops matching.\n\n/x/q/123 will match /x/:key/:id.\n\n/x/a.jpg will match /x/*, other routes cannot match.\n\n/x/static/images/a.jpg will match /x/*, other routes cannot match.\n```\n\n----\n\n----\n\n## Route Format Validation\n\n`router.checkRoute(path)` checks whether a route string is well-formed **before** registering it. It does not register anything, does not throw, and has no side effects — useful when routes are generated from a configuration file, so errors surface at startup rather than as an `addPath()` throw.\n\n``` JavaScript\nconst r = app.router;\n\nr.checkRoute('/api/:id')\n// { ok: true }\n\nr.checkRoute('/x/:id/*')\n// { ok: false, message: '...', route: '/x/:id/*' }\n```\n\nWhen `ok` is `false`, `message` explains the problem and `route` is the normalized route string (the form in which this route would actually be registered).\n\nWhat it checks:\n\n| Item | Rule |\n|---|---|\n| Type | Must be a string |\n| Character set | Only `letters digits - _ : * / . @`, max length 1000 |\n| Position of `*` | Only allowed as the last segment |\n| Number of `*` | At most one |\n| `:` with `*` | Cannot appear in the same route |\n| Parameter name | Must not be empty, must not be `__proto__` |\n\nIt does **not** check pattern conflicts or duplicate route names. Those depend on what is already registered in the route table — runtime state rather than a property of the string itself, so the same route string yields different answers in different route tables. `addPath()` still checks them at registration time.\n\n`addPath()` calls `checkRoute()` internally, so the two always agree.\n\nRoute strings are also normalized at registration: consecutive slashes are collapsed, a missing leading slash is added, and a trailing slash is stripped. `router.normalizeRoute(path)` returns that normalized form — `//api//v2//` and `/api/v2` are the same route.\n\n----\n\n## Grouping Routes\n\nYou can use `app.middleware` to specify middleware and use the returned `group` method to add grouped routes, or use `app.group` directly.\n\n**topbit.prototype.middleware(mids, options=null)**\n\n- `mids` is an array. Each element is a middleware function or an array where the first element is the middleware and the second is the options for adding that middleware.\n- `options` defaults to `null`. Pass an object for options applying to all `mids`, e.g., `{pre: true}`.\n\n**topbit.prototype.group(group_name, callback, prefix=true)**\n\n- `group_name` is a string representing the route group name. If it is a valid path, it also serves as the route prefix.\n- `callback` is a callback function. The parameters received by the callback can still call `middleware` and `group`, as well as `get`, `post`, etc., to add routes.\n- `prefix` is a boolean, defaults to `true`. It controls whether `group_name` is added as a route prefix. However, it only acts as a prefix if `group_name` is a valid route string.\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n  debug: true\n})\n\n// Middleware function\nlet mid_timing = async (c, next) => {\n  console.time('request')\n  await next(c)\n  console.timeEnd('request')\n}\n\n// The return value of group can use 'use' and 'pre' to add middleware.\n// /api is also added to the route prefix.\napp.group('/api', route => {\n  route.get('/test', async c => {\n    c.to('api test')\n  })\n\n  route.get('/:name', async c => {\n    c.to(c.param)\n  })\n})\n\n// Add middleware to the corresponding group\napp.use(\n  async (c, next) => {\n    console.log(c.method, c.headers)\n    await next(c)\n  }, {group: '/sub'}\n).group('/sub', route => {\n  route.get('/:id', async c => {\n    c.to(c.param.id)\n  })\n})\n\n// Test: Does not conform to route rules, so it won't be a path prefix.\napp.group('Test', route => {\n  route.get('/test', async c => {\n    console.log(c.group, c.name)\n    c.to('test ok')\n  }, 'test')\n})\n\napp.run(1234)\n\n```\n\nSpecifying multiple middlewares in this way can be somewhat complex; you can use the `middleware` method. See the example below.\n\n### Assigning Middleware to Groups and Subgroups\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\n// Import ToFile extension\nconst {ToFile} = Topbit.extensions\n\nconst app = new Topbit({\n  debug: true\n})\n\n// Middleware function\nlet mid_timing = async (c, next) => {\n  console.time('request')\n  await next(c)\n  console.timeEnd('request')\n}\n\nlet sub_mid_test = async (c, next) => {\n  console.log('mid test start')\n  await next(c)\n  console.log('mid test end')\n}\n\n// group return value can use use, pre, middleware to add middleware.\n// /api is also added to the route prefix.\n\napp.middleware([\n     // Time recording middleware, runs before receiving body data, so set pre: true\n     [ mid_timing, {pre: true} ],\n\n     // ToFile extension runs after receiving body data, only for POST and PUT requests\n     [ new ToFile(), {method: ['POST', 'PUT']} ]\n  ])\n  .group('/api', route => {\n      route.get('/test', async c => {\n        c.to('api test')\n      })\n\n      route.get('/:name', async c => {\n        c.to(c.param)\n      })\n\n      // Subgroup /sub enables middleware sub_mid_test.\n      // Simultaneously, subgroups inherit all middleware from the upper layer.\n      route.middleware([sub_mid_test])\n        .group('/sub', sub => {\n            sub.get('/:key', async c => {\n              c.to(c.param)\n            })\n        })\n  })\n\napp.run(1234)\n\n```\n\nGroups support nested calls, but the hierarchy cannot exceed 9 levels. Usually, nesting more than 3 levels indicates a design issue and should be reconsidered.\n\n**This feature is not as convenient and easy to use as the automatic loading mechanism of the `TopbitLoader` extension. However, in practice, requirements vary. Sometimes you have to use a single file for the service while still taking advantage of the framework's routing and middleware grouping, and also conveniently writing logic-clear, structured code. Therefore, `middleware` and `group` interfaces are convenient for handling this. Also, if you are not used to TopbitLoader's MCM pattern (Middleware - Controller - Model, similar to MVC), this method combines well with other module code.**\n\nThe function of assigning routing groups above is non-intrusive; it will not affect existing code, nor will it conflict with TopbitLoader.\n\n**!! Complex route handling functions should be placed in separate modules and completed using a unified automated loading function.**\n\nIt supports adding via return values, so passing a callback function is not mandatory:\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\n// Import ToFile extension\nconst {ToFile} = Topbit.extensions\n\nconst app = new Topbit({\n  debug: true\n})\n\n// Middleware function\nlet mid_timing = async (c, next) => {\n  console.time('request')\n  await next(c)\n  console.timeEnd('request')\n}\n\nlet sub_mid_test = async (c, next) => {\n  console.log('mid test start')\n  await next(c)\n  console.log('mid test end')\n}\n\nlet route = app.middleware([\n                // Time recording middleware, pre set to true\n                [ mid_timing, {pre: true} ],\n\n                // ToFile extension runs after receiving body data, only for POST and PUT\n                [ new ToFile(), {method: ['POST', 'PUT']} ]\n              ])\n              .group('/api')\n\nroute.get('/test', async c => {\n  c.to('api test')\n})\n\nroute.get('/:name', async c => {\n  c.to(c.param)\n})\n\n// Subgroup /sub enables middleware sub_mid_test.\n// Subgroup inherits upper layer middleware.\nroute.middleware([sub_mid_test])\n  .group('/sub', sub => {\n      sub.get('/:key', async c => {\n        c.to(c.param)\n      })\n  })\n\napp.run(1234)\n\n```\n\n----\n\n## Uploading Files\n\nUploaded files are parsed by default. You can turn this off by passing the `parseBody` option when initializing the service (detailed in options below).\nParsed file data is stored in `c.files`. The specific structure is shown later.\n\n``` JavaScript\n'use strict'\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit()\n\napp.post('/upload', async c => {\n  \n  let f = c.getFile('image')\n\n  // Generate a unique filename based on original extension + timestamp + random number.\n  let fname = c.ext.makeName(f.filename)\n\n  try {\n    c.to(await c.moveFile(f, fname))\n  } catch (err) {\n    c.status(500).to(err.message)\n  }\n  \n}, 'upload-image'); // Name the route 'upload-image', accessible in c.name.\n\napp.run(1234)\n\n```\n\n## c.files Data Structure\n\nThis structure is designed based on the data construction of HTTP protocol file uploads. HTTP protocol allows multiple files for the same upload name, so it parses into an array. Using `getFile` returns the first file by default, as usually, one upload name corresponds to one file.\n\n> For the front-end, the upload name is the name attribute in the HTML form: `<input type=\"file\" name=\"image\">`.\n> `image` is the upload name; do not confuse upload name with filename.\n\n```javascript\n{\n  image : [\n    {\n      type: CONTENT_TYPE,\n      filename: ORIGIN_FILENAME,\n      start : START,\n      end   : END,\n      length: LENGTH,\n      rawHeader: HEADER_DATA,\n      headers: {...}\n    },\n    ...\n  ],\n\n  video : [\n    {\n      type: CONTENT_TYPE,\n      filename: ORIGIN_FILENAME,\n      start : START,\n      end   : END,\n      length: LENGTH,\n      rawHeader: HEADER_DATA,\n      headers: {...}\n    },\n    ...\n  ]\n}\n```\n\n`c.getFile` indexes by name. The default index value is 0. If a number less than 0 is passed, it gets the entire file array; returns null if not found.\n\n## Max Body Data Limit\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n  // Allows POST or PUT request data max value to be approx 20MB.\n  // Unit is bytes.\n  maxBody: 20000000\n})\n\n//...\n\napp.run(1234)\n\n```\n\n## Middleware\n\nMiddleware is a very useful pattern. Implementation varies slightly between languages, but the essence is the same. The middleware mechanism allows developers to organize code better and implement complex logic easily. In fact, the entire framework runs on a middleware pattern.\n\nMiddleware Diagram:\n\n![](images/middleware.jpg)\n\nThis framework's middleware is designed to distinguish by route groups and recognize different request types to determine whether to execute or skip to the next layer. This makes it extremely fast. Multiple routes and groups have their own middleware, do not conflict, and avoid meaningless calls. Reference format:\n\n``` JavaScript\n\n/*\n  The second parameter is optional; omitting it enables the middleware globally.\n  Here, the second parameter indicates: execute only for POST requests AND the route group must be /api.\n  This design ensures execution on demand, avoiding unnecessary operations.\n*/\napp.add(async (c, next) => {\n    console.log('before');\n    await next(c);\n    console.log('after');\n}, {method: 'POST', group: '/api'});\n\n```\n\nMiddleware added with `add` executes in reverse order of addition (LIFO), which is the standard onion model. To provide logic that is easier to understand, the `use` interface is provided. Middleware added with `use` executes in the order of addition (FIFO). Different frameworks have different logic for order implementation, but sequential execution suits developer habits better.\n\n**It is recommended to use `use` to add middleware:**\n\n``` JavaScript\n// Executes first\napp.use(async (c, next) => {\n  let start_time = Date.now()\n  await next(c)\n  let end_time = Date.now()\n  console.log(end_time - start_time)\n})\n\n// Executes later\napp.use(async (c, next) => {\n  console.log(c.method, c.path)\n  await next(c)\n})\n\n// use can be cascaded: app.use(m1).use(m2)\n```\n\n## Topbit Complete Middleware Execution Model\n\n![](images/topbit-middleware-en.svg)\n\n> **It is important to know that internally, body data reception and parsing are also middleware. The order is deliberately arranged, separating `pre` and `use` interfaces.**\n\n## Middleware Parameters\n\nUsing `use` or `pre` interfaces to add middleware supports a second parameter for precise control via option properties:\n\n*   `group`: Route group. Indicates which group to execute for.\n*   `method`: Request method. String or Array, must be uppercase.\n*   `name`: Request name. Indicates execution only for this request name.\n\nExample:\n\n```javascript\n\napp.get('/xyz', async c => {\n  //...\n  // Route group named proxy\n}, {group: 'proxy'})\n\napp.use(proxy, {\n  method : ['PUT', 'POST', 'GET', 'DELETE', 'OPTIONS'],\n  // Execute for requests in route group 'proxy'.\n  group : 'proxy'\n})\n```\n\n## pre (Before Receiving Body Data)\n\nThe main difference between middleware added via the `pre` interface and `use` is that `pre` executes before receiving body data. It can be used for permission filtering operations before receiving data. Its parameters are consistent with `use`.\n\nFor a consistent development experience, you can use the `use` interface and simply specify `pre` in the options:\n\n```javascript\nlet setbodysize = async (c, next) => {\n    // Set max body receive data to ~10k.\n    c.maxBody = 10000;\n    await next(c);\n};\n\n// Equivalent to app.pre(setbodysize);\napp.use(setbodysize, {pre: true});\n\n```\n\nUsing `pre` allows for more complex processing, including intercepting and not executing the next layer. For example, the `proxy` extension uses this feature to implement a high-performance proxy service directly as a framework middleware. Its main operation is to set the request's `data` event to receive data at this layer, handle other logic, and return directly.\n\n**Dynamically limiting request body size based on different request types**\n\nThis requirement can be solved by adding middleware via `pre`:\n\n```javascript\n\nconst app = new Topbit({\n  // Default max body limit ~10M.\n  maxBody: 10000000\n})\n\napp.pre(async (c, next) => {\n\n  let ctype = c.headers['content-type'] || ''\n\n  if (ctype.indexOf('text/') === 0) {\n    // 50K\n    c.maxBody = 50000\n  } else if (ctype.indexOf('application/') === 0) {\n    // 100K\n    c.maxBody = 100000\n  } else if (ctype.indexOf('multipart/form-data') < 0) {\n    // 10K\n    c.maxBody = 10000\n  }\n\n  await next(c)\n\n}, {method: ['POST', 'PUT']})\n\n\n```\n\nIf these parameters appear in the file simultaneously, it can look complex and be hard to maintain, but the functionality is powerful. Therefore, leaving it to automated program completion can greatly simplify coding.\n\n**For complete project structure setup, please use `topbit-loader`. This extension completes automatic loading of routes/models and automatic orchestration of middleware. <a target=_blank href=\"https://gitee.com/daoio/topbit-loader\">topbit-loader</a>**\n\n## HTTPS\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\n\n// Just pass the path to the certificate and key files\nconst app = new Topbit({\n    // './xxx.pem' file also works\n    cert: './xxx.cert',\n    key: './xxx.key'\n})\n\napp.run(1234)\n\n```\n\n## Simultaneous Support for HTTP/2 and HTTP/1.1 (Compatibility Mode)\n\nCompatibility mode utilizes the ALPN protocol and requires HTTPS, so certificates and keys must be configured.\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\n\n// Just pass the path to the certificate and key files\nconst app = new Topbit({\n    cert: './xxx.cert',\n    key: './xxx.key',\n    // Enable http2 and allow http1; compatibility mode is enabled automatically\n    http2: true,\n    allowHTTP1: true\n})\n\napp.run(1234)\n\n```\n\n## Configuration Options\n\nFull configuration options for app initialization are as follows. Please read the comments carefully.\n\n``` JavaScript\n  {\n    // This config represents max bytes for POST/PUT form submission and file uploads.\n    maxBody   : 8000000,\n\n    // Max number of files to parse\n    maxFiles      : 12,\n\n    /*\n      After enabling daemon mode, if path is not empty string, pid is written to this file. Used for service management.\n    */\n    pidFile       : '',\n\n    // Whether to enable global logging. true enables it, outputting request info or writing to file.\n    globalLog: false,\n\n    // Log output type: 'stdio' for terminal, 'file' for file output.\n    logType : 'stdio',\n\n    // File path for successful request logs\n    logFile : '',\n\n    // File path for error request logs\n    errorLogFile : '',\n\n    // Max lines per log file\n    logMaxLines: 50000,\n\n    // Max number of historical log files\n    logHistory: 50,\n\n    // Custom log handler function\n    logHandle: null,\n\n    // Enable HTTPS\n    https       : false,\n\n    http2   : false,\n\n    allowHTTP1: false,\n\n    // HTTPS key and cert file paths. If paths are set, https is automatically set to true.\n    key   : '',\n    cert  : '',\n\n    // Server options written in 'server', passed during http service initialization. Reference http2.createSecureServer, tls.createServer\n    server : {\n      handshakeTimeout: 8192, // TLS handshake timeout\n      //sessionTimeout: 350,\n    },\n\n    // Set server timeout in ms. Specific request timeouts can be set in specific requests.\n    timeout   : 15000,\n\n    debug     : false,\n\n    // Enable request limiting\n    useLimit: false,\n\n    // Max connections, 0 means no limit\n    maxConn : 1024,\n\n    // Max connections per single IP within unit time, 0 means no limit\n    maxIPRequest: 0,\n\n    // Rate limit unit time for IP, 1 means 1 second. Default 60 seconds. Range 0.1 ~ 86400.\n    unitTime : 60,\n    \n    // Display load info, requires enabling cluster mode via daemon interface\n    loadMonitor : true,\n\n    // Load info type: text, null, obj, orgobj\n    // json type is for program communication, convenient for interface development\n    loadInfoType : 'text',\n\n    // Load info file path. If not set, outputs to terminal; otherwise saves to file.\n    loadInfoFile : '',\n\n    // Data to return for 404\n    notFound: 'Not Found',\n    \n    // Data to return for 400\n    badRequest : 'Bad Request',\n\n    // Percentage parameter controlling max memory usage for child processes. Range -0.42 ~ 0.36. Base is 0.52, so default is 80%.\n    memFactor: 0.28,\n\n    // Max URL length\n    maxUrlLength: 2048,\n\n    // Timer milliseconds for child process resource reporting.\n    monitorTimeSlice: 640,\n\n    // When globalLog is true, record real IP address? Mainly used in reverse proxy mode.\n    realIP: false,\n\n    // Max allowed querystring parameters.\n    maxQuery: 25,\n\n    // Enable strong mode? If enabled, processes rejectionHandled and uncaughtException events,\n    // and captures errors: TypeError,ReferenceError,RangeError,AssertionError,URIError,Error.\n    strong: false,\n\n    // Fast querystring parsing. Multiple values with same name only set the first one, not parsed as array.\n    fastParseQuery: false,\n    \n    // Whether to auto decode Query parameters using decodeURIComponent.\n    autoDecodeQuery: true,\n\n    // In multipart format, limit max length of a single form item.\n    maxFormLength: 1000000,\n\n    /* Error handler function. Unifies collection of runtime errors:\n          tlsClientError, server error, secureConnection error, clientError, thrown runtime errors.\n      errname is a string marking error info and location, format --ERR-CONNECTION--, --ERR-CLIENT--, etc.\n\n      Usually Node.js thrown errors have code and message. \n      errname is optional but passed.\n      Pass custom function via config option to implement custom error collection/handling.\n    */\n    errorHandle: (err, errname) => {\n      this.config.debug && console.error(errname, err)\n    },\n\n    // Max load rate percentage. Default 0.75 means if CPU usage > 75%, automatically create child process.\n    // Must enable auto load mode via autoWorker.\n    maxLoadRate: 0.75,\n\n    // http2 protocol http2Stream timeout. If not set, -1 means consistent with timeout.\n    streamTimeout: -1,\n\n    // Request timeout. This is total request time, mainly to counter malicious requests.\n    // e.g. Slowloris attacks where 1 byte is sent per second.\n    // Idle timeout won't work, allowing long-term resource occupation.\n    // This is a DDoS attack.\n    requestTimeout: 100000,\n\n  };\n  // For HTTP status codes, only these two are needed here. Others don't strictly need full support, \n  // and you can handle them in your application implementation.\n  // Because once execution starts, corresponding status codes can be returned via runtime state.\n  // Before that, the framework prepares for the onion model execution, which is very fast.\n\n```\n\n## Request Context\n\nRequest context is an object encapsulating various request data. This design handles differences between HTTP/1.1 and HTTP/2 protocols and incompatibilities from Node.js evolution. For design and performance, the HTTP2 module encapsulates the request object as a stream, not the `http` module's `IncomingMessage` and `ServerResponse`.\n\n**Request Context Properties and Description**\n\n| Property | Description |\n| ---- | ---- |\n| version | Protocol version, string type, '1.1' or '2'. |\n| major | Major protocol version number, 1, 2, 3 (HTTP/1.1, HTTP/2, HTTP/3). |\n| maxBody | Max supported request body bytes. Number. Defaults to `maxBody` init option. Can be set automatically in middleware based on request. |\n| method | Request type (GET, POST, etc.). Uppercase string. |\n| host | Service hostname, value of `request.headers.host`. |\n| protocol | Protocol string without colon, 'https', 'http'. |\n| path | Specific request path. |\n| routepath | Actual executed route string. |\n| query | URL passed parameters. |\n| param | Route parameters. |\n| files | Uploaded file information. |\n| body | Body request data. Format depends on content-type (string, object, buffer). |\n| port | Client request port number. |\n| ip | Client request IP address (socket address). Check x-real-ip or x-forwarded-for if using proxy. |\n| headers | Points to `request.headers`. |\n| isUpload() | Is it a file upload request? Checks if content-type header is multipart/form-data. |\n| name | Route name, defaults to empty string. |\n| group | Route group, defaults to empty string. |\n| res | HTTP/1.1 points to response, HTTP/2 points to stream. |\n| req | HTTP/1.1 is `IncomingMessage` object, HTTP/2 points to stream object. |\n| box | Defaults to empty object. Can add any property value to dynamically pass info to next layer components. |\n| service | Object for dependency injection, points to `app.service`. |\n| data | Saves final data to return to client. Assign to data or use `ctx.to`. Pre-v24.x was `ctx.res.body`. |\n| ext | Provides helper functions. See wiki. |\n| to(data) | Function to set `ctx.data`. |\n| write(data) | Directly write data to client. |\n| moveFile(file:object, target_filepath:string) | Function to move uploaded file to specified path. |\n| status() | Function to set status code. |\n| setHeader(k, v) | Function to set header. |\n| removeHeader(k) | Function to remove header waiting to be sent. |\n| getFile(name) | Function to get uploaded file info (reads files property). |\n| sendHeader() | Function to send headers for http2. `setHeader` only caches headers. For http/1.1, this is an empty function for code consistency. |\n| user | Standard property for user login, defaults to null. |\n| json(data) | Function, sets return data and marks type as json. |\n| text(data) | Function, sets return data and marks type as text. |\n| html(data) | Function, sets return data and marks type as html. |\n| pipe(filepath) | Function, stream response data. Example: `await ctx.setHeader('content-type', 'text/html').pipe('./index.html')` |\n| pipeJson(filepath) | Stream file data as json type. |\n| pipeText(filepath) | Stream file data as text type. |\n| pipeHtml(filepath) | Stream file data as html type. |\n\nNote: `to` function only sets `ctx.data` value; data is returned at the end. It's same as direct assignment, but function calls reveal errors faster (wrong assignment adds a property without error but returns incorrect data).\n\n## Dependency Injection\n\nThe request context has a `service` item pointing to `app.service`. After initializing the app, all data/instances needed can be mounted to `app.service`.\n\n``` JavaScript\n\n'use strict';\n\nconst Topbit = require('topbit');\n\nlet app = new Topbit({\n  debug: true\n});\n\n// Overwrites if exists, adds if not.\napp.addService('name', 'first');\napp.addService('data', {\n  id : 123,\n  ip : '127.0.0.1'\n});\n\n/*\nThis might seem useless in a single file where variables are accessible.\nHowever, it becomes very important for module separation.\n*/\napp.get('/info', async c => {\n  c.to({\n    name : c.service.name,\n    data : c.service.data\n  })\n})\n\napp.run(1234)\n\n```\n\n## Extending Request Context\n\nTo add extension support to the request context object, use `app.httpServ.context`. This property is the constructor for the request context.\n\n**Example:**\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n    debug: true\n})\n\n// 'this' represents the request context\napp.httpServ.context.prototype.testCtx = function () {\n    console.log(this.method, this.path)\n}\n\napp.get('/test', async ctx => {\n    ctx.testCtx()\n})\n\napp.run(1234)\n\n```\n\n## app.isMaster and app.isWorker\n\nNode.js v16.x recommends `isPrimary` over `isMaster`. However, `isMaster` is still available. After Topbit initialization, `app` has two getters: `isMaster` and `isWorker`. They function identically to `cluster` properties. Purposes:\n\n- Avoid writing `const cluster = require('cluster')` again.\n- Shield future incompatible changes in `cluster`, enhancing code compatibility.\n\n## daemon and run\n\n`run` parameters: `port`, `host`. `host` defaults to `0.0.0.0`. Can also be `sockPath` (path to .sock file), supported by http listen interface. Using .sock ignores host.\n\n`daemon` first two parameters match `run`. Third parameter is a number indicating how many child processes to use. Defaults to 0, which automatically creates child processes based on CPU core count. It maintains stable child process count, creating new ones if any terminate unexpectedly.\n\n**In cluster mode, max child processes will not exceed 2x CPU cores.**\n\nExample:\n\n```javascript\n\n// Host defaults to 0.0.0.0, port 1234\napp.run(1234)\n\n// Listen on localhost, only accessible locally\napp.run(1234, 'localhost')\n\n// Use 2 child processes, host defaults to 0.0.0.0\napp.daemon(1234, 2)\n\n// Use 3 child processes\napp.daemon(1234, 'localhost', 3)\n\n```\n\n## Logging\n\nThe framework provides global logging. When using cluster mode (`daemon` interface), use initialization option `globalLog` to enable global logs and specify a log file. In single process mode, logs output to terminal (can use output/error redirection to save to file).\n\n**Note: Only daemon execution (cluster mode) allows saving logs to file natively. `run` (single process) outputs to screen; use IO redirection to save.**\n\nBesides file saving and terminal output, `logHandle` option allows custom log processing functions.\n\n**Setting `logHandle` invalidates `logFile` and `errorLogFile`. See code for details.**\n\nExample:\n\n``` JavaScript\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n  debug: true,\n  // Enable global log\n  globalLog: true,\n\n  // Output to file. Default is 'stdio' (terminal).\n  logType: 'file'\n\n  // Log file for status codes 2xx or 3xx\n  logFile : '/tmp/topbit.log',\n\n  // Log file for errors (4xx or 5xx)\n  errorLogFile: '/tmp/topbit-error.log',\n\n  // Custom handler function. logFile/errorLogFile become invalid.\n  // Parameters: (worker, message)\n  // worker: see cluster worker docs\n  /*\n    msg is log object, properties:\n      {\n        type : '_log',\n        success : true,\n        log : '@ GET | https://localhost:2021/randst | 200 | 2020-10-31 20:27:7 | 127.0.0.1 | User-Agent'\n      }\n  */\n  logHandle : (w, msg) => {\n    console.log(w.id, msg)\n  }\n\n})\n\napp.daemon(1234, 3)\n\n```\n\nUsing middleware for logging does not conflict with global logging. However, middleware logging cannot capture 404s returned by the framework when no route matches (as context is not created to avoid overhead).\n\nFurthermore, this method integrates better with cluster mode as it uses master-worker communication internally.\n\n## Message Event Handling\n\nBased on the `message` event, in daemon mode (based on cluster module), a `setMsgEvent` function is provided to handle events sent by child processes.\n\nThis requires the message sent by worker processes to be an object, with a mandatory `type` property indicating the event name. Other fields can be custom.\n\nUsage:\n\n``` JavaScript\n\nconst Topbit = require('topbit')\nconst cluster = require('cluster')\n\nconst app = new Topbit({\n  debug: true,\n  loadInfoFile: '/tmp/loadinfo.log'\n})\n\nif (cluster.isMaster) {\n  app.setMsgEvent('test-msg', (worker, msg, handle) => {\n    // Child process receives message via message event\n    worker.send({\n      id : worker.id,\n      data : 'ok'\n    })\n\n    console.log(msg)\n  })\n} else {\n  // Receive message sent by worker.to\n  process.on('message', msg => {\n    console.log(msg)\n  })\n\n  setIneterval(() => {\n    process.send({\n      type : 'test-msg',\n      pid : process.pid,\n      time : (new Date()).toLocaleString()\n    })\n  }, 1000)\n\n}\n\n```\n\nSending messages from worker processes is complex. Since version 22.4.0, a `send` method is provided for quick message sending. It only sends to master from a worker process, so no extra worker check is needed.\n\n## app.send and app.workerMsg\n\nLet's rewrite the worker message sending part of the code above:\n\n```javascript\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n  debug: true,\n  loadInfoFile: '/tmp/loadinfo.log'\n})\n\n// Master process registers message event type. Worker process ignores this.\napp.setMsgEvent('test-msg', (worker, msg, handle) => {\n  // Child process receives message via message event\n  worker.send({\n    id : worker.id,\n    data : 'ok'\n  })\n\n  console.log(msg)\n})\n\n// Only worker process listens.\napp.workerMsg(msg => {\n  console.log(msg)\n})\n\ncluster.isWorker\n    &&\nsetInterval(() => {\n  // Only worker executes.\n  app.send('test-msg', {\n    pid: process.pid,\n    time: (new Date).toLocaleString()\n  })\n\n}, 1000)\n\napp.daemon(1234, 2)\n\n```\n\n## Automatically Adjusting Child Process Quantity\n\nThe parameter passed to `daemon` sets the base number of child processes, e.g.:\n\n``` JavaScript\n\n// Use 2 child processes to handle requests.\napp.daemon(1234, 2)\n\n```\n\nTo automatically create child processes based on load and terminate them when idle (maintaining base quantity), use `autoWorker` to set a maximum value. This value must be larger than the base quantity to take effect.\n\n```javascript\n\n// Max 9 child processes.\napp.autoWorker(9)\n\n//...\n\napp.daemon(1234, 2)\n\n```\n\nWhen load is high, child processes are created. After a period of idleness, processes with 0 connections are terminated, restoring the base number.\n\n**Available in v21.9.6+. Please use the latest version as this feature has been improved for stability and performance in subsequent versions.**\n\n----\n\n## 🛡️Strong Mode\n\nEnable strong mode via the `strong` option. This monitors `uncaughtException` and `unhandledRejection` events to ensure stable operation. Simplest usage: set `strong` to `true`.\n\n**All strong mode features can be implemented via the `process` module; this just simplifies it.**\n\n```javascript\n'use strict';\n\nconst Topbit = require('topbit');\n\nsetTimeout(() => {\n  // Throw exception inside timer loop\n  throw new Error(`test error`)\n}, 2000);\n\nconst app = new Topbit({\n    // Debug mode, output errors.\n    debug: true,\n    // Enable strong mode\n    strong: true\n});\n\napp.run(1234);\n\n```\n\nBy default, strong mode captures:\n\n```\n'TypeError', 'ReferenceError', 'RangeError', 'AssertionError', 'URIError', 'Error'\n```\n\nYou can customize handling by passing an object to `strong`.\n\n```javascript\n\n// Core code example\nconst app = new Topbit({\n    // Debug mode, output errors.\n    debug: true,\n    // Enable strong mode\n    strong: {\n      // Silent behavior, no error output.\n      quiet: true,\n      // Custom error handler\n      errorHandle: (err, errname) => {\n        //....\n      },\n\n      // Which errors to catch\n      catchErrors: [\n        'TypeError', 'URIError', 'Error', 'RangeError'\n      ]\n\n    }\n})\n\n```\n\n## 🔔Simultaneous HTTP and HTTPS?\n\nNote the question mark. You shouldn't do this in production. If HTTPS is enabled, HTTP isn't needed, and some frontend features won't work without HTTPS.\n\nIf needed (perhaps for testing), do this:\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit')\nconst http = require('node:http')\nconst https = require('https')\n\nconst app = new Topbit({\n    // Enable debug\n    debug: true,\n})\n\n// Below are http/1.1 services. For http2, enable http2 and compatibility mode.\n// Or use topbit-httpc extension.\n\n// In this case, you must set event listeners manually.\n\nlet http_server = http.createServer(app.httpServ.onRequest())\nlet https_server = https.createServer(app.httpServ.onRequest())\n\nhttp_server.listen(2025)\nhttps_server.listen(2026)\n\n```\n\n**Note: You cannot support http2 in this scenario, but you can use http2 to be compatible with http1.**\n\n## Request Limiting\n\nThe framework provides IP-based rate limiting to prevent dense requests from the same IP. For HTTP/2, use `http2limit` module from `topbit-toolkit`.\n\n```javascript\n'use strict';\n\nconst Topbit = require('topbit')\n\nconst app = new Topbit({\n    debug : true,\n    // Enable request limiting\n    useLimit: true,\n\n    // IPs allowed without frequency limit\n    allow: new Set(['127.0.0.1']),\n\n    // IPs to deny\n    deny: (ip) => {\n      // Example only, supports function and Set\n      if (ip.indexOf('1.') === 0) return false\n      return true\n    },\n    \n    // Max requests per IP within unit time\n    maxIPRequest: 6,\n    \n    // Unit time, 15 seconds\n    unitTime: 15,\n    \n    // Max concurrent connections per worker process\n    maxConn: 2000,\n\n    loadMonitor: true,\n    loadInfoType : 'text',\n    globalLog : true,\n    logType: 'stdio',\n    // Load info in memory\n    loadInfoFile : '--mem'\n})\n\n\napp.get('/', async ctx => {\n  ctx.to('ok')\n})\n\n// Use 3 worker processes. Each allows 6 requests/unit time.\n// Total approx 6 requests? Set maxIPRequest to 2.\napp.daemon(1234, '0.0.0.0', 3)\n\n```\n\n## Other\n\n- After running, Topbit has a final wrapper middleware. Setting `c.data` returns data. It detects simple text types and sets content-type automatically (text/plain, text/html, application/json) if not set.\n\n- Defaults to limiting max URL length and sets a max memory usage rate based on hardware.\n\n- All of this can be extended/overridden via config options or middleware.\n\n- It is fast, and we focus on optimization. If comparing, add multiple middleware and hundreds of routes to test.\n\n- Provides a `sched` function to quickly set cluster scheduling policy ('rr' or 'none'). Sets `cluster.schedulingPolicy`.\n\nThe framework automatically detects memory size and sets limits on initialization. You can change limits via properties in `secure` after init, but this requires using `daemon` (master managing workers).\n\n```javascript\n'use strict'\n\nconst Topbit = require('topbit');\n\nlet app = new Topbit();\n\n/*\n Operations below can be controlled via memFactor option. See config options above.\n */\n\n// Max memory 600M, auto restart only when connection count is 0.\napp.secure.maxmem = 600_000_000;\n\n// Mandatory restart max memory limit 900M. Total memory usage including Buffers.\n// Must be larger than maxmem. If memory > maxmem AND connections != 0, \n// AND continues to exceed diemem, process restarts immediately.\napp.secure.diemem = 900_000_000;\n\n// Max RSS memory 800M. Program memory usage, excluding Buffer allocations.\napp.secure.maxrss = 800_000_000;\n\napp.get('/', async c => {\n  c.to('ok');\n})\n\napp.daemon(8008, 2);\n\n```\n\n**Note: Requires `loadMonitor` option (enabled by default).**\n\nHere is the English translation of the document:\n\n---\n\n# 🧩 Middleware Extensions and Other Extensions 📜\n\n---\n\nAs a Web framework, providing only basic functionality is not enough. Many basic functions are used across all Web services, which inevitably leads to the creation of universal extension modules.\n\nIn Topbit's global middleware design mechanism, most web service-related extensions can be completed by developing a middleware extension. You can refer to the `Middleware` section; this plugin mechanism is extremely flexible.\n\n**Topbit provides several universal middleware extensions that developers can use as needed.**\n\n**It also provides other extension modules: Route Loader, Token Session Verification, Command Argument Parsing, Automatic Error Log Processing, and ZIP compression/decompression.**\n\n## Importing Middleware Extensions\n\nAll middleware extensions are located under `Topbit.extensions`. Example:\n\n```javascript\n'use strict'\n\nprocess.chdir(__dirname)\n\nconst Topbit = require('Topbit')\n\n// Import extensions via destructuring assignment\nconst {Cors, ToFile} = Topbit.extensions\n\nconst app = new Topbit({\n  debug: true,\n  // Enable logging, alias for globalLog\n  log: true\n})\n\n// CORS extension runs before body parsing\n// Middleware added via 'use' runs after body data parsing\napp.pre(new Cors())\n  .use(new ToFile, {method: ['PUT', 'POST']})\n\napp.post('/file', async ctx => {\n  let f = ctx.getFile('file')\n  if (!f) return ctx.status(400).to('file not found')\n\n  ctx.to(\n    await f.toFile('./uploads')\n  )\n})\n\napp.run(1235)\n```\n\n## ☲ Middleware Extensions\n\n| Middleware | Description |\n| :--- | :--- |\n| **Cors** | Middleware to support Cross-Origin Resource Sharing (CORS). |\n| **Resource** | Static resource processing; a powerful service for serving static files. |\n| **ToFile** | Equips uploaded file objects with a `toFile` method. |\n| **SSE** | SSE (Server-Sent Events) protocol middleware for HTTP-based data streaming. |\n| **Proxy** | Reverse proxy for the HTTP/1.1 protocol, supporting load balancing and alive checks. |\n| **Http2Proxy** | Reverse proxy for the HTTP/2 protocol, supporting load balancing and alive checks. |\n| **SNI** | Support for multi-domain HTTPS (Server Name Indication). |\n| **ParamCheck** | Request parameter validation, supporting checks for `param`, `query`, and `body`. |\n| **JWT** | Token verification using the JWT protocol. (Note: `Topbit.Token` is recommended instead as it is much stronger than JWT). |\n| **Cookie** | Parses cookies from the frontend request headers. |\n| **Session** | Session management using a local file mechanism. |\n\n---\n\n### 1. Cors (Cross-Origin Support)\n\nMiddleware that supports cross-origin requests. It supports cross-origin communication via the `origin` header as well as resource inclusion via `referer`, allowing for flexible selection and configuration.\n\n**Basic Usage:**\n\n```javascript\nconst Topbit = require('topbit')\nconst {Cors} = Topbit.extensions\n\nlet cr = new Cors({\n    // Defaults to *, meaning cross-origin is enabled for all.\n    // If you want to specify supported domains, pass an array.\n    // Note: This specifies the domain of the application page accessing the API.\n    allow : [\n        'https://a.com',\n        'https://www.a.com',\n    ],\n\n    // Defaults to content-type only\n    allowHeaders : 'authorization,content-type',\n\n    // Caches OPTIONS requests for 60 seconds; the browser will read from cache during this period.\n    optionsCache: 60,\n\n    // Defaults to '*', sets allowed request methods.\n    // requestHeaders : '*'\n\n    // Defaults to '', indicating which headers can be exposed to the requester. Multiple headers are separated by commas.\n    // exposeHeaders: 'x-test-key,x-type'\n})\n\napp.pre(cr)\n\n// Supports OPTIONS requests. Browsers send an OPTIONS preflight request before processing POST/PUT/DELETE.\n// You must handle OPTIONS requests to fully support CORS.\napp.options('/*', async c => {})\n```\n\n**Advanced Configuration (Referer Check & Grouping):**\n\n```javascript\nlet cr = new cors({\n  // Do not allow empty referer\n  allowEmptyReferer: false,\n\n  // Route groups that allow empty referer.\n  // Group names are custom; refer to the framework's route grouping feature.\n  // This is mainly used when API development also needs to serve pages.\n  emptyRefererGroup: [\n    '@webapp', '@pages'\n  ],\n\n  allow: [\n     // Default string format allows both origin cross-domain and referer external linking\n    'https://w.a.com',\n    'https://w.x.cn',\n\n    {url: 'https://servicewechat.com/wx234hiohr23', referer: true},\n    // Not applied to referer check; if a request submits referer as self-define, it will not pass\n    {url: 'self-define', referer: false}\n  ],\n})\n```\n\n---\n\n### 2. Resource (Static Resource Processing)\n\nStatic resource processing service, mainly used for hosting JS, CSS, images, audio, and other static files. Supports cache control, route prefix correction, and more.\n\n**Basic Usage:**\n\n```javascript\nconst Topbit = require('topbit')\nconst {Resource} = Topbit.extensions\n\nlet st = new Resource({\n    // Set the directory where static resources are located\n    staticPath: './public'\n})\n\n// Execute middleware only for the 'static' group.\napp.use(st, {group: 'static'})\n\n// Add static resource route. Assuming 'css/a.css' exists in the 'public' directory.\n// Access via /static/css/a.css\napp.get('/static/*', async c => {\n    // Request is in group 'static'\n}, '@static')\n```\n\n**Quick Example & Configuration Details:**\n\n```javascript\nlet st = new Resource({\n    // Set the directory where static resources are located\n    staticPath: './public',\n\n    // Route path: Frontend must start with /static/, mapping to files in ./public\n    routePath : '/static/*',\n\n    // Specify route group\n    routeGroup: '_static',\n\n    // Whether to support decoding of Chinese paths (default false)\n    decodePath: true,\n\n    // Prefix path correction. If set to xyz, it automatically corrects to /xyz.\n    // prepath : '',\n\n    // Maximum file size to cache (in bytes); files larger than this will not be cached.\n    // Valid range: 10000 ~ 500000000. Values outside this range are reset to the\n    // default 10000000 (reset, not clamped to the boundary).\n    maxFileSize: 12_000_000,\n\n    // Set the value of the cache-control header, defaults to null\n    cacheControl: 'max-age=3600',\n    \n    // Maximum total cache size (default 120MB)\n    maxCacheSize: 120_000_000,\n\n    // Failure limit and cache release probability\n    failedLimit: 50,\n    prob: 6\n})\n\nst.init(app)\n\n// Automatically added to the _static group.\n// Example: If favicon.ico is in the public directory, it can be accessed via this request.\napp.get('/favicon.ico', async c => {}, {group: '_static'})\n```\n\n**Interface Description:**\n*   `addType(obj)`: Add mapping from extension to content-type.\n*   `clearCache()`: Clear the cache.\n*   `removeCache(path)` / `removeNameCache(name)`: Drop cache entries by path or name fragment, adjusting the accounted size.\n*   `canCache()`: Whether a new cache entry can still be admitted.\n\n**Content coding negotiation**\n\nText-ish resources (`text/*`, `.json`, `font/*`) larger than 1KB are gzipped. Whether the compressed form is actually sent depends on the request's `accept-encoding`:\n\n| `accept-encoding` | Behaviour |\n|---|---|\n| Absent | Compress (RFC 9110 §12.5.3: no stated preference means any coding is acceptable) |\n| Present but empty | Do not compress (the client explicitly wants no content coding) |\n| Contains `gzip` | Compress |\n| Anything else (`identity`, `br, deflate`) | Do not compress |\n\nThe check is simply whether `gzip` appears; **q-values are not parsed**. This is deliberate: a client that does not want compressed content should not advertise gzip in the first place, and using `gzip;q=0` to say \"I know it but don't send it\" is rare enough that a character-level parser is not worth its weight. So `accept-encoding: gzip;q=0` still yields a compressed response.\n\nThe cache keeps **both the raw and the gzipped bytes** and picks per request, so a client that does not accept gzip never receives compressed bytes. The two are distinct representations of the same resource: their ETags differ (the compressed one ends in `-gz`), responses carry `Vary: accept-encoding`, and conditional requests are evaluated against whichever representation would be sent. A compressed result that ends up larger than the original is discarded.\n\nFiles above `maxFileSize` are streamed without caching or compression. When the cache is full the same applies — the file is no longer accumulated in memory just to populate a cache that cannot accept it.\n\n---\n\n### 3. ToFile (File Upload Objectification)\n\nEquips uploaded file objects with a `toFile` method, facilitating file saving in an object-oriented style.\n\n```javascript\nconst Topbit = require('topbit')\nconst {ToFile} = Topbit.extensions\n\napp.use( new ToFile() )\n\napp.post('/upload', async c => {\n    // Get the uploaded file object\n    let f = c.getFile('image')\n\n    if (!f) {\n        return c.status(400).oo('image file not found')\n    }\n\n    // Move the file to the 'images' directory (ensure the directory exists).\n    // The second parameter is optional to specify a filename; defaults to a unique name based on timestamp and random number.\n    let fname = await f.toFile('./images')\n\n    // Return filename\n    c.ok(fname)\n})\n\napp.run(1234)\n```\n\n---\n\n### 4. SSE (Server-Side Messaging)\n\nServer-Sent Events (SSE) middleware based on the HTTP protocol, used for the server to proactively push data streams to the client.\n\n**Basic Usage:**\n\n```javascript\nconst Topbit = require('topbit')\nconst {SSE} = Topbit.extensions\n\nlet s = new SSE({\n  // Timeout 20 seconds; connection closes automatically after this time\n  timeout: 20000,\n\n  // Reconnection time; default is 0 meaning do not reconnect\n  retry: 5000,\n\n  // Timer interval; execute the handler function every 2 seconds\n  timeSlice: 2000\n})\n\n// Set handler function, ctx is the request context\ns.handle = (ctx) => {\n    // Send a single message\n    ctx.sendmsg({event: 'eat', data: 'Rice'})\n    \n    if (Date.now() % 5 === 0) {\n        // Send multiple messages. Strings or numbers are automatically converted to message format.\n        // Default event is 'message'.\n        ctx.sendmsg([\n            {event: 'clock', data: Date.now()},\n            'May we all be blessed with longevity.',\n            Math.random()\n        ])\n    }\n}\n\n// Enable middleware only for route group 'sse'\napp.use( s, {group: 'sse'} )\n\napp.get('/sse', async ctx => {}, {group: 'sse'})\n\napp.run(1234)\n```\n\n**Generator Mode:**\nSuitable for scenarios requiring dynamic interval adjustment or precise control.\n\n```javascript\nlet s = new SSE({\n  timeout: 20000,\n  retry: 5000,\n  timeSlice: 10,\n  mode: 'yield' // Enable generator mode\n})\n\ns.handle = (ctx) => {\n    ctx.sendmsg({event: 'eat', data: 'Rice'})\n    // Use await ctx.sse.moment(ms) for delay\n    await ctx.sse.moment(100)\n}\n```\n\n---\n\n### 5. Proxy (HTTP/1.1 Reverse Proxy)\n\nReverse proxy for HTTP/1.1 protocol, supporting load balancing and Alive Check.\n\n**port option (optional):** Tell the proxy the listening port so it auto-appends the port to hostname keys in `config`; requests are then matched directly against the Host header without port parsing.\n- Default `''`; `0` and empty string mean no auto-appending (the config key must exactly match the Host header).\n- Can be a number or numeric string, range 1 ~ 65535.\n- Non-80/443 ports: bare hostname `'a.com'` is replaced with `'a.com:port'`; a config key already ending with `:port` is kept as-is.\n- 80/443 ports: regardless of whether the config key is bare `'a.com'` or suffixed `'a.com:443'`, both keys (`'a.com'` + `'a.com:443'`) are generated and share the same backend config, so Host headers with or without the port both match.\n- When port is empty but the config key ends with `:80`/`:443`, the corresponding bare key is also auto-generated and both share.\n- When both a bare key and a suffixed key are configured, the first one wins; the latter's backend config is appended to the same array.\n\n**Basic Proxy Configuration:**\n\n```javascript\nconst Topbit = require('topbit')\nconst {Proxy} = Topbit.extensions\n\nlet hostcfg = {\n    // Simple mapping: default path is /\n    'a.com' : 'http://localhost:8001',\n\n    // Specific path mapping\n    'b.com' : {\n        path : '/xyz',\n        url : 'http://localhost:8002'\n    },\n\n    // Complex config and rewrite\n    'c.com' : [\n        {\n            path : '/',\n            url : 'http://localhost:8004',\n            rewrite: (ctx, path) => {\n              // Custom route rewrite rules\n              if (path.indexOf('/xyz') === 0) {\n                return path.replace('/xyz', '/w')\n              }\n            }\n        }\n    ]\n};\n\nconst pxy = new Proxy({\n    timeout: 10000,\n    // Tell the listening port so hostname keys get the port appended\n    port: 1234,\n    config: hostcfg\n})\n\npxy.init(app)\n\napp.run(1234)\n```\n\n**Path matching and cross-host fallback:**\n\nThe `path` in a backend entry is normalized into a prefix route: `/api` → `/api/*`, `/` → `/*` (parameter routes containing `/:` are kept as-is). Paths from all hosts are merged into a single global route table and registered with the framework; each distinct path is registered exactly once, so multiple hosts declaring the same path never conflict.\n\nBecause route matching happens **before** middleware and is not Host-aware, the `c.routepath` handed to the proxy is the **globally most specific** one, which is not necessarily a path the current host declared. The proxy automatically **falls back** to the longest prefix that host did declare:\n\n```javascript\nconst pxy = new Proxy({\n    port: 443,\n    config: {\n        'a.com': [\n            { path: '/api',    url: 'http://127.0.0.1:8001' },\n            { path: '/static', url: 'http://127.0.0.1:8002' }\n        ],\n        'b.com': [{ path: '/',       url: 'http://127.0.0.1:8003' }],\n        'c.com': [{ path: '/api/v2', url: 'http://127.0.0.1:8004' }]\n    }\n})\n```\n\n| Request | Matched routepath | Fallback | Forwarded to |\n|---|---|---|---|\n| `a.com/api/x` | `/api/*` | direct hit | a's `/api` backend |\n| `a.com/api/v2/x` | `/api/v2/*` | → `/api/*` | a's `/api` backend |\n| `a.com/other` | `/*` | nothing to fall back to | no match |\n| `b.com/api/v2/x` | `/api/v2/*` | → `/*` | b's `/` backend, full path `/api/v2/x` forwarded |\n| `c.com/api/x` | `/api/*` | nothing to fall back to | no match |\n\nFallback rules:\n\n- The fallback map is computed once in `init()`; at runtime it costs a single hash lookup.\n- **Only paths the proxy itself registered are eligible.** Your own application routes (e.g. `app.get('/admin/:id')`) are not in the map and will never be swallowed by the proxy.\n- **It only falls back to a path that host actually declared** — no backend is invented.\n- If there is nothing to fall back to, the request is treated as unmatched.\n- After a fallback, `c.routepath` is rewritten to the path actually used, so later middleware sees the real value.\n- Parameter routes (those not ending in `/*`) do not participate.\n\n**defaultServer (default host):**\n\nSpecifies the fallback target when the request Host matches no configured host. The typical use is routing traffic for retired domains to one canonical domain.\n\n```javascript\nconst pxy = new Proxy({\n    port: 443,\n    defaultServer: 'main.com',       // 'https://main.com' also works; the scheme is stripped\n    config: {\n        'a.com'   : 'http://127.0.0.1:8001',\n        'main.com': 'http://127.0.0.1:8009'\n    }\n})\n```\n\n- The value is a **host name**, not a URL. Forms like `'https://main.com/x'` have the scheme and path stripped, leaving `main.com`.\n- Works together with `port`: you may give the bare host exactly as written in `config`, and the proxy appends the port before matching.\n- If the normalized value is not present in `config`, a warning is printed and the option is ignored, leaving behavior unchanged.\n- **It only applies when the Host does not match.** A matching Host with no matching path does not fall back — that means \"this domain has no such path\".\n- The host fallback happens before the path fallback, so the fallback target host also benefits from path fallback.\n- HTTP/1.0 requests with no Host header are caught by `defaultServer` as well.\n\n**Handling unmatched requests:**\n\nWhen the proxy does not match (neither Host nor path), it calls `next()` and hands the request back to the middleware chain. The routes registered by `init()` belong to the group `topbit_proxy`, so adding a middleware to that group lets you customise the unmatched response:\n\n```javascript\n// Works the same for Proxy / ProxyNoAgent / Http2Proxy\napp.use(async (c, next) => {\n    return c.status(404).html('<h1>404 Not Found</h1>')\n}, '@topbit_proxy')\n```\n\nThree properties of this middleware:\n\n- It sits **downstream** of the proxy middleware, so it does not run when the proxy matches.\n- It only applies to routes the proxy registered and **never affects your own application routes**.\n- It is orthogonal to `defaultServer`: an unmatched Host is taken over by `defaultServer` first; only a matched Host with an unmatched path reaches this middleware.\n\nIf `full` mode is on and `defaultServer` is not configured, an unmatched request returns 502 directly instead of calling `next()`.\n\n**Load Balancing Configuration:**\nImplemented via configuration arrays, supporting `weight` and alive checks.\n\n```javascript\nlet load_balance_cfg = {\n    'a.com' : [\n        {\n            path : '/',\n            url : 'http://localhost:1234',\n            // Check service liveness every 3 seconds\n            aliveCheckInterval : 3,\n            aliveCheckPath : '/alive-check',\n            // Weight: larger numbers mean higher weight\n            weight: 3\n        },\n        {\n            path : '/',\n            url : 'http://localhost:1235',\n            aliveCheckInterval : 3,\n            aliveCheckPath : '/ok',\n            weight: 2\n        }\n    ]\n}\n\nconst pxy = new Proxy({\n    timeout: 10000,\n    config: load_balance_cfg\n})\n\npxy.init(app)\n```\n\n**Request body size limit:** the proxy is a `pre` middleware and streams the request body to the backend before the framework ever reads it, so the **framework's `maxBody` does not apply to proxied requests** — the proxy enforces its own limit.\n\nPrecedence (same shape as `requestTimeout`):\n\n| Priority | Source | Description |\n|---|---|---|\n| 1 | `ctx.box.proxyMaxBody` | Set by a pre middleware, applies to that one request |\n| 2 | backend option `maxBody` | Per-backend override |\n| 3 | proxy option `maxBody` | Defaults to `50000000` (50MB) |\n\nThe comparison matches the framework's: accumulated bytes against the limit, so `0` means no request body is allowed. A request that declares a `content-length` over the limit is rejected up front (no backend connection is opened); `chunked` requests are counted while forwarding and aborted as soon as they exceed it. Both return **413**.\n\n```javascript\n// The pre middleware must be registered BEFORE pxy.init(app) to run ahead of the proxy\napp.use(async (c, next) => {\n    if (c.path.startsWith('/upload')) c.box.proxyMaxBody = 100 * 1024 * 1024\n    return await next(c)\n}, {pre: true})\n\nconst pxy = new Proxy({\n    maxBody: 2 * 1024 * 1024,   // instance default\n    config: {\n        'a.com': [\n            { url: 'http://127.0.0.1:1234', maxBody: 20 * 1024 * 1024 }  // per-backend override\n        ]\n    }\n})\n\npxy.init(app)\n```\n\n**Full list of constructor options:**\n\n| Option | Default | Description |\n|---|---|---|\n| `config` | `{}` | Proxy table; key is a host, value is a string, object, or array of objects |\n| `port` | `''` | Listening port, used to auto-append to the keys of `config`; see above |\n| `defaultServer` | `''` | Fallback host when the Host does not match; see above |\n| `timeout` | `35000` | Timeout for a single backend request (ms); can be overridden per backend |\n| `requestTimeout` | `600000` | Overall transfer time limit (ms), counted from when response headers arrive; `0` means unlimited |\n| `maxBody` | `50000000` | Request body limit in bytes; see above |\n| `methods` | `['GET','POST','PUT','DELETE','OPTIONS','HEAD','PATCH','TRACE']` | Methods used when registering routes |\n| `full` | `false` | Full-proxy mode: an unmatched request returns 502 instead of calling `next()`. When `defaultServer` is configured the fallback takes precedence |\n| `addIP` | `false` | When `true`, **append** the client IP to an existing real-IP header (comma-separated chain) instead of overwriting it |\n| `realIPHeader` | `'x-real-ip'` | Name of the header carrying the client IP |\n| `realHostHeader` | `'x-real-host'` | Name of the header carrying the Host the client originally requested |\n| `realProtoHeader` | `'x-real-proto'` | Name of the header carrying the protocol the client originally used (`http` / `https`) |\n| `balancer` | `null` | Custom load balancer providing `select(c, prlist, pxybalance)`. `Topbit.ProxyBalancer` (identity-based consistent hashing) is built in |\n| `connectOptions` | `{family: 4}` | Connection options passed to the underlying request; each key can be overridden per backend |\n| `maxSockets` | `1000` | Max sockets per backend Agent |\n| `maxFreeSockets` | `100` | Max free sockets per backend Agent |\n| `agentKeepAlive` | `true` | Whether the backend Agent uses keepAlive |\n| `autoClearListeners` | `false` | Remove listeners from the backend response object after forwarding completes |\n| `debug` | `false` | Print debug output |\n\n**Backen","readmeFilename":"README.md"}