@serve.zone/dcrouter 2.12.4 → 5.0.3

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