@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,1045 @@
1
+ /**
2
+ * SMTP Connection Manager
3
+ * Responsible for managing socket connections to the SMTP server
4
+ */
5
+
6
+ import * as plugins from '../../../plugins.js';
7
+ import type { IConnectionManager, ISmtpServer } from './interfaces.js';
8
+ import { SmtpResponseCode, SMTP_DEFAULTS, SmtpState } from './constants.js';
9
+ import { SmtpLogger } from './utils/logging.js';
10
+ import { adaptiveLogger } from './utils/adaptive-logging.js';
11
+ import { getSocketDetails, formatMultilineResponse } from './utils/helpers.js';
12
+
13
+ /**
14
+ * Manager for SMTP connections
15
+ * Handles connection setup, event listeners, and lifecycle management
16
+ * Provides resource management, connection tracking, and monitoring
17
+ */
18
+ export class ConnectionManager implements IConnectionManager {
19
+ /**
20
+ * Reference to the SMTP server instance
21
+ */
22
+ private smtpServer: ISmtpServer;
23
+
24
+ /**
25
+ * Set of active socket connections
26
+ */
27
+ private activeConnections: Set<plugins.net.Socket | plugins.tls.TLSSocket> = new Set();
28
+
29
+ /**
30
+ * Connection tracking for resource management
31
+ */
32
+ private connectionStats = {
33
+ totalConnections: 0,
34
+ activeConnections: 0,
35
+ peakConnections: 0,
36
+ rejectedConnections: 0,
37
+ closedConnections: 0,
38
+ erroredConnections: 0,
39
+ timedOutConnections: 0
40
+ };
41
+
42
+ /**
43
+ * Per-IP connection tracking for rate limiting
44
+ */
45
+ private ipConnections: Map<string, {
46
+ count: number;
47
+ firstConnection: number;
48
+ lastConnection: number;
49
+ }> = new Map();
50
+
51
+ /**
52
+ * Resource monitoring interval
53
+ */
54
+ private resourceCheckInterval: NodeJS.Timeout | null = null;
55
+
56
+ /**
57
+ * Track cleanup timers so we can clear them
58
+ */
59
+ private cleanupTimers: Set<NodeJS.Timeout> = new Set();
60
+
61
+ /**
62
+ * SMTP server options with enhanced resource controls
63
+ */
64
+ private options: {
65
+ hostname: string;
66
+ maxConnections: number;
67
+ socketTimeout: number;
68
+ maxConnectionsPerIP: number;
69
+ connectionRateLimit: number;
70
+ connectionRateWindow: number;
71
+ bufferSizeLimit: number;
72
+ resourceCheckInterval: number;
73
+ };
74
+
75
+ /**
76
+ * Creates a new connection manager with enhanced resource management
77
+ * @param smtpServer - SMTP server instance
78
+ */
79
+ constructor(smtpServer: ISmtpServer) {
80
+ this.smtpServer = smtpServer;
81
+
82
+ // Get options from server
83
+ const serverOptions = this.smtpServer.getOptions();
84
+
85
+ // Default values for resource management - adjusted for production scalability
86
+ const DEFAULT_MAX_CONNECTIONS_PER_IP = 50; // Increased to support high-concurrency scenarios
87
+ const DEFAULT_CONNECTION_RATE_LIMIT = 200; // Increased for production load handling
88
+ const DEFAULT_CONNECTION_RATE_WINDOW = 60 * 1000; // 60 seconds window
89
+ const DEFAULT_BUFFER_SIZE_LIMIT = 10 * 1024 * 1024; // 10 MB
90
+ const DEFAULT_RESOURCE_CHECK_INTERVAL = 30 * 1000; // 30 seconds
91
+
92
+ this.options = {
93
+ hostname: serverOptions.hostname || SMTP_DEFAULTS.HOSTNAME,
94
+ maxConnections: serverOptions.maxConnections || SMTP_DEFAULTS.MAX_CONNECTIONS,
95
+ socketTimeout: serverOptions.socketTimeout || SMTP_DEFAULTS.SOCKET_TIMEOUT,
96
+ maxConnectionsPerIP: DEFAULT_MAX_CONNECTIONS_PER_IP,
97
+ connectionRateLimit: DEFAULT_CONNECTION_RATE_LIMIT,
98
+ connectionRateWindow: DEFAULT_CONNECTION_RATE_WINDOW,
99
+ bufferSizeLimit: DEFAULT_BUFFER_SIZE_LIMIT,
100
+ resourceCheckInterval: DEFAULT_RESOURCE_CHECK_INTERVAL
101
+ };
102
+
103
+ // Start resource monitoring
104
+ this.startResourceMonitoring();
105
+ }
106
+
107
+ /**
108
+ * Start resource monitoring interval to check resource usage
109
+ */
110
+ private startResourceMonitoring(): void {
111
+ // Clear any existing interval
112
+ if (this.resourceCheckInterval) {
113
+ clearInterval(this.resourceCheckInterval);
114
+ }
115
+
116
+ // Set up new interval
117
+ this.resourceCheckInterval = setInterval(() => {
118
+ this.monitorResourceUsage();
119
+ }, this.options.resourceCheckInterval);
120
+ }
121
+
122
+ /**
123
+ * Monitor resource usage and log statistics
124
+ */
125
+ private monitorResourceUsage(): void {
126
+ // Calculate memory usage
127
+ const memoryUsage = process.memoryUsage();
128
+ const memoryUsageMB = {
129
+ rss: Math.round(memoryUsage.rss / 1024 / 1024),
130
+ heapTotal: Math.round(memoryUsage.heapTotal / 1024 / 1024),
131
+ heapUsed: Math.round(memoryUsage.heapUsed / 1024 / 1024),
132
+ external: Math.round(memoryUsage.external / 1024 / 1024)
133
+ };
134
+
135
+ // Calculate connection rate metrics
136
+ const activeIPs = Array.from(this.ipConnections.entries())
137
+ .filter(([_, data]) => data.count > 0).length;
138
+
139
+ const highVolumeIPs = Array.from(this.ipConnections.entries())
140
+ .filter(([_, data]) => data.count > this.options.connectionRateLimit / 2).length;
141
+
142
+ // Log resource usage with more detailed metrics
143
+ SmtpLogger.info('Resource usage stats', {
144
+ connections: {
145
+ active: this.activeConnections.size,
146
+ total: this.connectionStats.totalConnections,
147
+ peak: this.connectionStats.peakConnections,
148
+ rejected: this.connectionStats.rejectedConnections,
149
+ closed: this.connectionStats.closedConnections,
150
+ errored: this.connectionStats.erroredConnections,
151
+ timedOut: this.connectionStats.timedOutConnections
152
+ },
153
+ memory: memoryUsageMB,
154
+ ipTracking: {
155
+ uniqueIPs: this.ipConnections.size,
156
+ activeIPs: activeIPs,
157
+ highVolumeIPs: highVolumeIPs
158
+ },
159
+ resourceLimits: {
160
+ maxConnections: this.options.maxConnections,
161
+ maxConnectionsPerIP: this.options.maxConnectionsPerIP,
162
+ connectionRateLimit: this.options.connectionRateLimit,
163
+ bufferSizeLimit: Math.round(this.options.bufferSizeLimit / 1024 / 1024) + 'MB'
164
+ }
165
+ });
166
+
167
+ // Check for potential DoS conditions
168
+ if (highVolumeIPs > 3) {
169
+ SmtpLogger.warn(`Potential DoS detected: ${highVolumeIPs} IPs with high connection rates`);
170
+ }
171
+
172
+ // Assess memory usage trends
173
+ if (memoryUsageMB.heapUsed > 500) { // Over 500MB heap used
174
+ SmtpLogger.warn(`High memory usage detected: ${memoryUsageMB.heapUsed}MB heap used`);
175
+ }
176
+
177
+ // Clean up expired IP rate limits and validate resource tracking
178
+ this.cleanupIpRateLimits();
179
+ }
180
+
181
+ /**
182
+ * Clean up expired IP rate limits and perform additional resource monitoring
183
+ */
184
+ private cleanupIpRateLimits(): void {
185
+ const now = Date.now();
186
+ const windowThreshold = now - this.options.connectionRateWindow;
187
+ let activeIps = 0;
188
+ let removedEntries = 0;
189
+
190
+ // Iterate through IP connections and manage entries
191
+ for (const [ip, data] of this.ipConnections.entries()) {
192
+ // If the last connection was before the window threshold + one extra window, remove the entry
193
+ if (data.lastConnection < windowThreshold - this.options.connectionRateWindow) {
194
+ // Remove stale entries to prevent memory growth
195
+ this.ipConnections.delete(ip);
196
+ removedEntries++;
197
+ }
198
+ // If last connection was before the window threshold, reset the count
199
+ else if (data.lastConnection < windowThreshold) {
200
+ if (data.count > 0) {
201
+ // Reset but keep the IP in the map with a zero count
202
+ this.ipConnections.set(ip, {
203
+ count: 0,
204
+ firstConnection: now,
205
+ lastConnection: now
206
+ });
207
+ }
208
+ } else {
209
+ // This IP is still active within the current window
210
+ activeIps++;
211
+ }
212
+ }
213
+
214
+ // Log cleanup activity if significant changes occurred
215
+ if (removedEntries > 0) {
216
+ SmtpLogger.debug(`IP rate limit cleanup: removed ${removedEntries} stale entries, ${this.ipConnections.size} remaining, ${activeIps} active in current window`);
217
+ }
218
+
219
+ // Check for memory leaks in connection tracking
220
+ if (this.activeConnections.size > 0 && this.connectionStats.activeConnections !== this.activeConnections.size) {
221
+ SmtpLogger.warn(`Connection tracking inconsistency detected: stats.active=${this.connectionStats.activeConnections}, actual=${this.activeConnections.size}`);
222
+ // Fix the inconsistency
223
+ this.connectionStats.activeConnections = this.activeConnections.size;
224
+ }
225
+
226
+ // Validate and clean leaked resources if needed
227
+ this.validateResourceTracking();
228
+ }
229
+
230
+ /**
231
+ * Validate and repair resource tracking to prevent leaks
232
+ */
233
+ private validateResourceTracking(): void {
234
+ // Prepare a detailed report if inconsistencies are found
235
+ const inconsistenciesFound = [];
236
+
237
+ // 1. Check active connections count matches activeConnections set size
238
+ if (this.connectionStats.activeConnections !== this.activeConnections.size) {
239
+ inconsistenciesFound.push({
240
+ issue: 'Active connection count mismatch',
241
+ stats: this.connectionStats.activeConnections,
242
+ actual: this.activeConnections.size,
243
+ action: 'Auto-corrected'
244
+ });
245
+ this.connectionStats.activeConnections = this.activeConnections.size;
246
+ }
247
+
248
+ // 2. Check for destroyed sockets in active connections
249
+ let destroyedSocketsCount = 0;
250
+ for (const socket of this.activeConnections) {
251
+ if (socket.destroyed) {
252
+ destroyedSocketsCount++;
253
+ // This should not happen - remove destroyed sockets from tracking
254
+ this.activeConnections.delete(socket);
255
+ }
256
+ }
257
+
258
+ if (destroyedSocketsCount > 0) {
259
+ inconsistenciesFound.push({
260
+ issue: 'Destroyed sockets in active list',
261
+ count: destroyedSocketsCount,
262
+ action: 'Removed from tracking'
263
+ });
264
+ // Update active connections count after cleanup
265
+ this.connectionStats.activeConnections = this.activeConnections.size;
266
+ }
267
+
268
+ // 3. Check for sessions without corresponding active connections
269
+ const sessionCount = this.smtpServer.getSessionManager().getSessionCount();
270
+ if (sessionCount > this.activeConnections.size) {
271
+ inconsistenciesFound.push({
272
+ issue: 'Orphaned sessions',
273
+ sessions: sessionCount,
274
+ connections: this.activeConnections.size,
275
+ action: 'Session cleanup recommended'
276
+ });
277
+ }
278
+
279
+ // If any inconsistencies found, log a detailed report
280
+ if (inconsistenciesFound.length > 0) {
281
+ SmtpLogger.warn('Resource tracking inconsistencies detected and repaired', { inconsistencies: inconsistenciesFound });
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Handle a new connection with resource management
287
+ * @param socket - Client socket
288
+ */
289
+ public async handleNewConnection(socket: plugins.net.Socket): Promise<void> {
290
+ // Update connection stats
291
+ this.connectionStats.totalConnections++;
292
+ this.connectionStats.activeConnections = this.activeConnections.size + 1;
293
+
294
+ if (this.connectionStats.activeConnections > this.connectionStats.peakConnections) {
295
+ this.connectionStats.peakConnections = this.connectionStats.activeConnections;
296
+ }
297
+
298
+ // Get client IP
299
+ const remoteAddress = socket.remoteAddress || '0.0.0.0';
300
+
301
+ // Use UnifiedRateLimiter for connection rate limiting
302
+ const emailServer = this.smtpServer.getEmailServer();
303
+ const rateLimiter = emailServer.getRateLimiter();
304
+
305
+ // Check connection limit with UnifiedRateLimiter
306
+ const connectionResult = rateLimiter.recordConnection(remoteAddress);
307
+ if (!connectionResult.allowed) {
308
+ this.rejectConnection(socket, connectionResult.reason || 'Rate limit exceeded');
309
+ this.connectionStats.rejectedConnections++;
310
+ return;
311
+ }
312
+
313
+ // Still track IP connections locally for cleanup purposes
314
+ this.trackIPConnection(remoteAddress);
315
+
316
+ // Check if maximum global connections reached
317
+ if (this.hasReachedMaxConnections()) {
318
+ this.rejectConnection(socket, 'Too many connections');
319
+ this.connectionStats.rejectedConnections++;
320
+ return;
321
+ }
322
+
323
+ // Add socket to active connections
324
+ this.activeConnections.add(socket);
325
+
326
+ // Set up socket options
327
+ socket.setKeepAlive(true);
328
+ socket.setTimeout(this.options.socketTimeout);
329
+
330
+ // Explicitly set socket buffer sizes to prevent memory issues
331
+ socket.setNoDelay(true); // Disable Nagle's algorithm for better responsiveness
332
+
333
+ // Set limits on socket buffer size if supported by Node.js version
334
+ try {
335
+ // Here we set reasonable buffer limits to prevent memory exhaustion attacks
336
+ const highWaterMark = 64 * 1024; // 64 KB
337
+ // Note: Socket high water mark methods can't be set directly in newer Node.js versions
338
+ // These would need to be set during socket creation or with a different API
339
+ } catch (error) {
340
+ // Ignore errors from older Node.js versions that don't support these methods
341
+ SmtpLogger.debug(`Could not set socket buffer limits: ${error instanceof Error ? error.message : String(error)}`);
342
+ }
343
+
344
+ // Track this IP connection
345
+ this.trackIPConnection(remoteAddress);
346
+
347
+ // Set up event handlers
348
+ this.setupSocketEventHandlers(socket);
349
+
350
+ // Create a session for this connection
351
+ this.smtpServer.getSessionManager().createSession(socket, false);
352
+
353
+ // Log the new connection using adaptive logger
354
+ const socketDetails = getSocketDetails(socket);
355
+ adaptiveLogger.logConnection(socket, 'connect');
356
+
357
+ // Update adaptive logger with current connection count
358
+ adaptiveLogger.updateConnectionCount(this.connectionStats.activeConnections);
359
+
360
+ // Send greeting
361
+ this.sendGreeting(socket);
362
+ }
363
+
364
+ /**
365
+ * Check if an IP has exceeded the rate limit
366
+ * @param ip - Client IP address
367
+ * @returns True if rate limited
368
+ */
369
+ private isIPRateLimited(ip: string): boolean {
370
+ const now = Date.now();
371
+ const ipData = this.ipConnections.get(ip);
372
+
373
+ if (!ipData) {
374
+ return false; // No previous connections
375
+ }
376
+
377
+ // Check if we're within the rate window
378
+ const isWithinWindow = now - ipData.firstConnection <= this.options.connectionRateWindow;
379
+
380
+ // If within window and count exceeds limit, rate limit is applied
381
+ if (isWithinWindow && ipData.count >= this.options.connectionRateLimit) {
382
+ SmtpLogger.warn(`Rate limit exceeded for IP ${ip}: ${ipData.count} connections in ${Math.round((now - ipData.firstConnection) / 1000)}s`);
383
+ return true;
384
+ }
385
+
386
+ return false;
387
+ }
388
+
389
+ /**
390
+ * Track a new connection from an IP
391
+ * @param ip - Client IP address
392
+ */
393
+ private trackIPConnection(ip: string): void {
394
+ const now = Date.now();
395
+ const ipData = this.ipConnections.get(ip);
396
+
397
+ if (!ipData) {
398
+ // First connection from this IP
399
+ this.ipConnections.set(ip, {
400
+ count: 1,
401
+ firstConnection: now,
402
+ lastConnection: now
403
+ });
404
+ } else {
405
+ // Check if we need to reset the window
406
+ if (now - ipData.lastConnection > this.options.connectionRateWindow) {
407
+ // Reset the window
408
+ this.ipConnections.set(ip, {
409
+ count: 1,
410
+ firstConnection: now,
411
+ lastConnection: now
412
+ });
413
+ } else {
414
+ // Increment within the current window
415
+ this.ipConnections.set(ip, {
416
+ count: ipData.count + 1,
417
+ firstConnection: ipData.firstConnection,
418
+ lastConnection: now
419
+ });
420
+ }
421
+ }
422
+ }
423
+
424
+ /**
425
+ * Check if an IP has reached its connection limit
426
+ * @param ip - Client IP address
427
+ * @returns True if limit reached
428
+ */
429
+ private hasReachedIPConnectionLimit(ip: string): boolean {
430
+ let ipConnectionCount = 0;
431
+
432
+ // Count active connections from this IP
433
+ for (const socket of this.activeConnections) {
434
+ if (socket.remoteAddress === ip) {
435
+ ipConnectionCount++;
436
+ }
437
+ }
438
+
439
+ return ipConnectionCount >= this.options.maxConnectionsPerIP;
440
+ }
441
+
442
+ /**
443
+ * Handle a new secure TLS connection with resource management
444
+ * @param socket - Client TLS socket
445
+ */
446
+ public async handleNewSecureConnection(socket: plugins.tls.TLSSocket): Promise<void> {
447
+ // Update connection stats
448
+ this.connectionStats.totalConnections++;
449
+ this.connectionStats.activeConnections = this.activeConnections.size + 1;
450
+
451
+ if (this.connectionStats.activeConnections > this.connectionStats.peakConnections) {
452
+ this.connectionStats.peakConnections = this.connectionStats.activeConnections;
453
+ }
454
+
455
+ // Get client IP
456
+ const remoteAddress = socket.remoteAddress || '0.0.0.0';
457
+
458
+ // Use UnifiedRateLimiter for connection rate limiting
459
+ const emailServer = this.smtpServer.getEmailServer();
460
+ const rateLimiter = emailServer.getRateLimiter();
461
+
462
+ // Check connection limit with UnifiedRateLimiter
463
+ const connectionResult = rateLimiter.recordConnection(remoteAddress);
464
+ if (!connectionResult.allowed) {
465
+ this.rejectConnection(socket, connectionResult.reason || 'Rate limit exceeded');
466
+ this.connectionStats.rejectedConnections++;
467
+ return;
468
+ }
469
+
470
+ // Still track IP connections locally for cleanup purposes
471
+ this.trackIPConnection(remoteAddress);
472
+
473
+ // Check if maximum global connections reached
474
+ if (this.hasReachedMaxConnections()) {
475
+ this.rejectConnection(socket, 'Too many connections');
476
+ this.connectionStats.rejectedConnections++;
477
+ return;
478
+ }
479
+
480
+ // Add socket to active connections
481
+ this.activeConnections.add(socket);
482
+
483
+ // Set up socket options
484
+ socket.setKeepAlive(true);
485
+ socket.setTimeout(this.options.socketTimeout);
486
+
487
+ // Explicitly set socket buffer sizes to prevent memory issues
488
+ socket.setNoDelay(true); // Disable Nagle's algorithm for better responsiveness
489
+
490
+ // Set limits on socket buffer size if supported by Node.js version
491
+ try {
492
+ // Here we set reasonable buffer limits to prevent memory exhaustion attacks
493
+ const highWaterMark = 64 * 1024; // 64 KB
494
+ // Note: Socket high water mark methods can't be set directly in newer Node.js versions
495
+ // These would need to be set during socket creation or with a different API
496
+ } catch (error) {
497
+ // Ignore errors from older Node.js versions that don't support these methods
498
+ SmtpLogger.debug(`Could not set socket buffer limits: ${error instanceof Error ? error.message : String(error)}`);
499
+ }
500
+
501
+ // Track this IP connection
502
+ this.trackIPConnection(remoteAddress);
503
+
504
+ // Set up event handlers
505
+ this.setupSocketEventHandlers(socket);
506
+
507
+ // Create a session for this connection
508
+ this.smtpServer.getSessionManager().createSession(socket, true);
509
+
510
+ // Log the new secure connection using adaptive logger
511
+ adaptiveLogger.logConnection(socket, 'connect');
512
+
513
+ // Update adaptive logger with current connection count
514
+ adaptiveLogger.updateConnectionCount(this.connectionStats.activeConnections);
515
+
516
+ // Send greeting
517
+ this.sendGreeting(socket);
518
+ }
519
+
520
+ /**
521
+ * Set up event handlers for a socket with enhanced resource management
522
+ * @param socket - Client socket
523
+ */
524
+ public setupSocketEventHandlers(socket: plugins.net.Socket | plugins.tls.TLSSocket): void {
525
+ // Store existing socket event handlers before adding new ones
526
+ const existingDataHandler = socket.listeners('data')[0] as (...args: any[]) => void;
527
+ const existingCloseHandler = socket.listeners('close')[0] as (...args: any[]) => void;
528
+ const existingErrorHandler = socket.listeners('error')[0] as (...args: any[]) => void;
529
+ const existingTimeoutHandler = socket.listeners('timeout')[0] as (...args: any[]) => void;
530
+
531
+ // Remove existing event handlers if they exist
532
+ if (existingDataHandler) socket.removeListener('data', existingDataHandler);
533
+ if (existingCloseHandler) socket.removeListener('close', existingCloseHandler);
534
+ if (existingErrorHandler) socket.removeListener('error', existingErrorHandler);
535
+ if (existingTimeoutHandler) socket.removeListener('timeout', existingTimeoutHandler);
536
+
537
+ // Data event - process incoming data from the client with resource limits
538
+ let buffer = '';
539
+ let totalBytesReceived = 0;
540
+
541
+ socket.on('data', async (data) => {
542
+ try {
543
+ // Get current session and update activity timestamp
544
+ const session = this.smtpServer.getSessionManager().getSession(socket);
545
+ if (session) {
546
+ this.smtpServer.getSessionManager().updateSessionActivity(session);
547
+ }
548
+
549
+ // Check if we're in DATA receiving mode - handle differently
550
+ if (session && session.state === SmtpState.DATA_RECEIVING) {
551
+ // In DATA mode, pass raw chunks directly to command handler with special marker
552
+ // Don't line-buffer large email content
553
+ try {
554
+ const dataString = data.toString('utf8');
555
+ // Use a special prefix to indicate this is raw data, not a command line
556
+ // CRITICAL FIX: Must await to prevent async pile-up
557
+ await this.smtpServer.getCommandHandler().processCommand(socket, `__RAW_DATA__${dataString}`);
558
+ return;
559
+ } catch (dataError) {
560
+ SmtpLogger.error(`Data handler error during DATA mode: ${dataError instanceof Error ? dataError.message : String(dataError)}`);
561
+ socket.destroy();
562
+ return;
563
+ }
564
+ }
565
+
566
+ // For command mode, continue with line-buffered processing
567
+ // Check buffer size limits to prevent memory attacks
568
+ totalBytesReceived += data.length;
569
+
570
+ if (buffer.length > this.options.bufferSizeLimit) {
571
+ // Buffer is too large, reject the connection
572
+ SmtpLogger.warn(`Buffer size limit exceeded: ${buffer.length} bytes for ${socket.remoteAddress}`);
573
+ this.sendResponse(socket, `${SmtpResponseCode.EXCEEDED_STORAGE} Message too large, disconnecting`);
574
+ socket.destroy();
575
+ return;
576
+ }
577
+
578
+ // Impose a total transfer limit to prevent DoS
579
+ if (totalBytesReceived > this.options.bufferSizeLimit * 2) {
580
+ SmtpLogger.warn(`Total transfer limit exceeded: ${totalBytesReceived} bytes for ${socket.remoteAddress}`);
581
+ this.sendResponse(socket, `${SmtpResponseCode.EXCEEDED_STORAGE} Transfer limit exceeded, disconnecting`);
582
+ socket.destroy();
583
+ return;
584
+ }
585
+
586
+ // Convert buffer to string safely with explicit encoding
587
+ const dataString = data.toString('utf8');
588
+
589
+ // Buffer incoming data
590
+ buffer += dataString;
591
+
592
+ // Process complete lines
593
+ let lineEndPos;
594
+ while ((lineEndPos = buffer.indexOf(SMTP_DEFAULTS.CRLF)) !== -1) {
595
+ // Extract a complete line
596
+ const line = buffer.substring(0, lineEndPos);
597
+ buffer = buffer.substring(lineEndPos + 2); // +2 to skip CRLF
598
+
599
+ // Check line length to prevent extremely long lines
600
+ if (line.length > 4096) { // 4KB line limit is reasonable for SMTP
601
+ SmtpLogger.warn(`Line length limit exceeded: ${line.length} bytes for ${socket.remoteAddress}`);
602
+ this.sendResponse(socket, `${SmtpResponseCode.SYNTAX_ERROR} Line too long, disconnecting`);
603
+ socket.destroy();
604
+ return;
605
+ }
606
+
607
+ // Process non-empty lines
608
+ if (line.length > 0) {
609
+ try {
610
+ // CRITICAL FIX: Must await processCommand to prevent async pile-up
611
+ // This was causing the busy loop with high CPU usage when many empty lines were processed
612
+ await this.smtpServer.getCommandHandler().processCommand(socket, line);
613
+ } catch (error) {
614
+ // Handle any errors in command processing
615
+ SmtpLogger.error(`Command handler error: ${error instanceof Error ? error.message : String(error)}`);
616
+ this.sendResponse(socket, `${SmtpResponseCode.LOCAL_ERROR} Internal server error`);
617
+
618
+ // If there's a severe error, close the connection
619
+ if (error instanceof Error &&
620
+ (error.message.includes('fatal') || error.message.includes('critical'))) {
621
+ socket.destroy();
622
+ return;
623
+ }
624
+ }
625
+ }
626
+ }
627
+
628
+ // If buffer is getting too large without CRLF, it might be a DoS attempt
629
+ if (buffer.length > 10240) { // 10KB is a reasonable limit for a line without CRLF
630
+ SmtpLogger.warn(`Incomplete line too large: ${buffer.length} bytes for ${socket.remoteAddress}`);
631
+ this.sendResponse(socket, `${SmtpResponseCode.SYNTAX_ERROR} Incomplete line too large, disconnecting`);
632
+ socket.destroy();
633
+ }
634
+ } catch (error) {
635
+ // Handle any unexpected errors during data processing
636
+ SmtpLogger.error(`Data handler error: ${error instanceof Error ? error.message : String(error)}`);
637
+ socket.destroy();
638
+ }
639
+ });
640
+
641
+ // Add drain event handler to manage flow control
642
+ socket.on('drain', () => {
643
+ // Socket buffer has been emptied, resume data flow if needed
644
+ if (socket.isPaused()) {
645
+ socket.resume();
646
+ SmtpLogger.debug(`Resumed socket for ${socket.remoteAddress} after drain`);
647
+ }
648
+ });
649
+
650
+ // Close event - clean up when connection is closed
651
+ socket.on('close', (hadError) => {
652
+ this.handleSocketClose(socket, hadError);
653
+ });
654
+
655
+ // Error event - handle socket errors
656
+ socket.on('error', (err) => {
657
+ this.handleSocketError(socket, err);
658
+ });
659
+
660
+ // Timeout event - handle socket timeouts
661
+ socket.on('timeout', () => {
662
+ this.handleSocketTimeout(socket);
663
+ });
664
+ }
665
+
666
+ /**
667
+ * Get the current connection count
668
+ * @returns Number of active connections
669
+ */
670
+ public getConnectionCount(): number {
671
+ return this.activeConnections.size;
672
+ }
673
+
674
+ /**
675
+ * Check if the server has reached the maximum number of connections
676
+ * @returns True if max connections reached
677
+ */
678
+ public hasReachedMaxConnections(): boolean {
679
+ return this.activeConnections.size >= this.options.maxConnections;
680
+ }
681
+
682
+ /**
683
+ * Close all active connections
684
+ */
685
+ public closeAllConnections(): void {
686
+ const connectionCount = this.activeConnections.size;
687
+ if (connectionCount === 0) {
688
+ return;
689
+ }
690
+
691
+ SmtpLogger.info(`Closing all connections (count: ${connectionCount})`);
692
+
693
+ for (const socket of this.activeConnections) {
694
+ try {
695
+ // Send service closing notification
696
+ this.sendServiceClosing(socket);
697
+
698
+ // End the socket gracefully
699
+ socket.end();
700
+
701
+ // Force destroy after a short delay if not already destroyed
702
+ const destroyTimer = setTimeout(() => {
703
+ if (!socket.destroyed) {
704
+ socket.destroy();
705
+ }
706
+ this.cleanupTimers.delete(destroyTimer);
707
+ }, 100);
708
+ this.cleanupTimers.add(destroyTimer);
709
+ } catch (error) {
710
+ SmtpLogger.error(`Error closing connection: ${error instanceof Error ? error.message : String(error)}`);
711
+ // Force destroy on error
712
+ try {
713
+ socket.destroy();
714
+ } catch (e) {
715
+ // Ignore destroy errors
716
+ }
717
+ }
718
+ }
719
+
720
+ // Clear active connections
721
+ this.activeConnections.clear();
722
+
723
+ // Stop resource monitoring to prevent hanging timers
724
+ if (this.resourceCheckInterval) {
725
+ clearInterval(this.resourceCheckInterval);
726
+ this.resourceCheckInterval = null;
727
+ }
728
+ }
729
+
730
+ /**
731
+ * Handle socket close event
732
+ * @param socket - Client socket
733
+ * @param hadError - Whether the socket was closed due to error
734
+ */
735
+ private handleSocketClose(socket: plugins.net.Socket | plugins.tls.TLSSocket, hadError: boolean): void {
736
+ try {
737
+ // Update connection statistics
738
+ this.connectionStats.closedConnections++;
739
+ this.connectionStats.activeConnections = this.activeConnections.size - 1;
740
+
741
+ // Get socket details for logging
742
+ const socketDetails = getSocketDetails(socket);
743
+ const socketId = `${socketDetails.remoteAddress}:${socketDetails.remotePort}`;
744
+
745
+ // Log with appropriate level based on whether there was an error
746
+ if (hadError) {
747
+ SmtpLogger.warn(`Socket closed with error: ${socketId}`);
748
+ } else {
749
+ SmtpLogger.debug(`Socket closed normally: ${socketId}`);
750
+ }
751
+
752
+ // Get the session before removing it
753
+ const session = this.smtpServer.getSessionManager().getSession(socket);
754
+
755
+ // Remove from active connections
756
+ this.activeConnections.delete(socket);
757
+
758
+ // Remove from session manager
759
+ this.smtpServer.getSessionManager().removeSession(socket);
760
+
761
+ // Cancel any timeout ID stored in the session
762
+ if (session?.dataTimeoutId) {
763
+ clearTimeout(session.dataTimeoutId);
764
+ }
765
+
766
+ // Log connection close with session details if available
767
+ adaptiveLogger.logConnection(socket, 'close', session);
768
+
769
+ // Update adaptive logger with new connection count
770
+ adaptiveLogger.updateConnectionCount(this.connectionStats.activeConnections);
771
+ } catch (error) {
772
+ // Handle any unexpected errors during cleanup
773
+ SmtpLogger.error(`Error in handleSocketClose: ${error instanceof Error ? error.message : String(error)}`);
774
+
775
+ // Ensure socket is removed from active connections even if an error occurs
776
+ this.activeConnections.delete(socket);
777
+ }
778
+ }
779
+
780
+ /**
781
+ * Handle socket error event
782
+ * @param socket - Client socket
783
+ * @param error - Error object
784
+ */
785
+ private handleSocketError(socket: plugins.net.Socket | plugins.tls.TLSSocket, error: Error): void {
786
+ try {
787
+ // Update connection statistics
788
+ this.connectionStats.erroredConnections++;
789
+
790
+ // Get socket details for context
791
+ const socketDetails = getSocketDetails(socket);
792
+ const socketId = `${socketDetails.remoteAddress}:${socketDetails.remotePort}`;
793
+
794
+ // Get the session
795
+ const session = this.smtpServer.getSessionManager().getSession(socket);
796
+
797
+ // Detailed error logging with context information
798
+ SmtpLogger.error(`Socket error for ${socketId}: ${error.message}`, {
799
+ errorCode: (error as any).code,
800
+ errorStack: error.stack,
801
+ sessionId: session?.id,
802
+ sessionState: session?.state,
803
+ remoteAddress: socketDetails.remoteAddress,
804
+ remotePort: socketDetails.remotePort
805
+ });
806
+
807
+ // Log the error for connection tracking using adaptive logger
808
+ adaptiveLogger.logConnection(socket, 'error', session, error);
809
+
810
+ // Cancel any timeout ID stored in the session
811
+ if (session?.dataTimeoutId) {
812
+ clearTimeout(session.dataTimeoutId);
813
+ }
814
+
815
+ // Close the socket if not already closed
816
+ if (!socket.destroyed) {
817
+ socket.destroy();
818
+ }
819
+
820
+ // Remove from active connections (cleanup after error)
821
+ this.activeConnections.delete(socket);
822
+
823
+ // Remove from session manager
824
+ this.smtpServer.getSessionManager().removeSession(socket);
825
+ } catch (handlerError) {
826
+ // Meta-error handling (errors in the error handler)
827
+ SmtpLogger.error(`Error in handleSocketError: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`);
828
+
829
+ // Ensure socket is destroyed and removed from active connections
830
+ if (!socket.destroyed) {
831
+ socket.destroy();
832
+ }
833
+ this.activeConnections.delete(socket);
834
+ }
835
+ }
836
+
837
+ /**
838
+ * Handle socket timeout event
839
+ * @param socket - Client socket
840
+ */
841
+ private handleSocketTimeout(socket: plugins.net.Socket | plugins.tls.TLSSocket): void {
842
+ try {
843
+ // Update connection statistics
844
+ this.connectionStats.timedOutConnections++;
845
+
846
+ // Get socket details for context
847
+ const socketDetails = getSocketDetails(socket);
848
+ const socketId = `${socketDetails.remoteAddress}:${socketDetails.remotePort}`;
849
+
850
+ // Get the session
851
+ const session = this.smtpServer.getSessionManager().getSession(socket);
852
+
853
+ // Get timing information for better debugging
854
+ const now = Date.now();
855
+ const idleTime = session?.lastActivity ? now - session.lastActivity : 'unknown';
856
+
857
+ if (session) {
858
+ // Log the timeout with extended details
859
+ SmtpLogger.warn(`Socket timeout from ${session.remoteAddress}`, {
860
+ sessionId: session.id,
861
+ remoteAddress: session.remoteAddress,
862
+ state: session.state,
863
+ timeout: this.options.socketTimeout,
864
+ idleTime: idleTime,
865
+ emailState: session.envelope?.mailFrom ? 'has-sender' : 'no-sender',
866
+ recipientCount: session.envelope?.rcptTo?.length || 0
867
+ });
868
+
869
+ // Cancel any timeout ID stored in the session
870
+ if (session.dataTimeoutId) {
871
+ clearTimeout(session.dataTimeoutId);
872
+ }
873
+
874
+ // Send timeout notification to client
875
+ this.sendResponse(socket, `${SmtpResponseCode.SERVICE_NOT_AVAILABLE} Connection timeout - closing connection`);
876
+ } else {
877
+ // Log timeout without session context
878
+ SmtpLogger.warn(`Socket timeout without session from ${socketId}`);
879
+ }
880
+
881
+ // Close the socket gracefully
882
+ try {
883
+ socket.end();
884
+
885
+ // Set a forced close timeout in case socket.end() doesn't close the connection
886
+ const timeoutDestroyTimer = setTimeout(() => {
887
+ if (!socket.destroyed) {
888
+ SmtpLogger.warn(`Forcing destroy of timed out socket: ${socketId}`);
889
+ socket.destroy();
890
+ }
891
+ this.cleanupTimers.delete(timeoutDestroyTimer);
892
+ }, 5000); // 5 second grace period for socket to end properly
893
+ this.cleanupTimers.add(timeoutDestroyTimer);
894
+ } catch (error) {
895
+ SmtpLogger.error(`Error ending timed out socket: ${error instanceof Error ? error.message : String(error)}`);
896
+
897
+ // Ensure socket is destroyed even if end() fails
898
+ if (!socket.destroyed) {
899
+ socket.destroy();
900
+ }
901
+ }
902
+
903
+ // Clean up resources
904
+ this.activeConnections.delete(socket);
905
+ this.smtpServer.getSessionManager().removeSession(socket);
906
+ } catch (handlerError) {
907
+ // Handle any unexpected errors during timeout handling
908
+ SmtpLogger.error(`Error in handleSocketTimeout: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`);
909
+
910
+ // Ensure socket is destroyed and removed from tracking
911
+ if (!socket.destroyed) {
912
+ socket.destroy();
913
+ }
914
+ this.activeConnections.delete(socket);
915
+ }
916
+ }
917
+
918
+ /**
919
+ * Reject a connection
920
+ * @param socket - Client socket
921
+ * @param reason - Reason for rejection
922
+ */
923
+ private rejectConnection(socket: plugins.net.Socket | plugins.tls.TLSSocket, reason: string): void {
924
+ // Log the rejection
925
+ const socketDetails = getSocketDetails(socket);
926
+ SmtpLogger.warn(`Connection rejected from ${socketDetails.remoteAddress}:${socketDetails.remotePort}: ${reason}`);
927
+
928
+ // Send rejection message
929
+ this.sendResponse(socket, `${SmtpResponseCode.SERVICE_NOT_AVAILABLE} ${this.options.hostname} Service temporarily unavailable - ${reason}`);
930
+
931
+ // Close the socket
932
+ try {
933
+ socket.end();
934
+ } catch (error) {
935
+ SmtpLogger.error(`Error ending rejected socket: ${error instanceof Error ? error.message : String(error)}`);
936
+ }
937
+ }
938
+
939
+ /**
940
+ * Send greeting message
941
+ * @param socket - Client socket
942
+ */
943
+ private sendGreeting(socket: plugins.net.Socket | plugins.tls.TLSSocket): void {
944
+ const greeting = `${SmtpResponseCode.SERVICE_READY} ${this.options.hostname} ESMTP service ready`;
945
+ this.sendResponse(socket, greeting);
946
+ }
947
+
948
+ /**
949
+ * Send service closing notification
950
+ * @param socket - Client socket
951
+ */
952
+ private sendServiceClosing(socket: plugins.net.Socket | plugins.tls.TLSSocket): void {
953
+ const message = `${SmtpResponseCode.SERVICE_CLOSING} ${this.options.hostname} Service closing transmission channel`;
954
+ this.sendResponse(socket, message);
955
+ }
956
+
957
+ /**
958
+ * Send response to client
959
+ * @param socket - Client socket
960
+ * @param response - Response to send
961
+ */
962
+ private sendResponse(socket: plugins.net.Socket | plugins.tls.TLSSocket, response: string): void {
963
+ // Check if socket is still writable before attempting to write
964
+ if (socket.destroyed || socket.readyState !== 'open' || !socket.writable) {
965
+ SmtpLogger.debug(`Skipping response to closed/destroyed socket: ${response}`, {
966
+ remoteAddress: socket.remoteAddress,
967
+ remotePort: socket.remotePort,
968
+ destroyed: socket.destroyed,
969
+ readyState: socket.readyState,
970
+ writable: socket.writable
971
+ });
972
+ return;
973
+ }
974
+
975
+ try {
976
+ socket.write(`${response}${SMTP_DEFAULTS.CRLF}`);
977
+ adaptiveLogger.logResponse(response, socket);
978
+ } catch (error) {
979
+ // Log error and destroy socket
980
+ SmtpLogger.error(`Error sending response: ${error instanceof Error ? error.message : String(error)}`, {
981
+ response,
982
+ remoteAddress: socket.remoteAddress,
983
+ remotePort: socket.remotePort,
984
+ error: error instanceof Error ? error : new Error(String(error))
985
+ });
986
+
987
+ socket.destroy();
988
+ }
989
+ }
990
+
991
+ /**
992
+ * Handle a new connection (interface requirement)
993
+ */
994
+ public async handleConnection(socket: plugins.net.Socket | plugins.tls.TLSSocket, secure: boolean): Promise<void> {
995
+ if (secure) {
996
+ this.handleNewSecureConnection(socket as plugins.tls.TLSSocket);
997
+ } else {
998
+ this.handleNewConnection(socket as plugins.net.Socket);
999
+ }
1000
+ }
1001
+
1002
+ /**
1003
+ * Check if accepting new connections (interface requirement)
1004
+ */
1005
+ public canAcceptConnection(): boolean {
1006
+ return !this.hasReachedMaxConnections();
1007
+ }
1008
+
1009
+ /**
1010
+ * Clean up resources
1011
+ */
1012
+ public destroy(): void {
1013
+ // Clear resource monitoring interval
1014
+ if (this.resourceCheckInterval) {
1015
+ clearInterval(this.resourceCheckInterval);
1016
+ this.resourceCheckInterval = null;
1017
+ }
1018
+
1019
+ // Clear all cleanup timers
1020
+ for (const timer of this.cleanupTimers) {
1021
+ clearTimeout(timer);
1022
+ }
1023
+ this.cleanupTimers.clear();
1024
+
1025
+ // Close all active connections
1026
+ this.closeAllConnections();
1027
+
1028
+ // Clear maps
1029
+ this.activeConnections.clear();
1030
+ this.ipConnections.clear();
1031
+
1032
+ // Reset connection stats
1033
+ this.connectionStats = {
1034
+ totalConnections: 0,
1035
+ activeConnections: 0,
1036
+ peakConnections: 0,
1037
+ rejectedConnections: 0,
1038
+ closedConnections: 0,
1039
+ erroredConnections: 0,
1040
+ timedOutConnections: 0
1041
+ };
1042
+
1043
+ SmtpLogger.debug('ConnectionManager destroyed');
1044
+ }
1045
+ }