@adtrackify/at-service-common 3.18.13 → 3.18.14

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 (61) hide show
  1. package/dist/cjs/__tests__/libs/contacts.spec.d.ts +1 -0
  2. package/dist/cjs/__tests__/libs/contacts.spec.js +272 -0
  3. package/dist/cjs/__tests__/libs/contacts.spec.js.map +1 -0
  4. package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.d.ts +1 -0
  5. package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.js +77 -0
  6. package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.js.map +1 -0
  7. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.d.ts +1 -0
  8. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js +53 -0
  9. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js.map +1 -0
  10. package/dist/cjs/libs/contacts.d.ts +6 -0
  11. package/dist/cjs/libs/contacts.js +106 -0
  12. package/dist/cjs/libs/contacts.js.map +1 -0
  13. package/dist/cjs/libs/emails.d.ts +2 -0
  14. package/dist/cjs/libs/emails.js +30 -1
  15. package/dist/cjs/libs/emails.js.map +1 -1
  16. package/dist/cjs/libs/index.d.ts +1 -0
  17. package/dist/cjs/libs/index.js +1 -0
  18. package/dist/cjs/libs/index.js.map +1 -1
  19. package/dist/cjs/services/email-verification/contact-email-verifier.d.ts +4 -0
  20. package/dist/cjs/services/email-verification/contact-email-verifier.js +61 -0
  21. package/dist/cjs/services/email-verification/contact-email-verifier.js.map +1 -0
  22. package/dist/cjs/services/email-verification/email-verification-service.d.ts +17 -0
  23. package/dist/cjs/services/email-verification/email-verification-service.js +93 -0
  24. package/dist/cjs/services/email-verification/email-verification-service.js.map +1 -0
  25. package/dist/cjs/services/email-verification/index.d.ts +2 -0
  26. package/dist/cjs/services/email-verification/index.js +19 -0
  27. package/dist/cjs/services/email-verification/index.js.map +1 -0
  28. package/dist/cjs/services/index.d.ts +1 -0
  29. package/dist/cjs/services/index.js +1 -0
  30. package/dist/cjs/services/index.js.map +1 -1
  31. package/dist/esm/__tests__/libs/contacts.spec.d.ts +1 -0
  32. package/dist/esm/__tests__/libs/contacts.spec.js +270 -0
  33. package/dist/esm/__tests__/libs/contacts.spec.js.map +1 -0
  34. package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.d.ts +1 -0
  35. package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.js +75 -0
  36. package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.js.map +1 -0
  37. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.d.ts +1 -0
  38. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js +51 -0
  39. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js.map +1 -0
  40. package/dist/esm/libs/contacts.d.ts +6 -0
  41. package/dist/esm/libs/contacts.js +98 -0
  42. package/dist/esm/libs/contacts.js.map +1 -0
  43. package/dist/esm/libs/emails.d.ts +2 -0
  44. package/dist/esm/libs/emails.js +28 -0
  45. package/dist/esm/libs/emails.js.map +1 -1
  46. package/dist/esm/libs/index.d.ts +1 -0
  47. package/dist/esm/libs/index.js +1 -0
  48. package/dist/esm/libs/index.js.map +1 -1
  49. package/dist/esm/services/email-verification/contact-email-verifier.d.ts +4 -0
  50. package/dist/esm/services/email-verification/contact-email-verifier.js +56 -0
  51. package/dist/esm/services/email-verification/contact-email-verifier.js.map +1 -0
  52. package/dist/esm/services/email-verification/email-verification-service.d.ts +17 -0
  53. package/dist/esm/services/email-verification/email-verification-service.js +89 -0
  54. package/dist/esm/services/email-verification/email-verification-service.js.map +1 -0
  55. package/dist/esm/services/email-verification/index.d.ts +2 -0
  56. package/dist/esm/services/email-verification/index.js +3 -0
  57. package/dist/esm/services/email-verification/index.js.map +1 -0
  58. package/dist/esm/services/index.d.ts +1 -0
  59. package/dist/esm/services/index.js +1 -0
  60. package/dist/esm/services/index.js.map +1 -1
  61. package/package.json +2 -2
@@ -0,0 +1,75 @@
1
+ import { CONTACT_ACQUISITION_SOURCE, CONTACT_SOURCE_ID, EMAIL_STATUS } from '@adtrackify/at-tracking-event-types';
2
+ import { isBlacklistedEmail } from '../../../libs/emails';
3
+ import { verifyContactEmail, verifyContactsEmail } from '../../../services/email-verification/contact-email-verifier';
4
+ const createTestContact = (emailAddress, id = 'c1') => ({
5
+ id,
6
+ source: CONTACT_ACQUISITION_SOURCE.BDEX,
7
+ sourceId: CONTACT_SOURCE_ID.BDEX,
8
+ firstName: 'John',
9
+ lastName: 'Doe',
10
+ emailAddress,
11
+ emailStatus: EMAIL_STATUS.DELIVERABLE,
12
+ pixelId: 'px',
13
+ identityId: 'id',
14
+ sessionId: 'sess',
15
+ createdAt: '1',
16
+ updatedAt: '1',
17
+ });
18
+ const buildService = (impl) => ({ getEmailVerificationWithCaching: impl ?? jest.fn() });
19
+ describe('isBlacklistedEmail', () => {
20
+ it('flags blacklisted domains and passes clean ones', () => {
21
+ expect(isBlacklistedEmail('a@consolidated.net')).toBe(true);
22
+ expect(isBlacklistedEmail('a@mailinator.com')).toBe(true);
23
+ expect(isBlacklistedEmail('a@example.com')).toBe(false);
24
+ });
25
+ });
26
+ describe('verifyContactEmail', () => {
27
+ it('returns null for an invalid email and never calls the service', async () => {
28
+ const verify = jest.fn();
29
+ const result = await verifyContactEmail(createTestContact('not-an-email'), 'not-an-email', buildService(verify));
30
+ expect(result).toBeNull();
31
+ expect(verify).not.toHaveBeenCalled();
32
+ });
33
+ it('returns null for a blacklisted email and never calls the service', async () => {
34
+ const verify = jest.fn();
35
+ const result = await verifyContactEmail(createTestContact('a@consolidated.net'), 'a@consolidated.net', buildService(verify));
36
+ expect(result).toBeNull();
37
+ expect(verify).not.toHaveBeenCalled();
38
+ });
39
+ it('short-circuits a risky Yahoo email to RISKY without calling the service', async () => {
40
+ const verify = jest.fn();
41
+ const result = await verifyContactEmail(createTestContact('a@yahoo.com'), 'a@yahoo.com', buildService(verify));
42
+ expect(result?.state).toBe(EMAIL_STATUS.RISKY);
43
+ expect(verify).not.toHaveBeenCalled();
44
+ });
45
+ it('verifies a Yahoo email via the service when forceVerify is true', async () => {
46
+ const verify = jest.fn().mockResolvedValue({ emailVerification: { state: EMAIL_STATUS.DELIVERABLE, email: 'a@yahoo.com' } });
47
+ const result = await verifyContactEmail(createTestContact('a@yahoo.com'), 'a@yahoo.com', buildService(verify), true);
48
+ expect(verify).toHaveBeenCalledWith('a@yahoo.com');
49
+ expect(result?.state).toBe(EMAIL_STATUS.DELIVERABLE);
50
+ });
51
+ it('returns the verification result for a clean email', async () => {
52
+ const verify = jest.fn().mockResolvedValue({ emailVerification: { state: EMAIL_STATUS.DELIVERABLE, email: 'good@example.com' } });
53
+ const result = await verifyContactEmail(createTestContact('good@example.com'), 'good@example.com', buildService(verify));
54
+ expect(verify).toHaveBeenCalledWith('good@example.com');
55
+ expect(result?.state).toBe(EMAIL_STATUS.DELIVERABLE);
56
+ });
57
+ it('returns null when the service yields no verification', async () => {
58
+ const verify = jest.fn().mockResolvedValue(undefined);
59
+ const result = await verifyContactEmail(createTestContact('good@example.com'), 'good@example.com', buildService(verify));
60
+ expect(result).toBeNull();
61
+ });
62
+ });
63
+ describe('verifyContactsEmail', () => {
64
+ it('keeps verified contacts, drops failures + no-email, and does not mutate the input', async () => {
65
+ const verify = jest.fn(async (email) => email === 'good@example.com' ? { emailVerification: { state: EMAIL_STATUS.DELIVERABLE, email } } : undefined);
66
+ const good = createTestContact('good@example.com', 'good');
67
+ const contacts = [good, createTestContact('not-an-email', 'bad'), createTestContact(undefined, 'noemail')];
68
+ const result = await verifyContactsEmail(contacts, buildService(verify));
69
+ expect(result).toHaveLength(1);
70
+ expect(result?.[0].id).toBe('good');
71
+ expect(result?.[0].emailVerification?.state).toBe(EMAIL_STATUS.DELIVERABLE);
72
+ expect(good.emailVerification).toBeUndefined();
73
+ });
74
+ });
75
+ //# sourceMappingURL=contact-email-verifier.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-email-verifier.spec.js","sourceRoot":"","sources":["../../../../../src/__tests__/services/email-verification/contact-email-verifier.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { EMAIL_STATUS } from '@adtrackify/at-tracking-event-types';
2
+ jest.mock('../../../clients/internal-api/cache-lambda-client', () => ({
3
+ CacheLambdaClient: jest.fn().mockImplementation(() => ({ invokeGet: jest.fn(), invokeSet: jest.fn() })),
4
+ }));
5
+ jest.mock('../../../clients/third-party/emailable-client', () => ({
6
+ EmailableClient: jest.fn().mockImplementation(() => ({ verifyEmail: jest.fn() })),
7
+ }));
8
+ import { CacheLambdaClient } from '../../../clients/internal-api/cache-lambda-client';
9
+ import { EmailableClient } from '../../../clients/third-party/emailable-client';
10
+ import { EmailVerificationService } from '../../../services/email-verification/email-verification-service';
11
+ const lastInstance = (mockClass) => mockClass.mock.results.at(-1)?.value;
12
+ describe('EmailVerificationCacheDbService.getEmailVerificationWithCaching', () => {
13
+ let service;
14
+ let cache;
15
+ let emailable;
16
+ beforeEach(() => {
17
+ jest.clearAllMocks();
18
+ service = new EmailVerificationService('cache-arn', 'emailable-key');
19
+ cache = lastInstance(CacheLambdaClient);
20
+ emailable = lastInstance(EmailableClient);
21
+ });
22
+ it('returns undefined and does nothing when no email is provided', async () => {
23
+ const result = await service.getEmailVerificationWithCaching('');
24
+ expect(result).toBeUndefined();
25
+ expect(cache.invokeGet).not.toHaveBeenCalled();
26
+ expect(emailable.verifyEmail).not.toHaveBeenCalled();
27
+ });
28
+ it('returns the cached verification on a cache hit and never calls Emailable', async () => {
29
+ cache.invokeGet.mockResolvedValue({ responseData: { email: 'a@b.com', emailVerification: { state: EMAIL_STATUS.DELIVERABLE } } });
30
+ const result = await service.getEmailVerificationWithCaching('a@b.com');
31
+ expect(result?.emailVerification.state).toBe(EMAIL_STATUS.DELIVERABLE);
32
+ expect(emailable.verifyEmail).not.toHaveBeenCalled();
33
+ expect(cache.invokeSet).not.toHaveBeenCalled();
34
+ });
35
+ it('verifies via Emailable on a cache miss and writes the result to cache', async () => {
36
+ cache.invokeGet.mockResolvedValue(undefined);
37
+ emailable.verifyEmail.mockResolvedValue({ status: 200, data: { state: EMAIL_STATUS.DELIVERABLE, email: 'a@b.com' } });
38
+ const result = await service.getEmailVerificationWithCaching('a@b.com');
39
+ expect(emailable.verifyEmail).toHaveBeenCalledWith('a@b.com');
40
+ expect(result?.emailVerification.state).toBe(EMAIL_STATUS.DELIVERABLE);
41
+ expect(cache.invokeSet).toHaveBeenCalledTimes(1);
42
+ });
43
+ it('returns undefined and does not cache when Emailable returns a non-200', async () => {
44
+ cache.invokeGet.mockResolvedValue(undefined);
45
+ emailable.verifyEmail.mockResolvedValue({ status: 500 });
46
+ const result = await service.getEmailVerificationWithCaching('a@b.com');
47
+ expect(result).toBeUndefined();
48
+ expect(cache.invokeSet).not.toHaveBeenCalled();
49
+ });
50
+ });
51
+ //# sourceMappingURL=email-verification-service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-verification-service.spec.js","sourceRoot":"","sources":["../../../../../src/__tests__/services/email-verification/email-verification-service.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ThirdPartyContact } from '@adtrackify/at-tracking-event-types';
2
+ export declare const normalizeThirdPartyContacts: (contacts: ThirdPartyContact[]) => ThirdPartyContact[];
3
+ export declare const removeDuplicateContactsByEmail: <T extends ThirdPartyContact>(contacts: T[], emailKey: keyof T) => T[];
4
+ export declare const removeInvalidContactsByEmail: (contacts: ThirdPartyContact[], emailKey: keyof ThirdPartyContact) => ThirdPartyContact[];
5
+ export declare const removeDuplicateNonDottedGmailContacts: (contacts: ThirdPartyContact[]) => ThirdPartyContact[];
6
+ export declare const removeDuplicateDottedEmailVariationContacts: (contacts: ThirdPartyContact[]) => ThirdPartyContact[];
@@ -0,0 +1,98 @@
1
+ import { Logger } from '../helpers';
2
+ import { normalizeGmailAddress, validateEmail } from './emails.js';
3
+ import { capitalizeEachWord } from './strings.js';
4
+ export const normalizeThirdPartyContacts = (contacts) => {
5
+ try {
6
+ return contacts.map((contact) => ({
7
+ ...contact,
8
+ emailAddress: contact.emailAddress?.trim()?.toLowerCase(),
9
+ firstName: contact?.firstName ? capitalizeEachWord(contact.firstName.trim()) : undefined,
10
+ lastName: contact?.lastName ? capitalizeEachWord(contact.lastName.trim()) : undefined,
11
+ }));
12
+ }
13
+ catch (error) {
14
+ Logger.error('Failed to normalize third party contacts', { error });
15
+ return contacts;
16
+ }
17
+ };
18
+ export const removeDuplicateContactsByEmail = (contacts, emailKey) => {
19
+ return contacts.filter((contact, index, self) => index === self.findIndex((other) => other[emailKey] === contact[emailKey]));
20
+ };
21
+ export const removeInvalidContactsByEmail = (contacts, emailKey) => {
22
+ return contacts.filter((contact) => contact[emailKey] && contact?.[emailKey]?.trim() !== '' && validateEmail(contact[emailKey]));
23
+ };
24
+ export const removeDuplicateNonDottedGmailContacts = (contacts) => {
25
+ try {
26
+ if (!contacts || contacts.length === 0) {
27
+ return contacts;
28
+ }
29
+ const uniqueContacts = [];
30
+ for (const contact of contacts) {
31
+ if (!contact.emailAddress || !contact.emailAddress.includes('@gmail.com')) {
32
+ uniqueContacts.push(contact);
33
+ continue;
34
+ }
35
+ const localPart = contact.emailAddress.split('@')[0] ?? '';
36
+ const normalizedEmail = normalizeGmailAddress(contact.emailAddress);
37
+ const existingIndex = uniqueContacts.findIndex((existing) => existing.emailAddress &&
38
+ normalizeGmailAddress(existing.emailAddress) === normalizedEmail &&
39
+ existing.emailAddress !== contact.emailAddress);
40
+ if (existingIndex === -1) {
41
+ uniqueContacts.push(contact);
42
+ continue;
43
+ }
44
+ const existingContact = uniqueContacts[existingIndex];
45
+ const existingIsDotted = existingContact.emailAddress?.split('@')[0]?.includes('.');
46
+ if (localPart.includes('.') && !existingIsDotted) {
47
+ Logger.info('Replacing non-dotted Gmail with dotted Gmail contact', { replacing: existingContact, with: contact });
48
+ uniqueContacts.splice(existingIndex, 1, contact);
49
+ }
50
+ else {
51
+ Logger.info('Duplicate Gmail contact found -- skipping', { contact, existingContact });
52
+ }
53
+ }
54
+ Logger.info('Removed non-dotted duplicate gmail contacts', {
55
+ originalCount: contacts.length,
56
+ uniqueCount: uniqueContacts.length,
57
+ removedCount: contacts.length - uniqueContacts.length,
58
+ });
59
+ return uniqueContacts;
60
+ }
61
+ catch (error) {
62
+ Logger.error('Failed to remove non-dotted duplicate gmail contacts', { error });
63
+ return contacts;
64
+ }
65
+ };
66
+ export const removeDuplicateDottedEmailVariationContacts = (contacts) => {
67
+ try {
68
+ if (!contacts || contacts.length === 0) {
69
+ return contacts;
70
+ }
71
+ const seenNormalizedEmails = new Set();
72
+ const uniqueContacts = [];
73
+ for (const contact of contacts) {
74
+ if (!contact.emailAddress) {
75
+ uniqueContacts.push(contact);
76
+ continue;
77
+ }
78
+ const normalizedEmail = normalizeGmailAddress(contact.emailAddress);
79
+ if (seenNormalizedEmails.has(normalizedEmail)) {
80
+ Logger.info('Duplicate dotted email gmail variation found -- skipping', { contact, normalizedEmail });
81
+ continue;
82
+ }
83
+ seenNormalizedEmails.add(normalizedEmail);
84
+ uniqueContacts.push({ ...contact, emailAddress: normalizedEmail });
85
+ }
86
+ Logger.info('Removed duplicate dotted email variations', {
87
+ originalCount: contacts.length,
88
+ uniqueCount: uniqueContacts.length,
89
+ removedCount: contacts.length - uniqueContacts.length,
90
+ });
91
+ return uniqueContacts;
92
+ }
93
+ catch (error) {
94
+ Logger.error('Failed to remove duplicate dotted email variations', { error });
95
+ return contacts;
96
+ }
97
+ };
98
+ //# 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.14",
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.35",
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",