@bumail/smtp 0.7.1 → 0.9.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/README.md CHANGED
@@ -364,7 +364,8 @@ host; a 5xx stops. A null MX (RFC 7505) fails at once with `NULL_MX`.
364
364
  message. A message holding a bare LF or a bare CR is refused whole with
365
365
  `550 5.6.11 Bare CR or LF is not allowed in a message`, and its content
366
366
  stream ends in an `SmtpError` (`BARE_LINE_BREAK`), so `onData` never
367
- reads it to a clean end.
367
+ reads it to a clean end. A message holding a NUL byte is refused whole
368
+ with `554 5.6.0 Message holds a NUL byte` (`NUL_BYTE`).
368
369
  - **Commands pipelined after STARTTLS are dropped.** Whatever the client
369
370
  sent in clear behind `STARTTLS` is discarded, never run (CVE-2011-0411),
370
371
  and the session starts over: EHLO again, no transaction, no user.
@@ -481,7 +482,7 @@ host; a 5xx stops. A null MX (RFC 7505) fails at once with `NULL_MX`.
481
482
  | `SmtpServer` | `listen({ port, hostname? })` (once; again, even before the first resolved, throws `ALREADY_LISTENING`; on implicit TLS, a key or certificate it cannot read or use throws `INVALID_OPTION`), `setTls({ key, cert })` (a renewed pair for new STARTTLS upgrades and new implicit TLS connections; open sessions keep theirs; a pair that cannot be used throws `INVALID_OPTION` and the old one stays), `stop(closeConnections?)` (`true` hangs up on every client, after STARTTLS too), `connections` |
482
483
  | `SmtpServerOptions` | `hostname`, `mode`, `localDomains`, `tls`, `implicitTls`, `authenticate`, the limits (`maxConnectionsPerClient` among them), `hookTimeout`, `handshakeTimeout`, `greetingDelay`, `proxyProtocol`, `onError`, and the hooks |
483
484
  | `ProxyProtocolOptions` | `trusted`: the proxies' IPv4 and IPv6 addresses and CIDRs, the only peers whose PROXY header (v1 or v2) is read |
484
- | `SmtpError`, `SmtpErrorCode` | `code`: `INVALID_OPTION`, `ALREADY_LISTENING`, `STOPPED` (a `stop()` came before `listen` resolved), and what a content stream or `onError` can get: `MESSAGE_TOO_BIG`, `BARE_LINE_BREAK`, `CONNECTION_LOST`, `HOOK_TIMEOUT`, `INVALID_HOOK_REPLY`, `MESSAGE_NOT_READ`; `sendMail`'s are listed below. `temporary`, `reply` and `rejected` are set for `sendMail`'s errors, and `afterData` when the final dot was written and no reply came (the server may have taken the message) |
485
+ | `SmtpError`, `SmtpErrorCode` | `code`: `INVALID_OPTION`, `ALREADY_LISTENING`, `STOPPED` (a `stop()` came before `listen` resolved), and what a content stream or `onError` can get: `MESSAGE_TOO_BIG`, `BARE_LINE_BREAK`, `NUL_BYTE`, `CONNECTION_LOST`, `HOOK_TIMEOUT`, `INVALID_HOOK_REPLY`, `MESSAGE_NOT_READ`; `sendMail`'s are listed below. `temporary`, `reply` and `rejected` are set for `sendMail`'s errors (`rejected` also after the final dot), and `afterData` when the final dot was written and no reply came (the server may have taken the message; `accepted` and `rejected` then list the recipients taken and refused at `RCPT TO`) |
485
486
  | `SmtpHooks` | `onConnect`, `onMailFrom`, `onRcptTo`, `onData` |
486
487
  | `HookResult` | what a hook returns: `undefined` to accept, a `Reply` to refuse |
487
488
  | `Session` | `id`, `remoteAddress`, `secure`, `helo`, `esmtp`, `user`, and `data` for your own state |
@@ -14,6 +14,7 @@ class SmtpError2 extends Error {
14
14
  temporary;
15
15
  reply;
16
16
  rejected;
17
+ accepted;
17
18
  afterData;
18
19
  constructor(code, message, details = {}) {
19
20
  super(message, details.cause === undefined ? undefined : { cause: details.cause });
@@ -23,6 +24,8 @@ class SmtpError2 extends Error {
23
24
  this.reply = details.reply;
24
25
  if (details.rejected)
25
26
  this.rejected = details.rejected;
27
+ if (details.accepted)
28
+ this.accepted = details.accepted;
26
29
  if (details.afterData)
27
30
  this.afterData = true;
28
31
  }
@@ -254,5 +257,5 @@ class Outgoing {
254
257
 
255
258
  export { SmtpError2, POSTMASTER, isHelloName, parsePath2, decodePlain2, decodeLoginStep2, encodePlain, encodeLoginStep, MAX_LINE, LineSplitter, Outgoing };
256
259
 
257
- //# debugId=6AFC48FB7973019764756E2164756E21
258
- //# sourceMappingURL=index-5228egp5.js.map
260
+ //# debugId=BA04975FA302CBFA64756E2164756E21
261
+ //# sourceMappingURL=index-wc25ywta.js.map
@@ -2,13 +2,13 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/errors.ts", "../src/protocol/path.ts", "../src/protocol/sasl.ts", "../src/protocol/lines.ts", "../src/io/outgoing.ts"],
4
4
  "sourcesContent": [
5
- "import type { Reply } from './protocol/reply';\n\n/** Why the server refused an option, why a message stream ended in error, or why `sendMail` failed. */\nexport type SmtpErrorCode =\n\t| 'INVALID_OPTION'\n\t| 'ALREADY_LISTENING'\n\t| 'STOPPED'\n\t| 'MESSAGE_TOO_BIG'\n\t| 'BARE_LINE_BREAK'\n\t| 'CONNECTION_LOST'\n\t| 'HOOK_TIMEOUT'\n\t| 'INVALID_HOOK_REPLY'\n\t| 'MESSAGE_NOT_READ'\n\t| 'CONNECTION_FAILED'\n\t| 'TIMEOUT'\n\t| 'BAD_REPLY'\n\t| 'REFUSED'\n\t| 'RECIPIENTS_REFUSED'\n\t| 'TLS_UNAVAILABLE'\n\t| 'TLS_FAILED'\n\t| 'AUTH_UNAVAILABLE'\n\t| 'EXTENSION_MISSING'\n\t| 'NULL_MX'\n\t| 'DNS_FAILED';\n\n/** One recipient and the server's reply to its `RCPT TO`. */\nexport interface RecipientReply {\n\treadonly recipient: string;\n\treadonly reply: Reply;\n}\n\n/** What `sendMail` adds to an error: whether to try again, and the reply behind it. */\nexport interface SmtpErrorDetails {\n\t/** Trying again later may succeed: a 4xx, the network, a timeout. */\n\treadonly temporary?: boolean;\n\t/** The server's reply that failed the delivery, enhanced status code included. */\n\treadonly reply?: Reply;\n\t/** With `RECIPIENTS_REFUSED`: each recipient, and why it was refused. */\n\treadonly rejected?: readonly RecipientReply[];\n\t/** The error behind this one, as `Error`'s `cause`. */\n\treadonly cause?: unknown;\n\t/**\n\t * The final dot of the message was written and no reply to it came (a\n\t * timeout, a lost connection, a reply that is not one): the server may\n\t * have taken the message. See `SmtpError.afterData`.\n\t */\n\treadonly afterData?: boolean;\n}\n\n/** The codes that are temporary unless a reply or `details` says otherwise. */\nconst TEMPORARY = new Set<SmtpErrorCode>([\n\t'CONNECTION_LOST',\n\t'CONNECTION_FAILED',\n\t'TIMEOUT',\n\t'BAD_REPLY',\n\t'TLS_UNAVAILABLE',\n\t'TLS_FAILED',\n]);\n\n/**\n * Thrown by `createSmtpServer` and `listen` for a wrong option or call; the\n * error a message's `content` stream ends with when the message must not be\n * delivered; what `onError` is given for a hook that broke a rule; and what\n * `sendMail` rejects with. `temporary` tells a failure worth trying again\n * later (a 4xx, the network, a timeout) from a permanent one (a 5xx, a null\n * MX, a message the server can never take).\n */\nexport class SmtpError extends Error {\n\toverride readonly name = 'SmtpError';\n\treadonly code: SmtpErrorCode;\n\t/** Trying again later may succeed. Meaningful for `sendMail`'s errors. */\n\treadonly temporary: boolean;\n\t/** The server reply behind a `sendMail` failure, enhanced status code included. */\n\treadonly reply?: Reply;\n\t/** With `RECIPIENTS_REFUSED`: each recipient, and the reply that refused it. */\n\treadonly rejected?: readonly RecipientReply[];\n\t/**\n\t * `true` when `sendMail` wrote the message's final dot and then got no\n\t * reply to it (a `TIMEOUT`, a `CONNECTION_LOST`, a `BAD_REPLY`): the\n\t * server may already have taken the message (RFC 5321 §4.1.5), so a\n\t * retry, or a delivery by another route, can duplicate it. Absent for a\n\t * failure before the dot (the server drops a message with no dot) and for\n\t * a reply that refused the message (a 4xx or 5xx says it was not taken).\n\t */\n\treadonly afterData?: boolean;\n\n\tconstructor(\n\t\tcode: SmtpErrorCode,\n\t\tmessage: string,\n\t\tdetails: SmtpErrorDetails = {},\n\t) {\n\t\tsuper(\n\t\t\tmessage,\n\t\t\tdetails.cause === undefined ? undefined : { cause: details.cause },\n\t\t);\n\t\tthis.code = code;\n\t\tthis.temporary =\n\t\t\tdetails.temporary ??\n\t\t\t(details.reply ? details.reply.code < 500 : TEMPORARY.has(code));\n\t\tif (details.reply) this.reply = details.reply;\n\t\tif (details.rejected) this.rejected = details.rejected;\n\t\tif (details.afterData) this.afterData = true;\n\t}\n}\n",
5
+ "import type { Reply } from './protocol/reply';\n\n/** Why the server refused an option, why a message stream ended in error, or why `sendMail` failed. */\nexport type SmtpErrorCode =\n\t| 'INVALID_OPTION'\n\t| 'ALREADY_LISTENING'\n\t| 'STOPPED'\n\t| 'MESSAGE_TOO_BIG'\n\t| 'BARE_LINE_BREAK'\n\t| 'NUL_BYTE'\n\t| 'CONNECTION_LOST'\n\t| 'HOOK_TIMEOUT'\n\t| 'INVALID_HOOK_REPLY'\n\t| 'MESSAGE_NOT_READ'\n\t| 'CONNECTION_FAILED'\n\t| 'TIMEOUT'\n\t| 'BAD_REPLY'\n\t| 'REFUSED'\n\t| 'RECIPIENTS_REFUSED'\n\t| 'TLS_UNAVAILABLE'\n\t| 'TLS_FAILED'\n\t| 'AUTH_UNAVAILABLE'\n\t| 'EXTENSION_MISSING'\n\t| 'NULL_MX'\n\t| 'DNS_FAILED';\n\n/** One recipient and the server's reply to its `RCPT TO`. */\nexport interface RecipientReply {\n\treadonly recipient: string;\n\treadonly reply: Reply;\n}\n\n/** What `sendMail` adds to an error: whether to try again, and the reply behind it. */\nexport interface SmtpErrorDetails {\n\t/** Trying again later may succeed: a 4xx, the network, a timeout. */\n\treadonly temporary?: boolean;\n\t/** The server's reply that failed the delivery, enhanced status code included. */\n\treadonly reply?: Reply;\n\t/**\n\t * With `RECIPIENTS_REFUSED`, or `afterData`: each recipient, and why it was\n\t * refused at `RCPT TO`.\n\t */\n\treadonly rejected?: readonly RecipientReply[];\n\t/** With `afterData`: each recipient the server accepted at `RCPT TO`. */\n\treadonly accepted?: readonly RecipientReply[];\n\t/** The error behind this one, as `Error`'s `cause`. */\n\treadonly cause?: unknown;\n\t/**\n\t * The final dot of the message was written and no reply to it came (a\n\t * timeout, a lost connection, a reply that is not one): the server may\n\t * have taken the message. See `SmtpError.afterData`.\n\t */\n\treadonly afterData?: boolean;\n}\n\n/** The codes that are temporary unless a reply or `details` says otherwise. */\nconst TEMPORARY = new Set<SmtpErrorCode>([\n\t'CONNECTION_LOST',\n\t'CONNECTION_FAILED',\n\t'TIMEOUT',\n\t'BAD_REPLY',\n\t'TLS_UNAVAILABLE',\n\t'TLS_FAILED',\n]);\n\n/**\n * Thrown by `createSmtpServer` and `listen` for a wrong option or call; the\n * error a message's `content` stream ends with when the message must not be\n * delivered; what `onError` is given for a hook that broke a rule; and what\n * `sendMail` rejects with. `temporary` tells a failure worth trying again\n * later (a 4xx, the network, a timeout) from a permanent one (a 5xx, a null\n * MX, a message the server can never take).\n */\nexport class SmtpError extends Error {\n\toverride readonly name = 'SmtpError';\n\treadonly code: SmtpErrorCode;\n\t/** Trying again later may succeed. Meaningful for `sendMail`'s errors. */\n\treadonly temporary: boolean;\n\t/** The server reply behind a `sendMail` failure, enhanced status code included. */\n\treadonly reply?: Reply;\n\t/**\n\t * With `RECIPIENTS_REFUSED`, or `afterData`: each recipient, and the reply\n\t * that refused it at `RCPT TO`.\n\t */\n\treadonly rejected?: readonly RecipientReply[];\n\t/**\n\t * With `afterData`: each recipient the server accepted at `RCPT TO`, and\n\t * the reply that accepted it — the ones that may hold the message. Absent\n\t * from an error of an older version; then every recipient is in doubt.\n\t */\n\treadonly accepted?: readonly RecipientReply[];\n\t/**\n\t * `true` when `sendMail` wrote the message's final dot and then got no\n\t * reply to it (a `TIMEOUT`, a `CONNECTION_LOST`, a `BAD_REPLY`): the\n\t * server may already have taken the message (RFC 5321 §4.1.5), so a\n\t * retry, or a delivery by another route, can duplicate it. Absent for a\n\t * failure before the dot (the server drops a message with no dot) and for\n\t * a reply that refused the message (a 4xx or 5xx says it was not taken).\n\t */\n\treadonly afterData?: boolean;\n\n\tconstructor(\n\t\tcode: SmtpErrorCode,\n\t\tmessage: string,\n\t\tdetails: SmtpErrorDetails = {},\n\t) {\n\t\tsuper(\n\t\t\tmessage,\n\t\t\tdetails.cause === undefined ? undefined : { cause: details.cause },\n\t\t);\n\t\tthis.code = code;\n\t\tthis.temporary =\n\t\t\tdetails.temporary ??\n\t\t\t(details.reply ? details.reply.code < 500 : TEMPORARY.has(code));\n\t\tif (details.reply) this.reply = details.reply;\n\t\tif (details.rejected) this.rejected = details.rejected;\n\t\tif (details.accepted) this.accepted = details.accepted;\n\t\tif (details.afterData) this.afterData = true;\n\t}\n}\n",
6
6
  "/** An envelope address, as `MAIL FROM` and `RCPT TO` give it. */\nexport interface Path {\n\t/**\n\t * `local@domain`; `''` for the null reverse-path `<>`; `'postmaster'`\n\t * for `RCPT TO:<postmaster>`, which has no domain.\n\t */\n\treadonly address: string;\n\treadonly local: string;\n\t/** Lower case; `''` for `<>` and for `<postmaster>`. */\n\treadonly domain: string;\n\t/**\n\t * `true` for `RCPT TO:<postmaster>`, in any case, with no domain (RFC\n\t * 5321 §4.5.1): the postmaster of this server, whatever domains it\n\t * hosts. Absent for every other path, `<postmaster@domain>` included.\n\t */\n\treadonly postmaster?: true;\n}\n\n/** The bare `<postmaster>` path `RCPT TO` takes (RFC 5321 §4.1.1.3, §4.5.1). */\nexport const POSTMASTER: Path = Object.freeze({\n\taddress: 'postmaster',\n\tlocal: 'postmaster',\n\tdomain: '',\n\tpostmaster: true,\n});\n\nconst ATOM = /^[A-Za-z0-9!#$%&'*+\\-/=?^_`{|}~\\u0080-\\u{10ffff}]+$/u;\nconst LABEL =\n\t/^(?:[A-Za-z0-9\\u0080-\\u{10ffff}](?:[A-Za-z0-9\\-\\u0080-\\u{10ffff}]*[A-Za-z0-9\\u0080-\\u{10ffff}])?)$/u;\n\n/**\n * C1 controls, Unicode format characters (zero-width, bidi, BOM), the\n * line and paragraph separators, and lone surrogates: none has a place in\n * an address, and each would land as it is in the Received field and the\n * app's records — a lone surrogate as U+FFFD, once encoded for the wire.\n */\nconst INVISIBLE = /[\\u0080-\\u009f\\u2028\\u2029\\p{Cf}\\p{Cs}]/u;\n\n/**\n * C0 controls (CR, LF and NUL among them), DEL and `>`, anywhere in the\n * path, quoted or not: a CR or an LF would end the command line and start\n * another, and a `>` would end the path where a reader of the line stops.\n */\nfunction hasControl(text: string): boolean {\n\tfor (let i = 0; i < text.length; i++) {\n\t\tconst code = text.charCodeAt(i);\n\t\tif (code < 0x20 || code === 0x7f || code === 0x3e) return true;\n\t}\n\treturn false;\n}\n\n/** One hop of a source route, `@domain`, and what follows it: `,` or `:`. */\nconst HOP = /^@(\\[[^\\]]*\\]|[^,:@[\\]]*)([,:])/;\n\nfunction isDotString(text: string): boolean {\n\treturn text.split('.').every((atom) => ATOM.test(atom));\n}\n\nfunction isQuotedString(text: string): boolean {\n\treturn /^\"(?:[\\x20\\x21\\x23-\\x5b\\x5d-\\x7e\\u0080-\\u{10ffff}]|\\\\[\\x20-\\x7e])*\"$/u.test(\n\t\ttext,\n\t);\n}\n\n/**\n * An address literal (§4.1.3): `[IPv6:…]`, its tag in any case (a quoted\n * string in RFC 5234 is), or `[a.b.c.d]` with each octet at most 255.\n */\nexport function isAddressLiteral(text: string): boolean {\n\tif (/^\\[IPv6:[0-9a-f:.]+\\]$/i.test(text)) return true;\n\tconst ipv4 = /^\\[(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\]$/.exec(text);\n\treturn ipv4?.slice(1).every((octet) => Number(octet) <= 255) === true;\n}\n\n/**\n * The argument of EHLO or HELO (RFC 5321 §4.1.1.1): a host name of\n * letters, digits and hyphens, or an address literal.\n */\nexport function isHelloName(text: string): boolean {\n\treturn (\n\t\t/^[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+)*$/.test(text) || isAddressLiteral(text)\n\t);\n}\n\nfunction isDomain(domain: string): boolean {\n\tif (isAddressLiteral(domain)) return true;\n\treturn (\n\t\tdomain.length <= 255 &&\n\t\tdomain.split('.').every((label) => label.length <= 63 && LABEL.test(label))\n\t);\n}\n\n/**\n * What `parsePath` does with a source route (`<@a,@b:local@domain>`, RFC 5321\n * Appendix C): a server accepts and discards it (`'discard'`), a client\n * refuses it, as §4.1.1.3 says clients should not send one (`'refuse'`).\n */\nexport type SourceRoute = 'discard' | 'refuse';\n\n/**\n * The mailbox after a source route, each of whose hops must be\n * `@domain` with a valid domain; `undefined` for any other route.\n */\nfunction afterRoute(inner: string): string | undefined {\n\tlet rest = inner;\n\tfor (;;) {\n\t\tconst hop = HOP.exec(rest);\n\t\tif (!hop || !isDomain(hop[1] as string)) return undefined;\n\t\trest = rest.slice(hop[0].length);\n\t\tif (hop[2] === ':') return rest;\n\t}\n}\n\n/**\n * Parses the `<path>` of RFC 5321 §4.1.2: `<local@domain>`, or `<>` when\n * `allowNull`. A source route (`<@a,@b:local@domain>`, §C) is dropped when\n * `sourceRoute` is `'discard'`, the default, provided each hop is\n * `@domain`; with `'refuse'` the path is not one. A C0 control (CR, LF,\n * NUL…), DEL or `>` anywhere refuses the path, as do C1 controls,\n * U+2028 and U+2029, Unicode format characters and lone surrogates. An IPv4 address literal\n * takes octets up to 255.\n * Non-ASCII is allowed: whether the session may use it is SMTPUTF8's\n * question (RFC 6531), not the grammar's. `undefined` when it is not a path.\n *\n * The local part is kept as written, quotes included: `\"v@x.example\"` and\n * `v%x.example` are local parts of the domain after the last `@`, not\n * addresses elsewhere. Code that delivers must not split on the first `@`.\n */\nexport function parsePath(\n\ttext: string,\n\tallowNull: boolean,\n\tsourceRoute: SourceRoute = 'discard',\n): Path | undefined {\n\tif (!text.startsWith('<') || !text.endsWith('>')) return undefined;\n\tlet inner: string | undefined = text.slice(1, -1);\n\tif (hasControl(inner) || INVISIBLE.test(inner)) return undefined;\n\tif (inner === '')\n\t\treturn allowNull ? { address: '', local: '', domain: '' } : undefined;\n\tif (inner.startsWith('@')) {\n\t\tif (sourceRoute === 'refuse') return undefined;\n\t\tinner = afterRoute(inner);\n\t\tif (inner === undefined) return undefined;\n\t}\n\tconst at = inner.lastIndexOf('@');\n\tif (at <= 0) return undefined;\n\tconst local = inner.slice(0, at);\n\tconst domain = inner.slice(at + 1);\n\tif (local.length > 64 || !(isDotString(local) || isQuotedString(local)))\n\t\treturn undefined;\n\tif (!isDomain(domain)) return undefined;\n\treturn {\n\t\taddress: `${local}@${domain.toLowerCase()}`,\n\t\tlocal,\n\t\tdomain: domain.toLowerCase(),\n\t};\n}\n",
7
7
  "/** Credentials a client gave with `AUTH`. */\nexport interface Credentials {\n\treadonly mechanism: 'PLAIN' | 'LOGIN';\n\treadonly username: string;\n\treadonly password: string;\n\t/**\n\t * PLAIN's authorization identity, when it differs from the username.\n\t * The server refuses such credentials before `authenticate` is asked.\n\t */\n\treadonly authorizationId?: string;\n}\n\nfunction base64ToText(text: string): string | undefined {\n\tif (!/^[A-Za-z0-9+/]*={0,2}$/.test(text) || text.length % 4 !== 0)\n\t\treturn undefined;\n\ttry {\n\t\treturn new TextDecoder('utf-8', { fatal: true }).decode(\n\t\t\tUint8Array.fromBase64(text),\n\t\t);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** PLAIN (RFC 4616): `authzid NUL authcid NUL passwd`, in base64. */\nexport function decodePlain(response: string): Credentials | undefined {\n\tconst text = base64ToText(response);\n\tif (text === undefined) return undefined;\n\tconst parts = text.split('\\0');\n\tif (parts.length !== 3) return undefined;\n\tconst [authorizationId = '', username = '', password = ''] = parts;\n\tif (username === '' || password === '') return undefined;\n\treturn {\n\t\tmechanism: 'PLAIN',\n\t\tusername,\n\t\tpassword,\n\t\t...(authorizationId === '' || authorizationId === username\n\t\t\t? {}\n\t\t\t: { authorizationId }),\n\t};\n}\n\n/** One step of LOGIN: a base64 line to its text. */\nexport function decodeLoginStep(response: string): string | undefined {\n\treturn base64ToText(response);\n}\n\nconst base64 = (text: string) => new TextEncoder().encode(text).toBase64();\n\n/** A client's PLAIN response (RFC 4616): `NUL username NUL password`, in base64, no authorization identity. */\nexport function encodePlain(username: string, password: string): string {\n\treturn base64(`\\0${username}\\0${password}`);\n}\n\n/** One step of LOGIN, the username or the password, in base64. */\nexport function encodeLoginStep(text: string): string {\n\treturn base64(text);\n}\n",
8
8
  "/**\n * The longest line taken, CRLF included: a command (RFC 5321 §4.5.3.1.4\n * asks for 512 at least) or a reply line (§4.5.3.1.5, 512 too).\n */\nexport const MAX_LINE = 2048;\n\n/** One line from the peer, or a line that was too long and was skipped. */\nexport type LineEvent = { line: string } | { tooLong: true };\n\n/**\n * Cuts a peer's bytes into lines — a client's commands, a server's\n * replies — ending at LF with or without CR. It holds one partial line at most: past `MAX_LINE`, the line is\n * skipped to its end and reported once.\n */\nexport class LineSplitter {\n\t#held: Uint8Array = new Uint8Array(0);\n\t#skipping = false;\n\t#rest: Uint8Array = new Uint8Array(0);\n\n\t/** Starts on a chunk; read its lines with `next`. */\n\tpush(chunk: Uint8Array): void {\n\t\tthis.#rest = this.#held.length > 0 ? concat(this.#held, chunk) : chunk;\n\t\tthis.#held = new Uint8Array(0);\n\t}\n\n\t/** The next line of the current chunk, or `undefined` when it has no more. */\n\tnext(): LineEvent | undefined {\n\t\tfor (;;) {\n\t\t\tconst data = this.#rest;\n\t\t\tconst lf = data.indexOf(0x0a);\n\t\t\tif (lf < 0) {\n\t\t\t\tthis.#rest = new Uint8Array(0);\n\t\t\t\tif (this.#skipping) return undefined;\n\t\t\t\tif (data.length > MAX_LINE) {\n\t\t\t\t\tthis.#skipping = true;\n\t\t\t\t\treturn { tooLong: true };\n\t\t\t\t}\n\t\t\t\tthis.#held = data.slice();\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst end = lf > 0 && data[lf - 1] === 0x0d ? lf - 1 : lf;\n\t\t\tthis.#rest = data.subarray(lf + 1);\n\t\t\tif (this.#skipping) {\n\t\t\t\tthis.#skipping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (end > MAX_LINE) return { tooLong: true };\n\t\t\treturn { line: new TextDecoder().decode(data.subarray(0, end)) };\n\t\t}\n\t}\n\n\t/** Bytes are held or left: a line begun, or lines not yet read. */\n\tget holding(): boolean {\n\t\treturn this.#held.length > 0 || this.#rest.length > 0;\n\t}\n\n\t/** What is left of the current chunk: message content pipelined after DATA. */\n\ttakeRest(): Uint8Array {\n\t\tconst rest = this.#rest;\n\t\tthis.#rest = new Uint8Array(0);\n\t\treturn rest;\n\t}\n\n\t/** Forgets everything held: after STARTTLS, or after a refused DATA. */\n\tclear(): void {\n\t\tthis.#held = new Uint8Array(0);\n\t\tthis.#rest = new Uint8Array(0);\n\t\tthis.#skipping = false;\n\t}\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n\tconst out = new Uint8Array(a.length + b.length);\n\tout.set(a, 0);\n\tout.set(b, a.length);\n\treturn out;\n}\n",
9
9
  "/**\n * What waits to leave a Bun socket. Bun's sockets do not buffer: `write`\n * takes what the kernel takes and says how much. The rest waits here for\n * the socket's `drain` event, so nothing written is lost to a peer that\n * reads slowly. The server's transport and the client's socket share it.\n */\nexport class Outgoing {\n\treadonly #write: (bytes: Uint8Array) => number;\n\t#queue: Uint8Array[] = [];\n\t#waiters: (() => void)[] = [];\n\n\tconstructor(write: (bytes: Uint8Array) => number) {\n\t\tthis.#write = write;\n\t}\n\n\t/** Nothing waits to leave. */\n\tget empty(): boolean {\n\t\treturn this.#queue.length === 0;\n\t}\n\n\t/** Writes what the socket takes now, and keeps the rest for `drain`. */\n\twrite(bytes: Uint8Array): void {\n\t\tif (this.#queue.length > 0) {\n\t\t\tthis.#queue.push(bytes);\n\t\t\treturn;\n\t\t}\n\t\tconst written = this.#write(bytes);\n\t\tif (written < bytes.length) {\n\t\t\tthis.#queue.push(bytes.subarray(Math.max(written, 0)));\n\t\t}\n\t}\n\n\t/** The socket's `drain`: it can take more. True once everything has left. */\n\tdrain(): boolean {\n\t\twhile (this.#queue.length > 0) {\n\t\t\tconst bytes = this.#queue[0] as Uint8Array;\n\t\t\tconst written = this.#write(bytes);\n\t\t\tif (written < bytes.length) {\n\t\t\t\tthis.#queue[0] = bytes.subarray(Math.max(written, 0));\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.#queue.shift();\n\t\t}\n\t\tfor (const wake of this.#waiters.splice(0)) wake();\n\t\treturn true;\n\t}\n\n\t/** Resolves once everything written has left, or the socket closed. */\n\tdrained(): Promise<void> {\n\t\tif (this.#queue.length === 0) return Promise.resolve();\n\t\treturn new Promise((wake) => this.#waiters.push(wake));\n\t}\n\n\t/** The socket closed: nothing more will leave. */\n\tclear(): void {\n\t\tthis.#queue = [];\n\t\tfor (const wake of this.#waiters.splice(0)) wake();\n\t}\n}\n"
10
10
  ],
11
- "mappings": "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",
12
- "debugId": "6AFC48FB7973019764756E2164756E21",
11
+ "mappings": ";AAwDA,IAAM,YAAY,IAAI,IAAmB;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAAA;AAUM,MAAM,mBAAkB,MAAM;AAAA,EAClB,OAAO;AAAA,EAChB;AAAA,EAEA;AAAA,EAEA;AAAA,EAKA;AAAA,EAMA;AAAA,EASA;AAAA,EAET,WAAW,CACV,MACA,SACA,UAA4B,CAAC,GAC5B;AAAA,IACD,MACC,SACA,QAAQ,UAAU,YAAY,YAAY,EAAE,OAAO,QAAQ,MAAM,CAClE;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,KAAK,YACJ,QAAQ,cACP,QAAQ,QAAQ,QAAQ,MAAM,OAAO,MAAM,UAAU,IAAI,IAAI;AAAA,IAC/D,IAAI,QAAQ;AAAA,MAAO,KAAK,QAAQ,QAAQ;AAAA,IACxC,IAAI,QAAQ;AAAA,MAAU,KAAK,WAAW,QAAQ;AAAA,IAC9C,IAAI,QAAQ;AAAA,MAAU,KAAK,WAAW,QAAQ;AAAA,IAC9C,IAAI,QAAQ;AAAA,MAAW,KAAK,YAAY;AAAA;AAE1C;;;ACpGO,IAAM,aAAmB,OAAO,OAAO;AAAA,EAC7C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AACb,CAAC;AAED,IAAM,OAAO;AACb,IAAM,QACL;AAQD,IAAM,YAAY;AAOlB,SAAS,UAAU,CAAC,MAAuB;AAAA,EAC1C,SAAS,IAAI,EAAG,IAAI,KAAK,QAAQ,KAAK;AAAA,IACrC,MAAM,OAAO,KAAK,WAAW,CAAC;AAAA,IAC9B,IAAI,OAAO,MAAQ,SAAS,OAAQ,SAAS;AAAA,MAAM,OAAO;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA;AAIR,IAAM,MAAM;AAEZ,SAAS,WAAW,CAAC,MAAuB;AAAA,EAC3C,OAAO,KAAK,MAAM,GAAG,EAAE,MAAM,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC;AAAA;AAGvD,SAAS,cAAc,CAAC,MAAuB;AAAA,EAC9C,OAAO,wEAAwE,KAC9E,IACD;AAAA;AAOM,SAAS,gBAAgB,CAAC,MAAuB;AAAA,EACvD,IAAI,0BAA0B,KAAK,IAAI;AAAA,IAAG,OAAO;AAAA,EACjD,MAAM,OAAO,mDAAmD,KAAK,IAAI;AAAA,EACzE,OAAO,MAAM,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,OAAO,KAAK,KAAK,GAAG,MAAM;AAAA;AAO3D,SAAS,WAAW,CAAC,MAAuB;AAAA,EAClD,OACC,sCAAsC,KAAK,IAAI,KAAK,iBAAiB,IAAI;AAAA;AAI3E,SAAS,QAAQ,CAAC,QAAyB;AAAA,EAC1C,IAAI,iBAAiB,MAAM;AAAA,IAAG,OAAO;AAAA,EACrC,OACC,OAAO,UAAU,OACjB,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,UAAU,MAAM,UAAU,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA;AAe5E,SAAS,UAAU,CAAC,OAAmC;AAAA,EACtD,IAAI,OAAO;AAAA,EACX,UAAS;AAAA,IACR,MAAM,MAAM,IAAI,KAAK,IAAI;AAAA,IACzB,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAY;AAAA,MAAG;AAAA,IACzC,OAAO,KAAK,MAAM,IAAI,GAAG,MAAM;AAAA,IAC/B,IAAI,IAAI,OAAO;AAAA,MAAK,OAAO;AAAA,EAC5B;AAAA;AAkBM,SAAS,UAAS,CACxB,MACA,WACA,cAA2B,WACR;AAAA,EACnB,IAAI,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,SAAS,GAAG;AAAA,IAAG;AAAA,EAClD,IAAI,QAA4B,KAAK,MAAM,GAAG,EAAE;AAAA,EAChD,IAAI,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK;AAAA,IAAG;AAAA,EAChD,IAAI,UAAU;AAAA,IACb,OAAO,YAAY,EAAE,SAAS,IAAI,OAAO,IAAI,QAAQ,GAAG,IAAI;AAAA,EAC7D,IAAI,MAAM,WAAW,GAAG,GAAG;AAAA,IAC1B,IAAI,gBAAgB;AAAA,MAAU;AAAA,IAC9B,QAAQ,WAAW,KAAK;AAAA,IACxB,IAAI,UAAU;AAAA,MAAW;AAAA,EAC1B;AAAA,EACA,MAAM,KAAK,MAAM,YAAY,GAAG;AAAA,EAChC,IAAI,MAAM;AAAA,IAAG;AAAA,EACb,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,EAC/B,MAAM,SAAS,MAAM,MAAM,KAAK,CAAC;AAAA,EACjC,IAAI,MAAM,SAAS,MAAM,EAAE,YAAY,KAAK,KAAK,eAAe,KAAK;AAAA,IACpE;AAAA,EACD,IAAI,CAAC,SAAS,MAAM;AAAA,IAAG;AAAA,EACvB,OAAO;AAAA,IACN,SAAS,GAAG,SAAS,OAAO,YAAY;AAAA,IACxC;AAAA,IACA,QAAQ,OAAO,YAAY;AAAA,EAC5B;AAAA;;;AC9ID,SAAS,YAAY,CAAC,MAAkC;AAAA,EACvD,IAAI,CAAC,yBAAyB,KAAK,IAAI,KAAK,KAAK,SAAS,MAAM;AAAA,IAC/D;AAAA,EACD,IAAI;AAAA,IACH,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE,OAChD,WAAW,WAAW,IAAI,CAC3B;AAAA,IACC,MAAM;AAAA,IACP;AAAA;AAAA;AAKK,SAAS,YAAW,CAAC,UAA2C;AAAA,EACtE,MAAM,OAAO,aAAa,QAAQ;AAAA,EAClC,IAAI,SAAS;AAAA,IAAW;AAAA,EACxB,MAAM,QAAQ,KAAK,MAAM,MAAI;AAAA,EAC7B,IAAI,MAAM,WAAW;AAAA,IAAG;AAAA,EACxB,OAAO,kBAAkB,IAAI,WAAW,IAAI,WAAW,MAAM;AAAA,EAC7D,IAAI,aAAa,MAAM,aAAa;AAAA,IAAI;AAAA,EACxC,OAAO;AAAA,IACN,WAAW;AAAA,IACX;AAAA,IACA;AAAA,OACI,oBAAoB,MAAM,oBAAoB,WAC/C,CAAC,IACD,EAAE,gBAAgB;AAAA,EACtB;AAAA;AAIM,SAAS,gBAAe,CAAC,UAAsC;AAAA,EACrE,OAAO,aAAa,QAAQ;AAAA;AAG7B,IAAM,SAAS,CAAC,SAAiB,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE,SAAS;AAGlE,SAAS,WAAW,CAAC,UAAkB,UAA0B;AAAA,EACvE,OAAO,OAAO,OAAK,eAAa,UAAU;AAAA;AAIpC,SAAS,eAAe,CAAC,MAAsB;AAAA,EACrD,OAAO,OAAO,IAAI;AAAA;;;ACpDZ,IAAM,WAAW;AAAA;AAUjB,MAAM,aAAa;AAAA,EACzB,QAAoB,IAAI,WAAW,CAAC;AAAA,EACpC,YAAY;AAAA,EACZ,QAAoB,IAAI,WAAW,CAAC;AAAA,EAGpC,IAAI,CAAC,OAAyB;AAAA,IAC7B,KAAK,QAAQ,KAAK,MAAM,SAAS,IAAI,OAAO,KAAK,OAAO,KAAK,IAAI;AAAA,IACjE,KAAK,QAAQ,IAAI,WAAW,CAAC;AAAA;AAAA,EAI9B,IAAI,GAA0B;AAAA,IAC7B,UAAS;AAAA,MACR,MAAM,OAAO,KAAK;AAAA,MAClB,MAAM,KAAK,KAAK,QAAQ,EAAI;AAAA,MAC5B,IAAI,KAAK,GAAG;AAAA,QACX,KAAK,QAAQ,IAAI,WAAW,CAAC;AAAA,QAC7B,IAAI,KAAK;AAAA,UAAW;AAAA,QACpB,IAAI,KAAK,SAAS,UAAU;AAAA,UAC3B,KAAK,YAAY;AAAA,UACjB,OAAO,EAAE,SAAS,KAAK;AAAA,QACxB;AAAA,QACA,KAAK,QAAQ,KAAK,MAAM;AAAA,QACxB;AAAA,MACD;AAAA,MACA,MAAM,MAAM,KAAK,KAAK,KAAK,KAAK,OAAO,KAAO,KAAK,IAAI;AAAA,MACvD,KAAK,QAAQ,KAAK,SAAS,KAAK,CAAC;AAAA,MACjC,IAAI,KAAK,WAAW;AAAA,QACnB,KAAK,YAAY;AAAA,QACjB;AAAA,MACD;AAAA,MACA,IAAI,MAAM;AAAA,QAAU,OAAO,EAAE,SAAS,KAAK;AAAA,MAC3C,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,OAAO,KAAK,SAAS,GAAG,GAAG,CAAC,EAAE;AAAA,IAChE;AAAA;AAAA,MAIG,OAAO,GAAY;AAAA,IACtB,OAAO,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS;AAAA;AAAA,EAIrD,QAAQ,GAAe;AAAA,IACtB,MAAM,OAAO,KAAK;AAAA,IAClB,KAAK,QAAQ,IAAI,WAAW,CAAC;AAAA,IAC7B,OAAO;AAAA;AAAA,EAIR,KAAK,GAAS;AAAA,IACb,KAAK,QAAQ,IAAI,WAAW,CAAC;AAAA,IAC7B,KAAK,QAAQ,IAAI,WAAW,CAAC;AAAA,IAC7B,KAAK,YAAY;AAAA;AAEnB;AAEA,SAAS,MAAM,CAAC,GAAe,GAA2B;AAAA,EACzD,MAAM,MAAM,IAAI,WAAW,EAAE,SAAS,EAAE,MAAM;AAAA,EAC9C,IAAI,IAAI,GAAG,CAAC;AAAA,EACZ,IAAI,IAAI,GAAG,EAAE,MAAM;AAAA,EACnB,OAAO;AAAA;;;ACrED,MAAM,SAAS;AAAA,EACZ;AAAA,EACT,SAAuB,CAAC;AAAA,EACxB,WAA2B,CAAC;AAAA,EAE5B,WAAW,CAAC,OAAsC;AAAA,IACjD,KAAK,SAAS;AAAA;AAAA,MAIX,KAAK,GAAY;AAAA,IACpB,OAAO,KAAK,OAAO,WAAW;AAAA;AAAA,EAI/B,KAAK,CAAC,OAAyB;AAAA,IAC9B,IAAI,KAAK,OAAO,SAAS,GAAG;AAAA,MAC3B,KAAK,OAAO,KAAK,KAAK;AAAA,MACtB;AAAA,IACD;AAAA,IACA,MAAM,UAAU,KAAK,OAAO,KAAK;AAAA,IACjC,IAAI,UAAU,MAAM,QAAQ;AAAA,MAC3B,KAAK,OAAO,KAAK,MAAM,SAAS,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC;AAAA,IACtD;AAAA;AAAA,EAID,KAAK,GAAY;AAAA,IAChB,OAAO,KAAK,OAAO,SAAS,GAAG;AAAA,MAC9B,MAAM,QAAQ,KAAK,OAAO;AAAA,MAC1B,MAAM,UAAU,KAAK,OAAO,KAAK;AAAA,MACjC,IAAI,UAAU,MAAM,QAAQ;AAAA,QAC3B,KAAK,OAAO,KAAK,MAAM,SAAS,KAAK,IAAI,SAAS,CAAC,CAAC;AAAA,QACpD,OAAO;AAAA,MACR;AAAA,MACA,KAAK,OAAO,MAAM;AAAA,IACnB;AAAA,IACA,WAAW,QAAQ,KAAK,SAAS,OAAO,CAAC;AAAA,MAAG,KAAK;AAAA,IACjD,OAAO;AAAA;AAAA,EAIR,OAAO,GAAkB;AAAA,IACxB,IAAI,KAAK,OAAO,WAAW;AAAA,MAAG,OAAO,QAAQ,QAAQ;AAAA,IACrD,OAAO,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA,EAItD,KAAK,GAAS;AAAA,IACb,KAAK,SAAS,CAAC;AAAA,IACf,WAAW,QAAQ,KAAK,SAAS,OAAO,CAAC;AAAA,MAAG,KAAK;AAAA;AAEnD;",
12
+ "debugId": "BA04975FA302CBFA64756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -7,7 +7,7 @@ import {
7
7
  MAX_LINE,
8
8
  LineSplitter,
9
9
  Outgoing
10
- } from "../chunks/index-5228egp5.js";
10
+ } from "../chunks/index-wc25ywta.js";
11
11
  // src/client/address.ts
12
12
  function isMailbox(address) {
13
13
  return typeof address === "string" && parsePath2(`<${address}>`, false, "refuse") !== undefined;
@@ -302,13 +302,13 @@ var badReply = (host, what) => new SmtpError2("BAD_REPLY", `${host} sent ${what}
302
302
  var lost = (host, what) => new SmtpError2("CONNECTION_LOST", what === undefined ? `The connection to ${host} closed while the message was sent` : `The connection to ${host} closed before ${what}`);
303
303
  var timedOut = (host, what, seconds, deadline) => new SmtpError2("TIMEOUT", deadline === undefined ? `Timed out after ${seconds} s waiting for ${what} (${host})` : `The deadline of ${deadline} s passed waiting for ${what} (${host})`);
304
304
  var tlsFailed = (host, why) => new SmtpError2("TLS_FAILED", `TLS with ${host} failed: ${why}`);
305
- function afterDot(error) {
305
+ function afterDot(error, taken) {
306
306
  if (!(error instanceof SmtpError2) || error.afterData || error.reply)
307
307
  return error;
308
308
  return new SmtpError2(error.code, error.message, {
309
309
  temporary: error.temporary,
310
310
  afterData: true,
311
- ...error.rejected ? { rejected: error.rejected } : {},
311
+ ...taken ? { accepted: taken.accepted, rejected: taken.rejected } : error.rejected ? { rejected: error.rejected } : {},
312
312
  ...error.cause === undefined ? {} : { cause: error.cause }
313
313
  });
314
314
  }
@@ -823,7 +823,7 @@ async function envelope(socket, settings, content, ready) {
823
823
  }
824
824
  return { accepted, rejected };
825
825
  }
826
- async function data(socket, settings, content, ready) {
826
+ async function data(socket, settings, content, ready, taken) {
827
827
  const { host } = socket;
828
828
  const { timeouts } = settings;
829
829
  socket.write(`DATA\r
@@ -859,7 +859,7 @@ async function data(socket, settings, content, ready) {
859
859
  }
860
860
  const dotSent = socket.write(tail);
861
861
  const end = await socket.reply("the reply to the final dot", timeouts.dataEnd).catch((error) => {
862
- throw dotSent ? afterDot(error) : error;
862
+ throw dotSent ? afterDot(error, taken) : error;
863
863
  });
864
864
  if (end.code !== 250)
865
865
  throw refused(host, "the message", end);
@@ -867,7 +867,10 @@ async function data(socket, settings, content, ready) {
867
867
  }
868
868
  async function transact(socket, settings, content, ready) {
869
869
  const { accepted, rejected } = await envelope(socket, settings, content, ready);
870
- const reply = await data(socket, settings, content, ready);
870
+ const reply = await data(socket, settings, content, ready, {
871
+ accepted,
872
+ rejected
873
+ });
871
874
  return { accepted, rejected, reply };
872
875
  }
873
876
 
@@ -970,5 +973,5 @@ export {
970
973
  sendMail
971
974
  };
972
975
 
973
- //# debugId=F9FE8E458D7309C564756E2164756E21
976
+ //# debugId=197A33BB71E8D48C64756E2164756E21
974
977
  //# sourceMappingURL=index.js.map
@@ -7,17 +7,17 @@
7
7
  "const CR = 0x0d;\nconst LF = 0x0a;\nconst DOT = 0x2e;\n\n/**\n * Writes the content of `DATA` (RFC 5321 §4.1.1.4), the other half of\n * `DataReader`: a dot is added before every line that starts with one\n * (§4.5.2), and `end` closes the message with `<CRLF>.<CRLF>`. One pass,\n * one byte at a time, whatever the chunks.\n *\n * A bare CR or LF is counted in `bareLineBreaks`, as `DataReader` counts\n * it, for the caller to refuse the message: a server that reads one as a\n * line end is the SMTP smuggling a server refuses. With `normalize`, each\n * becomes CRLF instead. `eightBit` says whether a byte above 127 was seen.\n */\nexport class DataWriter {\n\treadonly #normalize: boolean;\n\t#lineStart = true;\n\t#heldCr = false;\n\tbareLineBreaks = 0;\n\teightBit = false;\n\n\tconstructor(normalize = false) {\n\t\tthis.#normalize = normalize;\n\t}\n\n\t/** A bare CR or LF: CRLF when normalising, else counted and kept as it is. */\n\t#bare(out: Uint8Array, n: number, byte: number): number {\n\t\tif (this.#normalize) {\n\t\t\tout[n++] = CR;\n\t\t\tout[n++] = LF;\n\t\t\tthis.#lineStart = true;\n\t\t\treturn n;\n\t\t}\n\t\tthis.bareLineBreaks++;\n\t\tout[n++] = byte;\n\t\tthis.#lineStart = false;\n\t\treturn n;\n\t}\n\n\t/** The next bytes of the message, stuffed. */\n\twrite(chunk: Uint8Array): Uint8Array {\n\t\t// At worst every byte doubles: a dot or a bare line break each.\n\t\tconst out = new Uint8Array(chunk.length * 2 + 2);\n\t\tlet n = 0;\n\t\tfor (let i = 0; i < chunk.length; i++) {\n\t\t\tconst byte = chunk[i] as number;\n\t\t\tif (this.#heldCr) {\n\t\t\t\tthis.#heldCr = false;\n\t\t\t\tif (byte === LF) {\n\t\t\t\t\tout[n++] = CR;\n\t\t\t\t\tout[n++] = LF;\n\t\t\t\t\tthis.#lineStart = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tn = this.#bare(out, n, CR);\n\t\t\t}\n\t\t\tif (byte === CR) {\n\t\t\t\tthis.#heldCr = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (byte === LF) {\n\t\t\t\tn = this.#bare(out, n, LF);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (byte === DOT && this.#lineStart) out[n++] = DOT;\n\t\t\tif (byte > 0x7f) this.eightBit = true;\n\t\t\tout[n++] = byte;\n\t\t\tthis.#lineStart = false;\n\t\t}\n\t\treturn out.subarray(0, n);\n\t}\n\n\t/** The end of the message: a CRLF if its last line has none, then `.` CRLF. */\n\tend(): Uint8Array {\n\t\tconst out = new Uint8Array(7);\n\t\tlet n = 0;\n\t\tif (this.#heldCr) {\n\t\t\tthis.#heldCr = false;\n\t\t\tn = this.#bare(out, n, CR);\n\t\t}\n\t\tif (!this.#lineStart) {\n\t\t\tout[n++] = CR;\n\t\t\tout[n++] = LF;\n\t\t}\n\t\tout[n++] = DOT;\n\t\tout[n++] = CR;\n\t\tout[n++] = LF;\n\t\treturn out.subarray(0, n);\n\t}\n}\n",
8
8
  "import { SmtpError } from '../errors';\nimport { DataWriter } from '../protocol/data-writer';\nimport type { MessageSource } from './options';\n\n/** The slice of a message in memory sent at once. */\nconst SLICE = 64 * 1024;\n\n/** The message's bytes, one slice at a time; `undefined` once they end. */\nexport interface Chunks {\n\tnext(): Promise<Uint8Array | undefined>;\n\t/** Stops reading: a delivery that failed half-way. */\n\tcancel(): void;\n}\n\n/** A message ready to send: what is known of it before the first byte, and its bytes. */\nexport interface Content {\n\t/** Bytes, when known before sending: SIZE declares it. */\n\treadonly size?: number;\n\t/** A byte above 127, when known before sending: it needs 8BITMIME. */\n\treadonly eightBit: boolean;\n\tchunks(): Chunks;\n}\n\n/** The error for a bare CR or LF in the message: a server must refuse it, and this client does first. */\nexport const bareLineBreak = () =>\n\tnew SmtpError(\n\t\t'BARE_LINE_BREAK',\n\t\t'sendMail(): the message holds a bare CR or LF, which a server must refuse (SMTP smuggling); end every line with CRLF, or pass normalizeLineEnds: true',\n\t);\n\n/** Bytes in `SLICE`s, so no chunk sent at once is larger. */\nfunction sliced(next: () => Promise<Uint8Array | undefined>) {\n\tlet held: Uint8Array | undefined;\n\treturn async (): Promise<Uint8Array | undefined> => {\n\t\tif (!held || held.length === 0) held = await next();\n\t\tif (!held) return undefined;\n\t\tconst slice = held.subarray(0, SLICE);\n\t\theld = held.subarray(SLICE);\n\t\treturn slice;\n\t};\n}\n\nfunction fromBytes(bytes: Uint8Array): Chunks {\n\tlet given = false;\n\tconst next = sliced(async () => {\n\t\tif (given) return undefined;\n\t\tgiven = true;\n\t\treturn bytes;\n\t});\n\treturn { next, cancel() {} };\n}\n\nfunction fromStream(stream: ReadableStream<Uint8Array>): Chunks {\n\tconst reader = stream.getReader();\n\tconst next = sliced(async () => {\n\t\tconst { done, value } = await reader.read();\n\t\tif (done) return undefined;\n\t\tif (!(value instanceof Uint8Array)) {\n\t\t\tthrow new SmtpError(\n\t\t\t\t'INVALID_OPTION',\n\t\t\t\t'sendMail(): a message stream must give Uint8Array chunks',\n\t\t\t);\n\t\t}\n\t\treturn value;\n\t});\n\treturn {\n\t\tnext,\n\t\tcancel: () => void reader.cancel().catch(() => {}),\n\t};\n}\n\n/**\n * The message, checked before any connection when it is in memory: a bare\n * CR or LF is refused here (unless normalised), and its size and 8-bit\n * bytes are known for MAIL FROM. A stream is checked as it is sent.\n */\nexport function contentOf(\n\tmessage: MessageSource,\n\tnormalize: boolean,\n\tsize: number | undefined,\n): Content {\n\tif (message instanceof ReadableStream) {\n\t\tlet read = false;\n\t\treturn {\n\t\t\t...(size === undefined ? {} : { size }),\n\t\t\teightBit: false,\n\t\t\tchunks() {\n\t\t\t\tif (read) {\n\t\t\t\t\tthrow new SmtpError(\n\t\t\t\t\t\t'INVALID_OPTION',\n\t\t\t\t\t\t'sendMail(): a message stream can be sent once only',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tread = true;\n\t\t\t\treturn fromStream(message);\n\t\t\t},\n\t\t};\n\t}\n\tlet bytes: Uint8Array;\n\tif (typeof message === 'string') bytes = new TextEncoder().encode(message);\n\telse if (message instanceof Uint8Array) bytes = message;\n\telse {\n\t\tthrow new SmtpError(\n\t\t\t'INVALID_OPTION',\n\t\t\t'sendMail(): the message must be a Uint8Array, a string or a ReadableStream',\n\t\t);\n\t}\n\t// One dry run: what the server will be sent, its size as normalised.\n\tconst writer = new DataWriter(normalize);\n\tlet sent = 0;\n\tfor (let at = 0; at < bytes.length; at += SLICE) {\n\t\tsent += writer.write(bytes.subarray(at, at + SLICE)).length;\n\t}\n\twriter.end();\n\tif (writer.bareLineBreaks > 0) throw bareLineBreak();\n\treturn {\n\t\tsize: sent,\n\t\teightBit: writer.eightBit,\n\t\tchunks: () => fromBytes(bytes),\n\t};\n}\n",
9
9
  "import type { Reply } from './reply';\n\n/** The most lines one reply may have; an EHLO reply has a dozen or so. */\nexport const MAX_REPLY_LINES = 100;\n\n/** A reply line's parts: `250-text` or `250 text`, or a bare `250`. */\ninterface ReplyLine {\n\treadonly code: number;\n\treadonly last: boolean;\n\treadonly text: string;\n}\n\nconst isDigit = (c: number) => c >= 0x30 && c <= 0x39;\n\n/** RFC 5321 §4.2: three digits, the first 2 to 5, then a space, a hyphen, or nothing. */\nfunction parseLine(line: string): ReplyLine | undefined {\n\tif (line.length < 3) return undefined;\n\tconst a = line.charCodeAt(0);\n\tif (a < 0x32 || a > 0x35) return undefined;\n\tif (!isDigit(line.charCodeAt(1)) || !isDigit(line.charCodeAt(2)))\n\t\treturn undefined;\n\tconst code = Number(line.slice(0, 3));\n\tif (line.length === 3) return { code, last: true, text: '' };\n\tconst separator = line[3];\n\tif (separator !== ' ' && separator !== '-') return undefined;\n\treturn { code, last: separator === ' ', text: line.slice(4) };\n}\n\n/** `x.y.z` of RFC 3463, its class the reply's own first digit. */\nfunction statusOf(code: number, text: string): string | undefined {\n\tconst space = text.indexOf(' ');\n\tconst token = space < 0 ? text : text.slice(0, space);\n\tif (token.length > 11 || !/^[245]\\.\\d{1,3}\\.\\d{1,3}$/.test(token))\n\t\treturn undefined;\n\treturn token[0] === String(code)[0] ? token : undefined;\n}\n\n/** A reply put together: the enhanced status taken off every line that starts with it. */\nfunction build(code: number, lines: readonly string[]): Reply {\n\tconst status = statusOf(code, lines[0] ?? '');\n\tconst text = status\n\t\t? lines.map((line) =>\n\t\t\t\tline.startsWith(`${status} `)\n\t\t\t\t\t? line.slice(status.length + 1)\n\t\t\t\t\t: line === status\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: line,\n\t\t\t)\n\t\t: [...lines];\n\tconst body = text.length === 1 ? (text[0] as string) : text;\n\treturn status === undefined\n\t\t? { code, text: body }\n\t\t: { code, status, text: body };\n}\n\n/**\n * Puts a server's reply lines together (RFC 5321 §4.2.1): `code-` lines,\n * then a `code ` line, all with the same code. Each line costs one pass,\n * and a reply holds `MAX_REPLY_LINES` at most; what is not a reply is an\n * error, never guessed at.\n */\nexport class ReplyReader {\n\t#lines: string[] = [];\n\t#code = 0;\n\n\t/** One line, CRLF taken off: the reply it completes, `undefined` while it goes on, or why it is not one. */\n\tline(text: string): Reply | { readonly error: string } | undefined {\n\t\tconst parsed = parseLine(text);\n\t\tif (!parsed) {\n\t\t\tconst shown = text.length > 40 ? `${text.slice(0, 40)}…` : text;\n\t\t\treturn {\n\t\t\t\terror: `a line that is not an SMTP reply: ${JSON.stringify(shown)}`,\n\t\t\t};\n\t\t}\n\t\tif (this.#lines.length > 0 && parsed.code !== this.#code) {\n\t\t\treturn {\n\t\t\t\terror: `a reply whose lines change code, from ${this.#code} to ${parsed.code}`,\n\t\t\t};\n\t\t}\n\t\tif (this.#lines.length >= MAX_REPLY_LINES) {\n\t\t\treturn { error: `a reply of more than ${MAX_REPLY_LINES} lines` };\n\t\t}\n\t\tthis.#code = parsed.code;\n\t\tthis.#lines.push(parsed.text);\n\t\tif (!parsed.last) return undefined;\n\t\tconst lines = this.#lines;\n\t\tthis.#lines = [];\n\t\treturn build(parsed.code, lines);\n\t}\n}\n\n/** A reply's text as one line: its lines joined with a space. */\nexport function replyText(reply: Reply): string {\n\treturn typeof reply.text === 'string' ? reply.text : reply.text.join(' ');\n}\n",
10
- "import { SmtpError } from '../errors';\nimport type { Reply } from '../protocol/reply';\nimport { replyText } from '../protocol/reply-reader';\n\n/** A reply as an error message shows it: code, status, text, cut at 200 characters. */\nexport function shown(reply: Reply): string {\n\tconst text = replyText(reply);\n\tconst line = `${reply.code}${reply.status ? ` ${reply.status}` : ''} ${text}`;\n\treturn line.length > 200 ? `${line.slice(0, 200)}…` : line;\n}\n\n/** `REFUSED`, temporary for a 4xx: the server said no to `what`. */\nexport function refused(host: string, what: string, reply: Reply): SmtpError {\n\treturn new SmtpError('REFUSED', `${host} refused ${what}: ${shown(reply)}`, {\n\t\treply,\n\t});\n}\n\n/** `BAD_REPLY`: what the server sent is not a reply, or too much of one. */\nexport const badReply = (host: string, what: string) =>\n\tnew SmtpError('BAD_REPLY', `${host} sent ${what}`);\n\n/** `CONNECTION_LOST` while waiting for `what`, or while the message was sent. */\nexport const lost = (host: string, what?: string) =>\n\tnew SmtpError(\n\t\t'CONNECTION_LOST',\n\t\twhat === undefined\n\t\t\t? `The connection to ${host} closed while the message was sent`\n\t\t\t: `The connection to ${host} closed before ${what}`,\n\t);\n\n/** `TIMEOUT`: a step's own, or the whole delivery's deadline when `deadline` is given. */\nexport const timedOut = (\n\thost: string,\n\twhat: string,\n\tseconds: number,\n\tdeadline?: number,\n) =>\n\tnew SmtpError(\n\t\t'TIMEOUT',\n\t\tdeadline === undefined\n\t\t\t? `Timed out after ${seconds} s waiting for ${what} (${host})`\n\t\t\t: `The deadline of ${deadline} s passed waiting for ${what} (${host})`,\n\t);\n\n/** `TLS_FAILED`: the handshake, or the certificate's check. */\nexport const tlsFailed = (host: string, why: string) =>\n\tnew SmtpError('TLS_FAILED', `TLS with ${host} failed: ${why}`);\n\n/**\n * `error` as it is, marked `afterData` when it is an `SmtpError` of a\n * missing reply to the final dot: the same code, message, `temporary`,\n * `rejected` and `cause`.\n */\nexport function afterDot(error: unknown): unknown {\n\tif (!(error instanceof SmtpError) || error.afterData || error.reply)\n\t\treturn error; // a reply is the server's word: it did not take the message\n\treturn new SmtpError(error.code, error.message, {\n\t\ttemporary: error.temporary,\n\t\tafterData: true,\n\t\t...(error.rejected ? { rejected: error.rejected } : {}),\n\t\t...(error.cause === undefined ? {} : { cause: error.cause }),\n\t});\n}\n",
10
+ "import { type RecipientReply, SmtpError } from '../errors';\nimport type { Reply } from '../protocol/reply';\nimport { replyText } from '../protocol/reply-reader';\n\n/** A reply as an error message shows it: code, status, text, cut at 200 characters. */\nexport function shown(reply: Reply): string {\n\tconst text = replyText(reply);\n\tconst line = `${reply.code}${reply.status ? ` ${reply.status}` : ''} ${text}`;\n\treturn line.length > 200 ? `${line.slice(0, 200)}…` : line;\n}\n\n/** `REFUSED`, temporary for a 4xx: the server said no to `what`. */\nexport function refused(host: string, what: string, reply: Reply): SmtpError {\n\treturn new SmtpError('REFUSED', `${host} refused ${what}: ${shown(reply)}`, {\n\t\treply,\n\t});\n}\n\n/** `BAD_REPLY`: what the server sent is not a reply, or too much of one. */\nexport const badReply = (host: string, what: string) =>\n\tnew SmtpError('BAD_REPLY', `${host} sent ${what}`);\n\n/** `CONNECTION_LOST` while waiting for `what`, or while the message was sent. */\nexport const lost = (host: string, what?: string) =>\n\tnew SmtpError(\n\t\t'CONNECTION_LOST',\n\t\twhat === undefined\n\t\t\t? `The connection to ${host} closed while the message was sent`\n\t\t\t: `The connection to ${host} closed before ${what}`,\n\t);\n\n/** `TIMEOUT`: a step's own, or the whole delivery's deadline when `deadline` is given. */\nexport const timedOut = (\n\thost: string,\n\twhat: string,\n\tseconds: number,\n\tdeadline?: number,\n) =>\n\tnew SmtpError(\n\t\t'TIMEOUT',\n\t\tdeadline === undefined\n\t\t\t? `Timed out after ${seconds} s waiting for ${what} (${host})`\n\t\t\t: `The deadline of ${deadline} s passed waiting for ${what} (${host})`,\n\t);\n\n/** `TLS_FAILED`: the handshake, or the certificate's check. */\nexport const tlsFailed = (host: string, why: string) =>\n\tnew SmtpError('TLS_FAILED', `TLS with ${host} failed: ${why}`);\n\n/**\n * `error` as it is, marked `afterData` when it is an `SmtpError` of a\n * missing reply to the final dot: the same code, message, `temporary`,\n * `rejected` and `cause`, plus the envelope's outcome: `accepted` and\n * `rejected` as `taken` says them, together (the error's own `rejected` gives way).\n */\nexport function afterDot(\n\terror: unknown,\n\ttaken?: {\n\t\treadonly accepted: readonly RecipientReply[];\n\t\treadonly rejected: readonly RecipientReply[];\n\t},\n): unknown {\n\tif (!(error instanceof SmtpError) || error.afterData || error.reply)\n\t\treturn error; // a reply is the server's word: it did not take the message\n\treturn new SmtpError(error.code, error.message, {\n\t\ttemporary: error.temporary,\n\t\tafterData: true,\n\t\t...(taken\n\t\t\t? { accepted: taken.accepted, rejected: taken.rejected }\n\t\t\t: error.rejected\n\t\t\t\t? { rejected: error.rejected }\n\t\t\t\t: {}),\n\t\t...(error.cause === undefined ? {} : { cause: error.cause }),\n\t});\n}\n",
11
11
  "/**\n * The extensions an EHLO reply names (RFC 5321 §4.1.1.1): every line after\n * the first is a keyword, then its parameters. Keywords in upper case,\n * parameters as written, spaces around them dropped.\n */\nexport function parseEhlo(\n\tlines: readonly string[],\n): ReadonlyMap<string, string> {\n\tconst extensions = new Map<string, string>();\n\tfor (const line of lines.slice(1)) {\n\t\tconst text = line.trim();\n\t\tconst space = text.indexOf(' ');\n\t\tconst keyword = (space < 0 ? text : text.slice(0, space)).toUpperCase();\n\t\tif (keyword === '') continue;\n\t\textensions.set(keyword, space < 0 ? '' : text.slice(space + 1).trim());\n\t}\n\treturn extensions;\n}\n",
12
12
  "import { SmtpError } from '../errors';\nimport { parseEhlo } from '../protocol/ehlo';\nimport { encodeLoginStep, encodePlain } from '../protocol/sasl';\nimport { refused, shown } from './refusal';\nimport type { ClientSettings } from './settings';\nimport type { ClientSocket } from './socket';\nimport type { TlsTarget } from './target';\n\n/** A session past its greeting, EHLO, STARTTLS and AUTH: what the server offers. */\nexport interface Ready {\n\treadonly extensions: ReadonlyMap<string, string>;\n\treadonly authenticated: boolean;\n}\n\n/** EHLO, or HELO when the server refuses EHLO with a 5xx (RFC 5321 §4.1.4). */\nasync function hello(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\tallowHelo: boolean,\n): Promise<ReadonlyMap<string, string>> {\n\tconst seconds = settings.timeouts.command;\n\tsocket.write(`EHLO ${settings.helo}\\r\\n`);\n\tconst ehlo = await socket.reply('the reply to EHLO', seconds);\n\tif (ehlo.code === 250) {\n\t\treturn parseEhlo(typeof ehlo.text === 'string' ? [ehlo.text] : ehlo.text);\n\t}\n\tif (ehlo.code < 500 || !allowHelo) throw refused(socket.host, 'EHLO', ehlo);\n\tsocket.write(`HELO ${settings.helo}\\r\\n`);\n\tconst helo = await socket.reply('the reply to HELO', seconds);\n\tif (helo.code !== 250) throw refused(socket.host, 'HELO', helo);\n\treturn new Map();\n}\n\n/** STARTTLS when offered (RFC 3207); `required` fails without it, `opportunistic` goes on in clear. */\nasync function startTls(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\ttls: TlsTarget,\n\textensions: ReadonlyMap<string, string>,\n): Promise<ReadonlyMap<string, string>> {\n\tconst required = settings.tls === 'required';\n\tif (!extensions.has('STARTTLS')) {\n\t\tif (!required) return extensions;\n\t\tthrow new SmtpError(\n\t\t\t'TLS_UNAVAILABLE',\n\t\t\t`${socket.host} does not offer STARTTLS, and tls is 'required'`,\n\t\t);\n\t}\n\tsocket.write('STARTTLS\\r\\n');\n\tconst answer = await socket.reply(\n\t\t'the reply to STARTTLS',\n\t\tsettings.timeouts.command,\n\t);\n\tif (answer.code !== 220) {\n\t\tif (!required) return extensions;\n\t\tthrow new SmtpError(\n\t\t\t'TLS_UNAVAILABLE',\n\t\t\t`${socket.host} refused STARTTLS, and tls is 'required': ${shown(answer)}`,\n\t\t\t{ reply: answer, temporary: true },\n\t\t);\n\t}\n\tawait socket.startTls(tls, settings.timeouts.connect);\n\t// RFC 3207 §4.2: what was learnt in clear is forgotten; EHLO again.\n\treturn hello(socket, settings, false);\n}\n\n/** AUTH PLAIN or LOGIN (RFC 4954), over TLS unless `allowPlaintextAuth`. */\nasync function authenticate(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\textensions: ReadonlyMap<string, string>,\n): Promise<void> {\n\tconst { auth } = settings;\n\tif (!auth) return;\n\tconst { host } = socket;\n\tif (!socket.secure && !settings.allowPlaintextAuth) {\n\t\tthrow new SmtpError(\n\t\t\t'AUTH_UNAVAILABLE',\n\t\t\t`Refusing to send credentials to ${host} in clear: it did not start TLS (allowPlaintextAuth is for a local test server only)`,\n\t\t);\n\t}\n\tconst offered = (extensions.get('AUTH') ?? '').toUpperCase().split(' ');\n\tconst mechanism =\n\t\tauth.mechanism ??\n\t\t(offered.includes('PLAIN')\n\t\t\t? 'PLAIN'\n\t\t\t: offered.includes('LOGIN')\n\t\t\t\t? 'LOGIN'\n\t\t\t\t: undefined);\n\tif (!mechanism || !offered.includes(mechanism)) {\n\t\tthrow new SmtpError(\n\t\t\t'AUTH_UNAVAILABLE',\n\t\t\t`${host} offers no AUTH mechanism this client speaks (${auth.mechanism ?? 'PLAIN, LOGIN'}): AUTH ${extensions.get('AUTH') ?? 'is not offered'}`,\n\t\t);\n\t}\n\tconst seconds = settings.timeouts.command;\n\tconst steps =\n\t\tmechanism === 'PLAIN'\n\t\t\t? [`AUTH PLAIN ${encodePlain(auth.username, auth.password)}`]\n\t\t\t: [\n\t\t\t\t\t'AUTH LOGIN',\n\t\t\t\t\tencodeLoginStep(auth.username),\n\t\t\t\t\tencodeLoginStep(auth.password),\n\t\t\t\t];\n\tfor (const [i, step] of steps.entries()) {\n\t\tsocket.write(`${step}\\r\\n`);\n\t\tconst answer = await socket.reply('the reply to AUTH', seconds);\n\t\tconst last = i === steps.length - 1;\n\t\tif (answer.code === (last ? 235 : 334)) continue;\n\t\tthrow refused(host, `AUTH ${mechanism}`, answer);\n\t}\n}\n\n/** The greeting, EHLO, STARTTLS and AUTH: a session ready for MAIL FROM. */\nexport async function open(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\ttls: TlsTarget,\n): Promise<Ready> {\n\tconst greeting = await socket.reply(\n\t\t'the greeting',\n\t\tsettings.timeouts.greeting,\n\t);\n\tif (greeting.code !== 220) {\n\t\tthrow refused(socket.host, 'the connection', greeting);\n\t}\n\tlet extensions = await hello(socket, settings, true);\n\tif (!socket.secure && settings.tls !== 'none') {\n\t\textensions = await startTls(socket, settings, tls, extensions);\n\t}\n\tawait authenticate(socket, settings, extensions);\n\treturn { extensions, authenticated: settings.auth !== undefined };\n}\n",
13
13
  "import { hostname as machineName } from 'node:os';\nimport { SmtpError } from '../errors';\nimport { isHelloName, parsePath } from '../protocol/path';\nimport { isMailbox } from './address';\nimport type {\n\tMxDestination,\n\tSendMailAuth,\n\tSendMailEnvelope,\n\tSendMailOptions,\n\tSendMailTimeouts,\n\tTlsMode,\n} from './options';\n\n/** The longest delay `setTimeout` takes, in seconds: past 2^31 − 1 ms it fires after 1 ms. */\nexport const MAX_SECONDS = Math.floor(2_147_483_647 / 1000);\n\n/** RFC 5321 §4.5.3.2's timeouts; `connect` is this client's own. */\nconst TIMEOUTS: Required<SendMailTimeouts> = {\n\tconnect: 30,\n\tgreeting: 300,\n\tcommand: 300,\n\tmail: 300,\n\trcpt: 300,\n\tdataStart: 120,\n\tdataBlock: 180,\n\tdataEnd: 600,\n};\n\n/** The options, checked, with their defaults; timeouts in seconds. */\nexport interface ClientSettings {\n\treadonly from: string;\n\treadonly to: readonly string[];\n\treadonly helo: string;\n\treadonly tls: TlsMode;\n\treadonly secure: boolean;\n\treadonly ca?: readonly string[];\n\treadonly auth?: SendMailAuth;\n\treadonly allowPlaintextAuth: boolean;\n\treadonly size?: number;\n\t/** An address is not ASCII, or `smtputf8` asked for it. */\n\treadonly smtputf8: boolean;\n\treadonly normalizeLineEnds: boolean;\n\treadonly timeouts: Required<SendMailTimeouts>;\n\treadonly deadline: number;\n}\n\n/** `INVALID_OPTION`, for an option `sendMail` cannot take. */\nexport const invalid = (message: string) =>\n\tnew SmtpError('INVALID_OPTION', `sendMail(): ${message}`);\n\nfunction seconds(name: string, value: unknown, fallback: number): number {\n\tif (value === undefined) return fallback;\n\tif (\n\t\ttypeof value !== 'number' ||\n\t\t!Number.isFinite(value) ||\n\t\tvalue <= 0 ||\n\t\tvalue > MAX_SECONDS\n\t) {\n\t\tthrow invalid(\n\t\t\t`${name} must be a number of seconds above 0 and at most ${MAX_SECONDS}, not ${String(value)}`,\n\t\t);\n\t}\n\treturn value;\n}\n\nfunction timeoutsOf(given: SendMailTimeouts = {}): Required<SendMailTimeouts> {\n\tconst out: Record<string, number> = {};\n\tfor (const [name, fallback] of Object.entries(TIMEOUTS)) {\n\t\tout[name] = seconds(\n\t\t\t`timeouts.${name}`,\n\t\t\tgiven[name as keyof SendMailTimeouts],\n\t\t\tfallback,\n\t\t);\n\t}\n\treturn out as Required<SendMailTimeouts>;\n}\n\n/**\n * `from` or a recipient, checked as an RFC 5321 path, since it is written\n * into `MAIL FROM:<…>` or `RCPT TO:<…>` as it is. A source route is refused\n * (§4.1.1.3: clients should not send one), with a message of its own when\n * the route is otherwise valid. What it takes, past the null sender, is\n * exactly what `isMailbox` says yes to: the two share one predicate.\n */\nfunction address(value: unknown, allowNull: boolean): string {\n\tif (allowNull && value === '') return '';\n\tif (isMailbox(value)) return value;\n\tconst text = typeof value === 'string' ? value : '';\n\tconst routed = typeof value === 'string' && parsePath(`<${text}>`, false);\n\tif (routed) {\n\t\tthrow invalid(\n\t\t\t`${JSON.stringify(value)} holds a source route (@host:), which RFC 5321 says a client should not send: pass ${JSON.stringify(`${routed.local}@${text.slice(text.lastIndexOf('@') + 1)}`)} alone`,\n\t\t);\n\t}\n\tthrow invalid(\n\t\t`${JSON.stringify(value)} is not an address (local@domain${allowNull ? \", or '' for a bounce\" : ''})`,\n\t);\n}\n\n/**\n * `helo`, checked. By MX it is required: the machine's name (such as\n * `laptop.local`) is rarely a name that resolves back to the sender, which\n * receiving hosts penalise, and it would tell them the machine's name.\n */\nfunction heloOf(value: string | undefined, byMx: boolean): string {\n\tif (value !== undefined) {\n\t\tif (!isHelloName(value))\n\t\t\tthrow invalid(`helo \"${value}\" is not a host name`);\n\t\treturn value;\n\t}\n\tif (byMx)\n\t\tthrow invalid(\n\t\t\t\"helo is required for delivery by MX: pass your server's public name, such as helo: 'mail.example.com'\",\n\t\t);\n\tconst name = machineName();\n\treturn isHelloName(name) ? name : 'localhost';\n}\n\nfunction authOf(auth: SendMailAuth | undefined): SendMailAuth | undefined {\n\tif (auth === undefined) return undefined;\n\tconst { username, password, mechanism } = auth;\n\tif (typeof username !== 'string' || username === '')\n\t\tthrow invalid('auth.username must be a non-empty string');\n\tif (typeof password !== 'string' || password === '')\n\t\tthrow invalid('auth.password must be a non-empty string');\n\tif (mechanism !== undefined && mechanism !== 'PLAIN' && mechanism !== 'LOGIN')\n\t\tthrow invalid(\n\t\t\t`auth.mechanism must be 'PLAIN' or 'LOGIN', not ${mechanism}`,\n\t\t);\n\treturn auth;\n}\n\nfunction tlsOf(options: SendMailOptions, plaintextAuth: boolean): TlsMode {\n\tconst secure = options.secure === true;\n\tconst tls =\n\t\toptions.tls ??\n\t\t(secure || (options.auth && !plaintextAuth) ? 'required' : 'opportunistic');\n\tif (tls !== 'opportunistic' && tls !== 'required' && tls !== 'none')\n\t\tthrow invalid(\n\t\t\t`tls must be 'opportunistic', 'required' or 'none', not ${tls}`,\n\t\t);\n\tif (tls === 'none' && secure)\n\t\tthrow invalid(\n\t\t\t\"secure is TLS from the first byte: it cannot go with tls: 'none'\",\n\t\t);\n\tif (tls === 'none' && options.auth && !plaintextAuth)\n\t\tthrow invalid(\n\t\t\t\"auth with tls: 'none' would send the password in clear; pass allowPlaintextAuth: true for a local test server\",\n\t\t);\n\tif (tls === 'opportunistic' && options.auth && !plaintextAuth)\n\t\tthrow invalid(\n\t\t\t\"auth with tls: 'opportunistic' would send the password to a server whose certificate is not checked; leave tls out to check it, or pass allowPlaintextAuth: true for a local test server\",\n\t\t);\n\treturn tls;\n}\n\n/** Checks every option; throws an `SmtpError` (`INVALID_OPTION`) on the first wrong one. */\nexport function settingsOf(options: SendMailOptions): ClientSettings {\n\tif (typeof options !== 'object' || options === null)\n\t\tthrow invalid('options must be an object');\n\tconst from = address(options.from, true);\n\tconst list = typeof options.to === 'string' ? [options.to] : options.to;\n\tif (!Array.isArray(list) || list.length === 0)\n\t\tthrow invalid('to must name one recipient or more');\n\tconst to = list.map((recipient) => address(recipient, false));\n\tconst allowPlaintextAuth = options.allowPlaintextAuth === true;\n\tconst { size } = options;\n\tif (size !== undefined && (!Number.isSafeInteger(size) || size < 0))\n\t\tthrow invalid(`size must be a number of bytes, not ${size}`);\n\tconst ca = options.ca === undefined ? undefined : [options.ca].flat();\n\tconst auth = authOf(options.auth);\n\treturn {\n\t\tfrom,\n\t\tto,\n\t\thelo: heloOf(options.helo, byMx(options)),\n\t\ttls: tlsOf(options, allowPlaintextAuth),\n\t\tsecure: options.secure === true,\n\t\t...(ca ? { ca } : {}),\n\t\t...(auth ? { auth } : {}),\n\t\tallowPlaintextAuth,\n\t\t...(size === undefined ? {} : { size }),\n\t\tsmtputf8:\n\t\t\toptions.smtputf8 === true ||\n\t\t\t[from, ...to].some((text) => /[^ -~]/.test(text)),\n\t\tnormalizeLineEnds: options.normalizeLineEnds === true,\n\t\ttimeouts: timeoutsOf(options.timeouts),\n\t\tdeadline: seconds('deadline', options.deadline, 1800),\n\t};\n}\n\n/** Whether the options name a domain to deliver to by MX, not a host. */\nexport const byMx = (\n\toptions: SendMailOptions,\n): options is SendMailEnvelope & MxDestination =>\n\t!('host' in options && options.host !== undefined);\n\n/** A port: an integer from 1 to 65535. */\nexport function portOf(port: number | undefined, fallback: number): number {\n\tif (port === undefined) return fallback;\n\tif (!Number.isInteger(port) || port < 1 || port > 65535)\n\t\tthrow invalid(`port must be an integer from 1 to 65535, not ${port}`);\n\treturn port;\n}\n",
14
14
  "import { LineSplitter, MAX_LINE } from '../protocol/lines';\nimport type { Reply } from '../protocol/reply';\nimport { ReplyReader } from '../protocol/reply-reader';\n\n/** The most bytes a server may send in one session, every reply together. */\nexport const MAX_REPLY_BYTES = 1024 * 1024;\n\n/**\n * What a server sent, put together into replies, each bounded: `MAX_LINE`\n * a line, `MAX_REPLY_LINES` a reply, `MAX_REPLY_BYTES` in all. One pass\n * over the bytes, whatever the chunks.\n */\nexport class Inbox {\n\treadonly #lines = new LineSplitter();\n\treadonly #reader = new ReplyReader();\n\treadonly #replies: Reply[] = [];\n\t#received = 0;\n\n\t/** Takes the next bytes; says what is wrong with them, if they are not replies. */\n\tpush(chunk: Uint8Array): string | undefined {\n\t\tthis.#received += chunk.length;\n\t\tif (this.#received > MAX_REPLY_BYTES) {\n\t\t\treturn `more than ${MAX_REPLY_BYTES} bytes of replies`;\n\t\t}\n\t\tthis.#lines.push(chunk);\n\t\tfor (let event = this.#lines.next(); event; event = this.#lines.next()) {\n\t\t\tif ('tooLong' in event)\n\t\t\t\treturn `a reply line longer than ${MAX_LINE} bytes`;\n\t\t\tconst result = this.#reader.line(event.line);\n\t\t\tif (result === undefined) continue;\n\t\t\tif ('error' in result) return result.error;\n\t\t\tthis.#replies.push(result);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** The next complete reply. */\n\tshift(): Reply | undefined {\n\t\treturn this.#replies.shift();\n\t}\n\n\t/** Bytes or replies not yet read. */\n\tget holding(): boolean {\n\t\treturn this.#lines.holding || this.#replies.length > 0;\n\t}\n}\n",
15
15
  "import type { TLSOptions } from 'bun';\n\n/** Where to connect: `host` names the server in errors, and is what TLS checks. */\nexport interface Endpoint {\n\treadonly host: string;\n\treadonly address: string;\n\treadonly port: number;\n}\n\n/** How to start TLS: check the certificate against `servername`, or not. */\nexport interface TlsTarget {\n\treadonly servername: string;\n\treadonly verify: boolean;\n\treadonly ca?: readonly string[];\n}\n\n/** Bun's TLS options for a target: `rejectUnauthorized` only when checking (RFC 7435 otherwise). */\nexport const tlsOptions = (tls: TlsTarget): TLSOptions => ({\n\tserverName: tls.servername,\n\trejectUnauthorized: tls.verify,\n\t...(tls.ca ? { ca: [...tls.ca] } : {}),\n});\n\n/** Why a connection or a handshake failed, from what Bun gave: its code, else its message. */\nexport const reason = (error: unknown): string =>\n\t(error as { code?: string } | null)?.code ??\n\t(error as Error | null)?.message ??\n\t'the handshake failed';\n\n/** The whole delivery's deadline. */\nexport class Clock {\n\treadonly seconds: number;\n\treadonly #end: number;\n\n\tconstructor(seconds: number) {\n\t\tthis.seconds = seconds;\n\t\tthis.#end = performance.now() + seconds * 1000;\n\t}\n\n\t/**\n\t * `promise`, or what `expire` gives, thrown once `ms` passed or the\n\t * deadline did, whichever comes first; `deadline` says which it was.\n\t */\n\tasync race<T>(\n\t\tpromise: Promise<T>,\n\t\tms: number,\n\t\texpire: (deadline: boolean) => Error,\n\t): Promise<T> {\n\t\tconst left = this.#end - performance.now();\n\t\tconst deadline = left < ms;\n\t\tms = Math.min(ms, left);\n\t\tif (ms <= 0) throw expire(deadline);\n\t\tlet timer: Timer | undefined;\n\t\tconst expired = new Promise<never>((_, reject) => {\n\t\t\ttimer = setTimeout(() => reject(expire(deadline)), ms);\n\t\t});\n\t\ttry {\n\t\t\treturn await Promise.race([promise, expired]);\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n}\n",
16
16
  "import type { Socket, SocketHandler } from 'bun';\nimport { SmtpError } from '../errors';\nimport { Outgoing } from '../io/outgoing';\nimport type { Reply } from '../protocol/reply';\nimport { Inbox } from './inbox';\nimport { badReply, lost, refused, timedOut, tlsFailed } from './refusal';\nimport {\n\ttype Clock,\n\ttype Endpoint,\n\treason,\n\ttype TlsTarget,\n\ttlsOptions,\n} from './target';\n\n/**\n * A connection to an SMTP server: replies read as they come into an\n * `Inbox`, which bounds them; every wait bounded by its timeout and the\n * deadline. Whatever the server does ends in a reply or an `SmtpError`,\n * never in an exception of Bun's.\n */\nexport class ClientSocket {\n\treadonly host: string;\n\treadonly #clock: Clock;\n\t#socket: Socket<undefined> | undefined;\n\t#outgoing = new Outgoing(() => 0);\n\t/** Which socket's events count: the TLS one's after STARTTLS. */\n\t#tls = false;\n\treadonly #inbox = new Inbox();\n\t#failure: SmtpError | undefined;\n\t#closed = false;\n\t#wake: (() => void) | undefined;\n\t#handshaking: ((ok: boolean, error: unknown) => void) | undefined;\n\t/** Resolves when the connection is gone. */\n\treadonly #gone = Promise.withResolvers<void>();\n\tsecure = false;\n\t/** The certificate checked out against the host name. */\n\tverified = false;\n\n\tprivate constructor(host: string, clock: Clock) {\n\t\tthis.host = host;\n\t\tthis.#clock = clock;\n\t}\n\n\t/** Connects, with TLS from the first byte when `tls` is given. */\n\tstatic async open(\n\t\tendpoint: Endpoint,\n\t\ttls: TlsTarget | undefined,\n\t\tseconds: number,\n\t\tclock: Clock,\n\t): Promise<ClientSocket> {\n\t\tconst client = new ClientSocket(endpoint.host, clock);\n\t\tclient.#tls = tls !== undefined;\n\t\tconst handshake = tls ? client.#expectHandshake(tls) : undefined;\n\t\thandshake?.catch(() => {});\n\t\tconst { address, port } = endpoint;\n\t\tconst connecting = Bun.connect({\n\t\t\thostname: address,\n\t\t\tport,\n\t\t\t...(tls ? { tls: tlsOptions(tls) } : {}),\n\t\t\tsocket: client.#handlers(tls !== undefined),\n\t\t});\n\t\ttry {\n\t\t\tclient.#use(await client.#race(connecting, seconds, 'the connection'));\n\t\t} catch (error) {\n\t\t\tconnecting.then(\n\t\t\t\t(socket) => socket.terminate(),\n\t\t\t\t() => {},\n\t\t\t);\n\t\t\tif (error instanceof SmtpError) throw error;\n\t\t\tthrow new SmtpError(\n\t\t\t\t'CONNECTION_FAILED',\n\t\t\t\t`Could not connect to ${endpoint.host} (${address}:${port}): ${reason(error)}`,\n\t\t\t);\n\t\t}\n\t\tif (handshake) {\n\t\t\t// A handshake that failed before the connection resolved left it open.\n\t\t\tawait client.#race(handshake, seconds, 'the TLS handshake').catch((e) => {\n\t\t\t\tclient.close(true);\n\t\t\t\tthrow e;\n\t\t\t});\n\t\t}\n\t\treturn client;\n\t}\n\n\t#use(socket: Socket<undefined>): void {\n\t\tthis.#socket = socket;\n\t\tthis.#outgoing = new Outgoing((bytes) => socket.write(bytes));\n\t}\n\n\t/** Bun's events for one socket: only the live one's count, the clear one's or, after STARTTLS, the TLS one's. */\n\t#handlers(tls: boolean): SocketHandler<undefined> {\n\t\tconst live =\n\t\t\t<A extends unknown[]>(run: (...args: A) => void) =>\n\t\t\t(...args: A) => {\n\t\t\t\tif (this.#tls === tls) run(...args);\n\t\t\t};\n\t\treturn {\n\t\t\tdata: live((_, chunk: Uint8Array) => this.#receive(chunk)),\n\t\t\tdrain: live(() => this.#outgoing.drain()),\n\t\t\tclose: live(() => this.#lost()),\n\t\t\terror: live(() => this.#lost()),\n\t\t\thandshake: live((_, ok: boolean, error: Error | null) =>\n\t\t\t\tthis.#handshaking?.(ok, error),\n\t\t\t),\n\t\t};\n\t}\n\n\t#expectHandshake(tls: TlsTarget): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.#handshaking = (ok, error) => {\n\t\t\t\tthis.#handshaking = undefined;\n\t\t\t\tif (this.#closed || (tls.verify && !ok)) {\n\t\t\t\t\tconst why = this.#closed ? 'the connection closed' : reason(error);\n\t\t\t\t\treturn reject(this.#fail(tlsFailed(this.host, why)));\n\t\t\t\t}\n\t\t\t\tthis.secure = true;\n\t\t\t\tthis.verified = ok && error === null;\n\t\t\t\tresolve();\n\t\t\t};\n\t\t});\n\t}\n\n\t#receive(chunk: Uint8Array): void {\n\t\tif (this.#failure || this.#closed) return;\n\t\tconst wrong = this.#inbox.push(chunk);\n\t\tif (wrong) this.#fail(badReply(this.host, wrong));\n\t\telse this.#wakeUp();\n\t}\n\n\t#wakeUp(): void {\n\t\tconst wake = this.#wake;\n\t\tthis.#wake = undefined;\n\t\twake?.();\n\t}\n\n\t#lost(): void {\n\t\tthis.#closed = true;\n\t\tthis.#gone.resolve();\n\t\tthis.#outgoing.clear();\n\t\tthis.#handshaking?.(false, null);\n\t\tthis.#wakeUp();\n\t}\n\n\t/** Records the first failure, hangs up, and returns it to throw. */\n\t#fail(error: SmtpError): SmtpError {\n\t\tthis.#failure ??= error;\n\t\tthis.#socket?.terminate();\n\t\tthis.#lost();\n\t\treturn this.#failure;\n\t}\n\n\t/**\n\t * `promise`, or a `TIMEOUT` once `seconds` passed since `start` (now by\n\t * default), or the deadline did, whichever comes first.\n\t */\n\t#race<T>(\n\t\tpromise: Promise<T>,\n\t\tseconds: number,\n\t\twhat: string,\n\t\tstart = performance.now(),\n\t): Promise<T> {\n\t\tconst ms = start + seconds * 1000 - performance.now();\n\t\tconst { host } = this;\n\t\tconst deadline = this.#clock.seconds;\n\t\treturn this.#clock.race(promise, ms, (passed) =>\n\t\t\tthis.#fail(timedOut(host, what, seconds, passed ? deadline : undefined)),\n\t\t);\n\t}\n\n\t/** The next reply, within `seconds` all told; `what` names it in errors: `the greeting`, `the reply to MAIL FROM`. */\n\tasync reply(what: string, seconds: number): Promise<Reply> {\n\t\tconst start = performance.now();\n\t\tfor (;;) {\n\t\t\tconst next = this.#inbox.shift();\n\t\t\tif (next) return next;\n\t\t\tif (this.#failure) throw this.#failure;\n\t\t\tif (this.#closed) throw this.#fail(lost(this.host, what));\n\t\t\tawait this.#race(\n\t\t\t\tnew Promise<void>((wake) => {\n\t\t\t\t\tthis.#wake = wake;\n\t\t\t\t}),\n\t\t\t\tseconds,\n\t\t\t\twhat,\n\t\t\t\tstart,\n\t\t\t);\n\t\t}\n\t}\n\n\t/** One of the caller's promises — the message stream's next part — bounded as a reply is, and cut short if the connection goes (a hang-up after it settled is none of its business). */\n\twithin<T>(promise: Promise<T>, seconds: number, what: string): Promise<T> {\n\t\tconst over = new AbortController();\n\t\tconst gone = this.#gone.promise.then(() => {\n\t\t\tif (!over.signal.aborted) throw this.#hungUp(lost(this.host, what));\n\t\t});\n\t\tconst race = Promise.race([promise, gone]) as Promise<T>;\n\t\t// Once the deadline passed, the clock throws before it listens to `race`, and its expiry hangs up (`#fail`), which rejects `gone` and so `race` unheard.\n\t\trace.catch(() => undefined);\n\t\treturn this.#race(race, seconds, what).finally(() => over.abort());\n\t}\n\n\t/** Queues bytes for the server; nothing once the connection failed. Whether it did queue them. */\n\twrite(data: Uint8Array | string): boolean {\n\t\tif (this.#failure || this.#closed) return false;\n\t\tthis.#outgoing.write(\n\t\t\ttypeof data === 'string' ? new TextEncoder().encode(data) : data,\n\t\t);\n\t\treturn true;\n\t}\n\n\t/** Waits until the server took everything written. */\n\tasync drained(seconds: number): Promise<void> {\n\t\tawait this.#race(\n\t\t\tthis.#outgoing.drained(),\n\t\t\tseconds,\n\t\t\t'the server to take the message',\n\t\t);\n\t\tif (this.#failure || this.#closed) throw this.#hungUp(lost(this.host));\n\t}\n\n\t/** Why the connection is gone during DATA: its failure, the refusal a server sent before hanging up, or `lost`. */\n\t#hungUp(otherwise: SmtpError): SmtpError {\n\t\tif (this.#failure) return this.#failure;\n\t\tconst said = this.#inbox.shift();\n\t\treturn this.#fail(\n\t\t\tsaid ? refused(this.host, 'the message', said) : otherwise,\n\t\t);\n\t}\n\n\t/** After the 220 to STARTTLS: TLS on this connection. Anything the server sent past the 220 is an attack. */\n\tasync startTls(tls: TlsTarget, seconds: number): Promise<void> {\n\t\tconst socket = this.#socket;\n\t\tif (this.#inbox.holding || !socket) {\n\t\t\tthrow this.#fail(badReply(this.host, 'more after its 220 to STARTTLS'));\n\t\t}\n\t\tconst handshake = this.#expectHandshake(tls);\n\t\thandshake.catch(() => {});\n\t\tthis.#tls = true;\n\t\tconst [, encrypted] = socket.upgradeTLS<undefined>({\n\t\t\ttls: tlsOptions(tls),\n\t\t\tsocket: this.#handlers(true),\n\t\t});\n\t\tthis.#use(encrypted);\n\t\tawait this.#race(handshake, seconds, 'the TLS handshake');\n\t}\n\n\t/** Hangs up; `now` at once, so a message cut short is not delivered. */\n\tclose(now = false): void {\n\t\tthis.#closed = true;\n\t\tif (now) this.#socket?.terminate();\n\t\telse this.#socket?.end();\n\t}\n}\n",
17
- "import { type RecipientReply, SmtpError } from '../errors';\nimport { DataWriter } from '../protocol/data-writer';\nimport type { Reply } from '../protocol/reply';\nimport { bareLineBreak, type Content } from './content';\nimport { afterDot, refused, shown } from './refusal';\nimport type { Ready } from './session';\nimport type { ClientSettings } from './settings';\nimport type { ClientSocket } from './socket';\n\n/** What the server said to the envelope and the message. */\nexport interface Delivered {\n\treadonly accepted: readonly RecipientReply[];\n\treadonly rejected: readonly RecipientReply[];\n\treadonly reply: Reply;\n}\n\nconst missing = (host: string, extension: string, why: string) =>\n\tnew SmtpError(\n\t\t'EXTENSION_MISSING',\n\t\t`${host} does not offer ${extension}, which ${why}`,\n\t);\n\n/** MAIL FROM's parameters: SIZE (RFC 1870), BODY (RFC 6152), SMTPUTF8 (RFC 6531). */\nfunction mailParameters(\n\thost: string,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\textensions: ReadonlyMap<string, string>,\n): string {\n\tlet parameters = '';\n\tconst size = extensions.get('SIZE');\n\tif (size !== undefined && content.size !== undefined) {\n\t\tconst max = Number(size);\n\t\tif (Number.isSafeInteger(max) && max > 0 && content.size > max) {\n\t\t\tthrow new SmtpError(\n\t\t\t\t'MESSAGE_TOO_BIG',\n\t\t\t\t`The message (${content.size} bytes) is larger than the ${max} bytes ${host} takes (SIZE)`,\n\t\t\t\t{ temporary: false },\n\t\t\t);\n\t\t}\n\t\tparameters += ` SIZE=${content.size}`;\n\t}\n\tif (extensions.has('8BITMIME')) parameters += ' BODY=8BITMIME';\n\telse if (content.eightBit) {\n\t\tthrow missing(host, '8BITMIME', 'the message needs: it has 8-bit bytes');\n\t}\n\tif (settings.smtputf8) {\n\t\tif (!extensions.has('SMTPUTF8')) {\n\t\t\tthrow missing(\n\t\t\t\thost,\n\t\t\t\t'SMTPUTF8',\n\t\t\t\t'an address that is not ASCII needs (or smtputf8 asked for)',\n\t\t\t);\n\t\t}\n\t\tparameters += ' SMTPUTF8';\n\t}\n\treturn parameters;\n}\n\n/** MAIL FROM and every RCPT TO: in one write with PIPELINING (RFC 2920), else one by one. */\nasync function envelope(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\tready: Ready,\n): Promise<{ accepted: RecipientReply[]; rejected: RecipientReply[] }> {\n\tconst { host } = socket;\n\tconst { timeouts } = settings;\n\tconst mail = `MAIL FROM:<${settings.from}>${mailParameters(host, settings, content, ready.extensions)}\\r\\n`;\n\tconst rcpts = settings.to.map((to) => `RCPT TO:<${to}>\\r\\n`);\n\tconst pipelining = ready.extensions.has('PIPELINING');\n\tsocket.write(pipelining ? mail + rcpts.join('') : mail);\n\tconst from = await socket.reply('the reply to MAIL FROM', timeouts.mail);\n\tif (from.code !== 250) throw refused(host, 'the sender', from);\n\tconst accepted: RecipientReply[] = [];\n\tconst rejected: RecipientReply[] = [];\n\tfor (const [i, recipient] of settings.to.entries()) {\n\t\tif (!pipelining) socket.write(rcpts[i] as string);\n\t\tconst reply = await socket.reply('the reply to RCPT TO', timeouts.rcpt);\n\t\tconst into = reply.code === 250 || reply.code === 251 ? accepted : rejected;\n\t\tinto.push({ recipient, reply });\n\t}\n\tif (accepted.length === 0) {\n\t\tconst first = rejected[0] as RecipientReply;\n\t\tthrow new SmtpError(\n\t\t\t'RECIPIENTS_REFUSED',\n\t\t\t`${host} refused every recipient, ${first.recipient} with ${shown(first.reply)}`,\n\t\t\t{\n\t\t\t\treply: first.reply,\n\t\t\t\trejected,\n\t\t\t\ttemporary: rejected.some(({ reply }) => reply.code < 500),\n\t\t\t},\n\t\t);\n\t}\n\treturn { accepted, rejected };\n}\n\n/** The message, stuffed, block by block as the server takes it; a bad stream hangs up before the dot. */\nasync function data(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\tready: Ready,\n): Promise<Reply> {\n\tconst { host } = socket;\n\tconst { timeouts } = settings;\n\tsocket.write('DATA\\r\\n');\n\tconst start = await socket.reply('the reply to DATA', timeouts.dataStart);\n\tif (start.code !== 354) throw refused(host, 'DATA', start);\n\tconst writer = new DataWriter(settings.normalizeLineEnds);\n\tconst eightBitOk = ready.extensions.has('8BITMIME');\n\tconst chunks = content.chunks();\n\tlet tail: Uint8Array;\n\ttry {\n\t\tfor (;;) {\n\t\t\t// The caller's stream is bounded as the server is: a stalled one times out.\n\t\t\tconst chunk = await socket.within(\n\t\t\t\tchunks.next(),\n\t\t\t\ttimeouts.dataBlock,\n\t\t\t\t'the next part of the message',\n\t\t\t);\n\t\t\tif (!chunk) break;\n\t\t\tconst bytes = writer.write(chunk);\n\t\t\tif (writer.bareLineBreaks > 0) throw bareLineBreak();\n\t\t\tif (writer.eightBit && !eightBitOk) {\n\t\t\t\tthrow missing(\n\t\t\t\t\thost,\n\t\t\t\t\t'8BITMIME',\n\t\t\t\t\t'the message needs: it has 8-bit bytes',\n\t\t\t\t);\n\t\t\t}\n\t\t\tsocket.write(bytes);\n\t\t\tawait socket.drained(timeouts.dataBlock);\n\t\t}\n\t\t// A CR held at the very end is bare only now: still no dot for it.\n\t\ttail = writer.end();\n\t\tif (writer.bareLineBreaks > 0) throw bareLineBreak();\n\t} catch (error) {\n\t\t// No final dot: the server drops what it has of the message.\n\t\tchunks.cancel();\n\t\tsocket.close(true);\n\t\tthrow error;\n\t}\n\t// A connection that failed already took no dot: its error is not afterData.\n\tconst dotSent = socket.write(tail);\n\tconst end = await socket\n\t\t.reply('the reply to the final dot', timeouts.dataEnd)\n\t\t.catch((error: unknown) => {\n\t\t\t// No reply to the dot: the server may have taken the message.\n\t\t\tthrow dotSent ? afterDot(error) : error;\n\t\t});\n\tif (end.code !== 250) throw refused(host, 'the message', end);\n\treturn end;\n}\n\n/** One message: the envelope, then the content. */\nexport async function transact(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\tready: Ready,\n): Promise<Delivered> {\n\tconst { accepted, rejected } = await envelope(\n\t\tsocket,\n\t\tsettings,\n\t\tcontent,\n\t\tready,\n\t);\n\tconst reply = await data(socket, settings, content, ready);\n\treturn { accepted, rejected, reply };\n}\n",
17
+ "import { type RecipientReply, SmtpError } from '../errors';\nimport { DataWriter } from '../protocol/data-writer';\nimport type { Reply } from '../protocol/reply';\nimport { bareLineBreak, type Content } from './content';\nimport { afterDot, refused, shown } from './refusal';\nimport type { Ready } from './session';\nimport type { ClientSettings } from './settings';\nimport type { ClientSocket } from './socket';\n\n/** What the server said to the envelope and the message. */\nexport interface Delivered {\n\treadonly accepted: readonly RecipientReply[];\n\treadonly rejected: readonly RecipientReply[];\n\treadonly reply: Reply;\n}\n\n/** The envelope's outcome, as an error after the final dot carries it. */\ntype Taken = Pick<Delivered, 'accepted' | 'rejected'>;\n\nconst missing = (host: string, extension: string, why: string) =>\n\tnew SmtpError(\n\t\t'EXTENSION_MISSING',\n\t\t`${host} does not offer ${extension}, which ${why}`,\n\t);\n\n/** MAIL FROM's parameters: SIZE (RFC 1870), BODY (RFC 6152), SMTPUTF8 (RFC 6531). */\nfunction mailParameters(\n\thost: string,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\textensions: ReadonlyMap<string, string>,\n): string {\n\tlet parameters = '';\n\tconst size = extensions.get('SIZE');\n\tif (size !== undefined && content.size !== undefined) {\n\t\tconst max = Number(size);\n\t\tif (Number.isSafeInteger(max) && max > 0 && content.size > max) {\n\t\t\tthrow new SmtpError(\n\t\t\t\t'MESSAGE_TOO_BIG',\n\t\t\t\t`The message (${content.size} bytes) is larger than the ${max} bytes ${host} takes (SIZE)`,\n\t\t\t\t{ temporary: false },\n\t\t\t);\n\t\t}\n\t\tparameters += ` SIZE=${content.size}`;\n\t}\n\tif (extensions.has('8BITMIME')) parameters += ' BODY=8BITMIME';\n\telse if (content.eightBit) {\n\t\tthrow missing(host, '8BITMIME', 'the message needs: it has 8-bit bytes');\n\t}\n\tif (settings.smtputf8) {\n\t\tif (!extensions.has('SMTPUTF8')) {\n\t\t\tthrow missing(\n\t\t\t\thost,\n\t\t\t\t'SMTPUTF8',\n\t\t\t\t'an address that is not ASCII needs (or smtputf8 asked for)',\n\t\t\t);\n\t\t}\n\t\tparameters += ' SMTPUTF8';\n\t}\n\treturn parameters;\n}\n\n/** MAIL FROM and every RCPT TO: in one write with PIPELINING (RFC 2920), else one by one. */\nasync function envelope(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\tready: Ready,\n): Promise<{ accepted: RecipientReply[]; rejected: RecipientReply[] }> {\n\tconst { host } = socket;\n\tconst { timeouts } = settings;\n\tconst mail = `MAIL FROM:<${settings.from}>${mailParameters(host, settings, content, ready.extensions)}\\r\\n`;\n\tconst rcpts = settings.to.map((to) => `RCPT TO:<${to}>\\r\\n`);\n\tconst pipelining = ready.extensions.has('PIPELINING');\n\tsocket.write(pipelining ? mail + rcpts.join('') : mail);\n\tconst from = await socket.reply('the reply to MAIL FROM', timeouts.mail);\n\tif (from.code !== 250) throw refused(host, 'the sender', from);\n\tconst accepted: RecipientReply[] = [];\n\tconst rejected: RecipientReply[] = [];\n\tfor (const [i, recipient] of settings.to.entries()) {\n\t\tif (!pipelining) socket.write(rcpts[i] as string);\n\t\tconst reply = await socket.reply('the reply to RCPT TO', timeouts.rcpt);\n\t\tconst into = reply.code === 250 || reply.code === 251 ? accepted : rejected;\n\t\tinto.push({ recipient, reply });\n\t}\n\tif (accepted.length === 0) {\n\t\tconst first = rejected[0] as RecipientReply;\n\t\tthrow new SmtpError(\n\t\t\t'RECIPIENTS_REFUSED',\n\t\t\t`${host} refused every recipient, ${first.recipient} with ${shown(first.reply)}`,\n\t\t\t{\n\t\t\t\treply: first.reply,\n\t\t\t\trejected,\n\t\t\t\ttemporary: rejected.some(({ reply }) => reply.code < 500),\n\t\t\t},\n\t\t);\n\t}\n\treturn { accepted, rejected };\n}\n\n/** The message, stuffed, block by block as the server takes it; a bad stream hangs up before the dot. */\nasync function data(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\tready: Ready,\n\ttaken: Taken,\n): Promise<Reply> {\n\tconst { host } = socket;\n\tconst { timeouts } = settings;\n\tsocket.write('DATA\\r\\n');\n\tconst start = await socket.reply('the reply to DATA', timeouts.dataStart);\n\tif (start.code !== 354) throw refused(host, 'DATA', start);\n\tconst writer = new DataWriter(settings.normalizeLineEnds);\n\tconst eightBitOk = ready.extensions.has('8BITMIME');\n\tconst chunks = content.chunks();\n\tlet tail: Uint8Array;\n\ttry {\n\t\tfor (;;) {\n\t\t\t// The caller's stream is bounded as the server is: a stalled one times out.\n\t\t\tconst chunk = await socket.within(\n\t\t\t\tchunks.next(),\n\t\t\t\ttimeouts.dataBlock,\n\t\t\t\t'the next part of the message',\n\t\t\t);\n\t\t\tif (!chunk) break;\n\t\t\tconst bytes = writer.write(chunk);\n\t\t\tif (writer.bareLineBreaks > 0) throw bareLineBreak();\n\t\t\tif (writer.eightBit && !eightBitOk) {\n\t\t\t\tthrow missing(\n\t\t\t\t\thost,\n\t\t\t\t\t'8BITMIME',\n\t\t\t\t\t'the message needs: it has 8-bit bytes',\n\t\t\t\t);\n\t\t\t}\n\t\t\tsocket.write(bytes);\n\t\t\tawait socket.drained(timeouts.dataBlock);\n\t\t}\n\t\t// A CR held at the very end is bare only now: still no dot for it.\n\t\ttail = writer.end();\n\t\tif (writer.bareLineBreaks > 0) throw bareLineBreak();\n\t} catch (error) {\n\t\t// No final dot: the server drops what it has of the message.\n\t\tchunks.cancel();\n\t\tsocket.close(true);\n\t\tthrow error;\n\t}\n\t// A connection that failed already took no dot: its error is not afterData.\n\tconst dotSent = socket.write(tail);\n\tconst end = await socket\n\t\t.reply('the reply to the final dot', timeouts.dataEnd)\n\t\t.catch((error: unknown) => {\n\t\t\t// No reply to the dot: the server may have taken the message.\n\t\t\tthrow dotSent ? afterDot(error, taken) : error;\n\t\t});\n\tif (end.code !== 250) throw refused(host, 'the message', end);\n\treturn end;\n}\n\n/** One message: the envelope, then the content. */\nexport async function transact(\n\tsocket: ClientSocket,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\tready: Ready,\n): Promise<Delivered> {\n\tconst { accepted, rejected } = await envelope(\n\t\tsocket,\n\t\tsettings,\n\t\tcontent,\n\t\tready,\n\t);\n\tconst reply = await data(socket, settings, content, ready, {\n\t\taccepted,\n\t\trejected,\n\t});\n\treturn { accepted, rejected, reply };\n}\n",
18
18
  "import { SmtpError } from '../errors';\nimport { type Content, contentOf } from './content';\nimport { addressesOf, noAddress, resolveMx } from './mx';\nimport type {\n\tMessageSource,\n\tMxDestination,\n\tSendMailOptions,\n\tSendMailResult,\n} from './options';\nimport { timedOut } from './refusal';\nimport { open } from './session';\nimport {\n\tbyMx,\n\ttype ClientSettings,\n\tinvalid,\n\tportOf,\n\tsettingsOf,\n} from './settings';\nimport { ClientSocket } from './socket';\nimport { Clock, type Endpoint, type TlsTarget } from './target';\nimport { transact } from './transaction';\n\n/** The most addresses one delivery tries, every MX host together; and the most MX hosts it looks up. */\nexport const MAX_ADDRESSES = 10;\n\n/** Seconds to wait for the 221 to QUIT once the message was taken. */\nconst QUIT_WAIT = 5;\n\n/** Errors from before MAIL FROM: another MX host may do better. */\nconst early = new WeakSet<object>();\n\n/** One session with one server, from the connection to QUIT. */\nasync function attempt(\n\tendpoint: Endpoint,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\tclock: Clock,\n): Promise<SendMailResult> {\n\tconst tls: TlsTarget = {\n\t\tservername: endpoint.host,\n\t\tverify: settings.tls === 'required',\n\t\t...(settings.ca ? { ca: settings.ca } : {}),\n\t};\n\tlet socket: ClientSocket;\n\ttry {\n\t\tsocket = await ClientSocket.open(\n\t\t\tendpoint,\n\t\t\tsettings.secure ? tls : undefined,\n\t\t\tsettings.timeouts.connect,\n\t\t\tclock,\n\t\t);\n\t} catch (error) {\n\t\tearly.add(error as object);\n\t\tthrow error;\n\t}\n\tlet quit = false;\n\ttry {\n\t\tconst ready = await open(socket, settings, tls).catch((error) => {\n\t\t\tearly.add(error as object);\n\t\t\tthrow error;\n\t\t});\n\t\tconst delivered = await transact(socket, settings, content, ready);\n\t\tsocket.write('QUIT\\r\\n');\n\t\tquit = true;\n\t\tawait socket\n\t\t\t.reply(\n\t\t\t\t'the reply to QUIT',\n\t\t\t\tMath.min(QUIT_WAIT, settings.timeouts.command),\n\t\t\t)\n\t\t\t.catch(() => {});\n\t\treturn {\n\t\t\t...delivered,\n\t\t\thost: endpoint.host,\n\t\t\tport: endpoint.port,\n\t\t\ttls: socket.secure ? { verified: socket.verified } : false,\n\t\t\tauthenticated: ready.authenticated,\n\t\t};\n\t} finally {\n\t\t// After a refusal the session is still in step: say goodbye.\n\t\tif (!quit) socket.write('QUIT\\r\\n');\n\t\tsocket.close();\n\t}\n}\n\n/** A DNS lookup, bounded by the delivery's deadline (the resolver has its own timeout too). */\nconst withinDeadline = <T>(\n\tlookup: Promise<T>,\n\tclock: Clock,\n\tname: string,\n\twhat: string,\n): Promise<T> =>\n\tclock.race(lookup, Number.POSITIVE_INFINITY, () =>\n\t\ttimedOut(name, what, clock.seconds, clock.seconds),\n\t);\n\n/** Direct delivery: each MX host's addresses in turn, while the failures are temporary and before MAIL FROM. */\nasync function viaMx(\n\toptions: MxDestination,\n\tsettings: ClientSettings,\n\tcontent: Content,\n\tclock: Clock,\n): Promise<SendMailResult> {\n\tconst { domain, resolver } = options;\n\tif (typeof domain !== 'string' || domain === '')\n\t\tthrow invalid('domain must be a domain name');\n\tif (typeof resolver?.mx !== 'function')\n\t\tthrow invalid('resolver must be a Resolver, such as @bumail/dns gives');\n\tconst port = portOf(options.port, 25);\n\tlet last: unknown;\n\tlet dnsError: unknown;\n\tlet tried = 0;\n\tlet looked = 0;\n\tconst mailHosts = await withinDeadline(\n\t\tresolveMx(domain, resolver),\n\t\tclock,\n\t\tdomain,\n\t\t'the MX lookup',\n\t);\n\thosts: for (const mx of mailHosts) {\n\t\t// A host looked up counts, with an address or not: no endless lookups.\n\t\tif (tried >= MAX_ADDRESSES || looked++ >= MAX_ADDRESSES) break;\n\t\tconst addresses = await withinDeadline(\n\t\t\taddressesOf(mx.host, resolver),\n\t\t\tclock,\n\t\t\tmx.host,\n\t\t\t'the address lookup',\n\t\t);\n\t\tif (!Array.isArray(addresses)) {\n\t\t\tdnsError = addresses.error;\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const address of addresses) {\n\t\t\tif (tried++ >= MAX_ADDRESSES) break hosts;\n\t\t\ttry {\n\t\t\t\treturn await attempt(\n\t\t\t\t\t{ host: mx.host, address, port },\n\t\t\t\t\tsettings,\n\t\t\t\t\tcontent,\n\t\t\t\t\tclock,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tconst next =\n\t\t\t\t\terror instanceof SmtpError && error.temporary && early.has(error);\n\t\t\t\tif (!next) throw error;\n\t\t\t\tlast = error;\n\t\t\t}\n\t\t}\n\t}\n\tthrow last ?? noAddress(domain, dnsError);\n}\n\n/**\n * Delivers one message to one destination: a host (`{ host, port }`, a\n * smarthost or a submission server) or a domain's mail hosts (`{ domain,\n * resolver }`, by MX). Resolves once the server took the message for one\n * recipient at least; rejects with an `SmtpError` otherwise, `temporary`\n * telling whether to try again later. It is not a queue: retries are the\n * caller's.\n */\nexport async function sendMail(\n\tmessage: MessageSource,\n\toptions: SendMailOptions,\n): Promise<SendMailResult> {\n\tconst settings = settingsOf(options);\n\tconst content = contentOf(message, settings.normalizeLineEnds, settings.size);\n\tconst clock = new Clock(settings.deadline);\n\tif (!byMx(options)) {\n\t\tconst { host } = options;\n\t\tif (typeof host !== 'string' || !/^[^\\s/]+$/.test(host))\n\t\t\tthrow invalid(`host must be a host name or an address, not ${host}`);\n\t\tconst port = portOf(options.port, settings.secure ? 465 : 25);\n\t\treturn attempt({ host, address: host, port }, settings, content, clock);\n\t}\n\treturn viaMx(options, settings, content, clock);\n}\n"
19
19
  ],
20
- "mappings": "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",
21
- "debugId": "F9FE8E458D7309C564756E2164756E21",
20
+ "mappings": "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",
21
+ "debugId": "197A33BB71E8D48C64756E2164756E21",
22
22
  "names": []
23
23
  }
@@ -1,4 +1,4 @@
1
- import { SmtpError } from '../errors';
1
+ import { type RecipientReply, SmtpError } from '../errors';
2
2
  import type { Reply } from '../protocol/reply';
3
3
  /** A reply as an error message shows it: code, status, text, cut at 200 characters. */
4
4
  export declare function shown(reply: Reply): string;
@@ -15,7 +15,11 @@ export declare const tlsFailed: (host: string, why: string) => SmtpError;
15
15
  /**
16
16
  * `error` as it is, marked `afterData` when it is an `SmtpError` of a
17
17
  * missing reply to the final dot: the same code, message, `temporary`,
18
- * `rejected` and `cause`.
18
+ * `rejected` and `cause`, plus the envelope's outcome: `accepted` and
19
+ * `rejected` as `taken` says them, together (the error's own `rejected` gives way).
19
20
  */
20
- export declare function afterDot(error: unknown): unknown;
21
+ export declare function afterDot(error: unknown, taken?: {
22
+ readonly accepted: readonly RecipientReply[];
23
+ readonly rejected: readonly RecipientReply[];
24
+ }): unknown;
21
25
  //# sourceMappingURL=refusal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../../src/client/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,uFAAuF;AACvF,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAI1C;AAED,oEAAoE;AACpE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAI3E;AAED,4EAA4E;AAC5E,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,cACA,CAAC;AAEpD,iFAAiF;AACjF,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,cAM9C,CAAC;AAEH,0FAA0F;AAC1F,eAAO,MAAM,QAAQ,GACpB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,WAAW,MAAM,cAOhB,CAAC;AAEH,+DAA+D;AAC/D,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,cACY,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAShD"}
1
+ {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../../src/client/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,uFAAuF;AACvF,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAI1C;AAED,oEAAoE;AACpE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAI3E;AAED,4EAA4E;AAC5E,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,cACA,CAAC;AAEpD,iFAAiF;AACjF,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,cAM9C,CAAC;AAEH,0FAA0F;AAC1F,eAAO,MAAM,QAAQ,GACpB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,WAAW,MAAM,cAOhB,CAAC;AAEH,+DAA+D;AAC/D,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,cACY,CAAC;AAEhE;;;;;GAKG;AACH,wBAAgB,QAAQ,CACvB,KAAK,EAAE,OAAO,EACd,KAAK,CAAC,EAAE;IACP,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C,GACC,OAAO,CAaT"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/client/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAa,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACtB;AA6ID,mDAAmD;AACnD,wBAAsB,QAAQ,CAC7B,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,GACV,OAAO,CAAC,SAAS,CAAC,CASpB"}
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/client/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAa,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACtB;AAiJD,mDAAmD;AACnD,wBAAsB,QAAQ,CAC7B,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,GACV,OAAO,CAAC,SAAS,CAAC,CAYpB"}
package/dist/errors.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { Reply } from './protocol/reply';
2
2
  /** Why the server refused an option, why a message stream ended in error, or why `sendMail` failed. */
3
- export type SmtpErrorCode = 'INVALID_OPTION' | 'ALREADY_LISTENING' | 'STOPPED' | 'MESSAGE_TOO_BIG' | 'BARE_LINE_BREAK' | 'CONNECTION_LOST' | 'HOOK_TIMEOUT' | 'INVALID_HOOK_REPLY' | 'MESSAGE_NOT_READ' | 'CONNECTION_FAILED' | 'TIMEOUT' | 'BAD_REPLY' | 'REFUSED' | 'RECIPIENTS_REFUSED' | 'TLS_UNAVAILABLE' | 'TLS_FAILED' | 'AUTH_UNAVAILABLE' | 'EXTENSION_MISSING' | 'NULL_MX' | 'DNS_FAILED';
3
+ export type SmtpErrorCode = 'INVALID_OPTION' | 'ALREADY_LISTENING' | 'STOPPED' | 'MESSAGE_TOO_BIG' | 'BARE_LINE_BREAK' | 'NUL_BYTE' | 'CONNECTION_LOST' | 'HOOK_TIMEOUT' | 'INVALID_HOOK_REPLY' | 'MESSAGE_NOT_READ' | 'CONNECTION_FAILED' | 'TIMEOUT' | 'BAD_REPLY' | 'REFUSED' | 'RECIPIENTS_REFUSED' | 'TLS_UNAVAILABLE' | 'TLS_FAILED' | 'AUTH_UNAVAILABLE' | 'EXTENSION_MISSING' | 'NULL_MX' | 'DNS_FAILED';
4
4
  /** One recipient and the server's reply to its `RCPT TO`. */
5
5
  export interface RecipientReply {
6
6
  readonly recipient: string;
@@ -12,8 +12,13 @@ export interface SmtpErrorDetails {
12
12
  readonly temporary?: boolean;
13
13
  /** The server's reply that failed the delivery, enhanced status code included. */
14
14
  readonly reply?: Reply;
15
- /** With `RECIPIENTS_REFUSED`: each recipient, and why it was refused. */
15
+ /**
16
+ * With `RECIPIENTS_REFUSED`, or `afterData`: each recipient, and why it was
17
+ * refused at `RCPT TO`.
18
+ */
16
19
  readonly rejected?: readonly RecipientReply[];
20
+ /** With `afterData`: each recipient the server accepted at `RCPT TO`. */
21
+ readonly accepted?: readonly RecipientReply[];
17
22
  /** The error behind this one, as `Error`'s `cause`. */
18
23
  readonly cause?: unknown;
19
24
  /**
@@ -38,8 +43,17 @@ export declare class SmtpError extends Error {
38
43
  readonly temporary: boolean;
39
44
  /** The server reply behind a `sendMail` failure, enhanced status code included. */
40
45
  readonly reply?: Reply;
41
- /** With `RECIPIENTS_REFUSED`: each recipient, and the reply that refused it. */
46
+ /**
47
+ * With `RECIPIENTS_REFUSED`, or `afterData`: each recipient, and the reply
48
+ * that refused it at `RCPT TO`.
49
+ */
42
50
  readonly rejected?: readonly RecipientReply[];
51
+ /**
52
+ * With `afterData`: each recipient the server accepted at `RCPT TO`, and
53
+ * the reply that accepted it — the ones that may hold the message. Absent
54
+ * from an error of an older version; then every recipient is in doubt.
55
+ */
56
+ readonly accepted?: readonly RecipientReply[];
43
57
  /**
44
58
  * `true` when `sendMail` wrote the message's final dot and then got no
45
59
  * reply to it (a `TIMEOUT`, a `CONNECTION_LOST`, a `BAD_REPLY`): the
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,uGAAuG;AACvG,MAAM,MAAM,aAAa,GACtB,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,oBAAoB,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,SAAS,GACT,WAAW,GACX,SAAS,GACT,oBAAoB,GACpB,iBAAiB,GACjB,YAAY,GACZ,kBAAkB,GAClB,mBAAmB,GACnB,SAAS,GACT,YAAY,CAAC;AAEhB,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACtB;AAED,uFAAuF;AACvF,MAAM,WAAW,gBAAgB;IAChC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,uDAAuD;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B;AAYD;;;;;;;GAOG;AACH,qBAAa,SAAU,SAAQ,KAAK;IACnC,SAAkB,IAAI,eAAe;IACrC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;gBAG5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB;CAc/B"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,uGAAuG;AACvG,MAAM,MAAM,aAAa,GACtB,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,iBAAiB,GACjB,iBAAiB,GACjB,UAAU,GACV,iBAAiB,GACjB,cAAc,GACd,oBAAoB,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,SAAS,GACT,WAAW,GACX,SAAS,GACT,oBAAoB,GACpB,iBAAiB,GACjB,YAAY,GACZ,kBAAkB,GAClB,mBAAmB,GACnB,SAAS,GACT,YAAY,CAAC;AAEhB,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACtB;AAED,uFAAuF;AACvF,MAAM,WAAW,gBAAgB;IAChC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,uDAAuD;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B;AAYD;;;;;;;GAOG;AACH,qBAAa,SAAU,SAAQ,KAAK;IACnC,SAAkB,IAAI,eAAe;IACrC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;gBAG5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB;CAe/B"}
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  decodeLoginStep2,
8
8
  LineSplitter,
9
9
  Outgoing
10
- } from "./chunks/index-5228egp5.js";
10
+ } from "./chunks/index-wc25ywta.js";
11
11
  // src/protocol/command.ts
12
12
  function parseCommand(line) {
13
13
  const space = line.indexOf(" ");
@@ -533,12 +533,16 @@ function receivedField(connection, recipients, id, now = new Date) {
533
533
  // src/server/refusals.ts
534
534
  var TOO_BIG = reply(552, "5.3.4", "Message too big for system");
535
535
  var BARE_LINE_BREAK = reply(550, "5.6.11", "Bare CR or LF is not allowed in a message");
536
+ var NUL_BYTE = reply(554, "5.6.0", "Message holds a NUL byte");
536
537
  function tooBig(maxMessageSize) {
537
538
  return new SmtpError2("MESSAGE_TOO_BIG", `The message is larger than maxMessageSize (${maxMessageSize} bytes); do not deliver it`);
538
539
  }
539
540
  function bareLineBreak() {
540
541
  return new SmtpError2("BARE_LINE_BREAK", "The message holds a bare CR or LF (SMTP smuggling); do not deliver it");
541
542
  }
543
+ function nulByte() {
544
+ return new SmtpError2("NUL_BYTE", "The message holds a NUL byte; do not deliver it");
545
+ }
542
546
  function connectionLost(ended) {
543
547
  return new SmtpError2("CONNECTION_LOST", ended ? "The connection closed before the reply to the message; do not deliver it" : "The connection closed before the end of the message; do not deliver it");
544
548
  }
@@ -631,6 +635,8 @@ class Intake {
631
635
  this.#fail(TOO_BIG, tooBig(maxMessageSize));
632
636
  } else if (this.#reader.bareLineBreaks > 0) {
633
637
  this.#fail(BARE_LINE_BREAK, bareLineBreak());
638
+ } else if (data.includes(0)) {
639
+ this.#fail(NUL_BYTE, nulByte());
634
640
  } else if (this.#state === "open" && data.length > 0) {
635
641
  this.#push(data);
636
642
  await this.#room();
@@ -1946,5 +1952,5 @@ export {
1946
1952
  reply
1947
1953
  };
1948
1954
 
1949
- //# debugId=2DE3A3E5E10EAC4A64756E2164756E21
1955
+ //# debugId=9B356F51DEFD8FA364756E2164756E21
1950
1956
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -12,8 +12,8 @@
12
12
  "import { parsePathCommand } from '../protocol/command';\nimport { reply } from '../protocol/reply';\nimport type { Connection } from './connection';\nimport { LOCAL_ERROR } from './guard';\n\nfunction nonAscii(text: string): boolean {\n\tfor (let i = 0; i < text.length; i++)\n\t\tif (text.charCodeAt(i) > 0x7f) return true;\n\treturn false;\n}\n\n/** `MAIL FROM:<path> [SIZE=] [BODY=] [SMTPUTF8] [AUTH=]` (RFC 5321 §4.1.1.2). */\nexport async function mail(\n\tconnection: Connection,\n\targument: string,\n): Promise<void> {\n\tconst { state, settings } = connection;\n\tif (state.helo === undefined)\n\t\treturn connection.fail(reply(503, '5.5.1', 'Send EHLO first'));\n\tif (state.transaction.from !== undefined) {\n\t\treturn connection.fail(reply(503, '5.5.1', 'Nested MAIL command'));\n\t}\n\tif (settings.mode === 'submission' && state.user === undefined) {\n\t\treturn connection.fail(reply(530, '5.7.0', 'Authentication required'));\n\t}\n\tconst command = parsePathCommand(argument, 'FROM');\n\tif (!command)\n\t\treturn connection.fail(reply(501, '5.5.4', 'Syntax: MAIL FROM:<address>'));\n\tconst { path, parameters } = command;\n\tlet body: '7BIT' | '8BITMIME' = '7BIT';\n\tlet smtputf8 = false;\n\tfor (const [key, value] of Object.entries(parameters)) {\n\t\tif (!state.esmtp)\n\t\t\treturn connection.fail(reply(555, '5.5.4', `${key} needs EHLO`));\n\t\tif (key === 'SIZE') {\n\t\t\tif (!/^\\d+$/.test(value))\n\t\t\t\treturn connection.fail(reply(501, '5.5.4', 'Syntax: SIZE=<bytes>'));\n\t\t\tif (Number(value) > settings.maxMessageSize) {\n\t\t\t\treturn connection.fail(\n\t\t\t\t\treply(552, '5.3.4', 'Message too big for system'),\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (key === 'BODY') {\n\t\t\tconst kind = value.toUpperCase();\n\t\t\tif (kind !== '7BIT' && kind !== '8BITMIME') {\n\t\t\t\treturn connection.fail(reply(501, '5.5.4', 'BODY is 7BIT or 8BITMIME'));\n\t\t\t}\n\t\t\tbody = kind;\n\t\t} else if (key === 'SMTPUTF8' && value === '') {\n\t\t\tsmtputf8 = true;\n\t\t} else if (key === 'AUTH') {\n\t\t\t// RFC 4954 §5: the original submitter; taken and not passed on.\n\t\t} else {\n\t\t\treturn connection.fail(reply(555, '5.5.4', `${key} is not supported`));\n\t\t}\n\t}\n\tif (!smtputf8 && nonAscii(path.address)) {\n\t\treturn connection.fail(\n\t\t\treply(553, '5.6.7', 'A non-ASCII address needs SMTPUTF8'),\n\t\t);\n\t}\n\tconst options = settings.options;\n\tconst refused = options.onMailFrom\n\t\t? await connection.hook('onMailFrom', () =>\n\t\t\t\toptions.onMailFrom?.(path, connection.session),\n\t\t\t)\n\t\t: undefined;\n\tif (refused) return connection.send(refused);\n\tstate.transaction = { from: path.address, to: [], smtputf8, body };\n\tconnection.send(reply(250, '2.1.0', 'OK'));\n}\n\n/** `RCPT TO:<path>` (RFC 5321 §4.1.1.3), where relaying is refused without AUTH. */\nexport async function rcpt(\n\tconnection: Connection,\n\targument: string,\n): Promise<void> {\n\tconst { state, settings } = connection;\n\tif (state.transaction.from === undefined)\n\t\treturn connection.fail(reply(503, '5.5.1', 'Send MAIL first'));\n\tconst command = parsePathCommand(argument, 'TO');\n\tif (!command)\n\t\treturn connection.fail(reply(501, '5.5.4', 'Syntax: RCPT TO:<address>'));\n\tconst { path, parameters } = command;\n\tif (Object.keys(parameters).length > 0) {\n\t\treturn connection.fail(\n\t\t\treply(555, '5.5.4', `${Object.keys(parameters)[0]} is not supported`),\n\t\t);\n\t}\n\tif (!state.transaction.smtputf8 && nonAscii(path.address)) {\n\t\treturn connection.fail(\n\t\t\treply(553, '5.6.7', 'A non-ASCII address needs SMTPUTF8'),\n\t\t);\n\t}\n\tif (state.transaction.to.length >= settings.maxRecipients) {\n\t\treturn connection.send(reply(452, '4.5.3', 'Too many recipients'));\n\t}\n\t// Never an open relay: a domain this server does not host takes AUTH.\n\t// `<postmaster>` with no domain is this server's own (RFC 5321 §4.5.1).\n\tif (state.user === undefined && path.postmaster !== true) {\n\t\tconst local = await connection.check('localDomains', () =>\n\t\t\tsettings.isLocal(path.domain),\n\t\t);\n\t\tif (local.failed) return connection.send(LOCAL_ERROR);\n\t\tif (local.value !== true) {\n\t\t\treturn connection.fail(reply(554, '5.7.1', 'Relay access denied'));\n\t\t}\n\t}\n\tconst options = settings.options;\n\tconst refused = options.onRcptTo\n\t\t? await connection.hook('onRcptTo', () =>\n\t\t\t\toptions.onRcptTo?.(path, connection.session),\n\t\t\t)\n\t\t: undefined;\n\tif (refused) return connection.send(refused);\n\tstate.transaction.to.push(path.address);\n\tconnection.send(reply(250, '2.1.5', 'OK'));\n}\n",
13
13
  "import { parseCommand } from '../protocol/command';\nimport { isHelloName } from '../protocol/path';\nimport { reply } from '../protocol/reply';\nimport { authenticate, continueAuth } from './auth';\nimport type { Connection } from './connection';\nimport { emptyTransaction } from './state';\nimport { mail, rcpt } from './transaction';\n\nfunction ehloLines(connection: Connection): string[] {\n\tconst { settings, state } = connection;\n\tconst lines = [\n\t\t`${settings.options.hostname} greets ${state.helo}`,\n\t\t'PIPELINING',\n\t\t`SIZE ${settings.maxMessageSize}`,\n\t\t'8BITMIME',\n\t\t'SMTPUTF8',\n\t\t'ENHANCEDSTATUSCODES',\n\t];\n\tif (settings.options.tls && !state.secure) lines.push('STARTTLS');\n\tif (\n\t\tsettings.options.authenticate &&\n\t\tstate.secure &&\n\t\tstate.user === undefined\n\t) {\n\t\tlines.push('AUTH PLAIN LOGIN');\n\t}\n\treturn lines;\n}\n\nasync function hello(\n\tconnection: Connection,\n\targument: string,\n\tesmtp: boolean,\n): Promise<void> {\n\tif (!isHelloName(argument)) {\n\t\tconnection.fail(\n\t\t\treply(501, '5.5.4', `Syntax: ${esmtp ? 'EHLO' : 'HELO'} hostname`),\n\t\t);\n\t\treturn;\n\t}\n\tconst { state } = connection;\n\tstate.helo = argument;\n\tstate.esmtp = esmtp;\n\t// RFC 5321 §4.1.4: EHLO or HELO resets a transaction in progress.\n\tstate.transaction = emptyTransaction();\n\tconnection.send(\n\t\tesmtp\n\t\t\t? reply(250, undefined, ehloLines(connection))\n\t\t\t: reply(\n\t\t\t\t\t250,\n\t\t\t\t\tundefined,\n\t\t\t\t\t`${connection.settings.options.hostname} greets ${argument}`,\n\t\t\t\t),\n\t);\n}\n\nfunction data(connection: Connection, argument: string): void {\n\tconst { state } = connection;\n\tconst refusal =\n\t\targument !== ''\n\t\t\t? reply(501, '5.5.4', 'Syntax: DATA')\n\t\t\t: state.transaction.from === undefined\n\t\t\t\t? reply(503, '5.5.1', 'Send MAIL first')\n\t\t\t\t: state.transaction.to.length === 0\n\t\t\t\t\t? reply(554, '5.5.1', 'No valid recipients')\n\t\t\t\t\t: undefined;\n\tif (refusal) {\n\t\tconnection.fail(refusal);\n\t\t// What the client pipelined after a refused DATA is message content,\n\t\t// not commands: running it would let a message smuggle commands in.\n\t\tconnection.input.drop();\n\t\treturn;\n\t}\n\tconnection.send(reply(354, undefined, 'End data with <CR><LF>.<CR><LF>'));\n\tconnection.input.beginData();\n}\n\nasync function startTls(\n\tconnection: Connection,\n\targument: string,\n): Promise<void> {\n\tconst { state, settings } = connection;\n\tconst refusal = !settings.options.tls\n\t\t? reply(454, '4.7.0', 'TLS not available')\n\t\t: state.secure\n\t\t\t? reply(503, '5.5.1', 'TLS already active')\n\t\t\t: argument !== ''\n\t\t\t\t? reply(501, '5.5.4', 'Syntax: STARTTLS')\n\t\t\t\t: undefined;\n\tif (refusal) {\n\t\tconnection.fail(refusal);\n\t\treturn;\n\t}\n\tconnection.send(reply(220, '2.0.0', 'Ready to start TLS'));\n\tconnection.input.ignore();\n\t// The 220 must reach the client in clear before the handshake starts.\n\tawait connection.transport.drained();\n\tif (connection.closed) return;\n\tconnection.transport.startTls();\n\tconnection.input.accept();\n\t// RFC 3207 §4.2: everything learnt before TLS is forgotten.\n\tstate.secure = true;\n\tstate.helo = undefined;\n\tstate.esmtp = false;\n\tstate.transaction = emptyTransaction();\n}\n\n/** Runs one command line, or the client's answer to an AUTH challenge. */\nexport async function runCommand(\n\tconnection: Connection,\n\tline: string,\n): Promise<void> {\n\tconst { state } = connection;\n\tif (state.waiting !== 'command') return continueAuth(connection, line);\n\tconst { verb, argument } = parseCommand(line);\n\tswitch (verb) {\n\t\tcase 'EHLO':\n\t\t\treturn hello(connection, argument, true);\n\t\tcase 'HELO':\n\t\t\treturn hello(connection, argument, false);\n\t\tcase 'MAIL':\n\t\t\treturn mail(connection, argument);\n\t\tcase 'RCPT':\n\t\t\treturn rcpt(connection, argument);\n\t\tcase 'DATA':\n\t\t\treturn data(connection, argument);\n\t\tcase 'RSET':\n\t\t\tstate.transaction = emptyTransaction();\n\t\t\treturn connection.send(reply(250, '2.0.0', 'OK'));\n\t\tcase 'NOOP':\n\t\t\treturn connection.send(reply(250, '2.0.0', 'OK'));\n\t\tcase 'VRFY':\n\t\t\treturn connection.send(\n\t\t\t\treply(\n\t\t\t\t\t252,\n\t\t\t\t\t'2.5.0',\n\t\t\t\t\t'Cannot VRFY user; send the message and it will be tried',\n\t\t\t\t),\n\t\t\t);\n\t\tcase 'HELP':\n\t\t\treturn connection.send(reply(214, '2.0.0', 'See RFC 5321'));\n\t\tcase 'QUIT':\n\t\t\treturn connection.quit(\n\t\t\t\treply(\n\t\t\t\t\t221,\n\t\t\t\t\t'2.0.0',\n\t\t\t\t\t`${connection.settings.options.hostname} closing connection`,\n\t\t\t\t),\n\t\t\t);\n\t\tcase 'STARTTLS':\n\t\t\treturn startTls(connection, argument);\n\t\tcase 'AUTH':\n\t\t\treturn authenticate(connection, argument);\n\t\tdefault:\n\t\t\treturn connection.fail(reply(500, '5.5.2', 'Command unrecognized'));\n\t}\n}\n",
14
14
  "import { isIPv6 } from 'node:net';\nimport type { Connection } from './connection';\n\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n\t'Jan',\n\t'Feb',\n\t'Mar',\n\t'Apr',\n\t'May',\n\t'Jun',\n\t'Jul',\n\t'Aug',\n\t'Sep',\n\t'Oct',\n\t'Nov',\n\t'Dec',\n];\n\nconst two = (n: number) => String(n).padStart(2, '0');\n\n/** An RFC 5322 §3.3 date-time, in UTC. */\nexport function dateTime(date: Date): string {\n\treturn `${DAYS[date.getUTCDay()]}, ${date.getUTCDate()} ${MONTHS[date.getUTCMonth()]} ${date.getUTCFullYear()} ${two(date.getUTCHours())}:${two(date.getUTCMinutes())}:${two(date.getUTCSeconds())} +0000`;\n}\n\n/** RFC 3848: how the message came — SMTP, ESMTP, then S for TLS and A for AUTH. */\nexport function protocolOf(\n\tesmtp: boolean,\n\tsecure: boolean,\n\tauthenticated: boolean,\n): string {\n\tif (!esmtp) return 'SMTP';\n\treturn `ESMTP${secure ? 'S' : ''}${authenticated ? 'A' : ''}`;\n}\n\n/** The client's address as a domain literal (RFC 5321 §4.1.3): an IPv6 address is tagged `IPv6:`. */\nexport function addressLiteral(address: string): string {\n\t// A zone (`fe80::1%en0`) names an interface of this host: not part of the literal.\n\tconst bare = address.replace(/%.*$/, '');\n\treturn isIPv6(bare) ? `IPv6:${bare}` : printable(address);\n}\n\n/** Keeps a client-given name printable in a header: anything else becomes `?`. */\nfunction printable(text: string): string {\n\tlet out = '';\n\tfor (const char of text) {\n\t\tconst code = char.charCodeAt(0);\n\t\tout += code > 0x20 && code < 0x7f ? char : '?';\n\t}\n\treturn out;\n}\n\n/** Whether an address can go into the `for` clause as it is: printable, and no `;` to end the clause early. */\nfunction plain(address: string): boolean {\n\treturn printable(address) === address && !address.includes(';');\n}\n\n/**\n * The Received field the server puts on top (RFC 5321 §4.4): who sent the\n * message, from where, how, to whom when there is one recipient, and when.\n */\nexport function receivedField(\n\tconnection: Connection,\n\trecipients: readonly string[],\n\tid: string,\n\tnow = new Date(),\n): string {\n\tconst { state, transport, settings } = connection;\n\tconst lines = [\n\t\t`Received: from ${printable(state.helo ?? 'unknown')} ([${addressLiteral(transport.remoteAddress)}])`,\n\t\t`\\tby ${settings.options.hostname} with ${protocolOf(state.esmtp, state.secure, state.user !== undefined)} id ${id}`,\n\t];\n\tconst [recipient] = recipients;\n\tif (recipients.length === 1 && recipient !== undefined && plain(recipient)) {\n\t\tlines.push(`\\tfor <${recipient}>`);\n\t}\n\tlines[lines.length - 1] += `; ${dateTime(now)}`;\n\treturn `${lines.join('\\r\\n')}\\r\\n`;\n}\n",
15
- "import { SmtpError } from '../errors';\nimport { reply } from '../protocol/reply';\n\n/** Why a message on its way in is refused, as the reply and the error `onData` and `onError` see. */\n\nexport const TOO_BIG = reply(552, '5.3.4', 'Message too big for system');\n\nexport const BARE_LINE_BREAK = reply(\n\t550,\n\t'5.6.11',\n\t'Bare CR or LF is not allowed in a message',\n);\n\nexport function tooBig(maxMessageSize: number): SmtpError {\n\treturn new SmtpError(\n\t\t'MESSAGE_TOO_BIG',\n\t\t`The message is larger than maxMessageSize (${maxMessageSize} bytes); do not deliver it`,\n\t);\n}\n\n/** A bare CR or LF is how SMTP smuggling hides a second message. */\nexport function bareLineBreak(): SmtpError {\n\treturn new SmtpError(\n\t\t'BARE_LINE_BREAK',\n\t\t'The message holds a bare CR or LF (SMTP smuggling); do not deliver it',\n\t);\n}\n\n/**\n * The connection closed mid-message, or after its end but before the reply:\n * the client hung up, or the server closed it (idle timeout, socket error).\n */\nexport function connectionLost(ended: boolean): SmtpError {\n\treturn new SmtpError(\n\t\t'CONNECTION_LOST',\n\t\tended\n\t\t\t? 'The connection closed before the reply to the message; do not deliver it'\n\t\t\t: 'The connection closed before the end of the message; do not deliver it',\n\t);\n}\n\nexport function notAnswered(seconds: number): SmtpError {\n\treturn new SmtpError(\n\t\t'HOOK_TIMEOUT',\n\t\t`onData did not answer within hookTimeout (${seconds} s); do not deliver it`,\n\t);\n}\n\nexport function notReadInTime(seconds: number): SmtpError {\n\treturn new SmtpError(\n\t\t'HOOK_TIMEOUT',\n\t\t`onData did not read the message within hookTimeout (${seconds} s); do not deliver it`,\n\t);\n}\n\nexport function notRead(): SmtpError {\n\treturn new SmtpError(\n\t\t'MESSAGE_NOT_READ',\n\t\t'onData answered without reading the message to its end; it was not taken',\n\t);\n}\n",
16
- "import type { SmtpError } from '../errors';\nimport { DataReader } from '../protocol/data';\nimport { type Reply, reply } from '../protocol/reply';\nimport type { Connection } from './connection';\nimport { hookTimeout, LOCAL_ERROR, refusalOf, timedOut, within } from './guard';\nimport type { ReceivedMessage } from './options';\nimport { receivedField } from './received';\nimport {\n\tBARE_LINE_BREAK,\n\tbareLineBreak,\n\tconnectionLost,\n\tnotAnswered,\n\tnotRead,\n\tnotReadInTime,\n\tTOO_BIG,\n\ttooBig,\n} from './refusals';\nimport type { Transaction } from './state';\n\n/** Bytes of message held for `onData` before the server stops reading the client. */\nconst HIGH_WATER_MARK = 64 * 1024;\n\n/**\n * One message on its way in: the content of DATA, unstuffed, fed to\n * `onData` as a stream while the client sends it. At most\n * `HIGH_WATER_MARK` bytes wait to be read; past that the server waits for\n * `onData` to read, and so stops reading the client.\n *\n * The stream ends in an `SmtpError` when the message must not be\n * delivered, and the reply to DATA is then that refusal, whatever `onData`\n * answered. The 250 goes out only when `onData` read the stream to its\n * clean end and accepted; a stream left unread errors with\n * `MESSAGE_NOT_READ`. When the message's `signal` aborts is set out on\n * `ReceivedMessage.signal`.\n */\nexport class Intake {\n\treadonly id = crypto.getRandomValues(new Uint8Array(10)).toHex();\n\treadonly #connection: Connection;\n\treadonly #reader = new DataReader();\n\t#controller!: ReadableStreamDefaultController<Uint8Array>;\n\t/** What waits for `onData` to pull. */\n\t#queue: Uint8Array[] = [];\n\t#queued = 0;\n\t/** The end of DATA came, cleanly. */\n\t#ended = false;\n\t/** `onData` pulled the last byte and saw the stream close. */\n\t#read = false;\n\t#state: 'open' | 'closed' | 'errored' | 'cancelled' = 'open';\n\t#failure: Reply | undefined;\n\t#wakers: (() => void)[] = [];\n\treadonly #delivery: Promise<Reply | undefined>;\n\t/** Whether `onData` had read to the end when it answered. */\n\t#readWhenAnswered = false;\n\t/** Aborts when the server refuses the message after `onData` had it. */\n\treadonly #refusal = new AbortController();\n\n\tconstructor(connection: Connection, transaction: Transaction) {\n\t\tthis.#connection = connection;\n\t\t// High-water mark 0: a byte leaves the queue only when onData asks\n\t\t// for it, so the server knows whether it read to the end.\n\t\tconst content = new ReadableStream<Uint8Array>(\n\t\t\t{\n\t\t\t\tstart: (controller) => {\n\t\t\t\t\tthis.#controller = controller;\n\t\t\t\t},\n\t\t\t\tpull: (controller) => this.#pull(controller),\n\t\t\t\tcancel: () => {\n\t\t\t\t\tif (this.#state === 'open') this.#state = 'cancelled';\n\t\t\t\t\tthis.#queue = [];\n\t\t\t\t\tthis.#queued = 0;\n\t\t\t\t\tthis.#wake();\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ highWaterMark: 0 },\n\t\t);\n\t\tthis.#push(\n\t\t\tnew TextEncoder().encode(\n\t\t\t\treceivedField(connection, transaction.to, this.id),\n\t\t\t),\n\t\t);\n\t\tconst message: ReceivedMessage = {\n\t\t\tid: this.id,\n\t\t\tenvelope: {\n\t\t\t\tfrom: transaction.from ?? '',\n\t\t\t\tto: [...transaction.to],\n\t\t\t\tsmtputf8: transaction.smtputf8,\n\t\t\t\tbody: transaction.body,\n\t\t\t},\n\t\t\tcontent,\n\t\t\tsignal: this.#refusal.signal,\n\t\t};\n\t\tthis.#delivery = this.#deliver(message);\n\t}\n\n\t/**\n\t * `onData`'s answer as the reply: `undefined`, its refusal, or 451 when\n\t * it threw or answered what is not a refusal — which also aborts the\n\t * signal, since the message was not taken.\n\t */\n\tasync #deliver(message: ReceivedMessage): Promise<Reply | undefined> {\n\t\tconst connection = this.#connection;\n\t\t/** onData refused the message itself, with a valid 4xx or 5xx reply. */\n\t\tlet ownRefusal = false;\n\t\tconst refuse = (error: unknown) => {\n\t\t\tthis.#refusal.abort(error);\n\t\t\tconnection.report(error);\n\t\t};\n\t\ttry {\n\t\t\t// Keeps onData starting after Input has set up the transaction, as\n\t\t\t// connection.hook did; nothing observable depends on it today.\n\t\t\tawait Promise.resolve();\n\t\t\tconst answer = await connection.settings.options.onData(\n\t\t\t\tmessage,\n\t\t\t\tconnection.session,\n\t\t\t);\n\t\t\tconst refusal = refusalOf('onData', answer, refuse);\n\t\t\townRefusal = refusal !== undefined && refusal === answer;\n\t\t\treturn refusal;\n\t\t} catch (error) {\n\t\t\trefuse(error);\n\t\t\treturn LOCAL_ERROR;\n\t\t} finally {\n\t\t\tthis.#readWhenAnswered = this.#read;\n\t\t\t// Answered before the end: a reader left running must not reach a\n\t\t\t// clean end. The signal aborts only if the server refuses for it.\n\t\t\tif (!this.#read) this.#stop(!ownRefusal);\n\t\t\tthis.#wake();\n\t\t}\n\t}\n\n\t/** A chunk of DATA; resolves once there is room for the next. */\n\tasync write(chunk: Uint8Array): Promise<{ done: boolean; rest: Uint8Array }> {\n\t\tconst { data, done, rest } = this.#reader.write(chunk);\n\t\tconst { maxMessageSize } = this.#connection.settings;\n\t\tif (this.#failure) return { done, rest };\n\t\tif (this.#reader.size > maxMessageSize) {\n\t\t\tthis.#fail(TOO_BIG, tooBig(maxMessageSize));\n\t\t} else if (this.#reader.bareLineBreaks > 0) {\n\t\t\t// A bare CR or LF is how SMTP smuggling hides a second message.\n\t\t\tthis.#fail(BARE_LINE_BREAK, bareLineBreak());\n\t\t} else if (this.#state === 'open' && data.length > 0) {\n\t\t\tthis.#push(data);\n\t\t\tawait this.#room();\n\t\t}\n\t\treturn { done, rest };\n\t}\n\n\t/** The end of DATA: the reply to send. */\n\tasync finish(): Promise<Reply> {\n\t\tif (this.#failure) return this.#failure;\n\t\tthis.#ended = true;\n\t\tthis.#wake();\n\t\tconst { hookTimeout: seconds } = this.#connection.settings;\n\t\tconst answer = await within(this.#delivery, seconds);\n\t\tif (timedOut(answer)) {\n\t\t\tthis.#connection.report(hookTimeout('onData', seconds));\n\t\t\t// The client is told 451 and will try again: a late read must not\n\t\t\t// take it, and a read already finished learns it through the signal.\n\t\t\tthis.#fail(LOCAL_ERROR, notAnswered(seconds));\n\t\t\treturn LOCAL_ERROR;\n\t\t}\n\t\tif (answer) return answer;\n\t\tif (!this.#readWhenAnswered) {\n\t\t\tconst error = notRead();\n\t\t\tthis.#refusal.abort(error);\n\t\t\tthis.#connection.report(error);\n\t\t\treturn LOCAL_ERROR;\n\t\t}\n\t\treturn reply(250, '2.0.0', `OK queued as ${this.id}`);\n\t}\n\n\t/** The connection closed, mid-message or before the reply was sent. */\n\tabort(): void {\n\t\tthis.#fail(LOCAL_ERROR, connectionLost(this.#ended));\n\t}\n\n\t#push(bytes: Uint8Array): void {\n\t\tthis.#queue.push(bytes);\n\t\tthis.#queued += bytes.length;\n\t\tthis.#wake();\n\t}\n\n\t/** onData asks for more: the next chunk, the end, or a wait for either. */\n\tasync #pull(\n\t\tcontroller: ReadableStreamDefaultController<Uint8Array>,\n\t): Promise<void> {\n\t\tfor (;;) {\n\t\t\tif (this.#state !== 'open') return;\n\t\t\tconst next = this.#queue.shift();\n\t\t\tif (next) {\n\t\t\t\tthis.#queued -= next.length;\n\t\t\t\tcontroller.enqueue(next);\n\t\t\t\tthis.#wake();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.#ended) {\n\t\t\t\tthis.#read = true;\n\t\t\t\tthis.#state = 'closed';\n\t\t\t\tcontroller.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait new Promise<void>((wake) => this.#wakers.push(wake));\n\t\t}\n\t}\n\n\t/**\n\t * onData answered without reading to the end: the stream errors, and\n\t * takes no more. The signal aborts too, unless onData refused itself.\n\t */\n\t#stop(abortSignal: boolean): void {\n\t\tif (this.#state !== 'open') return;\n\t\tconst error = notRead();\n\t\tif (abortSignal) this.#refusal.abort(error);\n\t\tthis.#controller.error(error);\n\t\tthis.#state = 'cancelled';\n\t\tthis.#queue = [];\n\t\tthis.#queued = 0;\n\t}\n\n\t#fail(answer: Reply, error: SmtpError): void {\n\t\tthis.#failure ??= answer;\n\t\tthis.#refusal.abort(error);\n\t\tif (this.#state === 'open') this.#controller.error(error);\n\t\tthis.#state = 'errored';\n\t\tthis.#queue = [];\n\t\tthis.#queued = 0;\n\t\tthis.#wake();\n\t}\n\n\t/** Waits while the queue is full; gives up on an `onData` that stopped reading. */\n\tasync #room(): Promise<void> {\n\t\tconst { hookTimeout: seconds } = this.#connection.settings;\n\t\twhile (this.#state === 'open' && this.#queued > HIGH_WATER_MARK) {\n\t\t\tconst woken = await within(\n\t\t\t\tnew Promise<void>((wake) => this.#wakers.push(wake)),\n\t\t\t\tseconds,\n\t\t\t);\n\t\t\tif (timedOut(woken)) {\n\t\t\t\tthis.#connection.report(hookTimeout('onData', seconds));\n\t\t\t\tthis.#fail(LOCAL_ERROR, notReadInTime(seconds));\n\t\t\t}\n\t\t}\n\t}\n\n\t#wake(): void {\n\t\tfor (const wake of this.#wakers.splice(0)) wake();\n\t}\n}\n",
15
+ "import { SmtpError } from '../errors';\nimport { reply } from '../protocol/reply';\n\n/** Why a message on its way in is refused, as the reply and the error `onData` and `onError` see. */\n\nexport const TOO_BIG = reply(552, '5.3.4', 'Message too big for system');\n\nexport const BARE_LINE_BREAK = reply(\n\t550,\n\t'5.6.11',\n\t'Bare CR or LF is not allowed in a message',\n);\n\nexport const NUL_BYTE = reply(554, '5.6.0', 'Message holds a NUL byte');\n\nexport function tooBig(maxMessageSize: number): SmtpError {\n\treturn new SmtpError(\n\t\t'MESSAGE_TOO_BIG',\n\t\t`The message is larger than maxMessageSize (${maxMessageSize} bytes); do not deliver it`,\n\t);\n}\n\n/** A bare CR or LF is how SMTP smuggling hides a second message. */\nexport function bareLineBreak(): SmtpError {\n\treturn new SmtpError(\n\t\t'BARE_LINE_BREAK',\n\t\t'The message holds a bare CR or LF (SMTP smuggling); do not deliver it',\n\t);\n}\n\n/** The server does not advertise BINARYMIME, so a NUL is not valid in a message. */\nexport function nulByte(): SmtpError {\n\treturn new SmtpError(\n\t\t'NUL_BYTE',\n\t\t'The message holds a NUL byte; do not deliver it',\n\t);\n}\n\n/**\n * The connection closed mid-message, or after its end but before the reply:\n * the client hung up, or the server closed it (idle timeout, socket error).\n */\nexport function connectionLost(ended: boolean): SmtpError {\n\treturn new SmtpError(\n\t\t'CONNECTION_LOST',\n\t\tended\n\t\t\t? 'The connection closed before the reply to the message; do not deliver it'\n\t\t\t: 'The connection closed before the end of the message; do not deliver it',\n\t);\n}\n\nexport function notAnswered(seconds: number): SmtpError {\n\treturn new SmtpError(\n\t\t'HOOK_TIMEOUT',\n\t\t`onData did not answer within hookTimeout (${seconds} s); do not deliver it`,\n\t);\n}\n\nexport function notReadInTime(seconds: number): SmtpError {\n\treturn new SmtpError(\n\t\t'HOOK_TIMEOUT',\n\t\t`onData did not read the message within hookTimeout (${seconds} s); do not deliver it`,\n\t);\n}\n\nexport function notRead(): SmtpError {\n\treturn new SmtpError(\n\t\t'MESSAGE_NOT_READ',\n\t\t'onData answered without reading the message to its end; it was not taken',\n\t);\n}\n",
16
+ "import type { SmtpError } from '../errors';\nimport { DataReader } from '../protocol/data';\nimport { type Reply, reply } from '../protocol/reply';\nimport type { Connection } from './connection';\nimport { hookTimeout, LOCAL_ERROR, refusalOf, timedOut, within } from './guard';\nimport type { ReceivedMessage } from './options';\nimport { receivedField } from './received';\nimport {\n\tBARE_LINE_BREAK,\n\tbareLineBreak,\n\tconnectionLost,\n\tNUL_BYTE,\n\tnotAnswered,\n\tnotRead,\n\tnotReadInTime,\n\tnulByte,\n\tTOO_BIG,\n\ttooBig,\n} from './refusals';\nimport type { Transaction } from './state';\n\n/** Bytes of message held for `onData` before the server stops reading the client. */\nconst HIGH_WATER_MARK = 64 * 1024;\n\n/**\n * One message on its way in: the content of DATA, unstuffed, fed to\n * `onData` as a stream while the client sends it. At most\n * `HIGH_WATER_MARK` bytes wait to be read; past that the server waits for\n * `onData` to read, and so stops reading the client.\n *\n * The stream ends in an `SmtpError` when the message must not be\n * delivered, and the reply to DATA is then that refusal, whatever `onData`\n * answered. The 250 goes out only when `onData` read the stream to its\n * clean end and accepted; a stream left unread errors with\n * `MESSAGE_NOT_READ`. When the message's `signal` aborts is set out on\n * `ReceivedMessage.signal`.\n */\nexport class Intake {\n\treadonly id = crypto.getRandomValues(new Uint8Array(10)).toHex();\n\treadonly #connection: Connection;\n\treadonly #reader = new DataReader();\n\t#controller!: ReadableStreamDefaultController<Uint8Array>;\n\t/** What waits for `onData` to pull. */\n\t#queue: Uint8Array[] = [];\n\t#queued = 0;\n\t/** The end of DATA came, cleanly. */\n\t#ended = false;\n\t/** `onData` pulled the last byte and saw the stream close. */\n\t#read = false;\n\t#state: 'open' | 'closed' | 'errored' | 'cancelled' = 'open';\n\t#failure: Reply | undefined;\n\t#wakers: (() => void)[] = [];\n\treadonly #delivery: Promise<Reply | undefined>;\n\t/** Whether `onData` had read to the end when it answered. */\n\t#readWhenAnswered = false;\n\t/** Aborts when the server refuses the message after `onData` had it. */\n\treadonly #refusal = new AbortController();\n\n\tconstructor(connection: Connection, transaction: Transaction) {\n\t\tthis.#connection = connection;\n\t\t// High-water mark 0: a byte leaves the queue only when onData asks\n\t\t// for it, so the server knows whether it read to the end.\n\t\tconst content = new ReadableStream<Uint8Array>(\n\t\t\t{\n\t\t\t\tstart: (controller) => {\n\t\t\t\t\tthis.#controller = controller;\n\t\t\t\t},\n\t\t\t\tpull: (controller) => this.#pull(controller),\n\t\t\t\tcancel: () => {\n\t\t\t\t\tif (this.#state === 'open') this.#state = 'cancelled';\n\t\t\t\t\tthis.#queue = [];\n\t\t\t\t\tthis.#queued = 0;\n\t\t\t\t\tthis.#wake();\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ highWaterMark: 0 },\n\t\t);\n\t\tthis.#push(\n\t\t\tnew TextEncoder().encode(\n\t\t\t\treceivedField(connection, transaction.to, this.id),\n\t\t\t),\n\t\t);\n\t\tconst message: ReceivedMessage = {\n\t\t\tid: this.id,\n\t\t\tenvelope: {\n\t\t\t\tfrom: transaction.from ?? '',\n\t\t\t\tto: [...transaction.to],\n\t\t\t\tsmtputf8: transaction.smtputf8,\n\t\t\t\tbody: transaction.body,\n\t\t\t},\n\t\t\tcontent,\n\t\t\tsignal: this.#refusal.signal,\n\t\t};\n\t\tthis.#delivery = this.#deliver(message);\n\t}\n\n\t/**\n\t * `onData`'s answer as the reply: `undefined`, its refusal, or 451 when\n\t * it threw or answered what is not a refusal — which also aborts the\n\t * signal, since the message was not taken.\n\t */\n\tasync #deliver(message: ReceivedMessage): Promise<Reply | undefined> {\n\t\tconst connection = this.#connection;\n\t\t/** onData refused the message itself, with a valid 4xx or 5xx reply. */\n\t\tlet ownRefusal = false;\n\t\tconst refuse = (error: unknown) => {\n\t\t\tthis.#refusal.abort(error);\n\t\t\tconnection.report(error);\n\t\t};\n\t\ttry {\n\t\t\t// Keeps onData starting after Input has set up the transaction, as\n\t\t\t// connection.hook did; nothing observable depends on it today.\n\t\t\tawait Promise.resolve();\n\t\t\tconst answer = await connection.settings.options.onData(\n\t\t\t\tmessage,\n\t\t\t\tconnection.session,\n\t\t\t);\n\t\t\tconst refusal = refusalOf('onData', answer, refuse);\n\t\t\townRefusal = refusal !== undefined && refusal === answer;\n\t\t\treturn refusal;\n\t\t} catch (error) {\n\t\t\trefuse(error);\n\t\t\treturn LOCAL_ERROR;\n\t\t} finally {\n\t\t\tthis.#readWhenAnswered = this.#read;\n\t\t\t// Answered before the end: a reader left running must not reach a\n\t\t\t// clean end. The signal aborts only if the server refuses for it.\n\t\t\tif (!this.#read) this.#stop(!ownRefusal);\n\t\t\tthis.#wake();\n\t\t}\n\t}\n\n\t/** A chunk of DATA; resolves once there is room for the next. */\n\tasync write(chunk: Uint8Array): Promise<{ done: boolean; rest: Uint8Array }> {\n\t\tconst { data, done, rest } = this.#reader.write(chunk);\n\t\tconst { maxMessageSize } = this.#connection.settings;\n\t\tif (this.#failure) return { done, rest };\n\t\tif (this.#reader.size > maxMessageSize) {\n\t\t\tthis.#fail(TOO_BIG, tooBig(maxMessageSize));\n\t\t} else if (this.#reader.bareLineBreaks > 0) {\n\t\t\t// A bare CR or LF is how SMTP smuggling hides a second message.\n\t\t\tthis.#fail(BARE_LINE_BREAK, bareLineBreak());\n\t\t} else if (data.includes(0)) {\n\t\t\t// Not BINARYMIME: IMAP could not hold the message in a plain literal.\n\t\t\tthis.#fail(NUL_BYTE, nulByte());\n\t\t} else if (this.#state === 'open' && data.length > 0) {\n\t\t\tthis.#push(data);\n\t\t\tawait this.#room();\n\t\t}\n\t\treturn { done, rest };\n\t}\n\n\t/** The end of DATA: the reply to send. */\n\tasync finish(): Promise<Reply> {\n\t\tif (this.#failure) return this.#failure;\n\t\tthis.#ended = true;\n\t\tthis.#wake();\n\t\tconst { hookTimeout: seconds } = this.#connection.settings;\n\t\tconst answer = await within(this.#delivery, seconds);\n\t\tif (timedOut(answer)) {\n\t\t\tthis.#connection.report(hookTimeout('onData', seconds));\n\t\t\t// The client is told 451 and will try again: a late read must not\n\t\t\t// take it, and a read already finished learns it through the signal.\n\t\t\tthis.#fail(LOCAL_ERROR, notAnswered(seconds));\n\t\t\treturn LOCAL_ERROR;\n\t\t}\n\t\tif (answer) return answer;\n\t\tif (!this.#readWhenAnswered) {\n\t\t\tconst error = notRead();\n\t\t\tthis.#refusal.abort(error);\n\t\t\tthis.#connection.report(error);\n\t\t\treturn LOCAL_ERROR;\n\t\t}\n\t\treturn reply(250, '2.0.0', `OK queued as ${this.id}`);\n\t}\n\n\t/** The connection closed, mid-message or before the reply was sent. */\n\tabort(): void {\n\t\tthis.#fail(LOCAL_ERROR, connectionLost(this.#ended));\n\t}\n\n\t#push(bytes: Uint8Array): void {\n\t\tthis.#queue.push(bytes);\n\t\tthis.#queued += bytes.length;\n\t\tthis.#wake();\n\t}\n\n\t/** onData asks for more: the next chunk, the end, or a wait for either. */\n\tasync #pull(\n\t\tcontroller: ReadableStreamDefaultController<Uint8Array>,\n\t): Promise<void> {\n\t\tfor (;;) {\n\t\t\tif (this.#state !== 'open') return;\n\t\t\tconst next = this.#queue.shift();\n\t\t\tif (next) {\n\t\t\t\tthis.#queued -= next.length;\n\t\t\t\tcontroller.enqueue(next);\n\t\t\t\tthis.#wake();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.#ended) {\n\t\t\t\tthis.#read = true;\n\t\t\t\tthis.#state = 'closed';\n\t\t\t\tcontroller.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait new Promise<void>((wake) => this.#wakers.push(wake));\n\t\t}\n\t}\n\n\t/**\n\t * onData answered without reading to the end: the stream errors, and\n\t * takes no more. The signal aborts too, unless onData refused itself.\n\t */\n\t#stop(abortSignal: boolean): void {\n\t\tif (this.#state !== 'open') return;\n\t\tconst error = notRead();\n\t\tif (abortSignal) this.#refusal.abort(error);\n\t\tthis.#controller.error(error);\n\t\tthis.#state = 'cancelled';\n\t\tthis.#queue = [];\n\t\tthis.#queued = 0;\n\t}\n\n\t#fail(answer: Reply, error: SmtpError): void {\n\t\tthis.#failure ??= answer;\n\t\tthis.#refusal.abort(error);\n\t\tif (this.#state === 'open') this.#controller.error(error);\n\t\tthis.#state = 'errored';\n\t\tthis.#queue = [];\n\t\tthis.#queued = 0;\n\t\tthis.#wake();\n\t}\n\n\t/** Waits while the queue is full; gives up on an `onData` that stopped reading. */\n\tasync #room(): Promise<void> {\n\t\tconst { hookTimeout: seconds } = this.#connection.settings;\n\t\twhile (this.#state === 'open' && this.#queued > HIGH_WATER_MARK) {\n\t\t\tconst woken = await within(\n\t\t\t\tnew Promise<void>((wake) => this.#wakers.push(wake)),\n\t\t\t\tseconds,\n\t\t\t);\n\t\t\tif (timedOut(woken)) {\n\t\t\t\tthis.#connection.report(hookTimeout('onData', seconds));\n\t\t\t\tthis.#fail(LOCAL_ERROR, notReadInTime(seconds));\n\t\t\t}\n\t\t}\n\t}\n\n\t#wake(): void {\n\t\tfor (const wake of this.#wakers.splice(0)) wake();\n\t}\n}\n",
17
17
  "import { LineSplitter } from '../protocol/lines';\nimport { reply } from '../protocol/reply';\nimport { runCommand } from './commands';\nimport type { Connection } from './connection';\nimport { Intake } from './intake';\nimport { emptyTransaction } from './state';\n\n/** Bytes waiting to be read past which the server stops reading the client. */\nconst INPUT_LIMIT = 64 * 1024;\n\n/**\n * What a client sends, read in order: command lines one at a time, each\n * answered before the next runs, and the message after DATA. It holds a\n * bounded amount: past `INPUT_LIMIT` waiting bytes it pauses the socket,\n * and it waits for the replies to leave before reading on.\n */\nexport class Input {\n\treadonly #connection: Connection;\n\t#input: Uint8Array[] = [];\n\t#queued = 0;\n\t#paused = false;\n\treadonly #lines = new LineSplitter();\n\t#intake: Intake | undefined;\n\t/** A message whole, while `onData` answers it and before the reply is sent. */\n\t#answering: Intake | undefined;\n\t/** The work in progress on what the client sent; settled when all of it is answered. */\n\t#pumping: Promise<void> | undefined;\n\t/** The 220 went out: input before it breaks RFC 5321 §4.3.1. */\n\t#greeted = false;\n\t/** The client talked before the greeting. */\n\tearly = false;\n\t/** Set while the 220 to STARTTLS leaves: clear text then is never read. */\n\t#ignoring = false;\n\t/** Set by `drop`: the line loop drops what it still holds. */\n\t#dropped = false;\n\n\tconstructor(connection: Connection) {\n\t\tthis.#connection = connection;\n\t}\n\n\tgreeted(): void {\n\t\tthis.#greeted = true;\n\t}\n\n\treceive(chunk: Uint8Array): void {\n\t\tif (this.#ignoring) return;\n\t\tif (!this.#greeted) {\n\t\t\tthis.early = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.#input.push(chunk.slice());\n\t\tthis.#queued += chunk.length;\n\t\tif (this.#queued > INPUT_LIMIT && !this.#paused) {\n\t\t\tthis.#paused = true;\n\t\t\tthis.#connection.transport.pause();\n\t\t}\n\t\tthis.#kick();\n\t}\n\n\t/** The connection closed: a message on its way in must not be delivered. */\n\tabort(): void {\n\t\tthis.#intake?.abort();\n\t\tthis.#intake = undefined;\n\t\t// The connection closed before the reply, so the client will send the\n\t\t// message again: onData learns it through the signal.\n\t\tthis.#answering?.abort();\n\t\tthis.#answering = undefined;\n\t}\n\n\t/**\n\t * Forgets what the client sent ahead and reads nothing until `accept`:\n\t * what comes in clear before TLS never counts (RFC 3207 §4.2,\n\t * CVE-2011-0411).\n\t */\n\tignore(): void {\n\t\tthis.drop();\n\t\tthis.#input = [];\n\t\tthis.#queued = 0;\n\t\tthis.#ignoring = true;\n\t\tthis.#resume();\n\t}\n\n\taccept(): void {\n\t\tthis.#ignoring = false;\n\t}\n\n\t/** Drops the rest of the chunk being read: after a refused DATA, it is message content, not commands. */\n\tdrop(): void {\n\t\tthis.#lines.clear();\n\t\tthis.#dropped = true;\n\t}\n\n\t/** Starts receiving a message: `onData` is called, and gets it as it comes. */\n\tbeginData(): void {\n\t\tconst connection = this.#connection;\n\t\tthis.#intake = new Intake(connection, connection.state.transaction);\n\t\tconnection.state.waiting = 'data';\n\t}\n\n\t/** Resolves once everything received so far is answered. */\n\tasync idle(): Promise<void> {\n\t\twhile (this.#pumping) await this.#pumping;\n\t}\n\n\t#kick(): void {\n\t\tif (this.#pumping) return;\n\t\tconst connection = this.#connection;\n\t\tthis.#pumping = this.#pump()\n\t\t\t.catch((error) => {\n\t\t\t\tconnection.report(error);\n\t\t\t\tconnection.close(reply(421, '4.3.0', 'Local error, closing'));\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.#pumping = undefined;\n\t\t\t\t// Bytes that came after the loop's last look.\n\t\t\t\tif (!connection.closed && this.#input.length > 0) this.#kick();\n\t\t\t});\n\t}\n\n\t#resume(): void {\n\t\tif (this.#paused && this.#queued <= INPUT_LIMIT / 2) {\n\t\t\tthis.#paused = false;\n\t\t\tthis.#connection.transport.resume();\n\t\t}\n\t}\n\n\tasync #pump(): Promise<void> {\n\t\twhile (!this.#connection.closed && this.#input.length > 0) {\n\t\t\tconst chunk = this.#input.shift() as Uint8Array;\n\t\t\tthis.#queued -= chunk.length;\n\t\t\tthis.#resume();\n\t\t\tif (this.#connection.state.waiting === 'data') await this.#data(chunk);\n\t\t\telse await this.#commands(chunk);\n\t\t}\n\t}\n\n\tasync #commands(chunk: Uint8Array): Promise<void> {\n\t\tthis.#lines.push(chunk);\n\t\twhile (!this.#connection.closed) {\n\t\t\t// The replies so far leave before the next command runs.\n\t\t\tawait this.#connection.transport.drained();\n\t\t\tconst event = this.#lines.next();\n\t\t\tif (!event) return;\n\t\t\tif (!('line' in event)) {\n\t\t\t\tthis.#connection.fail(reply(500, '5.5.6', 'Line too long'));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.#dropped = false;\n\t\t\tawait runCommand(this.#connection, event.line);\n\t\t\tif (this.#dropped) return;\n\t\t\tif (this.#connection.state.waiting === 'data') {\n\t\t\t\t// Message content pipelined right after DATA.\n\t\t\t\tconst rest = this.#lines.takeRest();\n\t\t\t\tif (rest.length > 0) this.#unshift(rest.slice());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #data(chunk: Uint8Array): Promise<void> {\n\t\tconst intake = this.#intake as Intake;\n\t\tconst { done, rest } = await intake.write(chunk);\n\t\tif (!done || this.#connection.closed) return;\n\t\tthis.#intake = undefined;\n\t\tthis.#answering = intake;\n\t\tthis.#connection.state.waiting = 'command';\n\t\tthis.#connection.state.transaction = emptyTransaction();\n\t\tconst answer = await intake.finish();\n\t\tthis.#answering = undefined;\n\t\tthis.#connection.send(answer);\n\t\tif (rest.length > 0) this.#unshift(rest);\n\t}\n\n\t/** Puts bytes back at the front, counted again: the pump took them off the count. */\n\t#unshift(bytes: Uint8Array): void {\n\t\tthis.#input.unshift(bytes);\n\t\tthis.#queued += bytes.length;\n\t\tif (this.#queued > INPUT_LIMIT && !this.#paused) {\n\t\t\tthis.#paused = true;\n\t\t\tthis.#connection.transport.pause();\n\t\t}\n\t}\n}\n",
18
18
  "import { formatReply, type Reply, reply } from '../protocol/reply';\nimport { hookTimeout, LOCAL_ERROR, refusalOf, timedOut, within } from './guard';\nimport { Input } from './input';\nimport type { HookResult, Session } from './options';\nimport type { Settings } from './settings';\nimport { emptyTransaction, type State } from './state';\nimport type { Transport } from './transport';\n\n/**\n * One SMTP session (RFC 5321): reads commands, one at a time and in order —\n * PIPELINING sends several at once, and each reply waits for the hooks of\n * the commands before it — and the message after DATA.\n */\nexport class Connection {\n\treadonly settings: Settings;\n\t#transport: Transport;\n\treadonly id = crypto.getRandomValues(new Uint8Array(8)).toHex();\n\treadonly data: Record<string, unknown> = {};\n\treadonly state: State;\n\t/** What the client sends: commands, then message content after DATA. */\n\treadonly input: Input = new Input(this);\n\t#closed = false;\n\n\tconstructor(settings: Settings, transport: Transport) {\n\t\tthis.settings = settings;\n\t\tthis.#transport = transport;\n\t\tthis.state = {\n\t\t\tesmtp: false,\n\t\t\tsecure: transport.secure,\n\t\t\ttransaction: emptyTransaction(),\n\t\t\twaiting: 'command',\n\t\t\terrors: 0,\n\t\t\tauthFailures: 0,\n\t\t};\n\t}\n\n\tget transport(): Transport {\n\t\treturn this.#transport;\n\t}\n\n\t/** After STARTTLS: writes and hang-ups go through the encrypted socket. */\n\tuseTransport(transport: Transport): void {\n\t\tthis.#transport = transport;\n\t}\n\n\tget session(): Session {\n\t\tconst { helo, user } = this.state;\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tremoteAddress: this.transport.remoteAddress,\n\t\t\tsecure: this.state.secure,\n\t\t\tesmtp: this.state.esmtp,\n\t\t\t...(helo === undefined ? {} : { helo }),\n\t\t\t...(user === undefined ? {} : { user }),\n\t\t\tdata: this.data,\n\t\t};\n\t}\n\n\tget closed(): boolean {\n\t\treturn this.#closed;\n\t}\n\n\tsend(answer: Reply): void {\n\t\tif (this.#closed) return;\n\t\tthis.transport.write(formatReply(answer, this.state.esmtp));\n\t}\n\n\t/**\n\t * Hangs up, the server's decision (a refusal, too many errors, the idle\n\t * time): `answer` is written, but nothing waits for a client that\n\t * stopped reading. The connection is closed at once, and what it has\n\t * not read is dropped, so a close always completes.\n\t */\n\tclose(answer?: Reply): void {\n\t\tif (this.#closed) return;\n\t\tif (answer) this.send(answer);\n\t\tthis.#closed = true;\n\t\tthis.input.abort();\n\t\tthis.transport.abort();\n\t}\n\n\t/** QUIT: `answer` leaves whole, then the connection hangs up. */\n\tquit(answer: Reply): void {\n\t\tif (this.#closed) return;\n\t\tthis.send(answer);\n\t\tthis.#closed = true;\n\t\tthis.input.abort();\n\t\tthis.transport.end();\n\t}\n\n\t/** Counts a failed command; past the limit, hangs up. */\n\tfail(answer: Reply): void {\n\t\tthis.state.errors++;\n\t\tif (this.state.errors >= this.settings.maxErrors) {\n\t\t\tconst { hostname } = this.settings.options;\n\t\t\tthis.close(reply(421, '4.7.0', `${hostname} Too many errors, closing`));\n\t\t} else {\n\t\t\tthis.send(answer);\n\t\t}\n\t}\n\n\t/** Hands an error to `onError`, which may not throw back. */\n\treport(error: unknown): void {\n\t\ttry {\n\t\t\tthis.settings.options.onError?.(error, this.session);\n\t\t} catch {\n\t\t\t// The app's error handler failing is not the client's business.\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook: its refusal, or `undefined`. A throw, a reply that is not\n\t * a refusal, or — with `deadline` — no answer within `hookTimeout` is\n\t * reported and answered `451 4.3.0`.\n\t */\n\tasync hook(\n\t\tname: string,\n\t\trun: () => HookResult | Promise<HookResult>,\n\t\tdeadline = true,\n\t): Promise<Reply | undefined> {\n\t\tconst answer = await this.check(name, run, deadline);\n\t\tif (answer.failed) return LOCAL_ERROR;\n\t\treturn refusalOf(name, answer.value, (error) => this.report(error));\n\t}\n\n\t/** Runs app code that answers a value: `failed` when it threw or timed out, which is reported. */\n\tasync check<T>(\n\t\tname: string,\n\t\trun: () => T | Promise<T>,\n\t\tdeadline = true,\n\t): Promise<{ failed: false; value: T } | { failed: true }> {\n\t\tconst seconds = this.settings.hookTimeout;\n\t\ttry {\n\t\t\tconst running = Promise.resolve().then(run);\n\t\t\tconst value = deadline ? await within(running, seconds) : await running;\n\t\t\tif (timedOut(value)) {\n\t\t\t\tthis.report(hookTimeout(name, seconds));\n\t\t\t\treturn { failed: true };\n\t\t\t}\n\t\t\treturn { failed: false, value };\n\t\t} catch (error) {\n\t\t\tthis.report(error);\n\t\t\treturn { failed: true };\n\t\t}\n\t}\n\n\t/** The greeting, or the refusal of `onConnect`, or of a client that talked first. */\n\tasync open(): Promise<void> {\n\t\tconst { options } = this.settings;\n\t\tconst refused = options.onConnect\n\t\t\t? await this.hook('onConnect', () => options.onConnect?.(this.session))\n\t\t\t: undefined;\n\t\tif (refused) return this.close(refused);\n\t\tconst { greetingDelay } = this.settings;\n\t\tif (greetingDelay > 0) await Bun.sleep(greetingDelay * 1000);\n\t\tif (this.#closed) return;\n\t\tif (this.input.early) {\n\t\t\t// RFC 5321 §4.3.1: the client waits for the greeting; a spammer often does not.\n\t\t\treturn this.close(\n\t\t\t\treply(554, '5.5.0', `${options.hostname} Talked before the greeting`),\n\t\t\t);\n\t\t}\n\t\tthis.send(reply(220, undefined, `${options.hostname} ESMTP ready`));\n\t\t// The client's idle time starts at the greeting, not at connect: what\n\t\t// greetingDelay and onConnect took is not taken from it.\n\t\tthis.transport.restartIdle(this.settings.timeout);\n\t\tthis.input.greeted();\n\t}\n\n\t/** Bytes from the client; processed in order, after what came before. */\n\treceive(chunk: Uint8Array): void {\n\t\tif (!this.#closed) this.input.receive(chunk);\n\t}\n\n\t/** Resolves once everything received so far is answered. */\n\tidle(): Promise<void> {\n\t\treturn this.input.idle();\n\t}\n}\n",
19
19
  "import { Outgoing } from '../io/outgoing';\nimport type { RawSocket } from './raw-socket';\n\n/** What a connection needs from its socket: Bun's, or a fake one in specs. */\nexport interface Transport {\n\treadonly remoteAddress: string;\n\treadonly secure: boolean;\n\t/** Queues text for the client; what the socket cannot take now is kept for `drain`. */\n\twrite(text: string): void;\n\t/** Resolves once everything written has left. */\n\tdrained(): Promise<void>;\n\t/**\n\t * Hangs up once everything written has left: a graceful close, as after\n\t * QUIT. A socket not closed within `CLOSE_GRACE_MS` is terminated.\n\t * If the server paused reading, it reads again first, since a half-close\n\t * does not complete over input left unread.\n\t */\n\tend(): void;\n\t/**\n\t * Hangs up now, the server's decision: what the socket already took\n\t * leaves, but what still waits for a client that stopped reading is\n\t * dropped and the connection reset, so the close never hangs on it.\n\t * With nothing queued it hangs up as `end()` does, within the same grace.\n\t */\n\tabort(): void;\n\t/** Stops reading from the client, while the server catches up. */\n\tpause(): void;\n\tresume(): void;\n\t/** Starts TLS on the connection, once the 220 to STARTTLS has left. */\n\tstartTls(): void;\n\t/** Starts the idle time again, as a byte from the client does. */\n\trestartIdle(seconds: number): void;\n}\n\n/**\n * How long any end may wait on the client — for what is queued to leave,\n * then for the close itself — before the socket is terminated.\n */\nexport const CLOSE_GRACE_MS = 5_000;\n\n/**\n * A hang-up while the server paused reading lingers: it reads again and\n * drops what the client sent until nothing came for `LINGER_QUIET_MS`,\n * then half-closes. Bun closes the socket at once on `shutdown(true)`, and\n * Linux answers a close over unread input with a reset that loses the last\n * reply. A client still sending after `LINGER_MAX_MS` is reset.\n */\nexport const LINGER_QUIET_MS = 20;\nexport const LINGER_MAX_MS = 500;\n\n/**\n * A Bun socket as a Transport. What the socket cannot take now waits in an\n * `Outgoing` for the `drain` event, so no reply is lost to a client that\n * reads slowly.\n */\nexport class SocketTransport implements Transport {\n\treadonly #socket: RawSocket;\n\treadonly remoteAddress: string;\n\treadonly secure: boolean;\n\treadonly #startTls: () => void;\n\treadonly #outgoing: Outgoing;\n\t#ending = false;\n\t/** The socket closed: every later write, end or abort is a no-op. */\n\t#closed = false;\n\t/** The server stopped reading: what the client sends waits in the socket. */\n\t#paused = false;\n\t#grace: ReturnType<typeof setTimeout> | undefined;\n\t/** A paused hang-up waiting for the client's input to stop: how it will shut down, when it stops waiting, its timer. */\n\t#linger:\n\t\t| {\n\t\t\t\tdrained: boolean;\n\t\t\t\tuntil: number;\n\t\t\t\ttimer?: ReturnType<typeof setTimeout>;\n\t\t }\n\t\t| undefined;\n\n\tconstructor(\n\t\tsocket: RawSocket,\n\t\tsecure: boolean,\n\t\tstartTls: () => void,\n\t\tremoteAddress = socket.remoteAddress,\n\t) {\n\t\tthis.#socket = socket;\n\t\tthis.secure = secure;\n\t\tthis.#startTls = startTls;\n\t\tthis.remoteAddress = remoteAddress;\n\t\tthis.#outgoing = new Outgoing((bytes) => socket.write(bytes));\n\t}\n\n\twrite(text: string): void {\n\t\tif (this.#closed) return;\n\t\tthis.#outgoing.write(new TextEncoder().encode(text));\n\t}\n\n\t/** Bun's `drain`: the socket can take more. */\n\tdrain(): void {\n\t\tif (this.#outgoing.drain() && this.#ending) this.#hangUp(true);\n\t}\n\n\tdrained(): Promise<void> {\n\t\treturn this.#outgoing.drained();\n\t}\n\n\t/**\n\t * Bun's `data`: the client sent bytes. While a hang-up lingers, they are\n\t * dropped, and the half-close waits until they stop — `LINGER_MAX_MS` at\n\t * most: a client still sending then is reset. Re-arming the timer on each\n\t * chunk would let a client that never pauses keep it from firing, and a\n\t * half-close over its input may never fire `close` (Linux).\n\t */\n\treceived(): void {\n\t\tconst linger = this.#linger;\n\t\tif (!linger) return;\n\t\tconst left = linger.until - Date.now();\n\t\tif (left <= 0) this.#terminate();\n\t\telse this.#lingerFor(Math.min(LINGER_QUIET_MS, left));\n\t}\n\n\t/** The socket closed: nothing more will leave. */\n\tclosed(): void {\n\t\tthis.#closed = true;\n\t\tthis.#disarm();\n\t\tthis.#stopLingering();\n\t\tthis.#outgoing.clear();\n\t}\n\n\t/** After `closed()`, does nothing: no grace is armed on a dead socket. */\n\tend(): void {\n\t\tif (this.#closed) return;\n\t\tthis.#arm();\n\t\tif (this.#outgoing.empty) this.#hangUp(false);\n\t\telse this.#ending = true;\n\t}\n\n\tabort(): void {\n\t\tif (this.#closed) return;\n\t\tif (this.#outgoing.empty) this.end();\n\t\telse this.#terminate();\n\t}\n\n\t/**\n\t * Hangs up with a half-close, `shutdown(true)`, not Bun's `end`: on TLS,\n\t * `end` waits for the client's own close, which a client that stopped\n\t * reading never sends, and a `terminate` after it no longer closes the\n\t * socket (Bun 1.4). The half-close fires `close` at once, and a client\n\t * that reads later still gets every byte, then the end. A full\n\t * `shutdown()` would hold a paused client until the grace, then lose\n\t * its last reply to the reset.\n\t *\n\t * Except on TLS right after a queue drained (`drained`): there the last\n\t * write may still sit in Bun's own TLS buffer, which a half-close drops\n\t * (Bun 1.4.2: up to 96 KiB lost by a client reading slowly). The client\n\t * was reading a moment ago, so a full `shutdown()` closes once it\n\t * answers, and the grace bounds it if it stops.\n\t *\n\t * Reading paused, it reads again first: over input the server never\n\t * read, a half-close does not fire `close` (Bun 1.4.2), and the slot\n\t * waited for the grace. And it lingers: Bun closes the socket as soon as\n\t * it half-closes, and on Linux a close with input still unread is a\n\t * reset, which loses the last reply. So it drops what the client sends\n\t * until that stops for `LINGER_QUIET_MS` (`LINGER_MAX_MS` at most), then\n\t * half-closes: `close` fires at once, and a client that stopped sending\n\t * still gets the last reply and the end. One still sending at\n\t * `LINGER_MAX_MS` is reset (`received()`).\n\t */\n\t#hangUp(drained: boolean): void {\n\t\tthis.#ending = false;\n\t\tif (this.#linger) return;\n\t\tif (!this.#paused) {\n\t\t\tthis.#shutdown(drained);\n\t\t\treturn;\n\t\t}\n\t\tthis.resume();\n\t\tthis.#linger = { drained, until: Date.now() + LINGER_MAX_MS };\n\t\tthis.#lingerFor(LINGER_QUIET_MS);\n\t}\n\n\t/**\n\t * Half-closes in `ms`, unless the client sends again first. Armed for\n\t * less than `LINGER_QUIET_MS`, the input never went quiet before\n\t * `LINGER_MAX_MS`: it resets instead.\n\t */\n\t#lingerFor(ms: number): void {\n\t\tconst linger = this.#linger;\n\t\tif (!linger) return;\n\t\tclearTimeout(linger.timer);\n\t\tlinger.timer = setTimeout(() => {\n\t\t\tif (ms < LINGER_QUIET_MS) return this.#terminate();\n\t\t\tthis.#stopLingering();\n\t\t\tthis.#shutdown(linger.drained);\n\t\t}, ms);\n\t\tlinger.timer.unref?.();\n\t}\n\n\t#stopLingering(): void {\n\t\tclearTimeout(this.#linger?.timer);\n\t\tthis.#linger = undefined;\n\t}\n\n\t#shutdown(drained: boolean): void {\n\t\tif (drained && this.secure) this.#socket.shutdown();\n\t\telse this.#socket.shutdown(true);\n\t}\n\n\t/** Drops what is queued and resets the connection. */\n\t#terminate(): void {\n\t\tthis.#disarm();\n\t\tthis.#stopLingering();\n\t\tthis.#outgoing.clear();\n\t\tthis.#socket.terminate();\n\t}\n\n\t/** Terminates the socket once the grace is up, unless it closed first; the first deadline stands. */\n\t#arm(): void {\n\t\tif (this.#grace) return;\n\t\tthis.#grace = setTimeout(() => this.#terminate(), CLOSE_GRACE_MS);\n\t\tthis.#grace.unref?.();\n\t}\n\n\t#disarm(): void {\n\t\tclearTimeout(this.#grace);\n\t\tthis.#grace = undefined;\n\t}\n\n\tpause(): void {\n\t\tthis.#paused = true;\n\t\tthis.#socket.pause();\n\t}\n\n\tresume(): void {\n\t\tthis.#paused = false;\n\t\tthis.#socket.resume();\n\t}\n\n\tstartTls(): void {\n\t\tthis.#startTls();\n\t}\n\n\trestartIdle(seconds: number): void {\n\t\tthis.#socket.timeout(seconds);\n\t}\n}\n",
@@ -29,7 +29,7 @@
29
29
  "/**\n * The connections a server holds, and how many each client holds, by\n * `clientKey`. `release` is idempotent: every close handler calls it.\n */\nexport class Slots<T> {\n\treadonly #open = new Map<T, string | undefined>();\n\treadonly #perClient = new Map<string, number>();\n\n\tget size(): number {\n\t\treturn this.#open.size;\n\t}\n\n\t/** How many connections the client `key` holds. */\n\tof(key: string | undefined): number {\n\t\treturn key === undefined ? 0 : (this.#perClient.get(key) ?? 0);\n\t}\n\n\ttake(connection: T, key: string | undefined): void {\n\t\tthis.#open.set(connection, key);\n\t\tif (key !== undefined) this.#perClient.set(key, this.of(key) + 1);\n\t}\n\n\trelease(connection: T): void {\n\t\tif (!this.#open.has(connection)) return;\n\t\tconst key = this.#open.get(connection);\n\t\tthis.#open.delete(connection);\n\t\tif (key === undefined) return;\n\t\tconst left = this.of(key) - 1;\n\t\tif (left > 0) this.#perClient.set(key, left);\n\t\telse this.#perClient.delete(key);\n\t}\n\n\tconnections(): T[] {\n\t\treturn [...this.#open.keys()];\n\t}\n}\n",
30
30
  "import type { Socket, TCPSocketListener } from 'bun';\nimport { SmtpError } from '../errors';\nimport {\n\ttype Listening,\n\tlistenerHandlers,\n\tupgradingHandlers,\n} from './admission';\nimport type { Connection } from './connection';\nimport { handlers, type SocketState } from './listener';\nimport type { SmtpServerOptions, TlsOptions } from './options';\nimport { settingsOf } from './settings';\nimport { Slots } from './slots';\n\n/** A key or certificate `listen` or `setTls` cannot use: `INVALID_OPTION`, the reason as its `cause`. */\nconst invalidTls = (message: string, cause: unknown) =>\n\tnew SmtpError('INVALID_OPTION', message, { cause });\n\n/** What a `listen` that a `stop()` came before says. */\nconst STOPPED = 'listen(): stop() was called before the server bound its port';\n\n/** Binds the port, once `listen`'s guard passed. */\nasync function bind(\n\tlistening: Omit<Listening, 'proxied'>,\n\tport: number,\n\thostname: string,\n\tstopped: () => boolean,\n): Promise<TCPSocketListener<SocketState>> {\n\t// Implicit TLS: the key and certificate are checked first, so one\n\t// that cannot be used fails here alike, with a proxy or without.\n\tconst { tls } = listening.settings;\n\tif (listening.secure && tls) await tls.load(invalidTls, 'listen()');\n\t// `stop()` came while the key was being read: nothing is bound.\n\tif (stopped()) {\n\t\tthrow new SmtpError('STOPPED', STOPPED);\n\t}\n\t// Behind a proxy: a clear listener, TLS after the header. Without\n\t// one, the listener is clear too, and every socket upgrades at once:\n\t// the pair `setTls` replaced is read per connection, which a native\n\t// TLS listener, bound to one context, cannot do.\n\tconst proxied =\n\t\tlistening.secure && listening.settings.trusts ? tls : undefined;\n\tconst full = {\n\t\t...handlers(listening.settings),\n\t\t...listenerHandlers({\n\t\t\t...listening,\n\t\t\t...(proxied ? { proxied } : {}),\n\t\t}),\n\t};\n\treturn Bun.listen<SocketState>({\n\t\thostname,\n\t\tport,\n\t\tsocket:\n\t\t\tlistening.secure && !proxied\n\t\t\t\t? upgradingHandlers(full, listening.settings)\n\t\t\t\t: full,\n\t});\n}\n\nexport interface SmtpServer {\n\t/** Starts listening; resolves once the port is bound. Once only: a second call throws. */\n\tlisten(options: {\n\t\tport: number;\n\t\thostname?: string;\n\t}): Promise<{ port: number; hostname: string }>;\n\t/**\n\t * Uses a renewed key and certificate from the next STARTTLS upgrade or\n\t * implicit TLS connection on; the sessions open keep the TLS they have.\n\t * The pair is read and checked first: one that cannot be used throws\n\t * `INVALID_OPTION` and leaves the one in use. Needs a server made with\n\t * `tls`.\n\t */\n\tsetTls(tls: TlsOptions): Promise<void>;\n\t/** Stops listening; `closeConnections` hangs up on every client too. */\n\tstop(closeConnections?: boolean): void;\n\t/** Open connections. */\n\treadonly connections: number;\n}\n\n/**\n * An SMTP server (RFC 5321) on `Bun.listen`: EHLO with PIPELINING, SIZE,\n * 8BITMIME, SMTPUTF8 and ENHANCEDSTATUSCODES; STARTTLS (RFC 3207) or\n * implicit TLS (RFC 8314); AUTH PLAIN and LOGIN over TLS only (RFC 4954);\n * policy through hooks. It never relays without AUTH: a recipient outside\n * `localDomains` is refused to an unauthenticated session, whatever the\n * hooks say.\n */\nexport function createSmtpServer(options: SmtpServerOptions): SmtpServer {\n\tconst settings = settingsOf(options);\n\tlet listener: TCPSocketListener<SocketState> | undefined;\n\tconst slots = new Slots<Connection>();\n\t/** Implicit TLS sockets still in their handshake, for `stop(true)`. */\n\tconst handshaking = new Set<Socket<SocketState>>();\n\tconst secure = options.implicitTls === true;\n\t/** `listen` has not resolved yet: it may be reading the TLS material, before it binds. */\n\tlet starting = false;\n\t/** `stop()` was called while `starting`: `listen` leaves nothing bound. */\n\tlet stopRequested = false;\n\treturn {\n\t\tget connections() {\n\t\t\treturn slots.size;\n\t\t},\n\t\tasync setTls(tls) {\n\t\t\tif (!settings.tls) {\n\t\t\t\tthrow new SmtpError(\n\t\t\t\t\t'INVALID_OPTION',\n\t\t\t\t\t'setTls(): the server was made without tls, so it has none to replace',\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait settings.tls.replace(tls, invalidTls, 'setTls()');\n\t\t},\n\t\tasync listen({ port, hostname = '0.0.0.0' }) {\n\t\t\tif (listener || starting) {\n\t\t\t\tthrow new SmtpError(\n\t\t\t\t\t'ALREADY_LISTENING',\n\t\t\t\t\tlistener\n\t\t\t\t\t\t? `listen(): the server is already listening on ${listener.hostname}:${listener.port}`\n\t\t\t\t\t\t: 'listen(): the server is already starting to listen',\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Set before the first await: a second call meanwhile throws, never binds.\n\t\t\tstarting = true;\n\t\t\tstopRequested = false;\n\t\t\ttry {\n\t\t\t\tconst bound = await bind(\n\t\t\t\t\t{ settings, slots, handshaking, secure },\n\t\t\t\t\tport,\n\t\t\t\t\thostname,\n\t\t\t\t\t() => stopRequested,\n\t\t\t\t);\n\t\t\t\t// `stop()` came before `listen` resolved: nothing is left listening.\n\t\t\t\tif (stopRequested) {\n\t\t\t\t\tbound.stop(true);\n\t\t\t\t\tthrow new SmtpError('STOPPED', STOPPED);\n\t\t\t\t}\n\t\t\t\tlistener = bound;\n\t\t\t\treturn { port: listener.port, hostname: listener.hostname };\n\t\t\t} finally {\n\t\t\t\tstarting = false;\n\t\t\t}\n\t\t},\n\t\tstop(closeConnections = false) {\n\t\t\tif (starting) stopRequested = true;\n\t\t\tlistener?.stop(closeConnections);\n\t\t\tlistener = undefined;\n\t\t\tif (!closeConnections) return;\n\t\t\t// Bun's `stop(true)` closes the sockets the listener holds, and a\n\t\t\t// socket STARTTLS moved to TLS is no longer one of them: hang up on\n\t\t\t// every connection here, as a timeout does. A socket still in its\n\t\t\t// handshake has no TLS to say 421 on: it is reset.\n\t\t\tconst stuck = new Set<Connection | undefined>();\n\t\t\tfor (const socket of [...handshaking]) {\n\t\t\t\tstuck.add(socket.data?.connection);\n\t\t\t\thandshaking.delete(socket);\n\t\t\t\tsocket.terminate();\n\t\t\t}\n\t\t\tfor (const connection of slots.connections()) {\n\t\t\t\tif (!stuck.has(connection)) connection.close();\n\t\t\t}\n\t\t},\n\t};\n}\n"
31
31
  ],
32
- "mappings": "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",
33
- "debugId": "2DE3A3E5E10EAC4A64756E2164756E21",
32
+ "mappings": "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",
33
+ "debugId": "9B356F51DEFD8FA364756E2164756E21",
34
34
  "names": []
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"intake.d.ts","sourceRoot":"","sources":["../../src/server/intake.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAS,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAK3C;;;;;;;;;;;;GAYG;AACH,qBAAa,MAAM;;IAClB,QAAQ,CAAC,EAAE,SAAsD;gBAoBrD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW;IA0E5D,iEAAiE;IAC3D,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IAgB5E,0CAA0C;IACpC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;IAuB9B,uEAAuE;IACvE,KAAK,IAAI,IAAI;CA2Eb"}
1
+ {"version":3,"file":"intake.d.ts","sourceRoot":"","sources":["../../src/server/intake.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAS,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAgB/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAK3C;;;;;;;;;;;;GAYG;AACH,qBAAa,MAAM;;IAClB,QAAQ,CAAC,EAAE,SAAsD;gBAoBrD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW;IA0E5D,iEAAiE;IAC3D,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IAmB5E,0CAA0C;IACpC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;IAuB9B,uEAAuE;IACvE,KAAK,IAAI,IAAI;CA2Eb"}
@@ -42,7 +42,7 @@ export interface ReceivedMessage {
42
42
  * client only as fast as this stream is read.
43
43
  *
44
44
  * It ends in an `SmtpError` when the message must not be delivered:
45
- * `MESSAGE_TOO_BIG`, `BARE_LINE_BREAK` (SMTP smuggling),
45
+ * `MESSAGE_TOO_BIG`, `BARE_LINE_BREAK` (SMTP smuggling), `NUL_BYTE`,
46
46
  * `CONNECTION_LOST`, `HOOK_TIMEOUT` or `MESSAGE_NOT_READ`. Read it to
47
47
  * its end before keeping anything: a message is taken only when the
48
48
  * stream ended cleanly and `onData` resolved, within `hookTimeout`,
@@ -2,9 +2,12 @@ import { SmtpError } from '../errors';
2
2
  /** Why a message on its way in is refused, as the reply and the error `onData` and `onError` see. */
3
3
  export declare const TOO_BIG: import("..").Reply;
4
4
  export declare const BARE_LINE_BREAK: import("..").Reply;
5
+ export declare const NUL_BYTE: import("..").Reply;
5
6
  export declare function tooBig(maxMessageSize: number): SmtpError;
6
7
  /** A bare CR or LF is how SMTP smuggling hides a second message. */
7
8
  export declare function bareLineBreak(): SmtpError;
9
+ /** The server does not advertise BINARYMIME, so a NUL is not valid in a message. */
10
+ export declare function nulByte(): SmtpError;
8
11
  /**
9
12
  * The connection closed mid-message, or after its end but before the reply:
10
13
  * the client hung up, or the server closed it (idle timeout, socket error).
@@ -1 +1 @@
1
- {"version":3,"file":"refusals.d.ts","sourceRoot":"","sources":["../../src/server/refusals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,qGAAqG;AAErG,eAAO,MAAM,OAAO,oBAAoD,CAAC;AAEzE,eAAO,MAAM,eAAe,oBAI3B,CAAC;AAEF,wBAAgB,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAKxD;AAED,oEAAoE;AACpE,wBAAgB,aAAa,IAAI,SAAS,CAKzC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAOxD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAKtD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAKxD;AAED,wBAAgB,OAAO,IAAI,SAAS,CAKnC"}
1
+ {"version":3,"file":"refusals.d.ts","sourceRoot":"","sources":["../../src/server/refusals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,qGAAqG;AAErG,eAAO,MAAM,OAAO,oBAAoD,CAAC;AAEzE,eAAO,MAAM,eAAe,oBAI3B,CAAC;AAEF,eAAO,MAAM,QAAQ,oBAAkD,CAAC;AAExE,wBAAgB,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAKxD;AAED,oEAAoE;AACpE,wBAAgB,aAAa,IAAI,SAAS,CAKzC;AAED,oFAAoF;AACpF,wBAAgB,OAAO,IAAI,SAAS,CAKnC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAOxD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAKtD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAKxD;AAED,wBAAgB,OAAO,IAAI,SAAS,CAKnC"}
package/docs/guide.md CHANGED
@@ -202,6 +202,7 @@ Every reply the server sends of its own:
202
202
  | `452 4.5.3 Too many recipients` | past `maxRecipients`; the recipients already taken stand |
203
203
  | `552 5.3.4 Message too big for system` | SIZE= over `maxMessageSize` at MAIL, or a message over it after DATA |
204
204
  | `550 5.6.11 Bare CR or LF is not allowed in a message` | the message holds a CR or LF that is not part of a CRLF |
205
+ | `554 5.6.0 Message holds a NUL byte` | the message holds a NUL byte (the server does not advertise BINARYMIME) |
205
206
  | `451 4.3.0 Local error in processing` | a hook threw, timed out or answered a reply under 400; `localDomains` threw or timed out; `onData` stopped reading the message, or answered without reading it to its end |
206
207
  | `554 <hostname> Talked before the greeting` | the client sent something before the 220 — during `onConnect` or `greetingDelay` (RFC 5321 §4.3.1); the server hangs up |
207
208
  | `500 5.5.2 Command unrecognized` | an unknown verb — EXPN, BDAT and the rest |
@@ -531,6 +532,7 @@ then refused whatever `onData` answers:
531
532
  | --- | --- | --- |
532
533
  | `MESSAGE_TOO_BIG` | the message passed `maxMessageSize` | `552 5.3.4 Message too big for system` |
533
534
  | `BARE_LINE_BREAK` | a CR or LF that is not part of a CRLF: SMTP smuggling | `550 5.6.11 Bare CR or LF is not allowed in a message` |
535
+ | `NUL_BYTE` | the message holds a NUL byte (no `BINARYMIME`) | `554 5.6.0 Message holds a NUL byte` |
534
536
  | `CONNECTION_LOST` | the connection closed before the end — the client hung up, or the server closed it on idle `timeout` or a socket error | nothing: it is gone |
535
537
  | `MESSAGE_NOT_READ` | `onData` answered before the end: a read it left running errors the moment it answers | `451 4.3.0 Local error in processing` |
536
538
  | `HOOK_TIMEOUT` | `onData` read nothing for `hookTimeout` seconds, or did not answer within `hookTimeout` once the message ended — a late read must not keep a message the client will send again | `451 4.3.0 Local error in processing` |
@@ -580,7 +582,7 @@ behalf.
580
582
  | `SmtpError` `INVALID_HOOK_REPLY` | `onData` answered what is not a refusal, such as a `250` |
581
583
  | what `onData` threw | `onData` threw; the client got `451` |
582
584
  | `SmtpError` `CONNECTION_LOST` | the connection closed — the client hung up, or the server closed it on idle or a socket error — before the end of the message, or after it but before the reply |
583
- | `SmtpError` `MESSAGE_TOO_BIG`, `BARE_LINE_BREAK` | the stream's own errors |
585
+ | `SmtpError` `MESSAGE_TOO_BIG`, `BARE_LINE_BREAK`, `NUL_BYTE` | the stream's own errors |
584
586
 
585
587
  A refusal `onData` returns leaves the signal alone, whether it read the
586
588
  message or not (a read it left running still errors with
@@ -1657,9 +1659,16 @@ route, can duplicate it. It is absent for a failure before the dot, which
1657
1659
  the server drops, and for a `REFUSED` to the dot, a 4xx or 5xx that says the
1658
1660
  message was not taken.
1659
1661
 
1662
+ An `afterData` error also carries the envelope's outcome, in the shape of the
1663
+ success result: `accepted` lists the recipients the server took at `RCPT TO`
1664
+ (the ones that may hold the message), and `rejected` those it refused there,
1665
+ each with its reply. A recipient in `rejected` never had a copy: its 4xx or
1666
+ 5xx tells whether to try it again.
1667
+
1660
1668
  ```ts
1661
1669
  if (error.temporary && error.afterData) {
1662
- // the message may be there already: retry the same host, not another route
1670
+ // the message may be there already for error.accepted: retry the same
1671
+ // host for them; error.rejected were refused at RCPT and never had it
1663
1672
  }
1664
1673
  ```
1665
1674
 
package/docs/roadmap.md CHANGED
@@ -34,6 +34,13 @@ Nothing in progress.
34
34
 
35
35
  ### Unreleased — merged, not yet published
36
36
 
37
+ - **The envelope on an `afterData` error**: `SmtpError.accepted` and
38
+ `rejected` list the recipients the server took and refused at `RCPT TO`
39
+ when the session failed after the final dot.
40
+ - **A message holding a NUL byte is refused**: the server reads it to its
41
+ end, then answers `554 5.6.0 Message holds a NUL byte`, and the content
42
+ stream errors with `SmtpError` code `NUL_BYTE`, so `onData` never takes
43
+ it.
37
44
  - **A renewed certificate without a restart**, `server.setTls({ key, cert
38
45
  })`: the next STARTTLS upgrade and the next implicit TLS connection use
39
46
  it, the sessions open keep their TLS, and a pair that cannot be used
@@ -71,11 +71,13 @@ A reply carries its enhanced status code (`5.7.1`, RFC 3463) only after
71
71
  **Messages**
72
72
 
73
73
  - [`550 5.6.11 Bare CR or LF is not allowed in a message`](#550-5611-bare-cr-or-lf-is-not-allowed-in-a-message)
74
+ - [`554 5.6.0 Message holds a NUL byte`](#554-560-message-holds-a-nul-byte)
74
75
  - [`552 5.3.4 Message too big for system`](#552-534-message-too-big-for-system)
75
76
  - [`452 4.5.3 Too many recipients`](#452-453-too-many-recipients)
76
77
  - [`554 5.5.1 No valid recipients`](#554-551-no-valid-recipients)
77
78
  - [`SmtpError: The message is larger than maxMessageSize (… bytes); do not deliver it`](#smtperror-the-message-is-larger-than-maxmessagesize--bytes-do-not-deliver-it)
78
79
  - [`SmtpError: The message holds a bare CR or LF (SMTP smuggling); do not deliver it`](#smtperror-the-message-holds-a-bare-cr-or-lf-smtp-smuggling-do-not-deliver-it)
80
+ - [`SmtpError: The message holds a NUL byte; do not deliver it`](#smtperror-the-message-holds-a-nul-byte-do-not-deliver-it)
79
81
  - [`SmtpError: The connection closed before the end of the message; do not deliver it`](#smtperror-the-connection-closed-before-the-end-of-the-message-do-not-deliver-it)
80
82
  - [`SmtpError: The connection closed before the reply to the message; do not deliver it`](#smtperror-the-connection-closed-before-the-reply-to-the-message-do-not-deliver-it)
81
83
  - [`SmtpError: onData did not read the message within hookTimeout (… s); do not deliver it`](#smtperror-ondata-did-not-read-the-message-within-hooktimeout--s-do-not-deliver-it)
@@ -1318,6 +1320,32 @@ To take larger messages, raise `maxMessageSize`.
1318
1320
  **Fix**: delete what you wrote and let the error propagate, as in
1319
1321
  [the entry above](#smtperror-the-message-is-larger-than-maxmessagesize--bytes-do-not-deliver-it).
1320
1322
 
1323
+ ### `554 5.6.0 Message holds a NUL byte`
1324
+
1325
+ **When**: during `DATA`, once the message holds a NUL (0x00) byte. The rest
1326
+ of the message is read and dropped, then the reply is sent instead of a
1327
+ `250`. `message.content` errors with an `SmtpError` of code `NUL_BYTE`, so
1328
+ `onData` never reads it to a clean end; the session goes on.
1329
+
1330
+ **Why**: the server does not advertise `BINARYMIME`, so a NUL is not valid
1331
+ in a message, and IMAP cannot send it in a plain `BODY[]` literal (RFC 9051
1332
+ section 4.3.1). The `554` is permanent, so the client keeps the message
1333
+ instead of retrying it.
1334
+
1335
+ **Fix**, as a client: encode binary content (base64 or quoted-printable)
1336
+ and strip NULs from text. There is no option to accept it.
1337
+
1338
+ ### `SmtpError: The message holds a NUL byte; do not deliver it`
1339
+
1340
+ **When**: the read of `message.content` throws this `SmtpError`, code
1341
+ `NUL_BYTE`. The client got
1342
+ [`554 5.6.0 Message holds a NUL byte`](#554-560-message-holds-a-nul-byte).
1343
+
1344
+ **Why**: the message is not valid without `BINARYMIME`; it is refused whole.
1345
+
1346
+ **Fix**: delete what you wrote and let the error propagate, as in
1347
+ [the entry above](#smtperror-the-message-is-larger-than-maxmessagesize--bytes-do-not-deliver-it).
1348
+
1321
1349
  ### `SmtpError: The connection closed before the end of the message; do not deliver it`
1322
1350
 
1323
1351
  **When**: the read of `message.content` throws this `SmtpError`, code
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bumail/smtp",
3
- "version": "0.7.1",
3
+ "version": "0.9.0",
4
4
  "description": "An SMTP server on Bun.listen — RFC 5321 with PIPELINING, SIZE, 8BITMIME, SMTPUTF8, STARTTLS and AUTH after TLS, policy hooks, and no open relay — and a client that delivers a message to a smarthost or by MX",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -49,7 +49,7 @@
49
49
  "devDependencies": {
50
50
  "@bumail/auth": "^0.4.1",
51
51
  "@bumail/dns": "^0.2.1",
52
- "@bumail/store": "^0.4.1",
52
+ "@bumail/store": "^0.4.2",
53
53
  "@types/bun": "^1.4.2"
54
54
  },
55
55
  "peerDependencies": {