@serve.zone/dcrouter 2.12.4

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 (737) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitea/workflows/docker_nottags.yaml +71 -0
  3. package/.gitea/workflows/docker_tags.yaml +106 -0
  4. package/.vscode/launch.json +11 -0
  5. package/.vscode/settings.json +26 -0
  6. package/Dockerfile +46 -0
  7. package/changelog.md +247 -0
  8. package/cli.child.js +4 -0
  9. package/cli.child.ts +4 -0
  10. package/cli.js +4 -0
  11. package/cli.ts.js +5 -0
  12. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  13. package/dist_ts/00_commitinfo_data.js +9 -0
  14. package/dist_ts/classes.dcrouter.d.ts +238 -0
  15. package/dist_ts/classes.dcrouter.js +1008 -0
  16. package/dist_ts/config/index.d.ts +1 -0
  17. package/dist_ts/config/index.js +3 -0
  18. package/dist_ts/config/validator.d.ts +104 -0
  19. package/dist_ts/config/validator.js +152 -0
  20. package/dist_ts/deliverability/classes.ipwarmupmanager.d.ts +253 -0
  21. package/dist_ts/deliverability/classes.ipwarmupmanager.js +639 -0
  22. package/dist_ts/deliverability/classes.senderreputationmonitor.d.ts +300 -0
  23. package/dist_ts/deliverability/classes.senderreputationmonitor.js +961 -0
  24. package/dist_ts/deliverability/index.d.ts +2 -0
  25. package/dist_ts/deliverability/index.js +3 -0
  26. package/dist_ts/errors/base.errors.d.ts +224 -0
  27. package/dist_ts/errors/base.errors.js +310 -0
  28. package/dist_ts/errors/email.errors.d.ts +175 -0
  29. package/dist_ts/errors/email.errors.js +265 -0
  30. package/dist_ts/errors/error-handler.d.ts +98 -0
  31. package/dist_ts/errors/error-handler.js +282 -0
  32. package/dist_ts/errors/error.codes.d.ts +115 -0
  33. package/dist_ts/errors/error.codes.js +136 -0
  34. package/dist_ts/errors/index.d.ts +56 -0
  35. package/dist_ts/errors/index.js +138 -0
  36. package/dist_ts/errors/mta.errors.d.ts +259 -0
  37. package/dist_ts/errors/mta.errors.js +472 -0
  38. package/dist_ts/errors/reputation.errors.d.ts +183 -0
  39. package/dist_ts/errors/reputation.errors.js +292 -0
  40. package/dist_ts/index.d.ts +4 -0
  41. package/dist_ts/index.js +6 -0
  42. package/dist_ts/logger.d.ts +17 -0
  43. package/dist_ts/logger.js +77 -0
  44. package/dist_ts/mail/core/classes.bouncemanager.d.ts +200 -0
  45. package/dist_ts/mail/core/classes.bouncemanager.js +778 -0
  46. package/dist_ts/mail/core/classes.email.d.ts +291 -0
  47. package/dist_ts/mail/core/classes.email.js +780 -0
  48. package/dist_ts/mail/core/classes.emailvalidator.d.ts +61 -0
  49. package/dist_ts/mail/core/classes.emailvalidator.js +182 -0
  50. package/dist_ts/mail/core/classes.templatemanager.d.ts +95 -0
  51. package/dist_ts/mail/core/classes.templatemanager.js +239 -0
  52. package/dist_ts/mail/core/index.d.ts +4 -0
  53. package/dist_ts/mail/core/index.js +6 -0
  54. package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +163 -0
  55. package/dist_ts/mail/delivery/classes.delivery.queue.js +485 -0
  56. package/dist_ts/mail/delivery/classes.delivery.system.d.ts +186 -0
  57. package/dist_ts/mail/delivery/classes.delivery.system.js +846 -0
  58. package/dist_ts/mail/delivery/classes.emailsendjob.d.ts +84 -0
  59. package/dist_ts/mail/delivery/classes.emailsendjob.js +362 -0
  60. package/dist_ts/mail/delivery/classes.emailsignjob.d.ts +18 -0
  61. package/dist_ts/mail/delivery/classes.emailsignjob.js +44 -0
  62. package/dist_ts/mail/delivery/classes.mta.config.d.ts +22 -0
  63. package/dist_ts/mail/delivery/classes.mta.config.js +51 -0
  64. package/dist_ts/mail/delivery/classes.ratelimiter.d.ts +98 -0
  65. package/dist_ts/mail/delivery/classes.ratelimiter.js +205 -0
  66. package/dist_ts/mail/delivery/classes.smtp.client.legacy.d.ts +275 -0
  67. package/dist_ts/mail/delivery/classes.smtp.client.legacy.js +973 -0
  68. package/dist_ts/mail/delivery/classes.unified.rate.limiter.d.ts +200 -0
  69. package/dist_ts/mail/delivery/classes.unified.rate.limiter.js +817 -0
  70. package/dist_ts/mail/delivery/index.d.ts +12 -0
  71. package/dist_ts/mail/delivery/index.js +18 -0
  72. package/dist_ts/mail/delivery/interfaces.d.ts +243 -0
  73. package/dist_ts/mail/delivery/interfaces.js +17 -0
  74. package/dist_ts/mail/delivery/smtpclient/auth-handler.d.ts +43 -0
  75. package/dist_ts/mail/delivery/smtpclient/auth-handler.js +188 -0
  76. package/dist_ts/mail/delivery/smtpclient/command-handler.d.ts +67 -0
  77. package/dist_ts/mail/delivery/smtpclient/command-handler.js +276 -0
  78. package/dist_ts/mail/delivery/smtpclient/connection-manager.d.ts +48 -0
  79. package/dist_ts/mail/delivery/smtpclient/connection-manager.js +238 -0
  80. package/dist_ts/mail/delivery/smtpclient/constants.d.ts +129 -0
  81. package/dist_ts/mail/delivery/smtpclient/constants.js +135 -0
  82. package/dist_ts/mail/delivery/smtpclient/create-client.d.ts +22 -0
  83. package/dist_ts/mail/delivery/smtpclient/create-client.js +86 -0
  84. package/dist_ts/mail/delivery/smtpclient/error-handler.d.ts +28 -0
  85. package/dist_ts/mail/delivery/smtpclient/error-handler.js +110 -0
  86. package/dist_ts/mail/delivery/smtpclient/index.d.ts +16 -0
  87. package/dist_ts/mail/delivery/smtpclient/index.js +21 -0
  88. package/dist_ts/mail/delivery/smtpclient/interfaces.d.ts +183 -0
  89. package/dist_ts/mail/delivery/smtpclient/interfaces.js +19 -0
  90. package/dist_ts/mail/delivery/smtpclient/smtp-client.d.ts +58 -0
  91. package/dist_ts/mail/delivery/smtpclient/smtp-client.js +279 -0
  92. package/dist_ts/mail/delivery/smtpclient/tls-handler.d.ts +33 -0
  93. package/dist_ts/mail/delivery/smtpclient/tls-handler.js +202 -0
  94. package/dist_ts/mail/delivery/smtpclient/utils/helpers.d.ts +77 -0
  95. package/dist_ts/mail/delivery/smtpclient/utils/helpers.js +196 -0
  96. package/dist_ts/mail/delivery/smtpclient/utils/logging.d.ts +46 -0
  97. package/dist_ts/mail/delivery/smtpclient/utils/logging.js +153 -0
  98. package/dist_ts/mail/delivery/smtpclient/utils/validation.d.ts +38 -0
  99. package/dist_ts/mail/delivery/smtpclient/utils/validation.js +139 -0
  100. package/dist_ts/mail/delivery/smtpserver/certificate-utils.d.ts +45 -0
  101. package/dist_ts/mail/delivery/smtpserver/certificate-utils.js +345 -0
  102. package/dist_ts/mail/delivery/smtpserver/command-handler.d.ts +156 -0
  103. package/dist_ts/mail/delivery/smtpserver/command-handler.js +1159 -0
  104. package/dist_ts/mail/delivery/smtpserver/connection-manager.d.ts +159 -0
  105. package/dist_ts/mail/delivery/smtpserver/connection-manager.js +894 -0
  106. package/dist_ts/mail/delivery/smtpserver/constants.d.ts +130 -0
  107. package/dist_ts/mail/delivery/smtpserver/constants.js +162 -0
  108. package/dist_ts/mail/delivery/smtpserver/create-server.d.ts +14 -0
  109. package/dist_ts/mail/delivery/smtpserver/create-server.js +28 -0
  110. package/dist_ts/mail/delivery/smtpserver/data-handler.d.ts +123 -0
  111. package/dist_ts/mail/delivery/smtpserver/data-handler.js +1148 -0
  112. package/dist_ts/mail/delivery/smtpserver/index.d.ts +20 -0
  113. package/dist_ts/mail/delivery/smtpserver/index.js +27 -0
  114. package/dist_ts/mail/delivery/smtpserver/interfaces.d.ts +530 -0
  115. package/dist_ts/mail/delivery/smtpserver/interfaces.js +10 -0
  116. package/dist_ts/mail/delivery/smtpserver/secure-server.d.ts +15 -0
  117. package/dist_ts/mail/delivery/smtpserver/secure-server.js +79 -0
  118. package/dist_ts/mail/delivery/smtpserver/security-handler.d.ts +86 -0
  119. package/dist_ts/mail/delivery/smtpserver/security-handler.js +234 -0
  120. package/dist_ts/mail/delivery/smtpserver/session-manager.d.ts +140 -0
  121. package/dist_ts/mail/delivery/smtpserver/session-manager.js +469 -0
  122. package/dist_ts/mail/delivery/smtpserver/smtp-server.d.ts +137 -0
  123. package/dist_ts/mail/delivery/smtpserver/smtp-server.js +666 -0
  124. package/dist_ts/mail/delivery/smtpserver/starttls-handler.d.ts +21 -0
  125. package/dist_ts/mail/delivery/smtpserver/starttls-handler.js +207 -0
  126. package/dist_ts/mail/delivery/smtpserver/tls-handler.d.ts +66 -0
  127. package/dist_ts/mail/delivery/smtpserver/tls-handler.js +261 -0
  128. package/dist_ts/mail/delivery/smtpserver/utils/adaptive-logging.d.ts +117 -0
  129. package/dist_ts/mail/delivery/smtpserver/utils/adaptive-logging.js +411 -0
  130. package/dist_ts/mail/delivery/smtpserver/utils/helpers.d.ts +78 -0
  131. package/dist_ts/mail/delivery/smtpserver/utils/helpers.js +208 -0
  132. package/dist_ts/mail/delivery/smtpserver/utils/logging.d.ts +106 -0
  133. package/dist_ts/mail/delivery/smtpserver/utils/logging.js +181 -0
  134. package/dist_ts/mail/delivery/smtpserver/utils/validation.d.ts +69 -0
  135. package/dist_ts/mail/delivery/smtpserver/utils/validation.js +360 -0
  136. package/dist_ts/mail/index.d.ts +8 -0
  137. package/dist_ts/mail/index.js +13 -0
  138. package/dist_ts/mail/routing/classes.dns.manager.d.ts +65 -0
  139. package/dist_ts/mail/routing/classes.dns.manager.js +413 -0
  140. package/dist_ts/mail/routing/classes.dnsmanager.d.ts +165 -0
  141. package/dist_ts/mail/routing/classes.dnsmanager.js +430 -0
  142. package/dist_ts/mail/routing/classes.domain.registry.d.ts +54 -0
  143. package/dist_ts/mail/routing/classes.domain.registry.js +118 -0
  144. package/dist_ts/mail/routing/classes.email.config.d.ts +64 -0
  145. package/dist_ts/mail/routing/classes.email.config.js +2 -0
  146. package/dist_ts/mail/routing/classes.email.router.d.ts +171 -0
  147. package/dist_ts/mail/routing/classes.email.router.js +491 -0
  148. package/dist_ts/mail/routing/classes.unified.email.server.d.ts +426 -0
  149. package/dist_ts/mail/routing/classes.unified.email.server.js +1454 -0
  150. package/dist_ts/mail/routing/index.d.ts +5 -0
  151. package/dist_ts/mail/routing/index.js +7 -0
  152. package/dist_ts/mail/routing/interfaces.d.ts +187 -0
  153. package/dist_ts/mail/routing/interfaces.js +2 -0
  154. package/dist_ts/mail/security/classes.dkimcreator.d.ts +68 -0
  155. package/dist_ts/mail/security/classes.dkimcreator.js +346 -0
  156. package/dist_ts/mail/security/classes.dkimverifier.d.ts +46 -0
  157. package/dist_ts/mail/security/classes.dkimverifier.js +317 -0
  158. package/dist_ts/mail/security/classes.dmarcverifier.d.ts +123 -0
  159. package/dist_ts/mail/security/classes.dmarcverifier.js +365 -0
  160. package/dist_ts/mail/security/classes.spfverifier.d.ts +103 -0
  161. package/dist_ts/mail/security/classes.spfverifier.js +492 -0
  162. package/dist_ts/mail/security/index.d.ts +4 -0
  163. package/dist_ts/mail/security/index.js +6 -0
  164. package/dist_ts/opsserver/classes.opsserver.d.ts +14 -0
  165. package/dist_ts/opsserver/classes.opsserver.js +37 -0
  166. package/dist_ts/opsserver/index.d.ts +1 -0
  167. package/dist_ts/opsserver/index.js +2 -0
  168. package/dist_ts/paths.d.ts +14 -0
  169. package/dist_ts/paths.js +39 -0
  170. package/dist_ts/plugins.d.ts +43 -0
  171. package/dist_ts/plugins.js +50 -0
  172. package/dist_ts/security/classes.contentscanner.d.ts +160 -0
  173. package/dist_ts/security/classes.contentscanner.js +634 -0
  174. package/dist_ts/security/classes.ipreputationchecker.d.ts +150 -0
  175. package/dist_ts/security/classes.ipreputationchecker.js +508 -0
  176. package/dist_ts/security/classes.securitylogger.d.ts +140 -0
  177. package/dist_ts/security/classes.securitylogger.js +232 -0
  178. package/dist_ts/security/index.d.ts +3 -0
  179. package/dist_ts/security/index.js +4 -0
  180. package/dist_ts/sms/classes.smsservice.d.ts +15 -0
  181. package/dist_ts/sms/classes.smsservice.js +72 -0
  182. package/dist_ts/sms/config/sms.config.d.ts +93 -0
  183. package/dist_ts/sms/config/sms.config.js +2 -0
  184. package/dist_ts/sms/config/sms.schema.d.ts +5 -0
  185. package/dist_ts/sms/config/sms.schema.js +121 -0
  186. package/dist_ts/sms/index.d.ts +1 -0
  187. package/dist_ts/sms/index.js +2 -0
  188. package/dist_ts/storage/classes.storagemanager.d.ts +82 -0
  189. package/dist_ts/storage/classes.storagemanager.js +341 -0
  190. package/dist_ts/storage/index.d.ts +1 -0
  191. package/dist_ts/storage/index.js +3 -0
  192. package/dist_ts/ts/00_commitinfo_data.d.ts +8 -0
  193. package/dist_ts/ts/00_commitinfo_data.js +9 -0
  194. package/dist_ts/ts/classes.dcrouter.d.ts +238 -0
  195. package/dist_ts/ts/classes.dcrouter.js +1008 -0
  196. package/dist_ts/ts/config/index.d.ts +1 -0
  197. package/dist_ts/ts/config/index.js +3 -0
  198. package/dist_ts/ts/config/validator.d.ts +104 -0
  199. package/dist_ts/ts/config/validator.js +152 -0
  200. package/dist_ts/ts/deliverability/classes.ipwarmupmanager.d.ts +253 -0
  201. package/dist_ts/ts/deliverability/classes.ipwarmupmanager.js +639 -0
  202. package/dist_ts/ts/deliverability/classes.senderreputationmonitor.d.ts +300 -0
  203. package/dist_ts/ts/deliverability/classes.senderreputationmonitor.js +961 -0
  204. package/dist_ts/ts/deliverability/index.d.ts +2 -0
  205. package/dist_ts/ts/deliverability/index.js +3 -0
  206. package/dist_ts/ts/errors/base.errors.d.ts +224 -0
  207. package/dist_ts/ts/errors/base.errors.js +310 -0
  208. package/dist_ts/ts/errors/email.errors.d.ts +175 -0
  209. package/dist_ts/ts/errors/email.errors.js +265 -0
  210. package/dist_ts/ts/errors/error-handler.d.ts +98 -0
  211. package/dist_ts/ts/errors/error-handler.js +282 -0
  212. package/dist_ts/ts/errors/error.codes.d.ts +115 -0
  213. package/dist_ts/ts/errors/error.codes.js +136 -0
  214. package/dist_ts/ts/errors/index.d.ts +56 -0
  215. package/dist_ts/ts/errors/index.js +138 -0
  216. package/dist_ts/ts/errors/mta.errors.d.ts +259 -0
  217. package/dist_ts/ts/errors/mta.errors.js +472 -0
  218. package/dist_ts/ts/errors/reputation.errors.d.ts +183 -0
  219. package/dist_ts/ts/errors/reputation.errors.js +292 -0
  220. package/dist_ts/ts/index.d.ts +4 -0
  221. package/dist_ts/ts/index.js +6 -0
  222. package/dist_ts/ts/logger.d.ts +17 -0
  223. package/dist_ts/ts/logger.js +77 -0
  224. package/dist_ts/ts/mail/core/classes.bouncemanager.d.ts +200 -0
  225. package/dist_ts/ts/mail/core/classes.bouncemanager.js +778 -0
  226. package/dist_ts/ts/mail/core/classes.email.d.ts +291 -0
  227. package/dist_ts/ts/mail/core/classes.email.js +780 -0
  228. package/dist_ts/ts/mail/core/classes.emailvalidator.d.ts +61 -0
  229. package/dist_ts/ts/mail/core/classes.emailvalidator.js +182 -0
  230. package/dist_ts/ts/mail/core/classes.templatemanager.d.ts +95 -0
  231. package/dist_ts/ts/mail/core/classes.templatemanager.js +239 -0
  232. package/dist_ts/ts/mail/core/index.d.ts +4 -0
  233. package/dist_ts/ts/mail/core/index.js +6 -0
  234. package/dist_ts/ts/mail/delivery/classes.delivery.queue.d.ts +163 -0
  235. package/dist_ts/ts/mail/delivery/classes.delivery.queue.js +485 -0
  236. package/dist_ts/ts/mail/delivery/classes.delivery.system.d.ts +186 -0
  237. package/dist_ts/ts/mail/delivery/classes.delivery.system.js +846 -0
  238. package/dist_ts/ts/mail/delivery/classes.emailsendjob.d.ts +84 -0
  239. package/dist_ts/ts/mail/delivery/classes.emailsendjob.js +362 -0
  240. package/dist_ts/ts/mail/delivery/classes.emailsignjob.d.ts +18 -0
  241. package/dist_ts/ts/mail/delivery/classes.emailsignjob.js +44 -0
  242. package/dist_ts/ts/mail/delivery/classes.mta.config.d.ts +22 -0
  243. package/dist_ts/ts/mail/delivery/classes.mta.config.js +51 -0
  244. package/dist_ts/ts/mail/delivery/classes.ratelimiter.d.ts +98 -0
  245. package/dist_ts/ts/mail/delivery/classes.ratelimiter.js +205 -0
  246. package/dist_ts/ts/mail/delivery/classes.smtp.client.legacy.d.ts +275 -0
  247. package/dist_ts/ts/mail/delivery/classes.smtp.client.legacy.js +973 -0
  248. package/dist_ts/ts/mail/delivery/classes.unified.rate.limiter.d.ts +200 -0
  249. package/dist_ts/ts/mail/delivery/classes.unified.rate.limiter.js +817 -0
  250. package/dist_ts/ts/mail/delivery/index.d.ts +12 -0
  251. package/dist_ts/ts/mail/delivery/index.js +18 -0
  252. package/dist_ts/ts/mail/delivery/interfaces.d.ts +243 -0
  253. package/dist_ts/ts/mail/delivery/interfaces.js +17 -0
  254. package/dist_ts/ts/mail/delivery/smtpclient/auth-handler.d.ts +43 -0
  255. package/dist_ts/ts/mail/delivery/smtpclient/auth-handler.js +188 -0
  256. package/dist_ts/ts/mail/delivery/smtpclient/command-handler.d.ts +67 -0
  257. package/dist_ts/ts/mail/delivery/smtpclient/command-handler.js +276 -0
  258. package/dist_ts/ts/mail/delivery/smtpclient/connection-manager.d.ts +48 -0
  259. package/dist_ts/ts/mail/delivery/smtpclient/connection-manager.js +238 -0
  260. package/dist_ts/ts/mail/delivery/smtpclient/constants.d.ts +129 -0
  261. package/dist_ts/ts/mail/delivery/smtpclient/constants.js +135 -0
  262. package/dist_ts/ts/mail/delivery/smtpclient/create-client.d.ts +22 -0
  263. package/dist_ts/ts/mail/delivery/smtpclient/create-client.js +86 -0
  264. package/dist_ts/ts/mail/delivery/smtpclient/error-handler.d.ts +28 -0
  265. package/dist_ts/ts/mail/delivery/smtpclient/error-handler.js +110 -0
  266. package/dist_ts/ts/mail/delivery/smtpclient/index.d.ts +16 -0
  267. package/dist_ts/ts/mail/delivery/smtpclient/index.js +21 -0
  268. package/dist_ts/ts/mail/delivery/smtpclient/interfaces.d.ts +183 -0
  269. package/dist_ts/ts/mail/delivery/smtpclient/interfaces.js +19 -0
  270. package/dist_ts/ts/mail/delivery/smtpclient/smtp-client.d.ts +58 -0
  271. package/dist_ts/ts/mail/delivery/smtpclient/smtp-client.js +279 -0
  272. package/dist_ts/ts/mail/delivery/smtpclient/tls-handler.d.ts +33 -0
  273. package/dist_ts/ts/mail/delivery/smtpclient/tls-handler.js +202 -0
  274. package/dist_ts/ts/mail/delivery/smtpclient/utils/helpers.d.ts +77 -0
  275. package/dist_ts/ts/mail/delivery/smtpclient/utils/helpers.js +196 -0
  276. package/dist_ts/ts/mail/delivery/smtpclient/utils/logging.d.ts +46 -0
  277. package/dist_ts/ts/mail/delivery/smtpclient/utils/logging.js +153 -0
  278. package/dist_ts/ts/mail/delivery/smtpclient/utils/validation.d.ts +38 -0
  279. package/dist_ts/ts/mail/delivery/smtpclient/utils/validation.js +139 -0
  280. package/dist_ts/ts/mail/delivery/smtpserver/certificate-utils.d.ts +45 -0
  281. package/dist_ts/ts/mail/delivery/smtpserver/certificate-utils.js +345 -0
  282. package/dist_ts/ts/mail/delivery/smtpserver/command-handler.d.ts +156 -0
  283. package/dist_ts/ts/mail/delivery/smtpserver/command-handler.js +1159 -0
  284. package/dist_ts/ts/mail/delivery/smtpserver/connection-manager.d.ts +159 -0
  285. package/dist_ts/ts/mail/delivery/smtpserver/connection-manager.js +894 -0
  286. package/dist_ts/ts/mail/delivery/smtpserver/constants.d.ts +130 -0
  287. package/dist_ts/ts/mail/delivery/smtpserver/constants.js +162 -0
  288. package/dist_ts/ts/mail/delivery/smtpserver/create-server.d.ts +14 -0
  289. package/dist_ts/ts/mail/delivery/smtpserver/create-server.js +28 -0
  290. package/dist_ts/ts/mail/delivery/smtpserver/data-handler.d.ts +123 -0
  291. package/dist_ts/ts/mail/delivery/smtpserver/data-handler.js +1148 -0
  292. package/dist_ts/ts/mail/delivery/smtpserver/index.d.ts +20 -0
  293. package/dist_ts/ts/mail/delivery/smtpserver/index.js +27 -0
  294. package/dist_ts/ts/mail/delivery/smtpserver/interfaces.d.ts +530 -0
  295. package/dist_ts/ts/mail/delivery/smtpserver/interfaces.js +10 -0
  296. package/dist_ts/ts/mail/delivery/smtpserver/secure-server.d.ts +15 -0
  297. package/dist_ts/ts/mail/delivery/smtpserver/secure-server.js +79 -0
  298. package/dist_ts/ts/mail/delivery/smtpserver/security-handler.d.ts +86 -0
  299. package/dist_ts/ts/mail/delivery/smtpserver/security-handler.js +234 -0
  300. package/dist_ts/ts/mail/delivery/smtpserver/session-manager.d.ts +140 -0
  301. package/dist_ts/ts/mail/delivery/smtpserver/session-manager.js +469 -0
  302. package/dist_ts/ts/mail/delivery/smtpserver/smtp-server.d.ts +137 -0
  303. package/dist_ts/ts/mail/delivery/smtpserver/smtp-server.js +666 -0
  304. package/dist_ts/ts/mail/delivery/smtpserver/starttls-handler.d.ts +21 -0
  305. package/dist_ts/ts/mail/delivery/smtpserver/starttls-handler.js +207 -0
  306. package/dist_ts/ts/mail/delivery/smtpserver/tls-handler.d.ts +66 -0
  307. package/dist_ts/ts/mail/delivery/smtpserver/tls-handler.js +261 -0
  308. package/dist_ts/ts/mail/delivery/smtpserver/utils/adaptive-logging.d.ts +117 -0
  309. package/dist_ts/ts/mail/delivery/smtpserver/utils/adaptive-logging.js +411 -0
  310. package/dist_ts/ts/mail/delivery/smtpserver/utils/helpers.d.ts +78 -0
  311. package/dist_ts/ts/mail/delivery/smtpserver/utils/helpers.js +208 -0
  312. package/dist_ts/ts/mail/delivery/smtpserver/utils/logging.d.ts +106 -0
  313. package/dist_ts/ts/mail/delivery/smtpserver/utils/logging.js +181 -0
  314. package/dist_ts/ts/mail/delivery/smtpserver/utils/validation.d.ts +69 -0
  315. package/dist_ts/ts/mail/delivery/smtpserver/utils/validation.js +360 -0
  316. package/dist_ts/ts/mail/index.d.ts +8 -0
  317. package/dist_ts/ts/mail/index.js +13 -0
  318. package/dist_ts/ts/mail/routing/classes.dns.manager.d.ts +65 -0
  319. package/dist_ts/ts/mail/routing/classes.dns.manager.js +413 -0
  320. package/dist_ts/ts/mail/routing/classes.dnsmanager.d.ts +165 -0
  321. package/dist_ts/ts/mail/routing/classes.dnsmanager.js +430 -0
  322. package/dist_ts/ts/mail/routing/classes.domain.registry.d.ts +54 -0
  323. package/dist_ts/ts/mail/routing/classes.domain.registry.js +118 -0
  324. package/dist_ts/ts/mail/routing/classes.email.config.d.ts +64 -0
  325. package/dist_ts/ts/mail/routing/classes.email.config.js +2 -0
  326. package/dist_ts/ts/mail/routing/classes.email.router.d.ts +171 -0
  327. package/dist_ts/ts/mail/routing/classes.email.router.js +491 -0
  328. package/dist_ts/ts/mail/routing/classes.unified.email.server.d.ts +426 -0
  329. package/dist_ts/ts/mail/routing/classes.unified.email.server.js +1454 -0
  330. package/dist_ts/ts/mail/routing/index.d.ts +5 -0
  331. package/dist_ts/ts/mail/routing/index.js +7 -0
  332. package/dist_ts/ts/mail/routing/interfaces.d.ts +187 -0
  333. package/dist_ts/ts/mail/routing/interfaces.js +2 -0
  334. package/dist_ts/ts/mail/security/classes.dkimcreator.d.ts +68 -0
  335. package/dist_ts/ts/mail/security/classes.dkimcreator.js +346 -0
  336. package/dist_ts/ts/mail/security/classes.dkimverifier.d.ts +46 -0
  337. package/dist_ts/ts/mail/security/classes.dkimverifier.js +317 -0
  338. package/dist_ts/ts/mail/security/classes.dmarcverifier.d.ts +123 -0
  339. package/dist_ts/ts/mail/security/classes.dmarcverifier.js +365 -0
  340. package/dist_ts/ts/mail/security/classes.spfverifier.d.ts +103 -0
  341. package/dist_ts/ts/mail/security/classes.spfverifier.js +492 -0
  342. package/dist_ts/ts/mail/security/index.d.ts +4 -0
  343. package/dist_ts/ts/mail/security/index.js +6 -0
  344. package/dist_ts/ts/opsserver/classes.opsserver.d.ts +20 -0
  345. package/dist_ts/ts/opsserver/classes.opsserver.js +44 -0
  346. package/dist_ts/ts/opsserver/handlers/admin.handler.d.ts +31 -0
  347. package/dist_ts/ts/opsserver/handlers/admin.handler.js +177 -0
  348. package/dist_ts/ts/opsserver/handlers/config.handler.d.ts +10 -0
  349. package/dist_ts/ts/opsserver/handlers/config.handler.js +100 -0
  350. package/dist_ts/ts/opsserver/handlers/index.d.ts +5 -0
  351. package/dist_ts/ts/opsserver/handlers/index.js +6 -0
  352. package/dist_ts/ts/opsserver/handlers/logs.handler.d.ts +10 -0
  353. package/dist_ts/ts/opsserver/handlers/logs.handler.js +121 -0
  354. package/dist_ts/ts/opsserver/handlers/security.handler.d.ts +11 -0
  355. package/dist_ts/ts/opsserver/handlers/security.handler.js +118 -0
  356. package/dist_ts/ts/opsserver/handlers/stats.handler.d.ts +13 -0
  357. package/dist_ts/ts/opsserver/handlers/stats.handler.js +233 -0
  358. package/dist_ts/ts/opsserver/helpers/guards.d.ts +25 -0
  359. package/dist_ts/ts/opsserver/helpers/guards.js +41 -0
  360. package/dist_ts/ts/opsserver/index.d.ts +1 -0
  361. package/dist_ts/ts/opsserver/index.js +2 -0
  362. package/dist_ts/ts/paths.d.ts +14 -0
  363. package/dist_ts/ts/paths.js +39 -0
  364. package/dist_ts/ts/plugins.d.ts +46 -0
  365. package/dist_ts/ts/plugins.js +53 -0
  366. package/dist_ts/ts/security/classes.contentscanner.d.ts +160 -0
  367. package/dist_ts/ts/security/classes.contentscanner.js +634 -0
  368. package/dist_ts/ts/security/classes.ipreputationchecker.d.ts +150 -0
  369. package/dist_ts/ts/security/classes.ipreputationchecker.js +508 -0
  370. package/dist_ts/ts/security/classes.securitylogger.d.ts +140 -0
  371. package/dist_ts/ts/security/classes.securitylogger.js +232 -0
  372. package/dist_ts/ts/security/index.d.ts +3 -0
  373. package/dist_ts/ts/security/index.js +4 -0
  374. package/dist_ts/ts/sms/classes.smsservice.d.ts +15 -0
  375. package/dist_ts/ts/sms/classes.smsservice.js +72 -0
  376. package/dist_ts/ts/sms/config/sms.config.d.ts +93 -0
  377. package/dist_ts/ts/sms/config/sms.config.js +2 -0
  378. package/dist_ts/ts/sms/config/sms.schema.d.ts +5 -0
  379. package/dist_ts/ts/sms/config/sms.schema.js +121 -0
  380. package/dist_ts/ts/sms/index.d.ts +1 -0
  381. package/dist_ts/ts/sms/index.js +2 -0
  382. package/dist_ts/ts/storage/classes.storagemanager.d.ts +82 -0
  383. package/dist_ts/ts/storage/classes.storagemanager.js +341 -0
  384. package/dist_ts/ts/storage/index.d.ts +1 -0
  385. package/dist_ts/ts/storage/index.js +3 -0
  386. package/dist_ts/ts_interfaces/data/auth.d.ts +8 -0
  387. package/dist_ts/ts_interfaces/data/auth.js +2 -0
  388. package/dist_ts/ts_interfaces/data/index.d.ts +2 -0
  389. package/dist_ts/ts_interfaces/data/index.js +3 -0
  390. package/dist_ts/ts_interfaces/data/stats.d.ts +93 -0
  391. package/dist_ts/ts_interfaces/data/stats.js +2 -0
  392. package/dist_ts/ts_interfaces/index.d.ts +5 -0
  393. package/dist_ts/ts_interfaces/index.js +8 -0
  394. package/dist_ts/ts_interfaces/plugins.d.ts +2 -0
  395. package/dist_ts/ts_interfaces/plugins.js +4 -0
  396. package/dist_ts/ts_interfaces/requests/admin.d.ts +31 -0
  397. package/dist_ts/ts_interfaces/requests/admin.js +3 -0
  398. package/dist_ts/ts_interfaces/requests/config.d.ts +25 -0
  399. package/dist_ts/ts_interfaces/requests/config.js +3 -0
  400. package/dist_ts/ts_interfaces/requests/index.d.ts +4 -0
  401. package/dist_ts/ts_interfaces/requests/index.js +5 -0
  402. package/dist_ts/ts_interfaces/requests/logs.d.ts +34 -0
  403. package/dist_ts/ts_interfaces/requests/logs.js +4 -0
  404. package/dist_ts/ts_interfaces/requests/stats.d.ts +131 -0
  405. package/dist_ts/ts_interfaces/requests/stats.js +4 -0
  406. package/html/index.html +121 -0
  407. package/npmextra.json +45 -0
  408. package/package.json +83 -0
  409. package/readme.hints.md +906 -0
  410. package/readme.md +1253 -0
  411. package/readme.opsserver.md +351 -0
  412. package/test/helpers/server.loader.ts +347 -0
  413. package/test/helpers/smtp.client.ts +209 -0
  414. package/test/helpers/utils.ts +311 -0
  415. package/test/readme.md +443 -0
  416. package/test/suite/smtpclient_commands/test.ccmd-01.ehlo-helo-sending.ts +168 -0
  417. package/test/suite/smtpclient_commands/test.ccmd-02.mail-from-parameters.ts +277 -0
  418. package/test/suite/smtpclient_commands/test.ccmd-03.rcpt-to-multiple.ts +283 -0
  419. package/test/suite/smtpclient_commands/test.ccmd-04.data-transmission.ts +274 -0
  420. package/test/suite/smtpclient_commands/test.ccmd-05.auth-mechanisms.ts +306 -0
  421. package/test/suite/smtpclient_commands/test.ccmd-06.command-pipelining.ts +233 -0
  422. package/test/suite/smtpclient_commands/test.ccmd-07.response-parsing.ts +243 -0
  423. package/test/suite/smtpclient_commands/test.ccmd-08.rset-command.ts +333 -0
  424. package/test/suite/smtpclient_commands/test.ccmd-09.noop-command.ts +339 -0
  425. package/test/suite/smtpclient_commands/test.ccmd-10.vrfy-expn.ts +457 -0
  426. package/test/suite/smtpclient_commands/test.ccmd-11.help-command.ts +409 -0
  427. package/test/suite/smtpclient_connection/test.ccm-01.basic-tcp-connection.ts +150 -0
  428. package/test/suite/smtpclient_connection/test.ccm-02.tls-connection.ts +140 -0
  429. package/test/suite/smtpclient_connection/test.ccm-03.starttls-upgrade.ts +208 -0
  430. package/test/suite/smtpclient_connection/test.ccm-04.connection-pooling.ts +250 -0
  431. package/test/suite/smtpclient_connection/test.ccm-05.connection-reuse.ts +288 -0
  432. package/test/suite/smtpclient_connection/test.ccm-06.connection-timeout.ts +267 -0
  433. package/test/suite/smtpclient_connection/test.ccm-07.automatic-reconnection.ts +324 -0
  434. package/test/suite/smtpclient_connection/test.ccm-08.dns-resolution.ts +139 -0
  435. package/test/suite/smtpclient_connection/test.ccm-09.ipv6-dual-stack.ts +167 -0
  436. package/test/suite/smtpclient_connection/test.ccm-10.proxy-support.ts +305 -0
  437. package/test/suite/smtpclient_connection/test.ccm-11.keepalive.ts +299 -0
  438. package/test/suite/smtpclient_edge-cases/test.cedge-01.unusual-server-responses.ts +529 -0
  439. package/test/suite/smtpclient_edge-cases/test.cedge-02.malformed-commands.ts +438 -0
  440. package/test/suite/smtpclient_edge-cases/test.cedge-03.protocol-violations.ts +446 -0
  441. package/test/suite/smtpclient_edge-cases/test.cedge-04.resource-constraints.ts +530 -0
  442. package/test/suite/smtpclient_edge-cases/test.cedge-05.encoding-issues.ts +145 -0
  443. package/test/suite/smtpclient_edge-cases/test.cedge-06.large-headers.ts +180 -0
  444. package/test/suite/smtpclient_edge-cases/test.cedge-07.concurrent-operations.ts +204 -0
  445. package/test/suite/smtpclient_email-composition/test.cep-01.basic-headers.ts +245 -0
  446. package/test/suite/smtpclient_email-composition/test.cep-02.mime-multipart.ts +321 -0
  447. package/test/suite/smtpclient_email-composition/test.cep-03.attachment-encoding.ts +334 -0
  448. package/test/suite/smtpclient_email-composition/test.cep-04.bcc-handling.ts +187 -0
  449. package/test/suite/smtpclient_email-composition/test.cep-05.reply-to-return-path.ts +277 -0
  450. package/test/suite/smtpclient_email-composition/test.cep-06.utf8-international.ts +235 -0
  451. package/test/suite/smtpclient_email-composition/test.cep-07.html-inline-images.ts +489 -0
  452. package/test/suite/smtpclient_email-composition/test.cep-08.custom-headers.ts +293 -0
  453. package/test/suite/smtpclient_email-composition/test.cep-09.priority-importance.ts +314 -0
  454. package/test/suite/smtpclient_email-composition/test.cep-10.receipts-dsn.ts +411 -0
  455. package/test/suite/smtpclient_error-handling/test.cerr-01.4xx-errors.ts +232 -0
  456. package/test/suite/smtpclient_error-handling/test.cerr-02.5xx-errors.ts +309 -0
  457. package/test/suite/smtpclient_error-handling/test.cerr-03.network-failures.ts +299 -0
  458. package/test/suite/smtpclient_error-handling/test.cerr-04.greylisting-handling.ts +255 -0
  459. package/test/suite/smtpclient_error-handling/test.cerr-05.quota-exceeded.ts +273 -0
  460. package/test/suite/smtpclient_error-handling/test.cerr-06.invalid-recipients.ts +320 -0
  461. package/test/suite/smtpclient_error-handling/test.cerr-07.message-size-limits.ts +320 -0
  462. package/test/suite/smtpclient_error-handling/test.cerr-08.rate-limiting.ts +261 -0
  463. package/test/suite/smtpclient_error-handling/test.cerr-09.connection-pool-errors.ts +299 -0
  464. package/test/suite/smtpclient_error-handling/test.cerr-10.partial-failure.ts +373 -0
  465. package/test/suite/smtpclient_performance/test.cperf-01.bulk-sending.ts +332 -0
  466. package/test/suite/smtpclient_performance/test.cperf-02.message-throughput.ts +304 -0
  467. package/test/suite/smtpclient_performance/test.cperf-03.memory-usage.ts +332 -0
  468. package/test/suite/smtpclient_performance/test.cperf-04.cpu-utilization.ts +373 -0
  469. package/test/suite/smtpclient_performance/test.cperf-05.network-efficiency.ts +181 -0
  470. package/test/suite/smtpclient_performance/test.cperf-06.caching-strategies.ts +190 -0
  471. package/test/suite/smtpclient_performance/test.cperf-07.queue-management.ts +171 -0
  472. package/test/suite/smtpclient_performance/test.cperf-08.dns-caching.ts +50 -0
  473. package/test/suite/smtpclient_reliability/test.crel-01.reconnection-logic.ts +305 -0
  474. package/test/suite/smtpclient_reliability/test.crel-02.network-interruption.ts +207 -0
  475. package/test/suite/smtpclient_reliability/test.crel-03.queue-persistence.ts +469 -0
  476. package/test/suite/smtpclient_reliability/test.crel-04.crash-recovery.ts +520 -0
  477. package/test/suite/smtpclient_reliability/test.crel-05.memory-leaks.ts +503 -0
  478. package/test/suite/smtpclient_reliability/test.crel-06.concurrency-safety.ts +558 -0
  479. package/test/suite/smtpclient_reliability/test.crel-07.resource-cleanup.ts +52 -0
  480. package/test/suite/smtpclient_rfc-compliance/test.crfc-01.rfc5321-client.ts +283 -0
  481. package/test/suite/smtpclient_rfc-compliance/test.crfc-02.esmtp-compliance.ts +77 -0
  482. package/test/suite/smtpclient_rfc-compliance/test.crfc-03.command-syntax.ts +67 -0
  483. package/test/suite/smtpclient_rfc-compliance/test.crfc-04.response-codes.ts +54 -0
  484. package/test/suite/smtpclient_rfc-compliance/test.crfc-05.state-machine.ts +703 -0
  485. package/test/suite/smtpclient_rfc-compliance/test.crfc-06.protocol-negotiation.ts +688 -0
  486. package/test/suite/smtpclient_rfc-compliance/test.crfc-07.interoperability.ts +728 -0
  487. package/test/suite/smtpclient_rfc-compliance/test.crfc-08.smtp-extensions.ts +656 -0
  488. package/test/suite/smtpclient_security/test.csec-01.tls-verification.ts +88 -0
  489. package/test/suite/smtpclient_security/test.csec-02.oauth2-authentication.ts +132 -0
  490. package/test/suite/smtpclient_security/test.csec-03.dkim-signing.ts +138 -0
  491. package/test/suite/smtpclient_security/test.csec-04.spf-compliance.ts +163 -0
  492. package/test/suite/smtpclient_security/test.csec-05.dmarc-policy.ts +200 -0
  493. package/test/suite/smtpclient_security/test.csec-06.certificate-validation.ts +145 -0
  494. package/test/suite/smtpclient_security/test.csec-07.cipher-suites.ts +153 -0
  495. package/test/suite/smtpclient_security/test.csec-08.authentication-fallback.ts +154 -0
  496. package/test/suite/smtpclient_security/test.csec-09.relay-restrictions.ts +166 -0
  497. package/test/suite/smtpclient_security/test.csec-10.anti-spam-measures.ts +196 -0
  498. package/test/suite/smtpserver_commands/test.cmd-01.ehlo-command.ts +193 -0
  499. package/test/suite/smtpserver_commands/test.cmd-02.mail-from.ts +330 -0
  500. package/test/suite/smtpserver_commands/test.cmd-03.rcpt-to.ts +296 -0
  501. package/test/suite/smtpserver_commands/test.cmd-04.data-command.ts +395 -0
  502. package/test/suite/smtpserver_commands/test.cmd-05.noop-command.ts +320 -0
  503. package/test/suite/smtpserver_commands/test.cmd-06.rset-command.ts +399 -0
  504. package/test/suite/smtpserver_commands/test.cmd-07.vrfy-command.ts +391 -0
  505. package/test/suite/smtpserver_commands/test.cmd-08.expn-command.ts +450 -0
  506. package/test/suite/smtpserver_commands/test.cmd-09.size-extension.ts +465 -0
  507. package/test/suite/smtpserver_commands/test.cmd-10.help-command.ts +454 -0
  508. package/test/suite/smtpserver_commands/test.cmd-11.command-pipelining.ts +334 -0
  509. package/test/suite/smtpserver_commands/test.cmd-12.helo-command.ts +420 -0
  510. package/test/suite/smtpserver_commands/test.cmd-13.quit-command.ts +384 -0
  511. package/test/suite/smtpserver_connection/test.cm-01.tls-connection.ts +61 -0
  512. package/test/suite/smtpserver_connection/test.cm-02.multiple-connections.ts +112 -0
  513. package/test/suite/smtpserver_connection/test.cm-03.connection-timeout.ts +134 -0
  514. package/test/suite/smtpserver_connection/test.cm-04.connection-limits.ts +374 -0
  515. package/test/suite/smtpserver_connection/test.cm-05.connection-rejection.ts +296 -0
  516. package/test/suite/smtpserver_connection/test.cm-06.starttls-upgrade.ts +468 -0
  517. package/test/suite/smtpserver_connection/test.cm-07.abrupt-disconnection.ts +321 -0
  518. package/test/suite/smtpserver_connection/test.cm-08.tls-versions.ts +361 -0
  519. package/test/suite/smtpserver_connection/test.cm-09.tls-ciphers.ts +556 -0
  520. package/test/suite/smtpserver_connection/test.cm-10.plain-connection.ts +293 -0
  521. package/test/suite/smtpserver_connection/test.cm-11.keepalive.ts +382 -0
  522. package/test/suite/smtpserver_edge-cases/test.edge-01.very-large-email.ts +239 -0
  523. package/test/suite/smtpserver_edge-cases/test.edge-02.very-small-email.ts +389 -0
  524. package/test/suite/smtpserver_edge-cases/test.edge-03.invalid-character-handling.ts +479 -0
  525. package/test/suite/smtpserver_edge-cases/test.edge-04.empty-commands.ts +430 -0
  526. package/test/suite/smtpserver_edge-cases/test.edge-05.extremely-long-lines.ts +425 -0
  527. package/test/suite/smtpserver_edge-cases/test.edge-06.extremely-long-headers.ts +404 -0
  528. package/test/suite/smtpserver_edge-cases/test.edge-07.unusual-mime-types.ts +333 -0
  529. package/test/suite/smtpserver_edge-cases/test.edge-08.nested-mime-structures.ts +379 -0
  530. package/test/suite/smtpserver_email-processing/test.ep-01.basic-email-sending.ts +338 -0
  531. package/test/suite/smtpserver_email-processing/test.ep-02.invalid-email-addresses.ts +315 -0
  532. package/test/suite/smtpserver_email-processing/test.ep-03.multiple-recipients.ts +493 -0
  533. package/test/suite/smtpserver_email-processing/test.ep-04.large-email.ts +528 -0
  534. package/test/suite/smtpserver_email-processing/test.ep-05.mime-handling.ts +515 -0
  535. package/test/suite/smtpserver_email-processing/test.ep-06.attachment-handling.ts +629 -0
  536. package/test/suite/smtpserver_email-processing/test.ep-07.special-character-handling.ts +462 -0
  537. package/test/suite/smtpserver_email-processing/test.ep-08.email-routing.ts +527 -0
  538. package/test/suite/smtpserver_email-processing/test.ep-09.delivery-status-notifications.ts +486 -0
  539. package/test/suite/smtpserver_error-handling/test.err-01.syntax-errors.ts +475 -0
  540. package/test/suite/smtpserver_error-handling/test.err-02.invalid-sequence.ts +450 -0
  541. package/test/suite/smtpserver_error-handling/test.err-03.temporary-failures.ts +453 -0
  542. package/test/suite/smtpserver_error-handling/test.err-04.permanent-failures.ts +325 -0
  543. package/test/suite/smtpserver_error-handling/test.err-05.resource-exhaustion.ts +302 -0
  544. package/test/suite/smtpserver_error-handling/test.err-06.malformed-mime.ts +374 -0
  545. package/test/suite/smtpserver_error-handling/test.err-07.exception-handling.ts +333 -0
  546. package/test/suite/smtpserver_error-handling/test.err-08.error-logging.ts +324 -0
  547. package/test/suite/smtpserver_performance/test.perf-01.throughput.ts +183 -0
  548. package/test/suite/smtpserver_performance/test.perf-02.concurrency.ts +388 -0
  549. package/test/suite/smtpserver_performance/test.perf-03.cpu-utilization.ts +245 -0
  550. package/test/suite/smtpserver_performance/test.perf-04.memory-usage.ts +238 -0
  551. package/test/suite/smtpserver_performance/test.perf-05.connection-processing-time.ts +363 -0
  552. package/test/suite/smtpserver_performance/test.perf-06.message-processing-time.ts +252 -0
  553. package/test/suite/smtpserver_performance/test.perf-07.resource-cleanup.ts +317 -0
  554. package/test/suite/smtpserver_reliability/test.rel-01.long-running-operation.ts +344 -0
  555. package/test/suite/smtpserver_reliability/test.rel-02.restart-recovery.ts +328 -0
  556. package/test/suite/smtpserver_reliability/test.rel-03.resource-leak-detection.ts +394 -0
  557. package/test/suite/smtpserver_reliability/test.rel-04.error-recovery.ts +401 -0
  558. package/test/suite/smtpserver_reliability/test.rel-05.dns-resolution-failure.ts +335 -0
  559. package/test/suite/smtpserver_reliability/test.rel-06.network-interruption.ts +410 -0
  560. package/test/suite/smtpserver_rfc-compliance/test.rfc-01.rfc5321-compliance.ts +382 -0
  561. package/test/suite/smtpserver_rfc-compliance/test.rfc-02.rfc5322-compliance.ts +428 -0
  562. package/test/suite/smtpserver_rfc-compliance/test.rfc-03.rfc7208-spf-compliance.ts +330 -0
  563. package/test/suite/smtpserver_rfc-compliance/test.rfc-04.rfc6376-dkim-compliance.ts +450 -0
  564. package/test/suite/smtpserver_rfc-compliance/test.rfc-05.rfc7489-dmarc-compliance.ts +408 -0
  565. package/test/suite/smtpserver_rfc-compliance/test.rfc-06.rfc8314-tls-compliance.ts +366 -0
  566. package/test/suite/smtpserver_rfc-compliance/test.rfc-07.rfc3461-dsn-compliance.ts +399 -0
  567. package/test/suite/smtpserver_security/test.sec-01.authentication.ts +218 -0
  568. package/test/suite/smtpserver_security/test.sec-02.authorization.ts +286 -0
  569. package/test/suite/smtpserver_security/test.sec-03.dkim-processing.ts +414 -0
  570. package/test/suite/smtpserver_security/test.sec-04.spf-checking.ts +280 -0
  571. package/test/suite/smtpserver_security/test.sec-05.dmarc-policy.ts +374 -0
  572. package/test/suite/smtpserver_security/test.sec-06.ip-reputation.ts +303 -0
  573. package/test/suite/smtpserver_security/test.sec-07.content-scanning.ts +409 -0
  574. package/test/suite/smtpserver_security/test.sec-08.rate-limiting.ts +324 -0
  575. package/test/suite/smtpserver_security/test.sec-09.tls-certificate-validation.ts +312 -0
  576. package/test/suite/smtpserver_security/test.sec-10.header-injection-prevention.ts +332 -0
  577. package/test/suite/smtpserver_security/test.sec-11.bounce-management.ts +363 -0
  578. package/test/test.base.ts +65 -0
  579. package/test/test.bouncemanager.ts +196 -0
  580. package/test/test.config.md +175 -0
  581. package/test/test.contentscanner.ts +265 -0
  582. package/test/test.dcrouter.email.ts +201 -0
  583. package/test/test.deliverability.ts +55 -0
  584. package/test/test.dns-manager-creation.ts +141 -0
  585. package/test/test.dns-mode-switching.ts +257 -0
  586. package/test/test.dns-server-config.ts +140 -0
  587. package/test/test.dns-socket-handler.ts +169 -0
  588. package/test/test.dns-validation.ts +283 -0
  589. package/test/test.email-socket-handler.ts +228 -0
  590. package/test/test.email.integration.ts +377 -0
  591. package/test/test.email.router.ts +283 -0
  592. package/test/test.emailauth.ts +195 -0
  593. package/test/test.errors.ts +408 -0
  594. package/test/test.integration.storage.ts +313 -0
  595. package/test/test.integration.ts +75 -0
  596. package/test/test.ipreputationchecker.ts +179 -0
  597. package/test/test.ipwarmupmanager.ts +323 -0
  598. package/test/test.jwt-auth.ts +130 -0
  599. package/test/test.minimal.ts +66 -0
  600. package/test/test.opsserver-api.ts +83 -0
  601. package/test/test.protected-endpoint.ts +115 -0
  602. package/test/test.rate-limiting-integration.ts +236 -0
  603. package/test/test.ratelimiter.ts +141 -0
  604. package/test/test.reputationmonitor.ts +262 -0
  605. package/test/test.smartmail.ts +248 -0
  606. package/test/test.smtp.client.compatibility.ts +154 -0
  607. package/test/test.smtp.client.ts +191 -0
  608. package/test/test.smtp.server.ts +180 -0
  609. package/test/test.socket-handler-integration.ts +240 -0
  610. package/test/test.socket-handler-unit.ts +198 -0
  611. package/test/test.storagemanager.ts +289 -0
  612. package/ts/00_commitinfo_data.ts +8 -0
  613. package/ts/classes.dcrouter.ts +1310 -0
  614. package/ts/config/index.ts +2 -0
  615. package/ts/config/validator.ts +266 -0
  616. package/ts/deliverability/classes.ipwarmupmanager.ts +896 -0
  617. package/ts/deliverability/classes.senderreputationmonitor.ts +1244 -0
  618. package/ts/deliverability/index.ts +13 -0
  619. package/ts/errors/base.errors.ts +525 -0
  620. package/ts/errors/email.errors.ts +383 -0
  621. package/ts/errors/error-handler.ts +412 -0
  622. package/ts/errors/error.codes.ts +165 -0
  623. package/ts/errors/index.ts +195 -0
  624. package/ts/errors/mta.errors.ts +681 -0
  625. package/ts/errors/reputation.errors.ts +422 -0
  626. package/ts/index.ts +7 -0
  627. package/ts/logger.ts +91 -0
  628. package/ts/mail/core/classes.bouncemanager.ts +965 -0
  629. package/ts/mail/core/classes.email.ts +941 -0
  630. package/ts/mail/core/classes.emailvalidator.ts +239 -0
  631. package/ts/mail/core/classes.templatemanager.ts +320 -0
  632. package/ts/mail/core/index.ts +5 -0
  633. package/ts/mail/delivery/classes.delivery.queue.ts +645 -0
  634. package/ts/mail/delivery/classes.delivery.system.ts +1089 -0
  635. package/ts/mail/delivery/classes.emailsendjob.ts +447 -0
  636. package/ts/mail/delivery/classes.emailsendjob.ts.backup +691 -0
  637. package/ts/mail/delivery/classes.emailsignjob.ts +67 -0
  638. package/ts/mail/delivery/classes.mta.config.ts +73 -0
  639. package/ts/mail/delivery/classes.ratelimiter.ts +281 -0
  640. package/ts/mail/delivery/classes.smtp.client.legacy.ts +1422 -0
  641. package/ts/mail/delivery/classes.unified.rate.limiter.ts +1053 -0
  642. package/ts/mail/delivery/index.ts +24 -0
  643. package/ts/mail/delivery/interfaces.ts +291 -0
  644. package/ts/mail/delivery/smtpclient/auth-handler.ts +232 -0
  645. package/ts/mail/delivery/smtpclient/command-handler.ts +343 -0
  646. package/ts/mail/delivery/smtpclient/connection-manager.ts +289 -0
  647. package/ts/mail/delivery/smtpclient/constants.ts +145 -0
  648. package/ts/mail/delivery/smtpclient/create-client.ts +94 -0
  649. package/ts/mail/delivery/smtpclient/error-handler.ts +141 -0
  650. package/ts/mail/delivery/smtpclient/index.ts +24 -0
  651. package/ts/mail/delivery/smtpclient/interfaces.ts +242 -0
  652. package/ts/mail/delivery/smtpclient/smtp-client.ts +357 -0
  653. package/ts/mail/delivery/smtpclient/tls-handler.ts +254 -0
  654. package/ts/mail/delivery/smtpclient/utils/helpers.ts +224 -0
  655. package/ts/mail/delivery/smtpclient/utils/logging.ts +212 -0
  656. package/ts/mail/delivery/smtpclient/utils/validation.ts +170 -0
  657. package/ts/mail/delivery/smtpserver/certificate-utils.ts +398 -0
  658. package/ts/mail/delivery/smtpserver/command-handler.ts +1340 -0
  659. package/ts/mail/delivery/smtpserver/connection-manager.ts +1045 -0
  660. package/ts/mail/delivery/smtpserver/constants.ts +181 -0
  661. package/ts/mail/delivery/smtpserver/create-server.ts +31 -0
  662. package/ts/mail/delivery/smtpserver/data-handler.ts +1283 -0
  663. package/ts/mail/delivery/smtpserver/index.ts +32 -0
  664. package/ts/mail/delivery/smtpserver/interfaces.ts +655 -0
  665. package/ts/mail/delivery/smtpserver/secure-server.ts +97 -0
  666. package/ts/mail/delivery/smtpserver/security-handler.ts +345 -0
  667. package/ts/mail/delivery/smtpserver/session-manager.ts +557 -0
  668. package/ts/mail/delivery/smtpserver/smtp-server.ts +804 -0
  669. package/ts/mail/delivery/smtpserver/starttls-handler.ts +262 -0
  670. package/ts/mail/delivery/smtpserver/tls-handler.ts +346 -0
  671. package/ts/mail/delivery/smtpserver/utils/adaptive-logging.ts +514 -0
  672. package/ts/mail/delivery/smtpserver/utils/helpers.ts +246 -0
  673. package/ts/mail/delivery/smtpserver/utils/logging.ts +246 -0
  674. package/ts/mail/delivery/smtpserver/utils/validation.ts +436 -0
  675. package/ts/mail/index.ts +19 -0
  676. package/ts/mail/routing/classes.dns.manager.ts +563 -0
  677. package/ts/mail/routing/classes.dnsmanager.ts +559 -0
  678. package/ts/mail/routing/classes.domain.registry.ts +139 -0
  679. package/ts/mail/routing/classes.email.config.ts +82 -0
  680. package/ts/mail/routing/classes.email.router.ts +575 -0
  681. package/ts/mail/routing/classes.unified.email.server.ts +1873 -0
  682. package/ts/mail/routing/index.ts +6 -0
  683. package/ts/mail/routing/interfaces.ts +202 -0
  684. package/ts/mail/security/classes.dkimcreator.ts +431 -0
  685. package/ts/mail/security/classes.dkimverifier.ts +382 -0
  686. package/ts/mail/security/classes.dmarcverifier.ts +478 -0
  687. package/ts/mail/security/classes.spfverifier.ts +606 -0
  688. package/ts/mail/security/index.ts +5 -0
  689. package/ts/opsserver/classes.opsserver.ts +65 -0
  690. package/ts/opsserver/handlers/admin.handler.ts +240 -0
  691. package/ts/opsserver/handlers/config.handler.ts +150 -0
  692. package/ts/opsserver/handlers/index.ts +5 -0
  693. package/ts/opsserver/handlers/logs.handler.ts +195 -0
  694. package/ts/opsserver/handlers/security.handler.ts +208 -0
  695. package/ts/opsserver/handlers/stats.handler.ts +344 -0
  696. package/ts/opsserver/helpers/guards.ts +56 -0
  697. package/ts/opsserver/index.ts +1 -0
  698. package/ts/paths.ts +48 -0
  699. package/ts/plugins.ts +94 -0
  700. package/ts/security/classes.contentscanner.ts +739 -0
  701. package/ts/security/classes.ipreputationchecker.ts +592 -0
  702. package/ts/security/classes.securitylogger.ts +299 -0
  703. package/ts/security/index.ts +21 -0
  704. package/ts/sms/classes.smsservice.ts +98 -0
  705. package/ts/sms/config/sms.config.ts +109 -0
  706. package/ts/sms/config/sms.schema.ts +122 -0
  707. package/ts/sms/index.ts +1 -0
  708. package/ts/storage/classes.storagemanager.ts +400 -0
  709. package/ts/storage/index.ts +2 -0
  710. package/ts/tspublish.json +3 -0
  711. package/ts_interfaces/data/auth.ts +8 -0
  712. package/ts_interfaces/data/index.ts +2 -0
  713. package/ts_interfaces/data/stats.ts +101 -0
  714. package/ts_interfaces/index.ts +9 -0
  715. package/ts_interfaces/plugins.ts +6 -0
  716. package/ts_interfaces/requests/admin.ts +46 -0
  717. package/ts_interfaces/requests/config.ts +35 -0
  718. package/ts_interfaces/requests/index.ts +4 -0
  719. package/ts_interfaces/requests/logs.ts +44 -0
  720. package/ts_interfaces/requests/stats.ts +162 -0
  721. package/ts_interfaces/tspublish.json +3 -0
  722. package/ts_web/00_commitinfo_data.ts +8 -0
  723. package/ts_web/appstate.ts +361 -0
  724. package/ts_web/elements/index.ts +7 -0
  725. package/ts_web/elements/ops-dashboard.ts +165 -0
  726. package/ts_web/elements/ops-view-config.ts +268 -0
  727. package/ts_web/elements/ops-view-logs.ts +207 -0
  728. package/ts_web/elements/ops-view-overview.ts +222 -0
  729. package/ts_web/elements/ops-view-security.ts +471 -0
  730. package/ts_web/elements/ops-view-stats.ts +299 -0
  731. package/ts_web/elements/shared/css.ts +10 -0
  732. package/ts_web/elements/shared/index.ts +2 -0
  733. package/ts_web/elements/shared/ops-sectionheading.ts +42 -0
  734. package/ts_web/index.ts +9 -0
  735. package/ts_web/plugins.ts +11 -0
  736. package/ts_web/tspublish.json +3 -0
  737. package/tsconfig.json +15 -0
@@ -0,0 +1,1053 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import { EventEmitter } from 'node:events';
3
+ import { logger } from '../../logger.js';
4
+ import { SecurityLogger, SecurityLogLevel, SecurityEventType } from '../../security/index.js';
5
+
6
+ /**
7
+ * Interface for rate limit configuration
8
+ */
9
+ export interface IRateLimitConfig {
10
+ maxMessagesPerMinute?: number;
11
+ maxRecipientsPerMessage?: number;
12
+ maxConnectionsPerIP?: number;
13
+ maxErrorsPerIP?: number;
14
+ maxAuthFailuresPerIP?: number;
15
+ blockDuration?: number; // in milliseconds
16
+ }
17
+
18
+ /**
19
+ * Interface for hierarchical rate limits
20
+ */
21
+ export interface IHierarchicalRateLimits {
22
+ // Global rate limits (applied to all traffic)
23
+ global: IRateLimitConfig;
24
+
25
+ // Pattern-specific rate limits (applied to matching patterns)
26
+ patterns?: Record<string, IRateLimitConfig>;
27
+
28
+ // IP-specific rate limits (applied to specific IPs)
29
+ ips?: Record<string, IRateLimitConfig>;
30
+
31
+ // Domain-specific rate limits (applied to specific email domains)
32
+ domains?: Record<string, IRateLimitConfig>;
33
+
34
+ // Temporary blocks list and their expiry times
35
+ blocks?: Record<string, number>; // IP to expiry timestamp
36
+ }
37
+
38
+ /**
39
+ * Counter interface for rate limiting
40
+ */
41
+ interface ILimitCounter {
42
+ count: number;
43
+ lastReset: number;
44
+ recipients: number;
45
+ errors: number;
46
+ authFailures: number;
47
+ connections: number;
48
+ }
49
+
50
+ /**
51
+ * Rate limiter statistics
52
+ */
53
+ export interface IRateLimiterStats {
54
+ activeCounters: number;
55
+ totalBlocked: number;
56
+ currentlyBlocked: number;
57
+ byPattern: Record<string, {
58
+ messagesPerMinute: number;
59
+ totalMessages: number;
60
+ totalBlocked: number;
61
+ }>;
62
+ byIp: Record<string, {
63
+ messagesPerMinute: number;
64
+ totalMessages: number;
65
+ totalBlocked: number;
66
+ connections: number;
67
+ errors: number;
68
+ authFailures: number;
69
+ blocked: boolean;
70
+ }>;
71
+ }
72
+
73
+ /**
74
+ * Result of a rate limit check
75
+ */
76
+ export interface IRateLimitResult {
77
+ allowed: boolean;
78
+ reason?: string;
79
+ limit?: number;
80
+ current?: number;
81
+ resetIn?: number; // milliseconds until reset
82
+ }
83
+
84
+ /**
85
+ * Unified rate limiter for all email processing modes
86
+ */
87
+ export class UnifiedRateLimiter extends EventEmitter {
88
+ private config: IHierarchicalRateLimits;
89
+ private counters: Map<string, ILimitCounter> = new Map();
90
+ private patternCounters: Map<string, ILimitCounter> = new Map();
91
+ private ipCounters: Map<string, ILimitCounter> = new Map();
92
+ private domainCounters: Map<string, ILimitCounter> = new Map();
93
+ private cleanupInterval?: NodeJS.Timeout;
94
+ private stats: IRateLimiterStats;
95
+
96
+ /**
97
+ * Create a new unified rate limiter
98
+ * @param config Rate limit configuration
99
+ */
100
+ constructor(config: IHierarchicalRateLimits) {
101
+ super();
102
+
103
+ // Set default configuration
104
+ this.config = {
105
+ global: {
106
+ maxMessagesPerMinute: config.global.maxMessagesPerMinute || 100,
107
+ maxRecipientsPerMessage: config.global.maxRecipientsPerMessage || 100,
108
+ maxConnectionsPerIP: config.global.maxConnectionsPerIP || 20,
109
+ maxErrorsPerIP: config.global.maxErrorsPerIP || 10,
110
+ maxAuthFailuresPerIP: config.global.maxAuthFailuresPerIP || 5,
111
+ blockDuration: config.global.blockDuration || 3600000 // 1 hour
112
+ },
113
+ patterns: config.patterns || {},
114
+ ips: config.ips || {},
115
+ blocks: config.blocks || {}
116
+ };
117
+
118
+ // Initialize statistics
119
+ this.stats = {
120
+ activeCounters: 0,
121
+ totalBlocked: 0,
122
+ currentlyBlocked: 0,
123
+ byPattern: {},
124
+ byIp: {}
125
+ };
126
+
127
+ // Start cleanup interval
128
+ this.startCleanupInterval();
129
+ }
130
+
131
+ /**
132
+ * Start the cleanup interval
133
+ */
134
+ private startCleanupInterval(): void {
135
+ if (this.cleanupInterval) {
136
+ clearInterval(this.cleanupInterval);
137
+ }
138
+
139
+ // Run cleanup every minute
140
+ this.cleanupInterval = setInterval(() => this.cleanup(), 60000);
141
+ }
142
+
143
+ /**
144
+ * Stop the cleanup interval
145
+ */
146
+ public stop(): void {
147
+ if (this.cleanupInterval) {
148
+ clearInterval(this.cleanupInterval);
149
+ this.cleanupInterval = undefined;
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Destroy the rate limiter and clean up all resources
155
+ */
156
+ public destroy(): void {
157
+ // Stop the cleanup interval
158
+ this.stop();
159
+
160
+ // Clear all maps to free memory
161
+ this.counters.clear();
162
+ this.ipCounters.clear();
163
+ this.patternCounters.clear();
164
+
165
+ // Clear blocks
166
+ if (this.config.blocks) {
167
+ this.config.blocks = {};
168
+ }
169
+
170
+ // Clear statistics
171
+ this.stats = {
172
+ activeCounters: 0,
173
+ totalBlocked: 0,
174
+ currentlyBlocked: 0,
175
+ byPattern: {},
176
+ byIp: {}
177
+ };
178
+
179
+ logger.log('info', 'UnifiedRateLimiter destroyed');
180
+ }
181
+
182
+ /**
183
+ * Clean up expired counters and blocks
184
+ */
185
+ private cleanup(): void {
186
+ const now = Date.now();
187
+
188
+ // Clean up expired blocks
189
+ if (this.config.blocks) {
190
+ for (const [ip, expiry] of Object.entries(this.config.blocks)) {
191
+ if (expiry <= now) {
192
+ delete this.config.blocks[ip];
193
+ logger.log('info', `Rate limit block expired for IP ${ip}`);
194
+
195
+ // Update statistics
196
+ if (this.stats.byIp[ip]) {
197
+ this.stats.byIp[ip].blocked = false;
198
+ }
199
+ this.stats.currentlyBlocked--;
200
+ }
201
+ }
202
+ }
203
+
204
+ // Clean up old counters (older than 10 minutes)
205
+ const cutoff = now - 600000;
206
+
207
+ // Clean global counters
208
+ for (const [key, counter] of this.counters.entries()) {
209
+ if (counter.lastReset < cutoff) {
210
+ this.counters.delete(key);
211
+ }
212
+ }
213
+
214
+ // Clean pattern counters
215
+ for (const [key, counter] of this.patternCounters.entries()) {
216
+ if (counter.lastReset < cutoff) {
217
+ this.patternCounters.delete(key);
218
+ }
219
+ }
220
+
221
+ // Clean IP counters
222
+ for (const [key, counter] of this.ipCounters.entries()) {
223
+ if (counter.lastReset < cutoff) {
224
+ this.ipCounters.delete(key);
225
+ }
226
+ }
227
+
228
+ // Clean domain counters
229
+ for (const [key, counter] of this.domainCounters.entries()) {
230
+ if (counter.lastReset < cutoff) {
231
+ this.domainCounters.delete(key);
232
+ }
233
+ }
234
+
235
+ // Update statistics
236
+ this.updateStats();
237
+ }
238
+
239
+ /**
240
+ * Check if a message is allowed by rate limits
241
+ * @param email Email address
242
+ * @param ip IP address
243
+ * @param recipients Number of recipients
244
+ * @param pattern Matched pattern
245
+ * @param domain Domain name for domain-specific limits
246
+ * @returns Result of rate limit check
247
+ */
248
+ public checkMessageLimit(email: string, ip: string, recipients: number, pattern?: string, domain?: string): IRateLimitResult {
249
+ // Check if IP is blocked
250
+ if (this.isIpBlocked(ip)) {
251
+ return {
252
+ allowed: false,
253
+ reason: 'IP is blocked',
254
+ resetIn: this.getBlockReleaseTime(ip)
255
+ };
256
+ }
257
+
258
+ // Check global message rate limit
259
+ const globalResult = this.checkGlobalMessageLimit(email);
260
+ if (!globalResult.allowed) {
261
+ return globalResult;
262
+ }
263
+
264
+ // Check pattern-specific limit if pattern is provided
265
+ if (pattern) {
266
+ const patternResult = this.checkPatternMessageLimit(pattern);
267
+ if (!patternResult.allowed) {
268
+ return patternResult;
269
+ }
270
+ }
271
+
272
+ // Check domain-specific limit if domain is provided
273
+ if (domain) {
274
+ const domainResult = this.checkDomainMessageLimit(domain);
275
+ if (!domainResult.allowed) {
276
+ return domainResult;
277
+ }
278
+ }
279
+
280
+ // Check IP-specific limit
281
+ const ipResult = this.checkIpMessageLimit(ip);
282
+ if (!ipResult.allowed) {
283
+ return ipResult;
284
+ }
285
+
286
+ // Check recipient limit
287
+ const recipientResult = this.checkRecipientLimit(email, recipients, pattern, domain);
288
+ if (!recipientResult.allowed) {
289
+ return recipientResult;
290
+ }
291
+
292
+ // All checks passed
293
+ return { allowed: true };
294
+ }
295
+
296
+ /**
297
+ * Check global message rate limit
298
+ * @param email Email address
299
+ */
300
+ private checkGlobalMessageLimit(email: string): IRateLimitResult {
301
+ const now = Date.now();
302
+ const limit = this.config.global.maxMessagesPerMinute!;
303
+
304
+ if (!limit) {
305
+ return { allowed: true };
306
+ }
307
+
308
+ // Get or create counter
309
+ const key = 'global';
310
+ let counter = this.counters.get(key);
311
+
312
+ if (!counter) {
313
+ counter = {
314
+ count: 0,
315
+ lastReset: now,
316
+ recipients: 0,
317
+ errors: 0,
318
+ authFailures: 0,
319
+ connections: 0
320
+ };
321
+ this.counters.set(key, counter);
322
+ }
323
+
324
+ // Check if counter needs to be reset
325
+ if (now - counter.lastReset >= 60000) {
326
+ counter.count = 0;
327
+ counter.lastReset = now;
328
+ }
329
+
330
+ // Check if limit is exceeded
331
+ if (counter.count >= limit) {
332
+ // Calculate reset time
333
+ const resetIn = 60000 - (now - counter.lastReset);
334
+
335
+ return {
336
+ allowed: false,
337
+ reason: 'Global message rate limit exceeded',
338
+ limit,
339
+ current: counter.count,
340
+ resetIn
341
+ };
342
+ }
343
+
344
+ // Increment counter
345
+ counter.count++;
346
+
347
+ // Update statistics
348
+ this.updateStats();
349
+
350
+ return { allowed: true };
351
+ }
352
+
353
+ /**
354
+ * Check pattern-specific message rate limit
355
+ * @param pattern Pattern to check
356
+ */
357
+ private checkPatternMessageLimit(pattern: string): IRateLimitResult {
358
+ const now = Date.now();
359
+
360
+ // Get pattern-specific limit or use global
361
+ const patternConfig = this.config.patterns?.[pattern];
362
+ const limit = patternConfig?.maxMessagesPerMinute || this.config.global.maxMessagesPerMinute!;
363
+
364
+ if (!limit) {
365
+ return { allowed: true };
366
+ }
367
+
368
+ // Get or create counter
369
+ let counter = this.patternCounters.get(pattern);
370
+
371
+ if (!counter) {
372
+ counter = {
373
+ count: 0,
374
+ lastReset: now,
375
+ recipients: 0,
376
+ errors: 0,
377
+ authFailures: 0,
378
+ connections: 0
379
+ };
380
+ this.patternCounters.set(pattern, counter);
381
+
382
+ // Initialize pattern stats if needed
383
+ if (!this.stats.byPattern[pattern]) {
384
+ this.stats.byPattern[pattern] = {
385
+ messagesPerMinute: 0,
386
+ totalMessages: 0,
387
+ totalBlocked: 0
388
+ };
389
+ }
390
+ }
391
+
392
+ // Check if counter needs to be reset
393
+ if (now - counter.lastReset >= 60000) {
394
+ counter.count = 0;
395
+ counter.lastReset = now;
396
+ }
397
+
398
+ // Check if limit is exceeded
399
+ if (counter.count >= limit) {
400
+ // Calculate reset time
401
+ const resetIn = 60000 - (now - counter.lastReset);
402
+
403
+ // Update statistics
404
+ this.stats.byPattern[pattern].totalBlocked++;
405
+ this.stats.totalBlocked++;
406
+
407
+ return {
408
+ allowed: false,
409
+ reason: `Pattern "${pattern}" message rate limit exceeded`,
410
+ limit,
411
+ current: counter.count,
412
+ resetIn
413
+ };
414
+ }
415
+
416
+ // Increment counter
417
+ counter.count++;
418
+
419
+ // Update statistics
420
+ this.stats.byPattern[pattern].messagesPerMinute = counter.count;
421
+ this.stats.byPattern[pattern].totalMessages++;
422
+
423
+ return { allowed: true };
424
+ }
425
+
426
+ /**
427
+ * Check domain-specific message rate limit
428
+ * @param domain Domain to check
429
+ */
430
+ private checkDomainMessageLimit(domain: string): IRateLimitResult {
431
+ const now = Date.now();
432
+
433
+ // Get domain-specific limit or use global
434
+ const domainConfig = this.config.domains?.[domain];
435
+ const limit = domainConfig?.maxMessagesPerMinute || this.config.global.maxMessagesPerMinute!;
436
+
437
+ if (!limit) {
438
+ return { allowed: true };
439
+ }
440
+
441
+ // Get or create counter
442
+ let counter = this.domainCounters.get(domain);
443
+
444
+ if (!counter) {
445
+ counter = {
446
+ count: 0,
447
+ lastReset: now,
448
+ recipients: 0,
449
+ errors: 0,
450
+ authFailures: 0,
451
+ connections: 0
452
+ };
453
+ this.domainCounters.set(domain, counter);
454
+ }
455
+
456
+ // Check if counter needs to be reset
457
+ if (now - counter.lastReset >= 60000) {
458
+ counter.count = 0;
459
+ counter.lastReset = now;
460
+ }
461
+
462
+ // Check if limit is exceeded
463
+ if (counter.count >= limit) {
464
+ // Calculate reset time
465
+ const resetIn = 60000 - (now - counter.lastReset);
466
+
467
+ logger.log('warn', `Domain ${domain} rate limit exceeded: ${counter.count}/${limit} messages per minute`);
468
+
469
+ return {
470
+ allowed: false,
471
+ reason: `Domain "${domain}" message rate limit exceeded`,
472
+ limit,
473
+ current: counter.count,
474
+ resetIn
475
+ };
476
+ }
477
+
478
+ // Increment counter
479
+ counter.count++;
480
+
481
+ return { allowed: true };
482
+ }
483
+
484
+ /**
485
+ * Check IP-specific message rate limit
486
+ * @param ip IP address
487
+ */
488
+ private checkIpMessageLimit(ip: string): IRateLimitResult {
489
+ const now = Date.now();
490
+
491
+ // Get IP-specific limit or use global
492
+ const ipConfig = this.config.ips?.[ip];
493
+ const limit = ipConfig?.maxMessagesPerMinute || this.config.global.maxMessagesPerMinute!;
494
+
495
+ if (!limit) {
496
+ return { allowed: true };
497
+ }
498
+
499
+ // Get or create counter
500
+ let counter = this.ipCounters.get(ip);
501
+
502
+ if (!counter) {
503
+ counter = {
504
+ count: 0,
505
+ lastReset: now,
506
+ recipients: 0,
507
+ errors: 0,
508
+ authFailures: 0,
509
+ connections: 0
510
+ };
511
+ this.ipCounters.set(ip, counter);
512
+
513
+ // Initialize IP stats if needed
514
+ if (!this.stats.byIp[ip]) {
515
+ this.stats.byIp[ip] = {
516
+ messagesPerMinute: 0,
517
+ totalMessages: 0,
518
+ totalBlocked: 0,
519
+ connections: 0,
520
+ errors: 0,
521
+ authFailures: 0,
522
+ blocked: false
523
+ };
524
+ }
525
+ }
526
+
527
+ // Check if counter needs to be reset
528
+ if (now - counter.lastReset >= 60000) {
529
+ counter.count = 0;
530
+ counter.lastReset = now;
531
+ }
532
+
533
+ // Check if limit is exceeded
534
+ if (counter.count >= limit) {
535
+ // Calculate reset time
536
+ const resetIn = 60000 - (now - counter.lastReset);
537
+
538
+ // Update statistics
539
+ this.stats.byIp[ip].totalBlocked++;
540
+ this.stats.totalBlocked++;
541
+
542
+ return {
543
+ allowed: false,
544
+ reason: `IP ${ip} message rate limit exceeded`,
545
+ limit,
546
+ current: counter.count,
547
+ resetIn
548
+ };
549
+ }
550
+
551
+ // Increment counter
552
+ counter.count++;
553
+
554
+ // Update statistics
555
+ this.stats.byIp[ip].messagesPerMinute = counter.count;
556
+ this.stats.byIp[ip].totalMessages++;
557
+
558
+ return { allowed: true };
559
+ }
560
+
561
+ /**
562
+ * Check recipient limit
563
+ * @param email Email address
564
+ * @param recipients Number of recipients
565
+ * @param pattern Matched pattern
566
+ * @param domain Domain name
567
+ */
568
+ private checkRecipientLimit(email: string, recipients: number, pattern?: string, domain?: string): IRateLimitResult {
569
+ // Get the most specific limit available
570
+ let limit = this.config.global.maxRecipientsPerMessage!;
571
+
572
+ // Check pattern-specific limit
573
+ if (pattern && this.config.patterns?.[pattern]?.maxRecipientsPerMessage) {
574
+ limit = this.config.patterns[pattern].maxRecipientsPerMessage!;
575
+ }
576
+
577
+ // Check domain-specific limit (overrides pattern if present)
578
+ if (domain && this.config.domains?.[domain]?.maxRecipientsPerMessage) {
579
+ limit = this.config.domains[domain].maxRecipientsPerMessage!;
580
+ }
581
+
582
+ if (!limit) {
583
+ return { allowed: true };
584
+ }
585
+
586
+ // Check if limit is exceeded
587
+ if (recipients > limit) {
588
+ return {
589
+ allowed: false,
590
+ reason: 'Recipient limit exceeded',
591
+ limit,
592
+ current: recipients
593
+ };
594
+ }
595
+
596
+ return { allowed: true };
597
+ }
598
+
599
+ /**
600
+ * Record a connection from an IP
601
+ * @param ip IP address
602
+ * @returns Result of rate limit check
603
+ */
604
+ public recordConnection(ip: string): IRateLimitResult {
605
+ const now = Date.now();
606
+
607
+ // Check if IP is blocked
608
+ if (this.isIpBlocked(ip)) {
609
+ return {
610
+ allowed: false,
611
+ reason: 'IP is blocked',
612
+ resetIn: this.getBlockReleaseTime(ip)
613
+ };
614
+ }
615
+
616
+ // Get IP-specific limit or use global
617
+ const ipConfig = this.config.ips?.[ip];
618
+ const limit = ipConfig?.maxConnectionsPerIP || this.config.global.maxConnectionsPerIP!;
619
+
620
+ if (!limit) {
621
+ return { allowed: true };
622
+ }
623
+
624
+ // Get or create counter
625
+ let counter = this.ipCounters.get(ip);
626
+
627
+ if (!counter) {
628
+ counter = {
629
+ count: 0,
630
+ lastReset: now,
631
+ recipients: 0,
632
+ errors: 0,
633
+ authFailures: 0,
634
+ connections: 0
635
+ };
636
+ this.ipCounters.set(ip, counter);
637
+
638
+ // Initialize IP stats if needed
639
+ if (!this.stats.byIp[ip]) {
640
+ this.stats.byIp[ip] = {
641
+ messagesPerMinute: 0,
642
+ totalMessages: 0,
643
+ totalBlocked: 0,
644
+ connections: 0,
645
+ errors: 0,
646
+ authFailures: 0,
647
+ blocked: false
648
+ };
649
+ }
650
+ }
651
+
652
+ // Check if counter needs to be reset
653
+ if (now - counter.lastReset >= 60000) {
654
+ counter.connections = 0;
655
+ counter.lastReset = now;
656
+ }
657
+
658
+ // Check if limit is exceeded
659
+ if (counter.connections >= limit) {
660
+ // Calculate reset time
661
+ const resetIn = 60000 - (now - counter.lastReset);
662
+
663
+ // Update statistics
664
+ this.stats.byIp[ip].totalBlocked++;
665
+ this.stats.totalBlocked++;
666
+
667
+ return {
668
+ allowed: false,
669
+ reason: `IP ${ip} connection rate limit exceeded`,
670
+ limit,
671
+ current: counter.connections,
672
+ resetIn
673
+ };
674
+ }
675
+
676
+ // Increment counter
677
+ counter.connections++;
678
+
679
+ // Update statistics
680
+ this.stats.byIp[ip].connections = counter.connections;
681
+
682
+ return { allowed: true };
683
+ }
684
+
685
+ /**
686
+ * Record an error from an IP
687
+ * @param ip IP address
688
+ * @returns True if IP should be blocked
689
+ */
690
+ public recordError(ip: string): boolean {
691
+ const now = Date.now();
692
+
693
+ // Get IP-specific limit or use global
694
+ const ipConfig = this.config.ips?.[ip];
695
+ const limit = ipConfig?.maxErrorsPerIP || this.config.global.maxErrorsPerIP!;
696
+
697
+ if (!limit) {
698
+ return false;
699
+ }
700
+
701
+ // Get or create counter
702
+ let counter = this.ipCounters.get(ip);
703
+
704
+ if (!counter) {
705
+ counter = {
706
+ count: 0,
707
+ lastReset: now,
708
+ recipients: 0,
709
+ errors: 0,
710
+ authFailures: 0,
711
+ connections: 0
712
+ };
713
+ this.ipCounters.set(ip, counter);
714
+
715
+ // Initialize IP stats if needed
716
+ if (!this.stats.byIp[ip]) {
717
+ this.stats.byIp[ip] = {
718
+ messagesPerMinute: 0,
719
+ totalMessages: 0,
720
+ totalBlocked: 0,
721
+ connections: 0,
722
+ errors: 0,
723
+ authFailures: 0,
724
+ blocked: false
725
+ };
726
+ }
727
+ }
728
+
729
+ // Check if counter needs to be reset
730
+ if (now - counter.lastReset >= 60000) {
731
+ counter.errors = 0;
732
+ counter.lastReset = now;
733
+ }
734
+
735
+ // Increment counter
736
+ counter.errors++;
737
+
738
+ // Update statistics
739
+ this.stats.byIp[ip].errors = counter.errors;
740
+
741
+ // Check if limit is exceeded
742
+ if (counter.errors >= limit) {
743
+ // Block the IP
744
+ this.blockIp(ip);
745
+
746
+ logger.log('warn', `IP ${ip} blocked due to excessive errors (${counter.errors}/${limit})`);
747
+
748
+ SecurityLogger.getInstance().logEvent({
749
+ level: SecurityLogLevel.WARN,
750
+ type: SecurityEventType.RATE_LIMITING,
751
+ message: 'IP blocked due to excessive errors',
752
+ ipAddress: ip,
753
+ details: {
754
+ errors: counter.errors,
755
+ limit
756
+ },
757
+ success: false
758
+ });
759
+
760
+ return true;
761
+ }
762
+
763
+ return false;
764
+ }
765
+
766
+ /**
767
+ * Record an authentication failure from an IP
768
+ * @param ip IP address
769
+ * @returns True if IP should be blocked
770
+ */
771
+ public recordAuthFailure(ip: string): boolean {
772
+ const now = Date.now();
773
+
774
+ // Get IP-specific limit or use global
775
+ const ipConfig = this.config.ips?.[ip];
776
+ const limit = ipConfig?.maxAuthFailuresPerIP || this.config.global.maxAuthFailuresPerIP!;
777
+
778
+ if (!limit) {
779
+ return false;
780
+ }
781
+
782
+ // Get or create counter
783
+ let counter = this.ipCounters.get(ip);
784
+
785
+ if (!counter) {
786
+ counter = {
787
+ count: 0,
788
+ lastReset: now,
789
+ recipients: 0,
790
+ errors: 0,
791
+ authFailures: 0,
792
+ connections: 0
793
+ };
794
+ this.ipCounters.set(ip, counter);
795
+
796
+ // Initialize IP stats if needed
797
+ if (!this.stats.byIp[ip]) {
798
+ this.stats.byIp[ip] = {
799
+ messagesPerMinute: 0,
800
+ totalMessages: 0,
801
+ totalBlocked: 0,
802
+ connections: 0,
803
+ errors: 0,
804
+ authFailures: 0,
805
+ blocked: false
806
+ };
807
+ }
808
+ }
809
+
810
+ // Check if counter needs to be reset
811
+ if (now - counter.lastReset >= 60000) {
812
+ counter.authFailures = 0;
813
+ counter.lastReset = now;
814
+ }
815
+
816
+ // Increment counter
817
+ counter.authFailures++;
818
+
819
+ // Update statistics
820
+ this.stats.byIp[ip].authFailures = counter.authFailures;
821
+
822
+ // Check if limit is exceeded
823
+ if (counter.authFailures >= limit) {
824
+ // Block the IP
825
+ this.blockIp(ip);
826
+
827
+ logger.log('warn', `IP ${ip} blocked due to excessive authentication failures (${counter.authFailures}/${limit})`);
828
+
829
+ SecurityLogger.getInstance().logEvent({
830
+ level: SecurityLogLevel.WARN,
831
+ type: SecurityEventType.AUTHENTICATION,
832
+ message: 'IP blocked due to excessive authentication failures',
833
+ ipAddress: ip,
834
+ details: {
835
+ authFailures: counter.authFailures,
836
+ limit
837
+ },
838
+ success: false
839
+ });
840
+
841
+ return true;
842
+ }
843
+
844
+ return false;
845
+ }
846
+
847
+ /**
848
+ * Block an IP address
849
+ * @param ip IP address to block
850
+ * @param duration Override the default block duration (milliseconds)
851
+ */
852
+ public blockIp(ip: string, duration?: number): void {
853
+ if (!this.config.blocks) {
854
+ this.config.blocks = {};
855
+ }
856
+
857
+ // Set block expiry time
858
+ const expiry = Date.now() + (duration || this.config.global.blockDuration || 3600000);
859
+ this.config.blocks[ip] = expiry;
860
+
861
+ // Update statistics
862
+ if (!this.stats.byIp[ip]) {
863
+ this.stats.byIp[ip] = {
864
+ messagesPerMinute: 0,
865
+ totalMessages: 0,
866
+ totalBlocked: 0,
867
+ connections: 0,
868
+ errors: 0,
869
+ authFailures: 0,
870
+ blocked: false
871
+ };
872
+ }
873
+ this.stats.byIp[ip].blocked = true;
874
+ this.stats.currentlyBlocked++;
875
+
876
+ // Emit event
877
+ this.emit('ipBlocked', {
878
+ ip,
879
+ expiry,
880
+ duration: duration || this.config.global.blockDuration
881
+ });
882
+
883
+ logger.log('warn', `IP ${ip} blocked until ${new Date(expiry).toISOString()}`);
884
+ }
885
+
886
+ /**
887
+ * Unblock an IP address
888
+ * @param ip IP address to unblock
889
+ */
890
+ public unblockIp(ip: string): void {
891
+ if (!this.config.blocks) {
892
+ return;
893
+ }
894
+
895
+ // Remove block
896
+ delete this.config.blocks[ip];
897
+
898
+ // Update statistics
899
+ if (this.stats.byIp[ip]) {
900
+ this.stats.byIp[ip].blocked = false;
901
+ this.stats.currentlyBlocked--;
902
+ }
903
+
904
+ // Emit event
905
+ this.emit('ipUnblocked', { ip });
906
+
907
+ logger.log('info', `IP ${ip} unblocked`);
908
+ }
909
+
910
+ /**
911
+ * Check if an IP is blocked
912
+ * @param ip IP address to check
913
+ */
914
+ public isIpBlocked(ip: string): boolean {
915
+ if (!this.config.blocks) {
916
+ return false;
917
+ }
918
+
919
+ // Check if IP is in blocks
920
+ if (!(ip in this.config.blocks)) {
921
+ return false;
922
+ }
923
+
924
+ // Check if block has expired
925
+ const expiry = this.config.blocks[ip];
926
+ if (expiry <= Date.now()) {
927
+ // Remove expired block
928
+ delete this.config.blocks[ip];
929
+
930
+ // Update statistics
931
+ if (this.stats.byIp[ip]) {
932
+ this.stats.byIp[ip].blocked = false;
933
+ this.stats.currentlyBlocked--;
934
+ }
935
+
936
+ return false;
937
+ }
938
+
939
+ return true;
940
+ }
941
+
942
+ /**
943
+ * Get the time until a block is released
944
+ * @param ip IP address
945
+ * @returns Milliseconds until release or 0 if not blocked
946
+ */
947
+ public getBlockReleaseTime(ip: string): number {
948
+ if (!this.config.blocks || !(ip in this.config.blocks)) {
949
+ return 0;
950
+ }
951
+
952
+ const expiry = this.config.blocks[ip];
953
+ const now = Date.now();
954
+
955
+ return expiry > now ? expiry - now : 0;
956
+ }
957
+
958
+ /**
959
+ * Update rate limiter statistics
960
+ */
961
+ private updateStats(): void {
962
+ // Update active counters count
963
+ this.stats.activeCounters = this.counters.size + this.patternCounters.size + this.ipCounters.size;
964
+
965
+ // Emit statistics update
966
+ this.emit('statsUpdated', this.stats);
967
+ }
968
+
969
+ /**
970
+ * Get rate limiter statistics
971
+ */
972
+ public getStats(): IRateLimiterStats {
973
+ return { ...this.stats };
974
+ }
975
+
976
+ /**
977
+ * Update rate limiter configuration
978
+ * @param config New configuration
979
+ */
980
+ public updateConfig(config: Partial<IHierarchicalRateLimits>): void {
981
+ if (config.global) {
982
+ this.config.global = {
983
+ ...this.config.global,
984
+ ...config.global
985
+ };
986
+ }
987
+
988
+ if (config.patterns) {
989
+ this.config.patterns = {
990
+ ...this.config.patterns,
991
+ ...config.patterns
992
+ };
993
+ }
994
+
995
+ if (config.ips) {
996
+ this.config.ips = {
997
+ ...this.config.ips,
998
+ ...config.ips
999
+ };
1000
+ }
1001
+
1002
+ logger.log('info', 'Rate limiter configuration updated');
1003
+ }
1004
+
1005
+ /**
1006
+ * Get configuration for debugging
1007
+ */
1008
+ public getConfig(): IHierarchicalRateLimits {
1009
+ return { ...this.config };
1010
+ }
1011
+
1012
+ /**
1013
+ * Apply domain-specific rate limits
1014
+ * Merges domain limits with existing configuration
1015
+ * @param domain Domain name
1016
+ * @param limits Rate limit configuration for the domain
1017
+ */
1018
+ public applyDomainLimits(domain: string, limits: IRateLimitConfig): void {
1019
+ if (!this.config.domains) {
1020
+ this.config.domains = {};
1021
+ }
1022
+
1023
+ // Merge the limits with any existing domain config
1024
+ this.config.domains[domain] = {
1025
+ ...this.config.domains[domain],
1026
+ ...limits
1027
+ };
1028
+
1029
+ logger.log('info', `Applied rate limits for domain ${domain}:`, limits);
1030
+ }
1031
+
1032
+ /**
1033
+ * Remove domain-specific rate limits
1034
+ * @param domain Domain name
1035
+ */
1036
+ public removeDomainLimits(domain: string): void {
1037
+ if (this.config.domains && this.config.domains[domain]) {
1038
+ delete this.config.domains[domain];
1039
+ // Also remove the counter
1040
+ this.domainCounters.delete(domain);
1041
+ logger.log('info', `Removed rate limits for domain ${domain}`);
1042
+ }
1043
+ }
1044
+
1045
+ /**
1046
+ * Get domain-specific rate limits
1047
+ * @param domain Domain name
1048
+ * @returns Domain rate limit config or undefined
1049
+ */
1050
+ public getDomainLimits(domain: string): IRateLimitConfig | undefined {
1051
+ return this.config.domains?.[domain];
1052
+ }
1053
+ }