hi-secure 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 (210) hide show
  1. package/dist/adapters/ArgonAdapter.d.ts +8 -0
  2. package/dist/adapters/ArgonAdapter.d.ts.map +1 -0
  3. package/dist/adapters/ArgonAdapter.js +45 -0
  4. package/dist/adapters/ArgonAdapter.js.map +1 -0
  5. package/dist/adapters/BcryptAdapter.d.ts +7 -0
  6. package/dist/adapters/BcryptAdapter.d.ts.map +1 -0
  7. package/dist/adapters/BcryptAdapter.js +48 -0
  8. package/dist/adapters/BcryptAdapter.js.map +1 -0
  9. package/dist/adapters/DomPurifyAdapter.d.ts +13 -0
  10. package/dist/adapters/DomPurifyAdapter.d.ts.map +1 -0
  11. package/dist/adapters/DomPurifyAdapter.js +61 -0
  12. package/dist/adapters/DomPurifyAdapter.js.map +1 -0
  13. package/dist/adapters/ExpressRLAdapter.d.ts +13 -0
  14. package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -0
  15. package/dist/adapters/ExpressRLAdapter.js +68 -0
  16. package/dist/adapters/ExpressRLAdapter.js.map +1 -0
  17. package/dist/adapters/ExpressValidatorAdapter.d.ts +6 -0
  18. package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -0
  19. package/dist/adapters/ExpressValidatorAdapter.js +78 -0
  20. package/dist/adapters/ExpressValidatorAdapter.js.map +1 -0
  21. package/dist/adapters/GoggleAdapter.d.ts +15 -0
  22. package/dist/adapters/GoggleAdapter.d.ts.map +1 -0
  23. package/dist/adapters/GoggleAdapter.js +91 -0
  24. package/dist/adapters/GoggleAdapter.js.map +1 -0
  25. package/dist/adapters/GoogleAdapter.d.ts +15 -0
  26. package/dist/adapters/GoogleAdapter.d.ts.map +1 -0
  27. package/dist/adapters/GoogleAdapter.js +159 -0
  28. package/dist/adapters/GoogleAdapter.js.map +1 -0
  29. package/dist/adapters/JWTAdapter.d.ts +28 -0
  30. package/dist/adapters/JWTAdapter.d.ts.map +1 -0
  31. package/dist/adapters/JWTAdapter.js +276 -0
  32. package/dist/adapters/JWTAdapter.js.map +1 -0
  33. package/dist/adapters/RLFlexibleAdapter.d.ts +11 -0
  34. package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -0
  35. package/dist/adapters/RLFlexibleAdapter.js +115 -0
  36. package/dist/adapters/RLFlexibleAdapter.js.map +1 -0
  37. package/dist/adapters/SanitizeHtmlAdapter.d.ts +12 -0
  38. package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -0
  39. package/dist/adapters/SanitizeHtmlAdapter.js +141 -0
  40. package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -0
  41. package/dist/adapters/XSSAdapter.d.ts +33 -0
  42. package/dist/adapters/XSSAdapter.d.ts.map +1 -0
  43. package/dist/adapters/XSSAdapter.js +127 -0
  44. package/dist/adapters/XSSAdapter.js.map +1 -0
  45. package/dist/adapters/ZodAdapter.d.ts +7 -0
  46. package/dist/adapters/ZodAdapter.d.ts.map +1 -0
  47. package/dist/adapters/ZodAdapter.js +39 -0
  48. package/dist/adapters/ZodAdapter.js.map +1 -0
  49. package/dist/core/HiSecure.d.ts +62 -0
  50. package/dist/core/HiSecure.d.ts.map +1 -0
  51. package/dist/core/HiSecure.js +273 -0
  52. package/dist/core/HiSecure.js.map +1 -0
  53. package/dist/core/config.d.ts +3 -0
  54. package/dist/core/config.d.ts.map +1 -0
  55. package/dist/core/config.js +53 -0
  56. package/dist/core/config.js.map +1 -0
  57. package/dist/core/constants.d.ts +37 -0
  58. package/dist/core/constants.d.ts.map +1 -0
  59. package/dist/core/constants.js +67 -0
  60. package/dist/core/constants.js.map +1 -0
  61. package/dist/core/errors/AdapterError.d.ts +5 -0
  62. package/dist/core/errors/AdapterError.d.ts.map +1 -0
  63. package/dist/core/errors/AdapterError.js +15 -0
  64. package/dist/core/errors/AdapterError.js.map +1 -0
  65. package/dist/core/errors/HttpErrror.d.ts +17 -0
  66. package/dist/core/errors/HttpErrror.d.ts.map +1 -0
  67. package/dist/core/errors/HttpErrror.js +36 -0
  68. package/dist/core/errors/HttpErrror.js.map +1 -0
  69. package/dist/core/errors/SanitizerError.d.ts +5 -0
  70. package/dist/core/errors/SanitizerError.d.ts.map +1 -0
  71. package/dist/core/errors/SanitizerError.js +14 -0
  72. package/dist/core/errors/SanitizerError.js.map +1 -0
  73. package/dist/core/errors/SecurityError.d.ts +5 -0
  74. package/dist/core/errors/SecurityError.d.ts.map +1 -0
  75. package/dist/core/errors/SecurityError.js +14 -0
  76. package/dist/core/errors/SecurityError.js.map +1 -0
  77. package/dist/core/errors/ValidationError.d.ts +5 -0
  78. package/dist/core/errors/ValidationError.d.ts.map +1 -0
  79. package/dist/core/errors/ValidationError.js +14 -0
  80. package/dist/core/errors/ValidationError.js.map +1 -0
  81. package/dist/core/types/HiSecureConfig.d.ts +47 -0
  82. package/dist/core/types/HiSecureConfig.d.ts.map +1 -0
  83. package/dist/core/types/HiSecureConfig.js +3 -0
  84. package/dist/core/types/HiSecureConfig.js.map +1 -0
  85. package/dist/core/types/SecureOptions.d.ts +30 -0
  86. package/dist/core/types/SecureOptions.d.ts.map +1 -0
  87. package/dist/core/types/SecureOptions.js +4 -0
  88. package/dist/core/types/SecureOptions.js.map +1 -0
  89. package/dist/core/useSecure.d.ts +10 -0
  90. package/dist/core/useSecure.d.ts.map +1 -0
  91. package/dist/core/useSecure.js +85 -0
  92. package/dist/core/useSecure.js.map +1 -0
  93. package/dist/examples/e1.d.ts +1 -0
  94. package/dist/examples/e1.d.ts.map +1 -0
  95. package/dist/examples/e1.js +3 -0
  96. package/dist/examples/e1.js.map +1 -0
  97. package/dist/index.d.ts +9 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +15 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/logging/index.d.ts +3 -0
  102. package/dist/logging/index.d.ts.map +1 -0
  103. package/dist/logging/index.js +19 -0
  104. package/dist/logging/index.js.map +1 -0
  105. package/dist/logging/morganSetup.d.ts +2 -0
  106. package/dist/logging/morganSetup.d.ts.map +1 -0
  107. package/dist/logging/morganSetup.js +9 -0
  108. package/dist/logging/morganSetup.js.map +1 -0
  109. package/dist/logging/winstonSetup.d.ts +6 -0
  110. package/dist/logging/winstonSetup.d.ts.map +1 -0
  111. package/dist/logging/winstonSetup.js +22 -0
  112. package/dist/logging/winstonSetup.js.map +1 -0
  113. package/dist/managers/AuthManager.d.ts +23 -0
  114. package/dist/managers/AuthManager.d.ts.map +1 -0
  115. package/dist/managers/AuthManager.js +190 -0
  116. package/dist/managers/AuthManager.js.map +1 -0
  117. package/dist/managers/CorsManager.d.ts +9 -0
  118. package/dist/managers/CorsManager.d.ts.map +1 -0
  119. package/dist/managers/CorsManager.js +55 -0
  120. package/dist/managers/CorsManager.js.map +1 -0
  121. package/dist/managers/HashManager.d.ts +22 -0
  122. package/dist/managers/HashManager.d.ts.map +1 -0
  123. package/dist/managers/HashManager.js +319 -0
  124. package/dist/managers/HashManager.js.map +1 -0
  125. package/dist/managers/JsonManager.d.ts +6 -0
  126. package/dist/managers/JsonManager.d.ts.map +1 -0
  127. package/dist/managers/JsonManager.js +142 -0
  128. package/dist/managers/JsonManager.js.map +1 -0
  129. package/dist/managers/RateLimitManager.d.ts +16 -0
  130. package/dist/managers/RateLimitManager.d.ts.map +1 -0
  131. package/dist/managers/RateLimitManager.js +108 -0
  132. package/dist/managers/RateLimitManager.js.map +1 -0
  133. package/dist/managers/SanitizerManager.d.ts +18 -0
  134. package/dist/managers/SanitizerManager.d.ts.map +1 -0
  135. package/dist/managers/SanitizerManager.js +296 -0
  136. package/dist/managers/SanitizerManager.js.map +1 -0
  137. package/dist/managers/ValidatorManager.d.ts +13 -0
  138. package/dist/managers/ValidatorManager.d.ts.map +1 -0
  139. package/dist/managers/ValidatorManager.js +218 -0
  140. package/dist/managers/ValidatorManager.js.map +1 -0
  141. package/dist/middlewares/errorHandler.d.ts +3 -0
  142. package/dist/middlewares/errorHandler.d.ts.map +1 -0
  143. package/dist/middlewares/errorHandler.js +94 -0
  144. package/dist/middlewares/errorHandler.js.map +1 -0
  145. package/dist/middlewares/index.d.ts +3 -0
  146. package/dist/middlewares/index.d.ts.map +1 -0
  147. package/dist/middlewares/index.js +19 -0
  148. package/dist/middlewares/index.js.map +1 -0
  149. package/dist/middlewares/requestLogger.d.ts +2 -0
  150. package/dist/middlewares/requestLogger.d.ts.map +1 -0
  151. package/dist/middlewares/requestLogger.js +8 -0
  152. package/dist/middlewares/requestLogger.js.map +1 -0
  153. package/dist/test/t1.d.ts +1 -0
  154. package/dist/test/t1.d.ts.map +1 -0
  155. package/dist/test/t1.js +3 -0
  156. package/dist/test/t1.js.map +1 -0
  157. package/dist/utils/deepFreeze.d.ts +2 -0
  158. package/dist/utils/deepFreeze.d.ts.map +1 -0
  159. package/dist/utils/deepFreeze.js +69 -0
  160. package/dist/utils/deepFreeze.js.map +1 -0
  161. package/dist/utils/deepMerge.d.ts +5 -0
  162. package/dist/utils/deepMerge.d.ts.map +1 -0
  163. package/dist/utils/deepMerge.js +68 -0
  164. package/dist/utils/deepMerge.js.map +1 -0
  165. package/dist/utils/normalizeOptions.d.ts +38 -0
  166. package/dist/utils/normalizeOptions.d.ts.map +1 -0
  167. package/dist/utils/normalizeOptions.js +119 -0
  168. package/dist/utils/normalizeOptions.js.map +1 -0
  169. package/package.json +50 -0
  170. package/src/adapters/ArgonAdapter.ts +41 -0
  171. package/src/adapters/BcryptAdapter.ts +49 -0
  172. package/src/adapters/ExpressRLAdapter.ts +84 -0
  173. package/src/adapters/ExpressValidatorAdapter.ts +99 -0
  174. package/src/adapters/GoogleAdapter.ts +206 -0
  175. package/src/adapters/JWTAdapter.ts +346 -0
  176. package/src/adapters/RLFlexibleAdapter.ts +139 -0
  177. package/src/adapters/SanitizeHtmlAdapter.ts +162 -0
  178. package/src/adapters/XSSAdapter.ts +153 -0
  179. package/src/adapters/ZodAdapter.ts +91 -0
  180. package/src/core/HiSecure.ts +955 -0
  181. package/src/core/config.ts +156 -0
  182. package/src/core/constants.ts +73 -0
  183. package/src/core/errors/AdapterError.ts +14 -0
  184. package/src/core/errors/HttpErrror.ts +46 -0
  185. package/src/core/errors/SanitizerError.ts +13 -0
  186. package/src/core/errors/SecurityError.ts +13 -0
  187. package/src/core/errors/ValidationError.ts +13 -0
  188. package/src/core/types/HiSecureConfig.ts +62 -0
  189. package/src/core/types/SecureOptions.ts +61 -0
  190. package/src/core/useSecure.ts +111 -0
  191. package/src/examples/e1.ts +1 -0
  192. package/src/index.ts +17 -0
  193. package/src/logging/index.ts +2 -0
  194. package/src/logging/morganSetup.ts +3 -0
  195. package/src/logging/winstonSetup.ts +17 -0
  196. package/src/managers/AuthManager.ts +237 -0
  197. package/src/managers/CorsManager.ts +58 -0
  198. package/src/managers/HashManager.ts +390 -0
  199. package/src/managers/JsonManager.ts +149 -0
  200. package/src/managers/RateLimitManager.ts +368 -0
  201. package/src/managers/SanitizerManager.ts +359 -0
  202. package/src/managers/ValidatorManager.ts +269 -0
  203. package/src/middlewares/errorHandler.ts +265 -0
  204. package/src/middlewares/index.ts +2 -0
  205. package/src/middlewares/requestLogger.ts +5 -0
  206. package/src/test/t1.ts +1 -0
  207. package/src/utils/deepFreeze.ts +76 -0
  208. package/src/utils/deepMerge.ts +87 -0
  209. package/src/utils/normalizeOptions.ts +265 -0
  210. package/tsconfig.json +30 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HashManager.js","sourceRoot":"","sources":["../../src/managers/HashManager.ts"],"names":[],"mappings":"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","sourcesContent":["// // // import { AdapterError } from \"../core/errors/AdapterError\";\r\n// // // import { HiSecureConfig } from \"../core/config\";\r\n// // // import { logger } from \"../logging\";\r\n\r\n// // // export class HashManager {\r\n// // // private config: HiSecureConfig[\"hashing\"];\r\n// // // private primaryAdapter: {\r\n// // // hash: (value: string) => Promise<string>;\r\n// // // verify: (value: string, hashed: string) => Promise<boolean>;\r\n// // // };\r\n// // // private fallbackAdapter: {\r\n// // // hash: (value: string) => Promise<string>;\r\n// // // verify: (value: string, hashed: string) => Promise<boolean>;\r\n// // // } | null;\r\n\r\n// // // constructor(\r\n// // // config: HiSecureConfig[\"hashing\"],\r\n// // // primaryAdapter: any,\r\n// // // fallbackAdapter: any\r\n// // // ) {\r\n// // // this.config = config;\r\n// // // this.primaryAdapter = primaryAdapter;\r\n// // // this.fallbackAdapter = fallbackAdapter;\r\n// // // }\r\n\r\n// // // /**\r\n// // // * Hash a password using primary adapter (Argon2)\r\n// // // * If it fails → fallback (Bcrypt)\r\n// // // */\r\n// // // async hash(value: string): Promise<string> {\r\n// // // try {\r\n// // // return await this.primaryAdapter.hash(value);\r\n// // // } catch (err: any) {\r\n// // // logger.warn(\"⚠ Primary hashing failed — switching to fallback\", {\r\n// // // error: err?.message,\r\n// // // });\r\n\r\n// // // if (!this.fallbackAdapter) {\r\n// // // throw new AdapterError(\r\n// // // \"Primary hashing failed and no fallback adapter is configured.\"\r\n// // // );\r\n// // // }\r\n\r\n// // // try {\r\n// // // return await this.fallbackAdapter.hash(value);\r\n// // // } catch (fallbackErr: any) {\r\n// // // logger.error(\"❌ Fallback hashing failed\", {\r\n// // // error: fallbackErr?.message,\r\n// // // });\r\n// // // throw new AdapterError(\r\n// // // \"Both primary and fallback hashing failed.\"\r\n// // // );\r\n// // // }\r\n// // // }\r\n// // // }\r\n\r\n// // // /**\r\n// // // * Verify using primary hashing method.\r\n// // // * If mismatch OR failure → use fallback.\r\n// // // */\r\n// // // async verify(value: string, hashed: string): Promise<boolean> {\r\n// // // try {\r\n// // // return await this.primaryAdapter.verify(value, hashed);\r\n// // // } catch (err: any) {\r\n// // // logger.warn(\"⚠ Primary verify failed — trying fallback\", {\r\n// // // error: err?.message,\r\n// // // });\r\n\r\n// // // if (!this.fallbackAdapter) {\r\n// // // throw new AdapterError(\r\n// // // \"Primary verify failed and no fallback adapter is configured.\"\r\n// // // );\r\n// // // }\r\n\r\n// // // try {\r\n// // // return await this.fallbackAdapter.verify(value, hashed);\r\n// // // } catch (fallbackErr: any) {\r\n// // // logger.error(\"❌ Fallback verify failed\", {\r\n// // // error: fallbackErr?.message,\r\n// // // });\r\n\r\n// // // throw new AdapterError(\r\n// // // \"Both primary and fallback verify failed.\"\r\n// // // );\r\n// // // }\r\n// // // }\r\n// // // }\r\n// // // }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// // import { HiSecureConfig } from \"../core/config.js\";\r\n// // import { logger } from \"../logging\";\r\n\r\n// // interface HashAdapter {\r\n// // hash(value: string): Promise<string>;\r\n// // verify(value: string, hashed: string): Promise<boolean>;\r\n// // }\r\n\r\n// // export class HashManager {\r\n// // private config: HiSecureConfig[\"hashing\"];\r\n// // private primaryAdapter: HashAdapter;\r\n// // private fallbackAdapter: HashAdapter | null;\r\n\r\n// // constructor(\r\n// // config: HiSecureConfig[\"hashing\"],\r\n// // primaryAdapter: HashAdapter,\r\n// // fallbackAdapter: HashAdapter | null\r\n// // ) {\r\n// // this.config = config;\r\n// // this.primaryAdapter = primaryAdapter;\r\n// // this.fallbackAdapter = fallbackAdapter;\r\n// // }\r\n\r\n// // async hash(value: string): Promise<string> {\r\n// // try {\r\n// // return await this.primaryAdapter.hash(value);\r\n// // } catch (err: any) {\r\n// // logger.warn(\"⚠ Primary hashing failed — trying fallback\", {\r\n// // error: err?.message,\r\n// // });\r\n\r\n// // if (!this.fallbackAdapter) {\r\n// // throw new AdapterError(\r\n// // \"Primary hashing failed and no fallback adapter configured.\"\r\n// // );\r\n// // }\r\n\r\n// // try {\r\n// // return await this.fallbackAdapter.hash(value);\r\n// // } catch (fallbackErr: any) {\r\n// // logger.error(\"❌ Fallback hashing failed\", {\r\n// // error: fallbackErr?.message,\r\n// // });\r\n// // throw new AdapterError(\r\n// // \"Both primary and fallback hashing failed.\"\r\n// // );\r\n// // }\r\n// // }\r\n// // }\r\n\r\n// // async verify(value: string, hashed: string): Promise<boolean> {\r\n// // try {\r\n// // return await this.primaryAdapter.verify(value, hashed);\r\n// // } catch (err: any) {\r\n// // logger.warn(\"⚠ Primary verify failed — trying fallback\", {\r\n// // error: err?.message,\r\n// // });\r\n\r\n// // if (!this.fallbackAdapter) {\r\n// // throw new AdapterError(\r\n// // \"Primary verify failed and no fallback adapter configured.\"\r\n// // );\r\n// // }\r\n\r\n// // try {\r\n// // return await this.fallbackAdapter.verify(value, hashed);\r\n// // } catch (fallbackErr: any) {\r\n// // logger.error(\"❌ Fallback verify failed\", {\r\n// // error: fallbackErr?.message,\r\n// // });\r\n// // throw new AdapterError(\r\n// // \"Both primary and fallback verify failed.\"\r\n// // );\r\n// // }\r\n// // }\r\n// // }\r\n// // }\r\n\r\n\r\n\r\n// // src/managers/HashManager.ts - FIXED\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\n// import { logger } from \"../logging\";\r\n\r\n// interface HashAdapter {\r\n// hash(value: string): Promise<string>;\r\n// verify(value: string, hashed: string): Promise<boolean>;\r\n// getAlgorithm(): string;\r\n// }\r\n\r\n// export interface HashResult {\r\n// hash: string;\r\n// algorithm: string;\r\n// usedFallback: boolean;\r\n// }\r\n\r\n// export class HashManager {\r\n// private config: HiSecureConfig[\"hashing\"];\r\n// private primaryAdapter: HashAdapter;\r\n// private fallbackAdapter: HashAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"hashing\"],\r\n// primaryAdapter: HashAdapter,\r\n// fallbackAdapter: HashAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// async hash(value: string, options?: { allowFallback?: boolean }): Promise<HashResult> {\r\n// try {\r\n// const hash = await this.primaryAdapter.hash(value);\r\n// return {\r\n// hash,\r\n// algorithm: this.config.primary,\r\n// usedFallback: false\r\n// };\r\n// } catch (err: any) {\r\n// logger.warn(\"⚠ Primary hashing failed\", {\r\n// error: err.message,\r\n// algorithm: this.config.primary\r\n// });\r\n\r\n// if (!options?.allowFallback || !this.fallbackAdapter) {\r\n// throw new AdapterError(\r\n// `Primary hashing (${this.config.primary}) failed. Fallback not allowed.`\r\n// );\r\n// }\r\n\r\n// try {\r\n// const hash = await this.fallbackAdapter.hash(value);\r\n \r\n// // Log security downgrade warning\r\n// logger.warn(\"⚠ SECURITY DOWNGRADE: Using fallback hashing\", {\r\n// from: this.config.primary,\r\n// to: this.config.fallback\r\n// });\r\n \r\n// return {\r\n// hash,\r\n// algorithm: this.config.fallback || 'bcrypt',\r\n// usedFallback: true\r\n// };\r\n// } catch (fallbackErr: any) {\r\n// logger.error(\"❌ Fallback hashing failed\", {\r\n// error: fallbackErr?.message,\r\n// });\r\n// throw new AdapterError(\r\n// \"Both primary and fallback hashing failed.\"\r\n// );\r\n// }\r\n// }\r\n// }\r\n\r\n// async verify(value: string, hashed: string): Promise<boolean> {\r\n// // Try primary adapter first\r\n// try {\r\n// return await this.primaryAdapter.verify(value, hashed);\r\n// } catch (primaryErr: any) {\r\n// logger.warn(\"⚠ Primary verify failed\", {\r\n// error: primaryErr?.message,\r\n// });\r\n\r\n// // If fallback exists, try it\r\n// if (this.fallbackAdapter) {\r\n// try {\r\n// return await this.fallbackAdapter.verify(value, hashed);\r\n// } catch (fallbackErr: any) {\r\n// logger.error(\"❌ Fallback verify failed\", {\r\n// error: fallbackErr?.message,\r\n// });\r\n// throw new AdapterError(\r\n// \"Both primary and fallback verify failed.\"\r\n// );\r\n// }\r\n// }\r\n \r\n// throw new AdapterError(\r\n// \"Primary verify failed and no fallback adapter configured.\"\r\n// );\r\n// }\r\n// }\r\n// }\r\n\r\n\r\n// src/managers/HashManager.ts - COMPLETE FIXED\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface HashAdapter {\r\n hash(value: string): Promise<string>;\r\n verify(value: string, hashed: string): Promise<boolean>;\r\n // ❌ getAlgorithm() REMOVED - Not needed in adapters\r\n}\r\n\r\nexport interface HashResult {\r\n hash: string;\r\n algorithm: string;\r\n usedFallback: boolean;\r\n}\r\n\r\nexport class HashManager {\r\n private config: HiSecureConfig[\"hashing\"];\r\n private primaryAdapter: HashAdapter;\r\n private fallbackAdapter: HashAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"hashing\"],\r\n primaryAdapter: HashAdapter,\r\n fallbackAdapter: HashAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n }\r\n\r\n async hash(value: string, options?: { allowFallback?: boolean }): Promise<HashResult> {\r\n try {\r\n const hash = await this.primaryAdapter.hash(value);\r\n return {\r\n hash,\r\n algorithm: this.config.primary,\r\n usedFallback: false\r\n };\r\n } catch (err: any) {\r\n logger.warn(\"⚠ Primary hashing failed\", {\r\n error: err.message,\r\n algorithm: this.config.primary\r\n });\r\n\r\n if (!options?.allowFallback || !this.fallbackAdapter) {\r\n throw new AdapterError(\r\n `Primary hashing (${this.config.primary}) failed. Fallback not allowed.`\r\n );\r\n }\r\n\r\n try {\r\n const hash = await this.fallbackAdapter.hash(value);\r\n \r\n // Log security downgrade warning\r\n logger.warn(\"⚠ SECURITY DOWNGRADE: Using fallback hashing\", {\r\n from: this.config.primary,\r\n to: this.config.fallback\r\n });\r\n \r\n return {\r\n hash,\r\n algorithm: this.config.fallback || 'bcrypt',\r\n usedFallback: true\r\n };\r\n } catch (fallbackErr: any) {\r\n logger.error(\"❌ Fallback hashing failed\", {\r\n error: fallbackErr?.message,\r\n });\r\n throw new AdapterError(\r\n \"Both primary and fallback hashing failed.\"\r\n );\r\n }\r\n }\r\n }\r\n\r\n async verify(value: string, hashed: string): Promise<boolean> {\r\n // Try primary adapter first\r\n try {\r\n return await this.primaryAdapter.verify(value, hashed);\r\n } catch (primaryErr: any) {\r\n logger.warn(\"⚠ Primary verify failed\", {\r\n error: primaryErr?.message,\r\n });\r\n\r\n // If fallback exists, try it\r\n if (this.fallbackAdapter) {\r\n try {\r\n return await this.fallbackAdapter.verify(value, hashed);\r\n } catch (fallbackErr: any) {\r\n logger.error(\"❌ Fallback verify failed\", {\r\n error: fallbackErr?.message,\r\n });\r\n throw new AdapterError(\r\n \"Both primary and fallback verify failed.\"\r\n );\r\n }\r\n }\r\n \r\n throw new AdapterError(\r\n \"Primary verify failed and no fallback adapter configured.\"\r\n );\r\n }\r\n }\r\n}"]}
@@ -0,0 +1,6 @@
1
+ export declare class JsonManager {
2
+ middleware(options?: any): import("connect").NextHandleFunction;
3
+ urlencoded(options?: any): import("connect").NextHandleFunction;
4
+ queryParser(options?: any): (req: any, res: any, next: any) => void;
5
+ }
6
+ //# sourceMappingURL=JsonManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonManager.d.ts","sourceRoot":"","sources":["../../src/managers/JsonManager.ts"],"names":[],"mappings":"AA0FA,qBAAa,WAAW;IAEpB,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG;IAexB,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG;IAgBxB,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,IACb,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;CAwB5C"}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ // // import express from "express";
3
+ // // import { logger } from "../logging";
4
+ // // import { AdapterError } from "../core/errors/AdapterError";
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.JsonManager = void 0;
10
+ // // export class JsonManager {
11
+ // // /**
12
+ // // * JSON parser middleware — global + dynamic override
13
+ // // */
14
+ // // middleware(options?: any) {
15
+ // // try {
16
+ // // const opts = options || {};
17
+ // // return express.json(opts);
18
+ // // } catch (err: any) {
19
+ // // logger.error("❌ JSON Manager: failed to create JSON parser", {
20
+ // // error: err?.message || err
21
+ // // });
22
+ // // throw new AdapterError("JSON parser initialization failed.");
23
+ // // }
24
+ // // }
25
+ // // /**
26
+ // // * URL-encoded parser — same global + dynamic style
27
+ // // */
28
+ // // urlencoded(options?: any) {
29
+ // // try {
30
+ // // const opts = options || { extended: true };
31
+ // // return express.urlencoded(opts);
32
+ // // } catch (err: any) {
33
+ // // logger.error("❌ JSON Manager: failed to create urlencoded parser", {
34
+ // // error: err?.message || err
35
+ // // });
36
+ // // throw new AdapterError("URL-encoded parser initialization failed.");
37
+ // // }
38
+ // // }
39
+ // // }
40
+ // import express from "express";
41
+ // import qs from "qs";
42
+ // import { logger } from "../logging";
43
+ // import { AdapterError } from "../core/errors/AdapterError.js";
44
+ // export class JsonManager {
45
+ // // JSON parser
46
+ // middleware(options?: any) {
47
+ // try {
48
+ // return express.json(options || {});
49
+ // } catch (err: any) {
50
+ // logger.error("❌ JSON Manager: failed to create JSON parser");
51
+ // throw new AdapterError("JSON parser initialization failed.");
52
+ // }
53
+ // }
54
+ // // URL-encoded parser
55
+ // urlencoded(options?: any) {
56
+ // try {
57
+ // const opts = options || { extended: true };
58
+ // return express.urlencoded(opts);
59
+ // } catch (err: any) {
60
+ // logger.error("❌ URL-encoded parser failed");
61
+ // throw new AdapterError("URL-encoded parser initialization failed.");
62
+ // }
63
+ // }
64
+ // // NEW: Query-string parser
65
+ // queryParser() {
66
+ // return (req: any, res: any, next: any) => {
67
+ // try {
68
+ // req.query = qs.parse(req.url.split("?")[1] || "");
69
+ // } catch (err: any) {
70
+ // logger.error("❌ Failed to parse query", { error: err?.message });
71
+ // throw new AdapterError("Query parsing failed.");
72
+ // }
73
+ // next();
74
+ // };
75
+ // }
76
+ // }
77
+ // src/managers/JsonManager.ts - FIXED
78
+ const express_1 = __importDefault(require("express"));
79
+ const qs_1 = __importDefault(require("qs"));
80
+ const logging_1 = require("../logging");
81
+ const AdapterError_js_1 = require("../core/errors/AdapterError.js");
82
+ class JsonManager {
83
+ // JSON parser
84
+ middleware(options) {
85
+ try {
86
+ const defaultOptions = {
87
+ limit: '1mb',
88
+ inflate: true,
89
+ strict: true
90
+ };
91
+ return express_1.default.json({ ...defaultOptions, ...(options || {}) });
92
+ }
93
+ catch (err) {
94
+ logging_1.logger.error("❌ JSON Manager: failed to create JSON parser");
95
+ throw new AdapterError_js_1.AdapterError("JSON parser initialization failed.");
96
+ }
97
+ }
98
+ // URL-encoded parser
99
+ urlencoded(options) {
100
+ try {
101
+ const defaultOptions = {
102
+ extended: true,
103
+ limit: '1mb',
104
+ parameterLimit: 1000
105
+ };
106
+ const opts = { ...defaultOptions, ...(options || {}) };
107
+ return express_1.default.urlencoded(opts);
108
+ }
109
+ catch (err) {
110
+ logging_1.logger.error("❌ URL-encoded parser failed");
111
+ throw new AdapterError_js_1.AdapterError("URL-encoded parser initialization failed.");
112
+ }
113
+ }
114
+ // Query-string parser (doesn't override Express's query)
115
+ queryParser(options) {
116
+ return (req, res, next) => {
117
+ try {
118
+ // Only parse if not already parsed by Express
119
+ if (!req.parsedQuery && req.url.includes('?')) {
120
+ const queryString = req.url.split("?")[1] || "";
121
+ const parsed = qs_1.default.parse(queryString, {
122
+ depth: 5, // Prevent deep nesting attacks
123
+ parameterLimit: 100,
124
+ ...options
125
+ });
126
+ // Store separately, don't override req.query
127
+ req.parsedQuery = parsed;
128
+ logging_1.logger.debug("🔍 Query parsed", {
129
+ keys: Object.keys(parsed)
130
+ });
131
+ }
132
+ next();
133
+ }
134
+ catch (err) {
135
+ logging_1.logger.error("❌ Failed to parse query", { error: err?.message });
136
+ next(new AdapterError_js_1.AdapterError("Query parsing failed."));
137
+ }
138
+ };
139
+ }
140
+ }
141
+ exports.JsonManager = JsonManager;
142
+ //# sourceMappingURL=JsonManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonManager.js","sourceRoot":"","sources":["../../src/managers/JsonManager.ts"],"names":[],"mappings":"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","sourcesContent":["// // import express from \"express\";\r\n// // import { logger } from \"../logging\";\r\n// // import { AdapterError } from \"../core/errors/AdapterError\";\r\n\r\n// // export class JsonManager {\r\n\r\n// // /**\r\n// // * JSON parser middleware — global + dynamic override\r\n// // */\r\n// // middleware(options?: any) {\r\n// // try {\r\n// // const opts = options || {};\r\n// // return express.json(opts);\r\n// // } catch (err: any) {\r\n// // logger.error(\"❌ JSON Manager: failed to create JSON parser\", {\r\n// // error: err?.message || err\r\n// // });\r\n// // throw new AdapterError(\"JSON parser initialization failed.\");\r\n// // }\r\n// // }\r\n\r\n// // /**\r\n// // * URL-encoded parser — same global + dynamic style\r\n// // */\r\n// // urlencoded(options?: any) {\r\n// // try {\r\n// // const opts = options || { extended: true };\r\n// // return express.urlencoded(opts);\r\n// // } catch (err: any) {\r\n// // logger.error(\"❌ JSON Manager: failed to create urlencoded parser\", {\r\n// // error: err?.message || err\r\n// // });\r\n// // throw new AdapterError(\"URL-encoded parser initialization failed.\");\r\n// // }\r\n// // }\r\n// // }\r\n\r\n\r\n\r\n// import express from \"express\";\r\n// import qs from \"qs\";\r\n// import { logger } from \"../logging\";\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\n// export class JsonManager {\r\n\r\n// // JSON parser \r\n// middleware(options?: any) {\r\n// try {\r\n// return express.json(options || {});\r\n// } catch (err: any) {\r\n// logger.error(\"❌ JSON Manager: failed to create JSON parser\");\r\n// throw new AdapterError(\"JSON parser initialization failed.\");\r\n// }\r\n// }\r\n\r\n// // URL-encoded parser \r\n// urlencoded(options?: any) {\r\n// try {\r\n// const opts = options || { extended: true };\r\n// return express.urlencoded(opts);\r\n// } catch (err: any) {\r\n// logger.error(\"❌ URL-encoded parser failed\");\r\n// throw new AdapterError(\"URL-encoded parser initialization failed.\");\r\n// }\r\n// }\r\n\r\n// // NEW: Query-string parser \r\n// queryParser() {\r\n// return (req: any, res: any, next: any) => {\r\n// try {\r\n// req.query = qs.parse(req.url.split(\"?\")[1] || \"\");\r\n// } catch (err: any) {\r\n// logger.error(\"❌ Failed to parse query\", { error: err?.message });\r\n// throw new AdapterError(\"Query parsing failed.\");\r\n// }\r\n// next();\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\n// src/managers/JsonManager.ts - FIXED\r\nimport express from \"express\";\r\nimport qs from \"qs\";\r\nimport { logger } from \"../logging\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\nexport class JsonManager {\r\n // JSON parser\r\n middleware(options?: any) {\r\n try {\r\n const defaultOptions = {\r\n limit: '1mb',\r\n inflate: true,\r\n strict: true\r\n };\r\n return express.json({ ...defaultOptions, ...(options || {}) });\r\n } catch (err: any) {\r\n logger.error(\"❌ JSON Manager: failed to create JSON parser\");\r\n throw new AdapterError(\"JSON parser initialization failed.\");\r\n }\r\n }\r\n\r\n // URL-encoded parser\r\n urlencoded(options?: any) {\r\n try {\r\n const defaultOptions = {\r\n extended: true,\r\n limit: '1mb',\r\n parameterLimit: 1000\r\n };\r\n const opts = { ...defaultOptions, ...(options || {}) };\r\n return express.urlencoded(opts);\r\n } catch (err: any) {\r\n logger.error(\"❌ URL-encoded parser failed\");\r\n throw new AdapterError(\"URL-encoded parser initialization failed.\");\r\n }\r\n }\r\n\r\n // Query-string parser (doesn't override Express's query)\r\n queryParser(options?: any) {\r\n return (req: any, res: any, next: any) => {\r\n try {\r\n // Only parse if not already parsed by Express\r\n if (!req.parsedQuery && req.url.includes('?')) {\r\n const queryString = req.url.split(\"?\")[1] || \"\";\r\n const parsed = qs.parse(queryString, {\r\n depth: 5, // Prevent deep nesting attacks\r\n parameterLimit: 100,\r\n ...options\r\n });\r\n \r\n // Store separately, don't override req.query\r\n req.parsedQuery = parsed;\r\n logger.debug(\"🔍 Query parsed\", {\r\n keys: Object.keys(parsed)\r\n });\r\n }\r\n next();\r\n } catch (err: any) {\r\n logger.error(\"❌ Failed to parse query\", { error: err?.message });\r\n next(new AdapterError(\"Query parsing failed.\"));\r\n }\r\n };\r\n }\r\n}"]}
@@ -0,0 +1,16 @@
1
+ import { HiSecureConfig } from "../core/types/HiSecureConfig.js";
2
+ interface RateLimiterAdapter {
3
+ getMiddleware: (options?: any) => any;
4
+ }
5
+ export declare class RateLimitManager {
6
+ private config;
7
+ private primaryAdapter;
8
+ private fallbackAdapter;
9
+ constructor(config: HiSecureConfig["rateLimiter"], primaryAdapter: RateLimiterAdapter, fallbackAdapter: RateLimiterAdapter | null);
10
+ middleware(opts?: {
11
+ mode?: "strict" | "relaxed" | "api";
12
+ options?: any;
13
+ }): any;
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=RateLimitManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitManager.d.ts","sourceRoot":"","sources":["../../src/managers/RateLimitManager.ts"],"names":[],"mappings":"AAyPA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAIjE,UAAU,kBAAkB;IACxB,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;CACzC;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,eAAe,CAA4B;gBAG/C,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,EACrC,cAAc,EAAE,kBAAkB,EAClC,eAAe,EAAE,kBAAkB,GAAG,IAAI;IAO9C,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE;CA+F3E"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ // // // src/managers/RateLimitManager.ts - COMPLETE FIXED
3
+ // // import { HiSecureConfig } from "../core/types/HiSecureConfig.js";
4
+ // // import { AdapterError } from "../core/errors/AdapterError.js";
5
+ // // import { logger } from "../logging";
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RateLimitManager = void 0;
8
+ const AdapterError_js_1 = require("../core/errors/AdapterError.js");
9
+ const logging_1 = require("../logging");
10
+ class RateLimitManager {
11
+ constructor(config, primaryAdapter, fallbackAdapter) {
12
+ this.config = config;
13
+ this.primaryAdapter = primaryAdapter;
14
+ this.fallbackAdapter = fallbackAdapter;
15
+ }
16
+ middleware(opts) {
17
+ let finalOptions = {};
18
+ // Handle presets (user cannot override these)
19
+ if (opts?.mode === "strict") {
20
+ finalOptions = {
21
+ windowMs: 10000,
22
+ max: 5,
23
+ // ❌ REMOVED: points: 5,
24
+ message: "Too many requests, please slow down."
25
+ };
26
+ }
27
+ else if (opts?.mode === "relaxed") {
28
+ finalOptions = {
29
+ windowMs: 60000,
30
+ max: 100,
31
+ // ❌ REMOVED: points: 100,
32
+ message: "Rate limit exceeded."
33
+ };
34
+ }
35
+ else if (opts?.mode === "api") {
36
+ finalOptions = {
37
+ windowMs: 15 * 60 * 1000, // 15 minutes
38
+ max: 100,
39
+ // ❌ REMOVED: points: 100,
40
+ message: "API rate limit exceeded."
41
+ };
42
+ }
43
+ else {
44
+ // Use defaults
45
+ finalOptions = {
46
+ windowMs: this.config.windowMs,
47
+ max: this.config.maxRequests,
48
+ message: this.config.message,
49
+ standardHeaders: true, // ✅ ADD
50
+ legacyHeaders: false // ✅ ADD
51
+ };
52
+ }
53
+ // Apply custom options WITHOUT overriding preset values
54
+ if (opts?.options) {
55
+ // Only allow specific overrides, not preset overrides
56
+ const allowedOverrides = ['message', 'skipFailedRequests', 'standardHeaders', 'legacyHeaders'];
57
+ for (const key of allowedOverrides) {
58
+ if (opts.options[key] !== undefined) {
59
+ finalOptions[key] = opts.options[key];
60
+ }
61
+ }
62
+ // Log if user tried to override preset
63
+ const attemptedOverrides = Object.keys(opts.options).filter(k => !allowedOverrides.includes(k) && k !== 'mode');
64
+ if (attemptedOverrides.length > 0) {
65
+ logging_1.logger.warn("⚠ Rate limit overrides ignored", {
66
+ preset: opts?.mode || 'default',
67
+ ignoredOptions: attemptedOverrides
68
+ });
69
+ }
70
+ }
71
+ // Add v8+ options if not present
72
+ if (finalOptions.standardHeaders === undefined) {
73
+ finalOptions.standardHeaders = true;
74
+ }
75
+ if (finalOptions.legacyHeaders === undefined) {
76
+ finalOptions.legacyHeaders = false;
77
+ }
78
+ // Try primary adapter
79
+ try {
80
+ logging_1.logger.info("📌 Applying rate limiting", {
81
+ mode: opts?.mode || 'default',
82
+ windowMs: finalOptions.windowMs,
83
+ max: finalOptions.max
84
+ });
85
+ return this.primaryAdapter.getMiddleware(finalOptions);
86
+ }
87
+ catch (err) {
88
+ logging_1.logger.warn("⚠ Primary rate limiter failed → fallback", {
89
+ error: err?.message
90
+ });
91
+ if (!this.fallbackAdapter) {
92
+ throw new AdapterError_js_1.AdapterError("Rate limiters failed; no fallback adapter.");
93
+ }
94
+ try {
95
+ logging_1.logger.info("📌 Using fallback rate limiter");
96
+ return this.fallbackAdapter.getMiddleware(finalOptions);
97
+ }
98
+ catch (fallbackErr) {
99
+ logging_1.logger.error("❌ Fallback limiter also failed", {
100
+ error: fallbackErr?.message
101
+ });
102
+ throw new AdapterError_js_1.AdapterError("Both primary and fallback limiters failed.");
103
+ }
104
+ }
105
+ }
106
+ }
107
+ exports.RateLimitManager = RateLimitManager;
108
+ //# sourceMappingURL=RateLimitManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitManager.js","sourceRoot":"","sources":["../../src/managers/RateLimitManager.ts"],"names":[],"mappings":";AAEA,0DAA0D;AAC1D,uEAAuE;AACvE,oEAAoE;AACpE,0CAA0C;;;AAqP1C,oEAA8D;AAC9D,wCAAoC;AAMpC,MAAa,gBAAgB;IAKzB,YACI,MAAqC,EACrC,cAAkC,EAClC,eAA0C;QAE1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IAC3C,CAAC;IAED,UAAU,CAAC,IAA6D;QACpE,IAAI,YAAY,GAAQ,EAAE,CAAC;QAE3B,8CAA8C;QAC9C,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,YAAY,GAAG;gBACX,QAAQ,EAAE,KAAM;gBAChB,GAAG,EAAE,CAAC;gBACN,wBAAwB;gBACxB,OAAO,EAAE,sCAAsC;aAClD,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,YAAY,GAAG;gBACX,QAAQ,EAAE,KAAM;gBAChB,GAAG,EAAE,GAAG;gBACR,0BAA0B;gBAC1B,OAAO,EAAE,sBAAsB;aAClC,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;YAC9B,YAAY,GAAG;gBACX,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa;gBACvC,GAAG,EAAE,GAAG;gBACR,0BAA0B;gBAC1B,OAAO,EAAE,0BAA0B;aACtC,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,eAAe;YACf,YAAY,GAAG;gBACX,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBAC5B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,eAAe,EAAE,IAAI,EAAO,QAAQ;gBACpC,aAAa,EAAE,KAAK,CAAQ,QAAQ;aACvC,CAAC;QACN,CAAC;QAED,wDAAwD;QACxD,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAChB,sDAAsD;YACtD,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;YAC/F,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;gBACjC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;oBAClC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1C,CAAC;YACL,CAAC;YAED,uCAAuC;YACvC,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CACvD,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CACrD,CAAC;YACF,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,gBAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBAC1C,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS;oBAC/B,cAAc,EAAE,kBAAkB;iBACrC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,iCAAiC;QACjC,IAAI,YAAY,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC7C,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC;QACxC,CAAC;QACD,IAAI,YAAY,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC3C,YAAY,CAAC,aAAa,GAAG,KAAK,CAAC;QACvC,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC;YACD,gBAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACrC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS;gBAC7B,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,GAAG,EAAE,YAAY,CAAC,GAAG;aACxB,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;gBACpD,KAAK,EAAE,GAAG,EAAE,OAAO;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACxB,MAAM,IAAI,8BAAY,CAAC,4CAA4C,CAAC,CAAC;YACzE,CAAC;YAED,IAAI,CAAC;gBACD,gBAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,WAAgB,EAAE,CAAC;gBACxB,gBAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;oBAC3C,KAAK,EAAE,WAAW,EAAE,OAAO;iBAC9B,CAAC,CAAC;gBACH,MAAM,IAAI,8BAAY,CAAC,4CAA4C,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;IACL,CAAC;CACJ;AA9GD,4CA8GC","sourcesContent":["\r\n\r\n// // // src/managers/RateLimitManager.ts - COMPLETE FIXED\r\n// // import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\n// // import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// // import { logger } from \"../logging\";\r\n\r\n// // interface RateLimiterAdapter {\r\n// // getMiddleware: (options?: any) => any;\r\n// // }\r\n\r\n// // export class RateLimitManager {\r\n// // private config: HiSecureConfig[\"rateLimiter\"];\r\n// // private primaryAdapter: RateLimiterAdapter;\r\n// // private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n// // constructor(\r\n// // config: HiSecureConfig[\"rateLimiter\"],\r\n// // primaryAdapter: RateLimiterAdapter,\r\n// // fallbackAdapter: RateLimiterAdapter | null\r\n// // ) {\r\n// // this.config = config;\r\n// // this.primaryAdapter = primaryAdapter;\r\n// // this.fallbackAdapter = fallbackAdapter;\r\n// // }\r\n\r\n// // middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n// // let finalOptions: any = {};\r\n\r\n// // // Handle presets (user cannot override these)\r\n// // if (opts?.mode === \"strict\") {\r\n// // finalOptions = {\r\n// // windowMs: 10_000,\r\n// // max: 5,\r\n// // points: 5,\r\n// // duration: 10,\r\n// // message: \"Too many requests, please slow down.\"\r\n// // };\r\n// // } else if (opts?.mode === \"relaxed\") {\r\n// // finalOptions = {\r\n// // windowMs: 60_000,\r\n// // max: 100,\r\n// // points: 100,\r\n// // duration: 60,\r\n// // message: \"Rate limit exceeded.\"\r\n// // };\r\n// // } else if (opts?.mode === \"api\") {\r\n// // finalOptions = {\r\n// // windowMs: 15 * 60 * 1000, // 15 minutes\r\n// // max: 100,\r\n// // points: 100,\r\n// // duration: 900,\r\n// // message: \"API rate limit exceeded.\"\r\n// // };\r\n// // } else {\r\n// // // Use defaults\r\n// // finalOptions = {\r\n// // windowMs: this.config.windowMs,\r\n// // max: this.config.maxRequests,\r\n// // duration: this.config.windowMs / 1000,\r\n// // points: this.config.maxRequests,\r\n// // message: this.config.message\r\n// // };\r\n// // }\r\n\r\n// // // Apply custom options WITHOUT overriding preset values\r\n// // if (opts?.options) {\r\n// // // Only allow specific overrides, not preset overrides\r\n// // const allowedOverrides = ['message', 'skipFailedRequests', 'standardHeaders'];\r\n// // for (const key of allowedOverrides) {\r\n// // if (opts.options[key] !== undefined) {\r\n// // finalOptions[key] = opts.options[key];\r\n// // }\r\n// // }\r\n \r\n// // // Log if user tried to override preset\r\n// // const attemptedOverrides = Object.keys(opts.options).filter(\r\n// // k => !allowedOverrides.includes(k) && k !== 'mode'\r\n// // );\r\n// // if (attemptedOverrides.length > 0) {\r\n// // logger.warn(\"⚠ Rate limit overrides ignored\", { // ✅ FIXED: Better message\r\n// // preset: opts?.mode || 'default', // ✅ FIXED: Handle undefined\r\n// // ignoredOptions: attemptedOverrides\r\n// // });\r\n// // }\r\n// // }\r\n\r\n// // // Try primary adapter\r\n// // try {\r\n// // logger.info(\"📌 Applying rate limiting\", {\r\n// // mode: opts?.mode || 'default',\r\n// // windowMs: finalOptions.windowMs,\r\n// // max: finalOptions.max\r\n// // });\r\n \r\n// // return this.primaryAdapter.getMiddleware(finalOptions);\r\n// // } catch (err: any) {\r\n// // logger.warn(\"⚠ Primary rate limiter failed → fallback\", {\r\n// // error: err?.message\r\n// // });\r\n\r\n// // if (!this.fallbackAdapter) {\r\n// // throw new AdapterError(\"Rate limiters failed; no fallback adapter.\");\r\n// // }\r\n\r\n// // try {\r\n// // logger.info(\"📌 Using fallback rate limiter\");\r\n// // return this.fallbackAdapter.getMiddleware(finalOptions);\r\n// // } catch (fallbackErr: any) {\r\n// // logger.error(\"❌ Fallback limiter also failed\", {\r\n// // error: fallbackErr?.message\r\n// // });\r\n// // throw new AdapterError(\"Both primary and fallback limiters failed.\");\r\n// // }\r\n// // }\r\n// // }\r\n// // }\r\n\r\n\r\n\r\n// // src/managers/RateLimitManager.ts - FIXED\r\n// import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// import { logger } from \"../logging\";\r\n\r\n// interface RateLimiterAdapter {\r\n// getMiddleware: (options?: any) => any;\r\n// }\r\n\r\n// export class RateLimitManager {\r\n// private config: HiSecureConfig[\"rateLimiter\"];\r\n// private primaryAdapter: RateLimiterAdapter;\r\n// private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"rateLimiter\"],\r\n// primaryAdapter: RateLimiterAdapter,\r\n// fallbackAdapter: RateLimiterAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n// let finalOptions: any = {};\r\n\r\n// // Handle presets (user cannot override these)\r\n// if (opts?.mode === \"strict\") {\r\n// finalOptions = {\r\n// windowMs: 10_000,\r\n// max: 5,\r\n// points: 5,\r\n// // ❌ REMOVED: duration: 10,\r\n// message: \"Too many requests, please slow down.\"\r\n// };\r\n// } else if (opts?.mode === \"relaxed\") {\r\n// finalOptions = {\r\n// windowMs: 60_000,\r\n// max: 100,\r\n// points: 100,\r\n// // ❌ REMOVED: duration: 60,\r\n// message: \"Rate limit exceeded.\"\r\n// };\r\n// } else if (opts?.mode === \"api\") {\r\n// finalOptions = {\r\n// windowMs: 15 * 60 * 1000, // 15 minutes\r\n// max: 100,\r\n// points: 100,\r\n// // ❌ REMOVED: duration: 900,\r\n// message: \"API rate limit exceeded.\"\r\n// };\r\n// } else {\r\n// // Use defaults\r\n// finalOptions = {\r\n// windowMs: this.config.windowMs,\r\n// max: this.config.maxRequests,\r\n// // ❌ REMOVED: duration: this.config.windowMs / 1000,\r\n// points: this.config.maxRequests,\r\n// message: this.config.message,\r\n// standardHeaders: true, // ✅ ADD\r\n// legacyHeaders: false // ✅ ADD\r\n// };\r\n// }\r\n\r\n// // Apply custom options WITHOUT overriding preset values\r\n// if (opts?.options) {\r\n// // Only allow specific overrides, not preset overrides\r\n// const allowedOverrides = ['message', 'skipFailedRequests', 'standardHeaders', 'legacyHeaders'];\r\n// for (const key of allowedOverrides) {\r\n// if (opts.options[key] !== undefined) {\r\n// finalOptions[key] = opts.options[key];\r\n// }\r\n// }\r\n \r\n// // Log if user tried to override preset\r\n// const attemptedOverrides = Object.keys(opts.options).filter(\r\n// k => !allowedOverrides.includes(k) && k !== 'mode'\r\n// );\r\n// if (attemptedOverrides.length > 0) {\r\n// logger.warn(\"⚠ Rate limit overrides ignored\", {\r\n// preset: opts?.mode || 'default',\r\n// ignoredOptions: attemptedOverrides\r\n// });\r\n// }\r\n// }\r\n\r\n// // Add v8+ options if not present\r\n// if (finalOptions.standardHeaders === undefined) {\r\n// finalOptions.standardHeaders = true;\r\n// }\r\n// if (finalOptions.legacyHeaders === undefined) {\r\n// finalOptions.legacyHeaders = false;\r\n// }\r\n\r\n// // Try primary adapter\r\n// try {\r\n// logger.info(\"📌 Applying rate limiting\", {\r\n// mode: opts?.mode || 'default',\r\n// windowMs: finalOptions.windowMs,\r\n// max: finalOptions.max\r\n// });\r\n \r\n// return this.primaryAdapter.getMiddleware(finalOptions);\r\n// } catch (err: any) {\r\n// logger.warn(\"⚠ Primary rate limiter failed → fallback\", {\r\n// error: err?.message\r\n// });\r\n\r\n// if (!this.fallbackAdapter) {\r\n// throw new AdapterError(\"Rate limiters failed; no fallback adapter.\");\r\n// }\r\n\r\n// try {\r\n// logger.info(\"📌 Using fallback rate limiter\");\r\n// return this.fallbackAdapter.getMiddleware(finalOptions);\r\n// } catch (fallbackErr: any) {\r\n// logger.error(\"❌ Fallback limiter also failed\", {\r\n// error: fallbackErr?.message\r\n// });\r\n// throw new AdapterError(\"Both primary and fallback limiters failed.\");\r\n// }\r\n// }\r\n// }\r\n// }\r\n\r\n\r\n\r\n// src/managers/RateLimitManager.ts - COMPLETELY FIXED\r\nimport { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface RateLimiterAdapter {\r\n getMiddleware: (options?: any) => any;\r\n}\r\n\r\nexport class RateLimitManager {\r\n private config: HiSecureConfig[\"rateLimiter\"];\r\n private primaryAdapter: RateLimiterAdapter;\r\n private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"rateLimiter\"],\r\n primaryAdapter: RateLimiterAdapter,\r\n fallbackAdapter: RateLimiterAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n }\r\n\r\n middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n let finalOptions: any = {};\r\n\r\n // Handle presets (user cannot override these)\r\n if (opts?.mode === \"strict\") {\r\n finalOptions = {\r\n windowMs: 10_000,\r\n max: 5,\r\n // ❌ REMOVED: points: 5,\r\n message: \"Too many requests, please slow down.\"\r\n };\r\n } else if (opts?.mode === \"relaxed\") {\r\n finalOptions = {\r\n windowMs: 60_000,\r\n max: 100,\r\n // ❌ REMOVED: points: 100,\r\n message: \"Rate limit exceeded.\"\r\n };\r\n } else if (opts?.mode === \"api\") {\r\n finalOptions = {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 100,\r\n // ❌ REMOVED: points: 100,\r\n message: \"API rate limit exceeded.\"\r\n };\r\n } else {\r\n // Use defaults\r\n finalOptions = {\r\n windowMs: this.config.windowMs,\r\n max: this.config.maxRequests,\r\n message: this.config.message,\r\n standardHeaders: true, // ✅ ADD\r\n legacyHeaders: false // ✅ ADD\r\n };\r\n }\r\n\r\n // Apply custom options WITHOUT overriding preset values\r\n if (opts?.options) {\r\n // Only allow specific overrides, not preset overrides\r\n const allowedOverrides = ['message', 'skipFailedRequests', 'standardHeaders', 'legacyHeaders'];\r\n for (const key of allowedOverrides) {\r\n if (opts.options[key] !== undefined) {\r\n finalOptions[key] = opts.options[key];\r\n }\r\n }\r\n \r\n // Log if user tried to override preset\r\n const attemptedOverrides = Object.keys(opts.options).filter(\r\n k => !allowedOverrides.includes(k) && k !== 'mode'\r\n );\r\n if (attemptedOverrides.length > 0) {\r\n logger.warn(\"⚠ Rate limit overrides ignored\", {\r\n preset: opts?.mode || 'default',\r\n ignoredOptions: attemptedOverrides\r\n });\r\n }\r\n }\r\n\r\n // Add v8+ options if not present\r\n if (finalOptions.standardHeaders === undefined) {\r\n finalOptions.standardHeaders = true;\r\n }\r\n if (finalOptions.legacyHeaders === undefined) {\r\n finalOptions.legacyHeaders = false;\r\n }\r\n\r\n // Try primary adapter\r\n try {\r\n logger.info(\"📌 Applying rate limiting\", {\r\n mode: opts?.mode || 'default',\r\n windowMs: finalOptions.windowMs,\r\n max: finalOptions.max\r\n });\r\n \r\n return this.primaryAdapter.getMiddleware(finalOptions);\r\n } catch (err: any) {\r\n logger.warn(\"⚠ Primary rate limiter failed → fallback\", {\r\n error: err?.message\r\n });\r\n\r\n if (!this.fallbackAdapter) {\r\n throw new AdapterError(\"Rate limiters failed; no fallback adapter.\");\r\n }\r\n\r\n try {\r\n logger.info(\"📌 Using fallback rate limiter\");\r\n return this.fallbackAdapter.getMiddleware(finalOptions);\r\n } catch (fallbackErr: any) {\r\n logger.error(\"❌ Fallback limiter also failed\", {\r\n error: fallbackErr?.message\r\n });\r\n throw new AdapterError(\"Both primary and fallback limiters failed.\");\r\n }\r\n }\r\n }\r\n}"]}
@@ -0,0 +1,18 @@
1
+ interface SanitizerAdapter {
2
+ sanitize: (value: string, options?: any) => string;
3
+ }
4
+ export declare class SanitizerManager {
5
+ private primary;
6
+ private fallback;
7
+ constructor(primary: SanitizerAdapter, fallback?: SanitizerAdapter | null);
8
+ /**
9
+ * Sanitize a single value (public API)
10
+ */
11
+ sanitize(value: string, options?: any): string;
12
+ /**
13
+ * Middleware - Per-request fallback logic
14
+ */
15
+ middleware(options?: any): (req: any, _res: any, next: any) => void;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=SanitizerManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SanitizerManager.d.ts","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"AA8PA,UAAU,gBAAgB;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC;CACtD;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,GAAE,gBAAgB,GAAG,IAAW;IAK/E;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM;IAoB9C;;OAEG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,IACZ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG;CAgE7C"}