@bumail/smtp 0.5.0 → 0.6.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
@@ -110,6 +110,26 @@ handshake, and holds a slot of `maxConnections` and
110
110
  `maxConnectionsPerClient` meanwhile: a socket that never sends its
111
111
  ClientHello is closed, without a word.
112
112
 
113
+ ## Renew the certificate without a restart
114
+
115
+ `setTls` takes a renewed key and certificate: the next STARTTLS upgrade or
116
+ implicit TLS connection uses them, and the sessions already open keep the
117
+ TLS they have. The pair is read and checked first; one that cannot be used
118
+ rejects with `INVALID_OPTION` and the old pair stays in use.
119
+
120
+ ```ts
121
+ // After certbot, Traefik or an ACME client wrote new files:
122
+ await server.setTls({
123
+ key: Bun.file('/etc/ssl/smtp.example.com.key'),
124
+ cert: Bun.file('/etc/ssl/smtp.example.com.crt'),
125
+ });
126
+ ```
127
+
128
+ Call it on each server that holds the pair (the MX on 25, submission on
129
+ 587 and on 465). The
130
+ [guide](https://github.com/softistx/bumail/blob/develop/packages/smtp/docs/guide.md#renewing-the-certificate-without-a-restart)
131
+ says how it works on each kind of port.
132
+
113
133
  ## Hooks for policy
114
134
 
115
135
  A hook returns nothing to accept, or a `reply(code, status, text)` with a
@@ -458,7 +478,7 @@ host; a 5xx stops. A null MX (RFC 7505) fails at once with `NULL_MX`.
458
478
  | export | |
459
479
  | --- | --- |
460
480
  | `createSmtpServer(options)` | the server; throws an `SmtpError` (`INVALID_OPTION`) on a bad option |
461
- | `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`), `stop(closeConnections?)` (`true` hangs up on every client, after STARTTLS too), `connections` |
481
+ | `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` |
462
482
  | `SmtpServerOptions` | `hostname`, `mode`, `localDomains`, `tls`, `implicitTls`, `authenticate`, the limits (`maxConnectionsPerClient` among them), `hookTimeout`, `handshakeTimeout`, `greetingDelay`, `proxyProtocol`, `onError`, and the hooks |
463
483
  | `ProxyProtocolOptions` | `trusted`: the proxies' IPv4 and IPv6 addresses and CIDRs, the only peers whose PROXY header (v1 or v2) is read |
464
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 |
package/dist/index.js CHANGED
@@ -1181,7 +1181,7 @@ function turnAway(socket, raw, secure, line) {
1181
1181
  }
1182
1182
  function transportOf(socket, raw, address, settings, secure, slots) {
1183
1183
  const transport = new SocketTransport(raw, secure, () => {
1184
- const tls = settings.options.tls;
1184
+ const tls = settings.tls?.options;
1185
1185
  const connection = socket.data.connection;
1186
1186
  if (!tls || !connection)
1187
1187
  return;
@@ -1604,17 +1604,41 @@ function admit(listening, socket, address, first) {
1604
1604
  }
1605
1605
  begin(() => void connection.open());
1606
1606
  }
1607
- function startTls2(listening, socket, context) {
1607
+ function startTls2(listening, socket, tls) {
1608
1608
  const { settings } = listening;
1609
1609
  socket.data.handshaking = true;
1610
1610
  socket.timeout(settings.handshakeTimeout);
1611
- const tls = new ProxiedTls(socket, context, {
1611
+ const proxied = new ProxiedTls(socket, tls.context, {
1612
1612
  secure: () => handshake(listening, socket, true),
1613
1613
  data: (bytes) => received(socket, settings, bytes),
1614
1614
  drain: () => socket.data.transport?.drain()
1615
1615
  });
1616
- socket.data.tls = tls;
1617
- return tls;
1616
+ socket.data.tls = proxied;
1617
+ return proxied;
1618
+ }
1619
+ function upgradingHandlers(encrypted, settings) {
1620
+ const ignore = () => {};
1621
+ return {
1622
+ open(raw) {
1623
+ const tls = settings.tls?.options;
1624
+ if (!tls)
1625
+ return raw.terminate();
1626
+ try {
1627
+ raw.upgradeTLS({
1628
+ tls: { key: tls.key, cert: tls.cert },
1629
+ data: { upgraded: false },
1630
+ socket: encrypted
1631
+ });
1632
+ } catch {
1633
+ raw.terminate();
1634
+ }
1635
+ },
1636
+ data: ignore,
1637
+ drain: ignore,
1638
+ close: ignore,
1639
+ error: ignore,
1640
+ timeout: ignore
1641
+ };
1618
1642
  }
1619
1643
 
1620
1644
  // src/server/proxy/trusted.ts
@@ -1672,6 +1696,54 @@ function trustedPeers(entries, invalid) {
1672
1696
  };
1673
1697
  }
1674
1698
 
1699
+ // src/server/tls-context.ts
1700
+ import { createSecureContext } from "node:tls";
1701
+ async function readTls(tls, fail, caller) {
1702
+ const read = async (value) => typeof value === "string" ? value : Buffer.from(value instanceof Uint8Array ? value : await value.bytes());
1703
+ try {
1704
+ const key = await read(tls.key);
1705
+ const cert = await read(tls.cert);
1706
+ if (key.length === 0 || cert.length === 0) {
1707
+ throw new Error(`the ${key.length === 0 ? "key" : "cert"} is empty`);
1708
+ }
1709
+ return { key, cert, context: createSecureContext({ key, cert }) };
1710
+ } catch (cause) {
1711
+ const reason = cause instanceof Error ? cause.message : String(cause);
1712
+ throw fail(`${caller}: tls: { key, cert } cannot be used: ${reason}`, cause);
1713
+ }
1714
+ }
1715
+
1716
+ class TlsHolder {
1717
+ #current;
1718
+ #tail = Promise.resolve();
1719
+ #given;
1720
+ constructor(given) {
1721
+ this.#given = given;
1722
+ }
1723
+ get options() {
1724
+ return this.#current ?? this.#given;
1725
+ }
1726
+ get context() {
1727
+ if (!this.#current)
1728
+ throw new Error("the TLS pair was never read");
1729
+ return this.#current.context;
1730
+ }
1731
+ async load(fail, caller) {
1732
+ if (this.#current)
1733
+ return this.#current.context;
1734
+ const read = await readTls(this.#given, fail, caller);
1735
+ this.#current ??= read;
1736
+ return this.#current.context;
1737
+ }
1738
+ replace(tls, fail, caller) {
1739
+ const run = this.#tail.then(async () => {
1740
+ this.#current = await readTls(tls, fail, caller);
1741
+ });
1742
+ this.#tail = run.catch(() => {});
1743
+ return run;
1744
+ }
1745
+ }
1746
+
1675
1747
  // src/server/settings.ts
1676
1748
  var MAX_TIMER_SECONDS = Math.floor(2147483647 / 1000);
1677
1749
  var invalid2 = (message) => new SmtpError2("INVALID_OPTION", `createSmtpServer(): ${message}`);
@@ -1731,6 +1803,7 @@ function settingsOf(options) {
1731
1803
  }
1732
1804
  return {
1733
1805
  options,
1806
+ ...options.tls ? { tls: new TlsHolder(options.tls) } : {},
1734
1807
  mode: options.mode ?? "mx",
1735
1808
  maxMessageSize: positive("maxMessageSize", options.maxMessageSize, 25 * 1024 * 1024),
1736
1809
  maxRecipients: positive("maxRecipients", options.maxRecipients, 100),
@@ -1779,41 +1852,28 @@ class Slots {
1779
1852
  }
1780
1853
  }
1781
1854
 
1782
- // src/server/tls-context.ts
1783
- import { createSecureContext } from "node:tls";
1784
- async function tlsContext(tls, fail) {
1785
- const read = async (value) => typeof value === "string" ? value : Buffer.from(value instanceof Uint8Array ? value : await value.bytes());
1786
- try {
1787
- return createSecureContext({
1788
- key: await read(tls.key),
1789
- cert: await read(tls.cert)
1790
- });
1791
- } catch (cause) {
1792
- const reason = cause instanceof Error ? cause.message : String(cause);
1793
- throw fail(`listen(): tls: { key, cert } cannot be used: ${reason}`, cause);
1794
- }
1795
- }
1796
-
1797
1855
  // src/server/server.ts
1798
1856
  var invalidTls = (message, cause) => new SmtpError2("INVALID_OPTION", message, { cause });
1799
1857
  var STOPPED = "listen(): stop() was called before the server bound its port";
1800
- async function bind(options, listening, port, hostname, stopped) {
1801
- const context = listening.secure && options.tls ? await tlsContext(options.tls, invalidTls) : undefined;
1858
+ async function bind(listening, port, hostname, stopped) {
1859
+ const { tls } = listening.settings;
1860
+ if (listening.secure && tls)
1861
+ await tls.load(invalidTls, "listen()");
1802
1862
  if (stopped()) {
1803
1863
  throw new SmtpError2("STOPPED", STOPPED);
1804
1864
  }
1805
- const proxied = listening.settings.trusts ? context : undefined;
1865
+ const proxied = listening.secure && listening.settings.trusts ? tls : undefined;
1866
+ const full = {
1867
+ ...handlers(listening.settings),
1868
+ ...listenerHandlers({
1869
+ ...listening,
1870
+ ...proxied ? { proxied } : {}
1871
+ })
1872
+ };
1806
1873
  return Bun.listen({
1807
1874
  hostname,
1808
1875
  port,
1809
- ...listening.secure && options.tls && !proxied ? { tls: { key: options.tls.key, cert: options.tls.cert } } : {},
1810
- socket: {
1811
- ...handlers(listening.settings),
1812
- ...listenerHandlers({
1813
- ...listening,
1814
- ...proxied ? { proxied } : {}
1815
- })
1816
- }
1876
+ socket: listening.secure && !proxied ? upgradingHandlers(full, listening.settings) : full
1817
1877
  });
1818
1878
  }
1819
1879
  function createSmtpServer(options) {
@@ -1828,6 +1888,12 @@ function createSmtpServer(options) {
1828
1888
  get connections() {
1829
1889
  return slots.size;
1830
1890
  },
1891
+ async setTls(tls) {
1892
+ if (!settings.tls) {
1893
+ throw new SmtpError2("INVALID_OPTION", "setTls(): the server was made without tls, so it has none to replace");
1894
+ }
1895
+ await settings.tls.replace(tls, invalidTls, "setTls()");
1896
+ },
1831
1897
  async listen({ port, hostname = "0.0.0.0" }) {
1832
1898
  if (listener || starting) {
1833
1899
  throw new SmtpError2("ALREADY_LISTENING", listener ? `listen(): the server is already listening on ${listener.hostname}:${listener.port}` : "listen(): the server is already starting to listen");
@@ -1835,7 +1901,7 @@ function createSmtpServer(options) {
1835
1901
  starting = true;
1836
1902
  stopRequested = false;
1837
1903
  try {
1838
- const bound = await bind(options, { settings, slots, handshaking, secure }, port, hostname, () => stopRequested);
1904
+ const bound = await bind({ settings, slots, handshaking, secure }, port, hostname, () => stopRequested);
1839
1905
  if (stopRequested) {
1840
1906
  bound.stop(true);
1841
1907
  throw new SmtpError2("STOPPED", STOPPED);
@@ -1880,5 +1946,5 @@ export {
1880
1946
  reply
1881
1947
  };
1882
1948
 
1883
- //# debugId=C3E2F4573FDEF0E964756E2164756E21
1949
+ //# debugId=2DE3A3E5E10EAC4A64756E2164756E21
1884
1950
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/protocol/command.ts", "../src/protocol/data.ts", "../src/protocol/reply.ts", "../src/server/client-key.ts", "../src/server/guard.ts", "../src/server/auth.ts", "../src/server/state.ts", "../src/server/transaction.ts", "../src/server/commands.ts", "../src/server/received.ts", "../src/server/refusals.ts", "../src/server/intake.ts", "../src/server/input.ts", "../src/server/connection.ts", "../src/server/transport.ts", "../src/server/listener.ts", "../src/server/proxy/address.ts", "../src/server/proxy/header.ts", "../src/server/proxy/reader.ts", "../src/server/proxy/tls.ts", "../src/server/admission.ts", "../src/server/proxy/trusted.ts", "../src/server/settings.ts", "../src/server/slots.ts", "../src/server/tls-context.ts", "../src/server/server.ts"],
3
+ "sources": ["../src/protocol/command.ts", "../src/protocol/data.ts", "../src/protocol/reply.ts", "../src/server/client-key.ts", "../src/server/guard.ts", "../src/server/auth.ts", "../src/server/state.ts", "../src/server/transaction.ts", "../src/server/commands.ts", "../src/server/received.ts", "../src/server/refusals.ts", "../src/server/intake.ts", "../src/server/input.ts", "../src/server/connection.ts", "../src/server/transport.ts", "../src/server/listener.ts", "../src/server/proxy/address.ts", "../src/server/proxy/header.ts", "../src/server/proxy/reader.ts", "../src/server/proxy/tls.ts", "../src/server/admission.ts", "../src/server/proxy/trusted.ts", "../src/server/tls-context.ts", "../src/server/settings.ts", "../src/server/slots.ts", "../src/server/server.ts"],
4
4
  "sourcesContent": [
5
5
  "import { type Path, POSTMASTER, parsePath } from './path';\n\n/** A command line, split into its verb (upper case) and the rest. */\nexport interface Command {\n\treadonly verb: string;\n\treadonly argument: string;\n}\n\nexport function parseCommand(line: string): Command {\n\tconst space = line.indexOf(' ');\n\tif (space < 0) return { verb: line.toUpperCase(), argument: '' };\n\treturn {\n\t\tverb: line.slice(0, space).toUpperCase(),\n\t\targument: line.slice(space + 1).trim(),\n\t};\n}\n\n/** `MAIL FROM:<path> params` or `RCPT TO:<path> params`, parsed. */\nexport interface PathCommand {\n\treadonly path: Path;\n\t/** ESMTP parameters (RFC 5321 §4.1.2), keys in upper case; a key with no `=` has the value `''`. */\n\treadonly parameters: Readonly<Record<string, string>>;\n}\n\n/**\n * Parses the argument of `MAIL` or `RCPT`: `FROM:<path> params` (or `TO:`).\n * Tolerates a space after the colon, which many clients send. `TO:` also\n * takes `<postmaster>` with no domain, in any case (RFC 5321 §4.1.1.3,\n * §4.5.1), as a path whose `postmaster` is `true`. `undefined` when the\n * syntax is wrong.\n */\nexport function parsePathCommand(\n\targument: string,\n\tkeyword: 'FROM' | 'TO',\n): PathCommand | undefined {\n\tconst match = new RegExp(`^${keyword}:\\\\s*(<[^>]*>)(.*)$`, 'i').exec(\n\t\targument,\n\t);\n\tif (!match) return undefined;\n\tconst text = match[1] as string;\n\tconst path =\n\t\tkeyword === 'TO' && text.toLowerCase() === '<postmaster>'\n\t\t\t? POSTMASTER\n\t\t\t: parsePath(text, keyword === 'FROM');\n\tif (!path) return undefined;\n\tconst parameters: Record<string, string> = {};\n\tfor (const item of (match[2] as string).trim().split(/\\s+/)) {\n\t\tif (item === '') continue;\n\t\tconst equals = item.indexOf('=');\n\t\tconst key = (equals < 0 ? item : item.slice(0, equals)).toUpperCase();\n\t\tif (!/^[A-Z0-9][A-Z0-9-]*$/.test(key)) return undefined;\n\t\tparameters[key] = equals < 0 ? '' : item.slice(equals + 1);\n\t}\n\treturn { path, parameters };\n}\n",
6
6
  "const CR = 0x0d;\nconst LF = 0x0a;\nconst DOT = 0x2e;\n\n/** The result of one chunk of DATA. */\nexport interface DataChunk {\n\t/** The message bytes in this chunk, dot-unstuffed. */\n\treadonly data: Uint8Array;\n\t/** The terminating `<CRLF>.<CRLF>` was read. */\n\treadonly done: boolean;\n\t/** What followed the terminator: the next pipelined commands. */\n\treadonly rest: Uint8Array;\n}\n\n/**\n * Reads the content of `DATA` (RFC 5321 §4.1.1.4): removes the leading dot\n * that §4.5.2 adds to lines starting with one, and stops at `<CRLF>.<CRLF>`\n * — that exact sequence and no other, so a bare LF before a dot cannot end\n * the message (SMTP smuggling). It counts the bare CRs and LFs it meets,\n * for the server to refuse the message.\n */\nexport class DataReader {\n\t/** The next byte starts a line: it follows CRLF, or opens the message. */\n\t#lineStart = true;\n\t/** Bytes held back: a CR, or a dot at a line start, whose meaning depends on what follows. */\n\t#held: number[] = [];\n\t#size = 0;\n\tbareLineBreaks = 0;\n\n\t/** The bytes of message read so far, after unstuffing. */\n\tget size(): number {\n\t\treturn this.#size;\n\t}\n\n\twrite(chunk: Uint8Array): DataChunk {\n\t\t// The output never outgrows the chunk and the two bytes held before it.\n\t\tconst out = new Uint8Array(chunk.length + 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\tconst held = this.#held;\n\t\t\tif (held.length > 0) {\n\t\t\t\t// Held: [CR], [DOT], [DOT, CR].\n\t\t\t\tif (held[0] === DOT && held.length === 1) {\n\t\t\t\t\tif (byte === CR) {\n\t\t\t\t\t\theld.push(CR);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// A stuffed dot: drop it, and read this byte as the line's first.\n\t\t\t\t\tthis.#held = [];\n\t\t\t\t\tthis.#lineStart = false;\n\t\t\t\t\ti--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (held[0] === DOT && held.length === 2) {\n\t\t\t\t\tthis.#held = [];\n\t\t\t\t\tif (byte === LF) {\n\t\t\t\t\t\tthis.#size += n;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tdata: out.subarray(0, n),\n\t\t\t\t\t\t\tdone: true,\n\t\t\t\t\t\t\trest: chunk.slice(i + 1),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t// `.` CR x: the dot was stuffing; the CR is bare.\n\t\t\t\t\tthis.bareLineBreaks++;\n\t\t\t\t\tout[n++] = CR;\n\t\t\t\t\tthis.#lineStart = false;\n\t\t\t\t\ti--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Held a CR.\n\t\t\t\tthis.#held = [];\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\tthis.bareLineBreaks++;\n\t\t\t\tout[n++] = CR;\n\t\t\t\tthis.#lineStart = false;\n\t\t\t\ti--;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (byte === CR) {\n\t\t\t\tthis.#held = [CR];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (byte === DOT && this.#lineStart) {\n\t\t\t\tthis.#held = [DOT];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (byte === LF) this.bareLineBreaks++;\n\t\t\tout[n++] = byte;\n\t\t\tthis.#lineStart = false;\n\t\t}\n\t\tthis.#size += n;\n\t\treturn { data: out.subarray(0, n), done: false, rest: new Uint8Array(0) };\n\t}\n}\n",
@@ -17,19 +17,19 @@
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",
20
- "import type { Socket, SocketHandler } from 'bun';\nimport { reply } from '../protocol/reply';\nimport type { Connection } from './connection';\nimport type { HeaderReader } from './proxy/reader';\nimport type { ProxiedTls } from './proxy/tls';\nimport type { RawSocket } from './raw-socket';\nimport type { Settings } from './settings';\nimport type { Slots } from './slots';\nimport { SocketTransport } from './transport';\n\n/**\n * What a socket of the SMTP server does: the handlers the clear socket and\n * the TLS one share, and the STARTTLS upgrade. The listener's own `open`,\n * `handshake` and `close` are in `admission.ts`.\n */\n\nexport interface SocketState {\n\tconnection?: Connection;\n\ttransport?: SocketTransport;\n\t/** Bytes on the raw socket after STARTTLS are the TLS stream itself: ignored. */\n\tupgraded: boolean;\n\t/**\n\t * Implicit TLS whose handshake has not completed: the socket is counted,\n\t * but bounded by `handshakeTimeout`, and `start` waits for the handshake.\n\t */\n\thandshaking?: boolean;\n\t/** What the server does once the handshake completes: greet, or turn away. */\n\tstart?: () => void;\n\t/** A trusted proxy's PROXY header, still coming: nothing else is read meanwhile. */\n\theader?: HeaderReader;\n\t/** Implicit TLS behind a PROXY header, over this raw socket. */\n\ttls?: ProxiedTls;\n}\n\n/** Bytes from the client, in clear or decrypted: they start the idle time again. */\nexport function received(\n\tsocket: Socket<SocketState>,\n\tsettings: Settings,\n\tchunk: Uint8Array,\n): void {\n\t// A hang-up that lingers waits for the client to stop sending.\n\tsocket.data.transport?.received();\n\t// Any byte from the client starts the idle time again.\n\tsocket.timeout(settings.timeout);\n\tsocket.data.connection?.receive(chunk);\n}\n\n/**\n * The handlers both the clear socket and the TLS one share: input, drain,\n * idle time. `socket.data` is read with `?.` throughout: Bun may report an\n * error or a close on a socket whose `open` never ran.\n */\nexport function handlers(settings: Settings): SocketHandler<SocketState> {\n\tconst idle = reply(\n\t\t421,\n\t\t'4.4.2',\n\t\t`${settings.options.hostname} Idle too long, closing`,\n\t);\n\treturn {\n\t\tdata(socket, chunk) {\n\t\t\tconst state = socket.data;\n\t\t\tif (!state || state.upgraded) return;\n\t\t\tif (state.header) return state.header.receive(chunk);\n\t\t\tif (!state.tls) return received(socket, settings, chunk);\n\t\t\t// TLS records: decrypted, they come back through `received`.\n\t\t\tstate.transport?.received();\n\t\t\tstate.tls.receive(chunk);\n\t\t},\n\t\tdrain(socket) {\n\t\t\tconst state = socket.data;\n\t\t\tif (!state || state.upgraded) return;\n\t\t\tif (state.tls) state.tls.rawDrain();\n\t\t\telse state.transport?.drain();\n\t\t},\n\t\terror(socket) {\n\t\t\tsocket.data?.connection?.close();\n\t\t},\n\t\ttimeout(socket) {\n\t\t\tif (!socket.data || socket.data.upgraded) return;\n\t\t\t// A TLS handshake that never completed: nothing to say, no one to say it to.\n\t\t\tif (socket.data.handshaking) return socket.terminate();\n\t\t\tconst { connection, transport } = socket.data;\n\t\t\t// Closed already, after QUIT, and the 221 still waits for a client\n\t\t\t// that stopped reading: the idle time is up for that too.\n\t\t\tif (connection?.closed) transport?.abort();\n\t\t\telse connection?.close(idle);\n\t\t},\n\t};\n}\n\n/** Writes one reply and hangs up, through a transport so the hang-up is bounded as every other is. */\nexport function turnAway(\n\tsocket: Socket<SocketState>,\n\traw: RawSocket,\n\tsecure: boolean,\n\tline: string,\n): void {\n\tconst refused = new SocketTransport(raw, secure, () => {});\n\tsocket.data.transport = refused;\n\trefused.write(line);\n\trefused.end();\n}\n\n/**\n * Wraps a socket — Bun's, or `ProxiedTls` over it — for the client at\n * `address`; STARTTLS swaps it for the encrypted one.\n */\nexport function transportOf(\n\tsocket: Socket<SocketState>,\n\traw: RawSocket,\n\taddress: string,\n\tsettings: Settings,\n\tsecure: boolean,\n\tslots: Slots<Connection>,\n): SocketTransport {\n\tconst transport = new SocketTransport(\n\t\traw,\n\t\tsecure,\n\t\t() => {\n\t\t\tconst tls = settings.options.tls;\n\t\t\tconst connection = socket.data.connection;\n\t\t\tif (!tls || !connection) return;\n\t\t\tsocket.data.upgraded = true;\n\t\t\tconst [, encrypted] = socket.upgradeTLS<SocketState>({\n\t\t\t\ttls: { key: tls.key, cert: tls.cert },\n\t\t\t\tdata: { connection, upgraded: false },\n\t\t\t\tsocket: {\n\t\t\t\t\t...handlers(settings),\n\t\t\t\t\tclose: (s) => {\n\t\t\t\t\t\tslots.release(connection);\n\t\t\t\t\t\ts.data.transport?.closed();\n\t\t\t\t\t\tconnection.close();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\tencrypted.timeout(settings.timeout);\n\t\t\tconst next = new SocketTransport(\n\t\t\t\tencrypted as Socket<unknown>,\n\t\t\t\ttrue,\n\t\t\t\t() => {},\n\t\t\t\taddress,\n\t\t\t);\n\t\t\tencrypted.data.transport = next;\n\t\t\tconnection.useTransport(next);\n\t\t},\n\t\taddress,\n\t);\n\tsocket.data.transport = transport;\n\treturn transport;\n}\n",
20
+ "import type { Socket, SocketHandler } from 'bun';\nimport { reply } from '../protocol/reply';\nimport type { Connection } from './connection';\nimport type { HeaderReader } from './proxy/reader';\nimport type { ProxiedTls } from './proxy/tls';\nimport type { RawSocket } from './raw-socket';\nimport type { Settings } from './settings';\nimport type { Slots } from './slots';\nimport { SocketTransport } from './transport';\n\n/**\n * What a socket of the SMTP server does: the handlers the clear socket and\n * the TLS one share, and the STARTTLS upgrade. The listener's own `open`,\n * `handshake` and `close` are in `admission.ts`.\n */\n\nexport interface SocketState {\n\tconnection?: Connection;\n\ttransport?: SocketTransport;\n\t/** Bytes on the raw socket after STARTTLS are the TLS stream itself: ignored. */\n\tupgraded: boolean;\n\t/**\n\t * Implicit TLS whose handshake has not completed: the socket is counted,\n\t * but bounded by `handshakeTimeout`, and `start` waits for the handshake.\n\t */\n\thandshaking?: boolean;\n\t/** What the server does once the handshake completes: greet, or turn away. */\n\tstart?: () => void;\n\t/** A trusted proxy's PROXY header, still coming: nothing else is read meanwhile. */\n\theader?: HeaderReader;\n\t/** Implicit TLS behind a PROXY header, over this raw socket. */\n\ttls?: ProxiedTls;\n}\n\n/** Bytes from the client, in clear or decrypted: they start the idle time again. */\nexport function received(\n\tsocket: Socket<SocketState>,\n\tsettings: Settings,\n\tchunk: Uint8Array,\n): void {\n\t// A hang-up that lingers waits for the client to stop sending.\n\tsocket.data.transport?.received();\n\t// Any byte from the client starts the idle time again.\n\tsocket.timeout(settings.timeout);\n\tsocket.data.connection?.receive(chunk);\n}\n\n/**\n * The handlers both the clear socket and the TLS one share: input, drain,\n * idle time. `socket.data` is read with `?.` throughout: Bun may report an\n * error or a close on a socket whose `open` never ran.\n */\nexport function handlers(settings: Settings): SocketHandler<SocketState> {\n\tconst idle = reply(\n\t\t421,\n\t\t'4.4.2',\n\t\t`${settings.options.hostname} Idle too long, closing`,\n\t);\n\treturn {\n\t\tdata(socket, chunk) {\n\t\t\tconst state = socket.data;\n\t\t\tif (!state || state.upgraded) return;\n\t\t\tif (state.header) return state.header.receive(chunk);\n\t\t\tif (!state.tls) return received(socket, settings, chunk);\n\t\t\t// TLS records: decrypted, they come back through `received`.\n\t\t\tstate.transport?.received();\n\t\t\tstate.tls.receive(chunk);\n\t\t},\n\t\tdrain(socket) {\n\t\t\tconst state = socket.data;\n\t\t\tif (!state || state.upgraded) return;\n\t\t\tif (state.tls) state.tls.rawDrain();\n\t\t\telse state.transport?.drain();\n\t\t},\n\t\terror(socket) {\n\t\t\tsocket.data?.connection?.close();\n\t\t},\n\t\ttimeout(socket) {\n\t\t\tif (!socket.data || socket.data.upgraded) return;\n\t\t\t// A TLS handshake that never completed: nothing to say, no one to say it to.\n\t\t\tif (socket.data.handshaking) return socket.terminate();\n\t\t\tconst { connection, transport } = socket.data;\n\t\t\t// Closed already, after QUIT, and the 221 still waits for a client\n\t\t\t// that stopped reading: the idle time is up for that too.\n\t\t\tif (connection?.closed) transport?.abort();\n\t\t\telse connection?.close(idle);\n\t\t},\n\t};\n}\n\n/** Writes one reply and hangs up, through a transport so the hang-up is bounded as every other is. */\nexport function turnAway(\n\tsocket: Socket<SocketState>,\n\traw: RawSocket,\n\tsecure: boolean,\n\tline: string,\n): void {\n\tconst refused = new SocketTransport(raw, secure, () => {});\n\tsocket.data.transport = refused;\n\trefused.write(line);\n\trefused.end();\n}\n\n/**\n * Wraps a socket — Bun's, or `ProxiedTls` over it — for the client at\n * `address`; STARTTLS swaps it for the encrypted one.\n */\nexport function transportOf(\n\tsocket: Socket<SocketState>,\n\traw: RawSocket,\n\taddress: string,\n\tsettings: Settings,\n\tsecure: boolean,\n\tslots: Slots<Connection>,\n): SocketTransport {\n\tconst transport = new SocketTransport(\n\t\traw,\n\t\tsecure,\n\t\t() => {\n\t\t\tconst tls = settings.tls?.options;\n\t\t\tconst connection = socket.data.connection;\n\t\t\tif (!tls || !connection) return;\n\t\t\tsocket.data.upgraded = true;\n\t\t\tconst [, encrypted] = socket.upgradeTLS<SocketState>({\n\t\t\t\ttls: { key: tls.key, cert: tls.cert },\n\t\t\t\tdata: { connection, upgraded: false },\n\t\t\t\tsocket: {\n\t\t\t\t\t...handlers(settings),\n\t\t\t\t\tclose: (s) => {\n\t\t\t\t\t\tslots.release(connection);\n\t\t\t\t\t\ts.data.transport?.closed();\n\t\t\t\t\t\tconnection.close();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\tencrypted.timeout(settings.timeout);\n\t\t\tconst next = new SocketTransport(\n\t\t\t\tencrypted as Socket<unknown>,\n\t\t\t\ttrue,\n\t\t\t\t() => {},\n\t\t\t\taddress,\n\t\t\t);\n\t\t\tencrypted.data.transport = next;\n\t\t\tconnection.useTransport(next);\n\t\t},\n\t\taddress,\n\t);\n\tsocket.data.transport = transport;\n\treturn transport;\n}\n",
21
21
  "import { isIP } from 'node:net';\n\n/**\n * IP addresses as bytes, for the PROXY protocol: what `trusted` lists and\n * what a header names. An IPv4-mapped IPv6 address (`::ffff:192.0.2.1`)\n * is its IPv4 address, in both: a dual-stack listener reports an IPv4\n * peer that way.\n */\n\n/** The 4 or 16 bytes of an IP address, or `undefined` for anything else, a zone included. */\nexport function addressBytes(text: string): Uint8Array | undefined {\n\t// A zone (`fe80::1%eth0`) names an interface of this host, never a client's.\n\tif (text.includes('%')) return undefined;\n\tconst kind = isIP(text);\n\tif (kind === 4) return new Uint8Array(text.split('.').map(Number));\n\tif (kind !== 6) return undefined;\n\treturn unmapped(ipv6Bytes(text.toLowerCase()));\n}\n\n/** The 16 bytes of a valid IPv6 address, a dotted tail included. */\nfunction ipv6Bytes(text: string): Uint8Array {\n\tconst bytes = new Uint8Array(16);\n\tlet tail = text;\n\tconst dotted = /(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$/.exec(text);\n\tif (dotted) {\n\t\tbytes.set(dotted.slice(1).map(Number), 12);\n\t\ttail = `${text.slice(0, dotted.index)}0:0`;\n\t}\n\tconst [head = '', rest] = tail.split('::');\n\tconst left = head === '' ? [] : head.split(':');\n\tconst right = rest === undefined || rest === '' ? [] : rest.split(':');\n\tconst groups =\n\t\trest === undefined\n\t\t\t? left\n\t\t\t: [...left, ...Array(8 - left.length - right.length).fill('0'), ...right];\n\tconst view = new DataView(bytes.buffer);\n\tgroups.forEach((group, at) => {\n\t\tif (!dotted || at < 6) view.setUint16(at * 2, Number.parseInt(group, 16));\n\t});\n\treturn bytes;\n}\n\n/** An IPv4-mapped address as its 4 bytes; any other as it is. */\nexport function unmapped(bytes: Uint8Array): Uint8Array {\n\tif (bytes.length !== 16) return bytes;\n\tconst mapped =\n\t\tbytes.subarray(0, 10).every((byte) => byte === 0) &&\n\t\tbytes[10] === 0xff &&\n\t\tbytes[11] === 0xff;\n\treturn mapped ? bytes.slice(12) : bytes;\n}\n\n/**\n * An address's text: dotted for IPv4 (an IPv4-mapped address included),\n * RFC 5952's form for IPv6 — lower case, no leading zeros, the longest\n * run of two zero groups or more as `::`.\n */\nexport function formatAddress(raw: Uint8Array): string {\n\tconst bytes = unmapped(raw);\n\tif (bytes.length === 4) return bytes.join('.');\n\tconst view = new DataView(bytes.buffer, bytes.byteOffset, 16);\n\tconst groups = Array.from({ length: 8 }, (_, at) => view.getUint16(at * 2));\n\tlet best = { at: -1, length: 1 };\n\tfor (let at = 0; at < 8; ) {\n\t\tlet end = at;\n\t\twhile (end < 8 && groups[end] === 0) end++;\n\t\tif (end - at > best.length) best = { at, length: end - at };\n\t\tat = end === at ? at + 1 : end;\n\t}\n\tconst hex = groups.map((group) => group.toString(16));\n\tif (best.at < 0) return hex.join(':');\n\tconst left = hex.slice(0, best.at).join(':');\n\tconst right = hex.slice(best.at + best.length).join(':');\n\treturn `${left}::${right}`;\n}\n",
22
22
  "import { addressBytes, formatAddress } from './address';\n\n/**\n * The PROXY protocol header (HAProxy's proxy-protocol.txt, versions 1 and\n * 2) a TCP proxy sends before anything of the client's, read from the\n * bytes received so far. `source` is the client's address, or absent to\n * keep the peer's: a v2 LOCAL (a health check from the proxy itself), an\n * UNSPEC, UNIX or datagram address, a v1 UNKNOWN.\n */\nexport type ProxyHeader =\n\t| { readonly status: 'partial' }\n\t| { readonly status: 'invalid'; readonly reason: string }\n\t| {\n\t\t\treadonly status: 'complete';\n\t\t\t/** Bytes of the header: what follows is the client's. */\n\t\t\treadonly length: number;\n\t\t\treadonly source?: string;\n\t };\n\n/** A v1 line, CRLF included, is 107 bytes at most. */\nexport const MAX_V1_LENGTH = 107;\n/** v2's addresses take 216 bytes at most (two UNIX paths); TLVs past this are refused. */\nexport const MAX_TLV_BYTES = 2048;\n/** The longest header read: past it, whatever the bytes, the header is refused. */\nexport const MAX_HEADER_LENGTH = 16 + 216 + MAX_TLV_BYTES;\n\nconst V1_PREFIX = new TextEncoder().encode('PROXY ');\nconst V2_SIGNATURE = new Uint8Array([\n\t0x0d, 0x0a, 0x0d, 0x0a, 0x00, 0x0d, 0x0a, 0x51, 0x55, 0x49, 0x54, 0x0a,\n]);\n/** v2 address block length by family: UNSPEC, INET, INET6, UNIX. */\nconst ADDRESS_LENGTH = [0, 12, 36, 216] as const;\n\nconst PARTIAL = { status: 'partial' } as const;\nconst invalid = (reason: string) => ({ status: 'invalid', reason }) as const;\n\n/** The bytes so far agree with `prefix` as far as both go. */\nfunction startsAs(bytes: Uint8Array, prefix: Uint8Array): boolean {\n\tconst length = Math.min(bytes.length, prefix.length);\n\tfor (let at = 0; at < length; at++) {\n\t\tif (bytes[at] !== prefix[at]) return false;\n\t}\n\treturn true;\n}\n\nexport function readProxyHeader(bytes: Uint8Array): ProxyHeader {\n\tif (bytes.length === 0) return PARTIAL;\n\tif (startsAs(bytes, V2_SIGNATURE)) return readV2(bytes);\n\tif (startsAs(bytes, V1_PREFIX)) return readV1(bytes);\n\treturn invalid('no PROXY protocol signature');\n}\n\nfunction readV2(bytes: Uint8Array): ProxyHeader {\n\tif (bytes.length < 16) return PARTIAL;\n\tconst view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\tconst versionCommand = view.getUint8(12);\n\tif (versionCommand >> 4 !== 2) return invalid('not version 2');\n\tconst command = versionCommand & 0x0f;\n\tif (command > 1) return invalid(`unknown command ${command}`);\n\tconst family = view.getUint8(13) >> 4;\n\tconst transport = view.getUint8(13) & 0x0f;\n\tconst length = view.getUint16(14);\n\t// LOCAL: the proxy's own connection; its address block is ignored.\n\tconst addresses = command === 0 ? 0 : ADDRESS_LENGTH[family as 0 | 1 | 2 | 3];\n\tif (addresses === undefined || transport > 2) {\n\t\treturn invalid('unknown address family or transport');\n\t}\n\tif (length < addresses) return invalid('address block too short');\n\t// Refused from the first 16 bytes, before any of it is waited for.\n\tif (length - addresses > MAX_TLV_BYTES) return invalid('TLVs too long');\n\tconst total = 16 + length;\n\tif (bytes.length < total) return PARTIAL;\n\tif (command === 0) return { status: 'complete', length: total };\n\tconst tlvs = bytes.subarray(16 + addresses, total);\n\tif (!wellFormedTlvs(tlvs)) return invalid('malformed TLV');\n\t// Only a TCP client over IPv4 or IPv6 replaces the peer's address.\n\tif (transport !== 1 || (family !== 1 && family !== 2)) {\n\t\treturn { status: 'complete', length: total };\n\t}\n\tconst size = family === 1 ? 4 : 16;\n\tconst source = formatAddress(bytes.slice(16, 16 + size));\n\treturn { status: 'complete', length: total, source };\n}\n\n/** Each TLV — a type, a 16-bit length, its value — ends within the block: skipped, never read. */\nfunction wellFormedTlvs(block: Uint8Array): boolean {\n\tlet at = 0;\n\twhile (at < block.length) {\n\t\tif (at + 3 > block.length) return false;\n\t\tconst length = ((block[at + 1] as number) << 8) | (block[at + 2] as number);\n\t\tat += 3 + length;\n\t}\n\treturn at === block.length;\n}\n\nconst PORT = /^(0|[1-9]\\d{0,4})$/;\n\nfunction readV1(bytes: Uint8Array): ProxyHeader {\n\tconst end = bytes.indexOf(0x0a);\n\tif (end < 0) {\n\t\treturn bytes.length >= MAX_V1_LENGTH\n\t\t\t? invalid('v1 line too long')\n\t\t\t: PARTIAL;\n\t}\n\tif (end + 1 > MAX_V1_LENGTH) return invalid('v1 line too long');\n\tif (bytes[end - 1] !== 0x0d) return invalid('v1 line without CRLF');\n\tconst line = bytes.subarray(0, end - 1);\n\tif (line.some((byte) => byte < 0x20 || byte > 0x7e)) {\n\t\treturn invalid('v1 line not printable');\n\t}\n\tconst [, protocol, ...rest] = new TextDecoder().decode(line).split(' ');\n\tif (protocol === 'UNKNOWN') return { status: 'complete', length: end + 1 };\n\tconst [source = '', destination = '', sourcePort = '', port = ''] = rest;\n\tconst size = protocol === 'TCP4' ? 4 : protocol === 'TCP6' ? 16 : 0;\n\tif (size === 0) return invalid('v1 protocol not TCP4, TCP6 or UNKNOWN');\n\tconst from = rawAddress(source, size);\n\tif (\n\t\trest.length !== 4 ||\n\t\t!from ||\n\t\t!rawAddress(destination, size) ||\n\t\t!validPort(sourcePort) ||\n\t\t!validPort(port)\n\t) {\n\t\treturn invalid('v1 addresses or ports malformed');\n\t}\n\treturn { status: 'complete', length: end + 1, source: formatAddress(from) };\n}\n\n/** The bytes of `text` written as an address of `size` bytes: no IPv4-mapped shortcut for TCP6. */\nfunction rawAddress(text: string, size: number): Uint8Array | undefined {\n\tif (size === 4 && text.includes(':')) return undefined;\n\tif (size === 16 && !text.includes(':')) return undefined;\n\treturn addressBytes(text);\n}\n\nfunction validPort(text: string): boolean {\n\treturn PORT.test(text) && Number(text) <= 65_535;\n}\n",
23
23
  "import { MAX_HEADER_LENGTH, readProxyHeader } from './header';\n\n/**\n * Reads the PROXY header a trusted proxy sends first, chunk by chunk, within\n * `seconds` from the TCP connection, however slowly it comes. `done` gets\n * the client's address (`undefined` to keep the peer's) and what followed\n * the header; `refuse` is called for a header that is malformed, too long\n * or too late. Either is called once, and the reader then ignores input.\n */\nexport class HeaderReader {\n\t#bytes = new Uint8Array(0);\n\t#timer: ReturnType<typeof setTimeout> | undefined;\n\t#settled = false;\n\treadonly #done: (source: string | undefined, rest: Uint8Array) => void;\n\treadonly #refuse: () => void;\n\n\tconstructor(\n\t\tseconds: number,\n\t\tdone: (source: string | undefined, rest: Uint8Array) => void,\n\t\trefuse: () => void,\n\t) {\n\t\tthis.#done = done;\n\t\tthis.#refuse = refuse;\n\t\tthis.#timer = setTimeout(() => this.#settle(refuse), seconds * 1000);\n\t\tthis.#timer.unref?.();\n\t}\n\n\treceive(chunk: Uint8Array): void {\n\t\tif (this.#settled) return;\n\t\tconst bytes = new Uint8Array(this.#bytes.length + chunk.length);\n\t\tbytes.set(this.#bytes);\n\t\tbytes.set(chunk, this.#bytes.length);\n\t\tthis.#bytes = bytes;\n\t\tconst header = readProxyHeader(bytes);\n\t\tif (header.status === 'complete') {\n\t\t\tconst rest = bytes.slice(header.length);\n\t\t\tthis.#settle(() => this.#done(header.source, rest));\n\t\t} else if (\n\t\t\theader.status === 'invalid' ||\n\t\t\tbytes.length >= MAX_HEADER_LENGTH\n\t\t) {\n\t\t\tthis.#settle(this.#refuse);\n\t\t}\n\t}\n\n\t/** The socket closed first: no timer is left behind. */\n\tcancel(): void {\n\t\tthis.#settled = true;\n\t\tclearTimeout(this.#timer);\n\t\tthis.#bytes = new Uint8Array(0);\n\t}\n\n\t#settle(then: () => void): void {\n\t\tif (this.#settled) return;\n\t\tthis.cancel();\n\t\tthen();\n\t}\n}\n",
24
24
  "import { Duplex } from 'node:stream';\nimport { type SecureContext, TLSSocket } from 'node:tls';\nimport type { Socket } from 'bun';\n\n/** What the TLS session tells the listener. */\nexport interface TlsEvents {\n\t/** The handshake completed. */\n\tsecure(): void;\n\t/** Bytes from the client, decrypted. */\n\tdata(bytes: Uint8Array): void;\n\t/** What was written has left: the transport may write more. */\n\tdrain(): void;\n}\n\n/**\n * Implicit TLS behind a PROXY header. A listener with `tls` would take the\n * header for a broken ClientHello, so the listener is a clear one, and TLS\n * starts once the header is read. Bun's `socket.upgradeTLS` cannot be\n * used: it reads only what arrives after it, and a proxy sends the\n * client's ClientHello in the same segment as the header as often as not\n * (Bun 1.4.2: the handshake then never completes). So the TLS session is\n * `node:tls` over a stream this class feeds: what followed the header\n * first, then every chunk of the raw socket's `data` (`receive`).\n *\n * It has the shape of the Bun socket a `SocketTransport` drives. `write`\n * takes nothing while TLS holds more than its high-water mark, and\n * `drain` comes once it took it all; the stream under it hands the raw\n * socket what it takes and waits for the raw `drain` for the rest, so a\n * client that reads slowly holds the server back, never its memory.\n */\nexport class ProxiedTls {\n\treadonly #raw: Socket<unknown>;\n\treadonly #wire: Duplex;\n\treadonly #tls: TLSSocket;\n\t/** What the raw socket did not take yet, and the stream's callback for it. */\n\t#pending: { bytes: Uint8Array; done: () => void } | undefined;\n\t/** How the raw socket closes once TLS ended: `shutdown(true)` or `shutdown()`. */\n\t#halfClose = true;\n\n\tconstructor(raw: Socket<unknown>, context: SecureContext, events: TlsEvents) {\n\t\tthis.#raw = raw;\n\t\tthis.#wire = new Duplex({\n\t\t\tread() {},\n\t\t\twrite: (chunk: Uint8Array, _encoding, done) => this.#send(chunk, done),\n\t\t\tfinal: (done) => {\n\t\t\t\tthis.#raw.shutdown(this.#halfClose);\n\t\t\t\tdone();\n\t\t\t},\n\t\t});\n\t\tthis.#tls = new TLSSocket(this.#wire as never, {\n\t\t\tisServer: true,\n\t\t\tsecureContext: context,\n\t\t});\n\t\tthis.#tls.on('secure', () => events.secure());\n\t\tthis.#tls.on('data', (bytes: Uint8Array) => events.data(bytes));\n\t\tthis.#tls.on('drain', () => events.drain());\n\t\t// A broken handshake or record: nothing to say, no one to say it to.\n\t\tthis.#tls.on('error', () => this.terminate());\n\t}\n\n\tget remoteAddress(): string {\n\t\treturn this.#raw.remoteAddress;\n\t}\n\n\t/** The raw socket's `data`: TLS records from the client. */\n\treceive(chunk: Uint8Array): void {\n\t\tthis.#wire.push(Uint8Array.from(chunk));\n\t}\n\n\t/** The raw socket's `drain`: it can take more of what TLS wrote. */\n\trawDrain(): void {\n\t\tconst pending = this.#pending;\n\t\tif (!pending) return;\n\t\tconst written = Math.max(this.#raw.write(pending.bytes), 0);\n\t\tif (written < pending.bytes.length) {\n\t\t\tpending.bytes = pending.bytes.subarray(written);\n\t\t\treturn;\n\t\t}\n\t\tthis.#pending = undefined;\n\t\tpending.done();\n\t}\n\n\t#send(chunk: Uint8Array, done: () => void): void {\n\t\tconst written = Math.max(this.#raw.write(chunk), 0);\n\t\tif (written < chunk.length) {\n\t\t\tthis.#pending = { bytes: chunk.subarray(written), done };\n\t\t} else done();\n\t}\n\n\twrite(bytes: Uint8Array): number {\n\t\tif (this.#tls.destroyed || this.#tls.writableNeedDrain) return 0;\n\t\tthis.#tls.write(bytes);\n\t\treturn bytes.length;\n\t}\n\n\t/**\n\t * Ends TLS — a close_notify after everything written — then the raw\n\t * socket, as `shutdown(halfClose)` would. Nothing written is lost, so\n\t * the two differ only in the raw socket's close.\n\t */\n\tshutdown(halfClose = false): void {\n\t\tthis.#halfClose = halfClose;\n\t\t// TLS ended — its close_notify written to the wire — ends the wire too,\n\t\t// which closes the raw socket once what it holds has left: waiting for\n\t\t// the client's own close_notify would hold a client that stopped\n\t\t// reading for as long as it likes.\n\t\tthis.#tls.once('finish', () => this.#wire.end());\n\t\tthis.#tls.end();\n\t}\n\n\tterminate(): void {\n\t\tthis.#pending = undefined;\n\t\tthis.#tls.destroy();\n\t\tthis.#raw.terminate();\n\t}\n\n\t/** The raw socket closed: TLS has nowhere to go. */\n\tclosed(): void {\n\t\tthis.#pending = undefined;\n\t\tthis.#tls.destroy();\n\t}\n\n\tpause(): void {\n\t\tthis.#raw.pause();\n\t}\n\n\tresume(): void {\n\t\tthis.#raw.resume();\n\t}\n\n\ttimeout(seconds: number): void {\n\t\tthis.#raw.timeout(seconds);\n\t}\n}\n",
25
- "import type { SecureContext } from 'node:tls';\nimport type { Socket, SocketHandler } from 'bun';\nimport { clientKey } from './client-key';\nimport { Connection } from './connection';\nimport { received, type SocketState, transportOf, turnAway } from './listener';\nimport { HeaderReader } from './proxy/reader';\nimport { ProxiedTls } from './proxy/tls';\nimport type { RawSocket } from './raw-socket';\nimport type { Settings } from './settings';\nimport type { Slots } from './slots';\n\n/**\n * The listener's own handlers: `open` counts a socket and greets it or\n * turns it away, `handshake` lets implicit TLS start once encrypted,\n * `close` frees the slot.\n *\n * Behind a trusted proxy (`proxyProtocol`), `open` only starts reading the\n * header: the socket is counted, by the client's address, once the header\n * named it. On implicit TLS with `proxyProtocol`, the listener is a clear\n * one and `proxied` is the TLS context: every socket's TLS runs through\n * `ProxiedTls`, after the header from a trusted proxy, from the first byte\n * from anyone else.\n */\nexport interface Listening {\n\treadonly settings: Settings;\n\treadonly slots: Slots<Connection>;\n\t/** Sockets still in their handshake or awaiting a PROXY header, for `stop(true)`. */\n\treadonly handshaking: Set<Socket<SocketState>>;\n\t/** TLS from the first byte: implicit TLS. */\n\treadonly secure: boolean;\n\treadonly proxied?: SecureContext;\n}\n\nexport function listenerHandlers(\n\tlistening: Listening,\n): Pick<SocketHandler<SocketState>, 'open' | 'handshake' | 'close'> {\n\tconst { settings, slots, handshaking, secure } = listening;\n\treturn {\n\t\t// With a `handshake` handler, Bun calls `open` on implicit TLS\n\t\t// as soon as TCP connects; without one, only once the\n\t\t// handshake completed, so a client that never sends its\n\t\t// ClientHello would be counted by no limit and bounded by no\n\t\t// timer.\n\t\topen(socket) {\n\t\t\tsocket.data = { upgraded: false, handshaking: secure };\n\t\t\tsocket.timeout(secure ? settings.handshakeTimeout : settings.timeout);\n\t\t\tconst peer = socket.remoteAddress;\n\t\t\tif (settings.trusts?.(peer)) awaitHeader(listening, socket, peer);\n\t\t\telse admit(listening, socket, peer);\n\t\t},\n\t\thandshake: (socket, success) => handshake(listening, socket, success),\n\t\tclose(socket) {\n\t\t\thandshaking.delete(socket);\n\t\t\tsocket.data?.header?.cancel();\n\t\t\tsocket.data?.tls?.closed();\n\t\t\tconst connection = socket.data?.connection;\n\t\t\tif (connection) slots.release(connection);\n\t\t\tsocket.data?.transport?.closed();\n\t\t\tconnection?.close();\n\t\t},\n\t};\n}\n\nfunction handshake(\n\t{ settings, handshaking }: Listening,\n\tsocket: Socket<SocketState>,\n\tsuccess: boolean,\n): void {\n\tconst state = socket.data;\n\tif (!state?.handshaking) return;\n\thandshaking.delete(socket);\n\t// A failed handshake: Bun closes the socket, and `close` counts it out.\n\tif (!success) return;\n\tstate.handshaking = false;\n\tsocket.timeout(settings.timeout);\n\tconst start = state.start;\n\tdelete state.start;\n\tstart?.();\n}\n\n/**\n * A trusted proxy's socket: its header first, within `handshakeTimeout`\n * however slowly it comes, or the socket is reset — nothing written,\n * nothing reported, nothing counted. The proxy's own address is never a\n * client's: no limit counts the socket before the header named one.\n */\nfunction awaitHeader(\n\tlistening: Listening,\n\tsocket: Socket<SocketState>,\n\tpeer: string,\n): void {\n\tconst { settings, handshaking, secure } = listening;\n\tsocket.data.handshaking = true;\n\tsocket.timeout(settings.handshakeTimeout);\n\thandshaking.add(socket);\n\tsocket.data.header = new HeaderReader(\n\t\tsettings.handshakeTimeout,\n\t\t(source, rest) => {\n\t\t\tdelete socket.data.header;\n\t\t\thandshaking.delete(socket);\n\t\t\tsocket.data.handshaking = secure;\n\t\t\tif (!secure) socket.timeout(settings.timeout);\n\t\t\tadmit(listening, socket, source ?? peer, rest);\n\t\t},\n\t\t() => socket.terminate(),\n\t);\n}\n\n/** Counts the socket as the client at `address`, then greets it or turns it away. */\nfunction admit(\n\tlistening: Listening,\n\tsocket: Socket<SocketState>,\n\taddress: string,\n\tfirst?: Uint8Array,\n): void {\n\tconst { settings, slots, handshaking, secure, proxied } = listening;\n\tlet raw: RawSocket = socket;\n\tif (proxied) {\n\t\traw = startTls(listening, socket, proxied);\n\t\tif (first && first.length > 0) socket.data.tls?.receive(first);\n\t}\n\tconst begin = (start: () => void) => {\n\t\tif (!secure) return start();\n\t\thandshaking.add(socket);\n\t\tsocket.data.start = start;\n\t};\n\tconst { hostname } = settings.options;\n\tconst refuse = (line: string) =>\n\t\tbegin(() => turnAway(socket, raw, secure, `${line}\\r\\n`));\n\tif (slots.size >= settings.maxConnections) {\n\t\trefuse(`421 4.3.2 ${hostname} Too many connections, try later`);\n\t\treturn;\n\t}\n\tconst key = clientKey(address);\n\tif (slots.of(key) >= settings.maxConnectionsPerClient) {\n\t\trefuse(\n\t\t\t`421 4.7.0 ${hostname} Too many connections from your address, try later`,\n\t\t);\n\t\treturn;\n\t}\n\tconst transport = transportOf(socket, raw, address, settings, secure, slots);\n\tconst connection = new Connection(settings, transport);\n\tslots.take(connection, key);\n\tsocket.data.connection = connection;\n\t// What the client sent behind the header, before its greeting.\n\tif (first && first.length > 0 && !proxied) {\n\t\treceived(socket, settings, first);\n\t}\n\tbegin(() => void connection.open());\n}\n\n/** Implicit TLS behind `proxyProtocol`: `node:tls` over the raw socket, bounded by `handshakeTimeout`. */\nfunction startTls(\n\tlistening: Listening,\n\tsocket: Socket<SocketState>,\n\tcontext: SecureContext,\n): ProxiedTls {\n\tconst { settings } = listening;\n\tsocket.data.handshaking = true;\n\tsocket.timeout(settings.handshakeTimeout);\n\tconst tls = new ProxiedTls(socket as Socket<unknown>, context, {\n\t\tsecure: () => handshake(listening, socket, true),\n\t\tdata: (bytes) => received(socket, settings, bytes),\n\t\tdrain: () => socket.data.transport?.drain(),\n\t});\n\tsocket.data.tls = tls;\n\treturn tls;\n}\n",
25
+ "import type { Socket, SocketHandler } from 'bun';\nimport { clientKey } from './client-key';\nimport { Connection } from './connection';\nimport { received, type SocketState, transportOf, turnAway } from './listener';\nimport { HeaderReader } from './proxy/reader';\nimport { ProxiedTls } from './proxy/tls';\nimport type { RawSocket } from './raw-socket';\nimport type { Settings } from './settings';\nimport type { Slots } from './slots';\nimport type { TlsHolder } from './tls-context';\n\n/**\n * The listener's own handlers: `open` counts a socket and greets it or\n * turns it away, `handshake` lets implicit TLS start once encrypted,\n * `close` frees the slot.\n *\n * Behind a trusted proxy (`proxyProtocol`), `open` only starts reading the\n * header: the socket is counted, by the client's address, once the header\n * named it. On implicit TLS with `proxyProtocol`, the listener is a clear\n * one and `proxied` is the TLS context: every socket's TLS runs through\n * `ProxiedTls`, after the header from a trusted proxy, from the first byte\n * from anyone else.\n */\nexport interface Listening {\n\treadonly settings: Settings;\n\treadonly slots: Slots<Connection>;\n\t/** Sockets still in their handshake or awaiting a PROXY header, for `stop(true)`. */\n\treadonly handshaking: Set<Socket<SocketState>>;\n\t/** TLS from the first byte: implicit TLS. */\n\treadonly secure: boolean;\n\treadonly proxied?: TlsHolder;\n}\n\nexport function listenerHandlers(\n\tlistening: Listening,\n): Pick<SocketHandler<SocketState>, 'open' | 'handshake' | 'close'> {\n\tconst { settings, slots, handshaking, secure } = listening;\n\treturn {\n\t\t// With a `handshake` handler, Bun calls `open` on implicit TLS\n\t\t// as soon as TCP connects; without one, only once the\n\t\t// handshake completed, so a client that never sends its\n\t\t// ClientHello would be counted by no limit and bounded by no\n\t\t// timer.\n\t\topen(socket) {\n\t\t\tsocket.data = { upgraded: false, handshaking: secure };\n\t\t\tsocket.timeout(secure ? settings.handshakeTimeout : settings.timeout);\n\t\t\tconst peer = socket.remoteAddress;\n\t\t\tif (settings.trusts?.(peer)) awaitHeader(listening, socket, peer);\n\t\t\telse admit(listening, socket, peer);\n\t\t},\n\t\thandshake: (socket, success) => handshake(listening, socket, success),\n\t\tclose(socket) {\n\t\t\thandshaking.delete(socket);\n\t\t\tsocket.data?.header?.cancel();\n\t\t\tsocket.data?.tls?.closed();\n\t\t\tconst connection = socket.data?.connection;\n\t\t\tif (connection) slots.release(connection);\n\t\t\tsocket.data?.transport?.closed();\n\t\t\tconnection?.close();\n\t\t},\n\t};\n}\n\nfunction handshake(\n\t{ settings, handshaking }: Listening,\n\tsocket: Socket<SocketState>,\n\tsuccess: boolean,\n): void {\n\tconst state = socket.data;\n\tif (!state?.handshaking) return;\n\thandshaking.delete(socket);\n\t// A failed handshake: Bun closes the socket, and `close` counts it out.\n\tif (!success) return;\n\tstate.handshaking = false;\n\tsocket.timeout(settings.timeout);\n\tconst start = state.start;\n\tdelete state.start;\n\tstart?.();\n}\n\n/**\n * A trusted proxy's socket: its header first, within `handshakeTimeout`\n * however slowly it comes, or the socket is reset — nothing written,\n * nothing reported, nothing counted. The proxy's own address is never a\n * client's: no limit counts the socket before the header named one.\n */\nfunction awaitHeader(\n\tlistening: Listening,\n\tsocket: Socket<SocketState>,\n\tpeer: string,\n): void {\n\tconst { settings, handshaking, secure } = listening;\n\tsocket.data.handshaking = true;\n\tsocket.timeout(settings.handshakeTimeout);\n\thandshaking.add(socket);\n\tsocket.data.header = new HeaderReader(\n\t\tsettings.handshakeTimeout,\n\t\t(source, rest) => {\n\t\t\tdelete socket.data.header;\n\t\t\thandshaking.delete(socket);\n\t\t\tsocket.data.handshaking = secure;\n\t\t\tif (!secure) socket.timeout(settings.timeout);\n\t\t\tadmit(listening, socket, source ?? peer, rest);\n\t\t},\n\t\t() => socket.terminate(),\n\t);\n}\n\n/** Counts the socket as the client at `address`, then greets it or turns it away. */\nfunction admit(\n\tlistening: Listening,\n\tsocket: Socket<SocketState>,\n\taddress: string,\n\tfirst?: Uint8Array,\n): void {\n\tconst { settings, slots, handshaking, secure, proxied } = listening;\n\tlet raw: RawSocket = socket;\n\tif (proxied) {\n\t\traw = startTls(listening, socket, proxied);\n\t\tif (first && first.length > 0) socket.data.tls?.receive(first);\n\t}\n\tconst begin = (start: () => void) => {\n\t\tif (!secure) return start();\n\t\thandshaking.add(socket);\n\t\tsocket.data.start = start;\n\t};\n\tconst { hostname } = settings.options;\n\tconst refuse = (line: string) =>\n\t\tbegin(() => turnAway(socket, raw, secure, `${line}\\r\\n`));\n\tif (slots.size >= settings.maxConnections) {\n\t\trefuse(`421 4.3.2 ${hostname} Too many connections, try later`);\n\t\treturn;\n\t}\n\tconst key = clientKey(address);\n\tif (slots.of(key) >= settings.maxConnectionsPerClient) {\n\t\trefuse(\n\t\t\t`421 4.7.0 ${hostname} Too many connections from your address, try later`,\n\t\t);\n\t\treturn;\n\t}\n\tconst transport = transportOf(socket, raw, address, settings, secure, slots);\n\tconst connection = new Connection(settings, transport);\n\tslots.take(connection, key);\n\tsocket.data.connection = connection;\n\t// What the client sent behind the header, before its greeting.\n\tif (first && first.length > 0 && !proxied) {\n\t\treceived(socket, settings, first);\n\t}\n\tbegin(() => void connection.open());\n}\n\n/** Implicit TLS behind `proxyProtocol`: `node:tls` over the raw socket, bounded by `handshakeTimeout`. */\nfunction startTls(\n\tlistening: Listening,\n\tsocket: Socket<SocketState>,\n\ttls: TlsHolder,\n): ProxiedTls {\n\tconst { settings } = listening;\n\tsocket.data.handshaking = true;\n\tsocket.timeout(settings.handshakeTimeout);\n\tconst proxied = new ProxiedTls(socket as Socket<unknown>, tls.context, {\n\t\tsecure: () => handshake(listening, socket, true),\n\t\tdata: (bytes) => received(socket, settings, bytes),\n\t\tdrain: () => socket.data.transport?.drain(),\n\t});\n\tsocket.data.tls = proxied;\n\treturn proxied;\n}\n\n/**\n * Implicit TLS without a proxy: the listener is clear and each socket is\n * upgraded as it opens, with the pair in use then, so a pair `setTls`\n * replaced applies to the next connection and not to the open ones. The\n * encrypted socket has the handlers of a TLS listener's; the clear one\n * only carries the TLS records, which the encrypted one reads.\n */\nexport function upgradingHandlers(\n\tencrypted: SocketHandler<SocketState>,\n\tsettings: Settings,\n): SocketHandler<SocketState> {\n\tconst ignore = () => {};\n\treturn {\n\t\topen(raw) {\n\t\t\tconst tls = settings.tls?.options;\n\t\t\tif (!tls) return raw.terminate();\n\t\t\ttry {\n\t\t\t\traw.upgradeTLS<SocketState>({\n\t\t\t\t\ttls: { key: tls.key, cert: tls.cert },\n\t\t\t\t\tdata: { upgraded: false },\n\t\t\t\t\tsocket: encrypted,\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\traw.terminate();\n\t\t\t}\n\t\t},\n\t\tdata: ignore,\n\t\tdrain: ignore,\n\t\tclose: ignore,\n\t\terror: ignore,\n\t\ttimeout: ignore,\n\t};\n}\n",
26
26
  "import { addressBytes } from './address';\n\n/** One entry of `trusted`: a network, as its bytes and how many of its bits count. */\ninterface Network {\n\treadonly bytes: Uint8Array;\n\treadonly bits: number;\n}\n\n/** An entry as a network, or why it is not one. */\nfunction networkOf(entry: unknown): Network | string {\n\tif (typeof entry !== 'string') return `${String(entry)} is not a string`;\n\tconst [address = '', prefix, extra] = entry.split('/');\n\tconst raw = addressBytes(address);\n\tif (!raw || extra !== undefined) {\n\t\treturn `\"${entry}\" is neither an IP address nor a CIDR`;\n\t}\n\t// `::ffff:10.0.0.0/104` is `10.0.0.0/8`: the address became its IPv4 bytes.\n\tconst mapped = raw.length === 4 && address.includes(':');\n\tconst width = raw.length * 8;\n\tif (prefix === undefined) return { bytes: raw, bits: width };\n\tlet bits = /^\\d{1,3}$/.test(prefix) ? Number(prefix) : -1;\n\tif (mapped) bits -= 96;\n\tif (bits < 0 || bits > width) {\n\t\treturn `\"${entry}\" has a prefix length out of range`;\n\t}\n\tif (bits === 0) {\n\t\treturn `\"${entry}\" has a prefix length of 0, which trusts every peer`;\n\t}\n\treturn { bytes: raw, bits };\n}\n\nfunction contains(network: Network, address: Uint8Array): boolean {\n\tif (network.bytes.length !== address.length) return false;\n\tconst whole = network.bits >> 3;\n\tfor (let at = 0; at < whole; at++) {\n\t\tif (network.bytes[at] !== address[at]) return false;\n\t}\n\tconst rest = network.bits & 7;\n\tif (rest === 0) return true;\n\tconst mask = (0xff << (8 - rest)) & 0xff;\n\treturn (\n\t\t((network.bytes[whole] as number) & mask) ===\n\t\t((address[whole] as number) & mask)\n\t);\n}\n\n/**\n * `proxyProtocol.trusted` as a test of a peer's address: IPv4 and IPv6\n * addresses and CIDRs, an IPv4-mapped address or peer matched as its IPv4\n * address. An entry that is neither throws, through `invalid`, and so does\n * an empty list (it would trust nobody, which is no proxy at all), a zone\n * (`fe80::1%eth0`) and a prefix of 0, which would trust everyone.\n */\nexport function trustedPeers(\n\tentries: unknown,\n\tinvalid: (message: string) => Error,\n): (peer: string) => boolean {\n\tif (!Array.isArray(entries) || entries.length === 0) {\n\t\tthrow invalid(\n\t\t\t'proxyProtocol.trusted must list the addresses or CIDRs of the proxies, at least one',\n\t\t);\n\t}\n\tconst networks = entries.map((entry: unknown) => {\n\t\tconst network = networkOf(entry);\n\t\tif (typeof network === 'string') {\n\t\t\tthrow invalid(`proxyProtocol.trusted: ${network}`);\n\t\t}\n\t\treturn network;\n\t});\n\treturn (peer) => {\n\t\tconst address = addressBytes(peer);\n\t\treturn (\n\t\t\taddress !== undefined &&\n\t\t\tnetworks.some((network) => contains(network, address))\n\t\t);\n\t};\n}\n",
27
- "import { SmtpError } from '../errors';\nimport type { SmtpServerOptions } from './options';\nimport { trustedPeers } from './proxy/trusted';\n\n/** The options with their defaults, checked once. */\nexport interface Settings {\n\treadonly options: SmtpServerOptions;\n\treadonly mode: 'mx' | 'submission';\n\treadonly maxMessageSize: number;\n\treadonly maxRecipients: number;\n\treadonly maxConnections: number;\n\treadonly maxConnectionsPerClient: number;\n\treadonly maxErrors: number;\n\treadonly timeout: number;\n\treadonly hookTimeout: number;\n\treadonly handshakeTimeout: number;\n\treadonly greetingDelay: number;\n\t/** With `proxyProtocol`: whether a peer is a proxy trusted to send a PROXY header. */\n\treadonly trusts?: (peer: string) => boolean;\n\tisLocal(domain: string): boolean | Promise<boolean>;\n}\n\n/** The longest delay `setTimeout` takes, in whole seconds: past 2^31 − 1 ms it fires after 1 ms. */\nconst MAX_TIMER_SECONDS = Math.floor(2_147_483_647 / 1000);\n\nconst invalid = (message: string) =>\n\tnew SmtpError('INVALID_OPTION', `createSmtpServer(): ${message}`);\n\nfunction positive(\n\tname: string,\n\tvalue: number | undefined,\n\tfallback: number,\n): number {\n\tif (value === undefined) return fallback;\n\tif (!Number.isSafeInteger(value) || value < 1) {\n\t\tthrow invalid(`${name} must be a positive integer, not ${value}`);\n\t}\n\treturn value;\n}\n\n/** `positive`, and short enough for `setTimeout`, which a longer delay makes fire at once. */\nfunction timer(\n\tname: string,\n\tvalue: number | undefined,\n\tfallback: number,\n): number {\n\tconst seconds = positive(name, value, fallback);\n\tif (seconds > MAX_TIMER_SECONDS) {\n\t\tthrow invalid(\n\t\t\t`${name} must be at most ${MAX_TIMER_SECONDS} seconds, not ${seconds}`,\n\t\t);\n\t}\n\treturn seconds;\n}\n\nfunction nonNegative(\n\tname: string,\n\tvalue: number | undefined,\n\tfallback: number,\n): number {\n\tif (value === undefined) return fallback;\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow invalid(\n\t\t\t`${name} must be a number of seconds, 0 or more, not ${value}`,\n\t\t);\n\t}\n\treturn value;\n}\n\n/** `localDomains` as a lookup; the domain it is given is lower case. */\nfunction localLookup(\n\tlocal: SmtpServerOptions['localDomains'],\n): (domain: string) => boolean | Promise<boolean> {\n\tif (typeof local === 'function') return local;\n\tif (\n\t\tArray.isArray(local) &&\n\t\tlocal.every((domain: unknown) => typeof domain === 'string')\n\t) {\n\t\tconst domains = new Set(\n\t\t\t(local as readonly string[]).map((domain) => domain.toLowerCase()),\n\t\t);\n\t\treturn (domain) => domains.has(domain);\n\t}\n\tthrow invalid('localDomains must be an array of domains or a function');\n}\n\nexport function settingsOf(options: SmtpServerOptions): Settings {\n\tif (\n\t\ttypeof options.hostname !== 'string' ||\n\t\t!/^[A-Za-z0-9.-]+$/.test(options.hostname)\n\t) {\n\t\tthrow invalid(`\"${options.hostname}\" is not a host name`);\n\t}\n\tif (typeof options.onData !== 'function') {\n\t\tthrow invalid('onData must be a function: it is where messages go');\n\t}\n\tif (options.implicitTls && !options.tls) {\n\t\tthrow invalid('implicitTls needs tls: { key, cert }');\n\t}\n\tif (options.mode === 'submission' && !options.authenticate) {\n\t\tthrow invalid(\n\t\t\t'submission takes mail only from authenticated users, so it needs authenticate',\n\t\t);\n\t}\n\tif (options.authenticate && !options.tls) {\n\t\tthrow invalid(\n\t\t\t'authenticate needs tls: { key, cert }, since AUTH is offered only once encrypted',\n\t\t);\n\t}\n\tconst isLocal = localLookup(options.localDomains);\n\tconst timeout = positive('timeout', options.timeout, 300);\n\tconst greetingDelay = nonNegative('greetingDelay', options.greetingDelay, 0);\n\tif (greetingDelay >= timeout) {\n\t\tthrow invalid(\n\t\t\t`greetingDelay (${greetingDelay} s) must be shorter than timeout (${timeout} s), or every client times out before the greeting`,\n\t\t);\n\t}\n\treturn {\n\t\toptions,\n\t\tmode: options.mode ?? 'mx',\n\t\tmaxMessageSize: positive(\n\t\t\t'maxMessageSize',\n\t\t\toptions.maxMessageSize,\n\t\t\t25 * 1024 * 1024,\n\t\t),\n\t\tmaxRecipients: positive('maxRecipients', options.maxRecipients, 100),\n\t\tmaxConnections: positive('maxConnections', options.maxConnections, 1000),\n\t\tmaxConnectionsPerClient: positive(\n\t\t\t'maxConnectionsPerClient',\n\t\t\toptions.maxConnectionsPerClient,\n\t\t\t10,\n\t\t),\n\t\tmaxErrors: positive('maxErrors', options.maxErrors, 10),\n\t\ttimeout,\n\t\thookTimeout: timer('hookTimeout', options.hookTimeout, 60),\n\t\thandshakeTimeout: positive(\n\t\t\t'handshakeTimeout',\n\t\t\toptions.handshakeTimeout,\n\t\t\t10,\n\t\t),\n\t\tgreetingDelay,\n\t\t...(options.proxyProtocol === undefined\n\t\t\t? {}\n\t\t\t: { trusts: trustedPeers(options.proxyProtocol?.trusted, invalid) }),\n\t\tisLocal: (domain) => isLocal(domain.toLowerCase()),\n\t};\n}\n",
27
+ "import { createSecureContext, type SecureContext } from 'node:tls';\n\n/** `key` or `cert` as `Bun.listen` takes them: text, bytes or a file. */\ntype TlsMaterial = string | Uint8Array | Bun.BunFile;\n\n/** A key and certificate pair, as `Bun.listen` takes it. */\ninterface TlsPair {\n\treadonly key: TlsMaterial;\n\treadonly cert: TlsMaterial;\n}\n\n/** `tls` read whole, with the `node:tls` context made from it. */\ninterface ReadTls {\n\treadonly key: string | Buffer;\n\treadonly cert: string | Buffer;\n\treadonly context: SecureContext;\n}\n\n/**\n * `tls` read whole — a file included — and checked as a `node:tls` context:\n * what implicit TLS behind a proxy runs on, and, without a proxy, the check\n * that makes a key or certificate that cannot be read or used fail\n * `listen()` and `setTls()` the same way. `fail` turns the reason into the\n * package's own error, the `node:tls` or file error as its `cause`.\n */\nexport async function readTls(\n\ttls: TlsPair,\n\tfail: (message: string, cause: unknown) => Error,\n\tcaller: string,\n): Promise<ReadTls> {\n\tconst read = async (value: TlsMaterial) =>\n\t\ttypeof value === 'string'\n\t\t\t? value\n\t\t\t: Buffer.from(value instanceof Uint8Array ? value : await value.bytes());\n\ttry {\n\t\tconst key = await read(tls.key);\n\t\tconst cert = await read(tls.cert);\n\t\t// A pair of nothing would be taken, and reset every connection after.\n\t\tif (key.length === 0 || cert.length === 0) {\n\t\t\tthrow new Error(`the ${key.length === 0 ? 'key' : 'cert'} is empty`);\n\t\t}\n\t\treturn { key, cert, context: createSecureContext({ key, cert }) };\n\t} catch (cause) {\n\t\tconst reason = cause instanceof Error ? cause.message : String(cause);\n\t\tthrow fail(\n\t\t\t`${caller}: tls: { key, cert } cannot be used: ${reason}`,\n\t\t\tcause,\n\t\t);\n\t}\n}\n\n/**\n * The key and certificate the server uses now. What `listen()` or `setTls()`\n * read replaces it whole, and only once checked, so a pair that cannot be\n * used leaves the one in use. A STARTTLS server that has read nothing yet\n * serves `tls` as it was given.\n */\nexport class TlsHolder {\n\t#current: ReadTls | undefined;\n\t/** The last `replace`: the next one waits for it, so the later call wins. */\n\t#tail: Promise<unknown> = Promise.resolve();\n\treadonly #given: TlsPair;\n\n\tconstructor(given: TlsPair) {\n\t\tthis.#given = given;\n\t}\n\n\t/** What an upgrade to TLS, or a native listener, is given. */\n\tget options(): TlsPair {\n\t\treturn this.#current ?? this.#given;\n\t}\n\n\t/** The `node:tls` context of the pair in use: only once `load` or `replace` read one. */\n\tget context(): SecureContext {\n\t\tif (!this.#current) throw new Error('the TLS pair was never read');\n\t\treturn this.#current.context;\n\t}\n\n\t/** Reads and checks the pair given, unless a read already replaced it. */\n\tasync load(\n\t\tfail: (message: string, cause: unknown) => Error,\n\t\tcaller: string,\n\t): Promise<SecureContext> {\n\t\tif (this.#current) return this.#current.context;\n\t\tconst read = await readTls(this.#given, fail, caller);\n\t\tthis.#current ??= read;\n\t\treturn this.#current.context;\n\t}\n\n\t/**\n\t * Checks `tls`, then uses it from the next connection on. Calls apply in\n\t * the order they were made, however long each read takes; one that fails\n\t * does not hold the next.\n\t */\n\treplace(\n\t\ttls: TlsPair,\n\t\tfail: (message: string, cause: unknown) => Error,\n\t\tcaller: string,\n\t): Promise<void> {\n\t\tconst run = this.#tail.then(async () => {\n\t\t\tthis.#current = await readTls(tls, fail, caller);\n\t\t});\n\t\tthis.#tail = run.catch(() => {});\n\t\treturn run;\n\t}\n}\n",
28
+ "import { SmtpError } from '../errors';\nimport type { SmtpServerOptions } from './options';\nimport { trustedPeers } from './proxy/trusted';\nimport { TlsHolder } from './tls-context';\n\n/** The options with their defaults, checked once. */\nexport interface Settings {\n\treadonly options: SmtpServerOptions;\n\treadonly mode: 'mx' | 'submission';\n\treadonly maxMessageSize: number;\n\treadonly maxRecipients: number;\n\treadonly maxConnections: number;\n\treadonly maxConnectionsPerClient: number;\n\treadonly maxErrors: number;\n\treadonly timeout: number;\n\treadonly hookTimeout: number;\n\treadonly handshakeTimeout: number;\n\treadonly greetingDelay: number;\n\t/** The key and certificate in use, which `setTls` replaces; with `options.tls`. */\n\treadonly tls?: TlsHolder;\n\t/** With `proxyProtocol`: whether a peer is a proxy trusted to send a PROXY header. */\n\treadonly trusts?: (peer: string) => boolean;\n\tisLocal(domain: string): boolean | Promise<boolean>;\n}\n\n/** The longest delay `setTimeout` takes, in whole seconds: past 2^31 − 1 ms it fires after 1 ms. */\nconst MAX_TIMER_SECONDS = Math.floor(2_147_483_647 / 1000);\n\nconst invalid = (message: string) =>\n\tnew SmtpError('INVALID_OPTION', `createSmtpServer(): ${message}`);\n\nfunction positive(\n\tname: string,\n\tvalue: number | undefined,\n\tfallback: number,\n): number {\n\tif (value === undefined) return fallback;\n\tif (!Number.isSafeInteger(value) || value < 1) {\n\t\tthrow invalid(`${name} must be a positive integer, not ${value}`);\n\t}\n\treturn value;\n}\n\n/** `positive`, and short enough for `setTimeout`, which a longer delay makes fire at once. */\nfunction timer(\n\tname: string,\n\tvalue: number | undefined,\n\tfallback: number,\n): number {\n\tconst seconds = positive(name, value, fallback);\n\tif (seconds > MAX_TIMER_SECONDS) {\n\t\tthrow invalid(\n\t\t\t`${name} must be at most ${MAX_TIMER_SECONDS} seconds, not ${seconds}`,\n\t\t);\n\t}\n\treturn seconds;\n}\n\nfunction nonNegative(\n\tname: string,\n\tvalue: number | undefined,\n\tfallback: number,\n): number {\n\tif (value === undefined) return fallback;\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow invalid(\n\t\t\t`${name} must be a number of seconds, 0 or more, not ${value}`,\n\t\t);\n\t}\n\treturn value;\n}\n\n/** `localDomains` as a lookup; the domain it is given is lower case. */\nfunction localLookup(\n\tlocal: SmtpServerOptions['localDomains'],\n): (domain: string) => boolean | Promise<boolean> {\n\tif (typeof local === 'function') return local;\n\tif (\n\t\tArray.isArray(local) &&\n\t\tlocal.every((domain: unknown) => typeof domain === 'string')\n\t) {\n\t\tconst domains = new Set(\n\t\t\t(local as readonly string[]).map((domain) => domain.toLowerCase()),\n\t\t);\n\t\treturn (domain) => domains.has(domain);\n\t}\n\tthrow invalid('localDomains must be an array of domains or a function');\n}\n\nexport function settingsOf(options: SmtpServerOptions): Settings {\n\tif (\n\t\ttypeof options.hostname !== 'string' ||\n\t\t!/^[A-Za-z0-9.-]+$/.test(options.hostname)\n\t) {\n\t\tthrow invalid(`\"${options.hostname}\" is not a host name`);\n\t}\n\tif (typeof options.onData !== 'function') {\n\t\tthrow invalid('onData must be a function: it is where messages go');\n\t}\n\tif (options.implicitTls && !options.tls) {\n\t\tthrow invalid('implicitTls needs tls: { key, cert }');\n\t}\n\tif (options.mode === 'submission' && !options.authenticate) {\n\t\tthrow invalid(\n\t\t\t'submission takes mail only from authenticated users, so it needs authenticate',\n\t\t);\n\t}\n\tif (options.authenticate && !options.tls) {\n\t\tthrow invalid(\n\t\t\t'authenticate needs tls: { key, cert }, since AUTH is offered only once encrypted',\n\t\t);\n\t}\n\tconst isLocal = localLookup(options.localDomains);\n\tconst timeout = positive('timeout', options.timeout, 300);\n\tconst greetingDelay = nonNegative('greetingDelay', options.greetingDelay, 0);\n\tif (greetingDelay >= timeout) {\n\t\tthrow invalid(\n\t\t\t`greetingDelay (${greetingDelay} s) must be shorter than timeout (${timeout} s), or every client times out before the greeting`,\n\t\t);\n\t}\n\treturn {\n\t\toptions,\n\t\t...(options.tls ? { tls: new TlsHolder(options.tls) } : {}),\n\t\tmode: options.mode ?? 'mx',\n\t\tmaxMessageSize: positive(\n\t\t\t'maxMessageSize',\n\t\t\toptions.maxMessageSize,\n\t\t\t25 * 1024 * 1024,\n\t\t),\n\t\tmaxRecipients: positive('maxRecipients', options.maxRecipients, 100),\n\t\tmaxConnections: positive('maxConnections', options.maxConnections, 1000),\n\t\tmaxConnectionsPerClient: positive(\n\t\t\t'maxConnectionsPerClient',\n\t\t\toptions.maxConnectionsPerClient,\n\t\t\t10,\n\t\t),\n\t\tmaxErrors: positive('maxErrors', options.maxErrors, 10),\n\t\ttimeout,\n\t\thookTimeout: timer('hookTimeout', options.hookTimeout, 60),\n\t\thandshakeTimeout: positive(\n\t\t\t'handshakeTimeout',\n\t\t\toptions.handshakeTimeout,\n\t\t\t10,\n\t\t),\n\t\tgreetingDelay,\n\t\t...(options.proxyProtocol === undefined\n\t\t\t? {}\n\t\t\t: { trusts: trustedPeers(options.proxyProtocol?.trusted, invalid) }),\n\t\tisLocal: (domain) => isLocal(domain.toLowerCase()),\n\t};\n}\n",
28
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",
29
- "import { createSecureContext, type SecureContext } from 'node:tls';\n\n/** `key` or `cert` as `Bun.listen` takes them: text, bytes or a file. */\ntype TlsMaterial = string | Uint8Array | Bun.BunFile;\n\n/**\n * `tls` read whole — a file included — and checked as a `node:tls` context:\n * what implicit TLS behind a proxy runs on, and, without a proxy, the check\n * that makes a key or certificate that cannot be read or used fail\n * `listen()` the same way. `fail` turns the reason into the package's own\n * error, the `node:tls` or file error as its `cause`.\n */\nexport async function tlsContext(\n\ttls: { readonly key: TlsMaterial; readonly cert: TlsMaterial },\n\tfail: (message: string, cause: unknown) => Error,\n): Promise<SecureContext> {\n\tconst read = async (value: TlsMaterial) =>\n\t\ttypeof value === 'string'\n\t\t\t? value\n\t\t\t: Buffer.from(value instanceof Uint8Array ? value : await value.bytes());\n\ttry {\n\t\treturn createSecureContext({\n\t\t\tkey: await read(tls.key),\n\t\t\tcert: await read(tls.cert),\n\t\t});\n\t} catch (cause) {\n\t\tconst reason = cause instanceof Error ? cause.message : String(cause);\n\t\tthrow fail(`listen(): tls: { key, cert } cannot be used: ${reason}`, cause);\n\t}\n}\n",
30
- "import type { Socket, TCPSocketListener } from 'bun';\nimport { SmtpError } from '../errors';\nimport { type Listening, listenerHandlers } from './admission';\nimport type { Connection } from './connection';\nimport { handlers, type SocketState } from './listener';\nimport type { SmtpServerOptions } from './options';\nimport { settingsOf } from './settings';\nimport { Slots } from './slots';\nimport { tlsContext } from './tls-context';\n\n/** A key or certificate `listen` 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\toptions: SmtpServerOptions,\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 context =\n\t\tlistening.secure && options.tls\n\t\t\t? await tlsContext(options.tls, invalidTls)\n\t\t\t: undefined;\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.\n\tconst proxied = listening.settings.trusts ? context : undefined;\n\treturn Bun.listen<SocketState>({\n\t\thostname,\n\t\tport,\n\t\t...(listening.secure && options.tls && !proxied\n\t\t\t? { tls: { key: options.tls.key, cert: options.tls.cert } }\n\t\t\t: {}),\n\t\tsocket: {\n\t\t\t...handlers(listening.settings),\n\t\t\t...listenerHandlers({\n\t\t\t\t...listening,\n\t\t\t\t...(proxied ? { proxied } : {}),\n\t\t\t}),\n\t\t},\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/** 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 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\toptions,\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"
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": ";;;;;;;;;;;AAQO,SAAS,YAAY,CAAC,MAAuB;AAAA,EACnD,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAA,EAC9B,IAAI,QAAQ;AAAA,IAAG,OAAO,EAAE,MAAM,KAAK,YAAY,GAAG,UAAU,GAAG;AAAA,EAC/D,OAAO;AAAA,IACN,MAAM,KAAK,MAAM,GAAG,KAAK,EAAE,YAAY;AAAA,IACvC,UAAU,KAAK,MAAM,QAAQ,CAAC,EAAE,KAAK;AAAA,EACtC;AAAA;AAiBM,SAAS,gBAAgB,CAC/B,UACA,SAC0B;AAAA,EAC1B,MAAM,QAAQ,IAAI,OAAO,IAAI,8BAA8B,GAAG,EAAE,KAC/D,QACD;AAAA,EACA,IAAI,CAAC;AAAA,IAAO;AAAA,EACZ,MAAM,OAAO,MAAM;AAAA,EACnB,MAAM,OACL,YAAY,QAAQ,KAAK,YAAY,MAAM,iBACxC,aACA,WAAU,MAAM,YAAY,MAAM;AAAA,EACtC,IAAI,CAAC;AAAA,IAAM;AAAA,EACX,MAAM,aAAqC,CAAC;AAAA,EAC5C,WAAW,QAAS,MAAM,GAAc,KAAK,EAAE,MAAM,KAAK,GAAG;AAAA,IAC5D,IAAI,SAAS;AAAA,MAAI;AAAA,IACjB,MAAM,SAAS,KAAK,QAAQ,GAAG;AAAA,IAC/B,MAAM,OAAO,SAAS,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,YAAY;AAAA,IACpE,IAAI,CAAC,uBAAuB,KAAK,GAAG;AAAA,MAAG;AAAA,IACvC,WAAW,OAAO,SAAS,IAAI,KAAK,KAAK,MAAM,SAAS,CAAC;AAAA,EAC1D;AAAA,EACA,OAAO,EAAE,MAAM,WAAW;AAAA;;ACrD3B,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,MAAM;AAAA;AAmBL,MAAM,WAAW;AAAA,EAEvB,aAAa;AAAA,EAEb,QAAkB,CAAC;AAAA,EACnB,QAAQ;AAAA,EACR,iBAAiB;AAAA,MAGb,IAAI,GAAW;AAAA,IAClB,OAAO,KAAK;AAAA;AAAA,EAGb,KAAK,CAAC,OAA8B;AAAA,IAEnC,MAAM,MAAM,IAAI,WAAW,MAAM,SAAS,CAAC;AAAA,IAC3C,IAAI,IAAI;AAAA,IACR,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,MACtC,MAAM,OAAO,MAAM;AAAA,MACnB,MAAM,OAAO,KAAK;AAAA,MAClB,IAAI,KAAK,SAAS,GAAG;AAAA,QAEpB,IAAI,KAAK,OAAO,OAAO,KAAK,WAAW,GAAG;AAAA,UACzC,IAAI,SAAS,IAAI;AAAA,YAChB,KAAK,KAAK,EAAE;AAAA,YACZ;AAAA,UACD;AAAA,UAEA,KAAK,QAAQ,CAAC;AAAA,UACd,KAAK,aAAa;AAAA,UAClB;AAAA,UACA;AAAA,QACD;AAAA,QACA,IAAI,KAAK,OAAO,OAAO,KAAK,WAAW,GAAG;AAAA,UACzC,KAAK,QAAQ,CAAC;AAAA,UACd,IAAI,SAAS,IAAI;AAAA,YAChB,KAAK,SAAS;AAAA,YACd,OAAO;AAAA,cACN,MAAM,IAAI,SAAS,GAAG,CAAC;AAAA,cACvB,MAAM;AAAA,cACN,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,YACxB;AAAA,UACD;AAAA,UAEA,KAAK;AAAA,UACL,IAAI,OAAO;AAAA,UACX,KAAK,aAAa;AAAA,UAClB;AAAA,UACA;AAAA,QACD;AAAA,QAEA,KAAK,QAAQ,CAAC;AAAA,QACd,IAAI,SAAS,IAAI;AAAA,UAChB,IAAI,OAAO;AAAA,UACX,IAAI,OAAO;AAAA,UACX,KAAK,aAAa;AAAA,UAClB;AAAA,QACD;AAAA,QACA,KAAK;AAAA,QACL,IAAI,OAAO;AAAA,QACX,KAAK,aAAa;AAAA,QAClB;AAAA,QACA;AAAA,MACD;AAAA,MACA,IAAI,SAAS,IAAI;AAAA,QAChB,KAAK,QAAQ,CAAC,EAAE;AAAA,QAChB;AAAA,MACD;AAAA,MACA,IAAI,SAAS,OAAO,KAAK,YAAY;AAAA,QACpC,KAAK,QAAQ,CAAC,GAAG;AAAA,QACjB;AAAA,MACD;AAAA,MACA,IAAI,SAAS;AAAA,QAAI,KAAK;AAAA,MACtB,IAAI,OAAO;AAAA,MACX,KAAK,aAAa;AAAA,IACnB;AAAA,IACA,KAAK,SAAS;AAAA,IACd,OAAO,EAAE,MAAM,IAAI,SAAS,GAAG,CAAC,GAAG,MAAM,OAAO,MAAM,IAAI,WAAW,CAAC,EAAE;AAAA;AAE1E;;AC1FO,SAAS,WAAW,CAAC,OAAc,WAAW,MAAc;AAAA,EAClE,MAAM,QAAQ,OAAO,MAAM,SAAS,WAAW,CAAC,MAAM,IAAI,IAAI,MAAM;AAAA,EACpE,MAAM,SAAS,YAAY,MAAM,SAAS,GAAG,MAAM,YAAY;AAAA,EAC/D,OAAO,MACL,IAAI,CAAC,MAAM,MAAM;AAAA,IACjB,MAAM,QAAQ,KAAK,QAAQ,YAAY,GAAG;AAAA,IAC1C,OAAO,GAAG,MAAM,OAAO,MAAM,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS;AAAA;AAAA,GACrE,EACA,KAAK,EAAE;AAAA;AAIH,IAAM,QAAQ,CACpB,MACA,QACA,SACY,WAAW,YAAY,EAAE,MAAM,KAAK,IAAI,EAAE,MAAM,QAAQ,KAAK;;AC1B1E;AAGA,SAAS,MAAM,CAAC,IAAsB;AAAA,EACrC,MAAM,SAAS,8BAA8B,KAAK,EAAE;AAAA,EACpD,IAAI,OAAO;AAAA,EACX,IAAI,WAAW,MAAM;AAAA,IACpB,OAAO,GAAG,GAAG,GAAG,KAAK,OAAO,MAAM,CAAC,EAAE,IAAI,MAAM;AAAA,IAM/C,OAAO,GAAG,GAAG,MAAM,GAAG,OAAO,KAAK,KAAM,KAAK,IAAK,GAAG,SAAS,EAAE,MAAO,KAAK,IAAK,GAAG,SAAS,EAAE;AAAA,EAChG;AAAA,EACA,OAAO,OAAO,IAAI,QAAQ,KAAK,MAAM,IAAI;AAAA,EACzC,MAAM,OAAO,SAAS,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG;AAAA,EAC9C,MAAM,QAAQ,SAAS,aAAa,SAAS,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG;AAAA,EACrE,MAAM,MACL,SAAS,YACN,OACA,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,KAAK,SAAS,MAAM,MAAM,EAAE,KAAK,GAAG,GAAG,GAAG,KAAK;AAAA,EAC1E,OAAO,IAAI,IAAI,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA;AAIrD,SAAS,MAAM,CAAC,GAA8B;AAAA,EAC7C,OAAO,OAAO,GAAG,MAAM,KAAK,EAAE,MAAM,CAAC;AAAA,EACrC,OAAO,CAAC,QAAQ,GAAG,OAAO,KAAK,OAAO,GAAG,MAAM,GAAG,EAAE,KAAK,GAAG;AAAA;AAgBtD,SAAS,SAAS,CAAC,IAA4C;AAAA,EACrE,IAAI,OAAO,OAAO;AAAA,IAAU;AAAA,EAC5B,MAAM,UAAU,GAAG,QAAQ,YAAY,EAAE,EAAE,QAAQ,QAAQ,EAAE;AAAA,EAC7D,IAAI,KAAK,OAAO,MAAM;AAAA,IAAG,OAAO;AAAA,EAChC,IAAI,KAAK,OAAO,MAAM;AAAA,IAAG;AAAA,EACzB,MAAM,IAAI,OAAO,QAAQ,YAAY,CAAC;AAAA,EACtC,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAAA,EACrC,IAAI,WAAW,qBAAqB,WAAW,qBAAqB;AAAA,IACnE,OAAO,OAAO,CAAC;AAAA,EAChB;AAAA,EACA,OAAO,GAAG,EACR,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,CAAC,EACjC,KAAK,GAAG;AAAA;;ACrDJ,IAAM,cAAc,MAAM,KAAK,SAAS,2BAA2B;AAE1E,IAAM,YAAY,OAAO,WAAW;AAGpC,eAAsB,MAAS,CAC9B,SACA,SACgC;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM,WAAW,IAAI,QAA0B,CAAC,YAAY;AAAA,IAC3D,QAAQ,WAAW,MAAM,QAAQ,SAAS,GAAG,UAAU,IAAI;AAAA,GAC3D;AAAA,EACD,IAAI;AAAA,IACH,OAAO,MAAM,QAAQ,KAAK,CAAC,SAAS,QAAQ,CAAC;AAAA,YAC5C;AAAA,IACD,aAAa,KAAK;AAAA;AAAA;AAIb,SAAS,QAAQ,CAAC,OAA2C;AAAA,EACnE,OAAO,UAAU;AAAA;AAGX,SAAS,WAAW,CAAC,MAAc,SAA4B;AAAA,EACrE,OAAO,IAAI,WACV,gBACA,GAAG,2CAA2C,YAC/C;AAAA;AASM,SAAS,SAAS,CACxB,MACA,QACA,QACoB;AAAA,EACpB,IAAI,WAAW;AAAA,IAAW;AAAA,EAC1B,MAAM,OAAQ,QAAkC;AAAA,EAChD,IAAI,OAAO,SAAS,YAAY,QAAQ,OAAO,OAAO,KAAK;AAAA,IAC1D,OAAO;AAAA,EACR;AAAA,EACA,OACC,IAAI,WACH,sBACA,GAAG,iBAAiB,KAAK,UAAU,MAAM,+FAC1C,CACD;AAAA,EACA,OAAO;AAAA;;;AChDR,IAAM,oBAAoB;AAE1B,eAAe,KAAK,CACnB,YACA,aACgB;AAAA,EAChB,QAAQ,OAAO,aAAa;AAAA,EAC5B,MAAM,UAAU;AAAA,EAChB,MAAM,YAAY;AAAA,EAClB,IAAI,gBAAgB,WAAW;AAAA,IAC9B,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,4BAA4B,CAAC;AAAA,EACzE;AAAA,EACA,IACC,YAAY,oBAAoB,aAChC,YAAY,oBAAoB,YAAY,UAC3C;AAAA,IAED,OAAO,OAAO,UAAU;AAAA,EACzB;AAAA,EACA,QAAQ,iBAAiB,SAAS;AAAA,EAClC,MAAM,SAAS,MAAM,WAAW,MAAM,gBAAgB,MACrD,eAAe,aAAa,WAAW,OAAO,CAC/C;AAAA,EACA,IAAI,OAAO,QAAQ;AAAA,IAElB,OAAO,WAAW,KACjB,MAAM,KAAK,SAAS,kCAAkC,CACvD;AAAA,EACD;AAAA,EACA,MAAM,KAAK,OAAO,UAAU;AAAA,EAC5B,IAAI,IAAI;AAAA,IACP,MAAM,OAAO,YAAY;AAAA,IACzB,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,2BAA2B,CAAC;AAAA,EACxE;AAAA,EACA,OAAO,UAAU;AAAA;AAGlB,SAAS,MAAM,CAAC,YAA8B;AAAA,EAC7C,QAAQ,OAAO,aAAa;AAAA,EAC5B,MAAM;AAAA,EACN,IAAI,MAAM,gBAAgB,mBAAmB;AAAA,IAC5C,QAAQ,aAAa,SAAS;AAAA,IAC9B,WAAW,MACV,MACC,KACA,SACA,GAAG,mDACJ,CACD;AAAA,IACA;AAAA,EACD;AAAA,EACA,WAAW,KAAK,MAAM,KAAK,SAAS,oCAAoC,CAAC;AAAA;AAI1E,eAAsB,YAAY,CACjC,YACA,UACgB;AAAA,EAChB,QAAQ,OAAO,aAAa;AAAA,EAC5B,IAAI,CAAC,SAAS,QAAQ;AAAA,IACrB,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,oBAAoB,CAAC;AAAA,EACjE,IAAI,CAAC,MAAM;AAAA,IACV,OAAO,WAAW,KACjB,MACC,KACA,UACA,4DACD,CACD;AAAA,EACD,IAAI,MAAM,SAAS,aAAa,CAAC,MAAM;AAAA,IACtC,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,iBAAiB,CAAC;AAAA,EAC9D,IAAI,MAAM,SAAS;AAAA,IAClB,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,uBAAuB,CAAC;AAAA,EACpE,IAAI,MAAM,YAAY,SAAS;AAAA,IAC9B,OAAO,WAAW,KACjB,MAAM,KAAK,SAAS,uCAAuC,CAC5D;AAAA,EACD,OAAO,YAAY,IAAI,SAAS,SAAS,SAAS,MAAM,GAAG;AAAA,EAC3D,IAAI,UAAU;AAAA,IACb,OAAO,WAAW,KACjB,MAAM,KAAK,SAAS,2CAA2C,CAChE;AAAA,EACD,QAAQ,UAAU,YAAY;AAAA,SACxB;AAAA,MACJ,IAAI,YAAY,WAAW;AAAA,QAC1B,MAAM,UAAU;AAAA,QAChB,OAAO,WAAW,KAAK,MAAM,KAAK,WAAW,EAAE,CAAC;AAAA,MACjD;AAAA,MACA,OAAO,MAAM,YAAY,aAAY,YAAY,MAAM,KAAK,OAAO,CAAC;AAAA,SAChE;AAAA,MACJ,IAAI,YAAY,WAAW;AAAA,QAC1B,MAAM,UAAU;AAAA,QAChB,OAAO,WAAW,KAAK,MAAM,KAAK,WAAW,cAAc,CAAC;AAAA,MAC7D;AAAA,MACA,OAAO,UAAU,YAAY,OAAO;AAAA;AAAA,MAEpC,OAAO,WAAW,KACjB,MAAM,KAAK,SAAS,kCAAkC,CACvD;AAAA;AAAA;AAIH,SAAS,SAAS,CACjB,YACA,UACuB;AAAA,EACvB,MAAM,OAAO,iBAAgB,QAAQ;AAAA,EACrC,IAAI,CAAC;AAAA,IAAM,OAAO,MAAM,YAAY,SAAS;AAAA,EAC7C,WAAW,MAAM,YAAY;AAAA,EAC7B,WAAW,MAAM,UAAU;AAAA,EAC3B,WAAW,KAAK,MAAM,KAAK,WAAW,cAAc,CAAC;AAAA;AAItD,eAAsB,YAAY,CACjC,YACA,MACgB;AAAA,EAChB,QAAQ,UAAU;AAAA,EAClB,IAAI,SAAS,KAAK;AAAA,IACjB,MAAM,UAAU;AAAA,IAChB,MAAM,YAAY;AAAA,IAClB,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,0BAA0B,CAAC;AAAA,EACvE;AAAA,EACA,QAAQ,MAAM;AAAA,SACR;AAAA,MACJ,OAAO,MAAM,YAAY,aAAY,IAAI,CAAC;AAAA,SACtC;AAAA,MACJ,OAAO,UAAU,YAAY,IAAI;AAAA,aACzB;AAAA,MACR,MAAM,WAAW,iBAAgB,IAAI;AAAA,MACrC,MAAM,WAAW,MAAM,aAAa;AAAA,MACpC,OAAO,MACN,YACA,WAAW,EAAE,WAAW,SAAS,UAAU,SAAS,IAAI,SACzD;AAAA,IACD;AAAA;AAAA;;;ACnHK,IAAM,mBAAmB,OAAoB;AAAA,EACnD,IAAI,CAAC;AAAA,EACL,UAAU;AAAA,EACV,MAAM;AACP;;;AC9BA,SAAS,QAAQ,CAAC,MAAuB;AAAA,EACxC,SAAS,IAAI,EAAG,IAAI,KAAK,QAAQ;AAAA,IAChC,IAAI,KAAK,WAAW,CAAC,IAAI;AAAA,MAAM,OAAO;AAAA,EACvC,OAAO;AAAA;AAIR,eAAsB,IAAI,CACzB,YACA,UACgB;AAAA,EAChB,QAAQ,OAAO,aAAa;AAAA,EAC5B,IAAI,MAAM,SAAS;AAAA,IAClB,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,iBAAiB,CAAC;AAAA,EAC9D,IAAI,MAAM,YAAY,SAAS,WAAW;AAAA,IACzC,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,qBAAqB,CAAC;AAAA,EAClE;AAAA,EACA,IAAI,SAAS,SAAS,gBAAgB,MAAM,SAAS,WAAW;AAAA,IAC/D,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,yBAAyB,CAAC;AAAA,EACtE;AAAA,EACA,MAAM,UAAU,iBAAiB,UAAU,MAAM;AAAA,EACjD,IAAI,CAAC;AAAA,IACJ,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,6BAA6B,CAAC;AAAA,EAC1E,QAAQ,MAAM,eAAe;AAAA,EAC7B,IAAI,OAA4B;AAAA,EAChC,IAAI,WAAW;AAAA,EACf,YAAY,KAAK,UAAU,OAAO,QAAQ,UAAU,GAAG;AAAA,IACtD,IAAI,CAAC,MAAM;AAAA,MACV,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,GAAG,gBAAgB,CAAC;AAAA,IAChE,IAAI,QAAQ,QAAQ;AAAA,MACnB,IAAI,CAAC,QAAQ,KAAK,KAAK;AAAA,QACtB,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,sBAAsB,CAAC;AAAA,MACnE,IAAI,OAAO,KAAK,IAAI,SAAS,gBAAgB;AAAA,QAC5C,OAAO,WAAW,KACjB,MAAM,KAAK,SAAS,4BAA4B,CACjD;AAAA,MACD;AAAA,IACD,EAAO,SAAI,QAAQ,QAAQ;AAAA,MAC1B,MAAM,OAAO,MAAM,YAAY;AAAA,MAC/B,IAAI,SAAS,UAAU,SAAS,YAAY;AAAA,QAC3C,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,0BAA0B,CAAC;AAAA,MACvE;AAAA,MACA,OAAO;AAAA,IACR,EAAO,SAAI,QAAQ,cAAc,UAAU,IAAI;AAAA,MAC9C,WAAW;AAAA,IACZ,EAAO,SAAI,QAAQ,QAAQ,CAE3B,EAAO;AAAA,MACN,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,GAAG,sBAAsB,CAAC;AAAA;AAAA,EAEvE;AAAA,EACA,IAAI,CAAC,YAAY,SAAS,KAAK,OAAO,GAAG;AAAA,IACxC,OAAO,WAAW,KACjB,MAAM,KAAK,SAAS,oCAAoC,CACzD;AAAA,EACD;AAAA,EACA,MAAM,UAAU,SAAS;AAAA,EACzB,MAAM,UAAU,QAAQ,aACrB,MAAM,WAAW,KAAK,cAAc,MACpC,QAAQ,aAAa,MAAM,WAAW,OAAO,CAC9C,IACC;AAAA,EACH,IAAI;AAAA,IAAS,OAAO,WAAW,KAAK,OAAO;AAAA,EAC3C,MAAM,cAAc,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,GAAG,UAAU,KAAK;AAAA,EACjE,WAAW,KAAK,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA;AAI1C,eAAsB,IAAI,CACzB,YACA,UACgB;AAAA,EAChB,QAAQ,OAAO,aAAa;AAAA,EAC5B,IAAI,MAAM,YAAY,SAAS;AAAA,IAC9B,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,iBAAiB,CAAC;AAAA,EAC9D,MAAM,UAAU,iBAAiB,UAAU,IAAI;AAAA,EAC/C,IAAI,CAAC;AAAA,IACJ,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,2BAA2B,CAAC;AAAA,EACxE,QAAQ,MAAM,eAAe;AAAA,EAC7B,IAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AAAA,IACvC,OAAO,WAAW,KACjB,MAAM,KAAK,SAAS,GAAG,OAAO,KAAK,UAAU,EAAE,qBAAqB,CACrE;AAAA,EACD;AAAA,EACA,IAAI,CAAC,MAAM,YAAY,YAAY,SAAS,KAAK,OAAO,GAAG;AAAA,IAC1D,OAAO,WAAW,KACjB,MAAM,KAAK,SAAS,oCAAoC,CACzD;AAAA,EACD;AAAA,EACA,IAAI,MAAM,YAAY,GAAG,UAAU,SAAS,eAAe;AAAA,IAC1D,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,qBAAqB,CAAC;AAAA,EAClE;AAAA,EAGA,IAAI,MAAM,SAAS,aAAa,KAAK,eAAe,MAAM;AAAA,IACzD,MAAM,QAAQ,MAAM,WAAW,MAAM,gBAAgB,MACpD,SAAS,QAAQ,KAAK,MAAM,CAC7B;AAAA,IACA,IAAI,MAAM;AAAA,MAAQ,OAAO,WAAW,KAAK,WAAW;AAAA,IACpD,IAAI,MAAM,UAAU,MAAM;AAAA,MACzB,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,qBAAqB,CAAC;AAAA,IAClE;AAAA,EACD;AAAA,EACA,MAAM,UAAU,SAAS;AAAA,EACzB,MAAM,UAAU,QAAQ,WACrB,MAAM,WAAW,KAAK,YAAY,MAClC,QAAQ,WAAW,MAAM,WAAW,OAAO,CAC5C,IACC;AAAA,EACH,IAAI;AAAA,IAAS,OAAO,WAAW,KAAK,OAAO;AAAA,EAC3C,MAAM,YAAY,GAAG,KAAK,KAAK,OAAO;AAAA,EACtC,WAAW,KAAK,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA;;;AC5G1C,SAAS,SAAS,CAAC,YAAkC;AAAA,EACpD,QAAQ,UAAU,UAAU;AAAA,EAC5B,MAAM,QAAQ;AAAA,IACb,GAAG,SAAS,QAAQ,mBAAmB,MAAM;AAAA,IAC7C;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EACA,IAAI,SAAS,QAAQ,OAAO,CAAC,MAAM;AAAA,IAAQ,MAAM,KAAK,UAAU;AAAA,EAChE,IACC,SAAS,QAAQ,gBACjB,MAAM,UACN,MAAM,SAAS,WACd;AAAA,IACD,MAAM,KAAK,kBAAkB;AAAA,EAC9B;AAAA,EACA,OAAO;AAAA;AAGR,eAAe,KAAK,CACnB,YACA,UACA,OACgB;AAAA,EAChB,IAAI,CAAC,YAAY,QAAQ,GAAG;AAAA,IAC3B,WAAW,KACV,MAAM,KAAK,SAAS,WAAW,QAAQ,SAAS,iBAAiB,CAClE;AAAA,IACA;AAAA,EACD;AAAA,EACA,QAAQ,UAAU;AAAA,EAClB,MAAM,OAAO;AAAA,EACb,MAAM,QAAQ;AAAA,EAEd,MAAM,cAAc,iBAAiB;AAAA,EACrC,WAAW,KACV,QACG,MAAM,KAAK,WAAW,UAAU,UAAU,CAAC,IAC3C,MACA,KACA,WACA,GAAG,WAAW,SAAS,QAAQ,mBAAmB,UACnD,CACH;AAAA;AAGD,SAAS,IAAI,CAAC,YAAwB,UAAwB;AAAA,EAC7D,QAAQ,UAAU;AAAA,EAClB,MAAM,UACL,aAAa,KACV,MAAM,KAAK,SAAS,cAAc,IAClC,MAAM,YAAY,SAAS,YAC1B,MAAM,KAAK,SAAS,iBAAiB,IACrC,MAAM,YAAY,GAAG,WAAW,IAC/B,MAAM,KAAK,SAAS,qBAAqB,IACzC;AAAA,EACN,IAAI,SAAS;AAAA,IACZ,WAAW,KAAK,OAAO;AAAA,IAGvB,WAAW,MAAM,KAAK;AAAA,IACtB;AAAA,EACD;AAAA,EACA,WAAW,KAAK,MAAM,KAAK,WAAW,iCAAiC,CAAC;AAAA,EACxE,WAAW,MAAM,UAAU;AAAA;AAG5B,eAAe,QAAQ,CACtB,YACA,UACgB;AAAA,EAChB,QAAQ,OAAO,aAAa;AAAA,EAC5B,MAAM,UAAU,CAAC,SAAS,QAAQ,MAC/B,MAAM,KAAK,SAAS,mBAAmB,IACvC,MAAM,SACL,MAAM,KAAK,SAAS,oBAAoB,IACxC,aAAa,KACZ,MAAM,KAAK,SAAS,kBAAkB,IACtC;AAAA,EACL,IAAI,SAAS;AAAA,IACZ,WAAW,KAAK,OAAO;AAAA,IACvB;AAAA,EACD;AAAA,EACA,WAAW,KAAK,MAAM,KAAK,SAAS,oBAAoB,CAAC;AAAA,EACzD,WAAW,MAAM,OAAO;AAAA,EAExB,MAAM,WAAW,UAAU,QAAQ;AAAA,EACnC,IAAI,WAAW;AAAA,IAAQ;AAAA,EACvB,WAAW,UAAU,SAAS;AAAA,EAC9B,WAAW,MAAM,OAAO;AAAA,EAExB,MAAM,SAAS;AAAA,EACf,MAAM,OAAO;AAAA,EACb,MAAM,QAAQ;AAAA,EACd,MAAM,cAAc,iBAAiB;AAAA;AAItC,eAAsB,UAAU,CAC/B,YACA,MACgB;AAAA,EAChB,QAAQ,UAAU;AAAA,EAClB,IAAI,MAAM,YAAY;AAAA,IAAW,OAAO,aAAa,YAAY,IAAI;AAAA,EACrE,QAAQ,MAAM,aAAa,aAAa,IAAI;AAAA,EAC5C,QAAQ;AAAA,SACF;AAAA,MACJ,OAAO,MAAM,YAAY,UAAU,IAAI;AAAA,SACnC;AAAA,MACJ,OAAO,MAAM,YAAY,UAAU,KAAK;AAAA,SACpC;AAAA,MACJ,OAAO,KAAK,YAAY,QAAQ;AAAA,SAC5B;AAAA,MACJ,OAAO,KAAK,YAAY,QAAQ;AAAA,SAC5B;AAAA,MACJ,OAAO,KAAK,YAAY,QAAQ;AAAA,SAC5B;AAAA,MACJ,MAAM,cAAc,iBAAiB;AAAA,MACrC,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,SAC5C;AAAA,MACJ,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,SAC5C;AAAA,MACJ,OAAO,WAAW,KACjB,MACC,KACA,SACA,yDACD,CACD;AAAA,SACI;AAAA,MACJ,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,cAAc,CAAC;AAAA,SACtD;AAAA,MACJ,OAAO,WAAW,KACjB,MACC,KACA,SACA,GAAG,WAAW,SAAS,QAAQ,6BAChC,CACD;AAAA,SACI;AAAA,MACJ,OAAO,SAAS,YAAY,QAAQ;AAAA,SAChC;AAAA,MACJ,OAAO,aAAa,YAAY,QAAQ;AAAA;AAAA,MAExC,OAAO,WAAW,KAAK,MAAM,KAAK,SAAS,sBAAsB,CAAC;AAAA;AAAA;;;AC1JrE;AAGA,IAAM,OAAO,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAC7D,IAAM,SAAS;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,IAAM,MAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAG7C,SAAS,QAAQ,CAAC,MAAoB;AAAA,EAC5C,OAAO,GAAG,KAAK,KAAK,UAAU,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,YAAY,MAAM,KAAK,eAAe,KAAK,IAAI,KAAK,YAAY,CAAC,KAAK,IAAI,KAAK,cAAc,CAAC,KAAK,IAAI,KAAK,cAAc,CAAC;AAAA;AAI3L,SAAS,UAAU,CACzB,OACA,QACA,eACS;AAAA,EACT,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EACnB,OAAO,QAAQ,SAAS,MAAM,KAAK,gBAAgB,MAAM;AAAA;AAInD,SAAS,cAAc,CAAC,SAAyB;AAAA,EAEvD,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EACvC,OAAO,OAAO,IAAI,IAAI,QAAQ,SAAS,UAAU,OAAO;AAAA;AAIzD,SAAS,SAAS,CAAC,MAAsB;AAAA,EACxC,IAAI,MAAM;AAAA,EACV,WAAW,QAAQ,MAAM;AAAA,IACxB,MAAM,OAAO,KAAK,WAAW,CAAC;AAAA,IAC9B,OAAO,OAAO,MAAQ,OAAO,MAAO,OAAO;AAAA,EAC5C;AAAA,EACA,OAAO;AAAA;AAIR,SAAS,KAAK,CAAC,SAA0B;AAAA,EACxC,OAAO,UAAU,OAAO,MAAM,WAAW,CAAC,QAAQ,SAAS,GAAG;AAAA;AAOxD,SAAS,aAAa,CAC5B,YACA,YACA,IACA,MAAM,IAAI,MACD;AAAA,EACT,QAAQ,OAAO,WAAW,aAAa;AAAA,EACvC,MAAM,QAAQ;AAAA,IACb,kBAAkB,UAAU,MAAM,QAAQ,SAAS,OAAO,eAAe,UAAU,aAAa;AAAA,IAChG,OAAQ,SAAS,QAAQ,iBAAiB,WAAW,MAAM,OAAO,MAAM,QAAQ,MAAM,SAAS,SAAS,QAAQ;AAAA,EACjH;AAAA,EACA,OAAO,aAAa;AAAA,EACpB,IAAI,WAAW,WAAW,KAAK,cAAc,aAAa,MAAM,SAAS,GAAG;AAAA,IAC3E,MAAM,KAAK,SAAU,YAAY;AAAA,EAClC;AAAA,EACA,MAAM,MAAM,SAAS,MAAM,KAAK,SAAS,GAAG;AAAA,EAC5C,OAAO,GAAG,MAAM,KAAK;AAAA,CAAM;AAAA;AAAA;;;ACzErB,IAAM,UAAU,MAAM,KAAK,SAAS,4BAA4B;AAEhE,IAAM,kBAAkB,MAC9B,KACA,UACA,2CACD;AAEO,SAAS,MAAM,CAAC,gBAAmC;AAAA,EACzD,OAAO,IAAI,WACV,mBACA,8CAA8C,0CAC/C;AAAA;AAIM,SAAS,aAAa,GAAc;AAAA,EAC1C,OAAO,IAAI,WACV,mBACA,uEACD;AAAA;AAOM,SAAS,cAAc,CAAC,OAA2B;AAAA,EACzD,OAAO,IAAI,WACV,mBACA,QACG,6EACA,wEACJ;AAAA;AAGM,SAAS,WAAW,CAAC,SAA4B;AAAA,EACvD,OAAO,IAAI,WACV,gBACA,6CAA6C,+BAC9C;AAAA;AAGM,SAAS,aAAa,CAAC,SAA4B;AAAA,EACzD,OAAO,IAAI,WACV,gBACA,uDAAuD,+BACxD;AAAA;AAGM,SAAS,OAAO,GAAc;AAAA,EACpC,OAAO,IAAI,WACV,oBACA,0EACD;AAAA;;;ACvCD,IAAM,kBAAkB,KAAK;AAAA;AAetB,MAAM,OAAO;AAAA,EACV,KAAK,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,EAAE,MAAM;AAAA,EACtD;AAAA,EACA,UAAU,IAAI;AAAA,EACvB;AAAA,EAEA,SAAuB,CAAC;AAAA,EACxB,UAAU;AAAA,EAEV,SAAS;AAAA,EAET,QAAQ;AAAA,EACR,SAAsD;AAAA,EACtD;AAAA,EACA,UAA0B,CAAC;AAAA,EAClB;AAAA,EAET,oBAAoB;AAAA,EAEX,WAAW,IAAI;AAAA,EAExB,WAAW,CAAC,YAAwB,aAA0B;AAAA,IAC7D,KAAK,cAAc;AAAA,IAGnB,MAAM,UAAU,IAAI,eACnB;AAAA,MACC,OAAO,CAAC,eAAe;AAAA,QACtB,KAAK,cAAc;AAAA;AAAA,MAEpB,MAAM,CAAC,eAAe,KAAK,MAAM,UAAU;AAAA,MAC3C,QAAQ,MAAM;AAAA,QACb,IAAI,KAAK,WAAW;AAAA,UAAQ,KAAK,SAAS;AAAA,QAC1C,KAAK,SAAS,CAAC;AAAA,QACf,KAAK,UAAU;AAAA,QACf,KAAK,MAAM;AAAA;AAAA,IAEb,GACA,EAAE,eAAe,EAAE,CACpB;AAAA,IACA,KAAK,MACJ,IAAI,YAAY,EAAE,OACjB,cAAc,YAAY,YAAY,IAAI,KAAK,EAAE,CAClD,CACD;AAAA,IACA,MAAM,UAA2B;AAAA,MAChC,IAAI,KAAK;AAAA,MACT,UAAU;AAAA,QACT,MAAM,YAAY,QAAQ;AAAA,QAC1B,IAAI,CAAC,GAAG,YAAY,EAAE;AAAA,QACtB,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,MACnB;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,SAAS;AAAA,IACvB;AAAA,IACA,KAAK,YAAY,KAAK,SAAS,OAAO;AAAA;AAAA,OAQjC,QAAQ,CAAC,SAAsD;AAAA,IACpE,MAAM,aAAa,KAAK;AAAA,IAExB,IAAI,aAAa;AAAA,IACjB,MAAM,SAAS,CAAC,UAAmB;AAAA,MAClC,KAAK,SAAS,MAAM,KAAK;AAAA,MACzB,WAAW,OAAO,KAAK;AAAA;AAAA,IAExB,IAAI;AAAA,MAGH,MAAM,QAAQ,QAAQ;AAAA,MACtB,MAAM,SAAS,MAAM,WAAW,SAAS,QAAQ,OAChD,SACA,WAAW,OACZ;AAAA,MACA,MAAM,UAAU,UAAU,UAAU,QAAQ,MAAM;AAAA,MAClD,aAAa,YAAY,aAAa,YAAY;AAAA,MAClD,OAAO;AAAA,MACN,OAAO,OAAO;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,OAAO;AAAA,cACN;AAAA,MACD,KAAK,oBAAoB,KAAK;AAAA,MAG9B,IAAI,CAAC,KAAK;AAAA,QAAO,KAAK,MAAM,CAAC,UAAU;AAAA,MACvC,KAAK,MAAM;AAAA;AAAA;AAAA,OAKP,MAAK,CAAC,OAAiE;AAAA,IAC5E,QAAQ,MAAM,MAAM,SAAS,KAAK,QAAQ,MAAM,KAAK;AAAA,IACrD,QAAQ,mBAAmB,KAAK,YAAY;AAAA,IAC5C,IAAI,KAAK;AAAA,MAAU,OAAO,EAAE,MAAM,KAAK;AAAA,IACvC,IAAI,KAAK,QAAQ,OAAO,gBAAgB;AAAA,MACvC,KAAK,MAAM,SAAS,OAAO,cAAc,CAAC;AAAA,IAC3C,EAAO,SAAI,KAAK,QAAQ,iBAAiB,GAAG;AAAA,MAE3C,KAAK,MAAM,iBAAiB,cAAc,CAAC;AAAA,IAC5C,EAAO,SAAI,KAAK,WAAW,UAAU,KAAK,SAAS,GAAG;AAAA,MACrD,KAAK,MAAM,IAAI;AAAA,MACf,MAAM,KAAK,MAAM;AAAA,IAClB;AAAA,IACA,OAAO,EAAE,MAAM,KAAK;AAAA;AAAA,OAIf,OAAM,GAAmB;AAAA,IAC9B,IAAI,KAAK;AAAA,MAAU,OAAO,KAAK;AAAA,IAC/B,KAAK,SAAS;AAAA,IACd,KAAK,MAAM;AAAA,IACX,QAAQ,aAAa,YAAY,KAAK,YAAY;AAAA,IAClD,MAAM,SAAS,MAAM,OAAO,KAAK,WAAW,OAAO;AAAA,IACnD,IAAI,SAAS,MAAM,GAAG;AAAA,MACrB,KAAK,YAAY,OAAO,YAAY,UAAU,OAAO,CAAC;AAAA,MAGtD,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC;AAAA,MAC5C,OAAO;AAAA,IACR;AAAA,IACA,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,IAAI,CAAC,KAAK,mBAAmB;AAAA,MAC5B,MAAM,QAAQ,QAAQ;AAAA,MACtB,KAAK,SAAS,MAAM,KAAK;AAAA,MACzB,KAAK,YAAY,OAAO,KAAK;AAAA,MAC7B,OAAO;AAAA,IACR;AAAA,IACA,OAAO,MAAM,KAAK,SAAS,gBAAgB,KAAK,IAAI;AAAA;AAAA,EAIrD,KAAK,GAAS;AAAA,IACb,KAAK,MAAM,aAAa,eAAe,KAAK,MAAM,CAAC;AAAA;AAAA,EAGpD,KAAK,CAAC,OAAyB;AAAA,IAC9B,KAAK,OAAO,KAAK,KAAK;AAAA,IACtB,KAAK,WAAW,MAAM;AAAA,IACtB,KAAK,MAAM;AAAA;AAAA,OAIN,KAAK,CACV,YACgB;AAAA,IAChB,UAAS;AAAA,MACR,IAAI,KAAK,WAAW;AAAA,QAAQ;AAAA,MAC5B,MAAM,OAAO,KAAK,OAAO,MAAM;AAAA,MAC/B,IAAI,MAAM;AAAA,QACT,KAAK,WAAW,KAAK;AAAA,QACrB,WAAW,QAAQ,IAAI;AAAA,QACvB,KAAK,MAAM;AAAA,QACX;AAAA,MACD;AAAA,MACA,IAAI,KAAK,QAAQ;AAAA,QAChB,KAAK,QAAQ;AAAA,QACb,KAAK,SAAS;AAAA,QACd,WAAW,MAAM;AAAA,QACjB;AAAA,MACD;AAAA,MACA,MAAM,IAAI,QAAc,CAAC,SAAS,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC1D;AAAA;AAAA,EAOD,KAAK,CAAC,aAA4B;AAAA,IACjC,IAAI,KAAK,WAAW;AAAA,MAAQ;AAAA,IAC5B,MAAM,QAAQ,QAAQ;AAAA,IACtB,IAAI;AAAA,MAAa,KAAK,SAAS,MAAM,KAAK;AAAA,IAC1C,KAAK,YAAY,MAAM,KAAK;AAAA,IAC5B,KAAK,SAAS;AAAA,IACd,KAAK,SAAS,CAAC;AAAA,IACf,KAAK,UAAU;AAAA;AAAA,EAGhB,KAAK,CAAC,QAAe,OAAwB;AAAA,IAC5C,KAAK,aAAa;AAAA,IAClB,KAAK,SAAS,MAAM,KAAK;AAAA,IACzB,IAAI,KAAK,WAAW;AAAA,MAAQ,KAAK,YAAY,MAAM,KAAK;AAAA,IACxD,KAAK,SAAS;AAAA,IACd,KAAK,SAAS,CAAC;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,MAAM;AAAA;AAAA,OAIN,KAAK,GAAkB;AAAA,IAC5B,QAAQ,aAAa,YAAY,KAAK,YAAY;AAAA,IAClD,OAAO,KAAK,WAAW,UAAU,KAAK,UAAU,iBAAiB;AAAA,MAChE,MAAM,QAAQ,MAAM,OACnB,IAAI,QAAc,CAAC,SAAS,KAAK,QAAQ,KAAK,IAAI,CAAC,GACnD,OACD;AAAA,MACA,IAAI,SAAS,KAAK,GAAG;AAAA,QACpB,KAAK,YAAY,OAAO,YAAY,UAAU,OAAO,CAAC;AAAA,QACtD,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;AAAA,MAC/C;AAAA,IACD;AAAA;AAAA,EAGD,KAAK,GAAS;AAAA,IACb,WAAW,QAAQ,KAAK,QAAQ,OAAO,CAAC;AAAA,MAAG,KAAK;AAAA;AAElD;;;AC/OA,IAAM,cAAc,KAAK;AAAA;AAQlB,MAAM,MAAM;AAAA,EACT;AAAA,EACT,SAAuB,CAAC;AAAA,EACxB,UAAU;AAAA,EACV,UAAU;AAAA,EACD,SAAS,IAAI;AAAA,EACtB;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,WAAW;AAAA,EAEX,QAAQ;AAAA,EAER,YAAY;AAAA,EAEZ,WAAW;AAAA,EAEX,WAAW,CAAC,YAAwB;AAAA,IACnC,KAAK,cAAc;AAAA;AAAA,EAGpB,OAAO,GAAS;AAAA,IACf,KAAK,WAAW;AAAA;AAAA,EAGjB,OAAO,CAAC,OAAyB;AAAA,IAChC,IAAI,KAAK;AAAA,MAAW;AAAA,IACpB,IAAI,CAAC,KAAK,UAAU;AAAA,MACnB,KAAK,QAAQ;AAAA,MACb;AAAA,IACD;AAAA,IACA,KAAK,OAAO,KAAK,MAAM,MAAM,CAAC;AAAA,IAC9B,KAAK,WAAW,MAAM;AAAA,IACtB,IAAI,KAAK,UAAU,eAAe,CAAC,KAAK,SAAS;AAAA,MAChD,KAAK,UAAU;AAAA,MACf,KAAK,YAAY,UAAU,MAAM;AAAA,IAClC;AAAA,IACA,KAAK,MAAM;AAAA;AAAA,EAIZ,KAAK,GAAS;AAAA,IACb,KAAK,SAAS,MAAM;AAAA,IACpB,KAAK,UAAU;AAAA,IAGf,KAAK,YAAY,MAAM;AAAA,IACvB,KAAK,aAAa;AAAA;AAAA,EAQnB,MAAM,GAAS;AAAA,IACd,KAAK,KAAK;AAAA,IACV,KAAK,SAAS,CAAC;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,YAAY;AAAA,IACjB,KAAK,QAAQ;AAAA;AAAA,EAGd,MAAM,GAAS;AAAA,IACd,KAAK,YAAY;AAAA;AAAA,EAIlB,IAAI,GAAS;AAAA,IACZ,KAAK,OAAO,MAAM;AAAA,IAClB,KAAK,WAAW;AAAA;AAAA,EAIjB,SAAS,GAAS;AAAA,IACjB,MAAM,aAAa,KAAK;AAAA,IACxB,KAAK,UAAU,IAAI,OAAO,YAAY,WAAW,MAAM,WAAW;AAAA,IAClE,WAAW,MAAM,UAAU;AAAA;AAAA,OAItB,KAAI,GAAkB;AAAA,IAC3B,OAAO,KAAK;AAAA,MAAU,MAAM,KAAK;AAAA;AAAA,EAGlC,KAAK,GAAS;AAAA,IACb,IAAI,KAAK;AAAA,MAAU;AAAA,IACnB,MAAM,aAAa,KAAK;AAAA,IACxB,KAAK,WAAW,KAAK,MAAM,EACzB,MAAM,CAAC,UAAU;AAAA,MACjB,WAAW,OAAO,KAAK;AAAA,MACvB,WAAW,MAAM,MAAM,KAAK,SAAS,sBAAsB,CAAC;AAAA,KAC5D,EACA,QAAQ,MAAM;AAAA,MACd,KAAK,WAAW;AAAA,MAEhB,IAAI,CAAC,WAAW,UAAU,KAAK,OAAO,SAAS;AAAA,QAAG,KAAK,MAAM;AAAA,KAC7D;AAAA;AAAA,EAGH,OAAO,GAAS;AAAA,IACf,IAAI,KAAK,WAAW,KAAK,WAAW,cAAc,GAAG;AAAA,MACpD,KAAK,UAAU;AAAA,MACf,KAAK,YAAY,UAAU,OAAO;AAAA,IACnC;AAAA;AAAA,OAGK,KAAK,GAAkB;AAAA,IAC5B,OAAO,CAAC,KAAK,YAAY,UAAU,KAAK,OAAO,SAAS,GAAG;AAAA,MAC1D,MAAM,QAAQ,KAAK,OAAO,MAAM;AAAA,MAChC,KAAK,WAAW,MAAM;AAAA,MACtB,KAAK,QAAQ;AAAA,MACb,IAAI,KAAK,YAAY,MAAM,YAAY;AAAA,QAAQ,MAAM,KAAK,MAAM,KAAK;AAAA,MAChE;AAAA,cAAM,KAAK,UAAU,KAAK;AAAA,IAChC;AAAA;AAAA,OAGK,SAAS,CAAC,OAAkC;AAAA,IACjD,KAAK,OAAO,KAAK,KAAK;AAAA,IACtB,OAAO,CAAC,KAAK,YAAY,QAAQ;AAAA,MAEhC,MAAM,KAAK,YAAY,UAAU,QAAQ;AAAA,MACzC,MAAM,QAAQ,KAAK,OAAO,KAAK;AAAA,MAC/B,IAAI,CAAC;AAAA,QAAO;AAAA,MACZ,IAAI,EAAE,UAAU,QAAQ;AAAA,QACvB,KAAK,YAAY,KAAK,MAAM,KAAK,SAAS,eAAe,CAAC;AAAA,QAC1D;AAAA,MACD;AAAA,MACA,KAAK,WAAW;AAAA,MAChB,MAAM,WAAW,KAAK,aAAa,MAAM,IAAI;AAAA,MAC7C,IAAI,KAAK;AAAA,QAAU;AAAA,MACnB,IAAI,KAAK,YAAY,MAAM,YAAY,QAAQ;AAAA,QAE9C,MAAM,OAAO,KAAK,OAAO,SAAS;AAAA,QAClC,IAAI,KAAK,SAAS;AAAA,UAAG,KAAK,SAAS,KAAK,MAAM,CAAC;AAAA,QAC/C;AAAA,MACD;AAAA,IACD;AAAA;AAAA,OAGK,KAAK,CAAC,OAAkC;AAAA,IAC7C,MAAM,SAAS,KAAK;AAAA,IACpB,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,KAAK;AAAA,IAC/C,IAAI,CAAC,QAAQ,KAAK,YAAY;AAAA,MAAQ;AAAA,IACtC,KAAK,UAAU;AAAA,IACf,KAAK,aAAa;AAAA,IAClB,KAAK,YAAY,MAAM,UAAU;AAAA,IACjC,KAAK,YAAY,MAAM,cAAc,iBAAiB;AAAA,IACtD,MAAM,SAAS,MAAM,OAAO,OAAO;AAAA,IACnC,KAAK,aAAa;AAAA,IAClB,KAAK,YAAY,KAAK,MAAM;AAAA,IAC5B,IAAI,KAAK,SAAS;AAAA,MAAG,KAAK,SAAS,IAAI;AAAA;AAAA,EAIxC,QAAQ,CAAC,OAAyB;AAAA,IACjC,KAAK,OAAO,QAAQ,KAAK;AAAA,IACzB,KAAK,WAAW,MAAM;AAAA,IACtB,IAAI,KAAK,UAAU,eAAe,CAAC,KAAK,SAAS;AAAA,MAChD,KAAK,UAAU;AAAA,MACf,KAAK,YAAY,UAAU,MAAM;AAAA,IAClC;AAAA;AAEF;;;ACzKO,MAAM,WAAW;AAAA,EACd;AAAA,EACT;AAAA,EACS,KAAK,OAAO,gBAAgB,IAAI,WAAW,CAAC,CAAC,EAAE,MAAM;AAAA,EACrD,OAAgC,CAAC;AAAA,EACjC;AAAA,EAEA,QAAe,IAAI,MAAM,IAAI;AAAA,EACtC,UAAU;AAAA,EAEV,WAAW,CAAC,UAAoB,WAAsB;AAAA,IACrD,KAAK,WAAW;AAAA,IAChB,KAAK,aAAa;AAAA,IAClB,KAAK,QAAQ;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,MAClB,aAAa,iBAAiB;AAAA,MAC9B,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,IACf;AAAA;AAAA,MAGG,SAAS,GAAc;AAAA,IAC1B,OAAO,KAAK;AAAA;AAAA,EAIb,YAAY,CAAC,WAA4B;AAAA,IACxC,KAAK,aAAa;AAAA;AAAA,MAGf,OAAO,GAAY;AAAA,IACtB,QAAQ,MAAM,SAAS,KAAK;AAAA,IAC5B,OAAO;AAAA,MACN,IAAI,KAAK;AAAA,MACT,eAAe,KAAK,UAAU;AAAA,MAC9B,QAAQ,KAAK,MAAM;AAAA,MACnB,OAAO,KAAK,MAAM;AAAA,SACd,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK;AAAA,SACjC,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK;AAAA,MACrC,MAAM,KAAK;AAAA,IACZ;AAAA;AAAA,MAGG,MAAM,GAAY;AAAA,IACrB,OAAO,KAAK;AAAA;AAAA,EAGb,IAAI,CAAC,QAAqB;AAAA,IACzB,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,KAAK,UAAU,MAAM,YAAY,QAAQ,KAAK,MAAM,KAAK,CAAC;AAAA;AAAA,EAS3D,KAAK,CAAC,QAAsB;AAAA,IAC3B,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,IAAI;AAAA,MAAQ,KAAK,KAAK,MAAM;AAAA,IAC5B,KAAK,UAAU;AAAA,IACf,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,UAAU,MAAM;AAAA;AAAA,EAItB,IAAI,CAAC,QAAqB;AAAA,IACzB,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,KAAK,KAAK,MAAM;AAAA,IAChB,KAAK,UAAU;AAAA,IACf,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,UAAU,IAAI;AAAA;AAAA,EAIpB,IAAI,CAAC,QAAqB;AAAA,IACzB,KAAK,MAAM;AAAA,IACX,IAAI,KAAK,MAAM,UAAU,KAAK,SAAS,WAAW;AAAA,MACjD,QAAQ,aAAa,KAAK,SAAS;AAAA,MACnC,KAAK,MAAM,MAAM,KAAK,SAAS,GAAG,mCAAmC,CAAC;AAAA,IACvE,EAAO;AAAA,MACN,KAAK,KAAK,MAAM;AAAA;AAAA;AAAA,EAKlB,MAAM,CAAC,OAAsB;AAAA,IAC5B,IAAI;AAAA,MACH,KAAK,SAAS,QAAQ,UAAU,OAAO,KAAK,OAAO;AAAA,MAClD,MAAM;AAAA;AAAA,OAUH,KAAI,CACT,MACA,KACA,WAAW,MACkB;AAAA,IAC7B,MAAM,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK,QAAQ;AAAA,IACnD,IAAI,OAAO;AAAA,MAAQ,OAAO;AAAA,IAC1B,OAAO,UAAU,MAAM,OAAO,OAAO,CAAC,UAAU,KAAK,OAAO,KAAK,CAAC;AAAA;AAAA,OAI7D,MAAQ,CACb,MACA,KACA,WAAW,MAC+C;AAAA,IAC1D,MAAM,UAAU,KAAK,SAAS;AAAA,IAC9B,IAAI;AAAA,MACH,MAAM,UAAU,QAAQ,QAAQ,EAAE,KAAK,GAAG;AAAA,MAC1C,MAAM,QAAQ,WAAW,MAAM,OAAO,SAAS,OAAO,IAAI,MAAM;AAAA,MAChE,IAAI,SAAS,KAAK,GAAG;AAAA,QACpB,KAAK,OAAO,YAAY,MAAM,OAAO,CAAC;AAAA,QACtC,OAAO,EAAE,QAAQ,KAAK;AAAA,MACvB;AAAA,MACA,OAAO,EAAE,QAAQ,OAAO,MAAM;AAAA,MAC7B,OAAO,OAAO;AAAA,MACf,KAAK,OAAO,KAAK;AAAA,MACjB,OAAO,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA,OAKlB,KAAI,GAAkB;AAAA,IAC3B,QAAQ,YAAY,KAAK;AAAA,IACzB,MAAM,UAAU,QAAQ,YACrB,MAAM,KAAK,KAAK,aAAa,MAAM,QAAQ,YAAY,KAAK,OAAO,CAAC,IACpE;AAAA,IACH,IAAI;AAAA,MAAS,OAAO,KAAK,MAAM,OAAO;AAAA,IACtC,QAAQ,kBAAkB,KAAK;AAAA,IAC/B,IAAI,gBAAgB;AAAA,MAAG,MAAM,IAAI,MAAM,gBAAgB,IAAI;AAAA,IAC3D,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,IAAI,KAAK,MAAM,OAAO;AAAA,MAErB,OAAO,KAAK,MACX,MAAM,KAAK,SAAS,GAAG,QAAQ,qCAAqC,CACrE;AAAA,IACD;AAAA,IACA,KAAK,KAAK,MAAM,KAAK,WAAW,GAAG,QAAQ,sBAAsB,CAAC;AAAA,IAGlE,KAAK,UAAU,YAAY,KAAK,SAAS,OAAO;AAAA,IAChD,KAAK,MAAM,QAAQ;AAAA;AAAA,EAIpB,OAAO,CAAC,OAAyB;AAAA,IAChC,IAAI,CAAC,KAAK;AAAA,MAAS,KAAK,MAAM,QAAQ,KAAK;AAAA;AAAA,EAI5C,IAAI,GAAkB;AAAA,IACrB,OAAO,KAAK,MAAM,KAAK;AAAA;AAEzB;;;AC5IO,IAAM,iBAAiB;AASvB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AAAA;AAOtB,MAAM,gBAAqC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,UAAU;AAAA,EAEV,UAAU;AAAA,EAEV,UAAU;AAAA,EACV;AAAA,EAEA;AAAA,EAQA,WAAW,CACV,QACA,QACA,UACA,gBAAgB,OAAO,eACtB;AAAA,IACD,KAAK,UAAU;AAAA,IACf,KAAK,SAAS;AAAA,IACd,KAAK,YAAY;AAAA,IACjB,KAAK,gBAAgB;AAAA,IACrB,KAAK,YAAY,IAAI,SAAS,CAAC,UAAU,OAAO,MAAM,KAAK,CAAC;AAAA;AAAA,EAG7D,KAAK,CAAC,MAAoB;AAAA,IACzB,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,KAAK,UAAU,MAAM,IAAI,YAAY,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA,EAIpD,KAAK,GAAS;AAAA,IACb,IAAI,KAAK,UAAU,MAAM,KAAK,KAAK;AAAA,MAAS,KAAK,QAAQ,IAAI;AAAA;AAAA,EAG9D,OAAO,GAAkB;AAAA,IACxB,OAAO,KAAK,UAAU,QAAQ;AAAA;AAAA,EAU/B,QAAQ,GAAS;AAAA,IAChB,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,OAAO,OAAO,QAAQ,KAAK,IAAI;AAAA,IACrC,IAAI,QAAQ;AAAA,MAAG,KAAK,WAAW;AAAA,IAC1B;AAAA,WAAK,WAAW,KAAK,IAAI,iBAAiB,IAAI,CAAC;AAAA;AAAA,EAIrD,MAAM,GAAS;AAAA,IACd,KAAK,UAAU;AAAA,IACf,KAAK,QAAQ;AAAA,IACb,KAAK,eAAe;AAAA,IACpB,KAAK,UAAU,MAAM;AAAA;AAAA,EAItB,GAAG,GAAS;AAAA,IACX,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,KAAK,KAAK;AAAA,IACV,IAAI,KAAK,UAAU;AAAA,MAAO,KAAK,QAAQ,KAAK;AAAA,IACvC;AAAA,WAAK,UAAU;AAAA;AAAA,EAGrB,KAAK,GAAS;AAAA,IACb,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,IAAI,KAAK,UAAU;AAAA,MAAO,KAAK,IAAI;AAAA,IAC9B;AAAA,WAAK,WAAW;AAAA;AAAA,EA4BtB,OAAO,CAAC,SAAwB;AAAA,IAC/B,KAAK,UAAU;AAAA,IACf,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,IAAI,CAAC,KAAK,SAAS;AAAA,MAClB,KAAK,UAAU,OAAO;AAAA,MACtB;AAAA,IACD;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,KAAK,UAAU,EAAE,SAAS,OAAO,KAAK,IAAI,IAAI,cAAc;AAAA,IAC5D,KAAK,WAAW,eAAe;AAAA;AAAA,EAQhC,UAAU,CAAC,IAAkB;AAAA,IAC5B,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,aAAa,OAAO,KAAK;AAAA,IACzB,OAAO,QAAQ,WAAW,MAAM;AAAA,MAC/B,IAAI,KAAK;AAAA,QAAiB,OAAO,KAAK,WAAW;AAAA,MACjD,KAAK,eAAe;AAAA,MACpB,KAAK,UAAU,OAAO,OAAO;AAAA,OAC3B,EAAE;AAAA,IACL,OAAO,MAAM,QAAQ;AAAA;AAAA,EAGtB,cAAc,GAAS;AAAA,IACtB,aAAa,KAAK,SAAS,KAAK;AAAA,IAChC,KAAK,UAAU;AAAA;AAAA,EAGhB,SAAS,CAAC,SAAwB;AAAA,IACjC,IAAI,WAAW,KAAK;AAAA,MAAQ,KAAK,QAAQ,SAAS;AAAA,IAC7C;AAAA,WAAK,QAAQ,SAAS,IAAI;AAAA;AAAA,EAIhC,UAAU,GAAS;AAAA,IAClB,KAAK,QAAQ;AAAA,IACb,KAAK,eAAe;AAAA,IACpB,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,QAAQ,UAAU;AAAA;AAAA,EAIxB,IAAI,GAAS;AAAA,IACZ,IAAI,KAAK;AAAA,MAAQ;AAAA,IACjB,KAAK,SAAS,WAAW,MAAM,KAAK,WAAW,GAAG,cAAc;AAAA,IAChE,KAAK,OAAO,QAAQ;AAAA;AAAA,EAGrB,OAAO,GAAS;AAAA,IACf,aAAa,KAAK,MAAM;AAAA,IACxB,KAAK,SAAS;AAAA;AAAA,EAGf,KAAK,GAAS;AAAA,IACb,KAAK,UAAU;AAAA,IACf,KAAK,QAAQ,MAAM;AAAA;AAAA,EAGpB,MAAM,GAAS;AAAA,IACd,KAAK,UAAU;AAAA,IACf,KAAK,QAAQ,OAAO;AAAA;AAAA,EAGrB,QAAQ,GAAS;AAAA,IAChB,KAAK,UAAU;AAAA;AAAA,EAGhB,WAAW,CAAC,SAAuB;AAAA,IAClC,KAAK,QAAQ,QAAQ,OAAO;AAAA;AAE9B;;;AC9MO,SAAS,QAAQ,CACvB,QACA,UACA,OACO;AAAA,EAEP,OAAO,KAAK,WAAW,SAAS;AAAA,EAEhC,OAAO,QAAQ,SAAS,OAAO;AAAA,EAC/B,OAAO,KAAK,YAAY,QAAQ,KAAK;AAAA;AAQ/B,SAAS,QAAQ,CAAC,UAAgD;AAAA,EACxE,MAAM,OAAO,MACZ,KACA,SACA,GAAG,SAAS,QAAQ,iCACrB;AAAA,EACA,OAAO;AAAA,IACN,IAAI,CAAC,QAAQ,OAAO;AAAA,MACnB,MAAM,QAAQ,OAAO;AAAA,MACrB,IAAI,CAAC,SAAS,MAAM;AAAA,QAAU;AAAA,MAC9B,IAAI,MAAM;AAAA,QAAQ,OAAO,MAAM,OAAO,QAAQ,KAAK;AAAA,MACnD,IAAI,CAAC,MAAM;AAAA,QAAK,OAAO,SAAS,QAAQ,UAAU,KAAK;AAAA,MAEvD,MAAM,WAAW,SAAS;AAAA,MAC1B,MAAM,IAAI,QAAQ,KAAK;AAAA;AAAA,IAExB,KAAK,CAAC,QAAQ;AAAA,MACb,MAAM,QAAQ,OAAO;AAAA,MACrB,IAAI,CAAC,SAAS,MAAM;AAAA,QAAU;AAAA,MAC9B,IAAI,MAAM;AAAA,QAAK,MAAM,IAAI,SAAS;AAAA,MAC7B;AAAA,cAAM,WAAW,MAAM;AAAA;AAAA,IAE7B,KAAK,CAAC,QAAQ;AAAA,MACb,OAAO,MAAM,YAAY,MAAM;AAAA;AAAA,IAEhC,OAAO,CAAC,QAAQ;AAAA,MACf,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAK;AAAA,QAAU;AAAA,MAE1C,IAAI,OAAO,KAAK;AAAA,QAAa,OAAO,OAAO,UAAU;AAAA,MACrD,QAAQ,YAAY,cAAc,OAAO;AAAA,MAGzC,IAAI,YAAY;AAAA,QAAQ,WAAW,MAAM;AAAA,MACpC;AAAA,oBAAY,MAAM,IAAI;AAAA;AAAA,EAE7B;AAAA;AAIM,SAAS,QAAQ,CACvB,QACA,KACA,QACA,MACO;AAAA,EACP,MAAM,UAAU,IAAI,gBAAgB,KAAK,QAAQ,MAAM,EAAE;AAAA,EACzD,OAAO,KAAK,YAAY;AAAA,EACxB,QAAQ,MAAM,IAAI;AAAA,EAClB,QAAQ,IAAI;AAAA;AAON,SAAS,WAAW,CAC1B,QACA,KACA,SACA,UACA,QACA,OACkB;AAAA,EAClB,MAAM,YAAY,IAAI,gBACrB,KACA,QACA,MAAM;AAAA,IACL,MAAM,MAAM,SAAS,QAAQ;AAAA,IAC7B,MAAM,aAAa,OAAO,KAAK;AAAA,IAC/B,IAAI,CAAC,OAAO,CAAC;AAAA,MAAY;AAAA,IACzB,OAAO,KAAK,WAAW;AAAA,IACvB,SAAS,aAAa,OAAO,WAAwB;AAAA,MACpD,KAAK,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK;AAAA,MACpC,MAAM,EAAE,YAAY,UAAU,MAAM;AAAA,MACpC,QAAQ;AAAA,WACJ,SAAS,QAAQ;AAAA,QACpB,OAAO,CAAC,MAAM;AAAA,UACb,MAAM,QAAQ,UAAU;AAAA,UACxB,EAAE,KAAK,WAAW,OAAO;AAAA,UACzB,WAAW,MAAM;AAAA;AAAA,MAEnB;AAAA,IACD,CAAC;AAAA,IACD,UAAU,QAAQ,SAAS,OAAO;AAAA,IAClC,MAAM,OAAO,IAAI,gBAChB,WACA,MACA,MAAM,IACN,OACD;AAAA,IACA,UAAU,KAAK,YAAY;AAAA,IAC3B,WAAW,aAAa,IAAI;AAAA,KAE7B,OACD;AAAA,EACA,OAAO,KAAK,YAAY;AAAA,EACxB,OAAO;AAAA;;;ACpJR,iBAAS;AAUF,SAAS,YAAY,CAAC,MAAsC;AAAA,EAElE,IAAI,KAAK,SAAS,GAAG;AAAA,IAAG;AAAA,EACxB,MAAM,OAAO,MAAK,IAAI;AAAA,EACtB,IAAI,SAAS;AAAA,IAAG,OAAO,IAAI,WAAW,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC;AAAA,EACjE,IAAI,SAAS;AAAA,IAAG;AAAA,EAChB,OAAO,SAAS,UAAU,KAAK,YAAY,CAAC,CAAC;AAAA;AAI9C,SAAS,SAAS,CAAC,MAA0B;AAAA,EAC5C,MAAM,QAAQ,IAAI,WAAW,EAAE;AAAA,EAC/B,IAAI,OAAO;AAAA,EACX,MAAM,SAAS,8BAA8B,KAAK,IAAI;AAAA,EACtD,IAAI,QAAQ;AAAA,IACX,MAAM,IAAI,OAAO,MAAM,CAAC,EAAE,IAAI,MAAM,GAAG,EAAE;AAAA,IACzC,OAAO,GAAG,KAAK,MAAM,GAAG,OAAO,KAAK;AAAA,EACrC;AAAA,EACA,OAAO,OAAO,IAAI,QAAQ,KAAK,MAAM,IAAI;AAAA,EACzC,MAAM,OAAO,SAAS,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG;AAAA,EAC9C,MAAM,QAAQ,SAAS,aAAa,SAAS,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG;AAAA,EACrE,MAAM,SACL,SAAS,YACN,OACA,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,KAAK,SAAS,MAAM,MAAM,EAAE,KAAK,GAAG,GAAG,GAAG,KAAK;AAAA,EAC1E,MAAM,OAAO,IAAI,SAAS,MAAM,MAAM;AAAA,EACtC,OAAO,QAAQ,CAAC,OAAO,OAAO;AAAA,IAC7B,IAAI,CAAC,UAAU,KAAK;AAAA,MAAG,KAAK,UAAU,KAAK,GAAG,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,GACxE;AAAA,EACD,OAAO;AAAA;AAID,SAAS,QAAQ,CAAC,OAA+B;AAAA,EACvD,IAAI,MAAM,WAAW;AAAA,IAAI,OAAO;AAAA,EAChC,MAAM,SACL,MAAM,SAAS,GAAG,EAAE,EAAE,MAAM,CAAC,SAAS,SAAS,CAAC,KAChD,MAAM,QAAQ,OACd,MAAM,QAAQ;AAAA,EACf,OAAO,SAAS,MAAM,MAAM,EAAE,IAAI;AAAA;AAQ5B,SAAS,aAAa,CAAC,KAAyB;AAAA,EACtD,MAAM,QAAQ,SAAS,GAAG;AAAA,EAC1B,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO,MAAM,KAAK,GAAG;AAAA,EAC7C,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,EAAE;AAAA,EAC5D,MAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,OAAO,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,EAC1E,IAAI,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE;AAAA,EAC/B,SAAS,KAAK,EAAG,KAAK,KAAK;AAAA,IAC1B,IAAI,MAAM;AAAA,IACV,OAAO,MAAM,KAAK,OAAO,SAAS;AAAA,MAAG;AAAA,IACrC,IAAI,MAAM,KAAK,KAAK;AAAA,MAAQ,OAAO,EAAE,IAAI,QAAQ,MAAM,GAAG;AAAA,IAC1D,KAAK,QAAQ,KAAK,KAAK,IAAI;AAAA,EAC5B;AAAA,EACA,MAAM,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,CAAC;AAAA,EACpD,IAAI,KAAK,KAAK;AAAA,IAAG,OAAO,IAAI,KAAK,GAAG;AAAA,EACpC,MAAM,OAAO,IAAI,MAAM,GAAG,KAAK,EAAE,EAAE,KAAK,GAAG;AAAA,EAC3C,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,MAAM,EAAE,KAAK,GAAG;AAAA,EACvD,OAAO,GAAG,SAAS;AAAA;;;ACrDb,IAAM,gBAAgB;AAEtB,IAAM,gBAAgB;AAEtB,IAAM,oBAAoB,KAAK,MAAM;AAE5C,IAAM,YAAY,IAAI,YAAY,EAAE,OAAO,QAAQ;AACnD,IAAM,eAAe,IAAI,WAAW;AAAA,EACnC;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AACnE,CAAC;AAED,IAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,GAAG;AAEtC,IAAM,UAAU,EAAE,QAAQ,UAAU;AACpC,IAAM,UAAU,CAAC,YAAoB,EAAE,QAAQ,WAAW,OAAO;AAGjE,SAAS,QAAQ,CAAC,OAAmB,QAA6B;AAAA,EACjE,MAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,OAAO,MAAM;AAAA,EACnD,SAAS,KAAK,EAAG,KAAK,QAAQ,MAAM;AAAA,IACnC,IAAI,MAAM,QAAQ,OAAO;AAAA,MAAK,OAAO;AAAA,EACtC;AAAA,EACA,OAAO;AAAA;AAGD,SAAS,eAAe,CAAC,OAAgC;AAAA,EAC/D,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EAC/B,IAAI,SAAS,OAAO,YAAY;AAAA,IAAG,OAAO,OAAO,KAAK;AAAA,EACtD,IAAI,SAAS,OAAO,SAAS;AAAA,IAAG,OAAO,OAAO,KAAK;AAAA,EACnD,OAAO,QAAQ,6BAA6B;AAAA;AAG7C,SAAS,MAAM,CAAC,OAAgC;AAAA,EAC/C,IAAI,MAAM,SAAS;AAAA,IAAI,OAAO;AAAA,EAC9B,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,iBAAiB,KAAK,SAAS,EAAE;AAAA,EACvC,IAAI,kBAAkB,MAAM;AAAA,IAAG,OAAO,QAAQ,eAAe;AAAA,EAC7D,MAAM,UAAU,iBAAiB;AAAA,EACjC,IAAI,UAAU;AAAA,IAAG,OAAO,QAAQ,mBAAmB,SAAS;AAAA,EAC5D,MAAM,SAAS,KAAK,SAAS,EAAE,KAAK;AAAA,EACpC,MAAM,YAAY,KAAK,SAAS,EAAE,IAAI;AAAA,EACtC,MAAM,SAAS,KAAK,UAAU,EAAE;AAAA,EAEhC,MAAM,YAAY,YAAY,IAAI,IAAI,eAAe;AAAA,EACrD,IAAI,cAAc,aAAa,YAAY,GAAG;AAAA,IAC7C,OAAO,QAAQ,qCAAqC;AAAA,EACrD;AAAA,EACA,IAAI,SAAS;AAAA,IAAW,OAAO,QAAQ,yBAAyB;AAAA,EAEhE,IAAI,SAAS,YAAY;AAAA,IAAe,OAAO,QAAQ,eAAe;AAAA,EACtE,MAAM,QAAQ,KAAK;AAAA,EACnB,IAAI,MAAM,SAAS;AAAA,IAAO,OAAO;AAAA,EACjC,IAAI,YAAY;AAAA,IAAG,OAAO,EAAE,QAAQ,YAAY,QAAQ,MAAM;AAAA,EAC9D,MAAM,OAAO,MAAM,SAAS,KAAK,WAAW,KAAK;AAAA,EACjD,IAAI,CAAC,eAAe,IAAI;AAAA,IAAG,OAAO,QAAQ,eAAe;AAAA,EAEzD,IAAI,cAAc,KAAM,WAAW,KAAK,WAAW,GAAI;AAAA,IACtD,OAAO,EAAE,QAAQ,YAAY,QAAQ,MAAM;AAAA,EAC5C;AAAA,EACA,MAAM,OAAO,WAAW,IAAI,IAAI;AAAA,EAChC,MAAM,SAAS,cAAc,MAAM,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,EACvD,OAAO,EAAE,QAAQ,YAAY,QAAQ,OAAO,OAAO;AAAA;AAIpD,SAAS,cAAc,CAAC,OAA4B;AAAA,EACnD,IAAI,KAAK;AAAA,EACT,OAAO,KAAK,MAAM,QAAQ;AAAA,IACzB,IAAI,KAAK,IAAI,MAAM;AAAA,MAAQ,OAAO;AAAA,IAClC,MAAM,SAAW,MAAM,KAAK,MAAiB,IAAM,MAAM,KAAK;AAAA,IAC9D,MAAM,IAAI;AAAA,EACX;AAAA,EACA,OAAO,OAAO,MAAM;AAAA;AAGrB,IAAM,OAAO;AAEb,SAAS,MAAM,CAAC,OAAgC;AAAA,EAC/C,MAAM,MAAM,MAAM,QAAQ,EAAI;AAAA,EAC9B,IAAI,MAAM,GAAG;AAAA,IACZ,OAAO,MAAM,UAAU,gBACpB,QAAQ,kBAAkB,IAC1B;AAAA,EACJ;AAAA,EACA,IAAI,MAAM,IAAI;AAAA,IAAe,OAAO,QAAQ,kBAAkB;AAAA,EAC9D,IAAI,MAAM,MAAM,OAAO;AAAA,IAAM,OAAO,QAAQ,sBAAsB;AAAA,EAClE,MAAM,OAAO,MAAM,SAAS,GAAG,MAAM,CAAC;AAAA,EACtC,IAAI,KAAK,KAAK,CAAC,SAAS,OAAO,MAAQ,OAAO,GAAI,GAAG;AAAA,IACpD,OAAO,QAAQ,uBAAuB;AAAA,EACvC;AAAA,EACA,SAAS,aAAa,QAAQ,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE,MAAM,GAAG;AAAA,EACtE,IAAI,aAAa;AAAA,IAAW,OAAO,EAAE,QAAQ,YAAY,QAAQ,MAAM,EAAE;AAAA,EACzE,OAAO,SAAS,IAAI,cAAc,IAAI,aAAa,IAAI,OAAO,MAAM;AAAA,EACpE,MAAM,OAAO,aAAa,SAAS,IAAI,aAAa,SAAS,KAAK;AAAA,EAClE,IAAI,SAAS;AAAA,IAAG,OAAO,QAAQ,uCAAuC;AAAA,EACtE,MAAM,OAAO,WAAW,QAAQ,IAAI;AAAA,EACpC,IACC,KAAK,WAAW,KAChB,CAAC,QACD,CAAC,WAAW,aAAa,IAAI,KAC7B,CAAC,UAAU,UAAU,KACrB,CAAC,UAAU,IAAI,GACd;AAAA,IACD,OAAO,QAAQ,iCAAiC;AAAA,EACjD;AAAA,EACA,OAAO,EAAE,QAAQ,YAAY,QAAQ,MAAM,GAAG,QAAQ,cAAc,IAAI,EAAE;AAAA;AAI3E,SAAS,UAAU,CAAC,MAAc,MAAsC;AAAA,EACvE,IAAI,SAAS,KAAK,KAAK,SAAS,GAAG;AAAA,IAAG;AAAA,EACtC,IAAI,SAAS,MAAM,CAAC,KAAK,SAAS,GAAG;AAAA,IAAG;AAAA,EACxC,OAAO,aAAa,IAAI;AAAA;AAGzB,SAAS,SAAS,CAAC,MAAuB;AAAA,EACzC,OAAO,KAAK,KAAK,IAAI,KAAK,OAAO,IAAI,KAAK;AAAA;;;AC/HpC,MAAM,aAAa;AAAA,EACzB,SAAS,IAAI,WAAW,CAAC;AAAA,EACzB;AAAA,EACA,WAAW;AAAA,EACF;AAAA,EACA;AAAA,EAET,WAAW,CACV,SACA,MACA,QACC;AAAA,IACD,KAAK,QAAQ;AAAA,IACb,KAAK,UAAU;AAAA,IACf,KAAK,SAAS,WAAW,MAAM,KAAK,QAAQ,MAAM,GAAG,UAAU,IAAI;AAAA,IACnE,KAAK,OAAO,QAAQ;AAAA;AAAA,EAGrB,OAAO,CAAC,OAAyB;AAAA,IAChC,IAAI,KAAK;AAAA,MAAU;AAAA,IACnB,MAAM,QAAQ,IAAI,WAAW,KAAK,OAAO,SAAS,MAAM,MAAM;AAAA,IAC9D,MAAM,IAAI,KAAK,MAAM;AAAA,IACrB,MAAM,IAAI,OAAO,KAAK,OAAO,MAAM;AAAA,IACnC,KAAK,SAAS;AAAA,IACd,MAAM,SAAS,gBAAgB,KAAK;AAAA,IACpC,IAAI,OAAO,WAAW,YAAY;AAAA,MACjC,MAAM,OAAO,MAAM,MAAM,OAAO,MAAM;AAAA,MACtC,KAAK,QAAQ,MAAM,KAAK,MAAM,OAAO,QAAQ,IAAI,CAAC;AAAA,IACnD,EAAO,SACN,OAAO,WAAW,aAClB,MAAM,UAAU,mBACf;AAAA,MACD,KAAK,QAAQ,KAAK,OAAO;AAAA,IAC1B;AAAA;AAAA,EAID,MAAM,GAAS;AAAA,IACd,KAAK,WAAW;AAAA,IAChB,aAAa,KAAK,MAAM;AAAA,IACxB,KAAK,SAAS,IAAI,WAAW,CAAC;AAAA;AAAA,EAG/B,OAAO,CAAC,MAAwB;AAAA,IAC/B,IAAI,KAAK;AAAA,MAAU;AAAA,IACnB,KAAK,OAAO;AAAA,IACZ,KAAK;AAAA;AAEP;;;ACzDA;AACA;AAAA;AA6BO,MAAM,WAAW;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EAET;AAAA,EAEA,aAAa;AAAA,EAEb,WAAW,CAAC,KAAsB,SAAwB,QAAmB;AAAA,IAC5E,KAAK,OAAO;AAAA,IACZ,KAAK,QAAQ,IAAI,OAAO;AAAA,MACvB,IAAI,GAAG;AAAA,MACP,OAAO,CAAC,OAAmB,WAAW,SAAS,KAAK,MAAM,OAAO,IAAI;AAAA,MACrE,OAAO,CAAC,SAAS;AAAA,QAChB,KAAK,KAAK,SAAS,KAAK,UAAU;AAAA,QAClC,KAAK;AAAA;AAAA,IAEP,CAAC;AAAA,IACD,KAAK,OAAO,IAAI,UAAU,KAAK,OAAgB;AAAA,MAC9C,UAAU;AAAA,MACV,eAAe;AAAA,IAChB,CAAC;AAAA,IACD,KAAK,KAAK,GAAG,UAAU,MAAM,OAAO,OAAO,CAAC;AAAA,IAC5C,KAAK,KAAK,GAAG,QAAQ,CAAC,UAAsB,OAAO,KAAK,KAAK,CAAC;AAAA,IAC9D,KAAK,KAAK,GAAG,SAAS,MAAM,OAAO,MAAM,CAAC;AAAA,IAE1C,KAAK,KAAK,GAAG,SAAS,MAAM,KAAK,UAAU,CAAC;AAAA;AAAA,MAGzC,aAAa,GAAW;AAAA,IAC3B,OAAO,KAAK,KAAK;AAAA;AAAA,EAIlB,OAAO,CAAC,OAAyB;AAAA,IAChC,KAAK,MAAM,KAAK,WAAW,KAAK,KAAK,CAAC;AAAA;AAAA,EAIvC,QAAQ,GAAS;AAAA,IAChB,MAAM,UAAU,KAAK;AAAA,IACrB,IAAI,CAAC;AAAA,MAAS;AAAA,IACd,MAAM,UAAU,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,KAAK,GAAG,CAAC;AAAA,IAC1D,IAAI,UAAU,QAAQ,MAAM,QAAQ;AAAA,MACnC,QAAQ,QAAQ,QAAQ,MAAM,SAAS,OAAO;AAAA,MAC9C;AAAA,IACD;AAAA,IACA,KAAK,WAAW;AAAA,IAChB,QAAQ,KAAK;AAAA;AAAA,EAGd,KAAK,CAAC,OAAmB,MAAwB;AAAA,IAChD,MAAM,UAAU,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,IAClD,IAAI,UAAU,MAAM,QAAQ;AAAA,MAC3B,KAAK,WAAW,EAAE,OAAO,MAAM,SAAS,OAAO,GAAG,KAAK;AAAA,IACxD,EAAO;AAAA,WAAK;AAAA;AAAA,EAGb,KAAK,CAAC,OAA2B;AAAA,IAChC,IAAI,KAAK,KAAK,aAAa,KAAK,KAAK;AAAA,MAAmB,OAAO;AAAA,IAC/D,KAAK,KAAK,MAAM,KAAK;AAAA,IACrB,OAAO,MAAM;AAAA;AAAA,EAQd,QAAQ,CAAC,YAAY,OAAa;AAAA,IACjC,KAAK,aAAa;AAAA,IAKlB,KAAK,KAAK,KAAK,UAAU,MAAM,KAAK,MAAM,IAAI,CAAC;AAAA,IAC/C,KAAK,KAAK,IAAI;AAAA;AAAA,EAGf,SAAS,GAAS;AAAA,IACjB,KAAK,WAAW;AAAA,IAChB,KAAK,KAAK,QAAQ;AAAA,IAClB,KAAK,KAAK,UAAU;AAAA;AAAA,EAIrB,MAAM,GAAS;AAAA,IACd,KAAK,WAAW;AAAA,IAChB,KAAK,KAAK,QAAQ;AAAA;AAAA,EAGnB,KAAK,GAAS;AAAA,IACb,KAAK,KAAK,MAAM;AAAA;AAAA,EAGjB,MAAM,GAAS;AAAA,IACd,KAAK,KAAK,OAAO;AAAA;AAAA,EAGlB,OAAO,CAAC,SAAuB;AAAA,IAC9B,KAAK,KAAK,QAAQ,OAAO;AAAA;AAE3B;;;ACpGO,SAAS,gBAAgB,CAC/B,WACmE;AAAA,EACnE,QAAQ,UAAU,OAAO,aAAa,WAAW;AAAA,EACjD,OAAO;AAAA,IAMN,IAAI,CAAC,QAAQ;AAAA,MACZ,OAAO,OAAO,EAAE,UAAU,OAAO,aAAa,OAAO;AAAA,MACrD,OAAO,QAAQ,SAAS,SAAS,mBAAmB,SAAS,OAAO;AAAA,MACpE,MAAM,OAAO,OAAO;AAAA,MACpB,IAAI,SAAS,SAAS,IAAI;AAAA,QAAG,YAAY,WAAW,QAAQ,IAAI;AAAA,MAC3D;AAAA,cAAM,WAAW,QAAQ,IAAI;AAAA;AAAA,IAEnC,WAAW,CAAC,QAAQ,YAAY,UAAU,WAAW,QAAQ,OAAO;AAAA,IACpE,KAAK,CAAC,QAAQ;AAAA,MACb,YAAY,OAAO,MAAM;AAAA,MACzB,OAAO,MAAM,QAAQ,OAAO;AAAA,MAC5B,OAAO,MAAM,KAAK,OAAO;AAAA,MACzB,MAAM,aAAa,OAAO,MAAM;AAAA,MAChC,IAAI;AAAA,QAAY,MAAM,QAAQ,UAAU;AAAA,MACxC,OAAO,MAAM,WAAW,OAAO;AAAA,MAC/B,YAAY,MAAM;AAAA;AAAA,EAEpB;AAAA;AAGD,SAAS,SAAS,GACf,UAAU,eACZ,QACA,SACO;AAAA,EACP,MAAM,QAAQ,OAAO;AAAA,EACrB,IAAI,CAAC,OAAO;AAAA,IAAa;AAAA,EACzB,YAAY,OAAO,MAAM;AAAA,EAEzB,IAAI,CAAC;AAAA,IAAS;AAAA,EACd,MAAM,cAAc;AAAA,EACpB,OAAO,QAAQ,SAAS,OAAO;AAAA,EAC/B,MAAM,QAAQ,MAAM;AAAA,EACpB,OAAO,MAAM;AAAA,EACb,QAAQ;AAAA;AAST,SAAS,WAAW,CACnB,WACA,QACA,MACO;AAAA,EACP,QAAQ,UAAU,aAAa,WAAW;AAAA,EAC1C,OAAO,KAAK,cAAc;AAAA,EAC1B,OAAO,QAAQ,SAAS,gBAAgB;AAAA,EACxC,YAAY,IAAI,MAAM;AAAA,EACtB,OAAO,KAAK,SAAS,IAAI,aACxB,SAAS,kBACT,CAAC,QAAQ,SAAS;AAAA,IACjB,OAAO,OAAO,KAAK;AAAA,IACnB,YAAY,OAAO,MAAM;AAAA,IACzB,OAAO,KAAK,cAAc;AAAA,IAC1B,IAAI,CAAC;AAAA,MAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,IAC5C,MAAM,WAAW,QAAQ,UAAU,MAAM,IAAI;AAAA,KAE9C,MAAM,OAAO,UAAU,CACxB;AAAA;AAID,SAAS,KAAK,CACb,WACA,QACA,SACA,OACO;AAAA,EACP,QAAQ,UAAU,OAAO,aAAa,QAAQ,YAAY;AAAA,EAC1D,IAAI,MAAiB;AAAA,EACrB,IAAI,SAAS;AAAA,IACZ,MAAM,UAAS,WAAW,QAAQ,OAAO;AAAA,IACzC,IAAI,SAAS,MAAM,SAAS;AAAA,MAAG,OAAO,KAAK,KAAK,QAAQ,KAAK;AAAA,EAC9D;AAAA,EACA,MAAM,QAAQ,CAAC,UAAsB;AAAA,IACpC,IAAI,CAAC;AAAA,MAAQ,OAAO,MAAM;AAAA,IAC1B,YAAY,IAAI,MAAM;AAAA,IACtB,OAAO,KAAK,QAAQ;AAAA;AAAA,EAErB,QAAQ,aAAa,SAAS;AAAA,EAC9B,MAAM,SAAS,CAAC,SACf,MAAM,MAAM,SAAS,QAAQ,KAAK,QAAQ,GAAG;AAAA,CAAU,CAAC;AAAA,EACzD,IAAI,MAAM,QAAQ,SAAS,gBAAgB;AAAA,IAC1C,OAAO,aAAa,0CAA0C;AAAA,IAC9D;AAAA,EACD;AAAA,EACA,MAAM,MAAM,UAAU,OAAO;AAAA,EAC7B,IAAI,MAAM,GAAG,GAAG,KAAK,SAAS,yBAAyB;AAAA,IACtD,OACC,aAAa,4DACd;AAAA,IACA;AAAA,EACD;AAAA,EACA,MAAM,YAAY,YAAY,QAAQ,KAAK,SAAS,UAAU,QAAQ,KAAK;AAAA,EAC3E,MAAM,aAAa,IAAI,WAAW,UAAU,SAAS;AAAA,EACrD,MAAM,KAAK,YAAY,GAAG;AAAA,EAC1B,OAAO,KAAK,aAAa;AAAA,EAEzB,IAAI,SAAS,MAAM,SAAS,KAAK,CAAC,SAAS;AAAA,IAC1C,SAAS,QAAQ,UAAU,KAAK;AAAA,EACjC;AAAA,EACA,MAAM,MAAM,KAAK,WAAW,KAAK,CAAC;AAAA;AAInC,SAAS,SAAQ,CAChB,WACA,QACA,SACa;AAAA,EACb,QAAQ,aAAa;AAAA,EACrB,OAAO,KAAK,cAAc;AAAA,EAC1B,OAAO,QAAQ,SAAS,gBAAgB;AAAA,EACxC,MAAM,MAAM,IAAI,WAAW,QAA2B,SAAS;AAAA,IAC9D,QAAQ,MAAM,UAAU,WAAW,QAAQ,IAAI;AAAA,IAC/C,MAAM,CAAC,UAAU,SAAS,QAAQ,UAAU,KAAK;AAAA,IACjD,OAAO,MAAM,OAAO,KAAK,WAAW,MAAM;AAAA,EAC3C,CAAC;AAAA,EACD,OAAO,KAAK,MAAM;AAAA,EAClB,OAAO;AAAA;;;AC7JR,SAAS,SAAS,CAAC,OAAkC;AAAA,EACpD,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,GAAG,OAAO,KAAK;AAAA,EACrD,OAAO,UAAU,IAAI,QAAQ,SAAS,MAAM,MAAM,GAAG;AAAA,EACrD,MAAM,MAAM,aAAa,OAAO;AAAA,EAChC,IAAI,CAAC,OAAO,UAAU,WAAW;AAAA,IAChC,OAAO,IAAI;AAAA,EACZ;AAAA,EAEA,MAAM,SAAS,IAAI,WAAW,KAAK,QAAQ,SAAS,GAAG;AAAA,EACvD,MAAM,QAAQ,IAAI,SAAS;AAAA,EAC3B,IAAI,WAAW;AAAA,IAAW,OAAO,EAAE,OAAO,KAAK,MAAM,MAAM;AAAA,EAC3D,IAAI,OAAO,YAAY,KAAK,MAAM,IAAI,OAAO,MAAM,IAAI;AAAA,EACvD,IAAI;AAAA,IAAQ,QAAQ;AAAA,EACpB,IAAI,OAAO,KAAK,OAAO,OAAO;AAAA,IAC7B,OAAO,IAAI;AAAA,EACZ;AAAA,EACA,IAAI,SAAS,GAAG;AAAA,IACf,OAAO,IAAI;AAAA,EACZ;AAAA,EACA,OAAO,EAAE,OAAO,KAAK,KAAK;AAAA;AAG3B,SAAS,QAAQ,CAAC,SAAkB,SAA8B;AAAA,EACjE,IAAI,QAAQ,MAAM,WAAW,QAAQ;AAAA,IAAQ,OAAO;AAAA,EACpD,MAAM,QAAQ,QAAQ,QAAQ;AAAA,EAC9B,SAAS,KAAK,EAAG,KAAK,OAAO,MAAM;AAAA,IAClC,IAAI,QAAQ,MAAM,QAAQ,QAAQ;AAAA,MAAK,OAAO;AAAA,EAC/C;AAAA,EACA,MAAM,OAAO,QAAQ,OAAO;AAAA,EAC5B,IAAI,SAAS;AAAA,IAAG,OAAO;AAAA,EACvB,MAAM,OAAQ,OAAS,IAAI,OAAS;AAAA,EACpC,QACG,QAAQ,MAAM,SAAoB,WAClC,QAAQ,SAAoB;AAAA;AAWzB,SAAS,YAAY,CAC3B,SACA,SAC4B;AAAA,EAC5B,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAAG;AAAA,IACpD,MAAM,QACL,qFACD;AAAA,EACD;AAAA,EACA,MAAM,WAAW,QAAQ,IAAI,CAAC,UAAmB;AAAA,IAChD,MAAM,UAAU,UAAU,KAAK;AAAA,IAC/B,IAAI,OAAO,YAAY,UAAU;AAAA,MAChC,MAAM,QAAQ,0BAA0B,SAAS;AAAA,IAClD;AAAA,IACA,OAAO;AAAA,GACP;AAAA,EACD,OAAO,CAAC,SAAS;AAAA,IAChB,MAAM,UAAU,aAAa,IAAI;AAAA,IACjC,OACC,YAAY,aACZ,SAAS,KAAK,CAAC,YAAY,SAAS,SAAS,OAAO,CAAC;AAAA;AAAA;;;AClDxD,IAAM,oBAAoB,KAAK,MAAM,aAAgB,IAAI;AAEzD,IAAM,WAAU,CAAC,YAChB,IAAI,WAAU,kBAAkB,uBAAuB,SAAS;AAEjE,SAAS,QAAQ,CAChB,MACA,OACA,UACS;AAAA,EACT,IAAI,UAAU;AAAA,IAAW,OAAO;AAAA,EAChC,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAAA,IAC9C,MAAM,SAAQ,GAAG,wCAAwC,OAAO;AAAA,EACjE;AAAA,EACA,OAAO;AAAA;AAIR,SAAS,KAAK,CACb,MACA,OACA,UACS;AAAA,EACT,MAAM,UAAU,SAAS,MAAM,OAAO,QAAQ;AAAA,EAC9C,IAAI,UAAU,mBAAmB;AAAA,IAChC,MAAM,SACL,GAAG,wBAAwB,kCAAkC,SAC9D;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,WAAW,CACnB,MACA,OACA,UACS;AAAA,EACT,IAAI,UAAU;AAAA,IAAW,OAAO;AAAA,EAChC,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAAA,IACzC,MAAM,SACL,GAAG,oDAAoD,OACxD;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAIR,SAAS,WAAW,CACnB,OACiD;AAAA,EACjD,IAAI,OAAO,UAAU;AAAA,IAAY,OAAO;AAAA,EACxC,IACC,MAAM,QAAQ,KAAK,KACnB,MAAM,MAAM,CAAC,WAAoB,OAAO,WAAW,QAAQ,GAC1D;AAAA,IACD,MAAM,UAAU,IAAI,IAClB,MAA4B,IAAI,CAAC,WAAW,OAAO,YAAY,CAAC,CAClE;AAAA,IACA,OAAO,CAAC,WAAW,QAAQ,IAAI,MAAM;AAAA,EACtC;AAAA,EACA,MAAM,SAAQ,wDAAwD;AAAA;AAGhE,SAAS,UAAU,CAAC,SAAsC;AAAA,EAChE,IACC,OAAO,QAAQ,aAAa,YAC5B,CAAC,mBAAmB,KAAK,QAAQ,QAAQ,GACxC;AAAA,IACD,MAAM,SAAQ,IAAI,QAAQ,8BAA8B;AAAA,EACzD;AAAA,EACA,IAAI,OAAO,QAAQ,WAAW,YAAY;AAAA,IACzC,MAAM,SAAQ,oDAAoD;AAAA,EACnE;AAAA,EACA,IAAI,QAAQ,eAAe,CAAC,QAAQ,KAAK;AAAA,IACxC,MAAM,SAAQ,sCAAsC;AAAA,EACrD;AAAA,EACA,IAAI,QAAQ,SAAS,gBAAgB,CAAC,QAAQ,cAAc;AAAA,IAC3D,MAAM,SACL,+EACD;AAAA,EACD;AAAA,EACA,IAAI,QAAQ,gBAAgB,CAAC,QAAQ,KAAK;AAAA,IACzC,MAAM,SACL,kFACD;AAAA,EACD;AAAA,EACA,MAAM,UAAU,YAAY,QAAQ,YAAY;AAAA,EAChD,MAAM,UAAU,SAAS,WAAW,QAAQ,SAAS,GAAG;AAAA,EACxD,MAAM,gBAAgB,YAAY,iBAAiB,QAAQ,eAAe,CAAC;AAAA,EAC3E,IAAI,iBAAiB,SAAS;AAAA,IAC7B,MAAM,SACL,kBAAkB,kDAAkD,2DACrE;AAAA,EACD;AAAA,EACA,OAAO;AAAA,IACN;AAAA,IACA,MAAM,QAAQ,QAAQ;AAAA,IACtB,gBAAgB,SACf,kBACA,QAAQ,gBACR,KAAK,OAAO,IACb;AAAA,IACA,eAAe,SAAS,iBAAiB,QAAQ,eAAe,GAAG;AAAA,IACnE,gBAAgB,SAAS,kBAAkB,QAAQ,gBAAgB,IAAI;AAAA,IACvE,yBAAyB,SACxB,2BACA,QAAQ,yBACR,EACD;AAAA,IACA,WAAW,SAAS,aAAa,QAAQ,WAAW,EAAE;AAAA,IACtD;AAAA,IACA,aAAa,MAAM,eAAe,QAAQ,aAAa,EAAE;AAAA,IACzD,kBAAkB,SACjB,oBACA,QAAQ,kBACR,EACD;AAAA,IACA;AAAA,OACI,QAAQ,kBAAkB,YAC3B,CAAC,IACD,EAAE,QAAQ,aAAa,QAAQ,eAAe,SAAS,QAAO,EAAE;AAAA,IACnE,SAAS,CAAC,WAAW,QAAQ,OAAO,YAAY,CAAC;AAAA,EAClD;AAAA;;;AC7IM,MAAM,MAAS;AAAA,EACZ,QAAQ,IAAI;AAAA,EACZ,aAAa,IAAI;AAAA,MAEtB,IAAI,GAAW;AAAA,IAClB,OAAO,KAAK,MAAM;AAAA;AAAA,EAInB,EAAE,CAAC,KAAiC;AAAA,IACnC,OAAO,QAAQ,YAAY,IAAK,KAAK,WAAW,IAAI,GAAG,KAAK;AAAA;AAAA,EAG7D,IAAI,CAAC,YAAe,KAA+B;AAAA,IAClD,KAAK,MAAM,IAAI,YAAY,GAAG;AAAA,IAC9B,IAAI,QAAQ;AAAA,MAAW,KAAK,WAAW,IAAI,KAAK,KAAK,GAAG,GAAG,IAAI,CAAC;AAAA;AAAA,EAGjE,OAAO,CAAC,YAAqB;AAAA,IAC5B,IAAI,CAAC,KAAK,MAAM,IAAI,UAAU;AAAA,MAAG;AAAA,IACjC,MAAM,MAAM,KAAK,MAAM,IAAI,UAAU;AAAA,IACrC,KAAK,MAAM,OAAO,UAAU;AAAA,IAC5B,IAAI,QAAQ;AAAA,MAAW;AAAA,IACvB,MAAM,OAAO,KAAK,GAAG,GAAG,IAAI;AAAA,IAC5B,IAAI,OAAO;AAAA,MAAG,KAAK,WAAW,IAAI,KAAK,IAAI;AAAA,IACtC;AAAA,WAAK,WAAW,OAAO,GAAG;AAAA;AAAA,EAGhC,WAAW,GAAQ;AAAA,IAClB,OAAO,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA;AAE9B;;;ACnCA;AAYA,eAAsB,UAAU,CAC/B,KACA,MACyB;AAAA,EACzB,MAAM,OAAO,OAAO,UACnB,OAAO,UAAU,WACd,QACA,OAAO,KAAK,iBAAiB,aAAa,QAAQ,MAAM,MAAM,MAAM,CAAC;AAAA,EACzE,IAAI;AAAA,IACH,OAAO,oBAAoB;AAAA,MAC1B,KAAK,MAAM,KAAK,IAAI,GAAG;AAAA,MACvB,MAAM,MAAM,KAAK,IAAI,IAAI;AAAA,IAC1B,CAAC;AAAA,IACA,OAAO,OAAO;AAAA,IACf,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACpE,MAAM,KAAK,gDAAgD,UAAU,KAAK;AAAA;AAAA;;;AChB5E,IAAM,aAAa,CAAC,SAAiB,UACpC,IAAI,WAAU,kBAAkB,SAAS,EAAE,MAAM,CAAC;AAGnD,IAAM,UAAU;AAGhB,eAAe,IAAI,CAClB,SACA,WACA,MACA,UACA,SAC0C;AAAA,EAG1C,MAAM,UACL,UAAU,UAAU,QAAQ,MACzB,MAAM,WAAW,QAAQ,KAAK,UAAU,IACxC;AAAA,EAEJ,IAAI,QAAQ,GAAG;AAAA,IACd,MAAM,IAAI,WAAU,WAAW,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,UAAU,UAAU,SAAS,SAAS,UAAU;AAAA,EACtD,OAAO,IAAI,OAAoB;AAAA,IAC9B;AAAA,IACA;AAAA,OACI,UAAU,UAAU,QAAQ,OAAO,CAAC,UACrC,EAAE,KAAK,EAAE,KAAK,QAAQ,IAAI,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,IACxD,CAAC;AAAA,IACJ,QAAQ;AAAA,SACJ,SAAS,UAAU,QAAQ;AAAA,SAC3B,iBAAiB;AAAA,WAChB;AAAA,WACC,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC9B,CAAC;AAAA,IACF;AAAA,EACD,CAAC;AAAA;AAuBK,SAAS,gBAAgB,CAAC,SAAwC;AAAA,EACxE,MAAM,WAAW,WAAW,OAAO;AAAA,EACnC,IAAI;AAAA,EACJ,MAAM,QAAQ,IAAI;AAAA,EAElB,MAAM,cAAc,IAAI;AAAA,EACxB,MAAM,SAAS,QAAQ,gBAAgB;AAAA,EAEvC,IAAI,WAAW;AAAA,EAEf,IAAI,gBAAgB;AAAA,EACpB,OAAO;AAAA,QACF,WAAW,GAAG;AAAA,MACjB,OAAO,MAAM;AAAA;AAAA,SAER,OAAM,GAAG,MAAM,WAAW,aAAa;AAAA,MAC5C,IAAI,YAAY,UAAU;AAAA,QACzB,MAAM,IAAI,WACT,qBACA,WACG,gDAAgD,SAAS,YAAY,SAAS,SAC9E,oDACJ;AAAA,MACD;AAAA,MAEA,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,IAAI;AAAA,QACH,MAAM,QAAQ,MAAM,KACnB,SACA,EAAE,UAAU,OAAO,aAAa,OAAO,GACvC,MACA,UACA,MAAM,aACP;AAAA,QAEA,IAAI,eAAe;AAAA,UAClB,MAAM,KAAK,IAAI;AAAA,UACf,MAAM,IAAI,WAAU,WAAW,OAAO;AAAA,QACvC;AAAA,QACA,WAAW;AAAA,QACX,OAAO,EAAE,MAAM,SAAS,MAAM,UAAU,SAAS,SAAS;AAAA,gBACzD;AAAA,QACD,WAAW;AAAA;AAAA;AAAA,IAGb,IAAI,CAAC,mBAAmB,OAAO;AAAA,MAC9B,IAAI;AAAA,QAAU,gBAAgB;AAAA,MAC9B,UAAU,KAAK,gBAAgB;AAAA,MAC/B,WAAW;AAAA,MACX,IAAI,CAAC;AAAA,QAAkB;AAAA,MAKvB,MAAM,QAAQ,IAAI;AAAA,MAClB,WAAW,UAAU,CAAC,GAAG,WAAW,GAAG;AAAA,QACtC,MAAM,IAAI,OAAO,MAAM,UAAU;AAAA,QACjC,YAAY,OAAO,MAAM;AAAA,QACzB,OAAO,UAAU;AAAA,MAClB;AAAA,MACA,WAAW,cAAc,MAAM,YAAY,GAAG;AAAA,QAC7C,IAAI,CAAC,MAAM,IAAI,UAAU;AAAA,UAAG,WAAW,MAAM;AAAA,MAC9C;AAAA;AAAA,EAEF;AAAA;",
33
- "debugId": "C3E2F4573FDEF0E964756E2164756E21",
32
+ "mappings": "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",
33
+ "debugId": "2DE3A3E5E10EAC4A64756E2164756E21",
34
34
  "names": []
35
35
  }
@@ -1,9 +1,9 @@
1
- import type { SecureContext } from 'node:tls';
2
1
  import type { Socket, SocketHandler } from 'bun';
3
2
  import { Connection } from './connection';
4
3
  import { type SocketState } from './listener';
5
4
  import type { Settings } from './settings';
6
5
  import type { Slots } from './slots';
6
+ import type { TlsHolder } from './tls-context';
7
7
  /**
8
8
  * The listener's own handlers: `open` counts a socket and greets it or
9
9
  * turns it away, `handshake` lets implicit TLS start once encrypted,
@@ -23,7 +23,15 @@ export interface Listening {
23
23
  readonly handshaking: Set<Socket<SocketState>>;
24
24
  /** TLS from the first byte: implicit TLS. */
25
25
  readonly secure: boolean;
26
- readonly proxied?: SecureContext;
26
+ readonly proxied?: TlsHolder;
27
27
  }
28
28
  export declare function listenerHandlers(listening: Listening): Pick<SocketHandler<SocketState>, 'open' | 'handshake' | 'close'>;
29
+ /**
30
+ * Implicit TLS without a proxy: the listener is clear and each socket is
31
+ * upgraded as it opens, with the pair in use then, so a pair `setTls`
32
+ * replaced applies to the next connection and not to the open ones. The
33
+ * encrypted socket has the handlers of a TLS listener's; the clear one
34
+ * only carries the TLS records, which the encrypted one reads.
35
+ */
36
+ export declare function upgradingHandlers(encrypted: SocketHandler<SocketState>, settings: Settings): SocketHandler<SocketState>;
29
37
  //# sourceMappingURL=admission.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../src/server/admission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAY,KAAK,WAAW,EAAyB,MAAM,YAAY,CAAC;AAI/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;CACjC;AAED,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,SAAS,GAClB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,CA0BlE"}
1
+ {"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../src/server/admission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAY,KAAK,WAAW,EAAyB,MAAM,YAAY,CAAC;AAI/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,SAAS,GAClB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,CA0BlE;AA4GD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAChC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,EACrC,QAAQ,EAAE,QAAQ,GAChB,aAAa,CAAC,WAAW,CAAC,CAsB5B"}
@@ -1,4 +1,4 @@
1
- import type { SmtpServerOptions } from './options';
1
+ import type { SmtpServerOptions, TlsOptions } from './options';
2
2
  export interface SmtpServer {
3
3
  /** Starts listening; resolves once the port is bound. Once only: a second call throws. */
4
4
  listen(options: {
@@ -8,6 +8,14 @@ export interface SmtpServer {
8
8
  port: number;
9
9
  hostname: string;
10
10
  }>;
11
+ /**
12
+ * Uses a renewed key and certificate from the next STARTTLS upgrade or
13
+ * implicit TLS connection on; the sessions open keep the TLS they have.
14
+ * The pair is read and checked first: one that cannot be used throws
15
+ * `INVALID_OPTION` and leaves the one in use. Needs a server made with
16
+ * `tls`.
17
+ */
18
+ setTls(tls: TlsOptions): Promise<void>;
11
19
  /** Stops listening; `closeConnections` hangs up on every client too. */
12
20
  stop(closeConnections?: boolean): void;
13
21
  /** Open connections. */
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAgDnD,MAAM,WAAW,UAAU;IAC1B,0FAA0F;IAC1F,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,wEAAwE;IACxE,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,wBAAwB;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAkEvE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiD/D,MAAM,WAAW,UAAU;IAC1B,0FAA0F;IAC1F,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,wEAAwE;IACxE,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,wBAAwB;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CA0EvE"}
@@ -1,4 +1,5 @@
1
1
  import type { SmtpServerOptions } from './options';
2
+ import { TlsHolder } from './tls-context';
2
3
  /** The options with their defaults, checked once. */
3
4
  export interface Settings {
4
5
  readonly options: SmtpServerOptions;
@@ -12,6 +13,8 @@ export interface Settings {
12
13
  readonly hookTimeout: number;
13
14
  readonly handshakeTimeout: number;
14
15
  readonly greetingDelay: number;
16
+ /** The key and certificate in use, which `setTls` replaces; with `options.tls`. */
17
+ readonly tls?: TlsHolder;
15
18
  /** With `proxyProtocol`: whether a peer is a proxy trusted to send a PROXY header. */
16
19
  readonly trusts?: (peer: string) => boolean;
17
20
  isLocal(domain: string): boolean | Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/server/settings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,YAAY,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,sFAAsF;IACtF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAkED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CA4D/D"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/server/settings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,YAAY,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC;IACzB,sFAAsF;IACtF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAkED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CA6D/D"}
@@ -1,16 +1,46 @@
1
1
  import { type SecureContext } from 'node:tls';
2
2
  /** `key` or `cert` as `Bun.listen` takes them: text, bytes or a file. */
3
3
  type TlsMaterial = string | Uint8Array | Bun.BunFile;
4
+ /** A key and certificate pair, as `Bun.listen` takes it. */
5
+ interface TlsPair {
6
+ readonly key: TlsMaterial;
7
+ readonly cert: TlsMaterial;
8
+ }
9
+ /** `tls` read whole, with the `node:tls` context made from it. */
10
+ interface ReadTls {
11
+ readonly key: string | Buffer;
12
+ readonly cert: string | Buffer;
13
+ readonly context: SecureContext;
14
+ }
4
15
  /**
5
16
  * `tls` read whole — a file included — and checked as a `node:tls` context:
6
17
  * what implicit TLS behind a proxy runs on, and, without a proxy, the check
7
18
  * that makes a key or certificate that cannot be read or used fail
8
- * `listen()` the same way. `fail` turns the reason into the package's own
9
- * error, the `node:tls` or file error as its `cause`.
19
+ * `listen()` and `setTls()` the same way. `fail` turns the reason into the
20
+ * package's own error, the `node:tls` or file error as its `cause`.
10
21
  */
11
- export declare function tlsContext(tls: {
12
- readonly key: TlsMaterial;
13
- readonly cert: TlsMaterial;
14
- }, fail: (message: string, cause: unknown) => Error): Promise<SecureContext>;
22
+ export declare function readTls(tls: TlsPair, fail: (message: string, cause: unknown) => Error, caller: string): Promise<ReadTls>;
23
+ /**
24
+ * The key and certificate the server uses now. What `listen()` or `setTls()`
25
+ * read replaces it whole, and only once checked, so a pair that cannot be
26
+ * used leaves the one in use. A STARTTLS server that has read nothing yet
27
+ * serves `tls` as it was given.
28
+ */
29
+ export declare class TlsHolder {
30
+ #private;
31
+ constructor(given: TlsPair);
32
+ /** What an upgrade to TLS, or a native listener, is given. */
33
+ get options(): TlsPair;
34
+ /** The `node:tls` context of the pair in use: only once `load` or `replace` read one. */
35
+ get context(): SecureContext;
36
+ /** Reads and checks the pair given, unless a read already replaced it. */
37
+ load(fail: (message: string, cause: unknown) => Error, caller: string): Promise<SecureContext>;
38
+ /**
39
+ * Checks `tls`, then uses it from the next connection on. Calls apply in
40
+ * the order they were made, however long each read takes; one that fails
41
+ * does not hold the next.
42
+ */
43
+ replace(tls: TlsPair, fail: (message: string, cause: unknown) => Error, caller: string): Promise<void>;
44
+ }
15
45
  export {};
16
46
  //# sourceMappingURL=tls-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tls-context.d.ts","sourceRoot":"","sources":["../../src/server/tls-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAEnE,yEAAyE;AACzE,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC;AAErD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC/B,GAAG,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,EAC9D,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,GAC9C,OAAO,CAAC,aAAa,CAAC,CAcxB"}
1
+ {"version":3,"file":"tls-context.d.ts","sourceRoot":"","sources":["../../src/server/tls-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAEnE,yEAAyE;AACzE,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC;AAErD,4DAA4D;AAC5D,UAAU,OAAO;IAChB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC3B;AAED,kEAAkE;AAClE,UAAU,OAAO;IAChB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC5B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,EAChD,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAED;;;;;GAKG;AACH,qBAAa,SAAS;;gBAMT,KAAK,EAAE,OAAO;IAI1B,8DAA8D;IAC9D,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,yFAAyF;IACzF,IAAI,OAAO,IAAI,aAAa,CAG3B;IAED,0EAA0E;IACpE,IAAI,CACT,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,EAChD,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,CAAC;IAOzB;;;;OAIG;IACH,OAAO,CACN,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,EAChD,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;CAOhB"}
package/docs/guide.md CHANGED
@@ -15,6 +15,7 @@ behaviour.
15
15
  - [Delivering into @bumail/store](#delivering-into-bumailstore)
16
16
  - [Authentication](#authentication)
17
17
  - [TLS](#tls)
18
+ - [Renewing the certificate without a restart](#renewing-the-certificate-without-a-restart)
18
19
  - [Limits](#limits)
19
20
  - [Running behind a TCP proxy](#running-behind-a-tcp-proxy)
20
21
  - [Sending mail: the client](#sending-mail-the-client)
@@ -781,9 +782,10 @@ export interface TlsOptions {
781
782
  }
782
783
  ```
783
784
 
784
- `key` and `cert` are PEM, as `Bun.listen` takes them. Read them once, at
785
+ `key` and `cert` are PEM, as `Bun.listen` takes them. Read them at
785
786
  start-up, with `Bun.file().text()`; a missing file then fails before the
786
- server listens, not at a client's first STARTTLS:
787
+ server listens, not at a client's first STARTTLS. A renewed pair is
788
+ applied with `setTls`, [below](#renewing-the-certificate-without-a-restart):
787
789
 
788
790
  ```ts
789
791
  import { createSmtpServer } from '@bumail/smtp';
@@ -840,10 +842,13 @@ reads them over TLS and `session.secure` is already `true`. A handshake
840
842
  that fails is closed by Bun at once and counted out. A STARTTLS handshake
841
843
  is bounded by the idle `timeout`, the connection already counted.
842
844
 
843
- Bun 1.4.2 calls a TLS listener's `open` only once the handshake completed
844
- unless the listener has a `handshake` handler; with one, `open` comes at
845
- the TCP connection and the socket's timer runs during the handshake. The
846
- server sets one for that reason.
845
+ The listener of an implicit TLS port is a clear one, and each socket is
846
+ upgraded to TLS (`socket.upgradeTLS`) as it opens, with the pair in use
847
+ at that moment: that is what lets `setTls` apply to the next connection
848
+ (see [below](#renewing-the-certificate-without-a-restart)). The upgraded
849
+ socket calls `open` at the TCP connection, with the socket's timer
850
+ running during the handshake, which is how a stuck handshake is counted
851
+ and closed.
847
852
 
848
853
  Behind a TCP proxy that sends the PROXY protocol, implicit TLS starts after
849
854
  the proxy's header, and runs differently: see
@@ -912,6 +917,67 @@ await createSmtpServer(submission).listen({ port: 587 });
912
917
  await createSmtpServer({ ...submission, implicitTls: true }).listen({ port: 465 });
913
918
  ```
914
919
 
920
+ ### Renewing the certificate without a restart
921
+
922
+ A certificate that is renewed — by certbot, by Traefik's dump, by an ACME
923
+ client — should take effect without a restart, and without dropping the
924
+ sessions open. `setTls({ key, cert })` does that:
925
+
926
+ ```ts
927
+ const mx = createSmtpServer({ hostname: 'mx.example.com', localDomains: ['example.com'], tls, onData });
928
+ await mx.listen({ port: 25 });
929
+
930
+ // Later, once the files changed:
931
+ await mx.setTls({
932
+ key: await Bun.file('/etc/ssl/mx.example.com.key').text(),
933
+ cert: await Bun.file('/etc/ssl/mx.example.com.crt').text(),
934
+ });
935
+ ```
936
+
937
+ - **What changes**: the next STARTTLS upgrade, and on implicit TLS the next
938
+ connection, use the new pair. A session already encrypted keeps the TLS
939
+ it has until it ends, and goes on working; a handshake that began
940
+ before the call may still finish on the old pair.
941
+ - **It is checked first.** `setTls` reads both (a `Bun.file` included) and
942
+ makes a TLS context of them, as `listen()` does on implicit TLS. A pair
943
+ that cannot be read, is not PEM or is a key for another certificate
944
+ rejects with an `SmtpError`, `INVALID_OPTION`, message `setTls(): tls:
945
+ { key, cert } cannot be used: …`, the reason as its `cause`; the old
946
+ pair stays in use. It does not check that the certificate has not
947
+ expired or names the host: that is the caller's.
948
+ - **One call per server.** The MX on 25, submission on 587 and the
949
+ implicit TLS server on 465 are three servers, each with its own
950
+ `setTls`. Call it on all of them with the same pair.
951
+ - **Calls apply in order.** Two `setTls` in flight, the first reading
952
+ files, end on the second's pair: the later call wins. A key or
953
+ certificate that is empty is refused like any pair that cannot be used.
954
+ - **Before `listen()` too**: the pair set is the one served. A server made
955
+ without `tls` has none to replace: `setTls` rejects with
956
+ `INVALID_OPTION`.
957
+ - **A file read at `setTls`, not at each connection.** Passing a
958
+ `Bun.file` reads it once, when `setTls` runs: to take a later change,
959
+ call `setTls` again.
960
+
961
+ How it works on each kind of port, measured on Bun 1.4.2:
962
+
963
+ - **STARTTLS**: the options of `socket.upgradeTLS` are read for each
964
+ upgrade, so the server swaps the pair it keeps.
965
+ - **Native implicit TLS**: a `Bun.listen` TLS listener keeps the TLS
966
+ context it was created with. `listener.reload()` takes handlers only,
967
+ and a `tls` given to it is ignored (a new connection still got the old
968
+ certificate). The port listens in clear instead, and every socket is
969
+ upgraded with `socket.upgradeTLS` as it opens, with the pair in use
970
+ then, which is the STARTTLS mechanism from the first byte. The
971
+ encrypted bytes also pass through the clear socket's handler, which
972
+ drops them.
973
+ - **Implicit TLS behind `proxyProtocol`** already runs on `node:tls`: the
974
+ server swaps the secure context its new sockets are given.
975
+ - **A second listener on the same port** was not used: `Bun.listen` takes
976
+ `reusePort`, so a new listener could bind beside the old one and the old
977
+ one stop, but both must have opted in from the start, and a
978
+ connection waiting to be accepted by the old one when it stops is reset.
979
+ Upgrading in `open` has neither cost.
980
+
915
981
  ## Limits
916
982
 
917
983
  | Limit | Default | Past it |
package/docs/roadmap.md CHANGED
@@ -34,6 +34,12 @@ Nothing in progress.
34
34
 
35
35
  ### Unreleased — merged, not yet published
36
36
 
37
+ - **A renewed certificate without a restart**, `server.setTls({ key, cert
38
+ })`: the next STARTTLS upgrade and the next implicit TLS connection use
39
+ it, the sessions open keep their TLS, and a pair that cannot be used
40
+ throws `INVALID_OPTION` and leaves the old one. Implicit TLS without a
41
+ proxy now listens in clear and upgrades each socket as it opens, since
42
+ a native Bun TLS listener cannot swap its certificate.
37
43
  - **Behind a TCP proxy, the client's own address**, with `proxyProtocol:
38
44
  { trusted: [...] }`: the server reads the PROXY protocol, versions 1 and
39
45
  2, from the proxies listed — a Traefik TCP router, HAProxy — so
@@ -32,6 +32,8 @@ A reply carries its enhanced status code (`5.7.1`, RFC 3463) only after
32
32
  - [`SmtpError: listen(): the server is already listening on …`](#smtperror-listen-the-server-is-already-listening-on-)
33
33
  - [`SmtpError: listen(): the server is already starting to listen`](#smtperror-listen-the-server-is-already-starting-to-listen)
34
34
  - [`SmtpError: listen(): tls: { key, cert } cannot be used: …`](#smtperror-listen-tls--key-cert--cannot-be-used-)
35
+ - [`SmtpError: setTls(): tls: { key, cert } cannot be used: …`](#smtperror-settls-tls--key-cert--cannot-be-used-)
36
+ - [`SmtpError: setTls(): the server was made without tls, so it has none to replace`](#smtperror-settls-the-server-was-made-without-tls-so-it-has-none-to-replace)
35
37
  - [`SmtpError: listen(): stop() was called before the server bound its port`](#smtperror-listen-stop-was-called-before-the-server-bound-its-port)
36
38
 
37
39
  **Relaying and authentication**
@@ -625,6 +627,50 @@ try {
625
627
  }
626
628
  ```
627
629
 
630
+ ### `SmtpError: setTls(): tls: { key, cert } cannot be used: …`
631
+
632
+ **When**: `setTls` was given a renewed pair whose `key` or `cert` cannot
633
+ be read — a `Bun.file` that does not exist, or one caught half-written —
634
+ or is empty (`… the key is empty`, `… the cert is empty`), or is not a
635
+ PEM key or certificate, or a key that is not the certificate's. Its `code` is `INVALID_OPTION`; the rest of the message,
636
+ and its `cause`, are the reason from the file system or `node:tls`
637
+ (`ENOENT: no such file or directory, open '…'`, `…PEM routines…`,
638
+ `key values mismatch`). The pair in use stays, for new connections too.
639
+
640
+ **Why**: `setTls` reads both and checks them as a TLS context before it
641
+ swaps anything, so a bad pair never reaches a client.
642
+
643
+ **Fix**: write both files before calling it — a renewal that writes the key
644
+ first and the certificate after fails here, which is the right answer —
645
+ and retry:
646
+
647
+ ```ts
648
+ try {
649
+ await server.setTls({
650
+ key: Bun.file('/etc/bumail/tls/privkey.pem'),
651
+ cert: Bun.file('/etc/bumail/tls/fullchain.pem'),
652
+ });
653
+ } catch (error) {
654
+ console.error(error, (error as Error).cause); // the old pair is still served
655
+ }
656
+ ```
657
+
658
+ ### `SmtpError: setTls(): the server was made without tls, so it has none to replace`
659
+
660
+ **When**: `setTls` on a server created without the `tls` option. Its `code`
661
+ is `INVALID_OPTION`.
662
+
663
+ **Why**: TLS is what turns on STARTTLS, AUTH and implicit TLS, and each
664
+ changes what the server says: `setTls` replaces a pair, it does not turn
665
+ TLS on.
666
+
667
+ **Fix**: create the server with `tls`, the pair it starts with:
668
+
669
+ ```ts
670
+ const server = createSmtpServer({ ...options, tls: { key, cert } });
671
+ await server.setTls({ key: renewedKey, cert: renewedCert });
672
+ ```
673
+
628
674
  ## Relaying and authentication
629
675
 
630
676
  ### `554 5.7.1 Relay access denied`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bumail/smtp",
3
- "version": "0.5.0",
3
+ "version": "0.6.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",