@morojs/moro 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/dist/core/config/index.d.ts +19 -0
  4. package/dist/core/config/index.js +59 -0
  5. package/dist/core/config/index.js.map +1 -0
  6. package/dist/core/config/loader.d.ts +6 -0
  7. package/dist/core/config/loader.js +288 -0
  8. package/dist/core/config/loader.js.map +1 -0
  9. package/dist/core/config/schema.d.ts +335 -0
  10. package/dist/core/config/schema.js +286 -0
  11. package/dist/core/config/schema.js.map +1 -0
  12. package/dist/core/config/utils.d.ts +50 -0
  13. package/dist/core/config/utils.js +185 -0
  14. package/dist/core/config/utils.js.map +1 -0
  15. package/dist/core/database/adapters/drizzle.d.ts +29 -0
  16. package/dist/core/database/adapters/drizzle.js +366 -0
  17. package/dist/core/database/adapters/drizzle.js.map +1 -0
  18. package/dist/core/database/adapters/index.d.ts +8 -0
  19. package/dist/core/database/adapters/index.js +48 -0
  20. package/dist/core/database/adapters/index.js.map +1 -0
  21. package/dist/core/database/adapters/mongodb.d.ts +35 -0
  22. package/dist/core/database/adapters/mongodb.js +215 -0
  23. package/dist/core/database/adapters/mongodb.js.map +1 -0
  24. package/dist/core/database/adapters/mysql.d.ts +23 -0
  25. package/dist/core/database/adapters/mysql.js +149 -0
  26. package/dist/core/database/adapters/mysql.js.map +1 -0
  27. package/dist/core/database/adapters/postgresql.d.ts +24 -0
  28. package/dist/core/database/adapters/postgresql.js +160 -0
  29. package/dist/core/database/adapters/postgresql.js.map +1 -0
  30. package/dist/core/database/adapters/redis.d.ts +50 -0
  31. package/dist/core/database/adapters/redis.js +266 -0
  32. package/dist/core/database/adapters/redis.js.map +1 -0
  33. package/dist/core/database/adapters/sqlite.d.ts +23 -0
  34. package/dist/core/database/adapters/sqlite.js +194 -0
  35. package/dist/core/database/adapters/sqlite.js.map +1 -0
  36. package/dist/core/database/index.d.ts +2 -0
  37. package/dist/core/database/index.js +20 -0
  38. package/dist/core/database/index.js.map +1 -0
  39. package/dist/core/docs/index.d.ts +63 -0
  40. package/dist/core/docs/index.js +170 -0
  41. package/dist/core/docs/index.js.map +1 -0
  42. package/dist/core/docs/openapi-generator.d.ts +124 -0
  43. package/dist/core/docs/openapi-generator.js +413 -0
  44. package/dist/core/docs/openapi-generator.js.map +1 -0
  45. package/dist/core/docs/simple-docs.d.ts +21 -0
  46. package/dist/core/docs/simple-docs.js +268 -0
  47. package/dist/core/docs/simple-docs.js.map +1 -0
  48. package/dist/core/docs/swagger-ui.d.ts +28 -0
  49. package/dist/core/docs/swagger-ui.js +317 -0
  50. package/dist/core/docs/swagger-ui.js.map +1 -0
  51. package/dist/core/docs/zod-to-openapi.d.ts +29 -0
  52. package/dist/core/docs/zod-to-openapi.js +414 -0
  53. package/dist/core/docs/zod-to-openapi.js.map +1 -0
  54. package/dist/core/events/event-bus.d.ts +27 -0
  55. package/dist/core/events/event-bus.js +193 -0
  56. package/dist/core/events/event-bus.js.map +1 -0
  57. package/dist/core/events/index.d.ts +2 -0
  58. package/dist/core/events/index.js +7 -0
  59. package/dist/core/events/index.js.map +1 -0
  60. package/dist/core/framework.d.ts +57 -0
  61. package/dist/core/framework.js +432 -0
  62. package/dist/core/framework.js.map +1 -0
  63. package/dist/core/http/http-server.d.ts +114 -0
  64. package/dist/core/http/http-server.js +1154 -0
  65. package/dist/core/http/http-server.js.map +1 -0
  66. package/dist/core/http/index.d.ts +3 -0
  67. package/dist/core/http/index.js +10 -0
  68. package/dist/core/http/index.js.map +1 -0
  69. package/dist/core/http/router.d.ts +14 -0
  70. package/dist/core/http/router.js +113 -0
  71. package/dist/core/http/router.js.map +1 -0
  72. package/dist/core/logger/filters.d.ts +9 -0
  73. package/dist/core/logger/filters.js +134 -0
  74. package/dist/core/logger/filters.js.map +1 -0
  75. package/dist/core/logger/index.d.ts +3 -0
  76. package/dist/core/logger/index.js +26 -0
  77. package/dist/core/logger/index.js.map +1 -0
  78. package/dist/core/logger/logger.d.ts +49 -0
  79. package/dist/core/logger/logger.js +332 -0
  80. package/dist/core/logger/logger.js.map +1 -0
  81. package/dist/core/logger/outputs.d.ts +42 -0
  82. package/dist/core/logger/outputs.js +110 -0
  83. package/dist/core/logger/outputs.js.map +1 -0
  84. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +15 -0
  85. package/dist/core/middleware/built-in/adapters/cache/file.js +128 -0
  86. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -0
  87. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +5 -0
  88. package/dist/core/middleware/built-in/adapters/cache/index.js +28 -0
  89. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -0
  90. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +11 -0
  91. package/dist/core/middleware/built-in/adapters/cache/memory.js +65 -0
  92. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -0
  93. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +17 -0
  94. package/dist/core/middleware/built-in/adapters/cache/redis.js +91 -0
  95. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -0
  96. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +21 -0
  97. package/dist/core/middleware/built-in/adapters/cdn/azure.js +40 -0
  98. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -0
  99. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +14 -0
  100. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +77 -0
  101. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -0
  102. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +15 -0
  103. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +73 -0
  104. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -0
  105. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +5 -0
  106. package/dist/core/middleware/built-in/adapters/cdn/index.js +28 -0
  107. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -0
  108. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -0
  109. package/dist/core/middleware/built-in/adapters/index.js +26 -0
  110. package/dist/core/middleware/built-in/adapters/index.js.map +1 -0
  111. package/dist/core/middleware/built-in/auth.d.ts +2 -0
  112. package/dist/core/middleware/built-in/auth.js +38 -0
  113. package/dist/core/middleware/built-in/auth.js.map +1 -0
  114. package/dist/core/middleware/built-in/cache.d.ts +3 -0
  115. package/dist/core/middleware/built-in/cache.js +188 -0
  116. package/dist/core/middleware/built-in/cache.js.map +1 -0
  117. package/dist/core/middleware/built-in/cdn.d.ts +3 -0
  118. package/dist/core/middleware/built-in/cdn.js +115 -0
  119. package/dist/core/middleware/built-in/cdn.js.map +1 -0
  120. package/dist/core/middleware/built-in/cookie.d.ts +14 -0
  121. package/dist/core/middleware/built-in/cookie.js +68 -0
  122. package/dist/core/middleware/built-in/cookie.js.map +1 -0
  123. package/dist/core/middleware/built-in/cors.d.ts +2 -0
  124. package/dist/core/middleware/built-in/cors.js +29 -0
  125. package/dist/core/middleware/built-in/cors.js.map +1 -0
  126. package/dist/core/middleware/built-in/csp.d.ts +22 -0
  127. package/dist/core/middleware/built-in/csp.js +74 -0
  128. package/dist/core/middleware/built-in/csp.js.map +1 -0
  129. package/dist/core/middleware/built-in/csrf.d.ts +9 -0
  130. package/dist/core/middleware/built-in/csrf.js +66 -0
  131. package/dist/core/middleware/built-in/csrf.js.map +1 -0
  132. package/dist/core/middleware/built-in/error-tracker.d.ts +1 -0
  133. package/dist/core/middleware/built-in/error-tracker.js +19 -0
  134. package/dist/core/middleware/built-in/error-tracker.js.map +1 -0
  135. package/dist/core/middleware/built-in/index.d.ts +70 -0
  136. package/dist/core/middleware/built-in/index.js +70 -0
  137. package/dist/core/middleware/built-in/index.js.map +1 -0
  138. package/dist/core/middleware/built-in/performance-monitor.d.ts +1 -0
  139. package/dist/core/middleware/built-in/performance-monitor.js +22 -0
  140. package/dist/core/middleware/built-in/performance-monitor.js.map +1 -0
  141. package/dist/core/middleware/built-in/rate-limit.d.ts +6 -0
  142. package/dist/core/middleware/built-in/rate-limit.js +47 -0
  143. package/dist/core/middleware/built-in/rate-limit.js.map +1 -0
  144. package/dist/core/middleware/built-in/request-logger.d.ts +1 -0
  145. package/dist/core/middleware/built-in/request-logger.js +15 -0
  146. package/dist/core/middleware/built-in/request-logger.js.map +1 -0
  147. package/dist/core/middleware/built-in/session.d.ts +41 -0
  148. package/dist/core/middleware/built-in/session.js +209 -0
  149. package/dist/core/middleware/built-in/session.js.map +1 -0
  150. package/dist/core/middleware/built-in/sse.d.ts +6 -0
  151. package/dist/core/middleware/built-in/sse.js +73 -0
  152. package/dist/core/middleware/built-in/sse.js.map +1 -0
  153. package/dist/core/middleware/built-in/validation.d.ts +2 -0
  154. package/dist/core/middleware/built-in/validation.js +31 -0
  155. package/dist/core/middleware/built-in/validation.js.map +1 -0
  156. package/dist/core/middleware/index.d.ts +21 -0
  157. package/dist/core/middleware/index.js +152 -0
  158. package/dist/core/middleware/index.js.map +1 -0
  159. package/dist/core/modules/auto-discovery.d.ts +27 -0
  160. package/dist/core/modules/auto-discovery.js +255 -0
  161. package/dist/core/modules/auto-discovery.js.map +1 -0
  162. package/dist/core/modules/index.d.ts +2 -0
  163. package/dist/core/modules/index.js +11 -0
  164. package/dist/core/modules/index.js.map +1 -0
  165. package/dist/core/modules/modules.d.ts +10 -0
  166. package/dist/core/modules/modules.js +137 -0
  167. package/dist/core/modules/modules.js.map +1 -0
  168. package/dist/core/networking/index.d.ts +2 -0
  169. package/dist/core/networking/index.js +9 -0
  170. package/dist/core/networking/index.js.map +1 -0
  171. package/dist/core/networking/service-discovery.d.ts +38 -0
  172. package/dist/core/networking/service-discovery.js +233 -0
  173. package/dist/core/networking/service-discovery.js.map +1 -0
  174. package/dist/core/networking/websocket-manager.d.ts +27 -0
  175. package/dist/core/networking/websocket-manager.js +211 -0
  176. package/dist/core/networking/websocket-manager.js.map +1 -0
  177. package/dist/core/routing/app-integration.d.ts +42 -0
  178. package/dist/core/routing/app-integration.js +152 -0
  179. package/dist/core/routing/app-integration.js.map +1 -0
  180. package/dist/core/routing/index.d.ts +106 -0
  181. package/dist/core/routing/index.js +343 -0
  182. package/dist/core/routing/index.js.map +1 -0
  183. package/dist/core/runtime/aws-lambda-adapter.d.ts +43 -0
  184. package/dist/core/runtime/aws-lambda-adapter.js +108 -0
  185. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -0
  186. package/dist/core/runtime/base-adapter.d.ts +16 -0
  187. package/dist/core/runtime/base-adapter.js +105 -0
  188. package/dist/core/runtime/base-adapter.js.map +1 -0
  189. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +18 -0
  190. package/dist/core/runtime/cloudflare-workers-adapter.js +131 -0
  191. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -0
  192. package/dist/core/runtime/index.d.ts +14 -0
  193. package/dist/core/runtime/index.js +56 -0
  194. package/dist/core/runtime/index.js.map +1 -0
  195. package/dist/core/runtime/node-adapter.d.ts +15 -0
  196. package/dist/core/runtime/node-adapter.js +204 -0
  197. package/dist/core/runtime/node-adapter.js.map +1 -0
  198. package/dist/core/runtime/vercel-edge-adapter.d.ts +10 -0
  199. package/dist/core/runtime/vercel-edge-adapter.js +106 -0
  200. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -0
  201. package/dist/core/utilities/circuit-breaker.d.ts +14 -0
  202. package/dist/core/utilities/circuit-breaker.js +42 -0
  203. package/dist/core/utilities/circuit-breaker.js.map +1 -0
  204. package/dist/core/utilities/container.d.ts +116 -0
  205. package/dist/core/utilities/container.js +529 -0
  206. package/dist/core/utilities/container.js.map +1 -0
  207. package/dist/core/utilities/hooks.d.ts +24 -0
  208. package/dist/core/utilities/hooks.js +131 -0
  209. package/dist/core/utilities/hooks.js.map +1 -0
  210. package/dist/core/utilities/index.d.ts +4 -0
  211. package/dist/core/utilities/index.js +22 -0
  212. package/dist/core/utilities/index.js.map +1 -0
  213. package/dist/core/validation/index.d.ts +30 -0
  214. package/dist/core/validation/index.js +144 -0
  215. package/dist/core/validation/index.js.map +1 -0
  216. package/dist/index.d.ts +30 -0
  217. package/dist/index.js +72 -0
  218. package/dist/index.js.map +1 -0
  219. package/dist/moro.d.ts +82 -0
  220. package/dist/moro.js +679 -0
  221. package/dist/moro.js.map +1 -0
  222. package/dist/types/cache.d.ts +34 -0
  223. package/dist/types/cache.js +3 -0
  224. package/dist/types/cache.js.map +1 -0
  225. package/dist/types/cdn.d.ts +19 -0
  226. package/dist/types/cdn.js +3 -0
  227. package/dist/types/cdn.js.map +1 -0
  228. package/dist/types/core.d.ts +13 -0
  229. package/dist/types/core.js +3 -0
  230. package/dist/types/core.js.map +1 -0
  231. package/dist/types/database.d.ts +29 -0
  232. package/dist/types/database.js +3 -0
  233. package/dist/types/database.js.map +1 -0
  234. package/dist/types/discovery.d.ts +6 -0
  235. package/dist/types/discovery.js +3 -0
  236. package/dist/types/discovery.js.map +1 -0
  237. package/dist/types/events.d.ts +116 -0
  238. package/dist/types/events.js +3 -0
  239. package/dist/types/events.js.map +1 -0
  240. package/dist/types/hooks.d.ts +38 -0
  241. package/dist/types/hooks.js +3 -0
  242. package/dist/types/hooks.js.map +1 -0
  243. package/dist/types/http.d.ts +51 -0
  244. package/dist/types/http.js +3 -0
  245. package/dist/types/http.js.map +1 -0
  246. package/dist/types/logger.d.ts +77 -0
  247. package/dist/types/logger.js +3 -0
  248. package/dist/types/logger.js.map +1 -0
  249. package/dist/types/module.d.ts +91 -0
  250. package/dist/types/module.js +3 -0
  251. package/dist/types/module.js.map +1 -0
  252. package/dist/types/runtime.d.ts +48 -0
  253. package/dist/types/runtime.js +3 -0
  254. package/dist/types/runtime.js.map +1 -0
  255. package/dist/types/session.d.ts +66 -0
  256. package/dist/types/session.js +3 -0
  257. package/dist/types/session.js.map +1 -0
  258. package/package.json +176 -0
  259. package/src/core/config/index.ts +47 -0
  260. package/src/core/config/loader.ts +366 -0
  261. package/src/core/config/schema.ts +346 -0
  262. package/src/core/config/utils.ts +220 -0
  263. package/src/core/database/README.md +228 -0
  264. package/src/core/database/adapters/drizzle.ts +425 -0
  265. package/src/core/database/adapters/index.ts +45 -0
  266. package/src/core/database/adapters/mongodb.ts +292 -0
  267. package/src/core/database/adapters/mysql.ts +217 -0
  268. package/src/core/database/adapters/postgresql.ts +211 -0
  269. package/src/core/database/adapters/redis.ts +331 -0
  270. package/src/core/database/adapters/sqlite.ts +255 -0
  271. package/src/core/database/index.ts +3 -0
  272. package/src/core/docs/index.ts +245 -0
  273. package/src/core/docs/openapi-generator.ts +588 -0
  274. package/src/core/docs/simple-docs.ts +305 -0
  275. package/src/core/docs/swagger-ui.ts +370 -0
  276. package/src/core/docs/zod-to-openapi.ts +532 -0
  277. package/src/core/events/event-bus.ts +249 -0
  278. package/src/core/events/index.ts +12 -0
  279. package/src/core/framework.ts +621 -0
  280. package/src/core/http/http-server.ts +1421 -0
  281. package/src/core/http/index.ts +11 -0
  282. package/src/core/http/router.ts +153 -0
  283. package/src/core/logger/filters.ts +148 -0
  284. package/src/core/logger/index.ts +20 -0
  285. package/src/core/logger/logger.ts +434 -0
  286. package/src/core/logger/outputs.ts +136 -0
  287. package/src/core/middleware/built-in/adapters/cache/file.ts +106 -0
  288. package/src/core/middleware/built-in/adapters/cache/index.ts +26 -0
  289. package/src/core/middleware/built-in/adapters/cache/memory.ts +73 -0
  290. package/src/core/middleware/built-in/adapters/cache/redis.ts +103 -0
  291. package/src/core/middleware/built-in/adapters/cdn/azure.ts +68 -0
  292. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +100 -0
  293. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +92 -0
  294. package/src/core/middleware/built-in/adapters/cdn/index.ts +23 -0
  295. package/src/core/middleware/built-in/adapters/index.ts +7 -0
  296. package/src/core/middleware/built-in/auth.ts +39 -0
  297. package/src/core/middleware/built-in/cache.ts +228 -0
  298. package/src/core/middleware/built-in/cdn.ts +151 -0
  299. package/src/core/middleware/built-in/cookie.ts +90 -0
  300. package/src/core/middleware/built-in/cors.ts +38 -0
  301. package/src/core/middleware/built-in/csp.ts +107 -0
  302. package/src/core/middleware/built-in/csrf.ts +87 -0
  303. package/src/core/middleware/built-in/error-tracker.ts +16 -0
  304. package/src/core/middleware/built-in/index.ts +57 -0
  305. package/src/core/middleware/built-in/performance-monitor.ts +25 -0
  306. package/src/core/middleware/built-in/rate-limit.ts +60 -0
  307. package/src/core/middleware/built-in/request-logger.ts +14 -0
  308. package/src/core/middleware/built-in/session.ts +311 -0
  309. package/src/core/middleware/built-in/sse.ts +91 -0
  310. package/src/core/middleware/built-in/validation.ts +33 -0
  311. package/src/core/middleware/index.ts +188 -0
  312. package/src/core/modules/auto-discovery.ts +265 -0
  313. package/src/core/modules/index.ts +6 -0
  314. package/src/core/modules/modules.ts +125 -0
  315. package/src/core/networking/index.ts +7 -0
  316. package/src/core/networking/service-discovery.ts +309 -0
  317. package/src/core/networking/websocket-manager.ts +259 -0
  318. package/src/core/routing/app-integration.ts +229 -0
  319. package/src/core/routing/index.ts +519 -0
  320. package/src/core/runtime/aws-lambda-adapter.ts +157 -0
  321. package/src/core/runtime/base-adapter.ts +140 -0
  322. package/src/core/runtime/cloudflare-workers-adapter.ts +166 -0
  323. package/src/core/runtime/index.ts +74 -0
  324. package/src/core/runtime/node-adapter.ts +210 -0
  325. package/src/core/runtime/vercel-edge-adapter.ts +125 -0
  326. package/src/core/utilities/circuit-breaker.ts +46 -0
  327. package/src/core/utilities/container.ts +760 -0
  328. package/src/core/utilities/hooks.ts +148 -0
  329. package/src/core/utilities/index.ts +16 -0
  330. package/src/core/validation/index.ts +216 -0
  331. package/src/index.ts +120 -0
  332. package/src/moro.ts +842 -0
  333. package/src/types/cache.ts +38 -0
  334. package/src/types/cdn.ts +22 -0
  335. package/src/types/core.ts +17 -0
  336. package/src/types/database.ts +40 -0
  337. package/src/types/discovery.ts +7 -0
  338. package/src/types/events.ts +90 -0
  339. package/src/types/hooks.ts +47 -0
  340. package/src/types/http.ts +70 -0
  341. package/src/types/logger.ts +109 -0
  342. package/src/types/module.ts +87 -0
  343. package/src/types/runtime.ts +91 -0
  344. package/src/types/session.ts +89 -0
  345. package/tsconfig.json +21 -0
@@ -0,0 +1,16 @@
1
+ // Error tracking middleware
2
+ import { createFrameworkLogger } from "../../logger";
3
+
4
+ const logger = createFrameworkLogger("ErrorTracker");
5
+
6
+ export const errorTracker = async (context: any): Promise<void> => {
7
+ context.onError = (error: Error) => {
8
+ logger.error("Request error", "ErrorTracking", {
9
+ error: error.message,
10
+ stack: error.stack,
11
+ url: context.request?.url,
12
+ method: context.request?.method,
13
+ timestamp: new Date().toISOString(),
14
+ });
15
+ };
16
+ };
@@ -0,0 +1,57 @@
1
+ // Built-in Middleware Exports
2
+ export { auth } from "./auth";
3
+ export { rateLimit } from "./rate-limit";
4
+ export { cors } from "./cors";
5
+ export { validation } from "./validation";
6
+ export { requestLogger } from "./request-logger";
7
+ export { performanceMonitor } from "./performance-monitor";
8
+ export { errorTracker } from "./error-tracker";
9
+
10
+ // Advanced Security & Performance Middleware
11
+ export { cookie } from "./cookie";
12
+ export { csrf } from "./csrf";
13
+ export { csp } from "./csp";
14
+ export { sse } from "./sse";
15
+ export { session } from "./session";
16
+
17
+ // Clean Architecture Middleware
18
+ export { cache } from "./cache";
19
+ export { cdn } from "./cdn";
20
+
21
+ // Import for collections
22
+ import { auth } from "./auth";
23
+ import { rateLimit } from "./rate-limit";
24
+ import { cors } from "./cors";
25
+ import { validation } from "./validation";
26
+ import { requestLogger } from "./request-logger";
27
+ import { performanceMonitor } from "./performance-monitor";
28
+ import { errorTracker } from "./error-tracker";
29
+ import { cookie } from "./cookie";
30
+ import { csrf } from "./csrf";
31
+ import { csp } from "./csp";
32
+ import { sse } from "./sse";
33
+ import { session } from "./session";
34
+ import { cache } from "./cache";
35
+ import { cdn } from "./cdn";
36
+
37
+ export const builtInMiddleware = {
38
+ auth,
39
+ rateLimit,
40
+ cors,
41
+ validation,
42
+ // Advanced middleware
43
+ cookie,
44
+ csrf,
45
+ csp,
46
+ sse,
47
+ session,
48
+ // Clean architecture middleware
49
+ cache,
50
+ cdn,
51
+ };
52
+
53
+ export const simpleMiddleware = {
54
+ requestLogger,
55
+ performanceMonitor,
56
+ errorTracker,
57
+ };
@@ -0,0 +1,25 @@
1
+ // Performance monitoring middleware
2
+ import { createFrameworkLogger } from "../../logger";
3
+
4
+ const logger = createFrameworkLogger("PerformanceMonitor");
5
+
6
+ export const performanceMonitor = async (context: any): Promise<void> => {
7
+ const startTime = Date.now();
8
+
9
+ context.onComplete = () => {
10
+ const duration = Date.now() - startTime;
11
+
12
+ // Log slow requests
13
+ if (duration > 1000) {
14
+ logger.warn(
15
+ `Slow request detected: ${context.request?.path} took ${duration}ms`,
16
+ "SlowRequest",
17
+ {
18
+ path: context.request?.path,
19
+ method: context.request?.method,
20
+ duration,
21
+ },
22
+ );
23
+ }
24
+ };
25
+ };
@@ -0,0 +1,60 @@
1
+ // Rate Limiting Middleware
2
+ import { MiddlewareInterface, HookContext } from "../../../types/hooks";
3
+ import { createFrameworkLogger } from "../../logger";
4
+
5
+ const logger = createFrameworkLogger("RateLimitMiddleware");
6
+
7
+ export const rateLimit = (
8
+ options: {
9
+ windowMs?: number;
10
+ max?: number;
11
+ message?: string;
12
+ } = {},
13
+ ): MiddlewareInterface => ({
14
+ name: "rate-limit",
15
+ version: "1.0.0",
16
+ metadata: {
17
+ name: "rate-limit",
18
+ version: "1.0.0",
19
+ description: "Rate limiting middleware with configurable windows",
20
+ author: "MoroJS Team",
21
+ },
22
+
23
+ install: async (hooks: any, options: any = {}) => {
24
+ logger.debug("Installing rate limit middleware", "Installation", {
25
+ options,
26
+ });
27
+
28
+ const windowMs = options.windowMs || 60000; // 1 minute default
29
+ const max = options.max || 100; // 100 requests per window
30
+ const clientCounts = new Map();
31
+
32
+ hooks.before("request", async (context: HookContext) => {
33
+ const req = context.request as any;
34
+ const clientId = req.connection?.remoteAddress || "unknown";
35
+ const now = Date.now();
36
+
37
+ if (!clientCounts.has(clientId)) {
38
+ clientCounts.set(clientId, { count: 0, resetTime: now + windowMs });
39
+ }
40
+
41
+ const client = clientCounts.get(clientId);
42
+
43
+ if (now > client.resetTime) {
44
+ client.count = 0;
45
+ client.resetTime = now + windowMs;
46
+ }
47
+
48
+ client.count++;
49
+
50
+ if (client.count > max) {
51
+ logger.warn(`Rate limit exceeded for ${clientId}`, "RateLimit", {
52
+ clientId,
53
+ count: client.count,
54
+ max,
55
+ });
56
+ throw new Error(options.message || "Too many requests");
57
+ }
58
+ });
59
+ },
60
+ });
@@ -0,0 +1,14 @@
1
+ // Simple request logging middleware
2
+ export const requestLogger = async (context: any): Promise<void> => {
3
+ const startTime = Date.now();
4
+
5
+ console.log(
6
+ `[${new Date().toISOString()}] ${context.request?.method} ${context.request?.path}`,
7
+ );
8
+
9
+ // Log completion after response
10
+ context.onComplete = () => {
11
+ const duration = Date.now() - startTime;
12
+ console.log(`Request completed in ${duration}ms`);
13
+ };
14
+ };
@@ -0,0 +1,311 @@
1
+ // Session Middleware
2
+ import { MiddlewareInterface, HookContext } from "../../../types/hooks";
3
+ import { createFrameworkLogger } from "../../logger";
4
+ import { CacheAdapter } from "../../../types/cache";
5
+ import { MemoryCacheAdapter } from "./adapters/cache/memory";
6
+ import { RedisCacheAdapter } from "./adapters/cache/redis";
7
+ import { FileCacheAdapter } from "./adapters/cache/file";
8
+
9
+ const logger = createFrameworkLogger("SessionMiddleware");
10
+
11
+ export interface SessionOptions {
12
+ // Session store configuration
13
+ store?: "memory" | "redis" | "file" | CacheAdapter;
14
+ storeOptions?: {
15
+ // Redis options
16
+ host?: string;
17
+ port?: number;
18
+ password?: string;
19
+ keyPrefix?: string;
20
+ // File options
21
+ path?: string;
22
+ // Memory options
23
+ max?: number;
24
+ };
25
+
26
+ // Session configuration
27
+ secret?: string;
28
+ name?: string; // Session cookie name
29
+ genid?: () => string; // Session ID generator
30
+ rolling?: boolean; // Reset expiry on each request
31
+ resave?: boolean; // Save session even if not modified
32
+ saveUninitialized?: boolean; // Save new but not modified sessions
33
+
34
+ // Cookie configuration
35
+ cookie?: {
36
+ maxAge?: number; // Session timeout in ms
37
+ expires?: Date; // Absolute expiry
38
+ httpOnly?: boolean; // Prevent XSS access
39
+ secure?: boolean; // HTTPS only
40
+ sameSite?: "strict" | "lax" | "none";
41
+ domain?: string;
42
+ path?: string;
43
+ };
44
+
45
+ // Security
46
+ proxy?: boolean; // Trust proxy for secure cookies
47
+ unset?: "destroy" | "keep"; // What to do when session is unset
48
+ }
49
+
50
+ export interface SessionData {
51
+ [key: string]: any;
52
+ cookie?: {
53
+ originalMaxAge?: number;
54
+ expires?: Date;
55
+ secure?: boolean;
56
+ httpOnly?: boolean;
57
+ sameSite?: string;
58
+ };
59
+ }
60
+
61
+ class Session {
62
+ private data: SessionData = {};
63
+ private id: string;
64
+ private store: CacheAdapter;
65
+ private options: SessionOptions;
66
+ private isNew: boolean = false;
67
+ private isModified: boolean = false;
68
+
69
+ constructor(
70
+ id: string,
71
+ store: CacheAdapter,
72
+ options: SessionOptions,
73
+ isNew: boolean = false,
74
+ ) {
75
+ this.id = id;
76
+ this.store = store;
77
+ this.options = options;
78
+ this.isNew = isNew;
79
+ }
80
+
81
+ // Proxy to make session.prop = value work
82
+ static create(
83
+ id: string,
84
+ store: CacheAdapter,
85
+ options: SessionOptions,
86
+ data: SessionData = {},
87
+ isNew: boolean = false,
88
+ ): Session {
89
+ const session = new Session(id, store, options, isNew);
90
+ session.data = data;
91
+
92
+ return new Proxy(session, {
93
+ get(target, prop) {
94
+ if (prop in target) {
95
+ return target[prop as keyof Session];
96
+ }
97
+ return target.data[prop as string];
98
+ },
99
+
100
+ set(target, prop, value) {
101
+ if (prop in target) {
102
+ (target as any)[prop] = value;
103
+ } else {
104
+ target.data[prop as string] = value;
105
+ target.isModified = true;
106
+ }
107
+ return true;
108
+ },
109
+
110
+ has(target, prop) {
111
+ return prop in target || prop in target.data;
112
+ },
113
+
114
+ deleteProperty(target, prop) {
115
+ if (prop in target.data) {
116
+ delete target.data[prop as string];
117
+ target.isModified = true;
118
+ return true;
119
+ }
120
+ return false;
121
+ },
122
+ });
123
+ }
124
+
125
+ async save(): Promise<void> {
126
+ if (this.isModified || this.isNew || this.options.resave) {
127
+ const ttl = this.options.cookie?.maxAge
128
+ ? Math.floor(this.options.cookie.maxAge / 1000)
129
+ : 86400; // 24h default
130
+ await this.store.set(this.id, this.data, ttl);
131
+ this.isModified = false;
132
+ this.isNew = false;
133
+ logger.debug(`Session saved: ${this.id}`, "SessionSave");
134
+ }
135
+ }
136
+
137
+ async destroy(): Promise<void> {
138
+ await this.store.del(this.id);
139
+ this.data = {};
140
+ this.isModified = false;
141
+ logger.debug(`Session destroyed: ${this.id}`, "SessionDestroy");
142
+ }
143
+
144
+ async regenerate(): Promise<string> {
145
+ await this.destroy();
146
+ this.id = this.generateId();
147
+ this.isNew = true;
148
+ this.isModified = true;
149
+ logger.debug(`Session regenerated: ${this.id}`, "SessionRegenerate");
150
+ return this.id;
151
+ }
152
+
153
+ async touch(): Promise<void> {
154
+ if (this.options.rolling) {
155
+ this.isModified = true;
156
+ await this.save();
157
+ }
158
+ }
159
+
160
+ private generateId(): string {
161
+ if (this.options.genid) {
162
+ return this.options.genid();
163
+ }
164
+
165
+ const crypto = require("crypto");
166
+ return crypto.randomBytes(24).toString("hex");
167
+ }
168
+
169
+ get sessionID(): string {
170
+ return this.id;
171
+ }
172
+ }
173
+
174
+ export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
175
+ name: "session",
176
+ version: "1.0.0",
177
+ metadata: {
178
+ name: "session",
179
+ version: "1.0.0",
180
+ description: "Session management middleware with multiple store adapters",
181
+ author: "MoroJS Team",
182
+ },
183
+
184
+ install: async (hooks: any, middlewareOptions: any = {}) => {
185
+ logger.debug("Installing session middleware", "Installation");
186
+
187
+ // Merge options
188
+ const config: SessionOptions = {
189
+ store: "memory",
190
+ name: "connect.sid",
191
+ secret: "moro-session-secret",
192
+ rolling: false,
193
+ resave: false,
194
+ saveUninitialized: false,
195
+ cookie: {
196
+ maxAge: 24 * 60 * 60 * 1000, // 24 hours
197
+ httpOnly: true,
198
+ secure: false,
199
+ sameSite: "lax",
200
+ path: "/",
201
+ },
202
+ unset: "keep",
203
+ ...options,
204
+ ...middlewareOptions,
205
+ };
206
+
207
+ // Initialize store
208
+ let store: CacheAdapter;
209
+
210
+ if (typeof config.store === "string") {
211
+ switch (config.store) {
212
+ case "redis":
213
+ store = new RedisCacheAdapter({
214
+ keyPrefix: "sess:",
215
+ ...config.storeOptions,
216
+ });
217
+ break;
218
+ case "file":
219
+ store = new FileCacheAdapter({
220
+ cacheDir: config.storeOptions?.path || "./sessions",
221
+ });
222
+ break;
223
+ case "memory":
224
+ default:
225
+ store = new MemoryCacheAdapter();
226
+ break;
227
+ }
228
+ } else {
229
+ store = config.store as CacheAdapter;
230
+ }
231
+
232
+ // Generate session ID
233
+ const generateSessionId = (): string => {
234
+ if (config.genid) {
235
+ return config.genid();
236
+ }
237
+ const crypto = require("crypto");
238
+ return crypto.randomBytes(24).toString("hex");
239
+ };
240
+
241
+ hooks.before("request", async (context: HookContext) => {
242
+ const req = context.request as any;
243
+ const res = context.response as any;
244
+
245
+ // Get session ID from cookie
246
+ let sessionId = req.cookies?.[config.name!];
247
+ let sessionData: SessionData = {};
248
+ let isNew = false;
249
+
250
+ if (sessionId) {
251
+ try {
252
+ sessionData = (await store.get(sessionId)) || {};
253
+ logger.debug(`Session loaded: ${sessionId}`, "SessionLoad");
254
+ } catch (error) {
255
+ logger.warn(
256
+ `Failed to load session: ${sessionId}`,
257
+ "SessionLoadError",
258
+ { error },
259
+ );
260
+ sessionId = generateSessionId();
261
+ isNew = true;
262
+ }
263
+ } else {
264
+ sessionId = generateSessionId();
265
+ isNew = true;
266
+ }
267
+
268
+ // Create session object
269
+ req.session = Session.create(
270
+ sessionId,
271
+ store,
272
+ config,
273
+ sessionData,
274
+ isNew,
275
+ );
276
+
277
+ // Set session cookie
278
+ if (isNew || config.rolling) {
279
+ res.cookie(config.name!, sessionId, {
280
+ ...config.cookie,
281
+ secure:
282
+ config.cookie?.secure ||
283
+ (config.proxy && req.headers["x-forwarded-proto"] === "https"),
284
+ });
285
+ }
286
+ });
287
+
288
+ hooks.after("response", async (context: HookContext) => {
289
+ const req = context.request as any;
290
+
291
+ if (req.session) {
292
+ try {
293
+ if (
294
+ config.saveUninitialized ||
295
+ !req.session.isNew ||
296
+ req.session.isModified
297
+ ) {
298
+ await req.session.save();
299
+ }
300
+ } catch (error) {
301
+ logger.error("Failed to save session", "SessionSaveError", { error });
302
+ }
303
+ }
304
+ });
305
+
306
+ logger.info(
307
+ `Session middleware installed with ${config.store} store`,
308
+ "Installation",
309
+ );
310
+ },
311
+ });
@@ -0,0 +1,91 @@
1
+ // Server-Sent Events Middleware
2
+ import { MiddlewareInterface, HookContext } from "../../../types/hooks";
3
+ import { createFrameworkLogger } from "../../logger";
4
+
5
+ const logger = createFrameworkLogger("SSEMiddleware");
6
+
7
+ export const sse = (
8
+ options: {
9
+ heartbeat?: number;
10
+ retry?: number;
11
+ cors?: boolean;
12
+ } = {},
13
+ ): MiddlewareInterface => ({
14
+ name: "sse",
15
+ version: "1.0.0",
16
+ metadata: {
17
+ name: "sse",
18
+ version: "1.0.0",
19
+ description:
20
+ "Server-Sent Events middleware with heartbeat and retry support",
21
+ author: "MoroJS Team",
22
+ },
23
+
24
+ install: async (hooks: any, middlewareOptions: any = {}) => {
25
+ logger.debug("Installing SSE middleware", "Installation");
26
+
27
+ hooks.before("request", async (context: HookContext) => {
28
+ const req = context.request as any;
29
+ const res = context.response as any;
30
+
31
+ // Only handle SSE requests
32
+ if (!req.headers.accept?.includes("text/event-stream")) {
33
+ return;
34
+ }
35
+
36
+ logger.debug("Setting up SSE connection", "SSESetup");
37
+
38
+ // Set SSE headers
39
+ res.writeHead(200, {
40
+ "Content-Type": "text/event-stream",
41
+ "Cache-Control": "no-cache",
42
+ Connection: "keep-alive",
43
+ "Access-Control-Allow-Origin": options.cors ? "*" : undefined,
44
+ "Access-Control-Allow-Headers": options.cors
45
+ ? "Cache-Control"
46
+ : undefined,
47
+ });
48
+
49
+ // Add SSE methods to response
50
+ res.sendEvent = (data: any, event?: string, id?: string) => {
51
+ if (id) res.write(`id: ${id}\n`);
52
+ if (event) res.write(`event: ${event}\n`);
53
+ res.write(
54
+ `data: ${typeof data === "string" ? data : JSON.stringify(data)}\n\n`,
55
+ );
56
+ };
57
+
58
+ res.sendComment = (comment: string) => {
59
+ res.write(`: ${comment}\n\n`);
60
+ };
61
+
62
+ res.sendRetry = (ms: number) => {
63
+ res.write(`retry: ${ms}\n\n`);
64
+ };
65
+
66
+ // Set up heartbeat if configured
67
+ let heartbeatInterval: NodeJS.Timeout | null = null;
68
+ if (options.heartbeat) {
69
+ heartbeatInterval = setInterval(() => {
70
+ res.sendComment("heartbeat");
71
+ }, options.heartbeat);
72
+ }
73
+
74
+ // Set retry if configured
75
+ if (options.retry) {
76
+ res.sendRetry(options.retry);
77
+ }
78
+
79
+ // Clean up on close
80
+ req.on("close", () => {
81
+ if (heartbeatInterval) {
82
+ clearInterval(heartbeatInterval);
83
+ }
84
+ logger.debug("SSE connection closed", "SSECleanup");
85
+ });
86
+
87
+ // Mark that this middleware handled the request
88
+ (context as any).handled = true;
89
+ });
90
+ },
91
+ });
@@ -0,0 +1,33 @@
1
+ // Validation Middleware
2
+ import { MiddlewareInterface, HookContext } from "../../../types/hooks";
3
+ import { createFrameworkLogger } from "../../logger";
4
+
5
+ const logger = createFrameworkLogger("ValidationMiddleware");
6
+
7
+ export const validation = (): MiddlewareInterface => ({
8
+ name: "validation",
9
+ version: "1.0.0",
10
+ metadata: {
11
+ name: "validation",
12
+ version: "1.0.0",
13
+ description: "Request validation middleware with content type checking",
14
+ author: "MoroJS Team",
15
+ },
16
+
17
+ install: async (hooks: any, options: any = {}) => {
18
+ logger.debug("Installing validation middleware", "Installation");
19
+
20
+ hooks.before("request", async (context: HookContext) => {
21
+ const request = context.request as any;
22
+
23
+ // Basic content type validation
24
+ if (request.method === "POST" || request.method === "PUT") {
25
+ const contentType = request.headers["content-type"];
26
+ if (contentType && contentType.includes("application/json")) {
27
+ logger.debug("Validation: JSON content type verified", "ContentType");
28
+ // Additional validation logic would go here
29
+ }
30
+ }
31
+ });
32
+ },
33
+ });