@betterinternship/core 2.18.0 → 2.20.0
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/lib/email/email.js +135 -134
- package/dist/lib/email/email.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
package/dist/lib/email/email.js
CHANGED
|
@@ -1,135 +1,136 @@
|
|
|
1
|
-
import { SendEmailCommand, SESClient, } from '@aws-sdk/client-ses';
|
|
2
|
-
import { randomUUID } from 'crypto';
|
|
3
|
-
import { ENV } from '../env.js';
|
|
4
|
-
let _sesClient = null;
|
|
5
|
-
const getSesClient = () => {
|
|
6
|
-
if (!_sesClient) {
|
|
7
|
-
if (!ENV.AWS_ACCESS_KEY_ID || !ENV.AWS_SECRET_ACCESS_KEY || !ENV.AWS_REGION)
|
|
8
|
-
console.error('[ERROR:ENV]: Missing Amazon setup.');
|
|
9
|
-
_sesClient = new SESClient({ region: ENV.AWS_REGION, maxAttempts: 1 });
|
|
10
|
-
}
|
|
11
|
-
return _sesClient;
|
|
12
|
-
};
|
|
13
|
-
const RETRY_BASE_DELAY_MS = 500;
|
|
14
|
-
const RETRY_DELAY_FACTOR = 3;
|
|
15
|
-
const getMaxAttempts = () => {
|
|
16
|
-
const parsed = parseInt(ENV.EMAIL_SEND_MAX_ATTEMPTS ?? '', 10);
|
|
17
|
-
return Number.isFinite(parsed) && parsed >= 1 ? parsed : 3;
|
|
18
|
-
};
|
|
19
|
-
const getRetryDelayMs = (attempt) => {
|
|
20
|
-
const base = RETRY_BASE_DELAY_MS * RETRY_DELAY_FACTOR ** (attempt - 1);
|
|
21
|
-
const jitter = base * 0.25 * (Math.random() * 2 - 1);
|
|
22
|
-
return Math.round(base + jitter);
|
|
23
|
-
};
|
|
24
|
-
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
25
|
-
const isRetryableSendError = (error) => {
|
|
26
|
-
const err = error;
|
|
27
|
-
if (err.name === 'ThrottlingException')
|
|
28
|
-
return true;
|
|
29
|
-
if (err.name === 'TooManyRequestsException')
|
|
30
|
-
return true;
|
|
31
|
-
const status = err.$metadata?.httpStatusCode;
|
|
32
|
-
if (status === undefined)
|
|
33
|
-
return true;
|
|
34
|
-
return status === 429 || status >= 500;
|
|
35
|
-
};
|
|
36
|
-
const describeError = (error) => {
|
|
37
|
-
const err = error;
|
|
38
|
-
return `${err.name ?? 'Error'}: ${err.message ?? String(error)}`;
|
|
39
|
-
};
|
|
40
|
-
const recordSendFailure = async (failure) => {
|
|
41
|
-
if (!ENV.
|
|
42
|
-
console.warn('[EMAIL]
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
try {
|
|
46
|
-
const {
|
|
47
|
-
await
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
const
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
};
|
|
1
|
+
import { SendEmailCommand, SESClient, } from '@aws-sdk/client-ses';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { ENV } from '../env.js';
|
|
4
|
+
let _sesClient = null;
|
|
5
|
+
const getSesClient = () => {
|
|
6
|
+
if (!_sesClient) {
|
|
7
|
+
if (!ENV.AWS_ACCESS_KEY_ID || !ENV.AWS_SECRET_ACCESS_KEY || !ENV.AWS_REGION)
|
|
8
|
+
console.error('[ERROR:ENV]: Missing Amazon setup.');
|
|
9
|
+
_sesClient = new SESClient({ region: ENV.AWS_REGION, maxAttempts: 1 });
|
|
10
|
+
}
|
|
11
|
+
return _sesClient;
|
|
12
|
+
};
|
|
13
|
+
const RETRY_BASE_DELAY_MS = 500;
|
|
14
|
+
const RETRY_DELAY_FACTOR = 3;
|
|
15
|
+
const getMaxAttempts = () => {
|
|
16
|
+
const parsed = parseInt(ENV.EMAIL_SEND_MAX_ATTEMPTS ?? '', 10);
|
|
17
|
+
return Number.isFinite(parsed) && parsed >= 1 ? parsed : 3;
|
|
18
|
+
};
|
|
19
|
+
const getRetryDelayMs = (attempt) => {
|
|
20
|
+
const base = RETRY_BASE_DELAY_MS * RETRY_DELAY_FACTOR ** (attempt - 1);
|
|
21
|
+
const jitter = base * 0.25 * (Math.random() * 2 - 1);
|
|
22
|
+
return Math.round(base + jitter);
|
|
23
|
+
};
|
|
24
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
25
|
+
const isRetryableSendError = (error) => {
|
|
26
|
+
const err = error;
|
|
27
|
+
if (err.name === 'ThrottlingException')
|
|
28
|
+
return true;
|
|
29
|
+
if (err.name === 'TooManyRequestsException')
|
|
30
|
+
return true;
|
|
31
|
+
const status = err.$metadata?.httpStatusCode;
|
|
32
|
+
if (status === undefined)
|
|
33
|
+
return true;
|
|
34
|
+
return status === 429 || status >= 500;
|
|
35
|
+
};
|
|
36
|
+
const describeError = (error) => {
|
|
37
|
+
const err = error;
|
|
38
|
+
return `${err.name ?? 'Error'}: ${err.message ?? String(error)}`;
|
|
39
|
+
};
|
|
40
|
+
const recordSendFailure = async (failure) => {
|
|
41
|
+
if (!ENV.DATABASE_URL) {
|
|
42
|
+
console.warn('[EMAIL] DATABASE_URL not set; send failure not recorded.');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const { internalDb } = await import('@betterinternship/schema');
|
|
47
|
+
await internalDb
|
|
48
|
+
.insertInto('internal.email_delivery_events')
|
|
49
|
+
.values({
|
|
50
|
+
event_type: 'send_failure',
|
|
51
|
+
recipient_email: failure.recipient,
|
|
52
|
+
feedback_id: randomUUID(),
|
|
53
|
+
attempts: failure.attempts,
|
|
54
|
+
error_message: describeError(failure.error),
|
|
55
|
+
})
|
|
56
|
+
.execute();
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error('[ERROR:EMAIL] Could not record send failure.', error);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const normalizeRecipients = (value) => {
|
|
63
|
+
if (!value)
|
|
64
|
+
return [];
|
|
65
|
+
const list = Array.isArray(value) ? value : [value];
|
|
66
|
+
return [
|
|
67
|
+
...new Set(list.map((recipient) => recipient.trim()).filter(Boolean)),
|
|
68
|
+
];
|
|
69
|
+
};
|
|
70
|
+
const toSesTags = (tags) => Object.entries(tags).map(([name, value]) => ({
|
|
71
|
+
Name: name,
|
|
72
|
+
Value: value.trim().slice(0, 256).replaceAll(' ', ''),
|
|
73
|
+
}));
|
|
74
|
+
const sendWithRetries = async (params, logRecipients) => {
|
|
75
|
+
const maxAttempts = getMaxAttempts();
|
|
76
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
77
|
+
try {
|
|
78
|
+
const command = new SendEmailCommand(params);
|
|
79
|
+
const result = await getSesClient().send(command);
|
|
80
|
+
console.warn('[AWSSES] Email sent to ' + logRecipients.join(', '));
|
|
81
|
+
return {
|
|
82
|
+
messageId: result.MessageId,
|
|
83
|
+
response: 'Successfully sent via Amazon SES.',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (isRetryableSendError(error) && attempt < maxAttempts) {
|
|
88
|
+
const delay = getRetryDelayMs(attempt);
|
|
89
|
+
console.error(`[ERROR:AWSSES] Send failed (attempt ${attempt}/${maxAttempts}), retrying in ${delay}ms: ${describeError(error)}`);
|
|
90
|
+
await sleep(delay);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
console.error(`[ERROR:AWSSES] Send failed permanently after ${attempt} attempt(s) to ${logRecipients.join(', ')}: ${describeError(error)}`);
|
|
94
|
+
await recordSendFailure({
|
|
95
|
+
recipient: logRecipients[0],
|
|
96
|
+
attempts: attempt,
|
|
97
|
+
error,
|
|
98
|
+
});
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
};
|
|
104
|
+
export const sendMultiEmail = async ({ sender, subject, to, cc, bcc, content, alias = 'hello', configurationSetName, tags, }) => {
|
|
105
|
+
const toRecipients = normalizeRecipients(to);
|
|
106
|
+
if (!toRecipients.length)
|
|
107
|
+
throw Error('[ERROR:EMAIL] No recipients provided for email.');
|
|
108
|
+
const ccRecipients = normalizeRecipients(cc);
|
|
109
|
+
const bccRecipients = normalizeRecipients(bcc);
|
|
110
|
+
const logRecipients = [...toRecipients, ...ccRecipients, ...bccRecipients];
|
|
111
|
+
const params = {
|
|
112
|
+
Destination: {
|
|
113
|
+
ToAddresses: toRecipients,
|
|
114
|
+
CcAddresses: ccRecipients.length ? ccRecipients : undefined,
|
|
115
|
+
BccAddresses: bccRecipients.length ? bccRecipients : undefined,
|
|
116
|
+
},
|
|
117
|
+
Message: {
|
|
118
|
+
Subject: { Data: subject },
|
|
119
|
+
Body: {
|
|
120
|
+
Html: { Data: content },
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
Source: `"${sender ?? 'BetterInternship'}" <${alias}@betterinternship.com>`,
|
|
124
|
+
ConfigurationSetName: configurationSetName,
|
|
125
|
+
Tags: tags ? toSesTags(tags) : undefined,
|
|
126
|
+
};
|
|
127
|
+
return await sendWithRetries(params, logRecipients);
|
|
128
|
+
};
|
|
129
|
+
export const sendSingleEmail = async (params) => {
|
|
130
|
+
if (!normalizeRecipients(params.recipient).length) {
|
|
131
|
+
console.error('[ERROR:EMAIL] No recipient provided for email.');
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
return await sendMultiEmail({ ...params, to: params.recipient });
|
|
135
|
+
};
|
|
135
136
|
//# sourceMappingURL=email.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../lib/email/email.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,gBAAgB,EAEhB,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAmChC,IAAI,UAAU,GAAqB,IAAI,CAAC;AACxC,MAAM,YAAY,GAAG,GAAc,EAAE;IACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,GAAG,CAAC,UAAU;YACzE,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACtD,UAAU,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AAGF,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,EAAE;IAC1C,MAAM,IAAI,GAAG,mBAAmB,GAAG,kBAAkB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAMhF,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAE,EAAE;IAC9C,MAAM,GAAG,GAAG,KAGX,CAAC;IACF,IAAI,GAAG,CAAC,IAAI,KAAK,qBAAqB;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC;IAE7C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAc,EAAE,EAAE;IACvC,MAAM,GAAG,GAAG,KAA4C,CAAC;IACzD,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACnE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../lib/email/email.ts"],"names":[],"mappings":"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"}
|