sently 0.4.6 → 0.4.7

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 (75) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +94 -41
  3. package/dist/adapters/bun.js +2 -183
  4. package/dist/adapters/bun.js.map +2 -2
  5. package/dist/adapters/cf.js +2 -77
  6. package/dist/adapters/cf.js.map +2 -2
  7. package/dist/adapters/deno.js +2 -72
  8. package/dist/adapters/deno.js.map +2 -2
  9. package/dist/adapters/node.js +2 -180
  10. package/dist/adapters/node.js.map +2 -2
  11. package/dist/auth/oauth2.js +2 -13
  12. package/dist/auth/oauth2.js.map +1 -1
  13. package/dist/chunk-2kcwa9gt.js +4 -0
  14. package/dist/chunk-2kcwa9gt.js.map +11 -0
  15. package/dist/chunk-2t6hjer3.js +5 -0
  16. package/dist/chunk-2t6hjer3.js.map +10 -0
  17. package/dist/chunk-6yggz45h.js +5 -0
  18. package/dist/{chunk-794hc3m4.js.map → chunk-6yggz45h.js.map} +2 -2
  19. package/dist/chunk-dgkh77yp.js +4 -0
  20. package/dist/{chunk-ym3zzv8b.js.map → chunk-dgkh77yp.js.map} +2 -2
  21. package/dist/chunk-jfs80vhp.js +3 -0
  22. package/dist/{chunk-7fqv71z1.js.map → chunk-jfs80vhp.js.map} +2 -2
  23. package/dist/chunk-sqn04kae.js +4 -0
  24. package/dist/{chunk-v0bahtg2.js.map → chunk-sqn04kae.js.map} +1 -1
  25. package/dist/chunk-va2awz12.js +4 -0
  26. package/dist/{chunk-f4c9ttmr.js.map → chunk-va2awz12.js.map} +2 -2
  27. package/dist/chunk-wgtbr6ge.js +13 -0
  28. package/dist/{chunk-tymfm441.js.map → chunk-wgtbr6ge.js.map} +2 -2
  29. package/dist/core/smtp.js +2 -31
  30. package/dist/core/smtp.js.map +1 -1
  31. package/dist/core/types.d.ts +7 -0
  32. package/dist/detect.d.ts +2 -0
  33. package/dist/detect.js +2 -180
  34. package/dist/detect.js.map +4 -5
  35. package/dist/dkim.d.ts +21 -0
  36. package/dist/dkim.js +9 -0
  37. package/dist/dkim.js.map +10 -0
  38. package/dist/index.d.ts +74 -16
  39. package/dist/index.js +85 -14
  40. package/dist/mailer.d.ts +16 -0
  41. package/dist/mailer.js +3 -0
  42. package/dist/mailer.js.map +9 -0
  43. package/dist/plugins/template.js +2 -28
  44. package/dist/plugins/template.js.map +2 -2
  45. package/dist/pool/pool.js +2 -16
  46. package/dist/pool/pool.js.map +5 -3
  47. package/dist/transports/brevo.js +2 -115
  48. package/dist/transports/brevo.js.map +2 -2
  49. package/dist/transports/mailgun.js +2 -119
  50. package/dist/transports/mailgun.js.map +2 -2
  51. package/dist/transports/postmark.js +2 -113
  52. package/dist/transports/postmark.js.map +2 -2
  53. package/dist/transports/preview.js +2 -72
  54. package/dist/transports/preview.js.map +2 -2
  55. package/dist/transports/resend.js +2 -109
  56. package/dist/transports/resend.js.map +2 -2
  57. package/dist/transports/retry.js +2 -78
  58. package/dist/transports/retry.js.map +2 -2
  59. package/dist/transports/sendgrid.js +2 -132
  60. package/dist/transports/sendgrid.js.map +2 -2
  61. package/dist/transports/ses.js +5 -251
  62. package/dist/transports/ses.js.map +2 -2
  63. package/dist/transports/smtp.js +2 -26
  64. package/dist/transports/smtp.js.map +1 -1
  65. package/package.json +17 -6
  66. package/dist/chunk-794hc3m4.js +0 -105
  67. package/dist/chunk-7fqv71z1.js +0 -251
  68. package/dist/chunk-f4c9ttmr.js +0 -154
  69. package/dist/chunk-mp5c9bfd.js +0 -270
  70. package/dist/chunk-mp5c9bfd.js.map +0 -11
  71. package/dist/chunk-tymfm441.js +0 -405
  72. package/dist/chunk-v0bahtg2.js +0 -6
  73. package/dist/chunk-x3szga4k.js +0 -367
  74. package/dist/chunk-x3szga4k.js.map +0 -11
  75. package/dist/chunk-ym3zzv8b.js +0 -74
@@ -1,405 +0,0 @@
1
- import {
2
- decodeBase64,
3
- encodeBase64,
4
- encodeUtf8
5
- } from "./chunk-794hc3m4.js";
6
-
7
- // src/core/cram-md5.ts
8
- var BLOCK_SIZE = 64;
9
- function u32(x) {
10
- return x >>> 0;
11
- }
12
- function md5(data) {
13
- const padded = padMessage(data);
14
- let a0 = 1732584193;
15
- let b0 = 4023233417;
16
- let c0 = 2562383102;
17
- let d0 = 271733878;
18
- for (let i = 0;i < padded.length; i += 64) {
19
- const block = padded.subarray(i, i + 64);
20
- const m = new Uint32Array(16);
21
- for (let j = 0;j < 16; j++) {
22
- const o = j * 4;
23
- m[j] = u32((block[o] ?? 0) | (block[o + 1] ?? 0) << 8 | (block[o + 2] ?? 0) << 16 | (block[o + 3] ?? 0) << 24);
24
- }
25
- let a = a0;
26
- let b = b0;
27
- let c = c0;
28
- let d = d0;
29
- for (let k = 0;k < 64; k++) {
30
- let f;
31
- let g;
32
- if (k < 16) {
33
- f = u32(b & c | ~b & d);
34
- g = k;
35
- } else if (k < 32) {
36
- f = u32(b & d | c & ~d);
37
- g = u32((5 * k + 1) % 16);
38
- } else if (k < 48) {
39
- f = u32(b ^ c ^ d);
40
- g = u32((3 * k + 5) % 16);
41
- } else {
42
- f = u32(c ^ (b | ~d));
43
- g = u32(7 * k % 16);
44
- }
45
- const temp = d;
46
- d = c;
47
- c = b;
48
- b = u32(b + leftRotate(u32(a + f + u32((K[k] ?? 0) + (m[g] ?? 0))), S[k] ?? 0));
49
- a = temp;
50
- }
51
- a0 = u32(a0 + a);
52
- b0 = u32(b0 + b);
53
- c0 = u32(c0 + c);
54
- d0 = u32(d0 + d);
55
- }
56
- const out = new Uint8Array(16);
57
- const view = new DataView(out.buffer);
58
- view.setUint32(0, a0, true);
59
- view.setUint32(4, b0, true);
60
- view.setUint32(8, c0, true);
61
- view.setUint32(12, d0, true);
62
- return out;
63
- }
64
- var S = [
65
- 7,
66
- 12,
67
- 17,
68
- 22,
69
- 7,
70
- 12,
71
- 17,
72
- 22,
73
- 7,
74
- 12,
75
- 17,
76
- 22,
77
- 7,
78
- 12,
79
- 17,
80
- 22,
81
- 5,
82
- 9,
83
- 14,
84
- 20,
85
- 5,
86
- 9,
87
- 14,
88
- 20,
89
- 5,
90
- 9,
91
- 14,
92
- 20,
93
- 5,
94
- 9,
95
- 14,
96
- 20,
97
- 4,
98
- 11,
99
- 16,
100
- 23,
101
- 4,
102
- 11,
103
- 16,
104
- 23,
105
- 4,
106
- 11,
107
- 16,
108
- 23,
109
- 4,
110
- 11,
111
- 16,
112
- 23,
113
- 6,
114
- 10,
115
- 15,
116
- 21,
117
- 6,
118
- 10,
119
- 15,
120
- 21,
121
- 6,
122
- 10,
123
- 15,
124
- 21,
125
- 6,
126
- 10,
127
- 15,
128
- 21
129
- ];
130
- var K = new Uint32Array([
131
- 3614090360,
132
- 3905402710,
133
- 606105819,
134
- 3250441966,
135
- 4118548399,
136
- 1200080426,
137
- 2821735955,
138
- 4249261313,
139
- 1770035416,
140
- 2336552879,
141
- 4294925233,
142
- 2304563134,
143
- 1804603682,
144
- 4254626195,
145
- 2792965006,
146
- 1236535329,
147
- 4129170786,
148
- 3225465664,
149
- 643717713,
150
- 3921069994,
151
- 3593408605,
152
- 38016083,
153
- 3634488961,
154
- 3889429448,
155
- 568446438,
156
- 3275163606,
157
- 4107603335,
158
- 1163531501,
159
- 2850285829,
160
- 4243563512,
161
- 1735328473,
162
- 2368359562,
163
- 4294588738,
164
- 2272392833,
165
- 1839030562,
166
- 4259657740,
167
- 2763975236,
168
- 1272893353,
169
- 4139469664,
170
- 3200236656,
171
- 681279174,
172
- 3936430074,
173
- 3572445317,
174
- 76029189,
175
- 3654602809,
176
- 3873151461,
177
- 530742520,
178
- 3299628645,
179
- 4096336452,
180
- 1126891415,
181
- 2878612391,
182
- 4237533241,
183
- 1700485571,
184
- 2399980690,
185
- 4293915773,
186
- 2240044497,
187
- 1873313359,
188
- 4264355552,
189
- 2734768916,
190
- 1309151649,
191
- 4149444226,
192
- 3174756917,
193
- 718787259,
194
- 3951481745
195
- ]);
196
- function leftRotate(value, shift) {
197
- return u32(value << shift | value >>> 32 - shift);
198
- }
199
- function padMessage(data) {
200
- const bitLen = data.length * 8;
201
- const padLen = (56 - (data.length + 1) % 64 + 64) % 64;
202
- const totalLen = data.length + 1 + padLen + 8;
203
- const padded = new Uint8Array(totalLen);
204
- padded.set(data);
205
- padded[data.length] = 128;
206
- const view = new DataView(padded.buffer);
207
- view.setUint32(totalLen - 8, bitLen >>> 0, true);
208
- view.setUint32(totalLen - 4, Math.floor(bitLen / 4294967296), true);
209
- return padded;
210
- }
211
- function hmacMD5(key, data) {
212
- let k = key;
213
- if (k.length > BLOCK_SIZE) {
214
- k = md5(k);
215
- }
216
- const paddedKey = new Uint8Array(BLOCK_SIZE);
217
- paddedKey.set(k);
218
- const ipad = new Uint8Array(BLOCK_SIZE);
219
- const opad = new Uint8Array(BLOCK_SIZE);
220
- for (let i = 0;i < BLOCK_SIZE; i++) {
221
- ipad[i] = (paddedKey[i] ?? 0) ^ 54;
222
- opad[i] = (paddedKey[i] ?? 0) ^ 92;
223
- }
224
- const inner = new Uint8Array(ipad.length + data.length);
225
- inner.set(ipad);
226
- inner.set(data, ipad.length);
227
- const innerHash = md5(inner);
228
- const outer = new Uint8Array(opad.length + innerHash.length);
229
- outer.set(opad);
230
- outer.set(innerHash, opad.length);
231
- return md5(outer);
232
- }
233
- function bytesToHex(bytes) {
234
- return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
235
- }
236
- async function computeCRAMMD5(challenge, user, pass) {
237
- const challengeBytes = decodeBase64(challenge.trim());
238
- const passBytes = encodeUtf8(pass);
239
- const digest = hmacMD5(passBytes, challengeBytes);
240
- const hex = bytesToHex(digest);
241
- return encodeBase64(`${user} ${hex}`).replace(/\r\n/g, "");
242
- }
243
-
244
- // src/core/smtp.ts
245
- class SMTPError extends Error {
246
- code;
247
- command;
248
- response;
249
- constructor(message, code, command, response) {
250
- super(message);
251
- this.code = code;
252
- this.command = command;
253
- this.response = response;
254
- this.name = "SMTPError";
255
- }
256
- }
257
- function encodeCommand(cmd) {
258
- let line;
259
- switch (cmd.type) {
260
- case "EHLO": {
261
- const safeDomain = cmd.domain.replace(/[\r\n]/g, "");
262
- line = `EHLO ${safeDomain}`;
263
- break;
264
- }
265
- case "STARTTLS":
266
- line = "STARTTLS";
267
- break;
268
- case "AUTH_LOGIN":
269
- line = "AUTH LOGIN";
270
- break;
271
- case "AUTH_PLAIN":
272
- line = `AUTH PLAIN ${encodeBase64(`\x00${cmd.user}\x00${cmd.pass}`).replace(/\r\n/g, "")}`;
273
- break;
274
- case "AUTH_CRAM_MD5_INIT":
275
- line = "AUTH CRAM-MD5";
276
- break;
277
- case "AUTH_CRAM_MD5_RESPONSE":
278
- return encodeUtf8(`${cmd.response}\r
279
- `);
280
- case "AUTH_XOAUTH2":
281
- line = `AUTH XOAUTH2 ${cmd.xoauth2String}`;
282
- break;
283
- case "MAIL_FROM":
284
- if (/[\r\n]/.test(cmd.address)) {
285
- throw new SMTPError(`Invalid address: contains CRLF`, 0, "MAIL FROM", cmd.address);
286
- }
287
- line = `MAIL FROM:<${cmd.address}>`;
288
- break;
289
- case "RCPT_TO":
290
- if (/[\r\n]/.test(cmd.address)) {
291
- throw new SMTPError(`Invalid address: contains CRLF`, 0, "RCPT TO", cmd.address);
292
- }
293
- line = `RCPT TO:<${cmd.address}>`;
294
- break;
295
- case "DATA":
296
- line = "DATA";
297
- break;
298
- case "DATA_BODY":
299
- return encodeUtf8(applyDotStuffing(cmd.content));
300
- case "QUIT":
301
- line = "QUIT";
302
- break;
303
- case "RSET":
304
- line = "RSET";
305
- break;
306
- case "NOOP":
307
- line = "NOOP";
308
- break;
309
- }
310
- return encodeUtf8(`${line}\r
311
- `);
312
- }
313
- function parseResponse(data) {
314
- const text = new TextDecoder().decode(data).trim();
315
- const lines = text.split(/\r?\n/);
316
- const lastLine = lines[lines.length - 1] ?? "";
317
- const match = lastLine.match(/^(\d{3})([\s-])(.*)$/);
318
- if (!match) {
319
- throw new SMTPError("Invalid SMTP response", 0, "PARSE", text);
320
- }
321
- const code = Number.parseInt(match[1] ?? "0", 10);
322
- const message = lines.map((l) => l.replace(/^\d{3}[\s-]/, "")).join(" ");
323
- return {
324
- code,
325
- message,
326
- isSuccess: code >= 200 && code < 300,
327
- isReady: code >= 300 && code < 400,
328
- isError: code >= 400
329
- };
330
- }
331
- function accumulateResponse(chunks) {
332
- if (chunks.length === 0) {
333
- return null;
334
- }
335
- const total = chunks.reduce((sum, c) => sum + c.length, 0);
336
- const combined = new Uint8Array(total);
337
- let offset = 0;
338
- for (const chunk of chunks) {
339
- combined.set(chunk, offset);
340
- offset += chunk.length;
341
- }
342
- const text = new TextDecoder().decode(combined);
343
- const lines = text.split(/\r?\n/).filter((l) => l.length > 0);
344
- if (lines.length === 0) {
345
- return null;
346
- }
347
- const lastLine = lines[lines.length - 1] ?? "";
348
- if (/^\d{3} /.test(lastLine)) {
349
- return combined;
350
- }
351
- return null;
352
- }
353
- function selectAuthMethod(capabilities) {
354
- const upper = capabilities.map((c) => c.toUpperCase());
355
- if (upper.some((c) => c.includes("AUTH") && c.includes("XOAUTH2"))) {
356
- return "OAUTH2";
357
- }
358
- if (upper.some((c) => c.includes("AUTH") && c.includes("CRAM-MD5"))) {
359
- return "CRAM-MD5";
360
- }
361
- if (upper.some((c) => c.includes("AUTH") && c.includes("LOGIN"))) {
362
- return "LOGIN";
363
- }
364
- if (upper.some((c) => c.includes("AUTH") && c.includes("PLAIN"))) {
365
- return "PLAIN";
366
- }
367
- throw new SMTPError("No supported AUTH method", 0, "EHLO", capabilities.join(" "));
368
- }
369
- function parseEHLO(response) {
370
- return response.message.split(/\s+/).flatMap((part) => part.split(/\r?\n/)).filter(Boolean);
371
- }
372
- function assertResponse(response, expectedCodes, command) {
373
- if (!expectedCodes.includes(response.code)) {
374
- throw new SMTPError(`Unexpected SMTP response for ${command}`, response.code, command, response.message);
375
- }
376
- }
377
- function applyDotStuffing(content) {
378
- const text = new TextDecoder().decode(content);
379
- const lines = text.split(/\r?\n/);
380
- const stuffed = lines.map((line) => line.startsWith(".") ? `.${line}` : line);
381
- return `${stuffed.join(`\r
382
- `)}\r
383
- .\r
384
- `;
385
- }
386
- function encodeAuthLoginPass(pass) {
387
- return encodeUtf8(`${encodeBase64(pass).replace(/\r\n/g, "")}\r
388
- `);
389
- }
390
- function encodeAuthLoginUser(user) {
391
- return encodeUtf8(`${encodeBase64(user).replace(/\r\n/g, "")}\r
392
- `);
393
- }
394
- function encodeAuthCramResponse(response) {
395
- return encodeUtf8(`${response}\r
396
- `);
397
- }
398
- function encodeLine(line) {
399
- return encodeUtf8(`${line}\r
400
- `);
401
- }
402
-
403
- export { computeCRAMMD5, SMTPError, encodeCommand, parseResponse, accumulateResponse, selectAuthMethod, parseEHLO, assertResponse, encodeAuthLoginPass, encodeAuthLoginUser, encodeAuthCramResponse, encodeLine };
404
-
405
- //# debugId=5BEE29900FA6AC3664756E2164756E21
@@ -1,6 +0,0 @@
1
- import { createRequire } from "node:module";
2
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
-
4
- export { __require };
5
-
6
- //# debugId=5F0D92CF7AD4DB9164756E2164756E21