@adtrackify/at-service-common 3.18.13 → 3.18.15

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 (71) hide show
  1. package/dist/cjs/__tests__/helpers/acuity-helper.spec.js +41 -0
  2. package/dist/cjs/__tests__/helpers/acuity-helper.spec.js.map +1 -1
  3. package/dist/cjs/__tests__/libs/contacts.spec.d.ts +1 -0
  4. package/dist/cjs/__tests__/libs/contacts.spec.js +291 -0
  5. package/dist/cjs/__tests__/libs/contacts.spec.js.map +1 -0
  6. package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.d.ts +1 -0
  7. package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.js +77 -0
  8. package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.js.map +1 -0
  9. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.d.ts +1 -0
  10. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js +53 -0
  11. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js.map +1 -0
  12. package/dist/cjs/helpers/acuity-helper.d.ts +2 -0
  13. package/dist/cjs/helpers/acuity-helper.js +35 -1
  14. package/dist/cjs/helpers/acuity-helper.js.map +1 -1
  15. package/dist/cjs/libs/contacts.d.ts +7 -0
  16. package/dist/cjs/libs/contacts.js +133 -0
  17. package/dist/cjs/libs/contacts.js.map +1 -0
  18. package/dist/cjs/libs/emails.d.ts +2 -0
  19. package/dist/cjs/libs/emails.js +30 -1
  20. package/dist/cjs/libs/emails.js.map +1 -1
  21. package/dist/cjs/libs/index.d.ts +1 -0
  22. package/dist/cjs/libs/index.js +1 -0
  23. package/dist/cjs/libs/index.js.map +1 -1
  24. package/dist/cjs/services/email-verification/contact-email-verifier.d.ts +4 -0
  25. package/dist/cjs/services/email-verification/contact-email-verifier.js +61 -0
  26. package/dist/cjs/services/email-verification/contact-email-verifier.js.map +1 -0
  27. package/dist/cjs/services/email-verification/email-verification-service.d.ts +17 -0
  28. package/dist/cjs/services/email-verification/email-verification-service.js +93 -0
  29. package/dist/cjs/services/email-verification/email-verification-service.js.map +1 -0
  30. package/dist/cjs/services/email-verification/index.d.ts +2 -0
  31. package/dist/cjs/services/email-verification/index.js +19 -0
  32. package/dist/cjs/services/email-verification/index.js.map +1 -0
  33. package/dist/cjs/services/index.d.ts +1 -0
  34. package/dist/cjs/services/index.js +1 -0
  35. package/dist/cjs/services/index.js.map +1 -1
  36. package/dist/esm/__tests__/helpers/acuity-helper.spec.js +42 -1
  37. package/dist/esm/__tests__/helpers/acuity-helper.spec.js.map +1 -1
  38. package/dist/esm/__tests__/libs/contacts.spec.d.ts +1 -0
  39. package/dist/esm/__tests__/libs/contacts.spec.js +289 -0
  40. package/dist/esm/__tests__/libs/contacts.spec.js.map +1 -0
  41. package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.d.ts +1 -0
  42. package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.js +75 -0
  43. package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.js.map +1 -0
  44. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.d.ts +1 -0
  45. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js +51 -0
  46. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js.map +1 -0
  47. package/dist/esm/helpers/acuity-helper.d.ts +2 -0
  48. package/dist/esm/helpers/acuity-helper.js +33 -0
  49. package/dist/esm/helpers/acuity-helper.js.map +1 -1
  50. package/dist/esm/libs/contacts.d.ts +7 -0
  51. package/dist/esm/libs/contacts.js +124 -0
  52. package/dist/esm/libs/contacts.js.map +1 -0
  53. package/dist/esm/libs/emails.d.ts +2 -0
  54. package/dist/esm/libs/emails.js +28 -0
  55. package/dist/esm/libs/emails.js.map +1 -1
  56. package/dist/esm/libs/index.d.ts +1 -0
  57. package/dist/esm/libs/index.js +1 -0
  58. package/dist/esm/libs/index.js.map +1 -1
  59. package/dist/esm/services/email-verification/contact-email-verifier.d.ts +4 -0
  60. package/dist/esm/services/email-verification/contact-email-verifier.js +56 -0
  61. package/dist/esm/services/email-verification/contact-email-verifier.js.map +1 -0
  62. package/dist/esm/services/email-verification/email-verification-service.d.ts +17 -0
  63. package/dist/esm/services/email-verification/email-verification-service.js +89 -0
  64. package/dist/esm/services/email-verification/email-verification-service.js.map +1 -0
  65. package/dist/esm/services/email-verification/index.d.ts +2 -0
  66. package/dist/esm/services/email-verification/index.js +3 -0
  67. package/dist/esm/services/email-verification/index.js.map +1 -0
  68. package/dist/esm/services/index.d.ts +1 -0
  69. package/dist/esm/services/index.js +1 -0
  70. package/dist/esm/services/index.js.map +1 -1
  71. package/package.json +2 -2
@@ -0,0 +1,124 @@
1
+ import { getCleanedArray } from '@adtrackify/at-shared-utils';
2
+ import { Logger } from '../helpers';
3
+ import { generateSha256Hash } from './crypto.js';
4
+ import { normalizeGmailAddress, validateEmail } from './emails.js';
5
+ import { capitalizeEachWord } from './strings.js';
6
+ import { safeParsePhone } from './traits.js';
7
+ export const buildThirdPartyTraits = (contacts, sourceId, contactGroupId) => {
8
+ try {
9
+ const emails = contacts.map((contact) => contact.emailAddress).filter((email) => !!email);
10
+ const phones = contacts
11
+ .flatMap((contact) => [contact.mobilePhone1, contact.homePhone1])
12
+ .filter((phone) => !!phone)
13
+ .map((phone) => safeParsePhone(phone))
14
+ .filter((phone) => !!phone);
15
+ const now = Date.now();
16
+ return {
17
+ ...(contactGroupId ? { cgId: contactGroupId } : {}),
18
+ si: sourceId,
19
+ esha2: getCleanedArray(emails).map((email) => generateSha256Hash(email)),
20
+ psha2: getCleanedArray(phones).map((phone) => generateSha256Hash(phone)),
21
+ cra: now,
22
+ upa: now,
23
+ };
24
+ }
25
+ catch (error) {
26
+ Logger.error('Failed to build third party traits', { error, sourceId });
27
+ return null;
28
+ }
29
+ };
30
+ export const normalizeThirdPartyContacts = (contacts) => {
31
+ try {
32
+ return contacts.map((contact) => ({
33
+ ...contact,
34
+ emailAddress: contact.emailAddress?.trim()?.toLowerCase(),
35
+ firstName: contact?.firstName ? capitalizeEachWord(contact.firstName.trim()) : undefined,
36
+ lastName: contact?.lastName ? capitalizeEachWord(contact.lastName.trim()) : undefined,
37
+ }));
38
+ }
39
+ catch (error) {
40
+ Logger.error('Failed to normalize third party contacts', { error });
41
+ return contacts;
42
+ }
43
+ };
44
+ export const removeDuplicateContactsByEmail = (contacts, emailKey) => {
45
+ return contacts.filter((contact, index, self) => index === self.findIndex((other) => other[emailKey] === contact[emailKey]));
46
+ };
47
+ export const removeInvalidContactsByEmail = (contacts, emailKey) => {
48
+ return contacts.filter((contact) => contact[emailKey] && contact?.[emailKey]?.trim() !== '' && validateEmail(contact[emailKey]));
49
+ };
50
+ export const removeDuplicateNonDottedGmailContacts = (contacts) => {
51
+ try {
52
+ if (!contacts || contacts.length === 0) {
53
+ return contacts;
54
+ }
55
+ const uniqueContacts = [];
56
+ for (const contact of contacts) {
57
+ if (!contact.emailAddress || !contact.emailAddress.includes('@gmail.com')) {
58
+ uniqueContacts.push(contact);
59
+ continue;
60
+ }
61
+ const localPart = contact.emailAddress.split('@')[0] ?? '';
62
+ const normalizedEmail = normalizeGmailAddress(contact.emailAddress);
63
+ const existingIndex = uniqueContacts.findIndex((existing) => existing.emailAddress &&
64
+ normalizeGmailAddress(existing.emailAddress) === normalizedEmail &&
65
+ existing.emailAddress !== contact.emailAddress);
66
+ if (existingIndex === -1) {
67
+ uniqueContacts.push(contact);
68
+ continue;
69
+ }
70
+ const existingContact = uniqueContacts[existingIndex];
71
+ const existingIsDotted = existingContact.emailAddress?.split('@')[0]?.includes('.');
72
+ if (localPart.includes('.') && !existingIsDotted) {
73
+ Logger.info('Replacing non-dotted Gmail with dotted Gmail contact', { replacing: existingContact, with: contact });
74
+ uniqueContacts.splice(existingIndex, 1, contact);
75
+ }
76
+ else {
77
+ Logger.info('Duplicate Gmail contact found -- skipping', { contact, existingContact });
78
+ }
79
+ }
80
+ Logger.info('Removed non-dotted duplicate gmail contacts', {
81
+ originalCount: contacts.length,
82
+ uniqueCount: uniqueContacts.length,
83
+ removedCount: contacts.length - uniqueContacts.length,
84
+ });
85
+ return uniqueContacts;
86
+ }
87
+ catch (error) {
88
+ Logger.error('Failed to remove non-dotted duplicate gmail contacts', { error });
89
+ return contacts;
90
+ }
91
+ };
92
+ export const removeDuplicateDottedEmailVariationContacts = (contacts) => {
93
+ try {
94
+ if (!contacts || contacts.length === 0) {
95
+ return contacts;
96
+ }
97
+ const seenNormalizedEmails = new Set();
98
+ const uniqueContacts = [];
99
+ for (const contact of contacts) {
100
+ if (!contact.emailAddress) {
101
+ uniqueContacts.push(contact);
102
+ continue;
103
+ }
104
+ const normalizedEmail = normalizeGmailAddress(contact.emailAddress);
105
+ if (seenNormalizedEmails.has(normalizedEmail)) {
106
+ Logger.info('Duplicate dotted email gmail variation found -- skipping', { contact, normalizedEmail });
107
+ continue;
108
+ }
109
+ seenNormalizedEmails.add(normalizedEmail);
110
+ uniqueContacts.push({ ...contact, emailAddress: normalizedEmail });
111
+ }
112
+ Logger.info('Removed duplicate dotted email variations', {
113
+ originalCount: contacts.length,
114
+ uniqueCount: uniqueContacts.length,
115
+ removedCount: contacts.length - uniqueContacts.length,
116
+ });
117
+ return uniqueContacts;
118
+ }
119
+ catch (error) {
120
+ Logger.error('Failed to remove duplicate dotted email variations', { error });
121
+ return contacts;
122
+ }
123
+ };
124
+ //# sourceMappingURL=contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/libs/contacts.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,7 @@ export declare const normalizeGmailAddress: (email: string) => string;
2
2
  export declare const validateEmail: (email: string) => boolean;
3
3
  export declare const riskyEmailDomains: string[];
4
4
  export declare const disposableEmailDomains: string[];
5
+ export declare const blacklistedEmailDomains: string[];
5
6
  export declare const isDisposableEmail: (email: string) => boolean;
6
7
  export declare const isYahooEmail: (email: string) => boolean;
8
+ export declare const isBlacklistedEmail: (email: string) => boolean;
@@ -107,10 +107,38 @@ export const disposableEmailDomains = [
107
107
  'guerrillamail.biz',
108
108
  'guerrillamail.com',
109
109
  ];
110
+ export const blacklistedEmailDomains = [
111
+ 'consolidated.net',
112
+ 'consolidated.com',
113
+ 'consolidated.org',
114
+ 'cicmed.org',
115
+ 'netzero.net',
116
+ 'netzero.com',
117
+ 'netscape.com',
118
+ 'netscape.net',
119
+ 'webtv.net',
120
+ 'mindspring.com',
121
+ 'mac.com',
122
+ 'rocketmail.com',
123
+ 'yahoo.net',
124
+ 'amazom.com',
125
+ 'mailinator.com',
126
+ 'yopmail.com',
127
+ 'maildrop.cc',
128
+ 'mailnesia.com',
129
+ 'guerrillamail.com',
130
+ 'guerrillamailblock.com',
131
+ 'guerrillamail.org',
132
+ 'guerrillamail.net',
133
+ 'guerrillamail.biz',
134
+ ];
110
135
  export const isDisposableEmail = (email) => {
111
136
  return disposableEmailDomains.some((domain) => email.includes(domain));
112
137
  };
113
138
  export const isYahooEmail = (email) => {
114
139
  return riskyEmailDomains.some((domain) => email.includes(domain));
115
140
  };
141
+ export const isBlacklistedEmail = (email) => {
142
+ return blacklistedEmailDomains.some((domain) => email.includes(domain));
143
+ };
116
144
  //# sourceMappingURL=emails.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"emails.js","sourceRoot":"","sources":["../../../src/libs/emails.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"emails.js","sourceRoot":"","sources":["../../../src/libs/emails.ts"],"names":[],"mappings":"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"}
@@ -15,4 +15,5 @@ export * from './strings.js';
15
15
  export * from './cookie.js';
16
16
  export * from './domain.js';
17
17
  export * from './emails.js';
18
+ export * from './contacts.js';
18
19
  export * from './api-router/index.js';
@@ -15,5 +15,6 @@ export * from './strings.js';
15
15
  export * from './cookie.js';
16
16
  export * from './domain.js';
17
17
  export * from './emails.js';
18
+ export * from './contacts.js';
18
19
  export * from './api-router/index.js';
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/libs/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/libs/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { EmailableVerifyEmailResponse, ThirdPartyContact } from '@adtrackify/at-tracking-event-types';
2
+ import type { EmailVerificationService } from './email-verification-service.js';
3
+ export declare const verifyContactEmail: (contact: ThirdPartyContact, email: string, emailVerificationService: EmailVerificationService, forceVerify?: boolean) => Promise<EmailableVerifyEmailResponse | null>;
4
+ export declare const verifyContactsEmail: (contacts: ThirdPartyContact[], emailVerificationService: EmailVerificationService) => Promise<ThirdPartyContact[] | null>;
@@ -0,0 +1,56 @@
1
+ import { EMAIL_STATUS } from '@adtrackify/at-tracking-event-types';
2
+ import { Logger } from '../../helpers';
3
+ import { isBlacklistedEmail, isDisposableEmail, isYahooEmail, validateEmail } from '../../libs/emails.js';
4
+ export const verifyContactEmail = async (contact, email, emailVerificationService, forceVerify = false) => {
5
+ try {
6
+ if (!validateEmail(email)) {
7
+ Logger.error('Email verification: invalid email', { contact, email });
8
+ return null;
9
+ }
10
+ if (isBlacklistedEmail(email)) {
11
+ Logger.error('Email verification: blacklisted email', { contact, email });
12
+ return null;
13
+ }
14
+ if (isDisposableEmail(email)) {
15
+ Logger.error('Email verification: disposable email', { contact, email });
16
+ return null;
17
+ }
18
+ if (isYahooEmail(email) && !forceVerify) {
19
+ Logger.info('Email verification: risky Yahoo email — skipping Emailable', { contact, email });
20
+ return { state: EMAIL_STATUS.RISKY, email, reason: 'Yahoo email - riskier than other emails' };
21
+ }
22
+ const response = await emailVerificationService.getEmailVerificationWithCaching(email);
23
+ if (!response?.emailVerification) {
24
+ Logger.error('Email verification: no response from verification service', { contact, email, response });
25
+ return null;
26
+ }
27
+ Logger.info('Email verification: result', { contact, email, emailVerification: response.emailVerification });
28
+ return response.emailVerification;
29
+ }
30
+ catch (error) {
31
+ Logger.error('Email verification: failed to verify contact email', { error, email });
32
+ return null;
33
+ }
34
+ };
35
+ export const verifyContactsEmail = async (contacts, emailVerificationService) => {
36
+ try {
37
+ const verifiedContacts = [];
38
+ for (const contact of contacts) {
39
+ const email = contact.emailAddress;
40
+ if (!email) {
41
+ Logger.warn('Email verification: no email on contact — skipping', { contact });
42
+ continue;
43
+ }
44
+ const emailVerification = await verifyContactEmail(contact, email, emailVerificationService);
45
+ if (emailVerification) {
46
+ verifiedContacts.push({ ...contact, emailVerification });
47
+ }
48
+ }
49
+ return verifiedContacts;
50
+ }
51
+ catch (error) {
52
+ Logger.error('Email verification: failed to verify contact emails', { error });
53
+ return null;
54
+ }
55
+ };
56
+ //# sourceMappingURL=contact-email-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-email-verifier.js","sourceRoot":"","sources":["../../../../src/services/email-verification/contact-email-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { EmailableVerifyEmailResponse } from '@adtrackify/at-tracking-event-types';
2
+ export interface EmailVerificationCache {
3
+ email: string;
4
+ emailVerification: EmailableVerifyEmailResponse;
5
+ createdAt?: string;
6
+ updatedAt: string;
7
+ expiresAt?: number;
8
+ }
9
+ export declare class EmailVerificationService {
10
+ private cacheLambdaClient;
11
+ private emailableClient;
12
+ constructor(cacheLambdaFunctionArn: string, emailableApiKey: string);
13
+ getEmailVerificationWithCaching: (email: string) => Promise<EmailVerificationCache | undefined>;
14
+ getEmailVerificationFromCache: (email: string) => Promise<EmailVerificationCache | undefined>;
15
+ setEmailVerificationCache: (email: string, emailVerificationCache: EmailVerificationCache) => Promise<void>;
16
+ private verifyEmail;
17
+ }
@@ -0,0 +1,89 @@
1
+ import { CacheLambdaClient } from '../../clients/internal-api/cache-lambda-client.js';
2
+ import { EmailableClient } from '../../clients/third-party/emailable-client.js';
3
+ import { Logger } from '../../helpers';
4
+ import { getCurrentTimestamp } from '../../libs/dates.js';
5
+ const EMAIL_VERIFICATION_CACHE_TTL_IN_SECONDS = 60 * 60 * 24 * 30 * 6;
6
+ export class EmailVerificationService {
7
+ cacheLambdaClient;
8
+ emailableClient;
9
+ constructor(cacheLambdaFunctionArn, emailableApiKey) {
10
+ this.cacheLambdaClient = new CacheLambdaClient(cacheLambdaFunctionArn);
11
+ this.emailableClient = new EmailableClient(emailableApiKey);
12
+ }
13
+ getEmailVerificationWithCaching = async (email) => {
14
+ try {
15
+ if (!email) {
16
+ Logger.error('getEmailVerificationWithCaching - No email', { email });
17
+ return undefined;
18
+ }
19
+ const cached = await this.getEmailVerificationFromCache(email);
20
+ if (cached?.emailVerification) {
21
+ Logger.info('email verification cache hit', { email, cached });
22
+ return cached;
23
+ }
24
+ Logger.info('email verification cache miss - fetching from emailable api', { email });
25
+ const emailVerification = await this.verifyEmail(email);
26
+ if (!emailVerification) {
27
+ Logger.error('Failed to get email verification from emailable api', { email });
28
+ return undefined;
29
+ }
30
+ const cacheResponse = {
31
+ email,
32
+ emailVerification,
33
+ createdAt: getCurrentTimestamp(),
34
+ updatedAt: getCurrentTimestamp(),
35
+ expiresAt: Date.now() + EMAIL_VERIFICATION_CACHE_TTL_IN_SECONDS * 1000,
36
+ };
37
+ await this.setEmailVerificationCache(email, cacheResponse);
38
+ return cacheResponse;
39
+ }
40
+ catch (error) {
41
+ Logger.error('Error while getting email verification with caching', { error, email });
42
+ return undefined;
43
+ }
44
+ };
45
+ getEmailVerificationFromCache = async (email) => {
46
+ try {
47
+ if (!email) {
48
+ return undefined;
49
+ }
50
+ const cacheKey = `emailVerification_${email}`;
51
+ const cacheResponse = await this.cacheLambdaClient.invokeGet(cacheKey);
52
+ if (cacheResponse?.responseData) {
53
+ return cacheResponse.responseData;
54
+ }
55
+ return undefined;
56
+ }
57
+ catch (error) {
58
+ Logger.error('Error while getting email verification from cache', { error, email });
59
+ return undefined;
60
+ }
61
+ };
62
+ setEmailVerificationCache = async (email, emailVerificationCache) => {
63
+ try {
64
+ if (!email || !emailVerificationCache) {
65
+ return;
66
+ }
67
+ const cacheKey = `emailVerification_${email}`;
68
+ await this.cacheLambdaClient.invokeSet(cacheKey, JSON.stringify(emailVerificationCache), EMAIL_VERIFICATION_CACHE_TTL_IN_SECONDS);
69
+ }
70
+ catch (error) {
71
+ Logger.error('Error while updating email verification cache', { error, email, emailVerificationCache });
72
+ }
73
+ };
74
+ verifyEmail = async (email) => {
75
+ try {
76
+ const response = await this.emailableClient.verifyEmail(email);
77
+ if (response.status === 200) {
78
+ return response.data;
79
+ }
80
+ Logger.error('Emailable verification returned a failure status', { email, status: response.status });
81
+ return null;
82
+ }
83
+ catch (error) {
84
+ Logger.error('Emailable verification failed', { error, email });
85
+ return null;
86
+ }
87
+ };
88
+ }
89
+ //# sourceMappingURL=email-verification-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-verification-service.js","sourceRoot":"","sources":["../../../../src/services/email-verification/email-verification-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './email-verification-service.js';
2
+ export * from './contact-email-verifier.js';
@@ -0,0 +1,3 @@
1
+ export * from './email-verification-service.js';
2
+ export * from './contact-email-verifier.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/email-verification/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC"}
@@ -3,6 +3,7 @@ export * from './ipdata-lookup-service.js';
3
3
  export * from './generic-cache-service.js';
4
4
  export * from './currency-exchange-rate-lookup-service.js';
5
5
  export * from './acuity-api-service.js';
6
+ export * from './email-verification';
6
7
  export * from './db';
7
8
  export * from './shopify';
8
9
  export * from './cache';
@@ -3,6 +3,7 @@ export * from './ipdata-lookup-service.js';
3
3
  export * from './generic-cache-service.js';
4
4
  export * from './currency-exchange-rate-lookup-service.js';
5
5
  export * from './acuity-api-service.js';
6
+ export * from './email-verification';
6
7
  export * from './db';
7
8
  export * from './shopify';
8
9
  export * from './cache';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,yBAAyB,CAAC;AACxC,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adtrackify/at-service-common",
3
- "version": "3.18.13",
3
+ "version": "3.18.15",
4
4
  "description": "",
5
5
  "files": [
6
6
  "dist/*"
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@adtrackify/at-shared-utils": "^3.2.23",
40
- "@adtrackify/at-tracking-event-types": "^4.70.30",
40
+ "@adtrackify/at-tracking-event-types": "^4.70.36",
41
41
  "@aws-sdk/util-utf8": "^3.374.0",
42
42
  "@shopify/admin-api-client": "^1.0.4",
43
43
  "@shopify/shopify-api": "^11.6.1",