sently 0.4.5 → 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 (97) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +94 -41
  3. package/dist/adapters/bun.d.ts +7 -0
  4. package/dist/adapters/bun.js +2 -183
  5. package/dist/adapters/bun.js.map +3 -3
  6. package/dist/adapters/cf.d.ts +6 -0
  7. package/dist/adapters/cf.js +2 -77
  8. package/dist/adapters/cf.js.map +3 -3
  9. package/dist/adapters/deno.d.ts +4 -0
  10. package/dist/adapters/deno.js +2 -72
  11. package/dist/adapters/deno.js.map +3 -3
  12. package/dist/adapters/node.d.ts +7 -0
  13. package/dist/adapters/node.js +2 -180
  14. package/dist/adapters/node.js.map +3 -3
  15. package/dist/auth/oauth2.d.ts +4 -0
  16. package/dist/auth/oauth2.js +2 -13
  17. package/dist/auth/oauth2.js.map +1 -1
  18. package/dist/chunk-2kcwa9gt.js +4 -0
  19. package/dist/chunk-2kcwa9gt.js.map +11 -0
  20. package/dist/chunk-2t6hjer3.js +5 -0
  21. package/dist/chunk-2t6hjer3.js.map +10 -0
  22. package/dist/chunk-6yggz45h.js +5 -0
  23. package/dist/{chunk-794hc3m4.js.map → chunk-6yggz45h.js.map} +2 -2
  24. package/dist/chunk-dgkh77yp.js +4 -0
  25. package/dist/chunk-dgkh77yp.js.map +10 -0
  26. package/dist/chunk-jfs80vhp.js +3 -0
  27. package/dist/chunk-jfs80vhp.js.map +10 -0
  28. package/dist/chunk-sqn04kae.js +4 -0
  29. package/dist/{chunk-v0bahtg2.js.map → chunk-sqn04kae.js.map} +1 -1
  30. package/dist/chunk-va2awz12.js +4 -0
  31. package/dist/{chunk-f4c9ttmr.js.map → chunk-va2awz12.js.map} +2 -2
  32. package/dist/chunk-wgtbr6ge.js +13 -0
  33. package/dist/chunk-wgtbr6ge.js.map +11 -0
  34. package/dist/core/mime.d.ts +4 -0
  35. package/dist/core/sigv4.d.ts +10 -0
  36. package/dist/core/smtp.d.ts +5 -0
  37. package/dist/core/smtp.js +2 -31
  38. package/dist/core/smtp.js.map +1 -1
  39. package/dist/core/types.d.ts +7 -0
  40. package/dist/detect.d.ts +2 -0
  41. package/dist/detect.js +2 -180
  42. package/dist/detect.js.map +4 -5
  43. package/dist/dkim.d.ts +21 -0
  44. package/dist/dkim.js +9 -0
  45. package/dist/dkim.js.map +10 -0
  46. package/dist/index.d.ts +74 -16
  47. package/dist/index.js +85 -14
  48. package/dist/mailer.d.ts +16 -0
  49. package/dist/mailer.js +3 -0
  50. package/dist/mailer.js.map +9 -0
  51. package/dist/plugins/template.js +2 -28
  52. package/dist/plugins/template.js.map +2 -2
  53. package/dist/pool/connection.d.ts +4 -0
  54. package/dist/pool/pool.d.ts +20 -0
  55. package/dist/pool/pool.js +2 -16
  56. package/dist/pool/pool.js.map +5 -3
  57. package/dist/transports/brevo.d.ts +1 -0
  58. package/dist/transports/brevo.js +2 -115
  59. package/dist/transports/brevo.js.map +3 -3
  60. package/dist/transports/mailgun.d.ts +3 -0
  61. package/dist/transports/mailgun.js +2 -119
  62. package/dist/transports/mailgun.js.map +3 -3
  63. package/dist/transports/postmark.d.ts +1 -0
  64. package/dist/transports/postmark.js +2 -113
  65. package/dist/transports/postmark.js.map +3 -3
  66. package/dist/transports/preview.d.ts +3 -0
  67. package/dist/transports/preview.js +2 -72
  68. package/dist/transports/preview.js.map +3 -3
  69. package/dist/transports/resend.d.ts +2 -0
  70. package/dist/transports/resend.js +2 -109
  71. package/dist/transports/resend.js.map +3 -3
  72. package/dist/transports/retry.d.ts +12 -1
  73. package/dist/transports/retry.js +2 -78
  74. package/dist/transports/retry.js.map +3 -3
  75. package/dist/transports/sendgrid.d.ts +1 -0
  76. package/dist/transports/sendgrid.js +2 -132
  77. package/dist/transports/sendgrid.js.map +3 -3
  78. package/dist/transports/ses.d.ts +5 -0
  79. package/dist/transports/ses.js +5 -251
  80. package/dist/transports/ses.js.map +4 -4
  81. package/dist/transports/smtp.d.ts +3 -0
  82. package/dist/transports/smtp.js +2 -26
  83. package/dist/transports/smtp.js.map +1 -1
  84. package/package.json +17 -6
  85. package/dist/chunk-794hc3m4.js +0 -105
  86. package/dist/chunk-7fqv71z1.js +0 -251
  87. package/dist/chunk-7fqv71z1.js.map +0 -10
  88. package/dist/chunk-f4c9ttmr.js +0 -154
  89. package/dist/chunk-mp5c9bfd.js +0 -270
  90. package/dist/chunk-mp5c9bfd.js.map +0 -11
  91. package/dist/chunk-tymfm441.js +0 -405
  92. package/dist/chunk-tymfm441.js.map +0 -11
  93. package/dist/chunk-v0bahtg2.js +0 -6
  94. package/dist/chunk-x3szga4k.js +0 -367
  95. package/dist/chunk-x3szga4k.js.map +0 -11
  96. package/dist/chunk-ym3zzv8b.js +0 -74
  97. package/dist/chunk-ym3zzv8b.js.map +0 -10
@@ -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,11 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/core/cram-md5.ts", "../src/core/smtp.ts"],
4
- "sourcesContent": [
5
- "/**\n * @module\n * Pure-JS HMAC-MD5 implementation for SMTP CRAM-MD5 authentication.\n * Web Crypto does not support MD5, so this is implemented in pure TypeScript\n * with no external dependencies.\n *\n * @example\n * ```ts\n * import { computeCRAMMD5 } from \"sently/core/cram-md5\";\n * const response = await computeCRAMMD5(\"<challenge>\", \"user\", \"pass\");\n * ```\n */\nimport { decodeBase64, encodeBase64, encodeUtf8 } from \"./base64.js\";\n\n/** MD5 block size in bytes (HMAC block size per RFC 2104). */\nconst BLOCK_SIZE = 64;\n\n/** Coerce to unsigned 32-bit integer. */\nfunction u32(x: number): number {\n return x >>> 0;\n}\n\n/**\n * Compute an MD5 hash of the given data (RFC 1321).\n */\nexport function md5(data: Uint8Array): Uint8Array {\n const padded = padMessage(data);\n\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n for (let i = 0; i < padded.length; i += 64) {\n const block = padded.subarray(i, i + 64);\n const m = new Uint32Array(16);\n for (let j = 0; j < 16; j++) {\n const o = j * 4;\n m[j] = u32(\n (block[o] ?? 0) |\n ((block[o + 1] ?? 0) << 8) |\n ((block[o + 2] ?? 0) << 16) |\n ((block[o + 3] ?? 0) << 24),\n );\n }\n\n let a = a0;\n let b = b0;\n let c = c0;\n let d = d0;\n\n for (let k = 0; k < 64; k++) {\n let f: number;\n let g: number;\n if (k < 16) {\n f = u32((b & c) | (~b & d));\n g = k;\n } else if (k < 32) {\n f = u32((b & d) | (c & ~d));\n g = u32((5 * k + 1) % 16);\n } else if (k < 48) {\n f = u32(b ^ c ^ d);\n g = u32((3 * k + 5) % 16);\n } else {\n f = u32(c ^ (b | ~d));\n g = u32((7 * k) % 16);\n }\n\n const temp = d;\n d = c;\n c = b;\n b = u32(b + leftRotate(u32(a + f + u32((K[k] ?? 0) + (m[g] ?? 0))), S[k] ?? 0));\n a = temp;\n }\n\n a0 = u32(a0 + a);\n b0 = u32(b0 + b);\n c0 = u32(c0 + c);\n d0 = u32(d0 + d);\n }\n\n const out = new Uint8Array(16);\n const view = new DataView(out.buffer);\n view.setUint32(0, a0, true);\n view.setUint32(4, b0, true);\n view.setUint32(8, c0, true);\n view.setUint32(12, d0, true);\n return out;\n}\n\nconst S = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14,\n 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6,\n 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n];\n\nconst K = new Uint32Array([\n 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\n 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\n 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\n 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\n 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\n 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\n 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\n 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,\n]);\n\nfunction leftRotate(value: number, shift: number): number {\n return u32((value << shift) | (value >>> (32 - shift)));\n}\n\nfunction padMessage(data: Uint8Array): Uint8Array {\n const bitLen = data.length * 8;\n const padLen = (56 - ((data.length + 1) % 64) + 64) % 64;\n const totalLen = data.length + 1 + padLen + 8;\n const padded = new Uint8Array(totalLen);\n padded.set(data);\n padded[data.length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(totalLen - 8, bitLen >>> 0, true);\n view.setUint32(totalLen - 4, Math.floor(bitLen / 0x100000000), true);\n return padded;\n}\n\n/**\n * Compute HMAC-MD5(key, data) per RFC 2104.\n */\nexport function hmacMD5(key: Uint8Array, data: Uint8Array): Uint8Array {\n let k = key;\n if (k.length > BLOCK_SIZE) {\n k = md5(k);\n }\n const paddedKey = new Uint8Array(BLOCK_SIZE);\n paddedKey.set(k);\n\n const ipad = new Uint8Array(BLOCK_SIZE);\n const opad = new Uint8Array(BLOCK_SIZE);\n for (let i = 0; i < BLOCK_SIZE; i++) {\n ipad[i] = (paddedKey[i] ?? 0) ^ 0x36;\n opad[i] = (paddedKey[i] ?? 0) ^ 0x5c;\n }\n\n const inner = new Uint8Array(ipad.length + data.length);\n inner.set(ipad);\n inner.set(data, ipad.length);\n const innerHash = md5(inner);\n\n const outer = new Uint8Array(opad.length + innerHash.length);\n outer.set(opad);\n outer.set(innerHash, opad.length);\n return md5(outer);\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Compute the CRAM-MD5 response string for SMTP authentication.\n *\n * @param challenge - base64-encoded challenge from server\n * @param user - SMTP username\n * @param pass - SMTP password\n * @returns base64-encoded CRAM-MD5 response\n */\nexport async function computeCRAMMD5(\n challenge: string,\n user: string,\n pass: string,\n): Promise<string> {\n const challengeBytes = decodeBase64(challenge.trim());\n const passBytes = encodeUtf8(pass);\n const digest = hmacMD5(passBytes, challengeBytes);\n const hex = bytesToHex(digest);\n return encodeBase64(`${user} ${hex}`).replace(/\\r\\n/g, \"\");\n}\n",
6
- "// src/core/smtp.ts\nimport { encodeBase64, encodeUtf8 } from \"./base64.js\";\n\nexport { computeCRAMMD5 } from \"./cram-md5.js\";\n\n/** SMTP command to send to the server. */\nexport type SMTPCommand =\n | { type: \"EHLO\"; domain: string }\n | { type: \"STARTTLS\" }\n | { type: \"AUTH_LOGIN\"; user: string; pass: string }\n | { type: \"AUTH_PLAIN\"; user: string; pass: string }\n | { type: \"AUTH_CRAM_MD5_INIT\" }\n | { type: \"AUTH_CRAM_MD5_RESPONSE\"; response: string }\n | { type: \"AUTH_XOAUTH2\"; xoauth2String: string }\n | { type: \"MAIL_FROM\"; address: string }\n | { type: \"RCPT_TO\"; address: string }\n | { type: \"DATA\" }\n | { type: \"DATA_BODY\"; content: Uint8Array }\n | { type: \"QUIT\" }\n | { type: \"RSET\" }\n | { type: \"NOOP\" };\n\n/** Parsed SMTP server response. */\nexport interface SMTPResponse {\n code: number;\n message: string;\n isSuccess: boolean;\n isReady: boolean;\n isError: boolean;\n}\n\n/** SMTP protocol error with server response details. */\nexport class SMTPError extends Error {\n /** Creates an SMTP protocol error. */\n constructor(\n message: string,\n public readonly code: number,\n public readonly command: string,\n public readonly response: string,\n ) {\n super(message);\n this.name = \"SMTPError\";\n }\n}\n\n/**\n * Encode an SMTPCommand into a Uint8Array for sending over the socket.\n */\nexport function encodeCommand(cmd: SMTPCommand): Uint8Array {\n let line: string;\n\n switch (cmd.type) {\n case \"EHLO\": {\n const safeDomain = cmd.domain.replace(/[\\r\\n]/g, \"\");\n line = `EHLO ${safeDomain}`;\n break;\n }\n case \"STARTTLS\":\n line = \"STARTTLS\";\n break;\n case \"AUTH_LOGIN\":\n line = \"AUTH LOGIN\";\n break;\n case \"AUTH_PLAIN\":\n line = `AUTH PLAIN ${encodeBase64(`\\0${cmd.user}\\0${cmd.pass}`).replace(/\\r\\n/g, \"\")}`;\n break;\n case \"AUTH_CRAM_MD5_INIT\":\n line = \"AUTH CRAM-MD5\";\n break;\n case \"AUTH_CRAM_MD5_RESPONSE\":\n return encodeUtf8(`${cmd.response}\\r\\n`);\n case \"AUTH_XOAUTH2\":\n line = `AUTH XOAUTH2 ${cmd.xoauth2String}`;\n break;\n case \"MAIL_FROM\":\n if (/[\\r\\n]/.test(cmd.address)) {\n throw new SMTPError(`Invalid address: contains CRLF`, 0, \"MAIL FROM\", cmd.address);\n }\n line = `MAIL FROM:<${cmd.address}>`;\n break;\n case \"RCPT_TO\":\n if (/[\\r\\n]/.test(cmd.address)) {\n throw new SMTPError(`Invalid address: contains CRLF`, 0, \"RCPT TO\", cmd.address);\n }\n line = `RCPT TO:<${cmd.address}>`;\n break;\n case \"DATA\":\n line = \"DATA\";\n break;\n case \"DATA_BODY\":\n return encodeUtf8(applyDotStuffing(cmd.content));\n case \"QUIT\":\n line = \"QUIT\";\n break;\n case \"RSET\":\n line = \"RSET\";\n break;\n case \"NOOP\":\n line = \"NOOP\";\n break;\n }\n\n return encodeUtf8(`${line}\\r\\n`);\n}\n\n/**\n * Parse raw bytes from the server into an SMTPResponse.\n */\nexport function parseResponse(data: Uint8Array): SMTPResponse {\n const text = new TextDecoder().decode(data).trim();\n const lines = text.split(/\\r?\\n/);\n const lastLine = lines[lines.length - 1] ?? \"\";\n const match = lastLine.match(/^(\\d{3})([\\s-])(.*)$/);\n\n if (!match) {\n throw new SMTPError(\"Invalid SMTP response\", 0, \"PARSE\", text);\n }\n\n const code = Number.parseInt(match[1] ?? \"0\", 10);\n const message = lines.map((l) => l.replace(/^\\d{3}[\\s-]/, \"\")).join(\" \");\n\n return {\n code,\n message,\n isSuccess: code >= 200 && code < 300,\n isReady: code >= 300 && code < 400,\n isError: code >= 400,\n };\n}\n\n/**\n * Accumulate byte chunks until a complete SMTP response is received.\n */\nexport function accumulateResponse(chunks: Uint8Array[]): Uint8Array | null {\n if (chunks.length === 0) {\n return null;\n }\n\n const total = chunks.reduce((sum, c) => sum + c.length, 0);\n const combined = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n const text = new TextDecoder().decode(combined);\n const lines = text.split(/\\r?\\n/).filter((l) => l.length > 0);\n\n if (lines.length === 0) {\n return null;\n }\n\n const lastLine = lines[lines.length - 1] ?? \"\";\n if (/^\\d{3} /.test(lastLine)) {\n return combined;\n }\n\n return null;\n}\n\n/**\n * Select the best AUTH method from EHLO capability lines.\n * Priority: XOAUTH2 > CRAM-MD5 > LOGIN > PLAIN.\n */\nexport function selectAuthMethod(\n capabilities: string[],\n): \"LOGIN\" | \"PLAIN\" | \"CRAM-MD5\" | \"OAUTH2\" {\n const upper = capabilities.map((c) => c.toUpperCase());\n if (upper.some((c) => c.includes(\"AUTH\") && c.includes(\"XOAUTH2\"))) {\n return \"OAUTH2\";\n }\n if (upper.some((c) => c.includes(\"AUTH\") && c.includes(\"CRAM-MD5\"))) {\n return \"CRAM-MD5\";\n }\n if (upper.some((c) => c.includes(\"AUTH\") && c.includes(\"LOGIN\"))) {\n return \"LOGIN\";\n }\n if (upper.some((c) => c.includes(\"AUTH\") && c.includes(\"PLAIN\"))) {\n return \"PLAIN\";\n }\n throw new SMTPError(\"No supported AUTH method\", 0, \"EHLO\", capabilities.join(\" \"));\n}\n\n/**\n * Parse an EHLO multi-line response and extract capability keywords.\n */\nexport function parseEHLO(response: SMTPResponse): string[] {\n return response.message\n .split(/\\s+/)\n .flatMap((part) => part.split(/\\r?\\n/))\n .filter(Boolean);\n}\n\n/**\n * Assert that an SMTPResponse code is within the expected set.\n */\nexport function assertResponse(\n response: SMTPResponse,\n expectedCodes: number[],\n command: string,\n): void {\n if (!expectedCodes.includes(response.code)) {\n throw new SMTPError(\n `Unexpected SMTP response for ${command}`,\n response.code,\n command,\n response.message,\n );\n }\n}\n\nfunction applyDotStuffing(content: Uint8Array): string {\n const text = new TextDecoder().decode(content);\n const lines = text.split(/\\r?\\n/);\n const stuffed = lines.map((line) => (line.startsWith(\".\") ? `.${line}` : line));\n return `${stuffed.join(\"\\r\\n\")}\\r\\n.\\r\\n`;\n}\n\n/** Encode AUTH LOGIN password step (second base64 chunk). */\nexport function encodeAuthLoginPass(pass: string): Uint8Array {\n return encodeUtf8(`${encodeBase64(pass).replace(/\\r\\n/g, \"\")}\\r\\n`);\n}\n\n/** Encode AUTH LOGIN user step when sent separately after 334. */\nexport function encodeAuthLoginUser(user: string): Uint8Array {\n return encodeUtf8(`${encodeBase64(user).replace(/\\r\\n/g, \"\")}\\r\\n`);\n}\n\n/** Encode CRAM-MD5 response after challenge. */\nexport function encodeAuthCramResponse(response: string): Uint8Array {\n return encodeUtf8(`${response}\\r\\n`);\n}\n\n/** Encode raw SMTP line with CRLF. */\nexport function encodeLine(line: string): Uint8Array {\n return encodeUtf8(`${line}\\r\\n`);\n}\n"
7
- ],
8
- "mappings": "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",
9
- "debugId": "5BEE29900FA6AC3664756E2164756E21",
10
- "names": []
11
- }
@@ -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