@oneuptime/common 7.0.4976 → 7.0.4981

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.
@@ -14,7 +14,53 @@ export default class Domain extends DomainCommon {
14
14
  data.domain,
15
15
  (err: Error | null, addresses: string[]) => {
16
16
  if (err) {
17
- reject(err);
17
+ logger.debug(
18
+ `DNS CNAME lookup failed for domain ${data.domain}: ${err.message}`,
19
+ );
20
+
21
+ // Handle specific DNS error types with user-friendly messages
22
+ if (
23
+ err.message.includes("ENODATA") ||
24
+ err.message.includes("queryCname ENODATA")
25
+ ) {
26
+ reject(
27
+ new BadDataException(
28
+ `No CNAME records found for domain "${data.domain}". Please ensure you have added the CNAME record and wait for DNS propagation (up to 72 hours).`,
29
+ ),
30
+ );
31
+ return;
32
+ }
33
+
34
+ if (
35
+ err.message.includes("ENOTFOUND") ||
36
+ err.message.includes("queryCname ENOTFOUND")
37
+ ) {
38
+ reject(
39
+ new BadDataException(
40
+ `Domain "${data.domain}" not found. Please check if the domain is correct and accessible.`,
41
+ ),
42
+ );
43
+ return;
44
+ }
45
+
46
+ if (
47
+ err.message.includes("ETIMEDOUT") ||
48
+ err.message.includes("queryCname ETIMEDOUT")
49
+ ) {
50
+ reject(
51
+ new BadDataException(
52
+ `DNS lookup timeout for domain "${data.domain}". Please try again later.`,
53
+ ),
54
+ );
55
+ return;
56
+ }
57
+
58
+ // Generic DNS error fallback
59
+ reject(
60
+ new BadDataException(
61
+ `Unable to verify CNAME record for domain "${data.domain}". DNS Error: ${err.message}. Please check your DNS configuration and try again.`,
62
+ ),
63
+ );
18
64
  } else if (addresses.length > 0) {
19
65
  resolve(addresses);
20
66
  } else {
@@ -44,7 +90,50 @@ export default class Domain extends DomainCommon {
44
90
  domain.toString(),
45
91
  (err: Error | null, data: Array<Array<string>>) => {
46
92
  if (err) {
47
- return reject(err);
93
+ logger.debug(
94
+ `DNS TXT lookup failed for domain ${domain.toString()}: ${err.message}`,
95
+ );
96
+
97
+ // Handle specific DNS error types with user-friendly messages
98
+ if (
99
+ err.message.includes("ENODATA") ||
100
+ err.message.includes("queryTxt ENODATA")
101
+ ) {
102
+ return reject(
103
+ new BadDataException(
104
+ `No TXT records found for domain "${domain.toString()}". Please ensure you have added the TXT record and wait for DNS propagation (up to 72 hours).`,
105
+ ),
106
+ );
107
+ }
108
+
109
+ if (
110
+ err.message.includes("ENOTFOUND") ||
111
+ err.message.includes("queryTxt ENOTFOUND")
112
+ ) {
113
+ return reject(
114
+ new BadDataException(
115
+ `Domain "${domain.toString()}" not found. Please check if the domain is correct and accessible.`,
116
+ ),
117
+ );
118
+ }
119
+
120
+ if (
121
+ err.message.includes("ETIMEDOUT") ||
122
+ err.message.includes("queryTxt ETIMEDOUT")
123
+ ) {
124
+ return reject(
125
+ new BadDataException(
126
+ `DNS lookup timeout for domain "${domain.toString()}". Please try again later.`,
127
+ ),
128
+ );
129
+ }
130
+
131
+ // Generic DNS error fallback
132
+ return reject(
133
+ new BadDataException(
134
+ `Unable to verify TXT record for domain "${domain.toString()}". DNS Error: ${err.message}. Please check your DNS configuration and try again.`,
135
+ ),
136
+ );
48
137
  }
49
138
 
50
139
  logger.debug("Verify TXT Record");
@@ -0,0 +1,95 @@
1
+ import Domain from "../../../Server/Types/Domain";
2
+ import BadDataException from "../../../Types/Exception/BadDataException";
3
+
4
+ describe("Domain TXT Record Verification", () => {
5
+ jest.setTimeout(30000); // 30 seconds timeout for DNS tests
6
+
7
+ test("should throw user-friendly error for ENODATA", async () => {
8
+ // Testing with a domain that exists but has no TXT records
9
+ const domain: string = "nonexistentsubdomain-test.google.com";
10
+ const verificationText: string = "test-verification-text";
11
+
12
+ await expect(
13
+ Domain.verifyTxtRecord(domain, verificationText),
14
+ ).rejects.toThrow(BadDataException);
15
+
16
+ try {
17
+ await Domain.verifyTxtRecord(domain, verificationText);
18
+ } catch (error) {
19
+ expect(error).toBeInstanceOf(BadDataException);
20
+ if (error instanceof BadDataException) {
21
+ expect(error.message).toContain(
22
+ 'Domain "nonexistentsubdomain-test.google.com" not found. Please check if the domain is correct and accessible.',
23
+ );
24
+ expect(error.message).toContain(domain);
25
+ }
26
+ }
27
+ });
28
+
29
+ test("should throw user-friendly error for non-existent domain", async () => {
30
+ // Testing with a domain that doesn't exist
31
+ const domain: string =
32
+ "thisisadomainthatdoesnotexistanywhere12345.nonexistent";
33
+ const verificationText: string = "test-verification-text";
34
+
35
+ await expect(
36
+ Domain.verifyTxtRecord(domain, verificationText),
37
+ ).rejects.toThrow(BadDataException);
38
+
39
+ try {
40
+ await Domain.verifyTxtRecord(domain, verificationText);
41
+ } catch (error) {
42
+ expect(error).toBeInstanceOf(BadDataException);
43
+ if (error instanceof BadDataException) {
44
+ expect(error.message).toContain("not found");
45
+ expect(error.message).toContain(domain);
46
+ // Should not contain technical DNS error codes
47
+ expect(error.message).not.toContain("ENOTFOUND");
48
+ expect(error.message).not.toContain("queryTxt");
49
+ }
50
+ }
51
+ });
52
+ });
53
+
54
+ describe("Domain CNAME Record Verification", () => {
55
+ jest.setTimeout(30000); // 30 seconds timeout for DNS tests
56
+
57
+ test("should throw user-friendly error for CNAME ENODATA", async () => {
58
+ // Testing with a domain that exists but has no CNAME records (e.g., A record only domain)
59
+ const domain: string = "google.com"; // This is an A record, not CNAME
60
+
61
+ await expect(Domain.getCnameRecords({ domain })).rejects.toThrow(
62
+ BadDataException,
63
+ );
64
+
65
+ try {
66
+ await Domain.getCnameRecords({ domain });
67
+ } catch (error) {
68
+ expect(error).toBeInstanceOf(BadDataException);
69
+ if (error instanceof BadDataException) {
70
+ expect(error.message).toContain("CNAME");
71
+ expect(error.message).toContain(domain);
72
+ // Should not contain technical DNS error codes in user message
73
+ expect(error.message).not.toContain("queryCname");
74
+ }
75
+ }
76
+ });
77
+
78
+ test("should get CNAME records for valid CNAME domain", async () => {
79
+ // This test might be flaky depending on DNS changes, but let's try with a known CNAME
80
+ const domain: string = "www.github.com"; // This usually has CNAME records
81
+
82
+ try {
83
+ const cnameRecords: string[] = await Domain.getCnameRecords({ domain });
84
+ expect(Array.isArray(cnameRecords)).toBe(true);
85
+ expect(cnameRecords.length).toBeGreaterThan(0);
86
+ } catch (error) {
87
+ // If this fails, it should still provide a user-friendly error
88
+ expect(error).toBeInstanceOf(BadDataException);
89
+ if (error instanceof BadDataException) {
90
+ expect(error.message).not.toContain("queryCname");
91
+ expect(error.message).not.toContain("ENODATA");
92
+ }
93
+ }
94
+ });
95
+ });
@@ -17,7 +17,25 @@ export default class Domain extends DomainCommon {
17
17
  return new Promise((resolve, reject) => {
18
18
  dns.resolveCname(data.domain, (err, addresses) => {
19
19
  if (err) {
20
- reject(err);
20
+ logger.debug(`DNS CNAME lookup failed for domain ${data.domain}: ${err.message}`);
21
+ // Handle specific DNS error types with user-friendly messages
22
+ if (err.message.includes("ENODATA") ||
23
+ err.message.includes("queryCname ENODATA")) {
24
+ reject(new BadDataException(`No CNAME records found for domain "${data.domain}". Please ensure you have added the CNAME record and wait for DNS propagation (up to 72 hours).`));
25
+ return;
26
+ }
27
+ if (err.message.includes("ENOTFOUND") ||
28
+ err.message.includes("queryCname ENOTFOUND")) {
29
+ reject(new BadDataException(`Domain "${data.domain}" not found. Please check if the domain is correct and accessible.`));
30
+ return;
31
+ }
32
+ if (err.message.includes("ETIMEDOUT") ||
33
+ err.message.includes("queryCname ETIMEDOUT")) {
34
+ reject(new BadDataException(`DNS lookup timeout for domain "${data.domain}". Please try again later.`));
35
+ return;
36
+ }
37
+ // Generic DNS error fallback
38
+ reject(new BadDataException(`Unable to verify CNAME record for domain "${data.domain}". DNS Error: ${err.message}. Please check your DNS configuration and try again.`));
21
39
  }
22
40
  else if (addresses.length > 0) {
23
41
  resolve(addresses);
@@ -32,7 +50,22 @@ export default class Domain extends DomainCommon {
32
50
  return new Promise((resolve, reject) => {
33
51
  dns.resolveTxt(domain.toString(), (err, data) => {
34
52
  if (err) {
35
- return reject(err);
53
+ logger.debug(`DNS TXT lookup failed for domain ${domain.toString()}: ${err.message}`);
54
+ // Handle specific DNS error types with user-friendly messages
55
+ if (err.message.includes("ENODATA") ||
56
+ err.message.includes("queryTxt ENODATA")) {
57
+ return reject(new BadDataException(`No TXT records found for domain "${domain.toString()}". Please ensure you have added the TXT record and wait for DNS propagation (up to 72 hours).`));
58
+ }
59
+ if (err.message.includes("ENOTFOUND") ||
60
+ err.message.includes("queryTxt ENOTFOUND")) {
61
+ return reject(new BadDataException(`Domain "${domain.toString()}" not found. Please check if the domain is correct and accessible.`));
62
+ }
63
+ if (err.message.includes("ETIMEDOUT") ||
64
+ err.message.includes("queryTxt ETIMEDOUT")) {
65
+ return reject(new BadDataException(`DNS lookup timeout for domain "${domain.toString()}". Please try again later.`));
66
+ }
67
+ // Generic DNS error fallback
68
+ return reject(new BadDataException(`Unable to verify TXT record for domain "${domain.toString()}". DNS Error: ${err.message}. Please check your DNS configuration and try again.`));
36
69
  }
37
70
  logger.debug("Verify TXT Record");
38
71
  logger.debug("Domain " + domain.toString());
@@ -1 +1 @@
1
- {"version":3,"file":"Domain.js","sourceRoot":"","sources":["../../../../Server/Types/Domain.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAE9C,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,YAAY;IAEhC,AAAP,MAAM,CAAC,eAAe,CAAC,IAAwB;QACpD,OAAO,IAAI,OAAO,CAChB,CAAC,OAAkC,EAAE,MAA8B,EAAE,EAAE;YACrE,GAAG,CAAC,YAAY,CACd,IAAI,CAAC,MAAM,EACX,CAAC,GAAiB,EAAE,SAAmB,EAAE,EAAE;gBACzC,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;qBAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,MAAM,CACJ,IAAI,gBAAgB,CAClB,oCAAoC,GAAG,IAAI,CAAC,MAAM,CACnD,CACF,CAAC;gBACJ,CAAC;YACH,CAAC,CACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAGa,AAAP,MAAM,CAAC,eAAe,CAC3B,MAAuB,EACvB,gBAAwB;QAExB,OAAO,IAAI,OAAO,CAChB,CACE,OAAuC,EACvC,MAAkC,EAClC,EAAE;YACF,GAAG,CAAC,UAAU,CACZ,MAAM,CAAC,QAAQ,EAAE,EACjB,CAAC,GAAiB,EAAE,IAA0B,EAAE,EAAE;gBAChD,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAClC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACvB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEnB,IAAI,UAAU,GAAY,KAAK,CAAC;gBAChC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;oBACxB,IAAI,GAAG,GAA2B,IAAI,CAAC;oBACvC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wBACvB,GAAG,GAAI,GAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxC,CAAC;oBAED,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;wBAC7B,UAAU,GAAG,IAAI,CAAC;wBAClB,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC,CACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;CACF;AAhEe;IADb,WAAW,EAAE;;;;mCAsBb;AAGa;IADb,WAAW,EAAE;;;;mCAwCb"}
1
+ {"version":3,"file":"Domain.js","sourceRoot":"","sources":["../../../../Server/Types/Domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import Domain from "../../../Server/Types/Domain";
2
+ import BadDataException from "../../../Types/Exception/BadDataException";
3
+ describe("Domain TXT Record Verification", () => {
4
+ jest.setTimeout(30000); // 30 seconds timeout for DNS tests
5
+ test("should throw user-friendly error for ENODATA", async () => {
6
+ // Testing with a domain that exists but has no TXT records
7
+ const domain = "nonexistentsubdomain-test.google.com";
8
+ const verificationText = "test-verification-text";
9
+ await expect(Domain.verifyTxtRecord(domain, verificationText)).rejects.toThrow(BadDataException);
10
+ try {
11
+ await Domain.verifyTxtRecord(domain, verificationText);
12
+ }
13
+ catch (error) {
14
+ expect(error).toBeInstanceOf(BadDataException);
15
+ if (error instanceof BadDataException) {
16
+ expect(error.message).toContain('Domain "nonexistentsubdomain-test.google.com" not found. Please check if the domain is correct and accessible.');
17
+ expect(error.message).toContain(domain);
18
+ }
19
+ }
20
+ });
21
+ test("should throw user-friendly error for non-existent domain", async () => {
22
+ // Testing with a domain that doesn't exist
23
+ const domain = "thisisadomainthatdoesnotexistanywhere12345.nonexistent";
24
+ const verificationText = "test-verification-text";
25
+ await expect(Domain.verifyTxtRecord(domain, verificationText)).rejects.toThrow(BadDataException);
26
+ try {
27
+ await Domain.verifyTxtRecord(domain, verificationText);
28
+ }
29
+ catch (error) {
30
+ expect(error).toBeInstanceOf(BadDataException);
31
+ if (error instanceof BadDataException) {
32
+ expect(error.message).toContain("not found");
33
+ expect(error.message).toContain(domain);
34
+ // Should not contain technical DNS error codes
35
+ expect(error.message).not.toContain("ENOTFOUND");
36
+ expect(error.message).not.toContain("queryTxt");
37
+ }
38
+ }
39
+ });
40
+ });
41
+ describe("Domain CNAME Record Verification", () => {
42
+ jest.setTimeout(30000); // 30 seconds timeout for DNS tests
43
+ test("should throw user-friendly error for CNAME ENODATA", async () => {
44
+ // Testing with a domain that exists but has no CNAME records (e.g., A record only domain)
45
+ const domain = "google.com"; // This is an A record, not CNAME
46
+ await expect(Domain.getCnameRecords({ domain })).rejects.toThrow(BadDataException);
47
+ try {
48
+ await Domain.getCnameRecords({ domain });
49
+ }
50
+ catch (error) {
51
+ expect(error).toBeInstanceOf(BadDataException);
52
+ if (error instanceof BadDataException) {
53
+ expect(error.message).toContain("CNAME");
54
+ expect(error.message).toContain(domain);
55
+ // Should not contain technical DNS error codes in user message
56
+ expect(error.message).not.toContain("queryCname");
57
+ }
58
+ }
59
+ });
60
+ test("should get CNAME records for valid CNAME domain", async () => {
61
+ // This test might be flaky depending on DNS changes, but let's try with a known CNAME
62
+ const domain = "www.github.com"; // This usually has CNAME records
63
+ try {
64
+ const cnameRecords = await Domain.getCnameRecords({ domain });
65
+ expect(Array.isArray(cnameRecords)).toBe(true);
66
+ expect(cnameRecords.length).toBeGreaterThan(0);
67
+ }
68
+ catch (error) {
69
+ // If this fails, it should still provide a user-friendly error
70
+ expect(error).toBeInstanceOf(BadDataException);
71
+ if (error instanceof BadDataException) {
72
+ expect(error.message).not.toContain("queryCname");
73
+ expect(error.message).not.toContain("ENODATA");
74
+ }
75
+ }
76
+ });
77
+ });
78
+ //# sourceMappingURL=Domain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Domain.test.js","sourceRoot":"","sources":["../../../../../Tests/Server/Types/Domain.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneuptime/common",
3
- "version": "7.0.4976",
3
+ "version": "7.0.4981",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {