@social-mail/social-mail-web-server 1.16.152 → 1.16.154

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.
@@ -2,7 +2,7 @@ import path from "path";
2
2
  import { globalEnv } from "./globalEnv.js";
3
3
  import BaseDiskCache from "@entity-access/server-pages/dist/cache/BaseDiskCache.js";
4
4
  import { hash } from "crypto";
5
- const tmpdir = path.join(globalEnv.tmpDir, "t-dns");
5
+ const tmpdir = path.join(globalEnv.tmpDir, "t-json");
6
6
  export const dnsDiskCache = new BaseDiskCache({
7
7
  root: tmpdir,
8
8
  keepTTLSeconds: 15 * 60,
@@ -1 +1 @@
1
- {"version":3,"file":"jsonCache.js","sourceRoot":"","sources":["../../src/common/jsonCache.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,aAAa,MAAM,yDAAyD,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,aAAa,CAAC;IAC1C,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,EAAE,GAAG,EAAE;IACvB,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;CACZ,CAAC,CAAC;AAGH,MAAM,UAAU,SAAS,CAAC,EAAE,GAAG,EAAE;IAC7B,OAAO,UAAS,MAAM,EAAE,GAAG;QACvB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAA0B,CAAC;QACvD,KAAK,UAAU,KAAK,CAAC,GAAI,CAAQ;YAC7B,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;YACxF,SAAQ,CAAC;gBACL,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAA6B,QAAQ,EAAE,KAAK,IAAI,EAAE;oBAC/F,IAAI,CAAC;wBACD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAiB,EAAE,CAAC;oBACtE,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,MAAM,MAAM,GAAG,EAAE,CAAC;wBAClB,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;wBAC3B,IAAI,KAAK,EAAG,CAAC;4BACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;wBACtC,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;wBAClC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,EAAG,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;oBACvD,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC,MAAM,CAAC;gBACpB,CAAC;gBACD,IAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;oBAC/B,iCAAiC;oBACjC,MAAM,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACtC,SAAS;gBACb,CAAC;gBACD,8CAA8C;gBAC9C,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,MAAM,CAAC,GAAG;YACN,KAAK;YACL,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SACrB,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACb,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"jsonCache.js","sourceRoot":"","sources":["../../src/common/jsonCache.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,aAAa,MAAM,yDAAyD,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,aAAa,CAAC;IAC1C,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,EAAE,GAAG,EAAE;IACvB,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;CACZ,CAAC,CAAC;AAGH,MAAM,UAAU,SAAS,CAAC,EAAE,GAAG,EAAE;IAC7B,OAAO,UAAS,MAAM,EAAE,GAAG;QACvB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAA0B,CAAC;QACvD,KAAK,UAAU,KAAK,CAAC,GAAI,CAAQ;YAC7B,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;YACxF,SAAQ,CAAC;gBACL,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAA6B,QAAQ,EAAE,KAAK,IAAI,EAAE;oBAC/F,IAAI,CAAC;wBACD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAiB,EAAE,CAAC;oBACtE,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,MAAM,MAAM,GAAG,EAAE,CAAC;wBAClB,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;wBAC3B,IAAI,KAAK,EAAG,CAAC;4BACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;wBACtC,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;wBAClC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,EAAG,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;oBACvD,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC,MAAM,CAAC;gBACpB,CAAC;gBACD,IAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;oBAC/B,iCAAiC;oBACjC,MAAM,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACtC,SAAS;gBACb,CAAC;gBACD,8CAA8C;gBAC9C,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,MAAM,CAAC,GAAG;YACN,KAAK;YACL,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SACrB,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACb,CAAC,CAAC;AACN,CAAC"}
@@ -16,21 +16,22 @@ export default class DnsService {
16
16
  * @param domain domain
17
17
  * @param nameServers optional name servers
18
18
  */
19
- getMX(domain: string, nameServers?: string[]): Promise<string[]>;
19
+ getA(domain: string, nameServers?: string[]): Promise<string[]>;
20
20
  /**
21
- * Will return all acceptable IP addresses
21
+ * This will try to get cached mx and cached a record for mx records.
22
22
  * @param domain domain
23
23
  * @param nameServers optional name servers
24
24
  */
25
- getA(domain: string, nameServers?: string[]): Promise<string[]>;
26
- /**
27
- * Will return all acceptable IP addresses
28
- * @param domain domain
29
- * @param nameServers optional name servers
30
- */
31
25
  getMXAddresses(domain: string, nameServers?: string[]): Promise<{
32
26
  host: string;
33
27
  ip: string;
34
28
  }[]>;
29
+ /**
30
+ * Will return all acceptable IP addresses
31
+ * @param domain domain
32
+ * @param nameServers optional name servers
33
+ */
34
+ private getMX;
35
+ private try;
35
36
  }
36
37
  //# sourceMappingURL=DnsService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DnsService.d.ts","sourceRoot":"","sources":["../../../../src/server/smtp/dns/DnsService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAM7C,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,CAAC,OAAO,OAAO,UAAU;IAId,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA8BzG;;;;OAIG;IAEU,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAwChF;;;;OAIG;IAEU,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAW7E;;;;OAIG;IAEU,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWxE;;;;GAID;IAEU,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAkD/G"}
1
+ {"version":3,"file":"DnsService.d.ts","sourceRoot":"","sources":["../../../../src/server/smtp/dns/DnsService.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAM7C,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,CAAC,OAAO,OAAO,UAAU;IAId,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA8BzG;;;;OAIG;IAEU,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAwChF;;;;OAIG;IAEU,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM5E;;;;OAIG;IAEU,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAiC5G;;;;OAIG;YAEW,KAAK;YAML,GAAG;CAkBpB"}
@@ -9,6 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  };
10
10
  import { RegisterSingleton } from "@entity-access/entity-access/dist/di/di.js";
11
11
  import dns2 from "dns2";
12
+ import { NOTFOUND, NODATA } from "dns";
12
13
  import { SPFRecords } from "./SPFRecords.js";
13
14
  import localDns from "node:dns/promises";
14
15
  import TimeoutError from "../../../common/errors/TimeoutError.js";
@@ -92,82 +93,75 @@ let DnsService = class DnsService {
92
93
  * @param domain domain
93
94
  * @param nameServers optional name servers
94
95
  */
95
- async getMX(domain, nameServers) {
96
- nameServers ??= [];
97
- if (!nameServers.length) {
98
- nameServers = defaultNameServers;
99
- }
100
- const dns = new dns2({ nameServers });
101
- const mx = await dns.resolveMX(domain);
102
- mx.answers.sort((a, b) => a.priority - b.priority);
103
- return mx.answers.map((a) => a.exchange);
96
+ async getA(domain, nameServers) {
97
+ const mx = await this.try((x) => localDns.resolve(x), domain);
98
+ return mx;
104
99
  }
105
100
  /**
106
- * Will return all acceptable IP addresses
101
+ * This will try to get cached mx and cached a record for mx records.
107
102
  * @param domain domain
108
103
  * @param nameServers optional name servers
109
104
  */
110
- async getA(domain, nameServers) {
111
- nameServers ??= [];
112
- if (!nameServers.length) {
113
- nameServers = defaultNameServers;
105
+ async getMXAddresses(domain, nameServers) {
106
+ const result = [];
107
+ try {
108
+ // we should try to get cached result
109
+ const mxs = await this.getMX(domain, nameServers);
110
+ await Promise.all(mxs.map(async (x) => {
111
+ try {
112
+ const ips = await this.getA(x);
113
+ for (const ip of ips) {
114
+ result.push({ host: x, ip });
115
+ }
116
+ }
117
+ catch (e) {
118
+ // do nothing...
119
+ }
120
+ }));
121
+ if (result.length) {
122
+ return result;
123
+ }
114
124
  }
115
- const dns = new dns2({ nameServers });
116
- const mx = await dns.resolveA(domain);
117
- return mx.answers.map((v) => v.address);
125
+ catch (error) {
126
+ if (error.code === NOTFOUND) {
127
+ throw error;
128
+ }
129
+ }
130
+ // try a...
131
+ const r = await this.getA(domain, nameServers);
132
+ for (const ip of r) {
133
+ result.push({ host: domain, ip });
134
+ }
135
+ return result;
118
136
  }
119
137
  /**
120
- * Will return all acceptable IP addresses
121
- * @param domain domain
122
- * @param nameServers optional name servers
123
- */
124
- async getMXAddresses(domain, nameServers) {
125
- const errors = [];
138
+ * Will return all acceptable IP addresses
139
+ * @param domain domain
140
+ * @param nameServers optional name servers
141
+ */
142
+ async getMX(domain, nameServers) {
143
+ const mx = await this.try((x) => localDns.resolveMx(x), domain);
144
+ mx.sort((a, b) => a.priority - b.priority);
145
+ return mx.map((x) => x.exchange);
146
+ }
147
+ async try(fx, p) {
148
+ let lastError = void 0;
126
149
  for (let i = 0; i < 3; i++) {
127
150
  try {
128
- const mx = await localDns.resolveMx(domain);
129
- let hosts = [{ exchange: domain }];
130
- if (mx.length === 0) {
131
- hosts = [{ exchange: domain }];
132
- console.warn(`No MX defined for ${domain}`);
133
- }
134
- else {
135
- mx.sort((a, b) => a.priority - b.priority);
136
- hosts = mx;
137
- }
138
- const result = [];
139
- await Promise.all(hosts.map(async (a) => {
140
- for (let tries = 0; tries < 3; tries++) {
141
- try {
142
- const host = a.exchange;
143
- const ips = await localDns.resolve(host);
144
- for (const ip of ips) {
145
- result.push({ host, ip });
146
- }
147
- // return on success
148
- return;
149
- }
150
- catch (error) {
151
- errors.push(error);
152
- await sleep(100);
153
- }
154
- }
155
- }));
156
- if (result.length) {
157
- return result;
158
- }
151
+ return await fx(p);
159
152
  }
160
153
  catch (error) {
161
- errors.push(error.cause
162
- ? (error.cause?.stack ?? error.cause)
163
- : (error.stack ?? error));
164
- await sleep(300);
154
+ lastError = error;
155
+ if (error.code === NOTFOUND || error.code === NODATA) {
156
+ break;
157
+ }
165
158
  }
159
+ await sleep(500);
166
160
  }
167
- if (errors.length) {
168
- throw new Error(`Failed to get MX for ${domain} ${errors.join("\n")}`);
161
+ if (!lastError) {
162
+ throw new TimeoutError();
169
163
  }
170
- throw new TimeoutError();
164
+ throw lastError;
171
165
  }
172
166
  };
173
167
  __decorate([
@@ -187,19 +181,19 @@ __decorate([
187
181
  __metadata("design:type", Function),
188
182
  __metadata("design:paramtypes", [String, Array]),
189
183
  __metadata("design:returntype", Promise)
190
- ], DnsService.prototype, "getMX", null);
184
+ ], DnsService.prototype, "getA", null);
191
185
  __decorate([
192
186
  jsonCache(),
193
187
  __metadata("design:type", Function),
194
188
  __metadata("design:paramtypes", [String, Array]),
195
189
  __metadata("design:returntype", Promise)
196
- ], DnsService.prototype, "getA", null);
190
+ ], DnsService.prototype, "getMXAddresses", null);
197
191
  __decorate([
198
192
  jsonCache(),
199
193
  __metadata("design:type", Function),
200
194
  __metadata("design:paramtypes", [String, Array]),
201
195
  __metadata("design:returntype", Promise)
202
- ], DnsService.prototype, "getMXAddresses", null);
196
+ ], DnsService.prototype, "getMX", null);
203
197
  DnsService = __decorate([
204
198
  RegisterSingleton
205
199
  ], DnsService);
@@ -1 +1 @@
1
- {"version":3,"file":"DnsService.js","sourceRoot":"","sources":["../../../../src/server/smtp/dns/DnsService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DnsService.js","sourceRoot":"","sources":["../../../../src/server/smtp/dns/DnsService.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.16.152",
3
+ "version": "1.16.154",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -3,7 +3,7 @@ import { globalEnv } from "./globalEnv.js";
3
3
  import BaseDiskCache from "@entity-access/server-pages/dist/cache/BaseDiskCache.js";
4
4
  import { hash } from "crypto";
5
5
 
6
- const tmpdir = path.join(globalEnv.tmpDir, "t-dns");
6
+ const tmpdir = path.join(globalEnv.tmpDir, "t-json");
7
7
 
8
8
  export const dnsDiskCache = new BaseDiskCache({
9
9
  root: tmpdir,
@@ -1,5 +1,6 @@
1
1
  import { RegisterSingleton } from "@entity-access/entity-access/dist/di/di.js";
2
2
  import dns2 from "dns2";
3
+ import { NOTFOUND, NODATA } from "dns";
3
4
  import { SPFRecords } from "./SPFRecords.js";
4
5
  import localDns from "node:dns/promises";
5
6
  import TimeoutError from "../../../common/errors/TimeoutError.js";
@@ -101,88 +102,79 @@ export default class DnsService {
101
102
  * @param nameServers optional name servers
102
103
  */
103
104
  @jsonCache()
104
- public async getMX(domain: string, nameServers?: string[]): Promise<string[]> {
105
- nameServers ??= [];
106
- if (!nameServers.length) {
107
- nameServers = defaultNameServers;
108
- }
109
- const dns = new dns2({nameServers });
110
- const mx = await dns.resolveMX(domain);
111
- mx.answers.sort((a: any, b: any) => a.priority - b.priority);
112
- return mx.answers.map((a: any) => a.exchange);
105
+ public async getA(domain: string, nameServers?: string[]): Promise<string[]> {
106
+ const mx = await this.try((x) => localDns.resolve(x), domain);
107
+ return mx;
113
108
  }
114
109
 
110
+
115
111
  /**
116
- * Will return all acceptable IP addresses
112
+ * This will try to get cached mx and cached a record for mx records.
117
113
  * @param domain domain
118
114
  * @param nameServers optional name servers
119
115
  */
120
116
  @jsonCache()
121
- public async getA(domain: string, nameServers?: string[]): Promise<string[]> {
122
- nameServers ??= [];
123
- if (!nameServers.length) {
124
- nameServers = defaultNameServers;
117
+ public async getMXAddresses(domain: string, nameServers?: string[]): Promise<{ host: string, ip: string }[]> {
118
+
119
+ const result = [] as { host: string, ip: string}[];
120
+ try {
121
+ // we should try to get cached result
122
+ const mxs = await this.getMX(domain, nameServers);
123
+ await Promise.all(mxs.map( async (x) => {
124
+ try {
125
+ const ips = await this.getA(x);
126
+ for(const ip of ips) {
127
+ result.push({ host: x, ip });
128
+ }
129
+ } catch (e) {
130
+ // do nothing...
131
+ }
132
+ }));
133
+ if (result.length) {
134
+ return result;
135
+ }
136
+ } catch (error) {
137
+ if (error.code === NOTFOUND) {
138
+ throw error;
139
+ }
125
140
  }
126
- const dns = new dns2({nameServers });
127
- const mx = await dns.resolveA(domain);
128
- return mx.answers.map((v) => v.address);
129
- }
130
141
 
142
+ // try a...
143
+ const r = await this.getA(domain, nameServers);
144
+ for(const ip of r) {
145
+ result.push({ host: domain, ip });
146
+ }
147
+ return result;
148
+ }
131
149
 
132
- /**
150
+ /**
133
151
  * Will return all acceptable IP addresses
134
152
  * @param domain domain
135
153
  * @param nameServers optional name servers
136
154
  */
137
155
  @jsonCache()
138
- public async getMXAddresses(domain: string, nameServers?: string[]): Promise<{ host: string, ip: string }[]> {
156
+ private async getMX(domain: string, nameServers?: string[]): Promise<string[]> {
157
+ const mx = await this.try( (x) => localDns.resolveMx(x), domain);
158
+ mx.sort((a: any, b: any) => a.priority - b.priority);
159
+ return mx.map((x) => x.exchange);
160
+ }
139
161
 
140
- const errors = [];
141
- for(let i=0; i<3;i++) {
162
+ private async try<TIn,T>(fx: (x: TIn) => Promise<T>, p: TIn): Promise<T> {
163
+ let lastError = void 0;
164
+ for(let i=0;i<3;i++) {
142
165
  try {
143
- const mx = await localDns.resolveMx(domain);
144
-
145
- let hosts = [{ exchange: domain }];
146
-
147
- if (mx.length === 0) {
148
- hosts = [{ exchange: domain }];
149
- console.warn(`No MX defined for ${domain}`);
150
- } else {
151
- mx.sort((a: any, b: any) => a.priority - b.priority);
152
- hosts = mx as any[];
153
- }
154
-
155
- const result = [] as { host: string, ip: string}[];
156
-
157
- await Promise.all(hosts.map(async (a: any) => {
158
- for(let tries = 0; tries< 3; tries++ ) {
159
- try {
160
- const host = a.exchange;
161
- const ips = await localDns.resolve(host);
162
- for (const ip of ips) {
163
- result.push({ host, ip });
164
- }
165
- // return on success
166
- return;
167
- } catch (error) {
168
- errors.push(error);
169
- await sleep(100);
170
- }
171
- }
172
- }));
173
- if (result.length) {
174
- return result;
175
- }
166
+ return await fx(p);
176
167
  } catch (error) {
177
- errors.push(error.cause
178
- ? (error.cause?.stack ?? error.cause)
179
- : (error.stack ?? error));
180
- await sleep(300);
168
+ lastError = error;
169
+ if(error.code === NOTFOUND || error.code === NODATA) {
170
+ break;
171
+ }
181
172
  }
173
+ await sleep(500);
182
174
  }
183
- if (errors.length) {
184
- throw new Error(`Failed to get MX for ${domain} ${errors.join("\n")}`);
175
+ if(!lastError) {
176
+ throw new TimeoutError();
185
177
  }
186
- throw new TimeoutError();
178
+ throw lastError;
187
179
  }
188
180
  }