@serve.zone/dcrouter 11.14.0 → 11.16.0

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 (207) hide show
  1. package/dist_serve/bundle.js +5 -9
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/cache/classes.cache.cleaner.d.ts +47 -0
  5. package/dist_ts/cache/classes.cache.cleaner.js +130 -0
  6. package/dist_ts/cache/classes.cached.document.d.ts +76 -0
  7. package/dist_ts/cache/classes.cached.document.js +100 -0
  8. package/dist_ts/cache/classes.cachedb.d.ts +60 -0
  9. package/dist_ts/cache/classes.cachedb.js +126 -0
  10. package/dist_ts/cache/documents/classes.cached.email.d.ts +125 -0
  11. package/dist_ts/cache/documents/classes.cached.email.js +337 -0
  12. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +119 -0
  13. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +323 -0
  14. package/dist_ts/cache/documents/index.d.ts +2 -0
  15. package/dist_ts/cache/documents/index.js +3 -0
  16. package/dist_ts/cache/index.d.ts +4 -0
  17. package/dist_ts/cache/index.js +7 -0
  18. package/dist_ts/classes.cert-provision-scheduler.d.ts +54 -0
  19. package/dist_ts/classes.cert-provision-scheduler.js +118 -0
  20. package/dist_ts/classes.dcrouter.d.ts +399 -0
  21. package/dist_ts/classes.dcrouter.js +1697 -0
  22. package/dist_ts/classes.storage-cert-manager.d.ts +18 -0
  23. package/dist_ts/classes.storage-cert-manager.js +43 -0
  24. package/dist_ts/config/classes.api-token-manager.d.ts +46 -0
  25. package/dist_ts/config/classes.api-token-manager.js +150 -0
  26. package/dist_ts/config/classes.route-config-manager.d.ts +38 -0
  27. package/dist_ts/config/classes.route-config-manager.js +257 -0
  28. package/dist_ts/config/index.d.ts +3 -0
  29. package/dist_ts/config/index.js +5 -0
  30. package/dist_ts/config/validator.d.ts +104 -0
  31. package/dist_ts/config/validator.js +152 -0
  32. package/dist_ts/errors/base.errors.d.ts +224 -0
  33. package/dist_ts/errors/base.errors.js +320 -0
  34. package/dist_ts/errors/error-handler.d.ts +98 -0
  35. package/dist_ts/errors/error-handler.js +282 -0
  36. package/dist_ts/errors/error.codes.d.ts +115 -0
  37. package/dist_ts/errors/error.codes.js +136 -0
  38. package/dist_ts/errors/index.d.ts +54 -0
  39. package/dist_ts/errors/index.js +136 -0
  40. package/dist_ts/errors/reputation.errors.d.ts +183 -0
  41. package/dist_ts/errors/reputation.errors.js +292 -0
  42. package/dist_ts/http3/http3-route-augmentation.d.ts +50 -0
  43. package/dist_ts/http3/http3-route-augmentation.js +98 -0
  44. package/dist_ts/http3/index.d.ts +1 -0
  45. package/dist_ts/http3/index.js +2 -0
  46. package/dist_ts/index.d.ts +8 -0
  47. package/dist_ts/index.js +29 -0
  48. package/dist_ts/logger.d.ts +21 -0
  49. package/dist_ts/logger.js +81 -0
  50. package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
  51. package/dist_ts/monitoring/classes.metricscache.js +63 -0
  52. package/dist_ts/monitoring/classes.metricsmanager.d.ts +184 -0
  53. package/dist_ts/monitoring/classes.metricsmanager.js +744 -0
  54. package/dist_ts/monitoring/index.d.ts +1 -0
  55. package/dist_ts/monitoring/index.js +2 -0
  56. package/dist_ts/opsserver/classes.opsserver.d.ts +38 -0
  57. package/dist_ts/opsserver/classes.opsserver.js +87 -0
  58. package/dist_ts/opsserver/handlers/admin.handler.d.ts +31 -0
  59. package/dist_ts/opsserver/handlers/admin.handler.js +180 -0
  60. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +6 -0
  61. package/dist_ts/opsserver/handlers/api-token.handler.js +62 -0
  62. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +32 -0
  63. package/dist_ts/opsserver/handlers/certificate.handler.js +421 -0
  64. package/dist_ts/opsserver/handlers/config.handler.d.ts +7 -0
  65. package/dist_ts/opsserver/handlers/config.handler.js +192 -0
  66. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +30 -0
  67. package/dist_ts/opsserver/handlers/email-ops.handler.js +227 -0
  68. package/dist_ts/opsserver/handlers/index.d.ts +12 -0
  69. package/dist_ts/opsserver/handlers/index.js +13 -0
  70. package/dist_ts/opsserver/handlers/logs.handler.d.ts +25 -0
  71. package/dist_ts/opsserver/handlers/logs.handler.js +256 -0
  72. package/dist_ts/opsserver/handlers/radius.handler.d.ts +6 -0
  73. package/dist_ts/opsserver/handlers/radius.handler.js +295 -0
  74. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +6 -0
  75. package/dist_ts/opsserver/handlers/remoteingress.handler.js +156 -0
  76. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +14 -0
  77. package/dist_ts/opsserver/handlers/route-management.handler.js +117 -0
  78. package/dist_ts/opsserver/handlers/security.handler.d.ts +9 -0
  79. package/dist_ts/opsserver/handlers/security.handler.js +233 -0
  80. package/dist_ts/opsserver/handlers/stats.handler.d.ts +11 -0
  81. package/dist_ts/opsserver/handlers/stats.handler.js +403 -0
  82. package/dist_ts/opsserver/handlers/vpn.handler.d.ts +6 -0
  83. package/dist_ts/opsserver/handlers/vpn.handler.js +197 -0
  84. package/dist_ts/opsserver/helpers/guards.d.ts +27 -0
  85. package/dist_ts/opsserver/helpers/guards.js +43 -0
  86. package/dist_ts/opsserver/index.d.ts +1 -0
  87. package/dist_ts/opsserver/index.js +2 -0
  88. package/dist_ts/paths.d.ts +26 -0
  89. package/dist_ts/paths.js +45 -0
  90. package/dist_ts/plugins.d.ts +81 -0
  91. package/dist_ts/plugins.js +115 -0
  92. package/dist_ts/radius/classes.accounting.manager.d.ts +231 -0
  93. package/dist_ts/radius/classes.accounting.manager.js +462 -0
  94. package/dist_ts/radius/classes.radius.server.d.ts +171 -0
  95. package/dist_ts/radius/classes.radius.server.js +386 -0
  96. package/dist_ts/radius/classes.vlan.manager.d.ts +128 -0
  97. package/dist_ts/radius/classes.vlan.manager.js +279 -0
  98. package/dist_ts/radius/index.d.ts +13 -0
  99. package/dist_ts/radius/index.js +14 -0
  100. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +94 -0
  101. package/dist_ts/remoteingress/classes.remoteingress-manager.js +271 -0
  102. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +59 -0
  103. package/dist_ts/remoteingress/classes.tunnel-manager.js +165 -0
  104. package/dist_ts/remoteingress/index.d.ts +2 -0
  105. package/dist_ts/remoteingress/index.js +3 -0
  106. package/dist_ts/security/classes.contentscanner.d.ts +164 -0
  107. package/dist_ts/security/classes.contentscanner.js +642 -0
  108. package/dist_ts/security/classes.ipreputationchecker.d.ts +160 -0
  109. package/dist_ts/security/classes.ipreputationchecker.js +537 -0
  110. package/dist_ts/security/classes.securitylogger.d.ts +144 -0
  111. package/dist_ts/security/classes.securitylogger.js +235 -0
  112. package/dist_ts/security/index.d.ts +3 -0
  113. package/dist_ts/security/index.js +4 -0
  114. package/dist_ts/sms/classes.smsservice.d.ts +15 -0
  115. package/dist_ts/sms/classes.smsservice.js +72 -0
  116. package/dist_ts/sms/config/sms.config.d.ts +93 -0
  117. package/dist_ts/sms/config/sms.config.js +2 -0
  118. package/dist_ts/sms/config/sms.schema.d.ts +5 -0
  119. package/dist_ts/sms/config/sms.schema.js +121 -0
  120. package/dist_ts/sms/index.d.ts +1 -0
  121. package/dist_ts/sms/index.js +2 -0
  122. package/dist_ts/storage/classes.storagemanager.d.ts +83 -0
  123. package/dist_ts/storage/classes.storagemanager.js +348 -0
  124. package/dist_ts/storage/index.d.ts +1 -0
  125. package/dist_ts/storage/index.js +3 -0
  126. package/dist_ts/vpn/classes.vpn-manager.d.ts +129 -0
  127. package/dist_ts/vpn/classes.vpn-manager.js +329 -0
  128. package/dist_ts/vpn/index.d.ts +1 -0
  129. package/dist_ts/vpn/index.js +2 -0
  130. package/dist_ts_apiclient/classes.apitoken.d.ts +41 -0
  131. package/dist_ts_apiclient/classes.apitoken.js +115 -0
  132. package/dist_ts_apiclient/classes.certificate.d.ts +57 -0
  133. package/dist_ts_apiclient/classes.certificate.js +69 -0
  134. package/dist_ts_apiclient/classes.config.d.ts +7 -0
  135. package/dist_ts_apiclient/classes.config.js +11 -0
  136. package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +41 -0
  137. package/dist_ts_apiclient/classes.dcrouterapiclient.js +81 -0
  138. package/dist_ts_apiclient/classes.email.d.ts +30 -0
  139. package/dist_ts_apiclient/classes.email.js +52 -0
  140. package/dist_ts_apiclient/classes.logs.d.ts +21 -0
  141. package/dist_ts_apiclient/classes.logs.js +14 -0
  142. package/dist_ts_apiclient/classes.radius.d.ts +59 -0
  143. package/dist_ts_apiclient/classes.radius.js +95 -0
  144. package/dist_ts_apiclient/classes.remoteingress.d.ts +54 -0
  145. package/dist_ts_apiclient/classes.remoteingress.js +136 -0
  146. package/dist_ts_apiclient/classes.route.d.ts +42 -0
  147. package/dist_ts_apiclient/classes.route.js +154 -0
  148. package/dist_ts_apiclient/classes.stats.d.ts +47 -0
  149. package/dist_ts_apiclient/classes.stats.js +38 -0
  150. package/dist_ts_apiclient/index.d.ts +10 -0
  151. package/dist_ts_apiclient/index.js +14 -0
  152. package/dist_ts_apiclient/plugins.d.ts +3 -0
  153. package/dist_ts_apiclient/plugins.js +5 -0
  154. package/dist_ts_interfaces/data/remoteingress.d.ts +2 -0
  155. package/dist_ts_interfaces/data/vpn.d.ts +1 -2
  156. package/dist_ts_interfaces/requests/vpn.d.ts +1 -1
  157. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  158. package/dist_ts_web/00_commitinfo_data.js +9 -0
  159. package/dist_ts_web/appstate.d.ts +238 -0
  160. package/dist_ts_web/appstate.js +1174 -0
  161. package/dist_ts_web/elements/index.d.ts +13 -0
  162. package/dist_ts_web/elements/index.js +14 -0
  163. package/dist_ts_web/elements/ops-dashboard.d.ts +23 -0
  164. package/dist_ts_web/elements/ops-dashboard.js +323 -0
  165. package/dist_ts_web/elements/ops-view-apitokens.d.ts +13 -0
  166. package/dist_ts_web/elements/ops-view-apitokens.js +371 -0
  167. package/dist_ts_web/elements/ops-view-certificates.d.ts +22 -0
  168. package/dist_ts_web/elements/ops-view-certificates.js +528 -0
  169. package/dist_ts_web/elements/ops-view-config.d.ts +19 -0
  170. package/dist_ts_web/elements/ops-view-config.js +339 -0
  171. package/dist_ts_web/elements/ops-view-emails.d.ts +21 -0
  172. package/dist_ts_web/elements/ops-view-emails.js +165 -0
  173. package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
  174. package/dist_ts_web/elements/ops-view-logs.js +159 -0
  175. package/dist_ts_web/elements/ops-view-network.d.ts +71 -0
  176. package/dist_ts_web/elements/ops-view-network.js +764 -0
  177. package/dist_ts_web/elements/ops-view-overview.d.ts +22 -0
  178. package/dist_ts_web/elements/ops-view-overview.js +456 -0
  179. package/dist_ts_web/elements/ops-view-remoteingress.d.ts +20 -0
  180. package/dist_ts_web/elements/ops-view-remoteingress.js +494 -0
  181. package/dist_ts_web/elements/ops-view-routes.d.ts +12 -0
  182. package/dist_ts_web/elements/ops-view-routes.js +404 -0
  183. package/dist_ts_web/elements/ops-view-security.d.ts +21 -0
  184. package/dist_ts_web/elements/ops-view-security.js +574 -0
  185. package/dist_ts_web/elements/ops-view-vpn.d.ts +14 -0
  186. package/dist_ts_web/elements/ops-view-vpn.js +365 -0
  187. package/dist_ts_web/elements/shared/css.d.ts +1 -0
  188. package/dist_ts_web/elements/shared/css.js +10 -0
  189. package/dist_ts_web/elements/shared/index.d.ts +2 -0
  190. package/dist_ts_web/elements/shared/index.js +3 -0
  191. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +5 -0
  192. package/dist_ts_web/elements/shared/ops-sectionheading.js +82 -0
  193. package/dist_ts_web/index.d.ts +1 -0
  194. package/dist_ts_web/index.js +10 -0
  195. package/dist_ts_web/plugins.d.ts +6 -0
  196. package/dist_ts_web/plugins.js +11 -0
  197. package/dist_ts_web/router.d.ts +19 -0
  198. package/dist_ts_web/router.js +91 -0
  199. package/package.json +2 -2
  200. package/ts/00_commitinfo_data.ts +1 -1
  201. package/ts/classes.dcrouter.ts +51 -20
  202. package/ts/config/classes.route-config-manager.ts +7 -6
  203. package/ts/opsserver/handlers/vpn.handler.ts +3 -5
  204. package/ts/vpn/classes.vpn-manager.ts +68 -19
  205. package/ts_web/00_commitinfo_data.ts +1 -1
  206. package/ts_web/appstate.ts +2 -2
  207. package/ts_web/elements/ops-view-vpn.ts +5 -9
@@ -0,0 +1,60 @@
1
+ import * as plugins from '../plugins.js';
2
+ /**
3
+ * Configuration options for CacheDb
4
+ */
5
+ export interface ICacheDbOptions {
6
+ /** Base storage path for TsmDB data (default: ~/.serve.zone/dcrouter/tsmdb) */
7
+ storagePath?: string;
8
+ /** Database name (default: dcrouter) */
9
+ dbName?: string;
10
+ /** Enable debug logging */
11
+ debug?: boolean;
12
+ }
13
+ /**
14
+ * CacheDb - Wrapper around LocalSmartDb and smartdata
15
+ *
16
+ * Provides persistent caching using smartdata as the ORM layer
17
+ * and LocalSmartDb as the embedded database engine.
18
+ */
19
+ export declare class CacheDb {
20
+ private static instance;
21
+ private localSmartDb;
22
+ private smartdataDb;
23
+ private options;
24
+ private isStarted;
25
+ constructor(options?: ICacheDbOptions);
26
+ /**
27
+ * Get or create the singleton instance
28
+ */
29
+ static getInstance(options?: ICacheDbOptions): CacheDb;
30
+ /**
31
+ * Reset the singleton instance (useful for testing)
32
+ */
33
+ static resetInstance(): void;
34
+ /**
35
+ * Start the cache database
36
+ * - Initializes LocalSmartDb with file persistence
37
+ * - Connects smartdata to the LocalSmartDb via Unix socket
38
+ */
39
+ start(): Promise<void>;
40
+ /**
41
+ * Stop the cache database
42
+ */
43
+ stop(): Promise<void>;
44
+ /**
45
+ * Get the smartdata database instance
46
+ */
47
+ getDb(): plugins.smartdata.SmartdataDb;
48
+ /**
49
+ * Check if the database is ready
50
+ */
51
+ isReady(): boolean;
52
+ /**
53
+ * Get the storage path
54
+ */
55
+ getStoragePath(): string;
56
+ /**
57
+ * Get the database name
58
+ */
59
+ getDbName(): string;
60
+ }
@@ -0,0 +1,126 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { logger } from '../logger.js';
3
+ import { defaultTsmDbPath } from '../paths.js';
4
+ /**
5
+ * CacheDb - Wrapper around LocalSmartDb and smartdata
6
+ *
7
+ * Provides persistent caching using smartdata as the ORM layer
8
+ * and LocalSmartDb as the embedded database engine.
9
+ */
10
+ export class CacheDb {
11
+ static instance = null;
12
+ localSmartDb;
13
+ smartdataDb;
14
+ options;
15
+ isStarted = false;
16
+ constructor(options = {}) {
17
+ this.options = {
18
+ storagePath: options.storagePath || defaultTsmDbPath,
19
+ dbName: options.dbName || 'dcrouter',
20
+ debug: options.debug || false,
21
+ };
22
+ }
23
+ /**
24
+ * Get or create the singleton instance
25
+ */
26
+ static getInstance(options) {
27
+ if (!CacheDb.instance) {
28
+ CacheDb.instance = new CacheDb(options);
29
+ }
30
+ return CacheDb.instance;
31
+ }
32
+ /**
33
+ * Reset the singleton instance (useful for testing)
34
+ */
35
+ static resetInstance() {
36
+ CacheDb.instance = null;
37
+ }
38
+ /**
39
+ * Start the cache database
40
+ * - Initializes LocalSmartDb with file persistence
41
+ * - Connects smartdata to the LocalSmartDb via Unix socket
42
+ */
43
+ async start() {
44
+ if (this.isStarted) {
45
+ logger.log('warn', 'CacheDb already started');
46
+ return;
47
+ }
48
+ try {
49
+ // Ensure storage directory exists
50
+ await plugins.fsUtils.ensureDir(this.options.storagePath);
51
+ // Create LocalSmartDb instance
52
+ this.localSmartDb = new plugins.smartdb.LocalSmartDb({
53
+ folderPath: this.options.storagePath,
54
+ });
55
+ // Start LocalSmartDb and get connection info
56
+ const connectionInfo = await this.localSmartDb.start();
57
+ if (this.options.debug) {
58
+ logger.log('debug', `LocalSmartDb started with URI: ${connectionInfo.connectionUri}`);
59
+ }
60
+ // Initialize smartdata with the connection URI
61
+ this.smartdataDb = new plugins.smartdata.SmartdataDb({
62
+ mongoDbUrl: connectionInfo.connectionUri,
63
+ mongoDbName: this.options.dbName,
64
+ });
65
+ await this.smartdataDb.init();
66
+ this.isStarted = true;
67
+ logger.log('info', `CacheDb started at ${this.options.storagePath}`);
68
+ }
69
+ catch (error) {
70
+ logger.log('error', `Failed to start CacheDb: ${error.message}`);
71
+ throw error;
72
+ }
73
+ }
74
+ /**
75
+ * Stop the cache database
76
+ */
77
+ async stop() {
78
+ if (!this.isStarted) {
79
+ return;
80
+ }
81
+ try {
82
+ // Close smartdata connection
83
+ if (this.smartdataDb) {
84
+ await this.smartdataDb.close();
85
+ }
86
+ // Stop LocalSmartDb
87
+ if (this.localSmartDb) {
88
+ await this.localSmartDb.stop();
89
+ }
90
+ this.isStarted = false;
91
+ logger.log('info', 'CacheDb stopped');
92
+ }
93
+ catch (error) {
94
+ logger.log('error', `Error stopping CacheDb: ${error.message}`);
95
+ throw error;
96
+ }
97
+ }
98
+ /**
99
+ * Get the smartdata database instance
100
+ */
101
+ getDb() {
102
+ if (!this.isStarted) {
103
+ throw new Error('CacheDb not started. Call start() first.');
104
+ }
105
+ return this.smartdataDb;
106
+ }
107
+ /**
108
+ * Check if the database is ready
109
+ */
110
+ isReady() {
111
+ return this.isStarted;
112
+ }
113
+ /**
114
+ * Get the storage path
115
+ */
116
+ getStoragePath() {
117
+ return this.options.storagePath;
118
+ }
119
+ /**
120
+ * Get the database name
121
+ */
122
+ getDbName() {
123
+ return this.options.dbName;
124
+ }
125
+ }
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZWRiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY2FjaGUvY2xhc3Nlcy5jYWNoZWRiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBYy9DOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFDVixNQUFNLENBQUMsUUFBUSxHQUFtQixJQUFJLENBQUM7SUFFdkMsWUFBWSxDQUFnQztJQUM1QyxXQUFXLENBQWlDO0lBQzVDLE9BQU8sQ0FBNEI7SUFDbkMsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUVuQyxZQUFZLFVBQTJCLEVBQUU7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLGdCQUFnQjtZQUNwRCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxVQUFVO1lBQ3BDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUs7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBeUI7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGFBQWE7UUFDekIsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBQzlDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsa0NBQWtDO1lBQ2xDLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUUxRCwrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUNuRCxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO2FBQ3JDLENBQUMsQ0FBQztZQUVILDZDQUE2QztZQUM3QyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFdkQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxrQ0FBa0MsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUVELCtDQUErQztZQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7Z0JBQ25ELFVBQVUsRUFBRSxjQUFjLENBQUMsYUFBYTtnQkFDeEMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTthQUNqQyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSw0QkFBNkIsS0FBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUUsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsNkJBQTZCO1lBQzdCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUVELG9CQUFvQjtZQUNwQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pDLENBQUM7WUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDJCQUE0QixLQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMzRSxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDIn0=
@@ -0,0 +1,125 @@
1
+ import { CachedDocument } from '../classes.cached.document.js';
2
+ /**
3
+ * Email status in the cache
4
+ */
5
+ export type TCachedEmailStatus = 'pending' | 'processing' | 'delivered' | 'failed' | 'deferred';
6
+ /**
7
+ * CachedEmail - Stores email queue items in the cache
8
+ *
9
+ * Used for persistent email queue storage, tracking delivery status,
10
+ * and maintaining email history for the configured TTL period.
11
+ */
12
+ export declare class CachedEmail extends CachedDocument<CachedEmail> {
13
+ createdAt: Date;
14
+ expiresAt: Date;
15
+ lastAccessedAt: Date;
16
+ /**
17
+ * Unique identifier for this email
18
+ */
19
+ id: string;
20
+ /**
21
+ * Email message ID (RFC 822 Message-ID header)
22
+ */
23
+ messageId: string;
24
+ /**
25
+ * Sender email address (envelope from)
26
+ */
27
+ from: string;
28
+ /**
29
+ * Recipient email addresses
30
+ */
31
+ to: string[];
32
+ /**
33
+ * CC recipients
34
+ */
35
+ cc: string[];
36
+ /**
37
+ * BCC recipients
38
+ */
39
+ bcc: string[];
40
+ /**
41
+ * Email subject
42
+ */
43
+ subject: string;
44
+ /**
45
+ * Raw RFC822 email content
46
+ */
47
+ rawContent: string;
48
+ /**
49
+ * Current status of the email
50
+ */
51
+ status: TCachedEmailStatus;
52
+ /**
53
+ * Number of delivery attempts
54
+ */
55
+ attempts: number;
56
+ /**
57
+ * Maximum number of delivery attempts
58
+ */
59
+ maxAttempts: number;
60
+ /**
61
+ * Timestamp for next delivery attempt
62
+ */
63
+ nextAttempt: Date;
64
+ /**
65
+ * Last error message if delivery failed
66
+ */
67
+ lastError: string;
68
+ /**
69
+ * Timestamp when the email was successfully delivered
70
+ */
71
+ deliveredAt: Date;
72
+ /**
73
+ * Sender domain (for querying/filtering)
74
+ */
75
+ senderDomain: string;
76
+ /**
77
+ * Priority level (higher = more important)
78
+ */
79
+ priority: number;
80
+ /**
81
+ * JSON-serialized route data
82
+ */
83
+ routeData: string;
84
+ /**
85
+ * DKIM signature status
86
+ */
87
+ dkimSigned: boolean;
88
+ constructor();
89
+ /**
90
+ * Create a new CachedEmail with a unique ID
91
+ */
92
+ static createNew(): CachedEmail;
93
+ /**
94
+ * Find an email by ID
95
+ */
96
+ static findById(id: string): Promise<CachedEmail | null>;
97
+ /**
98
+ * Find all emails with a specific status
99
+ */
100
+ static findByStatus(status: TCachedEmailStatus): Promise<CachedEmail[]>;
101
+ /**
102
+ * Find all emails pending delivery (status = pending and nextAttempt <= now)
103
+ */
104
+ static findPendingForDelivery(): Promise<CachedEmail[]>;
105
+ /**
106
+ * Find emails by sender domain
107
+ */
108
+ static findBySenderDomain(domain: string): Promise<CachedEmail[]>;
109
+ /**
110
+ * Mark as delivered
111
+ */
112
+ markDelivered(): void;
113
+ /**
114
+ * Mark as failed with error
115
+ */
116
+ markFailed(error: string): void;
117
+ /**
118
+ * Increment attempt counter and schedule next attempt
119
+ */
120
+ scheduleRetry(delayMs?: number): void;
121
+ /**
122
+ * Extract sender domain from email address
123
+ */
124
+ updateSenderDomain(): void;
125
+ }
@@ -0,0 +1,337 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import * as plugins from '../../plugins.js';
36
+ import { CachedDocument, TTL } from '../classes.cached.document.js';
37
+ import { CacheDb } from '../classes.cachedb.js';
38
+ /**
39
+ * Helper to get the smartdata database instance
40
+ */
41
+ const getDb = () => CacheDb.getInstance().getDb();
42
+ /**
43
+ * CachedEmail - Stores email queue items in the cache
44
+ *
45
+ * Used for persistent email queue storage, tracking delivery status,
46
+ * and maintaining email history for the configured TTL period.
47
+ */
48
+ let CachedEmail = (() => {
49
+ let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
50
+ let _classDescriptor;
51
+ let _classExtraInitializers = [];
52
+ let _classThis;
53
+ let _classSuper = CachedDocument;
54
+ let _createdAt_decorators;
55
+ let _createdAt_initializers = [];
56
+ let _createdAt_extraInitializers = [];
57
+ let _expiresAt_decorators;
58
+ let _expiresAt_initializers = [];
59
+ let _expiresAt_extraInitializers = [];
60
+ let _lastAccessedAt_decorators;
61
+ let _lastAccessedAt_initializers = [];
62
+ let _lastAccessedAt_extraInitializers = [];
63
+ let _id_decorators;
64
+ let _id_initializers = [];
65
+ let _id_extraInitializers = [];
66
+ let _messageId_decorators;
67
+ let _messageId_initializers = [];
68
+ let _messageId_extraInitializers = [];
69
+ let _from_decorators;
70
+ let _from_initializers = [];
71
+ let _from_extraInitializers = [];
72
+ let _to_decorators;
73
+ let _to_initializers = [];
74
+ let _to_extraInitializers = [];
75
+ let _cc_decorators;
76
+ let _cc_initializers = [];
77
+ let _cc_extraInitializers = [];
78
+ let _bcc_decorators;
79
+ let _bcc_initializers = [];
80
+ let _bcc_extraInitializers = [];
81
+ let _subject_decorators;
82
+ let _subject_initializers = [];
83
+ let _subject_extraInitializers = [];
84
+ let _rawContent_decorators;
85
+ let _rawContent_initializers = [];
86
+ let _rawContent_extraInitializers = [];
87
+ let _status_decorators;
88
+ let _status_initializers = [];
89
+ let _status_extraInitializers = [];
90
+ let _attempts_decorators;
91
+ let _attempts_initializers = [];
92
+ let _attempts_extraInitializers = [];
93
+ let _maxAttempts_decorators;
94
+ let _maxAttempts_initializers = [];
95
+ let _maxAttempts_extraInitializers = [];
96
+ let _nextAttempt_decorators;
97
+ let _nextAttempt_initializers = [];
98
+ let _nextAttempt_extraInitializers = [];
99
+ let _lastError_decorators;
100
+ let _lastError_initializers = [];
101
+ let _lastError_extraInitializers = [];
102
+ let _deliveredAt_decorators;
103
+ let _deliveredAt_initializers = [];
104
+ let _deliveredAt_extraInitializers = [];
105
+ let _senderDomain_decorators;
106
+ let _senderDomain_initializers = [];
107
+ let _senderDomain_extraInitializers = [];
108
+ let _priority_decorators;
109
+ let _priority_initializers = [];
110
+ let _priority_extraInitializers = [];
111
+ let _routeData_decorators;
112
+ let _routeData_initializers = [];
113
+ let _routeData_extraInitializers = [];
114
+ let _dkimSigned_decorators;
115
+ let _dkimSigned_initializers = [];
116
+ let _dkimSigned_extraInitializers = [];
117
+ var CachedEmail = class extends _classSuper {
118
+ static { _classThis = this; }
119
+ static {
120
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
121
+ _createdAt_decorators = [plugins.smartdata.svDb()];
122
+ _expiresAt_decorators = [plugins.smartdata.svDb()];
123
+ _lastAccessedAt_decorators = [plugins.smartdata.svDb()];
124
+ _id_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
125
+ _messageId_decorators = [plugins.smartdata.svDb()];
126
+ _from_decorators = [plugins.smartdata.svDb()];
127
+ _to_decorators = [plugins.smartdata.svDb()];
128
+ _cc_decorators = [plugins.smartdata.svDb()];
129
+ _bcc_decorators = [plugins.smartdata.svDb()];
130
+ _subject_decorators = [plugins.smartdata.svDb()];
131
+ _rawContent_decorators = [plugins.smartdata.svDb()];
132
+ _status_decorators = [plugins.smartdata.svDb()];
133
+ _attempts_decorators = [plugins.smartdata.svDb()];
134
+ _maxAttempts_decorators = [plugins.smartdata.svDb()];
135
+ _nextAttempt_decorators = [plugins.smartdata.svDb()];
136
+ _lastError_decorators = [plugins.smartdata.svDb()];
137
+ _deliveredAt_decorators = [plugins.smartdata.svDb()];
138
+ _senderDomain_decorators = [plugins.smartdata.svDb()];
139
+ _priority_decorators = [plugins.smartdata.svDb()];
140
+ _routeData_decorators = [plugins.smartdata.svDb()];
141
+ _dkimSigned_decorators = [plugins.smartdata.svDb()];
142
+ __esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
143
+ __esDecorate(null, null, _expiresAt_decorators, { kind: "field", name: "expiresAt", static: false, private: false, access: { has: obj => "expiresAt" in obj, get: obj => obj.expiresAt, set: (obj, value) => { obj.expiresAt = value; } }, metadata: _metadata }, _expiresAt_initializers, _expiresAt_extraInitializers);
144
+ __esDecorate(null, null, _lastAccessedAt_decorators, { kind: "field", name: "lastAccessedAt", static: false, private: false, access: { has: obj => "lastAccessedAt" in obj, get: obj => obj.lastAccessedAt, set: (obj, value) => { obj.lastAccessedAt = value; } }, metadata: _metadata }, _lastAccessedAt_initializers, _lastAccessedAt_extraInitializers);
145
+ __esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
146
+ __esDecorate(null, null, _messageId_decorators, { kind: "field", name: "messageId", static: false, private: false, access: { has: obj => "messageId" in obj, get: obj => obj.messageId, set: (obj, value) => { obj.messageId = value; } }, metadata: _metadata }, _messageId_initializers, _messageId_extraInitializers);
147
+ __esDecorate(null, null, _from_decorators, { kind: "field", name: "from", static: false, private: false, access: { has: obj => "from" in obj, get: obj => obj.from, set: (obj, value) => { obj.from = value; } }, metadata: _metadata }, _from_initializers, _from_extraInitializers);
148
+ __esDecorate(null, null, _to_decorators, { kind: "field", name: "to", static: false, private: false, access: { has: obj => "to" in obj, get: obj => obj.to, set: (obj, value) => { obj.to = value; } }, metadata: _metadata }, _to_initializers, _to_extraInitializers);
149
+ __esDecorate(null, null, _cc_decorators, { kind: "field", name: "cc", static: false, private: false, access: { has: obj => "cc" in obj, get: obj => obj.cc, set: (obj, value) => { obj.cc = value; } }, metadata: _metadata }, _cc_initializers, _cc_extraInitializers);
150
+ __esDecorate(null, null, _bcc_decorators, { kind: "field", name: "bcc", static: false, private: false, access: { has: obj => "bcc" in obj, get: obj => obj.bcc, set: (obj, value) => { obj.bcc = value; } }, metadata: _metadata }, _bcc_initializers, _bcc_extraInitializers);
151
+ __esDecorate(null, null, _subject_decorators, { kind: "field", name: "subject", static: false, private: false, access: { has: obj => "subject" in obj, get: obj => obj.subject, set: (obj, value) => { obj.subject = value; } }, metadata: _metadata }, _subject_initializers, _subject_extraInitializers);
152
+ __esDecorate(null, null, _rawContent_decorators, { kind: "field", name: "rawContent", static: false, private: false, access: { has: obj => "rawContent" in obj, get: obj => obj.rawContent, set: (obj, value) => { obj.rawContent = value; } }, metadata: _metadata }, _rawContent_initializers, _rawContent_extraInitializers);
153
+ __esDecorate(null, null, _status_decorators, { kind: "field", name: "status", static: false, private: false, access: { has: obj => "status" in obj, get: obj => obj.status, set: (obj, value) => { obj.status = value; } }, metadata: _metadata }, _status_initializers, _status_extraInitializers);
154
+ __esDecorate(null, null, _attempts_decorators, { kind: "field", name: "attempts", static: false, private: false, access: { has: obj => "attempts" in obj, get: obj => obj.attempts, set: (obj, value) => { obj.attempts = value; } }, metadata: _metadata }, _attempts_initializers, _attempts_extraInitializers);
155
+ __esDecorate(null, null, _maxAttempts_decorators, { kind: "field", name: "maxAttempts", static: false, private: false, access: { has: obj => "maxAttempts" in obj, get: obj => obj.maxAttempts, set: (obj, value) => { obj.maxAttempts = value; } }, metadata: _metadata }, _maxAttempts_initializers, _maxAttempts_extraInitializers);
156
+ __esDecorate(null, null, _nextAttempt_decorators, { kind: "field", name: "nextAttempt", static: false, private: false, access: { has: obj => "nextAttempt" in obj, get: obj => obj.nextAttempt, set: (obj, value) => { obj.nextAttempt = value; } }, metadata: _metadata }, _nextAttempt_initializers, _nextAttempt_extraInitializers);
157
+ __esDecorate(null, null, _lastError_decorators, { kind: "field", name: "lastError", static: false, private: false, access: { has: obj => "lastError" in obj, get: obj => obj.lastError, set: (obj, value) => { obj.lastError = value; } }, metadata: _metadata }, _lastError_initializers, _lastError_extraInitializers);
158
+ __esDecorate(null, null, _deliveredAt_decorators, { kind: "field", name: "deliveredAt", static: false, private: false, access: { has: obj => "deliveredAt" in obj, get: obj => obj.deliveredAt, set: (obj, value) => { obj.deliveredAt = value; } }, metadata: _metadata }, _deliveredAt_initializers, _deliveredAt_extraInitializers);
159
+ __esDecorate(null, null, _senderDomain_decorators, { kind: "field", name: "senderDomain", static: false, private: false, access: { has: obj => "senderDomain" in obj, get: obj => obj.senderDomain, set: (obj, value) => { obj.senderDomain = value; } }, metadata: _metadata }, _senderDomain_initializers, _senderDomain_extraInitializers);
160
+ __esDecorate(null, null, _priority_decorators, { kind: "field", name: "priority", static: false, private: false, access: { has: obj => "priority" in obj, get: obj => obj.priority, set: (obj, value) => { obj.priority = value; } }, metadata: _metadata }, _priority_initializers, _priority_extraInitializers);
161
+ __esDecorate(null, null, _routeData_decorators, { kind: "field", name: "routeData", static: false, private: false, access: { has: obj => "routeData" in obj, get: obj => obj.routeData, set: (obj, value) => { obj.routeData = value; } }, metadata: _metadata }, _routeData_initializers, _routeData_extraInitializers);
162
+ __esDecorate(null, null, _dkimSigned_decorators, { kind: "field", name: "dkimSigned", static: false, private: false, access: { has: obj => "dkimSigned" in obj, get: obj => obj.dkimSigned, set: (obj, value) => { obj.dkimSigned = value; } }, metadata: _metadata }, _dkimSigned_initializers, _dkimSigned_extraInitializers);
163
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
164
+ CachedEmail = _classThis = _classDescriptor.value;
165
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
166
+ __runInitializers(_classThis, _classExtraInitializers);
167
+ }
168
+ // TTL fields from base class (decorators required on concrete class)
169
+ createdAt = __runInitializers(this, _createdAt_initializers, new Date());
170
+ expiresAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _expiresAt_initializers, new Date(Date.now() + TTL.DAYS_30)));
171
+ lastAccessedAt = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _lastAccessedAt_initializers, new Date()));
172
+ /**
173
+ * Unique identifier for this email
174
+ */
175
+ id = (__runInitializers(this, _lastAccessedAt_extraInitializers), __runInitializers(this, _id_initializers, void 0));
176
+ /**
177
+ * Email message ID (RFC 822 Message-ID header)
178
+ */
179
+ messageId = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _messageId_initializers, void 0));
180
+ /**
181
+ * Sender email address (envelope from)
182
+ */
183
+ from = (__runInitializers(this, _messageId_extraInitializers), __runInitializers(this, _from_initializers, void 0));
184
+ /**
185
+ * Recipient email addresses
186
+ */
187
+ to = (__runInitializers(this, _from_extraInitializers), __runInitializers(this, _to_initializers, void 0));
188
+ /**
189
+ * CC recipients
190
+ */
191
+ cc = (__runInitializers(this, _to_extraInitializers), __runInitializers(this, _cc_initializers, void 0));
192
+ /**
193
+ * BCC recipients
194
+ */
195
+ bcc = (__runInitializers(this, _cc_extraInitializers), __runInitializers(this, _bcc_initializers, void 0));
196
+ /**
197
+ * Email subject
198
+ */
199
+ subject = (__runInitializers(this, _bcc_extraInitializers), __runInitializers(this, _subject_initializers, void 0));
200
+ /**
201
+ * Raw RFC822 email content
202
+ */
203
+ rawContent = (__runInitializers(this, _subject_extraInitializers), __runInitializers(this, _rawContent_initializers, void 0));
204
+ /**
205
+ * Current status of the email
206
+ */
207
+ status = (__runInitializers(this, _rawContent_extraInitializers), __runInitializers(this, _status_initializers, void 0));
208
+ /**
209
+ * Number of delivery attempts
210
+ */
211
+ attempts = (__runInitializers(this, _status_extraInitializers), __runInitializers(this, _attempts_initializers, 0));
212
+ /**
213
+ * Maximum number of delivery attempts
214
+ */
215
+ maxAttempts = (__runInitializers(this, _attempts_extraInitializers), __runInitializers(this, _maxAttempts_initializers, 3));
216
+ /**
217
+ * Timestamp for next delivery attempt
218
+ */
219
+ nextAttempt = (__runInitializers(this, _maxAttempts_extraInitializers), __runInitializers(this, _nextAttempt_initializers, void 0));
220
+ /**
221
+ * Last error message if delivery failed
222
+ */
223
+ lastError = (__runInitializers(this, _nextAttempt_extraInitializers), __runInitializers(this, _lastError_initializers, void 0));
224
+ /**
225
+ * Timestamp when the email was successfully delivered
226
+ */
227
+ deliveredAt = (__runInitializers(this, _lastError_extraInitializers), __runInitializers(this, _deliveredAt_initializers, void 0));
228
+ /**
229
+ * Sender domain (for querying/filtering)
230
+ */
231
+ senderDomain = (__runInitializers(this, _deliveredAt_extraInitializers), __runInitializers(this, _senderDomain_initializers, void 0));
232
+ /**
233
+ * Priority level (higher = more important)
234
+ */
235
+ priority = (__runInitializers(this, _senderDomain_extraInitializers), __runInitializers(this, _priority_initializers, 0));
236
+ /**
237
+ * JSON-serialized route data
238
+ */
239
+ routeData = (__runInitializers(this, _priority_extraInitializers), __runInitializers(this, _routeData_initializers, void 0));
240
+ /**
241
+ * DKIM signature status
242
+ */
243
+ dkimSigned = (__runInitializers(this, _routeData_extraInitializers), __runInitializers(this, _dkimSigned_initializers, false));
244
+ constructor() {
245
+ super();
246
+ __runInitializers(this, _dkimSigned_extraInitializers);
247
+ this.setTTL(TTL.DAYS_30); // Default 30-day TTL
248
+ this.status = 'pending';
249
+ this.to = [];
250
+ this.cc = [];
251
+ this.bcc = [];
252
+ }
253
+ /**
254
+ * Create a new CachedEmail with a unique ID
255
+ */
256
+ static createNew() {
257
+ const email = new CachedEmail();
258
+ email.id = plugins.uuid.v4();
259
+ return email;
260
+ }
261
+ /**
262
+ * Find an email by ID
263
+ */
264
+ static async findById(id) {
265
+ return await CachedEmail.getInstance({
266
+ id,
267
+ });
268
+ }
269
+ /**
270
+ * Find all emails with a specific status
271
+ */
272
+ static async findByStatus(status) {
273
+ return await CachedEmail.getInstances({
274
+ status,
275
+ });
276
+ }
277
+ /**
278
+ * Find all emails pending delivery (status = pending and nextAttempt <= now)
279
+ */
280
+ static async findPendingForDelivery() {
281
+ const now = new Date();
282
+ return await CachedEmail.getInstances({
283
+ status: 'pending',
284
+ nextAttempt: { $lte: now },
285
+ });
286
+ }
287
+ /**
288
+ * Find emails by sender domain
289
+ */
290
+ static async findBySenderDomain(domain) {
291
+ return await CachedEmail.getInstances({
292
+ senderDomain: domain,
293
+ });
294
+ }
295
+ /**
296
+ * Mark as delivered
297
+ */
298
+ markDelivered() {
299
+ this.status = 'delivered';
300
+ this.deliveredAt = new Date();
301
+ }
302
+ /**
303
+ * Mark as failed with error
304
+ */
305
+ markFailed(error) {
306
+ this.status = 'failed';
307
+ this.lastError = error;
308
+ }
309
+ /**
310
+ * Increment attempt counter and schedule next attempt
311
+ */
312
+ scheduleRetry(delayMs = 5 * 60 * 1000) {
313
+ this.attempts++;
314
+ this.status = 'deferred';
315
+ this.nextAttempt = new Date(Date.now() + delayMs);
316
+ // If max attempts reached, mark as failed
317
+ if (this.attempts >= this.maxAttempts) {
318
+ this.status = 'failed';
319
+ this.lastError = `Max attempts (${this.maxAttempts}) reached`;
320
+ }
321
+ }
322
+ /**
323
+ * Extract sender domain from email address
324
+ */
325
+ updateSenderDomain() {
326
+ if (this.from) {
327
+ const match = this.from.match(/@([^>]+)>?$/);
328
+ if (match) {
329
+ this.senderDomain = match[1].toLowerCase();
330
+ }
331
+ }
332
+ }
333
+ };
334
+ return CachedEmail = _classThis;
335
+ })();
336
+ export { CachedEmail };
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZWQuZW1haWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9jYWNoZS9kb2N1bWVudHMvY2xhc3Nlcy5jYWNoZWQuZW1haWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPaEQ7O0dBRUc7QUFDSCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFbEQ7Ozs7O0dBS0c7SUFFVSxXQUFXOzRCQUR2QixPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7OztzQkFDWCxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJCQUF0QixTQUFRLFdBQTJCOzs7O3FDQUV6RCxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7MENBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOzhCQU14QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FNeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7Z0NBTXhCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOzhCQU14QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs4QkFNeEIs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