@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/common/jsonCache.js +1 -1
- package/dist/common/jsonCache.js.map +1 -1
- package/dist/server/smtp/dns/DnsService.d.ts +9 -8
- package/dist/server/smtp/dns/DnsService.d.ts.map +1 -1
- package/dist/server/smtp/dns/DnsService.js +58 -64
- package/dist/server/smtp/dns/DnsService.js.map +1 -1
- package/package.json +1 -1
- package/src/common/jsonCache.ts +1 -1
- package/src/server/smtp/dns/DnsService.ts +54 -62
package/dist/common/jsonCache.js
CHANGED
|
@@ -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-
|
|
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,
|
|
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
|
-
|
|
19
|
+
getA(domain: string, nameServers?: string[]): Promise<string[]>;
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
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":"
|
|
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
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
*
|
|
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
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
async
|
|
125
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
154
|
+
lastError = error;
|
|
155
|
+
if (error.code === NOTFOUND || error.code === NODATA) {
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
165
158
|
}
|
|
159
|
+
await sleep(500);
|
|
166
160
|
}
|
|
167
|
-
if (
|
|
168
|
-
throw new
|
|
161
|
+
if (!lastError) {
|
|
162
|
+
throw new TimeoutError();
|
|
169
163
|
}
|
|
170
|
-
throw
|
|
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, "
|
|
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, "
|
|
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, "
|
|
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
package/src/common/jsonCache.ts
CHANGED
|
@@ -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-
|
|
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
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
*
|
|
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
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
168
|
+
lastError = error;
|
|
169
|
+
if(error.code === NOTFOUND || error.code === NODATA) {
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
181
172
|
}
|
|
173
|
+
await sleep(500);
|
|
182
174
|
}
|
|
183
|
-
if
|
|
184
|
-
throw new
|
|
175
|
+
if(!lastError) {
|
|
176
|
+
throw new TimeoutError();
|
|
185
177
|
}
|
|
186
|
-
throw
|
|
178
|
+
throw lastError;
|
|
187
179
|
}
|
|
188
180
|
}
|