@serve.zone/dcrouter 5.0.2 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dist_serve/bundle.js +30539 -0
  2. package/dist_serve/bundle.js.map +7 -0
  3. package/dist_serve/index.html +1 -0
  4. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  5. package/dist_ts/00_commitinfo_data.js +9 -0
  6. package/dist_ts/cache/classes.cache.cleaner.d.ts +47 -0
  7. package/dist_ts/cache/classes.cache.cleaner.js +130 -0
  8. package/dist_ts/cache/classes.cached.document.d.ts +76 -0
  9. package/dist_ts/cache/classes.cached.document.js +100 -0
  10. package/dist_ts/cache/classes.cachedb.d.ts +60 -0
  11. package/dist_ts/cache/classes.cachedb.js +125 -0
  12. package/dist_ts/cache/documents/classes.cached.email.d.ts +125 -0
  13. package/dist_ts/cache/documents/classes.cached.email.js +337 -0
  14. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +119 -0
  15. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +323 -0
  16. package/dist_ts/cache/documents/index.d.ts +2 -0
  17. package/dist_ts/cache/documents/index.js +3 -0
  18. package/dist_ts/cache/index.d.ts +4 -0
  19. package/dist_ts/cache/index.js +7 -0
  20. package/dist_ts/classes.dcrouter.d.ts +276 -0
  21. package/dist_ts/classes.dcrouter.js +1033 -0
  22. package/dist_ts/config/index.d.ts +1 -0
  23. package/dist_ts/config/index.js +3 -0
  24. package/dist_ts/config/validator.d.ts +104 -0
  25. package/dist_ts/config/validator.js +152 -0
  26. package/dist_ts/errors/base.errors.d.ts +224 -0
  27. package/dist_ts/errors/base.errors.js +320 -0
  28. package/dist_ts/errors/error-handler.d.ts +98 -0
  29. package/dist_ts/errors/error-handler.js +282 -0
  30. package/dist_ts/errors/error.codes.d.ts +115 -0
  31. package/dist_ts/errors/error.codes.js +136 -0
  32. package/dist_ts/errors/index.d.ts +54 -0
  33. package/dist_ts/errors/index.js +136 -0
  34. package/dist_ts/errors/reputation.errors.d.ts +183 -0
  35. package/dist_ts/errors/reputation.errors.js +292 -0
  36. package/dist_ts/index.d.ts +6 -0
  37. package/dist_ts/index.js +9 -0
  38. package/dist_ts/logger.d.ts +17 -0
  39. package/dist_ts/logger.js +76 -0
  40. package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
  41. package/dist_ts/monitoring/classes.metricscache.js +63 -0
  42. package/dist_ts/monitoring/classes.metricsmanager.d.ts +112 -0
  43. package/dist_ts/monitoring/classes.metricsmanager.js +446 -0
  44. package/dist_ts/monitoring/index.d.ts +1 -0
  45. package/dist_ts/monitoring/index.js +2 -0
  46. package/dist_ts/opsserver/classes.opsserver.d.ts +22 -0
  47. package/dist_ts/opsserver/classes.opsserver.js +56 -0
  48. package/dist_ts/opsserver/handlers/admin.handler.d.ts +31 -0
  49. package/dist_ts/opsserver/handlers/admin.handler.js +180 -0
  50. package/dist_ts/opsserver/handlers/config.handler.d.ts +9 -0
  51. package/dist_ts/opsserver/handlers/config.handler.js +67 -0
  52. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +12 -0
  53. package/dist_ts/opsserver/handlers/email-ops.handler.js +219 -0
  54. package/dist_ts/opsserver/handlers/index.d.ts +7 -0
  55. package/dist_ts/opsserver/handlers/index.js +8 -0
  56. package/dist_ts/opsserver/handlers/logs.handler.d.ts +10 -0
  57. package/dist_ts/opsserver/handlers/logs.handler.js +122 -0
  58. package/dist_ts/opsserver/handlers/radius.handler.d.ts +8 -0
  59. package/dist_ts/opsserver/handlers/radius.handler.js +296 -0
  60. package/dist_ts/opsserver/handlers/security.handler.d.ts +11 -0
  61. package/dist_ts/opsserver/handlers/security.handler.js +217 -0
  62. package/dist_ts/opsserver/handlers/stats.handler.d.ts +13 -0
  63. package/dist_ts/opsserver/handlers/stats.handler.js +366 -0
  64. package/dist_ts/opsserver/helpers/guards.d.ts +25 -0
  65. package/dist_ts/opsserver/helpers/guards.js +41 -0
  66. package/dist_ts/opsserver/index.d.ts +1 -0
  67. package/dist_ts/opsserver/index.js +2 -0
  68. package/dist_ts/paths.d.ts +14 -0
  69. package/dist_ts/paths.js +39 -0
  70. package/dist_ts/plugins.d.ts +78 -0
  71. package/dist_ts/plugins.js +112 -0
  72. package/dist_ts/radius/classes.accounting.manager.d.ts +218 -0
  73. package/dist_ts/radius/classes.accounting.manager.js +417 -0
  74. package/dist_ts/radius/classes.radius.server.d.ts +171 -0
  75. package/dist_ts/radius/classes.radius.server.js +385 -0
  76. package/dist_ts/radius/classes.vlan.manager.d.ts +128 -0
  77. package/dist_ts/radius/classes.vlan.manager.js +272 -0
  78. package/dist_ts/radius/index.d.ts +13 -0
  79. package/dist_ts/radius/index.js +14 -0
  80. package/dist_ts/security/classes.contentscanner.d.ts +160 -0
  81. package/dist_ts/security/classes.contentscanner.js +637 -0
  82. package/dist_ts/security/classes.ipreputationchecker.d.ts +150 -0
  83. package/dist_ts/security/classes.ipreputationchecker.js +512 -0
  84. package/dist_ts/security/classes.securitylogger.d.ts +140 -0
  85. package/dist_ts/security/classes.securitylogger.js +235 -0
  86. package/dist_ts/security/index.d.ts +3 -0
  87. package/dist_ts/security/index.js +4 -0
  88. package/dist_ts/sms/classes.smsservice.d.ts +15 -0
  89. package/dist_ts/sms/classes.smsservice.js +72 -0
  90. package/dist_ts/sms/config/sms.config.d.ts +93 -0
  91. package/dist_ts/sms/config/sms.config.js +2 -0
  92. package/dist_ts/sms/config/sms.schema.d.ts +5 -0
  93. package/dist_ts/sms/config/sms.schema.js +121 -0
  94. package/dist_ts/sms/index.d.ts +1 -0
  95. package/dist_ts/sms/index.js +2 -0
  96. package/dist_ts/storage/classes.storagemanager.d.ts +82 -0
  97. package/dist_ts/storage/classes.storagemanager.js +344 -0
  98. package/dist_ts/storage/index.d.ts +1 -0
  99. package/dist_ts/storage/index.js +3 -0
  100. package/dist_ts_interfaces/data/auth.d.ts +8 -0
  101. package/dist_ts_interfaces/data/auth.js +2 -0
  102. package/dist_ts_interfaces/data/index.d.ts +2 -0
  103. package/dist_ts_interfaces/data/index.js +3 -0
  104. package/dist_ts_interfaces/data/stats.d.ts +120 -0
  105. package/dist_ts_interfaces/data/stats.js +2 -0
  106. package/{ts_interfaces/index.ts → dist_ts_interfaces/index.d.ts} +1 -5
  107. package/dist_ts_interfaces/index.js +8 -0
  108. package/{ts_interfaces/plugins.ts → dist_ts_interfaces/plugins.d.ts} +1 -5
  109. package/dist_ts_interfaces/plugins.js +4 -0
  110. package/dist_ts_interfaces/requests/admin.d.ts +31 -0
  111. package/dist_ts_interfaces/requests/admin.js +3 -0
  112. package/dist_ts_interfaces/requests/combined.stats.d.ts +24 -0
  113. package/dist_ts_interfaces/requests/combined.stats.js +2 -0
  114. package/dist_ts_interfaces/requests/config.d.ts +13 -0
  115. package/dist_ts_interfaces/requests/config.js +3 -0
  116. package/dist_ts_interfaces/requests/email-ops.d.ts +139 -0
  117. package/dist_ts_interfaces/requests/email-ops.js +3 -0
  118. package/{ts_interfaces/requests/index.ts → dist_ts_interfaces/requests/index.d.ts} +1 -1
  119. package/dist_ts_interfaces/requests/index.js +8 -0
  120. package/dist_ts_interfaces/requests/logs.d.ts +34 -0
  121. package/dist_ts_interfaces/requests/logs.js +4 -0
  122. package/dist_ts_interfaces/requests/radius.d.ts +268 -0
  123. package/dist_ts_interfaces/requests/radius.js +3 -0
  124. package/dist_ts_interfaces/requests/stats.d.ts +131 -0
  125. package/dist_ts_interfaces/requests/stats.js +4 -0
  126. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  127. package/dist_ts_web/00_commitinfo_data.js +9 -0
  128. package/dist_ts_web/appstate.d.ts +96 -0
  129. package/dist_ts_web/appstate.js +587 -0
  130. package/dist_ts_web/elements/index.d.ts +8 -0
  131. package/dist_ts_web/elements/index.js +9 -0
  132. package/dist_ts_web/elements/ops-dashboard.d.ts +23 -0
  133. package/dist_ts_web/elements/ops-dashboard.js +271 -0
  134. package/dist_ts_web/elements/ops-view-config.d.ts +17 -0
  135. package/dist_ts_web/elements/ops-view-config.js +414 -0
  136. package/dist_ts_web/elements/ops-view-emails.d.ts +44 -0
  137. package/dist_ts_web/elements/ops-view-emails.js +880 -0
  138. package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
  139. package/dist_ts_web/elements/ops-view-logs.js +249 -0
  140. package/dist_ts_web/elements/ops-view-network.d.ts +65 -0
  141. package/dist_ts_web/elements/ops-view-network.js +579 -0
  142. package/dist_ts_web/elements/ops-view-overview.d.ts +14 -0
  143. package/dist_ts_web/elements/ops-view-overview.js +344 -0
  144. package/dist_ts_web/elements/ops-view-security.d.ts +21 -0
  145. package/dist_ts_web/elements/ops-view-security.js +568 -0
  146. package/dist_ts_web/elements/shared/css.d.ts +1 -0
  147. package/dist_ts_web/elements/shared/css.js +10 -0
  148. package/dist_ts_web/elements/shared/index.d.ts +2 -0
  149. package/dist_ts_web/elements/shared/index.js +3 -0
  150. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +5 -0
  151. package/dist_ts_web/elements/shared/ops-sectionheading.js +82 -0
  152. package/dist_ts_web/index.d.ts +1 -0
  153. package/dist_ts_web/index.js +10 -0
  154. package/dist_ts_web/plugins.d.ts +4 -0
  155. package/dist_ts_web/plugins.js +7 -0
  156. package/dist_ts_web/router.d.ts +25 -0
  157. package/dist_ts_web/router.js +165 -0
  158. package/package.json +14 -2
  159. package/ts/00_commitinfo_data.ts +1 -1
  160. package/ts_web/00_commitinfo_data.ts +1 -1
  161. package/.dockerignore +0 -1
  162. package/.gitea/workflows/docker_nottags.yaml +0 -71
  163. package/.gitea/workflows/docker_tags.yaml +0 -106
  164. package/.playwright-mcp/dcrouter-scrollbar-issue.png +0 -0
  165. package/.playwright-mcp/page-2026-02-01T23-10-23-737Z.png +0 -0
  166. package/.playwright-mcp/page-2026-02-01T23-11-19-449Z.png +0 -0
  167. package/.playwright-mcp/page-2026-02-01T23-12-03-126Z.png +0 -0
  168. package/.playwright-mcp/page-2026-02-01T23-12-15-576Z.png +0 -0
  169. package/.vscode/launch.json +0 -11
  170. package/.vscode/settings.json +0 -26
  171. package/Dockerfile +0 -46
  172. package/changelog.md +0 -350
  173. package/cli.child.js +0 -4
  174. package/cli.child.ts +0 -4
  175. package/cli.ts.js +0 -5
  176. package/html/index.html +0 -121
  177. package/test/readme.md +0 -443
  178. package/test/test.config.md +0 -175
  179. package/test/test.contentscanner.ts +0 -265
  180. package/test/test.dcrouter.email.ts +0 -159
  181. package/test/test.dns-server-config.ts +0 -140
  182. package/test/test.dns-socket-handler.ts +0 -148
  183. package/test/test.errors.ts +0 -274
  184. package/test/test.ipreputationchecker.ts +0 -179
  185. package/test/test.jwt-auth.ts +0 -131
  186. package/test/test.opsserver-api.ts +0 -84
  187. package/test/test.protected-endpoint.ts +0 -120
  188. package/test/test.storagemanager.ts +0 -289
  189. package/test_watch/devserver.ts +0 -35
  190. package/ts_interfaces/data/auth.ts +0 -8
  191. package/ts_interfaces/data/index.ts +0 -2
  192. package/ts_interfaces/data/stats.ts +0 -131
  193. package/ts_interfaces/readme.md +0 -205
  194. package/ts_interfaces/requests/admin.ts +0 -46
  195. package/ts_interfaces/requests/combined.stats.ts +0 -25
  196. package/ts_interfaces/requests/config.ts +0 -18
  197. package/ts_interfaces/requests/email-ops.ts +0 -239
  198. package/ts_interfaces/requests/logs.ts +0 -44
  199. package/ts_interfaces/requests/radius.ts +0 -329
  200. package/ts_interfaces/requests/stats.ts +0 -162
  201. package/ts_interfaces/tspublish.json +0 -3
  202. package/tsconfig.json +0 -12
@@ -0,0 +1,235 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { logger } from '../logger.js';
3
+ /**
4
+ * Log level for security events
5
+ */
6
+ export var SecurityLogLevel;
7
+ (function (SecurityLogLevel) {
8
+ SecurityLogLevel["INFO"] = "info";
9
+ SecurityLogLevel["WARN"] = "warn";
10
+ SecurityLogLevel["ERROR"] = "error";
11
+ SecurityLogLevel["CRITICAL"] = "critical";
12
+ })(SecurityLogLevel || (SecurityLogLevel = {}));
13
+ /**
14
+ * Security event types for categorization
15
+ */
16
+ export var SecurityEventType;
17
+ (function (SecurityEventType) {
18
+ SecurityEventType["AUTHENTICATION"] = "authentication";
19
+ SecurityEventType["ACCESS_CONTROL"] = "access_control";
20
+ SecurityEventType["EMAIL_VALIDATION"] = "email_validation";
21
+ SecurityEventType["EMAIL_PROCESSING"] = "email_processing";
22
+ SecurityEventType["EMAIL_FORWARDING"] = "email_forwarding";
23
+ SecurityEventType["EMAIL_DELIVERY"] = "email_delivery";
24
+ SecurityEventType["DKIM"] = "dkim";
25
+ SecurityEventType["SPF"] = "spf";
26
+ SecurityEventType["DMARC"] = "dmarc";
27
+ SecurityEventType["RATE_LIMIT"] = "rate_limit";
28
+ SecurityEventType["RATE_LIMITING"] = "rate_limiting";
29
+ SecurityEventType["SPAM"] = "spam";
30
+ SecurityEventType["MALWARE"] = "malware";
31
+ SecurityEventType["CONNECTION"] = "connection";
32
+ SecurityEventType["DATA_EXPOSURE"] = "data_exposure";
33
+ SecurityEventType["CONFIGURATION"] = "configuration";
34
+ SecurityEventType["IP_REPUTATION"] = "ip_reputation";
35
+ SecurityEventType["REJECTED_CONNECTION"] = "rejected_connection";
36
+ })(SecurityEventType || (SecurityEventType = {}));
37
+ /**
38
+ * Security logger for enhanced security monitoring
39
+ */
40
+ export class SecurityLogger {
41
+ static instance;
42
+ securityEvents = [];
43
+ maxEventHistory;
44
+ enableNotifications;
45
+ constructor(options) {
46
+ this.maxEventHistory = options?.maxEventHistory || 1000;
47
+ this.enableNotifications = options?.enableNotifications || false;
48
+ }
49
+ /**
50
+ * Get singleton instance
51
+ */
52
+ static getInstance(options) {
53
+ if (!SecurityLogger.instance) {
54
+ SecurityLogger.instance = new SecurityLogger(options);
55
+ }
56
+ return SecurityLogger.instance;
57
+ }
58
+ /**
59
+ * Log a security event
60
+ * @param event The security event to log
61
+ */
62
+ logEvent(event) {
63
+ const fullEvent = {
64
+ ...event,
65
+ timestamp: Date.now()
66
+ };
67
+ // Store in memory buffer
68
+ this.securityEvents.push(fullEvent);
69
+ // Trim history if needed
70
+ if (this.securityEvents.length > this.maxEventHistory) {
71
+ this.securityEvents.shift();
72
+ }
73
+ // Log to regular logger with appropriate level
74
+ switch (event.level) {
75
+ case SecurityLogLevel.INFO:
76
+ logger.log('info', `[SECURITY:${event.type}] ${event.message}`, event.details);
77
+ break;
78
+ case SecurityLogLevel.WARN:
79
+ logger.log('warn', `[SECURITY:${event.type}] ${event.message}`, event.details);
80
+ break;
81
+ case SecurityLogLevel.ERROR:
82
+ case SecurityLogLevel.CRITICAL:
83
+ logger.log('error', `[SECURITY:${event.type}] ${event.message}`, event.details);
84
+ // Send notification for critical events if enabled
85
+ if (event.level === SecurityLogLevel.CRITICAL && this.enableNotifications) {
86
+ this.sendNotification(fullEvent);
87
+ }
88
+ break;
89
+ }
90
+ }
91
+ /**
92
+ * Get recent security events
93
+ * @param limit Maximum number of events to return
94
+ * @param filter Filter for specific event types
95
+ * @returns Recent security events
96
+ */
97
+ getRecentEvents(limit = 100, filter) {
98
+ let filteredEvents = this.securityEvents;
99
+ // Apply filters
100
+ if (filter) {
101
+ if (filter.level) {
102
+ filteredEvents = filteredEvents.filter(event => event.level === filter.level);
103
+ }
104
+ if (filter.type) {
105
+ filteredEvents = filteredEvents.filter(event => event.type === filter.type);
106
+ }
107
+ if (filter.fromTimestamp) {
108
+ filteredEvents = filteredEvents.filter(event => event.timestamp >= filter.fromTimestamp);
109
+ }
110
+ if (filter.toTimestamp) {
111
+ filteredEvents = filteredEvents.filter(event => event.timestamp <= filter.toTimestamp);
112
+ }
113
+ }
114
+ // Return most recent events up to limit
115
+ return filteredEvents
116
+ .sort((a, b) => b.timestamp - a.timestamp)
117
+ .slice(0, limit);
118
+ }
119
+ /**
120
+ * Get events by security level
121
+ * @param level The security level to filter by
122
+ * @param limit Maximum number of events to return
123
+ * @returns Security events matching the level
124
+ */
125
+ getEventsByLevel(level, limit = 100) {
126
+ return this.getRecentEvents(limit, { level });
127
+ }
128
+ /**
129
+ * Get events by security type
130
+ * @param type The event type to filter by
131
+ * @param limit Maximum number of events to return
132
+ * @returns Security events matching the type
133
+ */
134
+ getEventsByType(type, limit = 100) {
135
+ return this.getRecentEvents(limit, { type });
136
+ }
137
+ /**
138
+ * Get security events for a specific IP address
139
+ * @param ipAddress The IP address to filter by
140
+ * @param limit Maximum number of events to return
141
+ * @returns Security events for the IP address
142
+ */
143
+ getEventsByIP(ipAddress, limit = 100) {
144
+ return this.securityEvents
145
+ .filter(event => event.ipAddress === ipAddress)
146
+ .sort((a, b) => b.timestamp - a.timestamp)
147
+ .slice(0, limit);
148
+ }
149
+ /**
150
+ * Get security events for a specific domain
151
+ * @param domain The domain to filter by
152
+ * @param limit Maximum number of events to return
153
+ * @returns Security events for the domain
154
+ */
155
+ getEventsByDomain(domain, limit = 100) {
156
+ return this.securityEvents
157
+ .filter(event => event.domain === domain)
158
+ .sort((a, b) => b.timestamp - a.timestamp)
159
+ .slice(0, limit);
160
+ }
161
+ /**
162
+ * Send a notification for critical security events
163
+ * @param event The security event to notify about
164
+ * @private
165
+ */
166
+ sendNotification(event) {
167
+ // In a production environment, this would integrate with a notification service
168
+ // For now, we'll just log that we would send a notification
169
+ logger.log('error', `[SECURITY NOTIFICATION] ${event.message}`, {
170
+ ...event,
171
+ notificationSent: true
172
+ });
173
+ // Future integration with alerting systems would go here
174
+ }
175
+ /**
176
+ * Clear event history
177
+ */
178
+ clearEvents() {
179
+ this.securityEvents = [];
180
+ }
181
+ /**
182
+ * Get statistical summary of security events
183
+ * @param timeWindow Optional time window in milliseconds
184
+ * @returns Summary of security events
185
+ */
186
+ getEventsSummary(timeWindow) {
187
+ // Filter by time window if provided
188
+ let events = this.securityEvents;
189
+ if (timeWindow) {
190
+ const cutoff = Date.now() - timeWindow;
191
+ events = events.filter(e => e.timestamp >= cutoff);
192
+ }
193
+ // Count by level
194
+ const byLevel = Object.values(SecurityLogLevel).reduce((acc, level) => {
195
+ acc[level] = events.filter(e => e.level === level).length;
196
+ return acc;
197
+ }, {});
198
+ // Count by type
199
+ const byType = Object.values(SecurityEventType).reduce((acc, type) => {
200
+ acc[type] = events.filter(e => e.type === type).length;
201
+ return acc;
202
+ }, {});
203
+ // Count by IP
204
+ const ipCounts = new Map();
205
+ events.forEach(e => {
206
+ if (e.ipAddress) {
207
+ ipCounts.set(e.ipAddress, (ipCounts.get(e.ipAddress) || 0) + 1);
208
+ }
209
+ });
210
+ // Count by domain
211
+ const domainCounts = new Map();
212
+ events.forEach(e => {
213
+ if (e.domain) {
214
+ domainCounts.set(e.domain, (domainCounts.get(e.domain) || 0) + 1);
215
+ }
216
+ });
217
+ // Sort and limit top entries
218
+ const topIPs = Array.from(ipCounts.entries())
219
+ .map(([ip, count]) => ({ ip, count }))
220
+ .sort((a, b) => b.count - a.count)
221
+ .slice(0, 10);
222
+ const topDomains = Array.from(domainCounts.entries())
223
+ .map(([domain, count]) => ({ domain, count }))
224
+ .sort((a, b) => b.count - a.count)
225
+ .slice(0, 10);
226
+ return {
227
+ total: events.length,
228
+ byLevel,
229
+ byType,
230
+ topIPs,
231
+ topDomains
232
+ };
233
+ }
234
+ }
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZWN1cml0eWxvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3NlY3VyaXR5L2NsYXNzZXMuc2VjdXJpdHlsb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV0Qzs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGdCQUtYO0FBTEQsV0FBWSxnQkFBZ0I7SUFDMUIsaUNBQWEsQ0FBQTtJQUNiLGlDQUFhLENBQUE7SUFDYixtQ0FBZSxDQUFBO0lBQ2YseUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUxXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFLM0I7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGlCQW1CWDtBQW5CRCxXQUFZLGlCQUFpQjtJQUMzQixzREFBaUMsQ0FBQTtJQUNqQyxzREFBaUMsQ0FBQTtJQUNqQywwREFBcUMsQ0FBQTtJQUNyQywwREFBcUMsQ0FBQTtJQUNyQywwREFBcUMsQ0FBQTtJQUNyQyxzREFBaUMsQ0FBQTtJQUNqQyxrQ0FBYSxDQUFBO0lBQ2IsZ0NBQVcsQ0FBQTtJQUNYLG9DQUFlLENBQUE7SUFDZiw4Q0FBeUIsQ0FBQTtJQUN6QixvREFBK0IsQ0FBQTtJQUMvQixrQ0FBYSxDQUFBO0lBQ2Isd0NBQW1CLENBQUE7SUFDbkIsOENBQXlCLENBQUE7SUFDekIsb0RBQStCLENBQUE7SUFDL0Isb0RBQStCLENBQUE7SUFDL0Isb0RBQStCLENBQUE7SUFDL0IsZ0VBQTJDLENBQUE7QUFDN0MsQ0FBQyxFQW5CVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBbUI1QjtBQXFCRDs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQWlCO0lBQ2hDLGNBQWMsR0FBcUIsRUFBRSxDQUFDO0lBQ3RDLGVBQWUsQ0FBUztJQUN4QixtQkFBbUIsQ0FBVTtJQUVyQyxZQUFvQixPQUduQjtRQUNDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxFQUFFLGVBQWUsSUFBSSxJQUFJLENBQUM7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sRUFBRSxtQkFBbUIsSUFBSSxLQUFLLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUd6QjtRQUNDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0IsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxRQUFRLENBQUMsS0FBd0M7UUFDdEQsTUFBTSxTQUFTLEdBQW1CO1lBQ2hDLEdBQUcsS0FBSztZQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQ3RCLENBQUM7UUFFRix5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEMseUJBQXlCO1FBQ3pCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELCtDQUErQztRQUMvQyxRQUFRLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixLQUFLLGdCQUFnQixDQUFDLElBQUk7Z0JBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvRSxNQUFNO1lBQ1IsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJO2dCQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0UsTUFBTTtZQUNSLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxDQUFDO1lBQzVCLEtBQUssZ0JBQWdCLENBQUMsUUFBUTtnQkFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsYUFBYSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRWhGLG1EQUFtRDtnQkFDbkQsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO2dCQUNELE1BQU07UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksZUFBZSxDQUFDLFFBQWdCLEdBQUcsRUFBRSxNQUszQztRQUNDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFekMsZ0JBQWdCO1FBQ2hCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDakIsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRixDQUFDO1lBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUUsQ0FBQztZQUVELElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN6QixjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzNGLENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdkIsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6RixDQUFDO1FBQ0gsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxPQUFPLGNBQWM7YUFDbEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO2FBQ3pDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksZ0JBQWdCLENBQUMsS0FBdUIsRUFBRSxRQUFnQixHQUFHO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGVBQWUsQ0FBQyxJQUF1QixFQUFFLFFBQWdCLEdBQUc7UUFDakUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0IsR0FBRztRQUN6RCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDO2FBQzlDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQzthQUN6QyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxRQUFnQixHQUFHO1FBQzFELE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUM7YUFDeEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO2FBQ3pDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxLQUFxQjtRQUM1QyxnRkFBZ0Y7UUFDaEYsNERBQTREO1FBQzVELE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDJCQUEyQixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDOUQsR0FBRyxLQUFLO1lBQ1IsZ0JBQWdCLEVBQUUsSUFBSTtTQUN2QixDQUFDLENBQUM7UUFFSCx5REFBeUQ7SUFDM0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUFDLFVBQW1CO1FBT3pDLG9DQUFvQztRQUNwQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ2pDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEUsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUMxRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFzQyxDQUFDLENBQUM7UUFFM0MsZ0JBQWdCO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDbkUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN2RCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUF1QyxDQUFDLENBQUM7UUFFNUMsY0FBYztRQUNkLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQzNDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDakIsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2hCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILGtCQUFrQjtRQUNsQixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUMvQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNiLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUMxQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUNqQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWhCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2xELEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDN0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ2pDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEIsT0FBTztZQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNwQixPQUFPO1lBQ1AsTUFBTTtZQUNOLE1BQU07WUFDTixVQUFVO1NBQ1gsQ0FBQztJQUNKLENBQUM7Q0FDRiJ9
@@ -0,0 +1,3 @@
1
+ export { SecurityLogger, SecurityLogLevel, SecurityEventType, type ISecurityEvent } from './classes.securitylogger.js';
2
+ export { IPReputationChecker, ReputationThreshold, IPType, type IReputationResult, type IIPReputationOptions } from './classes.ipreputationchecker.js';
3
+ export { ContentScanner, ThreatCategory, type IScanResult, type IContentScannerOptions } from './classes.contentscanner.js';
@@ -0,0 +1,4 @@
1
+ export { SecurityLogger, SecurityLogLevel, SecurityEventType } from './classes.securitylogger.js';
2
+ export { IPReputationChecker, ReputationThreshold, IPType } from './classes.ipreputationchecker.js';
3
+ export { ContentScanner, ThreatCategory } from './classes.contentscanner.js';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zZWN1cml0eS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixpQkFBaUIsRUFFbEIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixNQUFNLEVBR1AsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxQyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGNBQWMsRUFHZixNQUFNLDZCQUE2QixDQUFDIn0=
@@ -0,0 +1,15 @@
1
+ import * as plugins from '../plugins.js';
2
+ import type { ISmsConfig } from './config/sms.config.js';
3
+ export declare class SmsService {
4
+ projectinfo: plugins.projectinfo.ProjectInfo;
5
+ typedrouter: plugins.typedrequest.TypedRouter;
6
+ config: ISmsConfig;
7
+ constructor(options: ISmsConfig);
8
+ /**
9
+ * starts the financeflow instance
10
+ */
11
+ start(): Promise<void>;
12
+ sendSms(toNumber: number, fromName: string, messageText: string): Promise<void>;
13
+ sendVerificationCode(toNumber: number, fromName: string): Promise<number>;
14
+ stop(): Promise<void>;
15
+ }
@@ -0,0 +1,72 @@
1
+ import * as plugins from '../plugins.js';
2
+ import * as paths from '../paths.js';
3
+ import { logger } from '../logger.js';
4
+ import { smsConfigSchema } from './config/sms.schema.js';
5
+ import { ConfigValidator } from '../config/validator.js';
6
+ export class SmsService {
7
+ projectinfo;
8
+ typedrouter = new plugins.typedrequest.TypedRouter();
9
+ config;
10
+ constructor(options) {
11
+ // Validate and apply defaults to configuration
12
+ const validationResult = ConfigValidator.validate(options, smsConfigSchema);
13
+ if (!validationResult.valid) {
14
+ logger.warn(`SMS service configuration has validation errors: ${validationResult.errors.join(', ')}`);
15
+ }
16
+ // Set configuration with defaults
17
+ this.config = validationResult.config;
18
+ // Add router to platform service
19
+ }
20
+ /**
21
+ * starts the financeflow instance
22
+ */
23
+ async start() {
24
+ logger.log('info', `starting sms service`);
25
+ this.projectinfo = new plugins.projectinfo.ProjectInfo(paths.packageDir);
26
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('sendSms', async (reqData) => {
27
+ await this.sendSms(reqData.toNumber, reqData.fromName, reqData.messageText);
28
+ return {
29
+ status: 'ok',
30
+ };
31
+ }));
32
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('sendVerificationCode', async (reqData) => {
33
+ const verificationCode = (await this.sendVerificationCode(reqData.toNumber, reqData.fromName)).toString();
34
+ return {
35
+ status: 'ok',
36
+ verificationCode,
37
+ };
38
+ }));
39
+ }
40
+ async sendSms(toNumber, fromName, messageText) {
41
+ // Use default sender if not specified
42
+ const sender = fromName || this.config.defaultSender || 'PlatformService';
43
+ const payload = {
44
+ sender,
45
+ message: messageText,
46
+ recipients: [{ msisdn: toNumber }],
47
+ };
48
+ const resp = await plugins.smartrequest.SmartRequest.create()
49
+ .url('https://gatewayapi.com/rest/mtsms')
50
+ .header('Authorization', `Basic ${Buffer.from(`${this.config.apiGatewayApiToken}:`).toString('base64')}`)
51
+ .header('Content-Type', 'application/json')
52
+ .json(payload)
53
+ .post();
54
+ const json = await resp.json();
55
+ logger.log('info', `sent an sms to ${toNumber} with text '${messageText}'`, {
56
+ eventType: 'sentSms',
57
+ sms: {
58
+ fromName: fromName,
59
+ toNumber: toNumber.toString(),
60
+ messageText: messageText,
61
+ },
62
+ });
63
+ console.log(JSON.stringify(json, null, 2));
64
+ }
65
+ async sendVerificationCode(toNumber, fromName) {
66
+ let verificationCode = Math.floor(100000 + Math.random() * 900000);
67
+ await this.sendSms(toNumber, fromName, `Your verification code: ${verificationCode}`);
68
+ return verificationCode;
69
+ }
70
+ async stop() { }
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbXNzZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvc21zL2NsYXNzZXMuc21zc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBR3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsTUFBTSxPQUFPLFVBQVU7SUFDZCxXQUFXLENBQWtDO0lBQzdDLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckQsTUFBTSxDQUFhO0lBRTFCLFlBQVksT0FBbUI7UUFDN0IsK0NBQStDO1FBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7UUFFdEMsaUNBQWlDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENB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
@@ -0,0 +1,93 @@
1
+ /**
2
+ * SMS service configuration interface
3
+ */
4
+ export interface ISmsConfig {
5
+ /**
6
+ * API token for the gateway service
7
+ */
8
+ apiGatewayApiToken: string;
9
+ /**
10
+ * Default sender ID or phone number
11
+ */
12
+ defaultSender?: string;
13
+ /**
14
+ * SMS rate limiting
15
+ */
16
+ rateLimit?: {
17
+ /**
18
+ * Whether rate limiting is enabled
19
+ */
20
+ enabled?: boolean;
21
+ /**
22
+ * Maximum requests per period
23
+ */
24
+ maxPerPeriod?: number;
25
+ /**
26
+ * Period duration in milliseconds
27
+ */
28
+ periodMs?: number;
29
+ /**
30
+ * Whether to apply rate limit per key
31
+ */
32
+ perKey?: boolean;
33
+ /**
34
+ * Number of burst tokens
35
+ */
36
+ burstTokens?: number;
37
+ /**
38
+ * Maximum messages per recipient per day
39
+ */
40
+ maxPerRecipientPerDay?: number;
41
+ };
42
+ /**
43
+ * SMS provider configuration
44
+ */
45
+ provider?: {
46
+ /**
47
+ * Provider type
48
+ */
49
+ type?: 'gateway' | 'twilio' | 'other';
50
+ /**
51
+ * Provider-specific configuration
52
+ */
53
+ config?: Record<string, any>;
54
+ /**
55
+ * Fallback provider configuration
56
+ */
57
+ fallback?: {
58
+ /**
59
+ * Whether to use fallback provider
60
+ */
61
+ enabled?: boolean;
62
+ /**
63
+ * Provider type
64
+ */
65
+ type?: 'gateway' | 'twilio' | 'other';
66
+ /**
67
+ * Provider-specific configuration
68
+ */
69
+ config?: Record<string, any>;
70
+ };
71
+ };
72
+ /**
73
+ * Verification code settings
74
+ */
75
+ verification?: {
76
+ /**
77
+ * Code length
78
+ */
79
+ codeLength?: number;
80
+ /**
81
+ * Code expiration time in seconds
82
+ */
83
+ expirationSeconds?: number;
84
+ /**
85
+ * Maximum number of attempts
86
+ */
87
+ maxAttempts?: number;
88
+ /**
89
+ * Cooldown period in seconds
90
+ */
91
+ cooldownSeconds?: number;
92
+ };
93
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21zLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3Ntcy9jb25maWcvc21zLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,5 @@
1
+ import type { ValidationSchema } from '../../config/validator.js';
2
+ /**
3
+ * SMS service configuration schema
4
+ */
5
+ export declare const smsConfigSchema: ValidationSchema;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * SMS service configuration schema
3
+ */
4
+ export const smsConfigSchema = {
5
+ apiGatewayApiToken: {
6
+ type: 'string',
7
+ required: true
8
+ },
9
+ defaultSender: {
10
+ type: 'string',
11
+ required: false
12
+ },
13
+ rateLimit: {
14
+ type: 'object',
15
+ required: false,
16
+ schema: {
17
+ enabled: {
18
+ type: 'boolean',
19
+ required: false,
20
+ default: true
21
+ },
22
+ maxPerPeriod: {
23
+ type: 'number',
24
+ required: false,
25
+ default: 100,
26
+ min: 1
27
+ },
28
+ periodMs: {
29
+ type: 'number',
30
+ required: false,
31
+ default: 60000, // 1 minute
32
+ min: 1000
33
+ },
34
+ perKey: {
35
+ type: 'boolean',
36
+ required: false,
37
+ default: true
38
+ },
39
+ burstTokens: {
40
+ type: 'number',
41
+ required: false,
42
+ default: 5,
43
+ min: 0
44
+ },
45
+ maxPerRecipientPerDay: {
46
+ type: 'number',
47
+ required: false,
48
+ default: 10,
49
+ min: 1
50
+ }
51
+ }
52
+ },
53
+ provider: {
54
+ type: 'object',
55
+ required: false,
56
+ schema: {
57
+ type: {
58
+ type: 'string',
59
+ required: false,
60
+ enum: ['gateway', 'twilio', 'other'],
61
+ default: 'gateway'
62
+ },
63
+ config: {
64
+ type: 'object',
65
+ required: false
66
+ },
67
+ fallback: {
68
+ type: 'object',
69
+ required: false,
70
+ schema: {
71
+ enabled: {
72
+ type: 'boolean',
73
+ required: false,
74
+ default: false
75
+ },
76
+ type: {
77
+ type: 'string',
78
+ required: false,
79
+ enum: ['gateway', 'twilio', 'other']
80
+ },
81
+ config: {
82
+ type: 'object',
83
+ required: false
84
+ }
85
+ }
86
+ }
87
+ }
88
+ },
89
+ verification: {
90
+ type: 'object',
91
+ required: false,
92
+ schema: {
93
+ codeLength: {
94
+ type: 'number',
95
+ required: false,
96
+ default: 6,
97
+ min: 4,
98
+ max: 10
99
+ },
100
+ expirationSeconds: {
101
+ type: 'number',
102
+ required: false,
103
+ default: 300, // 5 minutes
104
+ min: 60
105
+ },
106
+ maxAttempts: {
107
+ type: 'number',
108
+ required: false,
109
+ default: 3,
110
+ min: 1
111
+ },
112
+ cooldownSeconds: {
113
+ type: 'number',
114
+ required: false,
115
+ default: 60, // 1 minute
116
+ min: 0
117
+ }
118
+ }
119
+ }
120
+ };
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21zLnNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3Ntcy9jb25maWcvc21zLnNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBcUI7SUFDL0Msa0JBQWtCLEVBQUU7UUFDbEIsSUFBSSxFQUFFLFFBQVE7UUFDZCxRQUFRLEVBQUUsSUFBSTtLQUNmO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsSUFBSSxFQUFFLFFBQVE7UUFDZCxRQUFRLEVBQUUsS0FBSztLQUNoQjtJQUNELFNBQVMsRUFBRTtRQUNULElBQUksRUFBRSxRQUFRO1FBQ2QsUUFBUSxFQUFFLEtBQUs7UUFDZixNQUFNLEVBQUU7WUFDTixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsT0FBTyxFQUFFLElBQUk7YUFDZDtZQUNELFlBQVksRUFBRTtnQkFDWixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsS0FBSztnQkFDZixPQUFPLEVBQUUsR0FBRztnQkFDWixHQUFHLEVBQUUsQ0FBQzthQUNQO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVztnQkFDM0IsR0FBRyxFQUFFLElBQUk7YUFDVjtZQUNELE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsU0FBUztnQkFDZixRQUFRLEVBQUUsS0FBSztnQkFDZixPQUFPLEVBQUUsSUFBSTthQUNkO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRCxxQkFBcUIsRUFBRTtnQkFDckIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsR0FBRyxFQUFFLENBQUM7YUFDUDtTQUNGO0tBQ0Y7SUFDRCxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUUsUUFBUTtRQUNkLFFBQVEsRUFBRSxLQUFLO1FBQ2YsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxLQUFLO2dCQUNmLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDO2dCQUNwQyxPQUFPLEVBQUUsU0FBUzthQUNuQjtZQUNELE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsS0FBSzthQUNoQjtZQUNELFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUU7b0JBQ04sT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRSxTQUFTO3dCQUNmLFFBQVEsRUFBRSxLQUFLO3dCQUNmLE9BQU8sRUFBRSxLQUFLO3FCQUNmO29CQUNELElBQUksRUFBRTt3QkFDSixJQUFJLEVBQUUsUUFBUTt3QkFDZCxRQUFRLEVBQUUsS0FBSzt3QkFDZixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztxQkFDckM7b0JBQ0QsTUFBTSxFQUFFO3dCQUNOLElBQUksRUFBRSxRQUFRO3dCQUNkLFFBQVEsRUFBRSxLQUFLO3FCQUNoQjtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtJQUNELFlBQVksRUFBRTtRQUNaLElBQUksRUFBRSxRQUFRO1FBQ2QsUUFBUSxFQUFFLEtBQUs7UUFDZixNQUFNLEVBQUU7WUFDTixVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLEVBQUU7YUFDUjtZQUNELGlCQUFpQixFQUFFO2dCQUNqQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsS0FBSztnQkFDZixPQUFPLEVBQUUsR0FBRyxFQUFFLFlBQVk7Z0JBQzFCLEdBQUcsRUFBRSxFQUFFO2FBQ1I7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsR0FBRyxFQUFFLENBQUM7YUFDUDtZQUNELGVBQWUsRUFBRTtnQkFDZixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsS0FBSztnQkFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLFdBQVc7Z0JBQ3hCLEdBQUcsRUFBRSxDQUFDO2FBQ1A7U0FDRjtLQUNGO0NBQ0YsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ export * from './classes.smsservice.js';
@@ -0,0 +1,2 @@
1
+ export * from './classes.smsservice.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zbXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx5QkFBeUIsQ0FBQyJ9
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Storage configuration interface
3
+ */
4
+ export interface IStorageConfig {
5
+ /** Filesystem path for storage */
6
+ fsPath?: string;
7
+ /** Custom read function */
8
+ readFunction?: (key: string) => Promise<string>;
9
+ /** Custom write function */
10
+ writeFunction?: (key: string, value: string) => Promise<void>;
11
+ }
12
+ /**
13
+ * Storage backend type
14
+ */
15
+ export type StorageBackend = 'filesystem' | 'custom' | 'memory';
16
+ /**
17
+ * Central storage manager for DcRouter
18
+ * Provides unified key-value storage with multiple backend support
19
+ */
20
+ export declare class StorageManager {
21
+ private backend;
22
+ private memoryStore;
23
+ private config;
24
+ private fsBasePath?;
25
+ constructor(config?: IStorageConfig);
26
+ /**
27
+ * Show warning when using memory backend
28
+ */
29
+ private showMemoryWarning;
30
+ /**
31
+ * Ensure directory exists for filesystem backend
32
+ */
33
+ private ensureDirectory;
34
+ /**
35
+ * Validate and sanitize storage key
36
+ */
37
+ private validateKey;
38
+ /**
39
+ * Convert key to filesystem path
40
+ */
41
+ private keyToPath;
42
+ /**
43
+ * Internal filesystem read function
44
+ */
45
+ private fsRead;
46
+ /**
47
+ * Internal filesystem write function
48
+ */
49
+ private fsWrite;
50
+ /**
51
+ * Get value by key
52
+ */
53
+ get(key: string): Promise<string | null>;
54
+ /**
55
+ * Set value by key
56
+ */
57
+ set(key: string, value: string): Promise<void>;
58
+ /**
59
+ * Delete value by key
60
+ */
61
+ delete(key: string): Promise<void>;
62
+ /**
63
+ * List keys by prefix
64
+ */
65
+ list(prefix?: string): Promise<string[]>;
66
+ /**
67
+ * Check if key exists
68
+ */
69
+ exists(key: string): Promise<boolean>;
70
+ /**
71
+ * Get storage backend type
72
+ */
73
+ getBackend(): StorageBackend;
74
+ /**
75
+ * JSON helper: Get and parse JSON value
76
+ */
77
+ getJSON<T = any>(key: string): Promise<T | null>;
78
+ /**
79
+ * JSON helper: Set value as JSON
80
+ */
81
+ setJSON(key: string, value: any): Promise<void>;
82
+ }