@morojs/moro 1.8.3 → 1.8.5

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 (102) hide show
  1. package/dist/core/config/config-sources.js.map +1 -1
  2. package/dist/core/framework.d.ts +11 -0
  3. package/dist/core/framework.js +107 -36
  4. package/dist/core/framework.js.map +1 -1
  5. package/dist/core/graphql/core.js.map +1 -1
  6. package/dist/core/grpc/types.js.map +1 -1
  7. package/dist/core/http/http-server.js +18 -1
  8. package/dist/core/http/http-server.js.map +1 -1
  9. package/dist/core/http/http2-server.js +13 -0
  10. package/dist/core/http/http2-server.js.map +1 -1
  11. package/dist/core/http/moro-engine-server.js +13 -0
  12. package/dist/core/http/moro-engine-server.js.map +1 -1
  13. package/dist/core/http/uws-http-server.js +16 -1
  14. package/dist/core/http/uws-http-server.js.map +1 -1
  15. package/dist/core/mail/mail-adapter.js.map +1 -1
  16. package/dist/core/middleware/built-in/cache/adapters/cache/memory.js +5 -1
  17. package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -1
  18. package/dist/core/middleware/built-in/cloudwatch/index.d.ts +4 -0
  19. package/dist/core/middleware/built-in/cloudwatch/index.js +5 -0
  20. package/dist/core/middleware/built-in/cloudwatch/index.js.map +1 -0
  21. package/dist/core/middleware/built-in/cloudwatch/middleware.d.ts +31 -0
  22. package/dist/core/middleware/built-in/cloudwatch/middleware.js +52 -0
  23. package/dist/core/middleware/built-in/cloudwatch/middleware.js.map +1 -0
  24. package/dist/core/middleware/built-in/error-tracker/index.d.ts +3 -1
  25. package/dist/core/middleware/built-in/error-tracker/index.js +3 -2
  26. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
  27. package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +6 -3
  28. package/dist/core/middleware/built-in/error-tracker/middleware.js +18 -13
  29. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
  30. package/dist/core/middleware/built-in/index.d.ts +43 -7
  31. package/dist/core/middleware/built-in/index.js +37 -7
  32. package/dist/core/middleware/built-in/index.js.map +1 -1
  33. package/dist/core/middleware/built-in/performance-monitor/index.d.ts +3 -1
  34. package/dist/core/middleware/built-in/performance-monitor/index.js +3 -2
  35. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
  36. package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +3 -3
  37. package/dist/core/middleware/built-in/performance-monitor/middleware.js +19 -17
  38. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
  39. package/dist/core/middleware/built-in/prometheus/core.d.ts +27 -0
  40. package/dist/core/middleware/built-in/prometheus/core.js +0 -0
  41. package/dist/core/middleware/built-in/prometheus/core.js.map +1 -0
  42. package/dist/core/middleware/built-in/prometheus/index.d.ts +5 -0
  43. package/dist/core/middleware/built-in/prometheus/index.js +6 -0
  44. package/dist/core/middleware/built-in/prometheus/index.js.map +1 -0
  45. package/dist/core/middleware/built-in/prometheus/middleware.d.ts +15 -0
  46. package/dist/core/middleware/built-in/prometheus/middleware.js +30 -0
  47. package/dist/core/middleware/built-in/prometheus/middleware.js.map +1 -0
  48. package/dist/core/middleware/built-in/request-logger/index.d.ts +3 -1
  49. package/dist/core/middleware/built-in/request-logger/index.js +3 -2
  50. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
  51. package/dist/core/middleware/built-in/request-logger/middleware.d.ts +4 -4
  52. package/dist/core/middleware/built-in/request-logger/middleware.js +14 -12
  53. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
  54. package/dist/core/middleware/index.d.ts +3 -1
  55. package/dist/core/middleware/index.js +6 -1
  56. package/dist/core/middleware/index.js.map +1 -1
  57. package/dist/core/pooling/index.d.ts +3 -0
  58. package/dist/core/pooling/index.js +5 -0
  59. package/dist/core/pooling/index.js.map +1 -0
  60. package/dist/core/pooling/lru-cache.d.ts +32 -0
  61. package/dist/core/pooling/lru-cache.js +74 -0
  62. package/dist/core/pooling/lru-cache.js.map +1 -0
  63. package/dist/core/pooling/object-pool-manager.d.ts +3 -1
  64. package/dist/core/pooling/object-pool-manager.js +37 -140
  65. package/dist/core/pooling/object-pool-manager.js.map +1 -1
  66. package/dist/core/pooling/object-pool.d.ts +42 -0
  67. package/dist/core/pooling/object-pool.js +78 -0
  68. package/dist/core/pooling/object-pool.js.map +1 -0
  69. package/dist/core/routing/create-router.js.map +1 -1
  70. package/dist/core/routing/path-matcher.js +1 -43
  71. package/dist/core/routing/path-matcher.js.map +1 -1
  72. package/dist/core/routing/unified-router.d.ts +2 -0
  73. package/dist/core/routing/unified-router.js +15 -0
  74. package/dist/core/routing/unified-router.js.map +1 -1
  75. package/dist/core/utilities/hooks.d.ts +5 -5
  76. package/dist/core/utilities/hooks.js +9 -6
  77. package/dist/core/utilities/hooks.js.map +1 -1
  78. package/dist/core/utilities/index.d.ts +0 -1
  79. package/dist/core/utilities/index.js +0 -2
  80. package/dist/core/utilities/index.js.map +1 -1
  81. package/dist/core/workers/facade.d.ts +20 -4
  82. package/dist/core/workers/facade.js +15 -7
  83. package/dist/core/workers/facade.js.map +1 -1
  84. package/dist/core/workers/worker-manager.d.ts +12 -0
  85. package/dist/core/workers/worker-manager.js +27 -0
  86. package/dist/core/workers/worker-manager.js.map +1 -1
  87. package/dist/core/workers/worker.d.ts +17 -1
  88. package/dist/core/workers/worker.js +28 -26
  89. package/dist/core/workers/worker.js.map +1 -1
  90. package/dist/index.d.ts +39 -2
  91. package/dist/index.js +14 -2
  92. package/dist/index.js.map +1 -1
  93. package/dist/moro.d.ts +1 -0
  94. package/dist/moro.js +82 -15
  95. package/dist/moro.js.map +1 -1
  96. package/dist/types/config.js.map +1 -1
  97. package/dist/types/core.d.ts +1 -0
  98. package/dist/types/core.js.map +1 -1
  99. package/dist/types/hooks.d.ts +2 -0
  100. package/dist/types/hooks.js.map +1 -1
  101. package/dist/types/module.js.map +1 -1
  102. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"mail-adapter.js","sourceRoot":"","sources":["../../../src/core/mail/mail-adapter.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,mBAAmB;AAInB;;;GAGG;AACH,MAAM,OAAgB,eAAe;IACzB,MAAM,CAAM;IACZ,WAAW,GAAG,KAAK,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAW;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAYD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAsB;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC;oBACX,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,OAAkD;QAI3E,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACO,kBAAkB,CAC1B,SAIsC;QAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACO,iBAAiB;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,oDAAoD,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;CACF","sourcesContent":["// Base Mail Adapter Interface\n// ESM-first module\n\nimport type { MailAdapter, MailOptions, MailResult } from './types.js';\n\n/**\n * Abstract base class for mail adapters\n * Provides common functionality and interface\n */\nexport abstract class BaseMailAdapter implements MailAdapter {\n protected config: any;\n protected initialized = false;\n\n /**\n * Initialize adapter with configuration\n */\n async initialize(config: any): Promise<void> {\n this.config = config;\n this.initialized = true;\n }\n\n /**\n * Send an email (must be implemented by subclasses)\n */\n abstract send(options: MailOptions): Promise<MailResult>;\n\n /**\n * Get adapter name (must be implemented by subclasses)\n */\n abstract getName(): string;\n\n /**\n * Send multiple emails in bulk\n * Default implementation sends one by one\n * Override for better performance\n */\n async sendBulk(options: MailOptions[]): Promise<MailResult[]> {\n if (!this.initialized) {\n throw new Error(`${this.getName()} adapter not initialized`);\n }\n\n const results: MailResult[] = [];\n\n for (const mailOptions of options) {\n try {\n const result = await this.send(mailOptions);\n results.push(result);\n } catch (error) {\n results.push({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n }\n\n /**\n * Verify adapter connection (optional)\n */\n async verify(): Promise<boolean> {\n return this.initialized;\n }\n\n /**\n * Close adapter connections (optional)\n */\n async close(): Promise<void> {\n this.initialized = false;\n }\n\n /**\n * Normalize email address\n */\n protected normalizeAddress(address: string | { name?: string; email: string }): {\n name?: string;\n email: string;\n } {\n if (typeof address === 'string') {\n return { email: address };\n }\n return address;\n }\n\n /**\n * Normalize email addresses array\n */\n protected normalizeAddresses(\n addresses:\n | string\n | string[]\n | { name?: string; email: string }\n | { name?: string; email: string }[]\n ): { name?: string; email: string }[] {\n if (!addresses) {\n return [];\n }\n\n if (Array.isArray(addresses)) {\n return addresses.map(addr => this.normalizeAddress(addr));\n }\n\n return [this.normalizeAddress(addresses)];\n }\n\n /**\n * Check if adapter is initialized\n */\n protected ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error(`${this.getName()} adapter not initialized. Call initialize() first.`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"mail-adapter.js","sourceRoot":"","sources":["../../../src/core/mail/mail-adapter.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,mBAAmB;AAInB;;;GAGG;AACH,MAAM,OAAgB,eAAe;IACzB,MAAM,CAAM;IACZ,WAAW,GAAG,KAAK,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAW;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAYD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAsB;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC;oBACX,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,OAAkD;QAI3E,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACO,kBAAkB,CAC1B,SAC2F;QAE3F,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACO,iBAAiB;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,oDAAoD,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;CACF","sourcesContent":["// Base Mail Adapter Interface\n// ESM-first module\n\nimport type { MailAdapter, MailOptions, MailResult } from './types.js';\n\n/**\n * Abstract base class for mail adapters\n * Provides common functionality and interface\n */\nexport abstract class BaseMailAdapter implements MailAdapter {\n protected config: any;\n protected initialized = false;\n\n /**\n * Initialize adapter with configuration\n */\n async initialize(config: any): Promise<void> {\n this.config = config;\n this.initialized = true;\n }\n\n /**\n * Send an email (must be implemented by subclasses)\n */\n abstract send(options: MailOptions): Promise<MailResult>;\n\n /**\n * Get adapter name (must be implemented by subclasses)\n */\n abstract getName(): string;\n\n /**\n * Send multiple emails in bulk\n * Default implementation sends one by one\n * Override for better performance\n */\n async sendBulk(options: MailOptions[]): Promise<MailResult[]> {\n if (!this.initialized) {\n throw new Error(`${this.getName()} adapter not initialized`);\n }\n\n const results: MailResult[] = [];\n\n for (const mailOptions of options) {\n try {\n const result = await this.send(mailOptions);\n results.push(result);\n } catch (error) {\n results.push({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n }\n\n /**\n * Verify adapter connection (optional)\n */\n async verify(): Promise<boolean> {\n return this.initialized;\n }\n\n /**\n * Close adapter connections (optional)\n */\n async close(): Promise<void> {\n this.initialized = false;\n }\n\n /**\n * Normalize email address\n */\n protected normalizeAddress(address: string | { name?: string; email: string }): {\n name?: string;\n email: string;\n } {\n if (typeof address === 'string') {\n return { email: address };\n }\n return address;\n }\n\n /**\n * Normalize email addresses array\n */\n protected normalizeAddresses(\n addresses:\n string | string[] | { name?: string; email: string } | { name?: string; email: string }[]\n ): { name?: string; email: string }[] {\n if (!addresses) {\n return [];\n }\n\n if (Array.isArray(addresses)) {\n return addresses.map(addr => this.normalizeAddress(addr));\n }\n\n return [this.normalizeAddress(addresses)];\n }\n\n /**\n * Check if adapter is initialized\n */\n protected ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error(`${this.getName()} adapter not initialized. Call initialize() first.`);\n }\n }\n}\n"]}
@@ -22,11 +22,15 @@ export class MemoryCacheAdapter {
22
22
  }
23
23
  // Set new value
24
24
  this.cache.set(key, { value, expires });
25
- // Set expiration timer
25
+ // Set expiration timer. unref() so eviction housekeeping never holds the
26
+ // process open — a pending TTL (sessions default to ~24h) must not block
27
+ // shutdown. Entries are also expiry-checked on read, so eviction stays
28
+ // correct even if the process exits and restarts before the timer fires.
26
29
  const timer = setTimeout(() => {
27
30
  this.cache.delete(key);
28
31
  this.timers.delete(key);
29
32
  }, ttl * 1000);
33
+ timer.unref?.();
30
34
  this.timers.set(key, timer);
31
35
  logger.debug(`Cached item: ${key} (TTL: ${ttl}s)`, 'MemoryCache');
32
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../../../../src/core/middleware/built-in/cache/adapters/cache/memory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,MAAM,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;AAE3D,MAAM,OAAO,kBAAkB;IACrB,KAAK,GAAG,IAAI,GAAG,EAA2C,CAAC;IAC3D,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEnD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,MAAc,IAAI;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC;QAExC,uBAAuB;QACvB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAExC,uBAAuB;QACvB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,UAAU,GAAG,IAAI,EAAE,aAAa,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,oEAAoE;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,OAAO,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QAErB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;CACF","sourcesContent":["// Memory Cache Adapter\nimport { CacheAdapter } from '../../../../../../types/cache.js';\nimport { createFrameworkLogger } from '../../../../../logger/index.js';\n\nconst logger = createFrameworkLogger('MemoryCacheAdapter');\n\nexport class MemoryCacheAdapter implements CacheAdapter {\n private cache = new Map<string, { value: any; expires: number }>();\n private timers = new Map<string, NodeJS.Timeout>();\n\n async get(key: string): Promise<any> {\n const item = this.cache.get(key);\n if (!item) return null;\n\n if (Date.now() > item.expires) {\n await this.del(key);\n return null;\n }\n\n return item.value;\n }\n\n async set(key: string, value: any, ttl: number = 3600): Promise<void> {\n const expires = Date.now() + ttl * 1000;\n\n // Clear existing timer\n const existingTimer = this.timers.get(key);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set new value\n this.cache.set(key, { value, expires });\n\n // Set expiration timer\n const timer = setTimeout(() => {\n this.cache.delete(key);\n this.timers.delete(key);\n }, ttl * 1000);\n\n this.timers.set(key, timer);\n logger.debug(`Cached item: ${key} (TTL: ${ttl}s)`, 'MemoryCache');\n }\n\n async del(key: string): Promise<void> {\n this.cache.delete(key);\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n logger.debug(`Deleted cache item: ${key}`, 'MemoryCache');\n }\n\n async clear(): Promise<void> {\n this.cache.clear();\n this.timers.forEach(timer => clearTimeout(timer));\n this.timers.clear();\n logger.debug('Cleared all cache items', 'MemoryCache');\n }\n\n async exists(key: string): Promise<boolean> {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.cache.has(key) && Date.now() <= this.cache.get(key)!.expires;\n }\n\n async ttl(key: string): Promise<number> {\n const item = this.cache.get(key);\n if (!item) return -1;\n\n const remaining = Math.floor((item.expires - Date.now()) / 1000);\n return remaining > 0 ? remaining : -1;\n }\n}\n"]}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../../../../src/core/middleware/built-in/cache/adapters/cache/memory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,MAAM,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;AAE3D,MAAM,OAAO,kBAAkB;IACrB,KAAK,GAAG,IAAI,GAAG,EAA2C,CAAC;IAC3D,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEnD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,MAAc,IAAI;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC;QAExC,uBAAuB;QACvB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAExC,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,yEAAyE;QACzE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QACf,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAEhB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,UAAU,GAAG,IAAI,EAAE,aAAa,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,oEAAoE;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,OAAO,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QAErB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;CACF","sourcesContent":["// Memory Cache Adapter\nimport { CacheAdapter } from '../../../../../../types/cache.js';\nimport { createFrameworkLogger } from '../../../../../logger/index.js';\n\nconst logger = createFrameworkLogger('MemoryCacheAdapter');\n\nexport class MemoryCacheAdapter implements CacheAdapter {\n private cache = new Map<string, { value: any; expires: number }>();\n private timers = new Map<string, NodeJS.Timeout>();\n\n async get(key: string): Promise<any> {\n const item = this.cache.get(key);\n if (!item) return null;\n\n if (Date.now() > item.expires) {\n await this.del(key);\n return null;\n }\n\n return item.value;\n }\n\n async set(key: string, value: any, ttl: number = 3600): Promise<void> {\n const expires = Date.now() + ttl * 1000;\n\n // Clear existing timer\n const existingTimer = this.timers.get(key);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set new value\n this.cache.set(key, { value, expires });\n\n // Set expiration timer. unref() so eviction housekeeping never holds the\n // process open — a pending TTL (sessions default to ~24h) must not block\n // shutdown. Entries are also expiry-checked on read, so eviction stays\n // correct even if the process exits and restarts before the timer fires.\n const timer = setTimeout(() => {\n this.cache.delete(key);\n this.timers.delete(key);\n }, ttl * 1000);\n timer.unref?.();\n\n this.timers.set(key, timer);\n logger.debug(`Cached item: ${key} (TTL: ${ttl}s)`, 'MemoryCache');\n }\n\n async del(key: string): Promise<void> {\n this.cache.delete(key);\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n logger.debug(`Deleted cache item: ${key}`, 'MemoryCache');\n }\n\n async clear(): Promise<void> {\n this.cache.clear();\n this.timers.forEach(timer => clearTimeout(timer));\n this.timers.clear();\n logger.debug('Cleared all cache items', 'MemoryCache');\n }\n\n async exists(key: string): Promise<boolean> {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.cache.has(key) && Date.now() <= this.cache.get(key)!.expires;\n }\n\n async ttl(key: string): Promise<number> {\n const item = this.cache.get(key);\n if (!item) return -1;\n\n const remaining = Math.floor((item.expires - Date.now()) / 1000);\n return remaining > 0 ? remaining : -1;\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { createCloudWatchMiddleware, buildEmfRecord } from './middleware.js';
2
+ export type { CloudWatchOptions } from './middleware.js';
3
+ import { createCloudWatchMiddleware } from './middleware.js';
4
+ export declare const cloudWatch: typeof createCloudWatchMiddleware;
@@ -0,0 +1,5 @@
1
+ // CloudWatch Middleware - Centralized Exports
2
+ export { createCloudWatchMiddleware, buildEmfRecord } from './middleware.js';
3
+ import { createCloudWatchMiddleware } from './middleware.js';
4
+ export const cloudWatch = createCloudWatchMiddleware;
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/cloudwatch/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG,0BAA0B,CAAC","sourcesContent":["// CloudWatch Middleware - Centralized Exports\nexport { createCloudWatchMiddleware, buildEmfRecord } from './middleware.js';\nexport type { CloudWatchOptions } from './middleware.js';\n\nimport { createCloudWatchMiddleware } from './middleware.js';\n\nexport const cloudWatch = createCloudWatchMiddleware;\n"]}
@@ -0,0 +1,31 @@
1
+ import { Middleware } from '../../../../types/http.js';
2
+ export interface CloudWatchOptions {
3
+ /** CloudWatch metric namespace (default 'MoroJS') */
4
+ namespace?: string;
5
+ /** Extra static dimensions added to every record */
6
+ dimensions?: Record<string, string>;
7
+ /** Override the output sink (default: process.stdout). Useful for testing. */
8
+ emit?: (line: string) => void;
9
+ }
10
+ /**
11
+ * Build a single EMF record for one completed request.
12
+ * Exported for direct unit testing.
13
+ */
14
+ export declare function buildEmfRecord(options: {
15
+ namespace: string;
16
+ dimensions: Record<string, string>;
17
+ }, request: {
18
+ method: string;
19
+ path: string;
20
+ }, statusCode: number, durationMs: number): Record<string, any>;
21
+ /**
22
+ * CloudWatch metrics middleware (Embedded Metric Format)
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * import { middleware } from '@morojs/moro';
27
+ *
28
+ * app.use(middleware.cloudWatch({ namespace: 'MoroAPI' }));
29
+ * ```
30
+ */
31
+ export declare function createCloudWatchMiddleware(options?: CloudWatchOptions): Middleware;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Build a single EMF record for one completed request.
3
+ * Exported for direct unit testing.
4
+ */
5
+ export function buildEmfRecord(options, request, statusCode, durationMs) {
6
+ const dimensionKeys = ['Method', 'Status', ...Object.keys(options.dimensions)];
7
+ return {
8
+ _aws: {
9
+ Timestamp: Date.now(),
10
+ CloudWatchMetrics: [
11
+ {
12
+ Namespace: options.namespace,
13
+ Dimensions: [dimensionKeys],
14
+ Metrics: [
15
+ { Name: 'RequestCount', Unit: 'Count' },
16
+ { Name: 'RequestDuration', Unit: 'Milliseconds' },
17
+ ],
18
+ },
19
+ ],
20
+ },
21
+ Method: request.method,
22
+ Status: String(statusCode),
23
+ ...options.dimensions,
24
+ RequestCount: 1,
25
+ RequestDuration: durationMs,
26
+ Path: request.path,
27
+ };
28
+ }
29
+ /**
30
+ * CloudWatch metrics middleware (Embedded Metric Format)
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { middleware } from '@morojs/moro';
35
+ *
36
+ * app.use(middleware.cloudWatch({ namespace: 'MoroAPI' }));
37
+ * ```
38
+ */
39
+ export function createCloudWatchMiddleware(options = {}) {
40
+ const namespace = options.namespace ?? 'MoroJS';
41
+ const dimensions = options.dimensions ?? {};
42
+ const emit = options.emit ?? ((line) => process.stdout.write(line + '\n'));
43
+ return (req, res, next) => {
44
+ const start = Date.now();
45
+ res.on('finish', () => {
46
+ const record = buildEmfRecord({ namespace, dimensions }, { method: req.method || 'UNKNOWN', path: req.path || '' }, res.statusCode, Date.now() - start);
47
+ emit(JSON.stringify(record));
48
+ });
49
+ next();
50
+ };
51
+ }
52
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/cloudwatch/middleware.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAkE,EAClE,OAAyC,EACzC,UAAkB,EAClB,UAAkB;IAElB,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAE/E,OAAO;QACL,IAAI,EAAE;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,iBAAiB,EAAE;gBACjB;oBACE,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,UAAU,EAAE,CAAC,aAAa,CAAC;oBAC3B,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE;wBACvC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE;qBAClD;iBACF;aACF;SACF;QACD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC;QAC1B,GAAG,OAAO,CAAC,UAAU;QACrB,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,UAAU;QAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAA6B,EAAE;IACxE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IAEnF,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,MAAM,MAAM,GAAG,cAAc,CAC3B,EAAE,SAAS,EAAE,UAAU,EAAE,EACzB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,EACzD,GAAG,CAAC,UAAU,EACd,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CACnB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// CloudWatch Middleware - zero-dependency Embedded Metric Format emitter\n//\n// Emits one EMF JSON line per request to stdout. On AWS Lambda (and any\n// environment shipping stdout to CloudWatch Logs), CloudWatch extracts these\n// as real metrics automatically — no AWS SDK, credentials, or network calls.\n// See: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Specification.html\nimport { Middleware } from '../../../../types/http.js';\n\nexport interface CloudWatchOptions {\n /** CloudWatch metric namespace (default 'MoroJS') */\n namespace?: string;\n /** Extra static dimensions added to every record */\n dimensions?: Record<string, string>;\n /** Override the output sink (default: process.stdout). Useful for testing. */\n emit?: (line: string) => void;\n}\n\n/**\n * Build a single EMF record for one completed request.\n * Exported for direct unit testing.\n */\nexport function buildEmfRecord(\n options: { namespace: string; dimensions: Record<string, string> },\n request: { method: string; path: string },\n statusCode: number,\n durationMs: number\n): Record<string, any> {\n const dimensionKeys = ['Method', 'Status', ...Object.keys(options.dimensions)];\n\n return {\n _aws: {\n Timestamp: Date.now(),\n CloudWatchMetrics: [\n {\n Namespace: options.namespace,\n Dimensions: [dimensionKeys],\n Metrics: [\n { Name: 'RequestCount', Unit: 'Count' },\n { Name: 'RequestDuration', Unit: 'Milliseconds' },\n ],\n },\n ],\n },\n Method: request.method,\n Status: String(statusCode),\n ...options.dimensions,\n RequestCount: 1,\n RequestDuration: durationMs,\n Path: request.path,\n };\n}\n\n/**\n * CloudWatch metrics middleware (Embedded Metric Format)\n *\n * @example\n * ```ts\n * import { middleware } from '@morojs/moro';\n *\n * app.use(middleware.cloudWatch({ namespace: 'MoroAPI' }));\n * ```\n */\nexport function createCloudWatchMiddleware(options: CloudWatchOptions = {}): Middleware {\n const namespace = options.namespace ?? 'MoroJS';\n const dimensions = options.dimensions ?? {};\n const emit = options.emit ?? ((line: string) => process.stdout.write(line + '\\n'));\n\n return (req, res, next) => {\n const start = Date.now();\n\n res.on('finish', () => {\n const record = buildEmfRecord(\n { namespace, dimensions },\n { method: req.method || 'UNKNOWN', path: req.path || '' },\n res.statusCode,\n Date.now() - start\n );\n emit(JSON.stringify(record));\n });\n\n next();\n };\n}\n"]}
@@ -1 +1,3 @@
1
- export { errorTracker } from './middleware.js';
1
+ export { createErrorTrackerMiddleware } from './middleware.js';
2
+ import { createErrorTrackerMiddleware } from './middleware.js';
3
+ export declare const errorTracker: typeof createErrorTrackerMiddleware;
@@ -1,4 +1,5 @@
1
1
  // Error Tracker - Main entry point
2
- // Re-exports the error tracker middleware
3
- export { errorTracker } from './middleware.js';
2
+ export { createErrorTrackerMiddleware } from './middleware.js';
3
+ import { createErrorTrackerMiddleware } from './middleware.js';
4
+ export const errorTracker = createErrorTrackerMiddleware;
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/error-tracker/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,0CAA0C;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["// Error Tracker - Main entry point\n// Re-exports the error tracker middleware\n\nexport { errorTracker } from './middleware.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/error-tracker/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAE/D,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC","sourcesContent":["// Error Tracker - Main entry point\nexport { createErrorTrackerMiddleware } from './middleware.js';\n\nimport { createErrorTrackerMiddleware } from './middleware.js';\n\nexport const errorTracker = createErrorTrackerMiddleware;\n"]}
@@ -5,11 +5,14 @@ import { HttpRequest, HttpResponse } from '../../../../types/http.js';
5
5
  * Errors are logged and re-thrown so the framework's error handling
6
6
  * (registered error handler / default 500) still applies.
7
7
  *
8
+ * The returned middleware uses the 4-arg (err, req, res, next)
9
+ * error-handler shape.
10
+ *
8
11
  * @example
9
12
  * ```ts
10
- * import { errorTracker } from '@/middleware/built-in/error-tracker';
13
+ * import { middleware } from '@morojs/moro';
11
14
  *
12
- * app.use(errorTracker);
15
+ * app.use(middleware.errorTracker());
13
16
  * ```
14
17
  */
15
- export declare const errorTracker: (err: Error, req: HttpRequest, _res: HttpResponse, next: (err?: Error) => void) => void;
18
+ export declare function createErrorTrackerMiddleware(): (err: Error, req: HttpRequest, _res: HttpResponse, next: (err?: Error) => void) => void;
@@ -7,22 +7,27 @@ const logger = createFrameworkLogger('ErrorTracker');
7
7
  * Errors are logged and re-thrown so the framework's error handling
8
8
  * (registered error handler / default 500) still applies.
9
9
  *
10
+ * The returned middleware uses the 4-arg (err, req, res, next)
11
+ * error-handler shape.
12
+ *
10
13
  * @example
11
14
  * ```ts
12
- * import { errorTracker } from '@/middleware/built-in/error-tracker';
15
+ * import { middleware } from '@morojs/moro';
13
16
  *
14
- * app.use(errorTracker);
17
+ * app.use(middleware.errorTracker());
15
18
  * ```
16
19
  */
17
- export const errorTracker = (err, req, _res, next) => {
18
- logger.error('Request error', 'ErrorTracking', {
19
- error: err.message,
20
- stack: err.stack,
21
- url: req.url,
22
- method: req.method,
23
- timestamp: new Date().toISOString(),
24
- });
25
- // Pass the error along so downstream error handling still runs
26
- next(err);
27
- };
20
+ export function createErrorTrackerMiddleware() {
21
+ return (err, req, _res, next) => {
22
+ logger.error('Request error', 'ErrorTracking', {
23
+ error: err.message,
24
+ stack: err.stack,
25
+ url: req.url,
26
+ method: req.method,
27
+ timestamp: new Date().toISOString(),
28
+ });
29
+ // Pass the error along so downstream error handling still runs
30
+ next(err);
31
+ };
32
+ }
28
33
  //# sourceMappingURL=middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/error-tracker/middleware.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;AAErD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAU,EACV,GAAgB,EAChB,IAAkB,EAClB,IAA2B,EACrB,EAAE;IACR,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,eAAe,EAAE;QAC7C,KAAK,EAAE,GAAG,CAAC,OAAO;QAClB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IACH,+DAA+D;IAC/D,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["// Error Tracker Middleware\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\n\nconst logger = createFrameworkLogger('ErrorTracker');\n\n/**\n * Error tracking middleware\n * Captures and logs errors that occur during request processing.\n * Errors are logged and re-thrown so the framework's error handling\n * (registered error handler / default 500) still applies.\n *\n * @example\n * ```ts\n * import { errorTracker } from '@/middleware/built-in/error-tracker';\n *\n * app.use(errorTracker);\n * ```\n */\nexport const errorTracker = (\n err: Error,\n req: HttpRequest,\n _res: HttpResponse,\n next: (err?: Error) => void\n): void => {\n logger.error('Request error', 'ErrorTracking', {\n error: err.message,\n stack: err.stack,\n url: req.url,\n method: req.method,\n timestamp: new Date().toISOString(),\n });\n // Pass the error along so downstream error handling still runs\n next(err);\n};\n"]}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/error-tracker/middleware.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,CAAC,GAAU,EAAE,GAAgB,EAAE,IAAkB,EAAE,IAA2B,EAAQ,EAAE;QAC7F,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,eAAe,EAAE;YAC7C,KAAK,EAAE,GAAG,CAAC,OAAO;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,+DAA+D;QAC/D,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Error Tracker Middleware\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\n\nconst logger = createFrameworkLogger('ErrorTracker');\n\n/**\n * Error tracking middleware\n * Captures and logs errors that occur during request processing.\n * Errors are logged and re-thrown so the framework's error handling\n * (registered error handler / default 500) still applies.\n *\n * The returned middleware uses the 4-arg (err, req, res, next)\n * error-handler shape.\n *\n * @example\n * ```ts\n * import { middleware } from '@morojs/moro';\n *\n * app.use(middleware.errorTracker());\n * ```\n */\nexport function createErrorTrackerMiddleware() {\n return (err: Error, req: HttpRequest, _res: HttpResponse, next: (err?: Error) => void): void => {\n logger.error('Request error', 'ErrorTracking', {\n error: err.message,\n stack: err.stack,\n url: req.url,\n method: req.method,\n timestamp: new Date().toISOString(),\n });\n // Pass the error along so downstream error handling still runs\n next(err);\n };\n}\n"]}
@@ -2,9 +2,11 @@ export { auth } from './auth/index.js';
2
2
  export { rateLimit } from './rate-limit/index.js';
3
3
  export { cors, corsHook } from './cors/index.js';
4
4
  export { validation } from './validation/index.js';
5
- export { requestLogger } from './request-logger/index.js';
6
- export { performanceMonitor } from './performance-monitor/index.js';
7
- export { errorTracker } from './error-tracker/index.js';
5
+ export { requestLogger, createRequestLoggerMiddleware } from './request-logger/index.js';
6
+ export { prometheus, createPrometheusMiddleware } from './prometheus/index.js';
7
+ export { cloudWatch, createCloudWatchMiddleware } from './cloudwatch/index.js';
8
+ export { performanceMonitor, createPerformanceMonitorMiddleware, } from './performance-monitor/index.js';
9
+ export { errorTracker, createErrorTrackerMiddleware } from './error-tracker/index.js';
8
10
  export { cookie } from './cookie/index.js';
9
11
  export { csrf } from './csrf/index.js';
10
12
  export { csp } from './csp/index.js';
@@ -33,6 +35,11 @@ export declare const builtInMiddleware: {
33
35
  }) => import("../index.js").MiddlewareInterface;
34
36
  cors: (options?: import("./cors/core.js").CORSOptions) => import("../index.js").MiddlewareInterface;
35
37
  validation: () => import("../index.js").MiddlewareInterface;
38
+ requestLogger: typeof import("./request-logger/middleware.js").createRequestLoggerMiddleware;
39
+ performanceMonitor: typeof import("./performance-monitor/middleware.js").createPerformanceMonitorMiddleware;
40
+ errorTracker: typeof import("./error-tracker/middleware.js").createErrorTrackerMiddleware;
41
+ prometheus: typeof import("./prometheus/middleware.js").createPrometheusMiddleware;
42
+ cloudWatch: typeof import("./cloudwatch/middleware.js").createCloudWatchMiddleware;
36
43
  cookie: (_config?: import("./cookie/hook.js").CookieConfig) => import("../index.js").MiddlewareInterface;
37
44
  csrf: (options?: import("./csrf/core.js").CSRFOptions) => import("../index.js").MiddlewareInterface;
38
45
  csp: (options?: import("./csp/core.js").CSPOptions) => import("../index.js").MiddlewareInterface;
@@ -52,8 +59,37 @@ export declare const builtInMiddleware: {
52
59
  template: typeof import("./template/middleware.js").createTemplateMiddleware;
53
60
  range: typeof import("./range/middleware.js").createRangeMiddleware;
54
61
  };
55
- export declare const simpleMiddleware: {
56
- requestLogger: (req: import("../../http/index.js").HttpRequest, res: import("../../http/index.js").HttpResponse, next: () => void) => void;
57
- performanceMonitor: (req: import("../../http/index.js").HttpRequest, res: import("../../http/index.js").HttpResponse, next: () => void) => void;
58
- errorTracker: (err: Error, req: import("../../http/index.js").HttpRequest, _res: import("../../http/index.js").HttpResponse, next: (err?: Error) => void) => void;
62
+ export declare const middleware: {
63
+ auth: (options: import("./auth/index.js").AuthOptions) => import("../index.js").MiddlewareInterface;
64
+ rateLimit: (options?: {
65
+ windowMs?: number;
66
+ max?: number;
67
+ message?: string;
68
+ }) => import("../index.js").MiddlewareInterface;
69
+ cors: (options?: import("./cors/core.js").CORSOptions) => import("../index.js").MiddlewareInterface;
70
+ validation: () => import("../index.js").MiddlewareInterface;
71
+ requestLogger: typeof import("./request-logger/middleware.js").createRequestLoggerMiddleware;
72
+ performanceMonitor: typeof import("./performance-monitor/middleware.js").createPerformanceMonitorMiddleware;
73
+ errorTracker: typeof import("./error-tracker/middleware.js").createErrorTrackerMiddleware;
74
+ prometheus: typeof import("./prometheus/middleware.js").createPrometheusMiddleware;
75
+ cloudWatch: typeof import("./cloudwatch/middleware.js").createCloudWatchMiddleware;
76
+ cookie: (_config?: import("./cookie/hook.js").CookieConfig) => import("../index.js").MiddlewareInterface;
77
+ csrf: (options?: import("./csrf/core.js").CSRFOptions) => import("../index.js").MiddlewareInterface;
78
+ csp: (options?: import("./csp/core.js").CSPOptions) => import("../index.js").MiddlewareInterface;
79
+ sse: (options?: import("./sse/core.js").SSEOptions) => import("../index.js").MiddlewareInterface;
80
+ session: (options?: import("./session/core.js").SessionOptions) => import("../index.js").MiddlewareInterface;
81
+ cache: (options?: import("../../../index.js").CacheOptions) => import("../index.js").MiddlewareInterface;
82
+ cdn: (options?: import("./cdn/index.js").CDNOptions) => import("../index.js").MiddlewareInterface;
83
+ graphql: (options: import("./graphql/index.js").GraphQLOptions) => import("../index.js").MiddlewareInterface;
84
+ http2: {
85
+ push: typeof import("./http2/middleware.js").createHttp2PushMiddleware;
86
+ };
87
+ helmet: typeof import("./helmet/middleware.js").createHelmetMiddleware;
88
+ compression: typeof import("./compression/middleware.js").createCompressionMiddleware;
89
+ bodySize: typeof import("./body-size/middleware.js").createBodySizeMiddleware;
90
+ staticFiles: typeof import("./static/middleware.js").createStaticMiddleware;
91
+ upload: typeof import("./upload/middleware.js").createUploadMiddleware;
92
+ template: typeof import("./template/middleware.js").createTemplateMiddleware;
93
+ range: typeof import("./range/middleware.js").createRangeMiddleware;
59
94
  };
95
+ export declare const MIDDLEWARE_FACTORY: unique symbol;
@@ -3,9 +3,11 @@ export { auth } from './auth/index.js';
3
3
  export { rateLimit } from './rate-limit/index.js';
4
4
  export { cors, corsHook } from './cors/index.js';
5
5
  export { validation } from './validation/index.js';
6
- export { requestLogger } from './request-logger/index.js';
7
- export { performanceMonitor } from './performance-monitor/index.js';
8
- export { errorTracker } from './error-tracker/index.js';
6
+ export { requestLogger, createRequestLoggerMiddleware } from './request-logger/index.js';
7
+ export { prometheus, createPrometheusMiddleware } from './prometheus/index.js';
8
+ export { cloudWatch, createCloudWatchMiddleware } from './cloudwatch/index.js';
9
+ export { performanceMonitor, createPerformanceMonitorMiddleware, } from './performance-monitor/index.js';
10
+ export { errorTracker, createErrorTrackerMiddleware } from './error-tracker/index.js';
9
11
  // Advanced Security & Performance Middleware
10
12
  export { cookie } from './cookie/index.js';
11
13
  export { csrf } from './csrf/index.js';
@@ -39,6 +41,8 @@ import { validation } from './validation/index.js';
39
41
  import { requestLogger } from './request-logger/index.js';
40
42
  import { performanceMonitor } from './performance-monitor/index.js';
41
43
  import { errorTracker } from './error-tracker/index.js';
44
+ import { prometheus } from './prometheus/index.js';
45
+ import { cloudWatch } from './cloudwatch/index.js';
42
46
  import { cookie } from './cookie/index.js';
43
47
  import { csrf } from './csrf/index.js';
44
48
  import { csp } from './csp/index.js';
@@ -55,11 +59,21 @@ import { staticFiles } from './static/index.js';
55
59
  import { upload } from './upload/index.js';
56
60
  import { template } from './template/index.js';
57
61
  import { range } from './range/index.js';
62
+ // The built-in middleware collection. Internal framework code references
63
+ // `builtInMiddleware` (the `middleware` identifier is a common local/parameter
64
+ // name inside the framework); the public API exposes the same object under
65
+ // the friendly `middleware` name.
58
66
  export const builtInMiddleware = {
59
67
  auth,
60
68
  rateLimit,
61
69
  cors: corsHook,
62
70
  validation,
71
+ // Observability
72
+ requestLogger,
73
+ performanceMonitor,
74
+ errorTracker,
75
+ prometheus,
76
+ cloudWatch,
63
77
  // Advanced middleware
64
78
  cookie,
65
79
  csrf,
@@ -82,9 +96,25 @@ export const builtInMiddleware = {
82
96
  template,
83
97
  range,
84
98
  };
85
- export const simpleMiddleware = {
86
- requestLogger,
87
- performanceMonitor,
88
- errorTracker,
99
+ // The Moro middleware namespace: every entry is a factory — called with
100
+ // options (or without, for defaults) and returns middleware. Referenced as
101
+ // middleware.cors(...), middleware.helmet(), middleware.requestLogger(), etc.
102
+ export const middleware = builtInMiddleware;
103
+ // Brand every built-in factory so the framework can recognize an UNCALLED
104
+ // factory passed where middleware is expected (app.use(middleware.helmet)
105
+ // instead of app.use(middleware.helmet())) and fail loudly at registration
106
+ // time instead of silently misbehaving at request time.
107
+ export const MIDDLEWARE_FACTORY = Symbol.for('morojs.middleware-factory');
108
+ const brandFactories = (collection) => {
109
+ for (const value of Object.values(collection)) {
110
+ if (typeof value === 'function') {
111
+ value[MIDDLEWARE_FACTORY] = true;
112
+ }
113
+ else if (value && typeof value === 'object') {
114
+ // Nested namespaces of factories (e.g. http2.push)
115
+ brandFactories(value);
116
+ }
117
+ }
89
118
  };
119
+ brandFactories(builtInMiddleware);
90
120
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/middleware/built-in/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Built-in Middleware Exports\nexport { auth } from './auth/index.js';\nexport { rateLimit } from './rate-limit/index.js';\nexport { cors, corsHook } from './cors/index.js';\nexport { validation } from './validation/index.js';\nexport { requestLogger } from './request-logger/index.js';\nexport { performanceMonitor } from './performance-monitor/index.js';\nexport { errorTracker } from './error-tracker/index.js';\n\n// Advanced Security & Performance Middleware\nexport { cookie } from './cookie/index.js';\nexport { csrf } from './csrf/index.js';\nexport { csp } from './csp/index.js';\nexport { sse } from './sse/index.js';\nexport { session } from './session/index.js';\n\n// Clean Architecture Middleware\nexport { cache } from './cache/index.js';\nexport { cdn } from './cdn/index.js';\n\n// HTTP/2 Middleware\nexport { http2 } from './http2/index.js';\n\n// HTTP Utilities Middleware\nexport { helmet } from './helmet/index.js';\nexport { compression } from './compression/index.js';\nexport { bodySize } from './body-size/index.js';\nexport { json, urlencoded } from './body-parsers/index.js';\nexport { staticFiles } from './static/index.js';\nexport { upload } from './upload/index.js';\nexport { template } from './template/index.js';\nexport { range } from './range/index.js';\n\n// Auth Helpers and Extended Providers\nexport {\n requireAuth,\n requireRole,\n requirePermission,\n requireAdmin,\n guestOnly,\n optionalAuth,\n withAuth,\n protectedRoute,\n authUtils,\n authResponses,\n sessionHelpers,\n} from './auth/helpers.js';\n\n// JWT Utilities for Custom Middleware\nexport {\n safeVerifyJWT,\n extractJWTFromHeader,\n createAuthErrorResponse,\n type JWTVerificationResult,\n} from './auth/jwt-helpers.js';\n\nexport {\n extendedProviders,\n enterpriseProviders,\n createCustomOAuthProvider,\n createCustomOIDCProvider,\n} from './auth/providers.js';\n\n// Import for collections\nimport { auth } from './auth/index.js';\nimport { rateLimit } from './rate-limit/index.js';\nimport { corsHook } from './cors/index.js';\nimport { validation } from './validation/index.js';\nimport { requestLogger } from './request-logger/index.js';\nimport { performanceMonitor } from './performance-monitor/index.js';\nimport { errorTracker } from './error-tracker/index.js';\nimport { cookie } from './cookie/index.js';\nimport { csrf } from './csrf/index.js';\nimport { csp } from './csp/index.js';\nimport { sse } from './sse/index.js';\nimport { session } from './session/index.js';\nimport { cache } from './cache/index.js';\nimport { cdn } from './cdn/index.js';\nimport { graphql } from './graphql/index.js';\nimport { http2 } from './http2/index.js';\nimport { helmet } from './helmet/index.js';\nimport { compression } from './compression/index.js';\nimport { bodySize } from './body-size/index.js';\nimport { staticFiles } from './static/index.js';\nimport { upload } from './upload/index.js';\nimport { template } from './template/index.js';\nimport { range } from './range/index.js';\n\nexport const builtInMiddleware = {\n auth,\n rateLimit,\n cors: corsHook,\n validation,\n // Advanced middleware\n cookie,\n csrf,\n csp,\n sse,\n session,\n // Clean architecture middleware\n cache,\n cdn,\n // GraphQL\n graphql,\n // HTTP/2\n http2,\n // HTTP Utilities\n helmet,\n compression,\n bodySize,\n staticFiles,\n upload,\n template,\n range,\n};\n\nexport const simpleMiddleware = {\n requestLogger,\n performanceMonitor,\n errorTracker,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/middleware/built-in/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Built-in Middleware Exports\nexport { auth } from './auth/index.js';\nexport { rateLimit } from './rate-limit/index.js';\nexport { cors, corsHook } from './cors/index.js';\nexport { validation } from './validation/index.js';\nexport { requestLogger, createRequestLoggerMiddleware } from './request-logger/index.js';\nexport { prometheus, createPrometheusMiddleware } from './prometheus/index.js';\nexport { cloudWatch, createCloudWatchMiddleware } from './cloudwatch/index.js';\nexport {\n performanceMonitor,\n createPerformanceMonitorMiddleware,\n} from './performance-monitor/index.js';\nexport { errorTracker, createErrorTrackerMiddleware } from './error-tracker/index.js';\n\n// Advanced Security & Performance Middleware\nexport { cookie } from './cookie/index.js';\nexport { csrf } from './csrf/index.js';\nexport { csp } from './csp/index.js';\nexport { sse } from './sse/index.js';\nexport { session } from './session/index.js';\n\n// Clean Architecture Middleware\nexport { cache } from './cache/index.js';\nexport { cdn } from './cdn/index.js';\n\n// HTTP/2 Middleware\nexport { http2 } from './http2/index.js';\n\n// HTTP Utilities Middleware\nexport { helmet } from './helmet/index.js';\nexport { compression } from './compression/index.js';\nexport { bodySize } from './body-size/index.js';\nexport { json, urlencoded } from './body-parsers/index.js';\nexport { staticFiles } from './static/index.js';\nexport { upload } from './upload/index.js';\nexport { template } from './template/index.js';\nexport { range } from './range/index.js';\n\n// Auth Helpers and Extended Providers\nexport {\n requireAuth,\n requireRole,\n requirePermission,\n requireAdmin,\n guestOnly,\n optionalAuth,\n withAuth,\n protectedRoute,\n authUtils,\n authResponses,\n sessionHelpers,\n} from './auth/helpers.js';\n\n// JWT Utilities for Custom Middleware\nexport {\n safeVerifyJWT,\n extractJWTFromHeader,\n createAuthErrorResponse,\n type JWTVerificationResult,\n} from './auth/jwt-helpers.js';\n\nexport {\n extendedProviders,\n enterpriseProviders,\n createCustomOAuthProvider,\n createCustomOIDCProvider,\n} from './auth/providers.js';\n\n// Import for collections\nimport { auth } from './auth/index.js';\nimport { rateLimit } from './rate-limit/index.js';\nimport { corsHook } from './cors/index.js';\nimport { validation } from './validation/index.js';\nimport { requestLogger } from './request-logger/index.js';\nimport { performanceMonitor } from './performance-monitor/index.js';\nimport { errorTracker } from './error-tracker/index.js';\nimport { prometheus } from './prometheus/index.js';\nimport { cloudWatch } from './cloudwatch/index.js';\nimport { cookie } from './cookie/index.js';\nimport { csrf } from './csrf/index.js';\nimport { csp } from './csp/index.js';\nimport { sse } from './sse/index.js';\nimport { session } from './session/index.js';\nimport { cache } from './cache/index.js';\nimport { cdn } from './cdn/index.js';\nimport { graphql } from './graphql/index.js';\nimport { http2 } from './http2/index.js';\nimport { helmet } from './helmet/index.js';\nimport { compression } from './compression/index.js';\nimport { bodySize } from './body-size/index.js';\nimport { staticFiles } from './static/index.js';\nimport { upload } from './upload/index.js';\nimport { template } from './template/index.js';\nimport { range } from './range/index.js';\n\n// The built-in middleware collection. Internal framework code references\n// `builtInMiddleware` (the `middleware` identifier is a common local/parameter\n// name inside the framework); the public API exposes the same object under\n// the friendly `middleware` name.\nexport const builtInMiddleware = {\n auth,\n rateLimit,\n cors: corsHook,\n validation,\n // Observability\n requestLogger,\n performanceMonitor,\n errorTracker,\n prometheus,\n cloudWatch,\n // Advanced middleware\n cookie,\n csrf,\n csp,\n sse,\n session,\n // Clean architecture middleware\n cache,\n cdn,\n // GraphQL\n graphql,\n // HTTP/2\n http2,\n // HTTP Utilities\n helmet,\n compression,\n bodySize,\n staticFiles,\n upload,\n template,\n range,\n};\n\n// The Moro middleware namespace: every entry is a factory — called with\n// options (or without, for defaults) and returns middleware. Referenced as\n// middleware.cors(...), middleware.helmet(), middleware.requestLogger(), etc.\nexport const middleware = builtInMiddleware;\n\n// Brand every built-in factory so the framework can recognize an UNCALLED\n// factory passed where middleware is expected (app.use(middleware.helmet)\n// instead of app.use(middleware.helmet())) and fail loudly at registration\n// time instead of silently misbehaving at request time.\nexport const MIDDLEWARE_FACTORY = Symbol.for('morojs.middleware-factory');\n\nconst brandFactories = (collection: Record<string, unknown>): void => {\n for (const value of Object.values(collection)) {\n if (typeof value === 'function') {\n (value as any)[MIDDLEWARE_FACTORY] = true;\n } else if (value && typeof value === 'object') {\n // Nested namespaces of factories (e.g. http2.push)\n brandFactories(value as Record<string, unknown>);\n }\n }\n};\nbrandFactories(builtInMiddleware);\n"]}
@@ -1 +1,3 @@
1
- export { performanceMonitor } from './middleware.js';
1
+ export { createPerformanceMonitorMiddleware } from './middleware.js';
2
+ import { createPerformanceMonitorMiddleware } from './middleware.js';
3
+ export declare const performanceMonitor: typeof createPerformanceMonitorMiddleware;
@@ -1,4 +1,5 @@
1
1
  // Performance Monitor - Main entry point
2
- // Re-exports the performance monitor middleware
3
- export { performanceMonitor } from './middleware.js';
2
+ export { createPerformanceMonitorMiddleware } from './middleware.js';
3
+ import { createPerformanceMonitorMiddleware } from './middleware.js';
4
+ export const performanceMonitor = createPerformanceMonitorMiddleware;
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/performance-monitor/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,gDAAgD;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["// Performance Monitor - Main entry point\n// Re-exports the performance monitor middleware\n\nexport { performanceMonitor } from './middleware.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/performance-monitor/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,OAAO,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,CAAC,MAAM,kBAAkB,GAAG,kCAAkC,CAAC","sourcesContent":["// Performance Monitor - Main entry point\nexport { createPerformanceMonitorMiddleware } from './middleware.js';\n\nimport { createPerformanceMonitorMiddleware } from './middleware.js';\n\nexport const performanceMonitor = createPerformanceMonitorMiddleware;\n"]}
@@ -5,9 +5,9 @@ import { HttpRequest, HttpResponse } from '../../../../types/http.js';
5
5
  *
6
6
  * @example
7
7
  * ```ts
8
- * import { performanceMonitor } from '@/middleware/built-in/performance-monitor';
8
+ * import { middleware } from '@morojs/moro';
9
9
  *
10
- * app.use(performanceMonitor);
10
+ * app.use(middleware.performanceMonitor());
11
11
  * ```
12
12
  */
13
- export declare const performanceMonitor: (req: HttpRequest, res: HttpResponse, next: () => void) => void;
13
+ export declare function createPerformanceMonitorMiddleware(): (req: HttpRequest, res: HttpResponse, next: () => void) => void;
@@ -7,24 +7,26 @@ const logger = createFrameworkLogger('PerformanceMonitor');
7
7
  *
8
8
  * @example
9
9
  * ```ts
10
- * import { performanceMonitor } from '@/middleware/built-in/performance-monitor';
10
+ * import { middleware } from '@morojs/moro';
11
11
  *
12
- * app.use(performanceMonitor);
12
+ * app.use(middleware.performanceMonitor());
13
13
  * ```
14
14
  */
15
- export const performanceMonitor = (req, res, next) => {
16
- const startTime = Date.now();
17
- res.on('finish', () => {
18
- const duration = Date.now() - startTime;
19
- // Log slow requests
20
- if (duration > 1000) {
21
- logger.warn(`Slow request detected: ${req.path} took ${duration}ms`, 'SlowRequest', {
22
- path: req.path,
23
- method: req.method,
24
- duration,
25
- });
26
- }
27
- });
28
- next();
29
- };
15
+ export function createPerformanceMonitorMiddleware() {
16
+ return (req, res, next) => {
17
+ const startTime = Date.now();
18
+ res.on('finish', () => {
19
+ const duration = Date.now() - startTime;
20
+ // Log slow requests
21
+ if (duration > 1000) {
22
+ logger.warn(`Slow request detected: ${req.path} took ${duration}ms`, 'SlowRequest', {
23
+ path: req.path,
24
+ method: req.method,
25
+ duration,
26
+ });
27
+ }
28
+ });
29
+ next();
30
+ };
31
+ }
30
32
  //# sourceMappingURL=middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/performance-monitor/middleware.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAgB,EAAE,GAAiB,EAAE,IAAgB,EAAQ,EAAE;IAChG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,oBAAoB;QACpB,IAAI,QAAQ,GAAG,IAAI,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,IAAI,SAAS,QAAQ,IAAI,EAAE,aAAa,EAAE;gBAClF,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACT,CAAC,CAAC","sourcesContent":["// Performance Monitor Middleware\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\n\nconst logger = createFrameworkLogger('PerformanceMonitor');\n\n/**\n * Performance monitoring middleware\n * Tracks request duration and logs warnings for slow requests\n *\n * @example\n * ```ts\n * import { performanceMonitor } from '@/middleware/built-in/performance-monitor';\n *\n * app.use(performanceMonitor);\n * ```\n */\nexport const performanceMonitor = (req: HttpRequest, res: HttpResponse, next: () => void): void => {\n const startTime = Date.now();\n\n res.on('finish', () => {\n const duration = Date.now() - startTime;\n\n // Log slow requests\n if (duration > 1000) {\n logger.warn(`Slow request detected: ${req.path} took ${duration}ms`, 'SlowRequest', {\n path: req.path,\n method: req.method,\n duration,\n });\n }\n });\n\n next();\n};\n"]}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/performance-monitor/middleware.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kCAAkC;IAChD,OAAO,CAAC,GAAgB,EAAE,GAAiB,EAAE,IAAgB,EAAQ,EAAE;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,oBAAoB;YACpB,IAAI,QAAQ,GAAG,IAAI,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,IAAI,SAAS,QAAQ,IAAI,EAAE,aAAa,EAAE;oBAClF,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Performance Monitor Middleware\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\n\nconst logger = createFrameworkLogger('PerformanceMonitor');\n\n/**\n * Performance monitoring middleware\n * Tracks request duration and logs warnings for slow requests\n *\n * @example\n * ```ts\n * import { middleware } from '@morojs/moro';\n *\n * app.use(middleware.performanceMonitor());\n * ```\n */\nexport function createPerformanceMonitorMiddleware() {\n return (req: HttpRequest, res: HttpResponse, next: () => void): void => {\n const startTime = Date.now();\n\n res.on('finish', () => {\n const duration = Date.now() - startTime;\n\n // Log slow requests\n if (duration > 1000) {\n logger.warn(`Slow request detected: ${req.path} took ${duration}ms`, 'SlowRequest', {\n path: req.path,\n method: req.method,\n duration,\n });\n }\n });\n\n next();\n };\n}\n"]}
@@ -0,0 +1,27 @@
1
+ export interface PrometheusOptions {
2
+ /** Path that serves the metrics exposition (default '/metrics') */
3
+ endpoint?: string;
4
+ /** Include process/heap/uptime gauges (default true) */
5
+ includeProcessMetrics?: boolean;
6
+ /** Include framework object-pool and route-cache metrics (default true) */
7
+ includePoolMetrics?: boolean;
8
+ /** Histogram bucket upper bounds in seconds */
9
+ buckets?: number[];
10
+ }
11
+ /**
12
+ * Minimal dependency-free Prometheus metrics registry.
13
+ * Tracks request counters and duration histograms labeled by
14
+ * {method, status} — bounded label cardinality by design (no raw paths).
15
+ */
16
+ export declare class PrometheusCore {
17
+ private readonly buckets;
18
+ private readonly includeProcessMetrics;
19
+ private readonly includePoolMetrics;
20
+ private requestCounts;
21
+ private durations;
22
+ constructor(options?: PrometheusOptions);
23
+ recordRequest(method: string, statusCode: number, durationMs: number): void;
24
+ /** Render all metrics in the Prometheus text exposition format (0.0.4). */
25
+ render(): string;
26
+ private labelsFor;
27
+ }