@serve.zone/dcrouter 2.12.4 → 5.0.2
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.
- package/.playwright-mcp/dcrouter-scrollbar-issue.png +0 -0
- package/.playwright-mcp/page-2026-02-01T23-10-23-737Z.png +0 -0
- package/.playwright-mcp/page-2026-02-01T23-11-19-449Z.png +0 -0
- package/.playwright-mcp/page-2026-02-01T23-12-03-126Z.png +0 -0
- package/.playwright-mcp/page-2026-02-01T23-12-15-576Z.png +0 -0
- package/changelog.md +103 -0
- package/npmextra.json +36 -2
- package/package.json +60 -46
- package/readme.hints.md +537 -670
- package/readme.md +659 -937
- package/test/test.contentscanner.ts +1 -1
- package/test/test.dcrouter.email.ts +70 -112
- package/test/test.dns-socket-handler.ts +75 -96
- package/test/test.errors.ts +3 -137
- package/test/test.jwt-auth.ts +1 -0
- package/test/test.opsserver-api.ts +1 -0
- package/test/test.protected-endpoint.ts +43 -38
- package/test_watch/devserver.ts +35 -0
- package/ts/00_commitinfo_data.ts +3 -3
- package/ts/cache/classes.cache.cleaner.ts +166 -0
- package/ts/cache/classes.cached.document.ts +111 -0
- package/ts/cache/classes.cachedb.ts +154 -0
- package/ts/cache/documents/classes.cached.email.ts +240 -0
- package/ts/cache/documents/classes.cached.ip.reputation.ts +247 -0
- package/ts/cache/documents/index.ts +2 -0
- package/ts/cache/index.ts +7 -0
- package/ts/classes.dcrouter.ts +229 -162
- package/ts/errors/index.ts +0 -2
- package/ts/index.ts +8 -2
- package/ts/monitoring/classes.metricscache.ts +75 -0
- package/ts/monitoring/classes.metricsmanager.ts +522 -0
- package/ts/monitoring/index.ts +1 -0
- package/ts/opsserver/classes.opsserver.ts +5 -1
- package/ts/opsserver/handlers/admin.handler.ts +1 -1
- package/ts/opsserver/handlers/config.handler.ts +16 -58
- package/ts/opsserver/handlers/email-ops.handler.ts +318 -0
- package/ts/opsserver/handlers/index.ts +3 -1
- package/ts/opsserver/handlers/radius.handler.ts +405 -0
- package/ts/opsserver/handlers/security.handler.ts +115 -6
- package/ts/opsserver/handlers/stats.handler.ts +177 -18
- package/ts/paths.ts +9 -9
- package/ts/plugins.ts +73 -11
- package/ts/radius/classes.accounting.manager.ts +607 -0
- package/ts/radius/classes.radius.server.ts +532 -0
- package/ts/radius/classes.vlan.manager.ts +363 -0
- package/ts/radius/index.ts +14 -0
- package/ts/security/classes.contentscanner.ts +2 -2
- package/ts/security/classes.ipreputationchecker.ts +2 -2
- package/ts/sms/classes.smsservice.ts +7 -9
- package/ts/storage/classes.storagemanager.ts +3 -3
- package/ts_interfaces/data/stats.ts +30 -0
- package/ts_interfaces/readme.md +205 -0
- package/ts_interfaces/requests/combined.stats.ts +25 -0
- package/ts_interfaces/requests/config.ts +1 -18
- package/ts_interfaces/requests/email-ops.ts +239 -0
- package/ts_interfaces/requests/index.ts +4 -1
- package/ts_interfaces/requests/radius.ts +329 -0
- package/ts_web/00_commitinfo_data.ts +3 -3
- package/ts_web/appstate.ts +523 -85
- package/ts_web/elements/index.ts +2 -1
- package/ts_web/elements/ops-dashboard.ts +117 -52
- package/ts_web/elements/ops-view-config.ts +236 -118
- package/ts_web/elements/ops-view-emails.ts +818 -0
- package/ts_web/elements/ops-view-logs.ts +14 -14
- package/ts_web/elements/ops-view-network.ts +580 -0
- package/ts_web/elements/ops-view-overview.ts +196 -110
- package/ts_web/elements/ops-view-security.ts +155 -96
- package/ts_web/elements/shared/ops-sectionheading.ts +1 -5
- package/ts_web/index.ts +4 -0
- package/ts_web/readme.md +211 -0
- package/ts_web/router.ts +181 -0
- package/tsconfig.json +0 -3
- package/dist_ts/00_commitinfo_data.d.ts +0 -8
- package/dist_ts/00_commitinfo_data.js +0 -9
- package/dist_ts/classes.dcrouter.d.ts +0 -238
- package/dist_ts/classes.dcrouter.js +0 -1008
- package/dist_ts/config/index.d.ts +0 -1
- package/dist_ts/config/index.js +0 -3
- package/dist_ts/config/validator.d.ts +0 -104
- package/dist_ts/config/validator.js +0 -152
- package/dist_ts/deliverability/classes.ipwarmupmanager.d.ts +0 -253
- package/dist_ts/deliverability/classes.ipwarmupmanager.js +0 -639
- package/dist_ts/deliverability/classes.senderreputationmonitor.d.ts +0 -300
- package/dist_ts/deliverability/classes.senderreputationmonitor.js +0 -961
- package/dist_ts/deliverability/index.d.ts +0 -2
- package/dist_ts/deliverability/index.js +0 -3
- package/dist_ts/errors/base.errors.d.ts +0 -224
- package/dist_ts/errors/base.errors.js +0 -310
- package/dist_ts/errors/email.errors.d.ts +0 -175
- package/dist_ts/errors/email.errors.js +0 -265
- package/dist_ts/errors/error-handler.d.ts +0 -98
- package/dist_ts/errors/error-handler.js +0 -282
- package/dist_ts/errors/error.codes.d.ts +0 -115
- package/dist_ts/errors/error.codes.js +0 -136
- package/dist_ts/errors/index.d.ts +0 -56
- package/dist_ts/errors/index.js +0 -138
- package/dist_ts/errors/mta.errors.d.ts +0 -259
- package/dist_ts/errors/mta.errors.js +0 -472
- package/dist_ts/errors/reputation.errors.d.ts +0 -183
- package/dist_ts/errors/reputation.errors.js +0 -292
- package/dist_ts/index.d.ts +0 -4
- package/dist_ts/index.js +0 -6
- package/dist_ts/logger.d.ts +0 -17
- package/dist_ts/logger.js +0 -77
- package/dist_ts/mail/core/classes.bouncemanager.d.ts +0 -200
- package/dist_ts/mail/core/classes.bouncemanager.js +0 -778
- package/dist_ts/mail/core/classes.email.d.ts +0 -291
- package/dist_ts/mail/core/classes.email.js +0 -780
- package/dist_ts/mail/core/classes.emailvalidator.d.ts +0 -61
- package/dist_ts/mail/core/classes.emailvalidator.js +0 -182
- package/dist_ts/mail/core/classes.templatemanager.d.ts +0 -95
- package/dist_ts/mail/core/classes.templatemanager.js +0 -239
- package/dist_ts/mail/core/index.d.ts +0 -4
- package/dist_ts/mail/core/index.js +0 -6
- package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +0 -163
- package/dist_ts/mail/delivery/classes.delivery.queue.js +0 -485
- package/dist_ts/mail/delivery/classes.delivery.system.d.ts +0 -186
- package/dist_ts/mail/delivery/classes.delivery.system.js +0 -846
- package/dist_ts/mail/delivery/classes.emailsendjob.d.ts +0 -84
- package/dist_ts/mail/delivery/classes.emailsendjob.js +0 -362
- package/dist_ts/mail/delivery/classes.emailsignjob.d.ts +0 -18
- package/dist_ts/mail/delivery/classes.emailsignjob.js +0 -44
- package/dist_ts/mail/delivery/classes.mta.config.d.ts +0 -22
- package/dist_ts/mail/delivery/classes.mta.config.js +0 -51
- package/dist_ts/mail/delivery/classes.ratelimiter.d.ts +0 -98
- package/dist_ts/mail/delivery/classes.ratelimiter.js +0 -205
- package/dist_ts/mail/delivery/classes.smtp.client.legacy.d.ts +0 -275
- package/dist_ts/mail/delivery/classes.smtp.client.legacy.js +0 -973
- package/dist_ts/mail/delivery/classes.unified.rate.limiter.d.ts +0 -200
- package/dist_ts/mail/delivery/classes.unified.rate.limiter.js +0 -817
- package/dist_ts/mail/delivery/index.d.ts +0 -12
- package/dist_ts/mail/delivery/index.js +0 -18
- package/dist_ts/mail/delivery/interfaces.d.ts +0 -243
- package/dist_ts/mail/delivery/interfaces.js +0 -17
- package/dist_ts/mail/delivery/smtpclient/auth-handler.d.ts +0 -43
- package/dist_ts/mail/delivery/smtpclient/auth-handler.js +0 -188
- package/dist_ts/mail/delivery/smtpclient/command-handler.d.ts +0 -67
- package/dist_ts/mail/delivery/smtpclient/command-handler.js +0 -276
- package/dist_ts/mail/delivery/smtpclient/connection-manager.d.ts +0 -48
- package/dist_ts/mail/delivery/smtpclient/connection-manager.js +0 -238
- package/dist_ts/mail/delivery/smtpclient/constants.d.ts +0 -129
- package/dist_ts/mail/delivery/smtpclient/constants.js +0 -135
- package/dist_ts/mail/delivery/smtpclient/create-client.d.ts +0 -22
- package/dist_ts/mail/delivery/smtpclient/create-client.js +0 -86
- package/dist_ts/mail/delivery/smtpclient/error-handler.d.ts +0 -28
- package/dist_ts/mail/delivery/smtpclient/error-handler.js +0 -110
- package/dist_ts/mail/delivery/smtpclient/index.d.ts +0 -16
- package/dist_ts/mail/delivery/smtpclient/index.js +0 -21
- package/dist_ts/mail/delivery/smtpclient/interfaces.d.ts +0 -183
- package/dist_ts/mail/delivery/smtpclient/interfaces.js +0 -19
- package/dist_ts/mail/delivery/smtpclient/smtp-client.d.ts +0 -58
- package/dist_ts/mail/delivery/smtpclient/smtp-client.js +0 -279
- package/dist_ts/mail/delivery/smtpclient/tls-handler.d.ts +0 -33
- package/dist_ts/mail/delivery/smtpclient/tls-handler.js +0 -202
- package/dist_ts/mail/delivery/smtpclient/utils/helpers.d.ts +0 -77
- package/dist_ts/mail/delivery/smtpclient/utils/helpers.js +0 -196
- package/dist_ts/mail/delivery/smtpclient/utils/logging.d.ts +0 -46
- package/dist_ts/mail/delivery/smtpclient/utils/logging.js +0 -153
- package/dist_ts/mail/delivery/smtpclient/utils/validation.d.ts +0 -38
- package/dist_ts/mail/delivery/smtpclient/utils/validation.js +0 -139
- package/dist_ts/mail/delivery/smtpserver/certificate-utils.d.ts +0 -45
- package/dist_ts/mail/delivery/smtpserver/certificate-utils.js +0 -345
- package/dist_ts/mail/delivery/smtpserver/command-handler.d.ts +0 -156
- package/dist_ts/mail/delivery/smtpserver/command-handler.js +0 -1159
- package/dist_ts/mail/delivery/smtpserver/connection-manager.d.ts +0 -159
- package/dist_ts/mail/delivery/smtpserver/connection-manager.js +0 -894
- package/dist_ts/mail/delivery/smtpserver/constants.d.ts +0 -130
- package/dist_ts/mail/delivery/smtpserver/constants.js +0 -162
- package/dist_ts/mail/delivery/smtpserver/create-server.d.ts +0 -14
- package/dist_ts/mail/delivery/smtpserver/create-server.js +0 -28
- package/dist_ts/mail/delivery/smtpserver/data-handler.d.ts +0 -123
- package/dist_ts/mail/delivery/smtpserver/data-handler.js +0 -1148
- package/dist_ts/mail/delivery/smtpserver/index.d.ts +0 -20
- package/dist_ts/mail/delivery/smtpserver/index.js +0 -27
- package/dist_ts/mail/delivery/smtpserver/interfaces.d.ts +0 -530
- package/dist_ts/mail/delivery/smtpserver/interfaces.js +0 -10
- package/dist_ts/mail/delivery/smtpserver/secure-server.d.ts +0 -15
- package/dist_ts/mail/delivery/smtpserver/secure-server.js +0 -79
- package/dist_ts/mail/delivery/smtpserver/security-handler.d.ts +0 -86
- package/dist_ts/mail/delivery/smtpserver/security-handler.js +0 -234
- package/dist_ts/mail/delivery/smtpserver/session-manager.d.ts +0 -140
- package/dist_ts/mail/delivery/smtpserver/session-manager.js +0 -469
- package/dist_ts/mail/delivery/smtpserver/smtp-server.d.ts +0 -137
- package/dist_ts/mail/delivery/smtpserver/smtp-server.js +0 -666
- package/dist_ts/mail/delivery/smtpserver/starttls-handler.d.ts +0 -21
- package/dist_ts/mail/delivery/smtpserver/starttls-handler.js +0 -207
- package/dist_ts/mail/delivery/smtpserver/tls-handler.d.ts +0 -66
- package/dist_ts/mail/delivery/smtpserver/tls-handler.js +0 -261
- package/dist_ts/mail/delivery/smtpserver/utils/adaptive-logging.d.ts +0 -117
- package/dist_ts/mail/delivery/smtpserver/utils/adaptive-logging.js +0 -411
- package/dist_ts/mail/delivery/smtpserver/utils/helpers.d.ts +0 -78
- package/dist_ts/mail/delivery/smtpserver/utils/helpers.js +0 -208
- package/dist_ts/mail/delivery/smtpserver/utils/logging.d.ts +0 -106
- package/dist_ts/mail/delivery/smtpserver/utils/logging.js +0 -181
- package/dist_ts/mail/delivery/smtpserver/utils/validation.d.ts +0 -69
- package/dist_ts/mail/delivery/smtpserver/utils/validation.js +0 -360
- package/dist_ts/mail/index.d.ts +0 -8
- package/dist_ts/mail/index.js +0 -13
- package/dist_ts/mail/routing/classes.dns.manager.d.ts +0 -65
- package/dist_ts/mail/routing/classes.dns.manager.js +0 -413
- package/dist_ts/mail/routing/classes.dnsmanager.d.ts +0 -165
- package/dist_ts/mail/routing/classes.dnsmanager.js +0 -430
- package/dist_ts/mail/routing/classes.domain.registry.d.ts +0 -54
- package/dist_ts/mail/routing/classes.domain.registry.js +0 -118
- package/dist_ts/mail/routing/classes.email.config.d.ts +0 -64
- package/dist_ts/mail/routing/classes.email.config.js +0 -2
- package/dist_ts/mail/routing/classes.email.router.d.ts +0 -171
- package/dist_ts/mail/routing/classes.email.router.js +0 -491
- package/dist_ts/mail/routing/classes.unified.email.server.d.ts +0 -426
- package/dist_ts/mail/routing/classes.unified.email.server.js +0 -1454
- package/dist_ts/mail/routing/index.d.ts +0 -5
- package/dist_ts/mail/routing/index.js +0 -7
- package/dist_ts/mail/routing/interfaces.d.ts +0 -187
- package/dist_ts/mail/routing/interfaces.js +0 -2
- package/dist_ts/mail/security/classes.dkimcreator.d.ts +0 -68
- package/dist_ts/mail/security/classes.dkimcreator.js +0 -346
- package/dist_ts/mail/security/classes.dkimverifier.d.ts +0 -46
- package/dist_ts/mail/security/classes.dkimverifier.js +0 -317
- package/dist_ts/mail/security/classes.dmarcverifier.d.ts +0 -123
- package/dist_ts/mail/security/classes.dmarcverifier.js +0 -365
- package/dist_ts/mail/security/classes.spfverifier.d.ts +0 -103
- package/dist_ts/mail/security/classes.spfverifier.js +0 -492
- package/dist_ts/mail/security/index.d.ts +0 -4
- package/dist_ts/mail/security/index.js +0 -6
- package/dist_ts/opsserver/classes.opsserver.d.ts +0 -14
- package/dist_ts/opsserver/classes.opsserver.js +0 -37
- package/dist_ts/opsserver/index.d.ts +0 -1
- package/dist_ts/opsserver/index.js +0 -2
- package/dist_ts/paths.d.ts +0 -14
- package/dist_ts/paths.js +0 -39
- package/dist_ts/plugins.d.ts +0 -43
- package/dist_ts/plugins.js +0 -50
- package/dist_ts/security/classes.contentscanner.d.ts +0 -160
- package/dist_ts/security/classes.contentscanner.js +0 -634
- package/dist_ts/security/classes.ipreputationchecker.d.ts +0 -150
- package/dist_ts/security/classes.ipreputationchecker.js +0 -508
- package/dist_ts/security/classes.securitylogger.d.ts +0 -140
- package/dist_ts/security/classes.securitylogger.js +0 -232
- package/dist_ts/security/index.d.ts +0 -3
- package/dist_ts/security/index.js +0 -4
- package/dist_ts/sms/classes.smsservice.d.ts +0 -15
- package/dist_ts/sms/classes.smsservice.js +0 -72
- package/dist_ts/sms/config/sms.config.d.ts +0 -93
- package/dist_ts/sms/config/sms.config.js +0 -2
- package/dist_ts/sms/config/sms.schema.d.ts +0 -5
- package/dist_ts/sms/config/sms.schema.js +0 -121
- package/dist_ts/sms/index.d.ts +0 -1
- package/dist_ts/sms/index.js +0 -2
- package/dist_ts/storage/classes.storagemanager.d.ts +0 -82
- package/dist_ts/storage/classes.storagemanager.js +0 -341
- package/dist_ts/storage/index.d.ts +0 -1
- package/dist_ts/storage/index.js +0 -3
- package/dist_ts/ts/00_commitinfo_data.d.ts +0 -8
- package/dist_ts/ts/00_commitinfo_data.js +0 -9
- package/dist_ts/ts/classes.dcrouter.d.ts +0 -238
- package/dist_ts/ts/classes.dcrouter.js +0 -1008
- package/dist_ts/ts/config/index.d.ts +0 -1
- package/dist_ts/ts/config/index.js +0 -3
- package/dist_ts/ts/config/validator.d.ts +0 -104
- package/dist_ts/ts/config/validator.js +0 -152
- package/dist_ts/ts/deliverability/classes.ipwarmupmanager.d.ts +0 -253
- package/dist_ts/ts/deliverability/classes.ipwarmupmanager.js +0 -639
- package/dist_ts/ts/deliverability/classes.senderreputationmonitor.d.ts +0 -300
- package/dist_ts/ts/deliverability/classes.senderreputationmonitor.js +0 -961
- package/dist_ts/ts/deliverability/index.d.ts +0 -2
- package/dist_ts/ts/deliverability/index.js +0 -3
- package/dist_ts/ts/errors/base.errors.d.ts +0 -224
- package/dist_ts/ts/errors/base.errors.js +0 -310
- package/dist_ts/ts/errors/email.errors.d.ts +0 -175
- package/dist_ts/ts/errors/email.errors.js +0 -265
- package/dist_ts/ts/errors/error-handler.d.ts +0 -98
- package/dist_ts/ts/errors/error-handler.js +0 -282
- package/dist_ts/ts/errors/error.codes.d.ts +0 -115
- package/dist_ts/ts/errors/error.codes.js +0 -136
- package/dist_ts/ts/errors/index.d.ts +0 -56
- package/dist_ts/ts/errors/index.js +0 -138
- package/dist_ts/ts/errors/mta.errors.d.ts +0 -259
- package/dist_ts/ts/errors/mta.errors.js +0 -472
- package/dist_ts/ts/errors/reputation.errors.d.ts +0 -183
- package/dist_ts/ts/errors/reputation.errors.js +0 -292
- package/dist_ts/ts/index.d.ts +0 -4
- package/dist_ts/ts/index.js +0 -6
- package/dist_ts/ts/logger.d.ts +0 -17
- package/dist_ts/ts/logger.js +0 -77
- package/dist_ts/ts/mail/core/classes.bouncemanager.d.ts +0 -200
- package/dist_ts/ts/mail/core/classes.bouncemanager.js +0 -778
- package/dist_ts/ts/mail/core/classes.email.d.ts +0 -291
- package/dist_ts/ts/mail/core/classes.email.js +0 -780
- package/dist_ts/ts/mail/core/classes.emailvalidator.d.ts +0 -61
- package/dist_ts/ts/mail/core/classes.emailvalidator.js +0 -182
- package/dist_ts/ts/mail/core/classes.templatemanager.d.ts +0 -95
- package/dist_ts/ts/mail/core/classes.templatemanager.js +0 -239
- package/dist_ts/ts/mail/core/index.d.ts +0 -4
- package/dist_ts/ts/mail/core/index.js +0 -6
- package/dist_ts/ts/mail/delivery/classes.delivery.queue.d.ts +0 -163
- package/dist_ts/ts/mail/delivery/classes.delivery.queue.js +0 -485
- package/dist_ts/ts/mail/delivery/classes.delivery.system.d.ts +0 -186
- package/dist_ts/ts/mail/delivery/classes.delivery.system.js +0 -846
- package/dist_ts/ts/mail/delivery/classes.emailsendjob.d.ts +0 -84
- package/dist_ts/ts/mail/delivery/classes.emailsendjob.js +0 -362
- package/dist_ts/ts/mail/delivery/classes.emailsignjob.d.ts +0 -18
- package/dist_ts/ts/mail/delivery/classes.emailsignjob.js +0 -44
- package/dist_ts/ts/mail/delivery/classes.mta.config.d.ts +0 -22
- package/dist_ts/ts/mail/delivery/classes.mta.config.js +0 -51
- package/dist_ts/ts/mail/delivery/classes.ratelimiter.d.ts +0 -98
- package/dist_ts/ts/mail/delivery/classes.ratelimiter.js +0 -205
- package/dist_ts/ts/mail/delivery/classes.smtp.client.legacy.d.ts +0 -275
- package/dist_ts/ts/mail/delivery/classes.smtp.client.legacy.js +0 -973
- package/dist_ts/ts/mail/delivery/classes.unified.rate.limiter.d.ts +0 -200
- package/dist_ts/ts/mail/delivery/classes.unified.rate.limiter.js +0 -817
- package/dist_ts/ts/mail/delivery/index.d.ts +0 -12
- package/dist_ts/ts/mail/delivery/index.js +0 -18
- package/dist_ts/ts/mail/delivery/interfaces.d.ts +0 -243
- package/dist_ts/ts/mail/delivery/interfaces.js +0 -17
- package/dist_ts/ts/mail/delivery/smtpclient/auth-handler.d.ts +0 -43
- package/dist_ts/ts/mail/delivery/smtpclient/auth-handler.js +0 -188
- package/dist_ts/ts/mail/delivery/smtpclient/command-handler.d.ts +0 -67
- package/dist_ts/ts/mail/delivery/smtpclient/command-handler.js +0 -276
- package/dist_ts/ts/mail/delivery/smtpclient/connection-manager.d.ts +0 -48
- package/dist_ts/ts/mail/delivery/smtpclient/connection-manager.js +0 -238
- package/dist_ts/ts/mail/delivery/smtpclient/constants.d.ts +0 -129
- package/dist_ts/ts/mail/delivery/smtpclient/constants.js +0 -135
- package/dist_ts/ts/mail/delivery/smtpclient/create-client.d.ts +0 -22
- package/dist_ts/ts/mail/delivery/smtpclient/create-client.js +0 -86
- package/dist_ts/ts/mail/delivery/smtpclient/error-handler.d.ts +0 -28
- package/dist_ts/ts/mail/delivery/smtpclient/error-handler.js +0 -110
- package/dist_ts/ts/mail/delivery/smtpclient/index.d.ts +0 -16
- package/dist_ts/ts/mail/delivery/smtpclient/index.js +0 -21
- package/dist_ts/ts/mail/delivery/smtpclient/interfaces.d.ts +0 -183
- package/dist_ts/ts/mail/delivery/smtpclient/interfaces.js +0 -19
- package/dist_ts/ts/mail/delivery/smtpclient/smtp-client.d.ts +0 -58
- package/dist_ts/ts/mail/delivery/smtpclient/smtp-client.js +0 -279
- package/dist_ts/ts/mail/delivery/smtpclient/tls-handler.d.ts +0 -33
- package/dist_ts/ts/mail/delivery/smtpclient/tls-handler.js +0 -202
- package/dist_ts/ts/mail/delivery/smtpclient/utils/helpers.d.ts +0 -77
- package/dist_ts/ts/mail/delivery/smtpclient/utils/helpers.js +0 -196
- package/dist_ts/ts/mail/delivery/smtpclient/utils/logging.d.ts +0 -46
- package/dist_ts/ts/mail/delivery/smtpclient/utils/logging.js +0 -153
- package/dist_ts/ts/mail/delivery/smtpclient/utils/validation.d.ts +0 -38
- package/dist_ts/ts/mail/delivery/smtpclient/utils/validation.js +0 -139
- package/dist_ts/ts/mail/delivery/smtpserver/certificate-utils.d.ts +0 -45
- package/dist_ts/ts/mail/delivery/smtpserver/certificate-utils.js +0 -345
- package/dist_ts/ts/mail/delivery/smtpserver/command-handler.d.ts +0 -156
- package/dist_ts/ts/mail/delivery/smtpserver/command-handler.js +0 -1159
- package/dist_ts/ts/mail/delivery/smtpserver/connection-manager.d.ts +0 -159
- package/dist_ts/ts/mail/delivery/smtpserver/connection-manager.js +0 -894
- package/dist_ts/ts/mail/delivery/smtpserver/constants.d.ts +0 -130
- package/dist_ts/ts/mail/delivery/smtpserver/constants.js +0 -162
- package/dist_ts/ts/mail/delivery/smtpserver/create-server.d.ts +0 -14
- package/dist_ts/ts/mail/delivery/smtpserver/create-server.js +0 -28
- package/dist_ts/ts/mail/delivery/smtpserver/data-handler.d.ts +0 -123
- package/dist_ts/ts/mail/delivery/smtpserver/data-handler.js +0 -1148
- package/dist_ts/ts/mail/delivery/smtpserver/index.d.ts +0 -20
- package/dist_ts/ts/mail/delivery/smtpserver/index.js +0 -27
- package/dist_ts/ts/mail/delivery/smtpserver/interfaces.d.ts +0 -530
- package/dist_ts/ts/mail/delivery/smtpserver/interfaces.js +0 -10
- package/dist_ts/ts/mail/delivery/smtpserver/secure-server.d.ts +0 -15
- package/dist_ts/ts/mail/delivery/smtpserver/secure-server.js +0 -79
- package/dist_ts/ts/mail/delivery/smtpserver/security-handler.d.ts +0 -86
- package/dist_ts/ts/mail/delivery/smtpserver/security-handler.js +0 -234
- package/dist_ts/ts/mail/delivery/smtpserver/session-manager.d.ts +0 -140
- package/dist_ts/ts/mail/delivery/smtpserver/session-manager.js +0 -469
- package/dist_ts/ts/mail/delivery/smtpserver/smtp-server.d.ts +0 -137
- package/dist_ts/ts/mail/delivery/smtpserver/smtp-server.js +0 -666
- package/dist_ts/ts/mail/delivery/smtpserver/starttls-handler.d.ts +0 -21
- package/dist_ts/ts/mail/delivery/smtpserver/starttls-handler.js +0 -207
- package/dist_ts/ts/mail/delivery/smtpserver/tls-handler.d.ts +0 -66
- package/dist_ts/ts/mail/delivery/smtpserver/tls-handler.js +0 -261
- package/dist_ts/ts/mail/delivery/smtpserver/utils/adaptive-logging.d.ts +0 -117
- package/dist_ts/ts/mail/delivery/smtpserver/utils/adaptive-logging.js +0 -411
- package/dist_ts/ts/mail/delivery/smtpserver/utils/helpers.d.ts +0 -78
- package/dist_ts/ts/mail/delivery/smtpserver/utils/helpers.js +0 -208
- package/dist_ts/ts/mail/delivery/smtpserver/utils/logging.d.ts +0 -106
- package/dist_ts/ts/mail/delivery/smtpserver/utils/logging.js +0 -181
- package/dist_ts/ts/mail/delivery/smtpserver/utils/validation.d.ts +0 -69
- package/dist_ts/ts/mail/delivery/smtpserver/utils/validation.js +0 -360
- package/dist_ts/ts/mail/index.d.ts +0 -8
- package/dist_ts/ts/mail/index.js +0 -13
- package/dist_ts/ts/mail/routing/classes.dns.manager.d.ts +0 -65
- package/dist_ts/ts/mail/routing/classes.dns.manager.js +0 -413
- package/dist_ts/ts/mail/routing/classes.dnsmanager.d.ts +0 -165
- package/dist_ts/ts/mail/routing/classes.dnsmanager.js +0 -430
- package/dist_ts/ts/mail/routing/classes.domain.registry.d.ts +0 -54
- package/dist_ts/ts/mail/routing/classes.domain.registry.js +0 -118
- package/dist_ts/ts/mail/routing/classes.email.config.d.ts +0 -64
- package/dist_ts/ts/mail/routing/classes.email.config.js +0 -2
- package/dist_ts/ts/mail/routing/classes.email.router.d.ts +0 -171
- package/dist_ts/ts/mail/routing/classes.email.router.js +0 -491
- package/dist_ts/ts/mail/routing/classes.unified.email.server.d.ts +0 -426
- package/dist_ts/ts/mail/routing/classes.unified.email.server.js +0 -1454
- package/dist_ts/ts/mail/routing/index.d.ts +0 -5
- package/dist_ts/ts/mail/routing/index.js +0 -7
- package/dist_ts/ts/mail/routing/interfaces.d.ts +0 -187
- package/dist_ts/ts/mail/routing/interfaces.js +0 -2
- package/dist_ts/ts/mail/security/classes.dkimcreator.d.ts +0 -68
- package/dist_ts/ts/mail/security/classes.dkimcreator.js +0 -346
- package/dist_ts/ts/mail/security/classes.dkimverifier.d.ts +0 -46
- package/dist_ts/ts/mail/security/classes.dkimverifier.js +0 -317
- package/dist_ts/ts/mail/security/classes.dmarcverifier.d.ts +0 -123
- package/dist_ts/ts/mail/security/classes.dmarcverifier.js +0 -365
- package/dist_ts/ts/mail/security/classes.spfverifier.d.ts +0 -103
- package/dist_ts/ts/mail/security/classes.spfverifier.js +0 -492
- package/dist_ts/ts/mail/security/index.d.ts +0 -4
- package/dist_ts/ts/mail/security/index.js +0 -6
- package/dist_ts/ts/opsserver/classes.opsserver.d.ts +0 -20
- package/dist_ts/ts/opsserver/classes.opsserver.js +0 -44
- package/dist_ts/ts/opsserver/handlers/admin.handler.d.ts +0 -31
- package/dist_ts/ts/opsserver/handlers/admin.handler.js +0 -177
- package/dist_ts/ts/opsserver/handlers/config.handler.d.ts +0 -10
- package/dist_ts/ts/opsserver/handlers/config.handler.js +0 -100
- package/dist_ts/ts/opsserver/handlers/index.d.ts +0 -5
- package/dist_ts/ts/opsserver/handlers/index.js +0 -6
- package/dist_ts/ts/opsserver/handlers/logs.handler.d.ts +0 -10
- package/dist_ts/ts/opsserver/handlers/logs.handler.js +0 -121
- package/dist_ts/ts/opsserver/handlers/security.handler.d.ts +0 -11
- package/dist_ts/ts/opsserver/handlers/security.handler.js +0 -118
- package/dist_ts/ts/opsserver/handlers/stats.handler.d.ts +0 -13
- package/dist_ts/ts/opsserver/handlers/stats.handler.js +0 -233
- package/dist_ts/ts/opsserver/helpers/guards.d.ts +0 -25
- package/dist_ts/ts/opsserver/helpers/guards.js +0 -41
- package/dist_ts/ts/opsserver/index.d.ts +0 -1
- package/dist_ts/ts/opsserver/index.js +0 -2
- package/dist_ts/ts/paths.d.ts +0 -14
- package/dist_ts/ts/paths.js +0 -39
- package/dist_ts/ts/plugins.d.ts +0 -46
- package/dist_ts/ts/plugins.js +0 -53
- package/dist_ts/ts/security/classes.contentscanner.d.ts +0 -160
- package/dist_ts/ts/security/classes.contentscanner.js +0 -634
- package/dist_ts/ts/security/classes.ipreputationchecker.d.ts +0 -150
- package/dist_ts/ts/security/classes.ipreputationchecker.js +0 -508
- package/dist_ts/ts/security/classes.securitylogger.d.ts +0 -140
- package/dist_ts/ts/security/classes.securitylogger.js +0 -232
- package/dist_ts/ts/security/index.d.ts +0 -3
- package/dist_ts/ts/security/index.js +0 -4
- package/dist_ts/ts/sms/classes.smsservice.d.ts +0 -15
- package/dist_ts/ts/sms/classes.smsservice.js +0 -72
- package/dist_ts/ts/sms/config/sms.config.d.ts +0 -93
- package/dist_ts/ts/sms/config/sms.config.js +0 -2
- package/dist_ts/ts/sms/config/sms.schema.d.ts +0 -5
- package/dist_ts/ts/sms/config/sms.schema.js +0 -121
- package/dist_ts/ts/sms/index.d.ts +0 -1
- package/dist_ts/ts/sms/index.js +0 -2
- package/dist_ts/ts/storage/classes.storagemanager.d.ts +0 -82
- package/dist_ts/ts/storage/classes.storagemanager.js +0 -341
- package/dist_ts/ts/storage/index.d.ts +0 -1
- package/dist_ts/ts/storage/index.js +0 -3
- package/dist_ts/ts_interfaces/data/auth.d.ts +0 -8
- package/dist_ts/ts_interfaces/data/auth.js +0 -2
- package/dist_ts/ts_interfaces/data/index.d.ts +0 -2
- package/dist_ts/ts_interfaces/data/index.js +0 -3
- package/dist_ts/ts_interfaces/data/stats.d.ts +0 -93
- package/dist_ts/ts_interfaces/data/stats.js +0 -2
- package/dist_ts/ts_interfaces/index.d.ts +0 -5
- package/dist_ts/ts_interfaces/index.js +0 -8
- package/dist_ts/ts_interfaces/plugins.d.ts +0 -2
- package/dist_ts/ts_interfaces/plugins.js +0 -4
- package/dist_ts/ts_interfaces/requests/admin.d.ts +0 -31
- package/dist_ts/ts_interfaces/requests/admin.js +0 -3
- package/dist_ts/ts_interfaces/requests/config.d.ts +0 -25
- package/dist_ts/ts_interfaces/requests/config.js +0 -3
- package/dist_ts/ts_interfaces/requests/index.d.ts +0 -4
- package/dist_ts/ts_interfaces/requests/index.js +0 -5
- package/dist_ts/ts_interfaces/requests/logs.d.ts +0 -34
- package/dist_ts/ts_interfaces/requests/logs.js +0 -4
- package/dist_ts/ts_interfaces/requests/stats.d.ts +0 -131
- package/dist_ts/ts_interfaces/requests/stats.js +0 -4
- package/readme.opsserver.md +0 -351
- package/test/helpers/server.loader.ts +0 -347
- package/test/helpers/smtp.client.ts +0 -209
- package/test/helpers/utils.ts +0 -311
- package/test/suite/smtpclient_commands/test.ccmd-01.ehlo-helo-sending.ts +0 -168
- package/test/suite/smtpclient_commands/test.ccmd-02.mail-from-parameters.ts +0 -277
- package/test/suite/smtpclient_commands/test.ccmd-03.rcpt-to-multiple.ts +0 -283
- package/test/suite/smtpclient_commands/test.ccmd-04.data-transmission.ts +0 -274
- package/test/suite/smtpclient_commands/test.ccmd-05.auth-mechanisms.ts +0 -306
- package/test/suite/smtpclient_commands/test.ccmd-06.command-pipelining.ts +0 -233
- package/test/suite/smtpclient_commands/test.ccmd-07.response-parsing.ts +0 -243
- package/test/suite/smtpclient_commands/test.ccmd-08.rset-command.ts +0 -333
- package/test/suite/smtpclient_commands/test.ccmd-09.noop-command.ts +0 -339
- package/test/suite/smtpclient_commands/test.ccmd-10.vrfy-expn.ts +0 -457
- package/test/suite/smtpclient_commands/test.ccmd-11.help-command.ts +0 -409
- package/test/suite/smtpclient_connection/test.ccm-01.basic-tcp-connection.ts +0 -150
- package/test/suite/smtpclient_connection/test.ccm-02.tls-connection.ts +0 -140
- package/test/suite/smtpclient_connection/test.ccm-03.starttls-upgrade.ts +0 -208
- package/test/suite/smtpclient_connection/test.ccm-04.connection-pooling.ts +0 -250
- package/test/suite/smtpclient_connection/test.ccm-05.connection-reuse.ts +0 -288
- package/test/suite/smtpclient_connection/test.ccm-06.connection-timeout.ts +0 -267
- package/test/suite/smtpclient_connection/test.ccm-07.automatic-reconnection.ts +0 -324
- package/test/suite/smtpclient_connection/test.ccm-08.dns-resolution.ts +0 -139
- package/test/suite/smtpclient_connection/test.ccm-09.ipv6-dual-stack.ts +0 -167
- package/test/suite/smtpclient_connection/test.ccm-10.proxy-support.ts +0 -305
- package/test/suite/smtpclient_connection/test.ccm-11.keepalive.ts +0 -299
- package/test/suite/smtpclient_edge-cases/test.cedge-01.unusual-server-responses.ts +0 -529
- package/test/suite/smtpclient_edge-cases/test.cedge-02.malformed-commands.ts +0 -438
- package/test/suite/smtpclient_edge-cases/test.cedge-03.protocol-violations.ts +0 -446
- package/test/suite/smtpclient_edge-cases/test.cedge-04.resource-constraints.ts +0 -530
- package/test/suite/smtpclient_edge-cases/test.cedge-05.encoding-issues.ts +0 -145
- package/test/suite/smtpclient_edge-cases/test.cedge-06.large-headers.ts +0 -180
- package/test/suite/smtpclient_edge-cases/test.cedge-07.concurrent-operations.ts +0 -204
- package/test/suite/smtpclient_email-composition/test.cep-01.basic-headers.ts +0 -245
- package/test/suite/smtpclient_email-composition/test.cep-02.mime-multipart.ts +0 -321
- package/test/suite/smtpclient_email-composition/test.cep-03.attachment-encoding.ts +0 -334
- package/test/suite/smtpclient_email-composition/test.cep-04.bcc-handling.ts +0 -187
- package/test/suite/smtpclient_email-composition/test.cep-05.reply-to-return-path.ts +0 -277
- package/test/suite/smtpclient_email-composition/test.cep-06.utf8-international.ts +0 -235
- package/test/suite/smtpclient_email-composition/test.cep-07.html-inline-images.ts +0 -489
- package/test/suite/smtpclient_email-composition/test.cep-08.custom-headers.ts +0 -293
- package/test/suite/smtpclient_email-composition/test.cep-09.priority-importance.ts +0 -314
- package/test/suite/smtpclient_email-composition/test.cep-10.receipts-dsn.ts +0 -411
- package/test/suite/smtpclient_error-handling/test.cerr-01.4xx-errors.ts +0 -232
- package/test/suite/smtpclient_error-handling/test.cerr-02.5xx-errors.ts +0 -309
- package/test/suite/smtpclient_error-handling/test.cerr-03.network-failures.ts +0 -299
- package/test/suite/smtpclient_error-handling/test.cerr-04.greylisting-handling.ts +0 -255
- package/test/suite/smtpclient_error-handling/test.cerr-05.quota-exceeded.ts +0 -273
- package/test/suite/smtpclient_error-handling/test.cerr-06.invalid-recipients.ts +0 -320
- package/test/suite/smtpclient_error-handling/test.cerr-07.message-size-limits.ts +0 -320
- package/test/suite/smtpclient_error-handling/test.cerr-08.rate-limiting.ts +0 -261
- package/test/suite/smtpclient_error-handling/test.cerr-09.connection-pool-errors.ts +0 -299
- package/test/suite/smtpclient_error-handling/test.cerr-10.partial-failure.ts +0 -373
- package/test/suite/smtpclient_performance/test.cperf-01.bulk-sending.ts +0 -332
- package/test/suite/smtpclient_performance/test.cperf-02.message-throughput.ts +0 -304
- package/test/suite/smtpclient_performance/test.cperf-03.memory-usage.ts +0 -332
- package/test/suite/smtpclient_performance/test.cperf-04.cpu-utilization.ts +0 -373
- package/test/suite/smtpclient_performance/test.cperf-05.network-efficiency.ts +0 -181
- package/test/suite/smtpclient_performance/test.cperf-06.caching-strategies.ts +0 -190
- package/test/suite/smtpclient_performance/test.cperf-07.queue-management.ts +0 -171
- package/test/suite/smtpclient_performance/test.cperf-08.dns-caching.ts +0 -50
- package/test/suite/smtpclient_reliability/test.crel-01.reconnection-logic.ts +0 -305
- package/test/suite/smtpclient_reliability/test.crel-02.network-interruption.ts +0 -207
- package/test/suite/smtpclient_reliability/test.crel-03.queue-persistence.ts +0 -469
- package/test/suite/smtpclient_reliability/test.crel-04.crash-recovery.ts +0 -520
- package/test/suite/smtpclient_reliability/test.crel-05.memory-leaks.ts +0 -503
- package/test/suite/smtpclient_reliability/test.crel-06.concurrency-safety.ts +0 -558
- package/test/suite/smtpclient_reliability/test.crel-07.resource-cleanup.ts +0 -52
- package/test/suite/smtpclient_rfc-compliance/test.crfc-01.rfc5321-client.ts +0 -283
- package/test/suite/smtpclient_rfc-compliance/test.crfc-02.esmtp-compliance.ts +0 -77
- package/test/suite/smtpclient_rfc-compliance/test.crfc-03.command-syntax.ts +0 -67
- package/test/suite/smtpclient_rfc-compliance/test.crfc-04.response-codes.ts +0 -54
- package/test/suite/smtpclient_rfc-compliance/test.crfc-05.state-machine.ts +0 -703
- package/test/suite/smtpclient_rfc-compliance/test.crfc-06.protocol-negotiation.ts +0 -688
- package/test/suite/smtpclient_rfc-compliance/test.crfc-07.interoperability.ts +0 -728
- package/test/suite/smtpclient_rfc-compliance/test.crfc-08.smtp-extensions.ts +0 -656
- package/test/suite/smtpclient_security/test.csec-01.tls-verification.ts +0 -88
- package/test/suite/smtpclient_security/test.csec-02.oauth2-authentication.ts +0 -132
- package/test/suite/smtpclient_security/test.csec-03.dkim-signing.ts +0 -138
- package/test/suite/smtpclient_security/test.csec-04.spf-compliance.ts +0 -163
- package/test/suite/smtpclient_security/test.csec-05.dmarc-policy.ts +0 -200
- package/test/suite/smtpclient_security/test.csec-06.certificate-validation.ts +0 -145
- package/test/suite/smtpclient_security/test.csec-07.cipher-suites.ts +0 -153
- package/test/suite/smtpclient_security/test.csec-08.authentication-fallback.ts +0 -154
- package/test/suite/smtpclient_security/test.csec-09.relay-restrictions.ts +0 -166
- package/test/suite/smtpclient_security/test.csec-10.anti-spam-measures.ts +0 -196
- package/test/suite/smtpserver_commands/test.cmd-01.ehlo-command.ts +0 -193
- package/test/suite/smtpserver_commands/test.cmd-02.mail-from.ts +0 -330
- package/test/suite/smtpserver_commands/test.cmd-03.rcpt-to.ts +0 -296
- package/test/suite/smtpserver_commands/test.cmd-04.data-command.ts +0 -395
- package/test/suite/smtpserver_commands/test.cmd-05.noop-command.ts +0 -320
- package/test/suite/smtpserver_commands/test.cmd-06.rset-command.ts +0 -399
- package/test/suite/smtpserver_commands/test.cmd-07.vrfy-command.ts +0 -391
- package/test/suite/smtpserver_commands/test.cmd-08.expn-command.ts +0 -450
- package/test/suite/smtpserver_commands/test.cmd-09.size-extension.ts +0 -465
- package/test/suite/smtpserver_commands/test.cmd-10.help-command.ts +0 -454
- package/test/suite/smtpserver_commands/test.cmd-11.command-pipelining.ts +0 -334
- package/test/suite/smtpserver_commands/test.cmd-12.helo-command.ts +0 -420
- package/test/suite/smtpserver_commands/test.cmd-13.quit-command.ts +0 -384
- package/test/suite/smtpserver_connection/test.cm-01.tls-connection.ts +0 -61
- package/test/suite/smtpserver_connection/test.cm-02.multiple-connections.ts +0 -112
- package/test/suite/smtpserver_connection/test.cm-03.connection-timeout.ts +0 -134
- package/test/suite/smtpserver_connection/test.cm-04.connection-limits.ts +0 -374
- package/test/suite/smtpserver_connection/test.cm-05.connection-rejection.ts +0 -296
- package/test/suite/smtpserver_connection/test.cm-06.starttls-upgrade.ts +0 -468
- package/test/suite/smtpserver_connection/test.cm-07.abrupt-disconnection.ts +0 -321
- package/test/suite/smtpserver_connection/test.cm-08.tls-versions.ts +0 -361
- package/test/suite/smtpserver_connection/test.cm-09.tls-ciphers.ts +0 -556
- package/test/suite/smtpserver_connection/test.cm-10.plain-connection.ts +0 -293
- package/test/suite/smtpserver_connection/test.cm-11.keepalive.ts +0 -382
- package/test/suite/smtpserver_edge-cases/test.edge-01.very-large-email.ts +0 -239
- package/test/suite/smtpserver_edge-cases/test.edge-02.very-small-email.ts +0 -389
- package/test/suite/smtpserver_edge-cases/test.edge-03.invalid-character-handling.ts +0 -479
- package/test/suite/smtpserver_edge-cases/test.edge-04.empty-commands.ts +0 -430
- package/test/suite/smtpserver_edge-cases/test.edge-05.extremely-long-lines.ts +0 -425
- package/test/suite/smtpserver_edge-cases/test.edge-06.extremely-long-headers.ts +0 -404
- package/test/suite/smtpserver_edge-cases/test.edge-07.unusual-mime-types.ts +0 -333
- package/test/suite/smtpserver_edge-cases/test.edge-08.nested-mime-structures.ts +0 -379
- package/test/suite/smtpserver_email-processing/test.ep-01.basic-email-sending.ts +0 -338
- package/test/suite/smtpserver_email-processing/test.ep-02.invalid-email-addresses.ts +0 -315
- package/test/suite/smtpserver_email-processing/test.ep-03.multiple-recipients.ts +0 -493
- package/test/suite/smtpserver_email-processing/test.ep-04.large-email.ts +0 -528
- package/test/suite/smtpserver_email-processing/test.ep-05.mime-handling.ts +0 -515
- package/test/suite/smtpserver_email-processing/test.ep-06.attachment-handling.ts +0 -629
- package/test/suite/smtpserver_email-processing/test.ep-07.special-character-handling.ts +0 -462
- package/test/suite/smtpserver_email-processing/test.ep-08.email-routing.ts +0 -527
- package/test/suite/smtpserver_email-processing/test.ep-09.delivery-status-notifications.ts +0 -486
- package/test/suite/smtpserver_error-handling/test.err-01.syntax-errors.ts +0 -475
- package/test/suite/smtpserver_error-handling/test.err-02.invalid-sequence.ts +0 -450
- package/test/suite/smtpserver_error-handling/test.err-03.temporary-failures.ts +0 -453
- package/test/suite/smtpserver_error-handling/test.err-04.permanent-failures.ts +0 -325
- package/test/suite/smtpserver_error-handling/test.err-05.resource-exhaustion.ts +0 -302
- package/test/suite/smtpserver_error-handling/test.err-06.malformed-mime.ts +0 -374
- package/test/suite/smtpserver_error-handling/test.err-07.exception-handling.ts +0 -333
- package/test/suite/smtpserver_error-handling/test.err-08.error-logging.ts +0 -324
- package/test/suite/smtpserver_performance/test.perf-01.throughput.ts +0 -183
- package/test/suite/smtpserver_performance/test.perf-02.concurrency.ts +0 -388
- package/test/suite/smtpserver_performance/test.perf-03.cpu-utilization.ts +0 -245
- package/test/suite/smtpserver_performance/test.perf-04.memory-usage.ts +0 -238
- package/test/suite/smtpserver_performance/test.perf-05.connection-processing-time.ts +0 -363
- package/test/suite/smtpserver_performance/test.perf-06.message-processing-time.ts +0 -252
- package/test/suite/smtpserver_performance/test.perf-07.resource-cleanup.ts +0 -317
- package/test/suite/smtpserver_reliability/test.rel-01.long-running-operation.ts +0 -344
- package/test/suite/smtpserver_reliability/test.rel-02.restart-recovery.ts +0 -328
- package/test/suite/smtpserver_reliability/test.rel-03.resource-leak-detection.ts +0 -394
- package/test/suite/smtpserver_reliability/test.rel-04.error-recovery.ts +0 -401
- package/test/suite/smtpserver_reliability/test.rel-05.dns-resolution-failure.ts +0 -335
- package/test/suite/smtpserver_reliability/test.rel-06.network-interruption.ts +0 -410
- package/test/suite/smtpserver_rfc-compliance/test.rfc-01.rfc5321-compliance.ts +0 -382
- package/test/suite/smtpserver_rfc-compliance/test.rfc-02.rfc5322-compliance.ts +0 -428
- package/test/suite/smtpserver_rfc-compliance/test.rfc-03.rfc7208-spf-compliance.ts +0 -330
- package/test/suite/smtpserver_rfc-compliance/test.rfc-04.rfc6376-dkim-compliance.ts +0 -450
- package/test/suite/smtpserver_rfc-compliance/test.rfc-05.rfc7489-dmarc-compliance.ts +0 -408
- package/test/suite/smtpserver_rfc-compliance/test.rfc-06.rfc8314-tls-compliance.ts +0 -366
- package/test/suite/smtpserver_rfc-compliance/test.rfc-07.rfc3461-dsn-compliance.ts +0 -399
- package/test/suite/smtpserver_security/test.sec-01.authentication.ts +0 -218
- package/test/suite/smtpserver_security/test.sec-02.authorization.ts +0 -286
- package/test/suite/smtpserver_security/test.sec-03.dkim-processing.ts +0 -414
- package/test/suite/smtpserver_security/test.sec-04.spf-checking.ts +0 -280
- package/test/suite/smtpserver_security/test.sec-05.dmarc-policy.ts +0 -374
- package/test/suite/smtpserver_security/test.sec-06.ip-reputation.ts +0 -303
- package/test/suite/smtpserver_security/test.sec-07.content-scanning.ts +0 -409
- package/test/suite/smtpserver_security/test.sec-08.rate-limiting.ts +0 -324
- package/test/suite/smtpserver_security/test.sec-09.tls-certificate-validation.ts +0 -312
- package/test/suite/smtpserver_security/test.sec-10.header-injection-prevention.ts +0 -332
- package/test/suite/smtpserver_security/test.sec-11.bounce-management.ts +0 -363
- package/test/test.base.ts +0 -65
- package/test/test.bouncemanager.ts +0 -196
- package/test/test.deliverability.ts +0 -55
- package/test/test.dns-manager-creation.ts +0 -141
- package/test/test.dns-mode-switching.ts +0 -257
- package/test/test.dns-validation.ts +0 -283
- package/test/test.email-socket-handler.ts +0 -228
- package/test/test.email.integration.ts +0 -377
- package/test/test.email.router.ts +0 -283
- package/test/test.emailauth.ts +0 -195
- package/test/test.integration.storage.ts +0 -313
- package/test/test.integration.ts +0 -75
- package/test/test.ipwarmupmanager.ts +0 -323
- package/test/test.minimal.ts +0 -66
- package/test/test.rate-limiting-integration.ts +0 -236
- package/test/test.ratelimiter.ts +0 -141
- package/test/test.reputationmonitor.ts +0 -262
- package/test/test.smartmail.ts +0 -248
- package/test/test.smtp.client.compatibility.ts +0 -154
- package/test/test.smtp.client.ts +0 -191
- package/test/test.smtp.server.ts +0 -180
- package/test/test.socket-handler-integration.ts +0 -240
- package/test/test.socket-handler-unit.ts +0 -198
- package/ts/deliverability/classes.ipwarmupmanager.ts +0 -896
- package/ts/deliverability/classes.senderreputationmonitor.ts +0 -1244
- package/ts/deliverability/index.ts +0 -13
- package/ts/errors/email.errors.ts +0 -383
- package/ts/errors/mta.errors.ts +0 -681
- package/ts/mail/core/classes.bouncemanager.ts +0 -965
- package/ts/mail/core/classes.email.ts +0 -941
- package/ts/mail/core/classes.emailvalidator.ts +0 -239
- package/ts/mail/core/classes.templatemanager.ts +0 -320
- package/ts/mail/core/index.ts +0 -5
- package/ts/mail/delivery/classes.delivery.queue.ts +0 -645
- package/ts/mail/delivery/classes.delivery.system.ts +0 -1089
- package/ts/mail/delivery/classes.emailsendjob.ts +0 -447
- package/ts/mail/delivery/classes.emailsendjob.ts.backup +0 -691
- package/ts/mail/delivery/classes.emailsignjob.ts +0 -67
- package/ts/mail/delivery/classes.mta.config.ts +0 -73
- package/ts/mail/delivery/classes.ratelimiter.ts +0 -281
- package/ts/mail/delivery/classes.smtp.client.legacy.ts +0 -1422
- package/ts/mail/delivery/classes.unified.rate.limiter.ts +0 -1053
- package/ts/mail/delivery/index.ts +0 -24
- package/ts/mail/delivery/interfaces.ts +0 -291
- package/ts/mail/delivery/smtpclient/auth-handler.ts +0 -232
- package/ts/mail/delivery/smtpclient/command-handler.ts +0 -343
- package/ts/mail/delivery/smtpclient/connection-manager.ts +0 -289
- package/ts/mail/delivery/smtpclient/constants.ts +0 -145
- package/ts/mail/delivery/smtpclient/create-client.ts +0 -94
- package/ts/mail/delivery/smtpclient/error-handler.ts +0 -141
- package/ts/mail/delivery/smtpclient/index.ts +0 -24
- package/ts/mail/delivery/smtpclient/interfaces.ts +0 -242
- package/ts/mail/delivery/smtpclient/smtp-client.ts +0 -357
- package/ts/mail/delivery/smtpclient/tls-handler.ts +0 -254
- package/ts/mail/delivery/smtpclient/utils/helpers.ts +0 -224
- package/ts/mail/delivery/smtpclient/utils/logging.ts +0 -212
- package/ts/mail/delivery/smtpclient/utils/validation.ts +0 -170
- package/ts/mail/delivery/smtpserver/certificate-utils.ts +0 -398
- package/ts/mail/delivery/smtpserver/command-handler.ts +0 -1340
- package/ts/mail/delivery/smtpserver/connection-manager.ts +0 -1045
- package/ts/mail/delivery/smtpserver/constants.ts +0 -181
- package/ts/mail/delivery/smtpserver/create-server.ts +0 -31
- package/ts/mail/delivery/smtpserver/data-handler.ts +0 -1283
- package/ts/mail/delivery/smtpserver/index.ts +0 -32
- package/ts/mail/delivery/smtpserver/interfaces.ts +0 -655
- package/ts/mail/delivery/smtpserver/secure-server.ts +0 -97
- package/ts/mail/delivery/smtpserver/security-handler.ts +0 -345
- package/ts/mail/delivery/smtpserver/session-manager.ts +0 -557
- package/ts/mail/delivery/smtpserver/smtp-server.ts +0 -804
- package/ts/mail/delivery/smtpserver/starttls-handler.ts +0 -262
- package/ts/mail/delivery/smtpserver/tls-handler.ts +0 -346
- package/ts/mail/delivery/smtpserver/utils/adaptive-logging.ts +0 -514
- package/ts/mail/delivery/smtpserver/utils/helpers.ts +0 -246
- package/ts/mail/delivery/smtpserver/utils/logging.ts +0 -246
- package/ts/mail/delivery/smtpserver/utils/validation.ts +0 -436
- package/ts/mail/index.ts +0 -19
- package/ts/mail/routing/classes.dns.manager.ts +0 -563
- package/ts/mail/routing/classes.dnsmanager.ts +0 -559
- package/ts/mail/routing/classes.domain.registry.ts +0 -139
- package/ts/mail/routing/classes.email.config.ts +0 -82
- package/ts/mail/routing/classes.email.router.ts +0 -575
- package/ts/mail/routing/classes.unified.email.server.ts +0 -1873
- package/ts/mail/routing/index.ts +0 -6
- package/ts/mail/routing/interfaces.ts +0 -202
- package/ts/mail/security/classes.dkimcreator.ts +0 -431
- package/ts/mail/security/classes.dkimverifier.ts +0 -382
- package/ts/mail/security/classes.dmarcverifier.ts +0 -478
- package/ts/mail/security/classes.spfverifier.ts +0 -606
- package/ts/mail/security/index.ts +0 -5
- package/ts_web/elements/ops-view-stats.ts +0 -299
package/readme.md
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
# dcrouter
|
|
1
|
+
# @serve.zone/dcrouter
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+

|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**dcrouter: The all-in-one gateway for your datacenter.** 🚀
|
|
6
|
+
|
|
7
|
+
A comprehensive traffic routing solution that provides unified gateway capabilities for HTTP/HTTPS, TCP/SNI, email (SMTP), DNS, and RADIUS protocols. Designed for enterprises requiring robust traffic management, automatic TLS certificate provisioning, and enterprise-grade email infrastructure — all from a single process.
|
|
8
|
+
|
|
9
|
+
## Issue Reporting and Security
|
|
10
|
+
|
|
11
|
+
For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly.
|
|
6
12
|
|
|
7
13
|
## Table of Contents
|
|
8
14
|
|
|
@@ -10,57 +16,79 @@ A comprehensive traffic routing solution that provides unified gateway capabilit
|
|
|
10
16
|
- [Installation](#installation)
|
|
11
17
|
- [Quick Start](#quick-start)
|
|
12
18
|
- [Architecture](#architecture)
|
|
13
|
-
- [Configuration](#configuration)
|
|
19
|
+
- [Configuration Reference](#configuration-reference)
|
|
20
|
+
- [HTTP/HTTPS & TCP/SNI Routing](#httphttps--tcpsni-routing)
|
|
14
21
|
- [Email System](#email-system)
|
|
15
|
-
- [
|
|
22
|
+
- [DNS Server](#dns-server)
|
|
23
|
+
- [RADIUS Server](#radius-server)
|
|
24
|
+
- [Storage & Caching](#storage--caching)
|
|
16
25
|
- [Security Features](#security-features)
|
|
26
|
+
- [OpsServer Dashboard](#opsserver-dashboard)
|
|
17
27
|
- [API Reference](#api-reference)
|
|
18
|
-
- [
|
|
19
|
-
- [
|
|
28
|
+
- [Sub-Modules](#sub-modules)
|
|
29
|
+
- [Testing](#testing)
|
|
30
|
+
- [License and Legal Information](#license-and-legal-information)
|
|
20
31
|
|
|
21
32
|
## Features
|
|
22
33
|
|
|
23
|
-
### 🌐
|
|
24
|
-
- **HTTP/HTTPS routing** with
|
|
25
|
-
- **TCP/SNI proxy** for any protocol with TLS termination
|
|
26
|
-
- **DNS server** with authoritative
|
|
27
|
-
- **Multi-protocol support** on the same infrastructure
|
|
34
|
+
### 🌐 Universal Traffic Router
|
|
35
|
+
- **HTTP/HTTPS routing** with domain matching, path-based forwarding, and automatic TLS
|
|
36
|
+
- **TCP/SNI proxy** for any protocol with TLS termination or passthrough
|
|
37
|
+
- **DNS server** (Rust-powered via [SmartDNS](https://code.foss.global/push.rocks/smartdns)) with authoritative zones, dynamic record management, and DNS-over-HTTPS
|
|
38
|
+
- **Multi-protocol support** on the same infrastructure via [SmartProxy](https://code.foss.global/push.rocks/smartproxy)
|
|
28
39
|
|
|
29
|
-
###
|
|
30
|
-
- **Automatic TLS certificates** via ACME with DNS-01 challenges
|
|
31
|
-
- **IP reputation checking** and real-time threat detection
|
|
32
|
-
- **Content scanning** for spam, viruses, and malicious content
|
|
33
|
-
- **Comprehensive security logging** with correlation tracking
|
|
34
|
-
|
|
35
|
-
### 📧 **Complete Email Infrastructure**
|
|
40
|
+
### 📧 Complete Email Infrastructure (powered by [smartmta](https://code.foss.global/push.rocks/smartmta))
|
|
36
41
|
- **Multi-domain SMTP server** on standard ports (25, 587, 465)
|
|
37
|
-
- **Pattern-based email routing** with
|
|
38
|
-
- **DKIM
|
|
39
|
-
- **Enterprise deliverability** with IP warmup and reputation
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- **
|
|
45
|
-
- **
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
- **
|
|
51
|
-
- **
|
|
42
|
+
- **Pattern-based email routing** with four action types: forward, process, deliver, reject
|
|
43
|
+
- **DKIM signing & verification**, SPF, DMARC authentication stack
|
|
44
|
+
- **Enterprise deliverability** with IP warmup schedules and sender reputation tracking
|
|
45
|
+
- **Bounce handling** with automatic suppression lists
|
|
46
|
+
- **Hierarchical rate limiting** — global, per-domain, per-sender
|
|
47
|
+
|
|
48
|
+
### 🔒 Enterprise Security
|
|
49
|
+
- **Automatic TLS certificates** via ACME with Cloudflare DNS-01 challenges
|
|
50
|
+
- **IP reputation checking** with caching and configurable thresholds
|
|
51
|
+
- **Content scanning** for spam, viruses, and malicious attachments
|
|
52
|
+
- **Security event logging** with structured audit trails
|
|
53
|
+
|
|
54
|
+
### 📡 RADIUS Server
|
|
55
|
+
- **MAC Authentication Bypass (MAB)** for network device authentication
|
|
56
|
+
- **VLAN assignment** based on exact MAC, OUI prefix, or wildcard patterns
|
|
57
|
+
- **RADIUS accounting** for session tracking, traffic metering, and billing
|
|
58
|
+
- **Real-time management** via OpsServer API
|
|
59
|
+
|
|
60
|
+
### ⚡ High Performance
|
|
61
|
+
- **Rust-powered proxy engine** via SmartProxy for maximum throughput
|
|
62
|
+
- **Rust-powered MTA engine** via smartmta (TypeScript + Rust hybrid) for reliable email delivery
|
|
63
|
+
- **Rust-powered DNS engine** via SmartDNS for high-performance UDP and DNS-over-HTTPS
|
|
64
|
+
- **Connection pooling** for outbound SMTP and backend services
|
|
65
|
+
- **Socket-handler mode** — direct socket passing eliminates internal port hops
|
|
66
|
+
- **Real-time metrics** via SmartMetrics (CPU, memory, connections, throughput)
|
|
67
|
+
|
|
68
|
+
### 💾 Persistent Storage & Caching
|
|
69
|
+
- **Multiple storage backends**: filesystem, custom functions, or in-memory
|
|
70
|
+
- **Embedded cache database** via smartdata + LocalTsmDb (MongoDB-compatible)
|
|
71
|
+
- **Automatic TTL-based cleanup** for cached emails and IP reputation data
|
|
72
|
+
|
|
73
|
+
### 🖥️ OpsServer Dashboard
|
|
74
|
+
- **Web-based management interface** with real-time monitoring
|
|
75
|
+
- **JWT authentication** with session persistence
|
|
76
|
+
- **Live views** for connections, email queues, DNS queries, RADIUS sessions, and security events
|
|
77
|
+
- **Read-only configuration display** — DcRouter is configured through code
|
|
52
78
|
|
|
53
79
|
## Installation
|
|
54
80
|
|
|
55
81
|
```bash
|
|
56
|
-
|
|
82
|
+
pnpm add @serve.zone/dcrouter
|
|
83
|
+
# or
|
|
84
|
+
npm install @serve.zone/dcrouter
|
|
57
85
|
```
|
|
58
86
|
|
|
59
87
|
### Prerequisites
|
|
60
88
|
|
|
61
|
-
- Node.js
|
|
62
|
-
- Valid domain with DNS control (for ACME
|
|
63
|
-
- Cloudflare API token (for DNS challenges)
|
|
89
|
+
- **Node.js 20+** with ES module support
|
|
90
|
+
- Valid domain with DNS control (for ACME certificate automation)
|
|
91
|
+
- Cloudflare API token (for DNS-01 challenges) — optional
|
|
64
92
|
|
|
65
93
|
## Quick Start
|
|
66
94
|
|
|
@@ -73,11 +101,11 @@ const router = new DcRouter({
|
|
|
73
101
|
smartProxyConfig: {
|
|
74
102
|
routes: [
|
|
75
103
|
{
|
|
76
|
-
name: 'web-
|
|
77
|
-
match: { domains: ['example.com'], ports: [443] },
|
|
104
|
+
name: 'web-app',
|
|
105
|
+
match: { domains: ['example.com', 'www.example.com'], ports: [443] },
|
|
78
106
|
action: {
|
|
79
107
|
type: 'forward',
|
|
80
|
-
|
|
108
|
+
targets: [{ host: '192.168.1.10', port: 8080 }],
|
|
81
109
|
tls: { mode: 'terminate', certificate: 'auto' }
|
|
82
110
|
}
|
|
83
111
|
}
|
|
@@ -91,10 +119,9 @@ const router = new DcRouter({
|
|
|
91
119
|
});
|
|
92
120
|
|
|
93
121
|
await router.start();
|
|
94
|
-
console.log('DcRouter started successfully');
|
|
95
122
|
```
|
|
96
123
|
|
|
97
|
-
### Basic Email
|
|
124
|
+
### Basic Email Server
|
|
98
125
|
|
|
99
126
|
```typescript
|
|
100
127
|
import { DcRouter } from '@serve.zone/dcrouter';
|
|
@@ -103,30 +130,106 @@ const router = new DcRouter({
|
|
|
103
130
|
emailConfig: {
|
|
104
131
|
ports: [25, 587, 465],
|
|
105
132
|
hostname: 'mail.example.com',
|
|
133
|
+
domains: [
|
|
134
|
+
{
|
|
135
|
+
domain: 'example.com',
|
|
136
|
+
dnsMode: 'external-dns'
|
|
137
|
+
}
|
|
138
|
+
],
|
|
106
139
|
routes: [
|
|
107
140
|
{
|
|
108
|
-
name: '
|
|
141
|
+
name: 'process-all',
|
|
109
142
|
match: { recipients: '*@example.com' },
|
|
110
143
|
action: {
|
|
111
144
|
type: 'process',
|
|
112
|
-
process: {
|
|
113
|
-
scan: true,
|
|
114
|
-
dkim: true,
|
|
115
|
-
queue: 'normal'
|
|
116
|
-
}
|
|
145
|
+
process: { scan: true, dkim: true, queue: 'normal' }
|
|
117
146
|
}
|
|
118
147
|
}
|
|
119
|
-
]
|
|
120
|
-
tls: {
|
|
121
|
-
keyPath: './certs/key.pem',
|
|
122
|
-
certPath: './certs/cert.pem'
|
|
123
|
-
}
|
|
148
|
+
]
|
|
124
149
|
}
|
|
125
150
|
});
|
|
126
151
|
|
|
127
152
|
await router.start();
|
|
128
153
|
```
|
|
129
154
|
|
|
155
|
+
### Full Stack with Dashboard
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { DcRouter } from '@serve.zone/dcrouter';
|
|
159
|
+
|
|
160
|
+
const router = new DcRouter({
|
|
161
|
+
// HTTP/HTTPS routing
|
|
162
|
+
smartProxyConfig: {
|
|
163
|
+
routes: [
|
|
164
|
+
{
|
|
165
|
+
name: 'website',
|
|
166
|
+
match: { domains: ['example.com'], ports: [443] },
|
|
167
|
+
action: {
|
|
168
|
+
type: 'forward',
|
|
169
|
+
targets: [{ host: '192.168.1.10', port: 80 }],
|
|
170
|
+
tls: { mode: 'terminate', certificate: 'auto' }
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
acme: { email: 'ssl@example.com', enabled: true, useProduction: true }
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
// Email system (powered by smartmta)
|
|
178
|
+
emailConfig: {
|
|
179
|
+
ports: [25, 587, 465],
|
|
180
|
+
hostname: 'mail.example.com',
|
|
181
|
+
domains: [{ domain: 'example.com', dnsMode: 'external-dns' }],
|
|
182
|
+
routes: [
|
|
183
|
+
{
|
|
184
|
+
name: 'inbound-mail',
|
|
185
|
+
match: { recipients: '*@example.com' },
|
|
186
|
+
action: { type: 'process', process: { scan: true, dkim: true, queue: 'normal' } }
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
// Authoritative DNS
|
|
192
|
+
dnsNsDomains: ['ns1.example.com', 'ns2.example.com'],
|
|
193
|
+
dnsScopes: ['example.com'],
|
|
194
|
+
publicIp: '203.0.113.1',
|
|
195
|
+
dnsRecords: [
|
|
196
|
+
{ name: 'example.com', type: 'A', value: '203.0.113.1' },
|
|
197
|
+
{ name: 'www.example.com', type: 'CNAME', value: 'example.com' }
|
|
198
|
+
],
|
|
199
|
+
|
|
200
|
+
// RADIUS authentication
|
|
201
|
+
radiusConfig: {
|
|
202
|
+
authPort: 1812,
|
|
203
|
+
acctPort: 1813,
|
|
204
|
+
clients: [
|
|
205
|
+
{ name: 'switch-1', ipRange: '192.168.1.0/24', secret: 'radius-secret', enabled: true }
|
|
206
|
+
],
|
|
207
|
+
vlanAssignment: {
|
|
208
|
+
defaultVlan: 100,
|
|
209
|
+
allowUnknownMacs: true,
|
|
210
|
+
mappings: [
|
|
211
|
+
{ mac: 'aa:bb:cc:dd:ee:ff', vlan: 10, enabled: true },
|
|
212
|
+
{ mac: 'aa:bb:cc', vlan: 20, enabled: true } // OUI prefix
|
|
213
|
+
]
|
|
214
|
+
},
|
|
215
|
+
accounting: { enabled: true, retentionDays: 30 }
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
// Persistent storage
|
|
219
|
+
storage: { fsPath: '/var/lib/dcrouter/data' },
|
|
220
|
+
|
|
221
|
+
// Cache database
|
|
222
|
+
cacheConfig: { enabled: true, storagePath: '/etc/dcrouter/tsmdb' },
|
|
223
|
+
|
|
224
|
+
// TLS & ACME
|
|
225
|
+
tls: { contactEmail: 'admin@example.com' },
|
|
226
|
+
dnsChallenge: { cloudflareApiKey: process.env.CLOUDFLARE_API_KEY }
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
await router.start();
|
|
230
|
+
// OpsServer dashboard available at http://localhost:3000
|
|
231
|
+
```
|
|
232
|
+
|
|
130
233
|
## Architecture
|
|
131
234
|
|
|
132
235
|
### System Overview
|
|
@@ -138,292 +241,272 @@ graph TB
|
|
|
138
241
|
SMTP[SMTP Clients]
|
|
139
242
|
TCP[TCP Clients]
|
|
140
243
|
DNS[DNS Queries]
|
|
244
|
+
RAD[RADIUS Clients]
|
|
141
245
|
end
|
|
142
|
-
|
|
246
|
+
|
|
143
247
|
subgraph "DcRouter Core"
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
248
|
+
DC[DcRouter Orchestrator]
|
|
249
|
+
SP[SmartProxy Engine<br/><i>Rust-powered</i>]
|
|
250
|
+
ES[smartmta Email Server<br/><i>TypeScript + Rust</i>]
|
|
251
|
+
DS[SmartDNS Server<br/><i>Rust-powered</i>]
|
|
252
|
+
RS[SmartRadius Server]
|
|
253
|
+
CM[Certificate Manager]
|
|
254
|
+
OS[OpsServer Dashboard]
|
|
255
|
+
MM[Metrics Manager]
|
|
256
|
+
SM[Storage Manager]
|
|
257
|
+
CD[Cache Database]
|
|
149
258
|
end
|
|
150
|
-
|
|
259
|
+
|
|
151
260
|
subgraph "Backend Services"
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
261
|
+
WEB[Web Services]
|
|
262
|
+
MAIL[Mail Servers]
|
|
263
|
+
DB[Databases]
|
|
264
|
+
API[Internal APIs]
|
|
156
265
|
end
|
|
157
|
-
|
|
158
|
-
HTTP -->
|
|
159
|
-
TCP -->
|
|
160
|
-
SMTP -->
|
|
161
|
-
DNS -->
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
266
|
+
|
|
267
|
+
HTTP --> SP
|
|
268
|
+
TCP --> SP
|
|
269
|
+
SMTP --> ES
|
|
270
|
+
DNS --> DS
|
|
271
|
+
RAD --> RS
|
|
272
|
+
|
|
273
|
+
DC --> SP
|
|
274
|
+
DC --> ES
|
|
275
|
+
DC --> DS
|
|
276
|
+
DC --> RS
|
|
277
|
+
DC --> CM
|
|
278
|
+
DC --> OS
|
|
279
|
+
DC --> MM
|
|
280
|
+
DC --> SM
|
|
281
|
+
DC --> CD
|
|
282
|
+
|
|
283
|
+
SP --> WEB
|
|
284
|
+
SP --> API
|
|
285
|
+
ES --> MAIL
|
|
286
|
+
ES --> DB
|
|
287
|
+
|
|
288
|
+
CM -.-> SP
|
|
289
|
+
CM -.-> ES
|
|
175
290
|
```
|
|
176
291
|
|
|
177
292
|
### Core Components
|
|
178
293
|
|
|
179
|
-
|
|
180
|
-
|
|
294
|
+
| Component | Package | Description |
|
|
295
|
+
|-----------|---------|-------------|
|
|
296
|
+
| **DcRouter** | `@serve.zone/dcrouter` | Central orchestrator — starts, stops, and coordinates all services |
|
|
297
|
+
| **SmartProxy** | `@push.rocks/smartproxy` | High-performance HTTP/HTTPS and TCP/SNI proxy with route-based config (Rust engine) |
|
|
298
|
+
| **UnifiedEmailServer** | `@push.rocks/smartmta` | Full SMTP server with pattern-based routing, DKIM, queue management (TypeScript + Rust) |
|
|
299
|
+
| **DNS Server** | `@push.rocks/smartdns` | Authoritative DNS with dynamic records and DKIM TXT auto-generation (Rust engine) |
|
|
300
|
+
| **RADIUS Server** | `@push.rocks/smartradius` | Network authentication with MAB, VLAN assignment, and accounting |
|
|
301
|
+
| **OpsServer** | `@api.global/typedserver` | Web dashboard + TypedRequest API for monitoring and management |
|
|
302
|
+
| **MetricsManager** | `@push.rocks/smartmetrics` | Real-time metrics collection (CPU, memory, email, DNS, security) |
|
|
303
|
+
| **StorageManager** | built-in | Pluggable key-value storage (filesystem, custom, or in-memory) |
|
|
304
|
+
| **CacheDb** | `@push.rocks/smartdata` | Embedded MongoDB-compatible database (LocalTsmDb) for persistent caching |
|
|
305
|
+
|
|
306
|
+
### How It Works
|
|
181
307
|
|
|
182
|
-
|
|
183
|
-
High-performance HTTP/HTTPS and TCP/SNI proxy with:
|
|
184
|
-
- Pattern-based routing
|
|
185
|
-
- TLS termination/passthrough
|
|
186
|
-
- Load balancing
|
|
187
|
-
- Connection pooling
|
|
308
|
+
DcRouter acts purely as an **orchestrator** — it doesn't implement protocols itself. Instead, it wires together best-in-class packages for each protocol:
|
|
188
309
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
- Pattern-based routing
|
|
193
|
-
- Three processing modes
|
|
194
|
-
- Complete authentication stack
|
|
310
|
+
1. **On `start()`**: DcRouter initializes OpsServer (port 3000), then spins up SmartProxy, smartmta, SmartDNS, and SmartRadius based on which configs are provided.
|
|
311
|
+
2. **During operation**: Each service handles its own protocol independently. SmartProxy uses a Rust-powered engine for maximum throughput. smartmta uses a hybrid TypeScript + Rust architecture for reliable email delivery.
|
|
312
|
+
3. **On `stop()`**: All services are gracefully shut down in reverse order.
|
|
195
313
|
|
|
196
|
-
|
|
197
|
-
Automatic TLS certificate provisioning via ACME with DNS-01 challenges.
|
|
314
|
+
### Rust-Powered Architecture
|
|
198
315
|
|
|
199
|
-
|
|
316
|
+
DcRouter itself is a pure TypeScript orchestrator, but three of its core sub-components ship with **compiled Rust binaries** for performance-critical paths. At runtime each package detects the platform, unpacks the correct binary, and communicates with TypeScript over IPC/FFI — so you get the ergonomics of TypeScript with the throughput of native code.
|
|
200
317
|
|
|
201
|
-
|
|
318
|
+
| Component | Rust Binary | What It Handles |
|
|
319
|
+
|-----------|-------------|-----------------|
|
|
320
|
+
| **SmartProxy** | `smartproxy-bin` | All TCP/TLS/HTTP proxy networking, NFTables integration, connection metrics |
|
|
321
|
+
| **smartmta** | `mailer-bin` | SMTP server + client, DKIM/SPF/DMARC, content scanning, IP reputation |
|
|
322
|
+
| **SmartDNS** | `smartdns-bin` | DNS server (UDP + DNS-over-HTTPS), DNSSEC, DNS client resolution |
|
|
323
|
+
| **SmartRadius** | — | Pure TypeScript (no Rust component) |
|
|
324
|
+
|
|
325
|
+
## Configuration Reference
|
|
326
|
+
|
|
327
|
+
### `IDcRouterOptions`
|
|
202
328
|
|
|
203
329
|
```typescript
|
|
204
330
|
interface IDcRouterOptions {
|
|
205
|
-
//
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
331
|
+
// ── Traffic Routing ────────────────────────────────────────────
|
|
332
|
+
/** SmartProxy config for HTTP/HTTPS and TCP/SNI routing */
|
|
333
|
+
smartProxyConfig?: ISmartProxyOptions;
|
|
334
|
+
|
|
335
|
+
// ── Email ──────────────────────────────────────────────────────
|
|
336
|
+
/** Unified email server configuration (smartmta) */
|
|
337
|
+
emailConfig?: IUnifiedEmailServerOptions;
|
|
338
|
+
|
|
339
|
+
/** Custom email port mapping overrides */
|
|
340
|
+
emailPortConfig?: {
|
|
341
|
+
portMapping?: Record<number, number>;
|
|
342
|
+
portSettings?: Record<number, any>;
|
|
343
|
+
receivedEmailsPath?: string;
|
|
210
344
|
};
|
|
211
|
-
|
|
212
|
-
//
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
//
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
345
|
+
|
|
346
|
+
// ── DNS ────────────────────────────────────────────────────────
|
|
347
|
+
/** Nameserver domains — get A records automatically */
|
|
348
|
+
dnsNsDomains?: string[];
|
|
349
|
+
/** Domains this server is authoritative for */
|
|
350
|
+
dnsScopes?: string[];
|
|
351
|
+
/** Public IP for NS A records */
|
|
352
|
+
publicIp?: string;
|
|
353
|
+
/** Ingress proxy IPs (hides real server IP) */
|
|
354
|
+
proxyIps?: string[];
|
|
355
|
+
/** Custom DNS records */
|
|
356
|
+
dnsRecords?: Array<{
|
|
357
|
+
name: string;
|
|
358
|
+
type: 'A' | 'AAAA' | 'CNAME' | 'MX' | 'TXT' | 'NS' | 'SOA';
|
|
359
|
+
value: string;
|
|
360
|
+
ttl?: number;
|
|
361
|
+
useIngressProxy?: boolean;
|
|
362
|
+
}>;
|
|
363
|
+
|
|
364
|
+
// ── RADIUS ─────────────────────────────────────────────────────
|
|
365
|
+
/** RADIUS server for network authentication */
|
|
366
|
+
radiusConfig?: {
|
|
367
|
+
authPort?: number; // default: 1812
|
|
368
|
+
acctPort?: number; // default: 1813
|
|
369
|
+
clients: IRadiusClient[];
|
|
370
|
+
vlanAssignment?: IVlanManagerConfig;
|
|
371
|
+
accounting?: { enabled: boolean; retentionDays?: number };
|
|
235
372
|
};
|
|
236
|
-
|
|
237
|
-
//
|
|
238
|
-
dnsDomain?: string; // e.g., 'dns.example.com'
|
|
239
|
-
|
|
240
|
-
// TLS and certificate configuration
|
|
373
|
+
|
|
374
|
+
// ── TLS & Certificates ────────────────────────────────────────
|
|
241
375
|
tls?: {
|
|
242
376
|
contactEmail: string;
|
|
243
|
-
domain
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
// DNS challenge configuration
|
|
247
|
-
dnsChallenge?: {
|
|
248
|
-
cloudflareApiKey: string;
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
// Storage configuration
|
|
252
|
-
storage?: {
|
|
253
|
-
fsPath?: string; // Filesystem storage path
|
|
254
|
-
readFunction?: (key: string) => Promise<string>; // Custom read function
|
|
255
|
-
writeFunction?: (key: string, value: string) => Promise<void>; // Custom write function
|
|
377
|
+
domain?: string;
|
|
378
|
+
certPath?: string;
|
|
379
|
+
keyPath?: string;
|
|
256
380
|
};
|
|
257
|
-
}
|
|
258
|
-
```
|
|
381
|
+
dnsChallenge?: { cloudflareApiKey?: string };
|
|
259
382
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
priority?: number;
|
|
266
|
-
match: {
|
|
267
|
-
domains?: string[];
|
|
268
|
-
ports?: number | number[] | { from: number; to: number }[];
|
|
383
|
+
// ── Storage & Caching ─────────────────────────────────────────
|
|
384
|
+
storage?: {
|
|
385
|
+
fsPath?: string;
|
|
386
|
+
readFunction?: (key: string) => Promise<string>;
|
|
387
|
+
writeFunction?: (key: string, value: string) => Promise<void>;
|
|
269
388
|
};
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
ipAllowList?: string[];
|
|
282
|
-
ipBlockList?: string[];
|
|
389
|
+
cacheConfig?: {
|
|
390
|
+
enabled?: boolean; // default: true
|
|
391
|
+
storagePath?: string; // default: '/etc/dcrouter/tsmdb'
|
|
392
|
+
dbName?: string; // default: 'dcrouter'
|
|
393
|
+
cleanupIntervalHours?: number; // default: 1
|
|
394
|
+
ttlConfig?: {
|
|
395
|
+
emails?: number; // default: 30 days
|
|
396
|
+
ipReputation?: number; // default: 1 day
|
|
397
|
+
bounces?: number; // default: 30 days
|
|
398
|
+
dkimKeys?: number; // default: 90 days
|
|
399
|
+
suppression?: number; // default: 30 days
|
|
283
400
|
};
|
|
284
401
|
};
|
|
285
402
|
}
|
|
286
403
|
```
|
|
287
404
|
|
|
288
|
-
##
|
|
405
|
+
## HTTP/HTTPS & TCP/SNI Routing
|
|
289
406
|
|
|
290
|
-
DcRouter
|
|
407
|
+
DcRouter uses [SmartProxy](https://code.foss.global/push.rocks/smartproxy) for all HTTP/HTTPS and TCP/SNI routing. Routes are pattern-matched by domain, port, or both.
|
|
291
408
|
|
|
292
|
-
###
|
|
293
|
-
|
|
294
|
-
When `dnsDomain` is configured, DcRouter automatically:
|
|
295
|
-
- Sets up DNS server for UDP on port 53
|
|
296
|
-
- Creates SmartProxy routes for DNS-over-HTTPS (DoH) on the specified domain
|
|
297
|
-
- Uses socket-handler for HTTPS/DoH traffic (no HTTPS port binding)
|
|
409
|
+
### HTTPS with Auto-TLS
|
|
298
410
|
|
|
299
411
|
```typescript
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
412
|
+
{
|
|
413
|
+
name: 'api-gateway',
|
|
414
|
+
match: { domains: ['api.example.com'], ports: [443] },
|
|
415
|
+
action: {
|
|
416
|
+
type: 'forward',
|
|
417
|
+
targets: [{ host: '192.168.1.20', port: 8080 }],
|
|
418
|
+
tls: { mode: 'terminate', certificate: 'auto' }
|
|
304
419
|
}
|
|
305
|
-
}
|
|
420
|
+
}
|
|
306
421
|
```
|
|
307
422
|
|
|
308
|
-
|
|
309
|
-
- UDP DNS service on port 53 (standard DNS queries)
|
|
310
|
-
- HTTPS routes for `dns.example.com/dns-query` and `dns.example.com/resolve`
|
|
311
|
-
- Automatic TLS certificates via Let's Encrypt
|
|
312
|
-
|
|
313
|
-
### Email Socket-Handler
|
|
314
|
-
|
|
315
|
-
When `useSocketHandler` is enabled in email config:
|
|
316
|
-
- Email server doesn't bind to any ports
|
|
317
|
-
- SmartProxy passes sockets directly to email handlers
|
|
318
|
-
- Reduces latency and resource usage
|
|
423
|
+
### TLS Passthrough (SNI Routing)
|
|
319
424
|
|
|
320
425
|
```typescript
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
426
|
+
{
|
|
427
|
+
name: 'secure-backend',
|
|
428
|
+
match: { domains: ['secure.example.com'], ports: [8443] },
|
|
429
|
+
action: {
|
|
430
|
+
type: 'forward',
|
|
431
|
+
targets: [{ host: '192.168.1.40', port: 8443 }],
|
|
432
|
+
tls: { mode: 'passthrough' }
|
|
327
433
|
}
|
|
328
|
-
}
|
|
434
|
+
}
|
|
329
435
|
```
|
|
330
436
|
|
|
331
|
-
###
|
|
332
|
-
|
|
333
|
-
1. **Performance**: Eliminates internal port forwarding overhead
|
|
334
|
-
2. **Security**: No exposed internal ports
|
|
335
|
-
3. **Resource Efficiency**: Fewer open ports and listeners
|
|
336
|
-
4. **Simplified Networking**: Direct socket passing
|
|
337
|
-
5. **Automatic Configuration**: Routes created automatically
|
|
437
|
+
### TCP Port Range Forwarding
|
|
338
438
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
439
|
+
```typescript
|
|
440
|
+
{
|
|
441
|
+
name: 'database-cluster',
|
|
442
|
+
match: { ports: [{ from: 5432, to: 5439 }] },
|
|
443
|
+
action: {
|
|
444
|
+
type: 'forward',
|
|
445
|
+
targets: [{ host: '192.168.1.30', port: 'preserve' }],
|
|
446
|
+
security: { ipAllowList: ['192.168.1.0/24'] }
|
|
447
|
+
}
|
|
448
|
+
}
|
|
345
449
|
```
|
|
346
450
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
451
|
+
### HTTP Redirect
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
{
|
|
455
|
+
name: 'http-to-https',
|
|
456
|
+
match: { ports: [80] },
|
|
457
|
+
action: { type: 'redirect', redirect: { to: 'https://{domain}{path}' } }
|
|
458
|
+
}
|
|
351
459
|
```
|
|
352
460
|
|
|
353
461
|
## Email System
|
|
354
462
|
|
|
355
|
-
|
|
463
|
+
The email system is powered by [`@push.rocks/smartmta`](https://code.foss.global/push.rocks/smartmta), a TypeScript + Rust hybrid MTA. DcRouter configures and orchestrates smartmta's **UnifiedEmailServer**, which handles SMTP sessions, route matching, delivery queuing, DKIM signing, and all email processing.
|
|
356
464
|
|
|
357
|
-
|
|
465
|
+
### Email Domain Configuration
|
|
358
466
|
|
|
359
|
-
|
|
467
|
+
Domains define _infrastructure_ — how DNS and DKIM are handled for each domain:
|
|
360
468
|
|
|
361
|
-
|
|
469
|
+
#### Forward Mode
|
|
470
|
+
Simple forwarding without local DNS management:
|
|
362
471
|
```typescript
|
|
363
472
|
{
|
|
364
473
|
domain: 'forwarded.com',
|
|
365
474
|
dnsMode: 'forward',
|
|
366
|
-
dns: {
|
|
367
|
-
forward: {
|
|
368
|
-
skipDnsValidation: true,
|
|
369
|
-
targetDomain: 'mail.target.com'
|
|
370
|
-
}
|
|
371
|
-
}
|
|
475
|
+
dns: { forward: { skipDnsValidation: true, targetDomain: 'mail.target.com' } }
|
|
372
476
|
}
|
|
373
477
|
```
|
|
374
478
|
|
|
375
|
-
|
|
479
|
+
#### Internal DNS Mode
|
|
480
|
+
Uses DcRouter's built-in DNS server (requires `dnsNsDomains` + `dnsScopes`):
|
|
376
481
|
```typescript
|
|
377
482
|
{
|
|
378
483
|
domain: 'mail.example.com',
|
|
379
484
|
dnsMode: 'internal-dns',
|
|
380
|
-
dns: {
|
|
381
|
-
|
|
382
|
-
mxPriority: 10,
|
|
383
|
-
ttl: 3600
|
|
384
|
-
}
|
|
385
|
-
},
|
|
386
|
-
dkim: {
|
|
387
|
-
selector: 'mail2024',
|
|
388
|
-
keySize: 2048,
|
|
389
|
-
rotateKeys: true,
|
|
390
|
-
rotationInterval: 90
|
|
391
|
-
}
|
|
485
|
+
dns: { internal: { mxPriority: 10, ttl: 3600 } },
|
|
486
|
+
dkim: { selector: 'mail2024', keySize: 2048, rotateKeys: true, rotationInterval: 90 }
|
|
392
487
|
}
|
|
393
488
|
```
|
|
394
489
|
|
|
395
|
-
|
|
490
|
+
#### External DNS Mode
|
|
491
|
+
Uses existing DNS infrastructure with validation:
|
|
396
492
|
```typescript
|
|
397
493
|
{
|
|
398
494
|
domain: 'mail.external.com',
|
|
399
495
|
dnsMode: 'external-dns',
|
|
400
|
-
dns: {
|
|
401
|
-
external: {
|
|
402
|
-
requiredRecords: ['MX', 'SPF', 'DKIM', 'DMARC']
|
|
403
|
-
}
|
|
404
|
-
},
|
|
496
|
+
dns: { external: { requiredRecords: ['MX', 'SPF', 'DKIM', 'DMARC'] } },
|
|
405
497
|
rateLimits: {
|
|
406
|
-
inbound: {
|
|
407
|
-
|
|
408
|
-
connectionsPerIp: 10
|
|
409
|
-
}
|
|
498
|
+
inbound: { messagesPerMinute: 100, connectionsPerIp: 10 },
|
|
499
|
+
outbound: { messagesPerMinute: 200 }
|
|
410
500
|
}
|
|
411
501
|
}
|
|
412
502
|
```
|
|
413
503
|
|
|
414
|
-
#### **DKIM Management**
|
|
415
|
-
|
|
416
|
-
DKIM is always enabled for all domains. Keys are automatically:
|
|
417
|
-
- Generated on first use
|
|
418
|
-
- Stored persistently via StorageManager
|
|
419
|
-
- Rotated based on configuration
|
|
420
|
-
- Cleaned up after grace period
|
|
421
|
-
|
|
422
504
|
### Email Route Actions
|
|
423
505
|
|
|
424
|
-
|
|
425
|
-
Routes emails to external SMTP servers.
|
|
506
|
+
Routes define _behavior_ — what happens when an email matches:
|
|
426
507
|
|
|
508
|
+
#### Forward 📤
|
|
509
|
+
Routes emails to an external SMTP server:
|
|
427
510
|
```typescript
|
|
428
511
|
{
|
|
429
512
|
name: 'forward-to-internal',
|
|
@@ -433,821 +516,460 @@ Routes emails to external SMTP servers.
|
|
|
433
516
|
forward: {
|
|
434
517
|
host: 'internal-mail.company.com',
|
|
435
518
|
port: 25,
|
|
436
|
-
auth: {
|
|
437
|
-
|
|
438
|
-
password: 'relay-pass'
|
|
439
|
-
},
|
|
440
|
-
addHeaders: {
|
|
441
|
-
'X-Forwarded-By': 'dcrouter'
|
|
442
|
-
}
|
|
519
|
+
auth: { user: 'relay-user', pass: 'relay-pass' },
|
|
520
|
+
addHeaders: { 'X-Forwarded-By': 'dcrouter' }
|
|
443
521
|
}
|
|
444
522
|
}
|
|
445
523
|
}
|
|
446
524
|
```
|
|
447
525
|
|
|
448
|
-
####
|
|
449
|
-
Full
|
|
450
|
-
|
|
526
|
+
#### Process ⚙️
|
|
527
|
+
Full MTA processing with content scanning and delivery queues:
|
|
451
528
|
```typescript
|
|
452
529
|
{
|
|
453
530
|
name: 'process-notifications',
|
|
454
531
|
match: { recipients: '*@notifications.company.com' },
|
|
455
532
|
action: {
|
|
456
533
|
type: 'process',
|
|
457
|
-
process: {
|
|
458
|
-
scan: true,
|
|
459
|
-
dkim: true,
|
|
460
|
-
queue: 'priority'
|
|
461
|
-
}
|
|
534
|
+
process: { scan: true, dkim: true, queue: 'priority' }
|
|
462
535
|
}
|
|
463
536
|
}
|
|
464
537
|
```
|
|
465
538
|
|
|
466
|
-
####
|
|
467
|
-
Local
|
|
468
|
-
|
|
539
|
+
#### Deliver 📥
|
|
540
|
+
Local mailbox delivery:
|
|
469
541
|
```typescript
|
|
470
542
|
{
|
|
471
543
|
name: 'deliver-local',
|
|
472
|
-
match: { recipients: '*@
|
|
473
|
-
action: {
|
|
474
|
-
type: 'deliver'
|
|
475
|
-
}
|
|
544
|
+
match: { recipients: '*@local.company.com' },
|
|
545
|
+
action: { type: 'deliver' }
|
|
476
546
|
}
|
|
477
547
|
```
|
|
478
548
|
|
|
479
|
-
####
|
|
480
|
-
Reject
|
|
481
|
-
|
|
549
|
+
#### Reject 🚫
|
|
550
|
+
Reject with custom SMTP response code:
|
|
482
551
|
```typescript
|
|
483
552
|
{
|
|
484
|
-
name: 'reject-spam',
|
|
485
|
-
match: {
|
|
486
|
-
senders: '*@spam-domain.com',
|
|
487
|
-
sizeRange: { min: 1000000 } // > 1MB
|
|
488
|
-
},
|
|
553
|
+
name: 'reject-spam-domain',
|
|
554
|
+
match: { senders: '*@spam-domain.com', sizeRange: { min: 1000000 } },
|
|
489
555
|
action: {
|
|
490
556
|
type: 'reject',
|
|
491
|
-
reject: {
|
|
492
|
-
code: 550,
|
|
493
|
-
message: 'Message rejected due to policy'
|
|
494
|
-
}
|
|
557
|
+
reject: { code: 550, message: 'Message rejected due to policy' }
|
|
495
558
|
}
|
|
496
559
|
}
|
|
497
560
|
```
|
|
498
561
|
|
|
499
|
-
###
|
|
562
|
+
### Route Matching
|
|
500
563
|
|
|
501
|
-
|
|
502
|
-
Allow internal networks to relay through the server:
|
|
503
|
-
```typescript
|
|
504
|
-
{
|
|
505
|
-
name: 'office-relay',
|
|
506
|
-
priority: 100,
|
|
507
|
-
match: { clientIp: ['192.168.0.0/16', '10.0.0.0/8'] },
|
|
508
|
-
action: {
|
|
509
|
-
type: 'forward',
|
|
510
|
-
forward: { host: 'internal-mail.company.com', port: 25 }
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
```
|
|
564
|
+
Routes support powerful matching criteria:
|
|
514
565
|
|
|
515
|
-
#### **Domain-Based Routing**
|
|
516
|
-
Route different domains to different servers:
|
|
517
566
|
```typescript
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
type: 'forward',
|
|
523
|
-
forward: { host: 'partner-mail.com', port: 587 }
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
```
|
|
567
|
+
// Recipient patterns
|
|
568
|
+
match: { recipients: '*@example.com' } // All addresses at domain
|
|
569
|
+
match: { recipients: 'admin@*' } // "admin" at any domain
|
|
570
|
+
match: { senders: ['*@trusted.com', '*@vip.com'] } // Multiple sender patterns
|
|
527
571
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
{
|
|
532
|
-
name: 'authenticated-users',
|
|
533
|
-
match: { authenticated: true },
|
|
534
|
-
action: {
|
|
535
|
-
type: 'process',
|
|
536
|
-
process: { scan: false, dkim: true, queue: 'priority' }
|
|
537
|
-
}
|
|
538
|
-
},
|
|
539
|
-
{
|
|
540
|
-
name: 'unauthenticated-reject',
|
|
541
|
-
match: { authenticated: false },
|
|
542
|
-
action: {
|
|
543
|
-
type: 'reject',
|
|
544
|
-
reject: { code: 550, message: 'Authentication required' }
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
```
|
|
572
|
+
// IP-based matching (CIDR)
|
|
573
|
+
match: { clientIp: '192.168.0.0/16' }
|
|
574
|
+
match: { clientIp: ['10.0.0.0/8', '172.16.0.0/12'] }
|
|
548
575
|
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
}
|
|
559
|
-
},
|
|
560
|
-
{
|
|
561
|
-
name: 'priority-emails',
|
|
562
|
-
match: {
|
|
563
|
-
headers: { 'X-Priority': 'high' },
|
|
564
|
-
subject: /urgent|emergency/i
|
|
565
|
-
},
|
|
566
|
-
action: {
|
|
567
|
-
type: 'process',
|
|
568
|
-
process: { queue: 'priority' }
|
|
569
|
-
}
|
|
570
|
-
}
|
|
576
|
+
// Authentication state
|
|
577
|
+
match: { authenticated: true }
|
|
578
|
+
|
|
579
|
+
// Header matching
|
|
580
|
+
match: { headers: { 'X-Priority': 'high', 'Subject': /urgent|emergency/i } }
|
|
581
|
+
|
|
582
|
+
// Size and content
|
|
583
|
+
match: { sizeRange: { min: 1000, max: 5000000 }, hasAttachments: true }
|
|
584
|
+
match: { subject: /invoice|receipt/i }
|
|
571
585
|
```
|
|
572
586
|
|
|
573
|
-
###
|
|
587
|
+
### Socket-Handler Mode 🔌
|
|
574
588
|
|
|
575
|
-
|
|
589
|
+
When `useSocketHandler: true` is set, SmartProxy passes sockets directly to the email server — no internal port binding, lower latency, and fewer open ports:
|
|
576
590
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
match: { recipients: 'admin@*' } // Admin at any domain
|
|
582
|
-
match: { senders: ['*@trusted.com', '*@partner.com'] } // Multiple patterns
|
|
591
|
+
```
|
|
592
|
+
Traditional: External Port → SmartProxy → Internal Port → Email Server
|
|
593
|
+
Socket Mode: External Port → SmartProxy → (direct socket) → Email Server
|
|
594
|
+
```
|
|
583
595
|
|
|
584
|
-
|
|
585
|
-
match: { clientIp: '192.168.0.0/16' } // Private subnet
|
|
586
|
-
match: { clientIp: ['10.0.0.0/8', '172.16.0.0/12'] } // Multiple ranges
|
|
596
|
+
### Email Security Stack
|
|
587
597
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
598
|
+
- **DKIM** — Automatic key generation, signing, and rotation for all domains
|
|
599
|
+
- **SPF** — Sender Policy Framework verification on inbound mail
|
|
600
|
+
- **DMARC** — Domain-based Message Authentication verification
|
|
601
|
+
- **IP Reputation** — Real-time IP reputation checking with caching
|
|
602
|
+
- **Content Scanning** — Spam, virus, and attachment scanning
|
|
603
|
+
- **Rate Limiting** — Hierarchical limits (global → domain → sender)
|
|
604
|
+
- **Bounce Management** — Automatic bounce detection and suppression lists
|
|
595
605
|
|
|
596
|
-
|
|
597
|
-
match: {
|
|
598
|
-
sizeRange: { min: 1000, max: 5000000 }, // 1KB to 5MB
|
|
599
|
-
hasAttachments: true,
|
|
600
|
-
subject: /invoice|receipt/i
|
|
601
|
-
}
|
|
602
|
-
```
|
|
606
|
+
### Email Deliverability
|
|
603
607
|
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
{
|
|
608
|
-
type: 'spam',
|
|
609
|
-
threshold: 5.0,
|
|
610
|
-
action: 'tag',
|
|
611
|
-
headers: ['X-Spam-Score', 'X-Spam-Status']
|
|
612
|
-
},
|
|
613
|
-
{
|
|
614
|
-
type: 'virus',
|
|
615
|
-
action: 'reject',
|
|
616
|
-
quarantine: true
|
|
617
|
-
},
|
|
618
|
-
{
|
|
619
|
-
type: 'attachment',
|
|
620
|
-
blockedExtensions: ['.exe', '.bat', '.scr'],
|
|
621
|
-
maxSize: 25 * 1024 * 1024 // 25MB
|
|
622
|
-
}
|
|
623
|
-
];
|
|
624
|
-
```
|
|
608
|
+
- **IP Warmup Manager** — Multi-stage warmup schedules for new IPs
|
|
609
|
+
- **Sender Reputation Monitor** — Per-domain reputation tracking and scoring
|
|
610
|
+
- **Connection Pooling** — Pooled outbound SMTP connections per destination
|
|
625
611
|
|
|
626
|
-
##
|
|
612
|
+
## DNS Server
|
|
627
613
|
|
|
628
|
-
|
|
614
|
+
DcRouter includes an authoritative DNS server built on [smartdns](https://code.foss.global/push.rocks/smartdns). It handles standard UDP DNS on port 53 and DNS-over-HTTPS via SmartProxy socket handler.
|
|
629
615
|
|
|
630
|
-
|
|
631
|
-
const routes = [
|
|
632
|
-
// API routing with path-based forwarding
|
|
633
|
-
{
|
|
634
|
-
name: 'api-gateway',
|
|
635
|
-
match: {
|
|
636
|
-
domains: ['api.example.com'],
|
|
637
|
-
ports: [443]
|
|
638
|
-
},
|
|
639
|
-
action: {
|
|
640
|
-
type: 'forward',
|
|
641
|
-
target: {
|
|
642
|
-
host: '192.168.1.20',
|
|
643
|
-
port: (context) => {
|
|
644
|
-
// Route based on path
|
|
645
|
-
if (context.path.startsWith('/v1/')) return 8080;
|
|
646
|
-
if (context.path.startsWith('/v2/')) return 8081;
|
|
647
|
-
return 8080;
|
|
648
|
-
}
|
|
649
|
-
},
|
|
650
|
-
tls: {
|
|
651
|
-
mode: 'terminate',
|
|
652
|
-
certificate: 'auto'
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
},
|
|
656
|
-
|
|
657
|
-
// Static file serving
|
|
658
|
-
{
|
|
659
|
-
name: 'static-assets',
|
|
660
|
-
match: {
|
|
661
|
-
domains: ['cdn.example.com'],
|
|
662
|
-
ports: [443]
|
|
663
|
-
},
|
|
664
|
-
action: {
|
|
665
|
-
type: 'serve',
|
|
666
|
-
root: '/var/www/static',
|
|
667
|
-
tls: {
|
|
668
|
-
mode: 'terminate',
|
|
669
|
-
certificate: 'auto'
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
];
|
|
674
|
-
```
|
|
616
|
+
### Enabling DNS
|
|
675
617
|
|
|
676
|
-
|
|
618
|
+
DNS is activated when both `dnsNsDomains` and `dnsScopes` are configured:
|
|
677
619
|
|
|
678
620
|
```typescript
|
|
679
|
-
const
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
},
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
port: 'preserve'
|
|
691
|
-
},
|
|
692
|
-
security: {
|
|
693
|
-
ipAllowList: ['192.168.1.0/24']
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
},
|
|
697
|
-
|
|
698
|
-
// SNI-based routing for TLS services
|
|
699
|
-
{
|
|
700
|
-
name: 'secure-service',
|
|
701
|
-
match: {
|
|
702
|
-
domains: ['secure.example.com'],
|
|
703
|
-
ports: [8443]
|
|
704
|
-
},
|
|
705
|
-
action: {
|
|
706
|
-
type: 'forward',
|
|
707
|
-
target: {
|
|
708
|
-
host: '192.168.1.40',
|
|
709
|
-
port: 8443
|
|
710
|
-
},
|
|
711
|
-
tls: {
|
|
712
|
-
mode: 'passthrough'
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
];
|
|
621
|
+
const router = new DcRouter({
|
|
622
|
+
dnsNsDomains: ['ns1.example.com', 'ns2.example.com'],
|
|
623
|
+
dnsScopes: ['example.com'],
|
|
624
|
+
publicIp: '203.0.113.1',
|
|
625
|
+
dnsRecords: [
|
|
626
|
+
{ name: 'example.com', type: 'A', value: '203.0.113.1' },
|
|
627
|
+
{ name: 'www.example.com', type: 'CNAME', value: 'example.com' },
|
|
628
|
+
{ name: 'example.com', type: 'MX', value: '10:mail.example.com' },
|
|
629
|
+
{ name: 'example.com', type: 'TXT', value: 'v=spf1 a mx ~all' }
|
|
630
|
+
]
|
|
631
|
+
});
|
|
717
632
|
```
|
|
718
633
|
|
|
719
|
-
|
|
634
|
+
### Automatic DNS Records
|
|
720
635
|
|
|
721
|
-
|
|
636
|
+
DcRouter auto-generates:
|
|
637
|
+
- **NS records** for all domains in `dnsScopes`
|
|
638
|
+
- **SOA records** for authoritative zones
|
|
639
|
+
- **A records** for nameserver domains (`dnsNsDomains`)
|
|
640
|
+
- **MX, SPF, DKIM, DMARC records** for email domains with `internal-dns` mode
|
|
641
|
+
- **ACME challenge records** for certificate provisioning
|
|
642
|
+
|
|
643
|
+
### Ingress Proxy Support
|
|
722
644
|
|
|
723
|
-
|
|
645
|
+
When `proxyIps` is configured, A records with `useIngressProxy: true` (default) will use the proxy IP instead of the real server IP — hiding your origin:
|
|
724
646
|
|
|
725
|
-
#### **Filesystem Storage**
|
|
726
647
|
```typescript
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
}
|
|
648
|
+
{
|
|
649
|
+
proxyIps: ['198.51.100.1', '198.51.100.2'],
|
|
650
|
+
dnsRecords: [
|
|
651
|
+
{ name: 'example.com', type: 'A', value: '203.0.113.1' }, // Will resolve to 198.51.100.1
|
|
652
|
+
{ name: 'ns1.example.com', type: 'A', value: '203.0.113.1', useIngressProxy: false } // Stays real IP
|
|
653
|
+
]
|
|
654
|
+
}
|
|
732
655
|
```
|
|
733
656
|
|
|
734
|
-
|
|
657
|
+
## RADIUS Server
|
|
658
|
+
|
|
659
|
+
DcRouter includes a RADIUS server for network access control, built on [smartradius](https://code.foss.global/push.rocks/smartradius).
|
|
660
|
+
|
|
661
|
+
### Configuration
|
|
662
|
+
|
|
735
663
|
```typescript
|
|
736
664
|
const router = new DcRouter({
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
665
|
+
radiusConfig: {
|
|
666
|
+
authPort: 1812,
|
|
667
|
+
acctPort: 1813,
|
|
668
|
+
clients: [
|
|
669
|
+
{
|
|
670
|
+
name: 'core-switch',
|
|
671
|
+
ipRange: '192.168.1.0/24',
|
|
672
|
+
secret: 'shared-secret',
|
|
673
|
+
enabled: true
|
|
674
|
+
}
|
|
675
|
+
],
|
|
676
|
+
vlanAssignment: {
|
|
677
|
+
defaultVlan: 100,
|
|
678
|
+
allowUnknownMacs: true,
|
|
679
|
+
mappings: [
|
|
680
|
+
{ mac: 'aa:bb:cc:dd:ee:ff', vlan: 10, enabled: true }, // Exact MAC
|
|
681
|
+
{ mac: 'aa:bb:cc', vlan: 20, enabled: true }, // OUI prefix
|
|
682
|
+
]
|
|
741
683
|
},
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
684
|
+
accounting: {
|
|
685
|
+
enabled: true,
|
|
686
|
+
retentionDays: 30
|
|
745
687
|
}
|
|
746
688
|
}
|
|
747
689
|
});
|
|
748
690
|
```
|
|
749
691
|
|
|
750
|
-
|
|
751
|
-
```typescript
|
|
752
|
-
const router = new DcRouter({
|
|
753
|
-
// No storage config = memory storage with warning
|
|
754
|
-
});
|
|
755
|
-
```
|
|
756
|
-
|
|
757
|
-
### Storage Usage
|
|
692
|
+
### Components
|
|
758
693
|
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
- **Domain Configs**: `/email/domains/{domain}.json`
|
|
694
|
+
| Component | Purpose |
|
|
695
|
+
|-----------|---------|
|
|
696
|
+
| **RadiusServer** | Main RADIUS server handling auth + accounting requests |
|
|
697
|
+
| **VlanManager** | MAC-to-VLAN mapping with exact, OUI, and wildcard patterns |
|
|
698
|
+
| **AccountingManager** | Session tracking, traffic metering, start/stop/interim updates |
|
|
765
699
|
|
|
766
|
-
###
|
|
700
|
+
### OpsServer API
|
|
767
701
|
|
|
768
|
-
|
|
702
|
+
RADIUS is fully manageable at runtime via the OpsServer API:
|
|
703
|
+
- Client management (add/remove/list NAS devices)
|
|
704
|
+
- VLAN mapping CRUD operations
|
|
705
|
+
- Session monitoring and forced disconnects
|
|
706
|
+
- Accounting summaries and statistics
|
|
769
707
|
|
|
770
|
-
|
|
771
|
-
import { StorageManager } from '@serve.zone/dcrouter';
|
|
772
|
-
|
|
773
|
-
// Export from filesystem
|
|
774
|
-
const fsStorage = new StorageManager({ fsPath: './data' });
|
|
775
|
-
const keys = await fsStorage.list('/');
|
|
776
|
-
const data = {};
|
|
777
|
-
for (const key of keys) {
|
|
778
|
-
data[key] = await fsStorage.get(key);
|
|
779
|
-
}
|
|
708
|
+
## Storage & Caching
|
|
780
709
|
|
|
781
|
-
|
|
782
|
-
const cloudStorage = new StorageManager({
|
|
783
|
-
readFunction: cloudRead,
|
|
784
|
-
writeFunction: cloudWrite
|
|
785
|
-
});
|
|
786
|
-
for (const [key, value] of Object.entries(data)) {
|
|
787
|
-
await cloudStorage.set(key, value);
|
|
788
|
-
}
|
|
789
|
-
```
|
|
790
|
-
|
|
791
|
-
## Security Features
|
|
710
|
+
### StorageManager
|
|
792
711
|
|
|
793
|
-
|
|
712
|
+
Provides a unified key-value interface with three backends:
|
|
794
713
|
|
|
795
714
|
```typescript
|
|
796
|
-
|
|
715
|
+
// Filesystem backend
|
|
716
|
+
storage: { fsPath: '/var/lib/dcrouter/data' }
|
|
797
717
|
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
});
|
|
803
|
-
|
|
804
|
-
// Check IP reputation
|
|
805
|
-
const result = await ipChecker.checkIp('192.0.2.1');
|
|
806
|
-
if (result.isBlocked) {
|
|
807
|
-
console.log(`IP blocked: ${result.reason}`);
|
|
718
|
+
// Custom backend (Redis, S3, etc.)
|
|
719
|
+
storage: {
|
|
720
|
+
readFunction: async (key) => await redis.get(key),
|
|
721
|
+
writeFunction: async (key, value) => await redis.set(key, value)
|
|
808
722
|
}
|
|
809
|
-
```
|
|
810
|
-
|
|
811
|
-
### Content Security Scanner
|
|
812
|
-
|
|
813
|
-
```typescript
|
|
814
|
-
import { ContentScanner } from '@serve.zone/dcrouter';
|
|
815
|
-
|
|
816
|
-
const scanner = new ContentScanner({
|
|
817
|
-
spamThreshold: 5.0,
|
|
818
|
-
virusScanning: true,
|
|
819
|
-
attachmentFiltering: {
|
|
820
|
-
maxSize: 25 * 1024 * 1024,
|
|
821
|
-
blockedTypes: ['.exe', '.bat', '.scr']
|
|
822
|
-
}
|
|
823
|
-
});
|
|
824
723
|
|
|
825
|
-
|
|
724
|
+
// In-memory (development only — data lost on restart)
|
|
725
|
+
// Simply omit the storage config
|
|
826
726
|
```
|
|
827
727
|
|
|
828
|
-
|
|
728
|
+
Used for: DKIM keys, email routes, bounce/suppression lists, IP reputation data, domain configs.
|
|
829
729
|
|
|
830
|
-
###
|
|
730
|
+
### Cache Database
|
|
731
|
+
|
|
732
|
+
An embedded MongoDB-compatible database (via smartdata + LocalTsmDb) for persistent caching with automatic TTL cleanup:
|
|
831
733
|
|
|
832
|
-
#### Constructor
|
|
833
734
|
```typescript
|
|
834
|
-
|
|
735
|
+
cacheConfig: {
|
|
736
|
+
enabled: true,
|
|
737
|
+
storagePath: '/etc/dcrouter/tsmdb',
|
|
738
|
+
dbName: 'dcrouter',
|
|
739
|
+
cleanupIntervalHours: 1,
|
|
740
|
+
ttlConfig: {
|
|
741
|
+
emails: 30, // days
|
|
742
|
+
ipReputation: 1, // days
|
|
743
|
+
bounces: 30, // days
|
|
744
|
+
dkimKeys: 90, // days
|
|
745
|
+
suppression: 30 // days
|
|
746
|
+
}
|
|
747
|
+
}
|
|
835
748
|
```
|
|
836
749
|
|
|
837
|
-
|
|
750
|
+
Cached document types: `CachedEmail`, `CachedIPReputation`.
|
|
838
751
|
|
|
839
|
-
|
|
840
|
-
Starts all configured services (SmartProxy, email server, DNS server).
|
|
752
|
+
## Security Features
|
|
841
753
|
|
|
842
|
-
|
|
843
|
-
Gracefully stops all services.
|
|
754
|
+
### IP Reputation Checking
|
|
844
755
|
|
|
845
|
-
|
|
846
|
-
Updates SmartProxy routes dynamically.
|
|
756
|
+
Automatic IP reputation checks on inbound connections with configurable caching:
|
|
847
757
|
|
|
848
|
-
|
|
849
|
-
|
|
758
|
+
```typescript
|
|
759
|
+
// IP reputation is checked automatically for inbound SMTP connections.
|
|
760
|
+
// Results are cached according to cacheConfig.ttlConfig.ipReputation.
|
|
761
|
+
```
|
|
850
762
|
|
|
851
|
-
|
|
852
|
-
Returns real-time statistics for all services.
|
|
763
|
+
### Rate Limiting
|
|
853
764
|
|
|
854
|
-
|
|
765
|
+
Hierarchical rate limits with three levels of specificity:
|
|
855
766
|
|
|
856
|
-
#### `sendEmail(options: IEmailOptions): Promise<string>`
|
|
857
767
|
```typescript
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
}
|
|
865
|
-
```
|
|
768
|
+
// Global defaults (via emailConfig.defaults.rateLimits)
|
|
769
|
+
defaults: {
|
|
770
|
+
rateLimits: {
|
|
771
|
+
inbound: { messagesPerMinute: 50, connectionsPerIp: 5, recipientsPerMessage: 50 },
|
|
772
|
+
outbound: { messagesPerMinute: 100 }
|
|
773
|
+
}
|
|
774
|
+
}
|
|
866
775
|
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
776
|
+
// Per-domain overrides (in domain config)
|
|
777
|
+
{
|
|
778
|
+
domain: 'high-volume.com',
|
|
779
|
+
rateLimits: {
|
|
780
|
+
outbound: { messagesPerMinute: 500 } // Override for this domain
|
|
781
|
+
}
|
|
782
|
+
}
|
|
871
783
|
```
|
|
872
784
|
|
|
873
|
-
|
|
874
|
-
Detailed delivery information including bounce reasons and tracking data.
|
|
875
|
-
|
|
876
|
-
## Examples
|
|
785
|
+
**Precedence**: Domain-specific > Pattern-specific > Global
|
|
877
786
|
|
|
878
|
-
###
|
|
787
|
+
### Content Scanning
|
|
879
788
|
|
|
880
789
|
```typescript
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
{
|
|
889
|
-
name: 'website',
|
|
890
|
-
priority: 100,
|
|
891
|
-
match: { domains: ['example.com', 'www.example.com'], ports: [443] },
|
|
892
|
-
action: {
|
|
893
|
-
type: 'forward',
|
|
894
|
-
target: { host: '192.168.1.10', port: 80 },
|
|
895
|
-
tls: { mode: 'terminate', certificate: 'auto' }
|
|
896
|
-
}
|
|
897
|
-
},
|
|
898
|
-
|
|
899
|
-
// API services
|
|
900
|
-
{
|
|
901
|
-
name: 'api',
|
|
902
|
-
priority: 110,
|
|
903
|
-
match: { domains: ['api.example.com'], ports: [443] },
|
|
904
|
-
action: {
|
|
905
|
-
type: 'forward',
|
|
906
|
-
target: { host: '192.168.1.20', port: 8080 },
|
|
907
|
-
tls: { mode: 'terminate', certificate: 'auto' }
|
|
908
|
-
}
|
|
909
|
-
},
|
|
910
|
-
|
|
911
|
-
// Internal services
|
|
912
|
-
{
|
|
913
|
-
name: 'internal',
|
|
914
|
-
match: { ports: [{ from: 8000, to: 8999 }] },
|
|
915
|
-
action: {
|
|
916
|
-
type: 'forward',
|
|
917
|
-
target: { host: '192.168.1.30', port: 'preserve' },
|
|
918
|
-
security: { ipAllowList: ['192.168.0.0/16'] }
|
|
919
|
-
}
|
|
920
|
-
}
|
|
921
|
-
],
|
|
922
|
-
|
|
923
|
-
// ACME certificate automation
|
|
924
|
-
acme: {
|
|
925
|
-
email: 'ssl@example.com',
|
|
926
|
-
enabled: true,
|
|
927
|
-
useProduction: true,
|
|
928
|
-
autoRenew: true
|
|
929
|
-
}
|
|
930
|
-
},
|
|
931
|
-
|
|
932
|
-
// Enterprise email system
|
|
933
|
-
emailConfig: {
|
|
934
|
-
ports: [25, 587, 465],
|
|
935
|
-
hostname: 'mail.example.com',
|
|
936
|
-
|
|
937
|
-
// Domain configuration
|
|
938
|
-
domains: [
|
|
939
|
-
{
|
|
940
|
-
domain: 'example.com',
|
|
941
|
-
dnsMode: 'external-dns',
|
|
942
|
-
dkim: {
|
|
943
|
-
selector: 'mail',
|
|
944
|
-
rotateKeys: true
|
|
945
|
-
}
|
|
946
|
-
},
|
|
947
|
-
{
|
|
948
|
-
domain: 'notifications.example.com',
|
|
949
|
-
dnsMode: 'internal-dns',
|
|
950
|
-
rateLimits: {
|
|
951
|
-
outbound: { messagesPerHour: 10000 }
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
],
|
|
955
|
-
|
|
956
|
-
// Authentication configuration
|
|
957
|
-
auth: {
|
|
958
|
-
required: true,
|
|
959
|
-
methods: ['PLAIN', 'LOGIN']
|
|
960
|
-
},
|
|
961
|
-
|
|
962
|
-
// TLS configuration
|
|
963
|
-
tls: {
|
|
964
|
-
keyPath: './certs/mail-key.pem',
|
|
965
|
-
certPath: './certs/mail-cert.pem'
|
|
966
|
-
},
|
|
967
|
-
|
|
968
|
-
// Email routing rules
|
|
969
|
-
routes: [
|
|
970
|
-
// Relay from office network
|
|
971
|
-
{
|
|
972
|
-
name: 'office-relay',
|
|
973
|
-
priority: 100,
|
|
974
|
-
match: { clientIp: '192.168.0.0/16' },
|
|
975
|
-
action: {
|
|
976
|
-
type: 'forward',
|
|
977
|
-
forward: {
|
|
978
|
-
host: 'internal-mail.example.com',
|
|
979
|
-
port: 25
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
},
|
|
983
|
-
|
|
984
|
-
// Transactional emails via processing
|
|
985
|
-
{
|
|
986
|
-
name: 'notifications',
|
|
987
|
-
priority: 50,
|
|
988
|
-
match: { recipients: '*@notifications.example.com' },
|
|
989
|
-
action: {
|
|
990
|
-
type: 'process',
|
|
991
|
-
process: {
|
|
992
|
-
scan: true,
|
|
993
|
-
dkim: true,
|
|
994
|
-
queue: 'priority'
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
},
|
|
998
|
-
|
|
999
|
-
// Internal emails forwarded to Exchange
|
|
1000
|
-
{
|
|
1001
|
-
name: 'internal-mail',
|
|
1002
|
-
priority: 25,
|
|
1003
|
-
match: { recipients: '*@example.com' },
|
|
1004
|
-
action: {
|
|
1005
|
-
type: 'forward',
|
|
1006
|
-
forward: {
|
|
1007
|
-
host: 'exchange.internal.example.com',
|
|
1008
|
-
port: 25
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
},
|
|
1012
|
-
|
|
1013
|
-
// Default reject
|
|
1014
|
-
{
|
|
1015
|
-
name: 'default-reject',
|
|
1016
|
-
match: { recipients: '*' },
|
|
1017
|
-
action: {
|
|
1018
|
-
type: 'reject',
|
|
1019
|
-
reject: {
|
|
1020
|
-
code: 550,
|
|
1021
|
-
message: 'Relay denied'
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
790
|
+
action: {
|
|
791
|
+
type: 'process',
|
|
792
|
+
options: {
|
|
793
|
+
contentScanning: true,
|
|
794
|
+
scanners: [
|
|
795
|
+
{ type: 'spam', threshold: 5.0, action: 'tag' },
|
|
796
|
+
{ type: 'virus', action: 'reject' },
|
|
797
|
+
{ type: 'attachment', blockedExtensions: ['.exe', '.bat', '.scr'], action: 'reject' }
|
|
1025
798
|
]
|
|
1026
|
-
},
|
|
1027
|
-
|
|
1028
|
-
// DNS server for ACME challenges
|
|
1029
|
-
dnsServerConfig: {
|
|
1030
|
-
port: 53,
|
|
1031
|
-
authoritative: true
|
|
1032
|
-
},
|
|
1033
|
-
|
|
1034
|
-
// Cloudflare DNS challenges
|
|
1035
|
-
dnsChallenge: {
|
|
1036
|
-
cloudflareApiKey: process.env.CLOUDFLARE_API_KEY
|
|
1037
|
-
},
|
|
1038
|
-
|
|
1039
|
-
// Persistent storage
|
|
1040
|
-
storage: {
|
|
1041
|
-
fsPath: '/var/lib/dcrouter/data'
|
|
1042
799
|
}
|
|
1043
|
-
}
|
|
1044
|
-
|
|
1045
|
-
// Start the router
|
|
1046
|
-
await router.start();
|
|
1047
|
-
console.log('Enterprise DcRouter started');
|
|
1048
|
-
|
|
1049
|
-
// Monitor statistics
|
|
1050
|
-
setInterval(() => {
|
|
1051
|
-
const stats = router.getStats();
|
|
1052
|
-
console.log('Active connections:', stats.activeConnections);
|
|
1053
|
-
console.log('Emails processed:', stats.emailsProcessed);
|
|
1054
|
-
}, 60000);
|
|
800
|
+
}
|
|
1055
801
|
```
|
|
1056
802
|
|
|
1057
|
-
|
|
803
|
+
## OpsServer Dashboard
|
|
1058
804
|
|
|
1059
|
-
|
|
1060
|
-
import { EmailService, TemplateManager } from '@serve.zone/dcrouter';
|
|
1061
|
-
|
|
1062
|
-
// Setup email templates
|
|
1063
|
-
const templateManager = new TemplateManager();
|
|
1064
|
-
templateManager.addTemplate('welcome', {
|
|
1065
|
-
subject: 'Welcome to {{company}}!',
|
|
1066
|
-
html: `
|
|
1067
|
-
<h1>Welcome {{name}}!</h1>
|
|
1068
|
-
<p>Thank you for joining {{company}}.</p>
|
|
1069
|
-
<p>Your account: {{email}}</p>
|
|
1070
|
-
`,
|
|
1071
|
-
text: 'Welcome {{name}}! Thank you for joining {{company}}.'
|
|
1072
|
-
});
|
|
805
|
+
The OpsServer provides a web-based management interface served on port 3000. It's built with modern web components using [@design.estate/dees-catalog](https://code.foss.global/design.estate/dees-catalog).
|
|
1073
806
|
|
|
1074
|
-
|
|
1075
|
-
const emailService = new EmailService(router);
|
|
1076
|
-
await emailService.sendTemplatedEmail('welcome', {
|
|
1077
|
-
to: 'user@example.com',
|
|
1078
|
-
templateData: {
|
|
1079
|
-
name: 'John Doe',
|
|
1080
|
-
company: 'Example Corp',
|
|
1081
|
-
email: 'user@example.com'
|
|
1082
|
-
}
|
|
1083
|
-
});
|
|
1084
|
-
```
|
|
807
|
+
### Dashboard Views
|
|
1085
808
|
|
|
1086
|
-
|
|
809
|
+
| View | Description |
|
|
810
|
+
|------|-------------|
|
|
811
|
+
| 📊 **Overview** | Real-time server stats, CPU/memory, connection counts, email throughput |
|
|
812
|
+
| 🌐 **Network** | Active connections, top IPs, throughput rates, SmartProxy metrics |
|
|
813
|
+
| 📧 **Email** | Queue monitoring (queued/sent/failed), bounce records, security incidents |
|
|
814
|
+
| 📜 **Logs** | Real-time log viewer with level filtering and search |
|
|
815
|
+
| ⚙️ **Configuration** | Read-only view of current system configuration |
|
|
816
|
+
| 🛡️ **Security** | IP reputation, rate limit status, blocked connections |
|
|
1087
817
|
|
|
1088
|
-
###
|
|
818
|
+
### API Endpoints
|
|
1089
819
|
|
|
1090
|
-
|
|
1091
|
-
```bash
|
|
1092
|
-
# Check certificate status
|
|
1093
|
-
curl -I https://your-domain.com
|
|
820
|
+
All management is done via TypedRequest over HTTP POST to `/typedrequest`:
|
|
1094
821
|
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
822
|
+
```typescript
|
|
823
|
+
// Authentication
|
|
824
|
+
'adminLoginWithUsernameAndPassword' // Login with credentials → returns JWT identity
|
|
825
|
+
'verifyIdentity' // Verify JWT token validity
|
|
826
|
+
'adminLogout' // End admin session
|
|
1098
827
|
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
828
|
+
// Statistics & Health
|
|
829
|
+
'getServerStatistics' // Uptime, CPU, memory, connections
|
|
830
|
+
'getHealthStatus' // System health check
|
|
831
|
+
'getCombinedMetrics' // All metrics in one call
|
|
832
|
+
|
|
833
|
+
// Email Operations
|
|
834
|
+
'getQueuedEmails' // Emails pending delivery
|
|
835
|
+
'getSentEmails' // Successfully delivered emails
|
|
836
|
+
'getFailedEmails' // Failed emails
|
|
837
|
+
'resendEmail' // Re-queue a failed email
|
|
838
|
+
'getBounceRecords' // Bounce records
|
|
839
|
+
'removeFromSuppressionList' // Unsuppress an address
|
|
840
|
+
|
|
841
|
+
// Configuration (read-only)
|
|
842
|
+
'getConfiguration' // Current system config
|
|
1103
843
|
|
|
1104
|
-
|
|
1105
|
-
|
|
844
|
+
// Logs
|
|
845
|
+
'getLogs' // Retrieve system logs
|
|
1106
846
|
|
|
1107
|
-
|
|
1108
|
-
|
|
847
|
+
// RADIUS
|
|
848
|
+
'getRadiusSessions' // Active RADIUS sessions
|
|
849
|
+
'getRadiusClients' // List NAS clients
|
|
850
|
+
'getRadiusStatistics' // RADIUS stats
|
|
851
|
+
'setRadiusClient' // Add/update NAS client
|
|
852
|
+
'removeRadiusClient' // Remove NAS client
|
|
853
|
+
'getVlanMappings' // List VLAN mappings
|
|
854
|
+
'setVlanMapping' // Add/update VLAN mapping
|
|
855
|
+
'removeVlanMapping' // Remove VLAN mapping
|
|
856
|
+
'testVlanAssignment' // Test what VLAN a MAC gets
|
|
1109
857
|
```
|
|
1110
858
|
|
|
1111
|
-
|
|
859
|
+
## API Reference
|
|
1112
860
|
|
|
1113
|
-
|
|
1114
|
-
- Check route priority order (higher priority = evaluated first)
|
|
1115
|
-
- Verify glob patterns: `*@example.com` matches domain, `admin@*` matches user
|
|
1116
|
-
- Test CIDR notation: `192.168.0.0/16` includes all 192.168.x.x addresses
|
|
1117
|
-
- Confirm authentication state matches your expectations
|
|
861
|
+
### DcRouter Class
|
|
1118
862
|
|
|
1119
|
-
**Common Route Patterns**
|
|
1120
863
|
```typescript
|
|
1121
|
-
|
|
1122
|
-
{
|
|
1123
|
-
name: 'debug-all',
|
|
1124
|
-
priority: 1000,
|
|
1125
|
-
match: { recipients: '*' },
|
|
1126
|
-
action: { type: 'process', process: { scan: false } }
|
|
1127
|
-
}
|
|
864
|
+
import { DcRouter } from '@serve.zone/dcrouter';
|
|
1128
865
|
|
|
1129
|
-
|
|
1130
|
-
{
|
|
1131
|
-
name: 'default-reject',
|
|
1132
|
-
priority: 0,
|
|
1133
|
-
match: { recipients: '*' },
|
|
1134
|
-
action: { type: 'reject', reject: { code: 550, message: 'No route' } }
|
|
1135
|
-
}
|
|
866
|
+
const router = new DcRouter(options: IDcRouterOptions);
|
|
1136
867
|
```
|
|
1137
868
|
|
|
1138
|
-
####
|
|
1139
|
-
```bash
|
|
1140
|
-
# Test DNS server
|
|
1141
|
-
dig @your-server.com your-domain.com
|
|
1142
|
-
|
|
1143
|
-
# Check DNS propagation
|
|
1144
|
-
dig your-domain.com @8.8.8.8
|
|
1145
|
-
```
|
|
869
|
+
#### Methods
|
|
1146
870
|
|
|
1147
|
-
|
|
871
|
+
| Method | Description |
|
|
872
|
+
|--------|-------------|
|
|
873
|
+
| `start(): Promise<void>` | Start all configured services |
|
|
874
|
+
| `stop(): Promise<void>` | Gracefully stop all services |
|
|
875
|
+
| `updateSmartProxyConfig(config): Promise<void>` | Hot-update SmartProxy routes |
|
|
876
|
+
| `updateEmailConfig(config): Promise<void>` | Hot-update email configuration |
|
|
877
|
+
| `updateEmailRoutes(routes): Promise<void>` | Update email routing rules at runtime |
|
|
878
|
+
| `updateRadiusConfig(config): Promise<void>` | Hot-update RADIUS configuration |
|
|
879
|
+
| `getStats(): any` | Get real-time statistics from all services |
|
|
1148
880
|
|
|
1149
|
-
|
|
1150
|
-
import { SmartLog } from '@push.rocks/smartlog';
|
|
881
|
+
#### Properties
|
|
1151
882
|
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
883
|
+
| Property | Type | Description |
|
|
884
|
+
|----------|------|-------------|
|
|
885
|
+
| `options` | `IDcRouterOptions` | Current configuration |
|
|
886
|
+
| `smartProxy` | `SmartProxy` | SmartProxy instance |
|
|
887
|
+
| `emailServer` | `UnifiedEmailServer` | Email server instance (from smartmta) |
|
|
888
|
+
| `dnsServer` | `DnsServer` | DNS server instance |
|
|
889
|
+
| `radiusServer` | `RadiusServer` | RADIUS server instance |
|
|
890
|
+
| `storageManager` | `StorageManager` | Storage backend |
|
|
891
|
+
| `opsServer` | `OpsServer` | OpsServer/dashboard instance |
|
|
892
|
+
| `metricsManager` | `MetricsManager` | Metrics collector |
|
|
893
|
+
| `cacheDb` | `CacheDb` | Cache database instance |
|
|
1157
894
|
|
|
1158
|
-
|
|
1159
|
-
router.emailServer.on('emailReceived', (email) => {
|
|
1160
|
-
logger.log('info', `Email received: ${email.from} -> ${email.to}`);
|
|
1161
|
-
});
|
|
895
|
+
### Re-exported Types
|
|
1162
896
|
|
|
1163
|
-
|
|
1164
|
-
logger.log('info', `Email sent: ${result.messageId} (${result.status})`);
|
|
1165
|
-
});
|
|
897
|
+
DcRouter re-exports key types from smartmta for convenience:
|
|
1166
898
|
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
899
|
+
```typescript
|
|
900
|
+
import {
|
|
901
|
+
DcRouter,
|
|
902
|
+
IDcRouterOptions,
|
|
903
|
+
UnifiedEmailServer,
|
|
904
|
+
type IUnifiedEmailServerOptions,
|
|
905
|
+
type IEmailRoute,
|
|
906
|
+
type IEmailDomainConfig,
|
|
907
|
+
} from '@serve.zone/dcrouter';
|
|
1171
908
|
```
|
|
1172
909
|
|
|
1173
|
-
|
|
910
|
+
## Sub-Modules
|
|
911
|
+
|
|
912
|
+
DcRouter is published as a monorepo with separately-installable interface and web packages:
|
|
913
|
+
|
|
914
|
+
| Package | Description | Install |
|
|
915
|
+
|---------|-------------|---------|
|
|
916
|
+
| [`@serve.zone/dcrouter`](https://www.npmjs.com/package/@serve.zone/dcrouter) | Main package — the full router | `pnpm add @serve.zone/dcrouter` |
|
|
917
|
+
| [`@serve.zone/dcrouter-interfaces`](https://www.npmjs.com/package/@serve.zone/dcrouter-interfaces) | TypedRequest interfaces for the OpsServer API | `pnpm add @serve.zone/dcrouter-interfaces` |
|
|
918
|
+
| [`@serve.zone/dcrouter-web`](https://www.npmjs.com/package/@serve.zone/dcrouter-web) | Web dashboard components | `pnpm add @serve.zone/dcrouter-web` |
|
|
919
|
+
|
|
920
|
+
You can also import interfaces directly from the main package:
|
|
1174
921
|
|
|
1175
922
|
```typescript
|
|
1176
|
-
|
|
1177
|
-
// Connection limits
|
|
1178
|
-
maxConnections: 1000,
|
|
1179
|
-
connectionTimeout: 30000,
|
|
1180
|
-
|
|
1181
|
-
// Email queue settings
|
|
1182
|
-
emailQueue: {
|
|
1183
|
-
concurrency: 10,
|
|
1184
|
-
maxRetries: 3,
|
|
1185
|
-
retryDelay: 300000
|
|
1186
|
-
},
|
|
1187
|
-
|
|
1188
|
-
// Cache settings
|
|
1189
|
-
cache: {
|
|
1190
|
-
ipReputation: { ttl: 3600000 }, // 1 hour
|
|
1191
|
-
dns: { ttl: 300000 }, // 5 minutes
|
|
1192
|
-
certificates: { ttl: 86400000 } // 24 hours
|
|
1193
|
-
}
|
|
1194
|
-
};
|
|
923
|
+
import { data, requests } from '@serve.zone/dcrouter/interfaces';
|
|
1195
924
|
```
|
|
1196
925
|
|
|
1197
|
-
##
|
|
926
|
+
## Testing
|
|
1198
927
|
|
|
1199
|
-
|
|
928
|
+
DcRouter includes a comprehensive test suite covering all system components:
|
|
1200
929
|
|
|
1201
|
-
|
|
930
|
+
```bash
|
|
931
|
+
# Run all tests (10 files, 73 tests)
|
|
932
|
+
pnpm test
|
|
1202
933
|
|
|
1203
|
-
|
|
934
|
+
# Run a specific test file
|
|
935
|
+
tstest test/test.jwt-auth.ts --verbose
|
|
1204
936
|
|
|
1205
|
-
|
|
937
|
+
# Run with extended timeout
|
|
938
|
+
tstest test/test.opsserver-api.ts --verbose --timeout 60
|
|
939
|
+
```
|
|
1206
940
|
|
|
1207
|
-
|
|
1208
|
-
- **Commands**: EHLO, HELO, MAIL FROM, RCPT TO, DATA, RSET, NOOP, QUIT, VRFY, EXPN, HELP
|
|
1209
|
-
- **Extensions**: SIZE, PIPELINING, STARTTLS
|
|
1210
|
-
- **Connection Management**: TLS/plain connections, timeouts, limits, rejection handling
|
|
1211
|
-
- **Error Handling**: Syntax errors, invalid sequences, temporary/permanent failures
|
|
1212
|
-
- **Email Processing**: Basic sending, multiple recipients, large emails, invalid addresses
|
|
1213
|
-
- **Security**: Authentication, rate limiting
|
|
1214
|
-
- **Performance**: Throughput testing
|
|
1215
|
-
- **Edge Cases**: Very large emails, special characters
|
|
941
|
+
### Test Coverage
|
|
1216
942
|
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
-
|
|
1222
|
-
-
|
|
943
|
+
| Test File | Area | Tests |
|
|
944
|
+
|-----------|------|-------|
|
|
945
|
+
| `test.contentscanner.ts` | Content scanning (spam, phishing, malware, attachments) | 13 |
|
|
946
|
+
| `test.dcrouter.email.ts` | Email config, domain and route setup | 4 |
|
|
947
|
+
| `test.dns-server-config.ts` | DNS record parsing, grouping, extraction | 5 |
|
|
948
|
+
| `test.dns-socket-handler.ts` | DNS socket handler and route generation | 6 |
|
|
949
|
+
| `test.errors.ts` | Error classes, handler, retry utilities | 5 |
|
|
950
|
+
| `test.ipreputationchecker.ts` | IP reputation, DNSBL, caching, risk classification | 10 |
|
|
951
|
+
| `test.jwt-auth.ts` | JWT login, verification, logout, invalid credentials | 8 |
|
|
952
|
+
| `test.opsserver-api.ts` | Health, statistics, configuration, log APIs | 6 |
|
|
953
|
+
| `test.protected-endpoint.ts` | Admin auth, identity verification, public endpoints | 8 |
|
|
954
|
+
| `test.storagemanager.ts` | Memory, filesystem, custom backends, concurrency | 8 |
|
|
1223
955
|
|
|
1224
|
-
|
|
956
|
+
## License and Legal Information
|
|
1225
957
|
|
|
1226
|
-
|
|
1227
|
-
# Run all tests
|
|
1228
|
-
pnpm test
|
|
958
|
+
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file.
|
|
1229
959
|
|
|
1230
|
-
|
|
1231
|
-
tsx test/suite/commands/test.ehlo-command.ts
|
|
1232
|
-
tsx test/suite/connection/test.tls-connection.ts
|
|
1233
|
-
tsx test/suite/email-processing/test.basic-email.ts
|
|
960
|
+
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
|
1234
961
|
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
962
|
+
### Trademarks
|
|
963
|
+
|
|
964
|
+
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.
|
|
1238
965
|
|
|
1239
|
-
|
|
966
|
+
Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.
|
|
1240
967
|
|
|
1241
|
-
|
|
1242
|
-
1. Starts its own SMTP server instance
|
|
1243
|
-
2. Runs comprehensive test scenarios
|
|
1244
|
-
3. Cleans up all resources
|
|
1245
|
-
4. Provides detailed logging for debugging
|
|
968
|
+
### Company Information
|
|
1246
969
|
|
|
1247
|
-
|
|
970
|
+
Task Venture Capital GmbH
|
|
971
|
+
Registered at District Court Bremen HRB 35230 HB, Germany
|
|
1248
972
|
|
|
1249
|
-
|
|
973
|
+
For any legal inquiries or further information, please contact us via email at hello@task.vc.
|
|
1250
974
|
|
|
1251
|
-
|
|
1252
|
-
- Issues: [https://github.com/serve-zone/dcrouter/issues](https://github.com/serve-zone/dcrouter/issues)
|
|
1253
|
-
- Community: [https://community.serve.zone](https://community.serve.zone)
|
|
975
|
+
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|