@bumail/queue 0.9.0 → 0.10.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
@@ -113,7 +113,8 @@ list, only those events. Upgrading a shared store: stop every old worker
113
113
  before starting a new one (an old worker that keeps running ignores the
114
114
  DSN parameters and drops them from the items it completes). `SUCCESS` with a next hop that does not offer DSN
115
115
  sends a `relayed` DSN. For a message the application delivered itself,
116
- `deliveredDsn()` writes the `delivered` one.
116
+ `deliveredDsn()` writes the `delivered` one, and `failedDsn()` the `failed`
117
+ one for a recipient it could not deliver.
117
118
 
118
119
  ## Routing
119
120
 
@@ -321,6 +322,7 @@ control character in it.
321
322
  | `QueueOptions` (`route`, `routes`, `fallback`), `Route`, `Smarthost`, `RetrySchedule`, `DsnOptions`, `QueueLimits`, `Clock`, `Sender` | what `createQueue` takes |
322
323
  | `MessageSource`, `QueueEnvelope` (`ret`, `envid`, `recipients`), `RecipientDsn`, `RecipientNotify`, `NotifyEvent`, `OriginalRecipient`, `RetMode` | what `enqueue` takes, with the DSN parameters |
323
324
  | `deliveredDsn(input)`, `DeliveredDsnInput`, `DeliveredRecipient` | the `delivered` DSN for a local delivery: the bytes to enqueue, or `undefined` when no recipient asked for `SUCCESS` |
325
+ | `failedDsn(input)`, `FailedDsnInput`, `FailedRecipient`, `DEFAULT_MAX_RETURN` | the `failed` DSN for a recipient the application could not deliver locally: the bytes to enqueue, or `undefined` for a null reverse-path or when no recipient asked for failures; `DEFAULT_MAX_RETURN` is the 64 KiB a DSN returns of the original by default |
324
326
  | `QueueEvents`, `QueueListener`, `RecipientEvent` (`route`, `fallback`, `mxReply`, `mayHaveReachedMx`, `mayHaveReachedFallback`), `DeferredEvent`, `DsnEvent`, `QueueErrorEvent` | the events |
325
327
  | `QueueStore` | the contract a store answers: `add`, `get`, `list`, `count`, `readMessage`, `claim`, `renew`, `complete`, `reschedule`, `cancel` |
326
328
  | `QueueItem`, `RecipientState`, `RecipientStatus`, `FinalStatus`, `Diagnostic`, `Lease` | an item, and where each recipient stands |
@@ -53,6 +53,17 @@ function xtextLength(text) {
53
53
  }
54
54
  return length;
55
55
  }
56
+ function utf8OrcptLength(text) {
57
+ let length = 0;
58
+ for (const char of text) {
59
+ const code = char.codePointAt(0);
60
+ if (code > 127)
61
+ length += new TextEncoder().encode(char).length;
62
+ else
63
+ length += code >= 33 && code !== 92 && code !== 43 && code !== 61 && code < 127 ? 1 : 6;
64
+ }
65
+ return length;
66
+ }
56
67
  function checkRecipientDsn(entry, to) {
57
68
  const { address, notify, orcpt } = entry ?? {};
58
69
  if (typeof address !== "string" || !to.includes(address)) {
@@ -69,7 +80,8 @@ function checkRecipientDsn(entry, to) {
69
80
  if (typeof orcpt !== "object" || orcpt === null || typeof orcpt.type !== "string" || !/^[A-Za-z0-9-]+$/.test(orcpt.type) || typeof orcpt.address !== "string" || orcpt.address === "") {
70
81
  throw invalid(`orcpt of ${address} must be { type, address }`);
71
82
  }
72
- if (orcpt.type.length + 1 + xtextLength(orcpt.address) > 500) {
83
+ const encoded = orcpt.type.toLowerCase() === "utf-8" ? utf8OrcptLength(orcpt.address) : xtextLength(orcpt.address);
84
+ if (orcpt.type.length + 1 + encoded > 500) {
73
85
  throw invalid(`orcpt of ${address} is over 500 characters once encoded`);
74
86
  }
75
87
  checkStorable("orcpt.type", orcpt.type);
@@ -257,5 +269,5 @@ var claimable = (item, now) => item.nextAttemptAt <= now && (item.lease === unde
257
269
 
258
270
  export { hasControl, replaceControls, cleanText, isStorable, asciiText, QueueError2, invalid, checkTime, checkOwner, checkNewItem, checkMaxItems, checkClaim, checkResult, checkList, isDone, applyAttempt, newItem, claimable };
259
271
 
260
- //# debugId=C41FD2A676DEB7AF64756E2164756E21
261
- //# sourceMappingURL=index-9yp15arf.js.map
272
+ //# debugId=6F0F13A4EBC138E164756E2164756E21
273
+ //# sourceMappingURL=index-sz13a17b.js.map
@@ -5,10 +5,10 @@
5
5
  "/** Text from the other side, made safe to keep and to write in a header field. */\n\n/** C0, DEL and C1: every control character, CR, LF and TAB included. */\nconst isControl = (code: number) =>\n\tcode < 0x20 || (code >= 0x7f && code <= 0x9f);\n\n/** Whether the text holds a control character. */\nexport function hasControl(text: string): boolean {\n\tfor (let i = 0; i < text.length; i++) {\n\t\tif (isControl(text.charCodeAt(i))) return true;\n\t}\n\treturn false;\n}\n\n/** Each control character replaced by `by`. */\nexport function replaceControls(text: string, by: string): string {\n\tlet out = '';\n\tfor (let i = 0; i < text.length; i++) {\n\t\tout += isControl(text.charCodeAt(i)) ? by : (text[i] as string);\n\t}\n\treturn out;\n}\n\n/**\n * Every control character (CR and LF included) as a space, a lone\n * surrogate as U+FFFD, runs of space as one, cut at `max` characters with\n * `...`, never inside a surrogate pair: what a reply leaves in an item,\n * an event and a DSN.\n */\nexport function cleanText(text: string, max: number): string {\n\tconst clean = replaceControls(text.toWellFormed(), ' ')\n\t\t.replace(/ {2,}/g, ' ')\n\t\t.trim();\n\treturn clean.length > max ? `${cut(clean, max - 3)}...` : clean;\n}\n\n/**\n * The first `length` UTF-16 units, never ending inside a surrogate pair:\n * a lone surrogate is text no store can keep (PostgreSQL's `jsonb` refuses\n * it), nor any UTF-8 encode.\n */\nfunction cut(text: string, length: number): string {\n\tconst head = text.slice(0, length);\n\tconst last = head.charCodeAt(head.length - 1);\n\treturn last >= 0xd800 && last <= 0xdbff ? head.slice(0, -1) : head;\n}\n\n/**\n * Text every store can keep: no NUL (PostgreSQL's `text` and `jsonb` hold\n * none) and no lone surrogate. `cleanText`'s output always is.\n */\nexport const isStorable = (text: string): boolean =>\n\ttext.isWellFormed() && !text.includes('\\0');\n\n/** `cleanText`, then anything not printable ASCII as `?`: for a `message/delivery-status` field. */\nexport const asciiText = (text: string, max: number): string =>\n\tcleanText(text, max).replace(/[^ -~]/g, '?');\n",
6
6
  "/**\n * Why the queue or a store refused a call. `INVALID`: an option or an\n * argument it cannot take. `MESSAGE_TOO_BIG`, `TOO_MANY_RECIPIENTS` and\n * `QUEUE_FULL`: a limit `enqueue` enforces. `CLOSED`: a store used after\n * `close()`. `LEASE_LOST`: given to the `error` event when another worker\n * took an item before its outcome was recorded — or, once the lease's\n * expiry passed, when the item is gone: lost or cancelled.\n * `MESSAGE_UNREADABLE`: given to the `error` event when the store holds an\n * item but not its message, whose pending recipients then fail.\n */\nexport type QueueErrorCode =\n\t| 'INVALID'\n\t| 'MESSAGE_TOO_BIG'\n\t| 'TOO_MANY_RECIPIENTS'\n\t| 'QUEUE_FULL'\n\t| 'CLOSED'\n\t| 'LEASE_LOST'\n\t| 'MESSAGE_UNREADABLE';\n\n/** Thrown by the queue and by every store, whichever answers the contract, with the same codes. */\nexport class QueueError extends Error {\n\toverride readonly name = 'QueueError';\n\treadonly code: QueueErrorCode;\n\n\tconstructor(code: QueueErrorCode, message: string) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n}\n\n/** `INVALID`, for an option or an argument. */\nexport const invalid = (message: string) => new QueueError('INVALID', message);\n",
7
7
  "import { invalid } from '../errors';\nimport { isStorable } from '../text';\n\n/**\n * Text a store keeps: refused, the same way by every store, when it holds\n * a NUL or a lone surrogate, which PostgreSQL cannot keep and no UTF-8\n * encode can carry.\n */\nexport function checkStorable(name: string, text: string): void {\n\tif (!isStorable(text)) {\n\t\tthrow invalid(\n\t\t\t`${name} holds a NUL or a lone surrogate, which a store cannot keep`,\n\t\t);\n\t}\n}\n",
8
- "// The value rules repeat packages/smtp/src/server/dsn-params.ts, packages/smtp/src/client/dsn.ts and\n// packages/jmap/src/submission/dsn.ts (AGENTS.md, Deliberate duplications); this copy guards the contract.\nimport { invalid } from '../errors';\nimport { checkStorable } from './storable';\nimport type { NewQueueItem, RecipientDsn } from './types';\n\nconst EVENTS: readonly unknown[] = ['SUCCESS', 'FAILURE', 'DELAY'];\n\n/**\n * The length the xtext of `text` takes on the wire (RFC 3461 §4): one\n * character for each byte of its UTF-8 form in `!` to `~` but `+` and `=`,\n * three for any other.\n */\nfunction xtextLength(text: string): number {\n\tlet length = 0;\n\tfor (const byte of new TextEncoder().encode(text)) {\n\t\tlength +=\n\t\t\tbyte >= 33 && byte <= 126 && byte !== 0x2b && byte !== 0x3d ? 1 : 3;\n\t}\n\treturn length;\n}\n\n/** One recipient's `NOTIFY` (RFC 3461 §4.1) and `ORCPT` (§4.2). */\nfunction checkRecipientDsn(entry: RecipientDsn, to: readonly string[]): void {\n\tconst { address, notify, orcpt } = entry ?? {};\n\tif (typeof address !== 'string' || !to.includes(address)) {\n\t\tthrow invalid(\n\t\t\t`recipients names ${JSON.stringify(address)}, which is not in to`,\n\t\t);\n\t}\n\tif (notify !== undefined && notify !== 'NEVER') {\n\t\tconst events: readonly unknown[] = Array.isArray(notify) ? notify : [];\n\t\tif (\n\t\t\tevents.length === 0 ||\n\t\t\tevents.some((e, i) => !EVENTS.includes(e) || events.indexOf(e) !== i)\n\t\t) {\n\t\t\tthrow invalid(\n\t\t\t\t`notify of ${address} must be 'NEVER' or a list of 'SUCCESS', 'FAILURE', 'DELAY', each once`,\n\t\t\t);\n\t\t}\n\t}\n\tif (orcpt === undefined) return;\n\tif (\n\t\ttypeof orcpt !== 'object' ||\n\t\torcpt === null ||\n\t\ttypeof orcpt.type !== 'string' ||\n\t\t!/^[A-Za-z0-9-]+$/.test(orcpt.type) ||\n\t\ttypeof orcpt.address !== 'string' ||\n\t\torcpt.address === ''\n\t) {\n\t\tthrow invalid(`orcpt of ${address} must be { type, address }`);\n\t}\n\t// RFC 3461 §4.2: \"The entire ORCPT parameter MAY be up to 500 characters in length\", as sent.\n\tif (orcpt.type.length + 1 + xtextLength(orcpt.address) > 500) {\n\t\tthrow invalid(`orcpt of ${address} is over 500 characters once encoded`);\n\t}\n\tcheckStorable('orcpt.type', orcpt.type);\n\tcheckStorable('orcpt.address', orcpt.address);\n}\n\n/** `ret`, `envid` and `recipients` of a new item. */\nexport function checkDsnParams(item: NewQueueItem): void {\n\tconst { ret, envid, recipients } = item;\n\tif (ret !== undefined && ret !== 'FULL' && ret !== 'HDRS') {\n\t\tthrow invalid(`ret must be 'FULL' or 'HDRS', not ${String(ret)}`);\n\t}\n\tif (\n\t\tenvid !== undefined &&\n\t\t(typeof envid !== 'string' ||\n\t\t\t!/^[ -~]{1,100}$/.test(envid) ||\n\t\t\t// RFC 3461 §4.4: \"The ENVID parameter MAY be up to 100 characters in length\", as sent.\n\t\t\txtextLength(envid) > 100)\n\t) {\n\t\tthrow invalid(\n\t\t\t'envid must be 1 to 100 printable ASCII characters, at most 100 once encoded as xtext',\n\t\t);\n\t}\n\tif (recipients === undefined) return;\n\tif (!Array.isArray(recipients)) {\n\t\tthrow invalid('recipients must be an array of { address, notify, orcpt }');\n\t}\n\tconst seen = new Set<string>();\n\tfor (const entry of recipients) {\n\t\tcheckRecipientDsn(entry, item.to);\n\t\tif (seen.has(entry.address)) {\n\t\t\tthrow invalid(`recipients names ${entry.address} twice`);\n\t\t}\n\t\tseen.add(entry.address);\n\t}\n}\n",
8
+ "// The value rules (and utf8OrcptLength, RFC 6533) repeat packages/smtp/src/server/dsn-params.ts, packages/smtp/src/client/dsn.ts and\n// packages/jmap/src/submission/dsn.ts (AGENTS.md, Deliberate duplications); this copy guards the contract.\nimport { invalid } from '../errors';\nimport { checkStorable } from './storable';\nimport type { NewQueueItem, RecipientDsn } from './types';\n\nconst EVENTS: readonly unknown[] = ['SUCCESS', 'FAILURE', 'DELAY'];\n\n/**\n * The length the xtext of `text` takes on the wire (RFC 3461 §4): one\n * character for each byte of its UTF-8 form in `!` to `~` but `+` and `=`,\n * three for any other.\n */\nfunction xtextLength(text: string): number {\n\tlet length = 0;\n\tfor (const byte of new TextEncoder().encode(text)) {\n\t\tlength +=\n\t\t\tbyte >= 33 && byte <= 126 && byte !== 0x2b && byte !== 0x3d ? 1 : 3;\n\t}\n\treturn length;\n}\n\n/**\n * The length of a `utf-8` ORCPT address in its `utf-8-addr-unitext` form (RFC\n * 6533 §3), the shortest one: raw UTF-8 octets for a non-ASCII character, one\n * for printable ASCII but `\\`, `+` and `=`, and `\\x{HH}` (6) for the rest.\n * The SMTP server counts the value as sent, which is this for a unitext one.\n */\nfunction utf8OrcptLength(text: string): number {\n\tlet length = 0;\n\tfor (const char of text) {\n\t\tconst code = char.codePointAt(0) as number;\n\t\tif (code > 0x7f) length += new TextEncoder().encode(char).length;\n\t\telse\n\t\t\tlength +=\n\t\t\t\tcode >= 0x21 &&\n\t\t\t\tcode !== 0x5c &&\n\t\t\t\tcode !== 0x2b &&\n\t\t\t\tcode !== 0x3d &&\n\t\t\t\tcode < 0x7f\n\t\t\t\t\t? 1\n\t\t\t\t\t: 6;\n\t}\n\treturn length;\n}\n\n/** One recipient's `NOTIFY` (RFC 3461 §4.1) and `ORCPT` (§4.2). */\nfunction checkRecipientDsn(entry: RecipientDsn, to: readonly string[]): void {\n\tconst { address, notify, orcpt } = entry ?? {};\n\tif (typeof address !== 'string' || !to.includes(address)) {\n\t\tthrow invalid(\n\t\t\t`recipients names ${JSON.stringify(address)}, which is not in to`,\n\t\t);\n\t}\n\tif (notify !== undefined && notify !== 'NEVER') {\n\t\tconst events: readonly unknown[] = Array.isArray(notify) ? notify : [];\n\t\tif (\n\t\t\tevents.length === 0 ||\n\t\t\tevents.some((e, i) => !EVENTS.includes(e) || events.indexOf(e) !== i)\n\t\t) {\n\t\t\tthrow invalid(\n\t\t\t\t`notify of ${address} must be 'NEVER' or a list of 'SUCCESS', 'FAILURE', 'DELAY', each once`,\n\t\t\t);\n\t\t}\n\t}\n\tif (orcpt === undefined) return;\n\tif (\n\t\ttypeof orcpt !== 'object' ||\n\t\torcpt === null ||\n\t\ttypeof orcpt.type !== 'string' ||\n\t\t!/^[A-Za-z0-9-]+$/.test(orcpt.type) ||\n\t\ttypeof orcpt.address !== 'string' ||\n\t\torcpt.address === ''\n\t) {\n\t\tthrow invalid(`orcpt of ${address} must be { type, address }`);\n\t}\n\t// RFC 3461 §4.2: \"The entire ORCPT parameter MAY be up to 500 characters in length\", as sent.\n\tconst encoded =\n\t\torcpt.type.toLowerCase() === 'utf-8'\n\t\t\t? utf8OrcptLength(orcpt.address)\n\t\t\t: xtextLength(orcpt.address);\n\tif (orcpt.type.length + 1 + encoded > 500) {\n\t\tthrow invalid(`orcpt of ${address} is over 500 characters once encoded`);\n\t}\n\tcheckStorable('orcpt.type', orcpt.type);\n\tcheckStorable('orcpt.address', orcpt.address);\n}\n\n/** `ret`, `envid` and `recipients` of a new item. */\nexport function checkDsnParams(item: NewQueueItem): void {\n\tconst { ret, envid, recipients } = item;\n\tif (ret !== undefined && ret !== 'FULL' && ret !== 'HDRS') {\n\t\tthrow invalid(`ret must be 'FULL' or 'HDRS', not ${String(ret)}`);\n\t}\n\tif (\n\t\tenvid !== undefined &&\n\t\t(typeof envid !== 'string' ||\n\t\t\t!/^[ -~]{1,100}$/.test(envid) ||\n\t\t\t// RFC 3461 §4.4: \"The ENVID parameter MAY be up to 100 characters in length\", as sent.\n\t\t\txtextLength(envid) > 100)\n\t) {\n\t\tthrow invalid(\n\t\t\t'envid must be 1 to 100 printable ASCII characters, at most 100 once encoded as xtext',\n\t\t);\n\t}\n\tif (recipients === undefined) return;\n\tif (!Array.isArray(recipients)) {\n\t\tthrow invalid('recipients must be an array of { address, notify, orcpt }');\n\t}\n\tconst seen = new Set<string>();\n\tfor (const entry of recipients) {\n\t\tcheckRecipientDsn(entry, item.to);\n\t\tif (seen.has(entry.address)) {\n\t\t\tthrow invalid(`recipients names ${entry.address} twice`);\n\t\t}\n\t\tseen.add(entry.address);\n\t}\n}\n",
9
9
  "import { invalid } from '../errors';\nimport { checkDsnParams } from './dsn-checks';\nimport { checkStorable } from './storable';\n\nexport { checkStorable };\n\nimport type {\n\tAttemptResult,\n\tClaimRequest,\n\tDiagnostic,\n\tNewQueueItem,\n\tQueueItem,\n\tQueueListOptions,\n\tRecipientState,\n\tRecipientUpdate,\n} from './types';\n\n/** What every store checks the same way, so each refuses the same input with the same error. */\n\nconst isTime = (value: unknown): value is number =>\n\ttypeof value === 'number' && Number.isFinite(value);\n\n/** A time in milliseconds since the epoch, or `INVALID` naming it. */\nexport function checkTime(name: string, value: unknown): number {\n\tif (!isTime(value)) throw invalid(`${name} must be a finite number`);\n\treturn value;\n}\n\n/** A lease owner: a non-empty string. */\nexport function checkOwner(owner: unknown): string {\n\tif (typeof owner !== 'string' || owner === '') {\n\t\tthrow invalid('owner must be a non-empty string');\n\t}\n\tcheckStorable('owner', owner);\n\treturn owner;\n}\n\n/** Every text of a recipient's outcome. */\nfunction checkUpdate(update: RecipientUpdate): void {\n\tcheckStorable('A recipient', update.address);\n\tfor (const key of ['mayHaveReachedMx', 'mayHaveReachedFallback'] as const) {\n\t\tconst mark = update[key] as unknown;\n\t\tif (mark !== undefined && mark !== true) {\n\t\t\tthrow invalid(`${key} must be true or absent`);\n\t\t}\n\t}\n\tconst reply = update.reply as Partial<Diagnostic> | undefined;\n\tif (reply === undefined) return;\n\tif (\n\t\ttypeof reply !== 'object' ||\n\t\treply === null ||\n\t\ttypeof reply.text !== 'string'\n\t) {\n\t\tthrow invalid('A reply is an object with a text');\n\t}\n\tcheckStorable('reply.text', reply.text);\n\tfor (const name of ['status', 'host'] as const) {\n\t\tconst value = reply[name];\n\t\tif (value === undefined) continue;\n\t\tif (typeof value !== 'string')\n\t\t\tthrow invalid(`reply.${name} must be a string`);\n\t\tcheckStorable(`reply.${name}`, value);\n\t}\n}\n\nexport function checkNewItem(item: NewQueueItem): void {\n\tif (typeof item !== 'object' || item === null) {\n\t\tthrow invalid('A new item is an object');\n\t}\n\tif (typeof item.from !== 'string') throw invalid('from must be a string');\n\tcheckStorable('from', item.from);\n\tconst to = item.to as unknown;\n\tif (\n\t\t!Array.isArray(to) ||\n\t\tto.length === 0 ||\n\t\t!to.every((a) => typeof a === 'string' && a !== '')\n\t) {\n\t\tthrow invalid('to must be a non-empty array of addresses');\n\t}\n\tfor (const address of to as string[]) checkStorable('A recipient', address);\n\tif (!(item.message instanceof Uint8Array)) {\n\t\tthrow invalid('message must be a Uint8Array');\n\t}\n\tcheckTime('createdAt', item.createdAt);\n\tcheckDsnParams(item);\n}\n\n/** `maxItems`: a positive integer, or nothing. */\nexport function checkMaxItems(max: unknown): number | undefined {\n\tif (max === undefined) return undefined;\n\tif (typeof max !== 'number' || !Number.isInteger(max) || max < 1) {\n\t\tthrow invalid(`maxItems must be an integer of at least 1, not ${max}`);\n\t}\n\treturn max;\n}\n\nexport function checkClaim(request: ClaimRequest): void {\n\tif (typeof request !== 'object' || request === null) {\n\t\tthrow invalid('A claim is an object');\n\t}\n\tcheckOwner(request.owner);\n\tcheckTime('now', request.now);\n\tif (!isTime(request.leaseMs) || request.leaseMs <= 0) {\n\t\tthrow invalid('leaseMs must be a positive number');\n\t}\n}\n\nexport function checkResult(result: AttemptResult): void {\n\tif (typeof result !== 'object' || result === null) {\n\t\tthrow invalid('An attempt result is an object');\n\t}\n\tcheckTime('now', result.now);\n\tcheckTime('nextAttemptAt', result.nextAttemptAt);\n\tif (!Number.isInteger(result.attempts) || result.attempts < 0) {\n\t\tthrow invalid('attempts must be an integer of at least 0');\n\t}\n\tif (typeof result.delayNotified !== 'boolean') {\n\t\tthrow invalid('delayNotified must be true or false');\n\t}\n\tconst statuses = ['delivered', 'deferred', 'failed'];\n\tif (\n\t\t!Array.isArray(result.recipients) ||\n\t\t!result.recipients.every(\n\t\t\t(u) => typeof u?.address === 'string' && statuses.includes(u.status),\n\t\t)\n\t) {\n\t\tthrow invalid(\n\t\t\t'recipients must be an array of { address, status: delivered, deferred or failed }',\n\t\t);\n\t}\n\tfor (const update of result.recipients) checkUpdate(update);\n}\n\n/** The offset and limit of a list: integers, the limit 1 to 1000. */\nexport function checkList(options: QueueListOptions = {}): {\n\toffset: number;\n\tlimit: number;\n} {\n\tconst offset = options.offset ?? 0;\n\tconst limit = options.limit ?? 100;\n\tif (!Number.isInteger(offset) || offset < 0) {\n\t\tthrow invalid(`offset must be an integer of at least 0, not ${offset}`);\n\t}\n\tif (!Number.isInteger(limit) || limit < 1 || limit > 1000) {\n\t\tthrow invalid(`limit must be an integer from 1 to 1000, not ${limit}`);\n\t}\n\treturn { offset, limit };\n}\n\n/** Every recipient is `delivered` or `failed`. */\nexport const isDone = (item: Pick<QueueItem, 'recipients'>): boolean =>\n\titem.recipients.every(\n\t\t(r) => r.status === 'delivered' || r.status === 'failed',\n\t);\n\n/**\n * The item once an attempt is recorded: its recipients' outcomes, a final\n * state never changed again, the schedule, and no lease.\n */\nexport function applyAttempt(\n\titem: QueueItem,\n\tresult: AttemptResult,\n): QueueItem {\n\tconst updates = new Map(result.recipients.map((u) => [u.address, u]));\n\tconst recipients = item.recipients.map((r): RecipientState => {\n\t\tconst update = updates.get(r.address);\n\t\tif (!update || r.status === 'delivered' || r.status === 'failed') return r;\n\t\treturn {\n\t\t\taddress: r.address,\n\t\t\tstatus: update.status,\n\t\t\t...(r.notify === undefined ? {} : { notify: r.notify }),\n\t\t\t...(r.orcpt === undefined ? {} : { orcpt: r.orcpt }),\n\t\t\t...(update.reply ? { reply: update.reply } : {}),\n\t\t\tupdatedAt: result.now,\n\t\t\t...(r.mayHaveReachedMx || update.mayHaveReachedMx\n\t\t\t\t? { mayHaveReachedMx: true as const }\n\t\t\t\t: {}),\n\t\t\t...(r.mayHaveReachedFallback || update.mayHaveReachedFallback\n\t\t\t\t? { mayHaveReachedFallback: true as const }\n\t\t\t\t: {}),\n\t\t};\n\t});\n\tconst { lease: _, ...rest } = item;\n\treturn {\n\t\t...rest,\n\t\trecipients,\n\t\tnextAttemptAt: result.nextAttemptAt,\n\t\tattempts: result.attempts,\n\t\tdelayNotified: result.delayNotified,\n\t};\n}\n\n/** A new item as a store first keeps it. */\nexport function newItem(id: string, item: NewQueueItem): QueueItem {\n\tconst dsn = new Map(item.recipients?.map((r) => [r.address, r]));\n\treturn {\n\t\tid,\n\t\tfrom: item.from,\n\t\trecipients: item.to.map((address): RecipientState => {\n\t\t\tconst { notify, orcpt } = dsn.get(address) ?? {};\n\t\t\treturn {\n\t\t\t\taddress,\n\t\t\t\tstatus: 'pending',\n\t\t\t\t...(notify === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { notify: notify === 'NEVER' ? notify : [...notify] }),\n\t\t\t\t...(orcpt === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { orcpt: { type: orcpt.type, address: orcpt.address } }),\n\t\t\t};\n\t\t}),\n\t\tsize: item.message.length,\n\t\tcreatedAt: item.createdAt,\n\t\tnextAttemptAt: item.createdAt,\n\t\tattempts: 0,\n\t\tdelayNotified: false,\n\t\t...(item.ret === undefined ? {} : { ret: item.ret }),\n\t\t...(item.envid === undefined ? {} : { envid: item.envid }),\n\t};\n}\n\n/** Whether a lease, if any, leaves the item free to claim at `now`. */\nexport const claimable = (item: QueueItem, now: number): boolean =>\n\titem.nextAttemptAt <= now &&\n\t(item.lease === undefined || item.lease.expiresAt <= now);\n"
10
10
  ],
11
- "mappings": "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",
12
- "debugId": "C41FD2A676DEB7AF64756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "6F0F13A4EBC138E164756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dsn-checks.d.ts","sourceRoot":"","sources":["../../src/contract/dsn-checks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAC;AAwD1D,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CA4BvD"}
1
+ {"version":3,"file":"dsn-checks.d.ts","sourceRoot":"","sources":["../../src/contract/dsn-checks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAC;AAoF1D,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CA4BvD"}
@@ -1,4 +1,5 @@
1
1
  import type { OriginalRecipient, RecipientNotify } from '../contract/types';
2
+ import { type LocalDsnInput } from './for';
2
3
  /** One recipient the application put in a local mailbox. */
3
4
  export interface DeliveredRecipient {
4
5
  /** `local@domain`, the mailbox it was delivered to. */
@@ -9,23 +10,8 @@ export interface DeliveredRecipient {
9
10
  readonly orcpt?: OriginalRecipient;
10
11
  }
11
12
  /** What `deliveredDsn` takes. */
12
- export interface DeliveredDsnInput {
13
- /** This server's public name: the Reporting-MTA. */
14
- readonly reportingMta: string;
15
- /** The DSN's From: the postmaster's address. */
16
- readonly from: string;
17
- /** The original's reverse-path; `''` (the null sender) gets no DSN. */
18
- readonly to: string;
19
- /** When the original was received. */
20
- readonly arrival: Date;
21
- /** When it was delivered. Default: now. */
22
- readonly date?: Date;
13
+ export interface DeliveredDsnInput extends LocalDsnInput {
23
14
  readonly recipients: readonly DeliveredRecipient[];
24
- readonly envid?: string;
25
- /** The original as received; without it the DSN returns nothing of it. */
26
- readonly original?: Uint8Array;
27
- /** The most bytes of the original returned. Default 64 KiB. */
28
- readonly maxReturn?: number;
29
15
  }
30
16
  /**
31
17
  * The `delivered` DSN (RFC 3464 `Action: delivered`, RFC 3461 §5.2.3) for a
@@ -1 +1 @@
1
- {"version":3,"file":"delivered.d.ts","sourceRoot":"","sources":["../../src/dsn/delivered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI5E,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IAClC,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IACjC,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAsB7E"}
1
+ {"version":3,"file":"delivered.d.ts","sourceRoot":"","sources":["../../src/dsn/delivered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGnD,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IAClC,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACvD,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACnD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAc7E"}
@@ -0,0 +1,29 @@
1
+ import type { Diagnostic, OriginalRecipient, RecipientNotify, RetMode } from '../contract/types';
2
+ import { type LocalDsnInput } from './for';
3
+ /** One recipient the application could not deliver here. */
4
+ export interface FailedRecipient {
5
+ /** `local@domain`, as the sender named it. */
6
+ readonly address: string;
7
+ /** Its `NOTIFY`; a `failed` DSN goes unless `NEVER` or a list without `FAILURE` (RFC 3461 §4.1). */
8
+ readonly notify?: RecipientNotify;
9
+ /** Its `ORCPT`, echoed as `Original-Recipient`. */
10
+ readonly orcpt?: OriginalRecipient;
11
+ /** Why: the enhanced status and the text. */
12
+ readonly reply: Diagnostic;
13
+ }
14
+ /** What `failedDsn` takes. */
15
+ export interface FailedDsnInput extends LocalDsnInput {
16
+ readonly recipients: readonly FailedRecipient[];
17
+ /** `RET` of the original: what the DSN returns of it (RFC 3461 §4.3). Default: the headers. With `FULL`, give the whole message as `original`. */
18
+ readonly ret?: RetMode;
19
+ }
20
+ /**
21
+ * The `failed` DSN (RFC 3464 `Action: failed`) for a message the application
22
+ * could not put in a local mailbox: the bytes to `enqueue` from the null
23
+ * sender to `to`, or `undefined` when there is nothing to send — the
24
+ * original came from the null sender, or no recipient asked for failures
25
+ * (the default, unless `NOTIFY=NEVER` or a list without `FAILURE`). Only the
26
+ * recipients that asked are listed.
27
+ */
28
+ export declare function failedDsn(input: FailedDsnInput): Uint8Array | undefined;
29
+ //# sourceMappingURL=failed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failed.d.ts","sourceRoot":"","sources":["../../src/dsn/failed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGnD,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC/B,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oGAAoG;IACpG,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC3B;AAED,8BAA8B;AAC9B,MAAM,WAAW,cAAe,SAAQ,aAAa;IACpD,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,kJAAkJ;IAClJ,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAcvE"}
@@ -0,0 +1,26 @@
1
+ import { type DsnKind, type DsnRecipient } from './build';
2
+ /** What the DSNs of a local delivery share. */
3
+ export interface LocalDsnInput {
4
+ /** This server's public name: the Reporting-MTA. */
5
+ readonly reportingMta: string;
6
+ /** The DSN's From: the postmaster's address. */
7
+ readonly from: string;
8
+ /** The original's reverse-path; `''` (the null sender) gets no DSN. */
9
+ readonly to: string;
10
+ /** When the original was received. */
11
+ readonly arrival: Date;
12
+ /** When the DSN is written. Default: now. */
13
+ readonly date?: Date;
14
+ readonly envid?: string;
15
+ /** The original as received; without it the DSN returns nothing of it. */
16
+ readonly original?: Uint8Array;
17
+ /** The most bytes of the original returned. Default `DEFAULT_MAX_RETURN`. */
18
+ readonly maxReturn?: number;
19
+ }
20
+ /**
21
+ * The DSN of `kind` for `recipients` (already filtered by `NOTIFY`), or
22
+ * `undefined` when there is nobody to tell: the null sender, or no
23
+ * recipient.
24
+ */
25
+ export declare function dsnFor(kind: DsnKind, input: LocalDsnInput, recipients: readonly DsnRecipient[], returnContent: 'headers' | 'full'): Uint8Array | undefined;
26
+ //# sourceMappingURL=for.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"for.d.ts","sourceRoot":"","sources":["../../src/dsn/for.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAGpE,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CACrB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,aAAa,EAAE,SAAS,GAAG,MAAM,GAC/B,UAAU,GAAG,SAAS,CAexB"}
@@ -14,4 +14,6 @@ export declare function asked(kind: DsnKind, notify: RecipientNotify | undefined
14
14
  * setting.
15
15
  */
16
16
  export declare const returnOf: (ret: RetMode | undefined, fallback: "headers" | "full") => "headers" | "full";
17
+ /** The most bytes of the original a DSN returns, unless `maxReturn` or `limits.maxDsnReturn` says otherwise. */
18
+ export declare const DEFAULT_MAX_RETURN: number;
17
19
  //# sourceMappingURL=policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/dsn/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,WAUvE;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GACpB,KAAK,OAAO,GAAG,SAAS,EACxB,UAAU,SAAS,GAAG,MAAM,KAC1B,SAAS,GAAG,MACiD,CAAC"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/dsn/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,WAUvE;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GACpB,KAAK,OAAO,GAAG,SAAS,EACxB,UAAU,SAAS,GAAG,MAAM,KAC1B,SAAS,GAAG,MACiD,CAAC;AAEjE,gHAAgH;AAChH,eAAO,MAAM,kBAAkB,QAAY,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export type { QueueStore } from './contract/queue-store';
2
2
  export type { AddOptions, AttemptResult, ClaimRequest, Diagnostic, FinalStatus, Lease, NewQueueItem, NotifyEvent, OriginalRecipient, QueueItem, QueueListOptions, RecipientDsn, RecipientNotify, RecipientState, RecipientStatus, RecipientUpdate, RetMode, } from './contract/types';
3
3
  export { type DeliveredDsnInput, type DeliveredRecipient, deliveredDsn, } from './dsn/delivered';
4
+ export { type FailedDsnInput, type FailedRecipient, failedDsn, } from './dsn/failed';
5
+ export { DEFAULT_MAX_RETURN } from './dsn/policy';
4
6
  export { QueueError, type QueueErrorCode } from './errors';
5
7
  export type { MessageSource, QueueEnvelope } from './queue/envelope';
6
8
  export type { DeferredEvent, DsnEvent, QueueErrorEvent, QueueEvents, QueueListener, RecipientEvent, } from './queue/events';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EACX,UAAU,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,WAAW,EACX,KAAK,EACL,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,OAAO,GACP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,YAAY,GACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,YAAY,EACX,aAAa,EACb,QAAQ,EACR,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,KAAK,EACL,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,KAAK,EACL,MAAM,EACN,SAAS,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EACX,UAAU,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,WAAW,EACX,KAAK,EACL,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,OAAO,GACP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,YAAY,GACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,SAAS,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,YAAY,EACX,aAAa,EACb,QAAQ,EACR,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,KAAK,EACL,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,KAAK,EACL,MAAM,EACN,SAAS,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  QueueError2,
7
7
  invalid,
8
8
  checkOwner
9
- } from "./chunks/index-9yp15arf.js";
9
+ } from "./chunks/index-sz13a17b.js";
10
10
 
11
11
  // src/dsn/build.ts
12
12
  import {
@@ -306,31 +306,48 @@ function asked(kind, notify) {
306
306
  return notify.includes(event[kind]);
307
307
  }
308
308
  var returnOf = (ret, fallback) => ret === "HDRS" ? "headers" : ret === "FULL" ? "full" : fallback;
309
+ var DEFAULT_MAX_RETURN = 64 * 1024;
309
310
 
310
- // src/dsn/delivered.ts
311
- function deliveredDsn(input) {
312
- const wanted = input.recipients.filter((r) => asked("delivered", r.notify));
313
- if (input.to === "" || wanted.length === 0)
311
+ // src/dsn/for.ts
312
+ function dsnFor(kind, input, recipients, returnContent) {
313
+ if (input.to === "" || recipients.length === 0)
314
314
  return;
315
- const date = input.date ?? new Date;
316
315
  return buildDsn({
317
- kind: "delivered",
316
+ kind,
318
317
  reportingMta: input.reportingMta,
319
318
  from: input.from,
320
319
  to: input.to,
321
320
  arrival: input.arrival,
322
- date,
321
+ date: input.date ?? new Date,
323
322
  ...input.envid === undefined ? {} : { envid: input.envid },
324
- recipients: wanted.map((r) => ({
325
- address: r.address,
326
- lastAttempt: date,
327
- ...r.orcpt ? { orcpt: r.orcpt } : {}
328
- })),
323
+ recipients,
329
324
  ...input.original ? { original: input.original } : {},
330
- returnContent: "headers",
331
- maxReturn: input.maxReturn ?? 64 * 1024
325
+ returnContent,
326
+ maxReturn: input.maxReturn ?? DEFAULT_MAX_RETURN
332
327
  });
333
328
  }
329
+
330
+ // src/dsn/delivered.ts
331
+ function deliveredDsn(input) {
332
+ const date = input.date ?? new Date;
333
+ const wanted = input.recipients.filter((r) => asked("delivered", r.notify));
334
+ return dsnFor("delivered", { ...input, date }, wanted.map((r) => ({
335
+ address: r.address,
336
+ lastAttempt: date,
337
+ ...r.orcpt ? { orcpt: r.orcpt } : {}
338
+ })), "headers");
339
+ }
340
+ // src/dsn/failed.ts
341
+ function failedDsn(input) {
342
+ const date = input.date ?? new Date;
343
+ const wanted = input.recipients.filter((r) => asked("failed", r.notify));
344
+ return dsnFor("failed", { ...input, date }, wanted.map((r) => ({
345
+ address: r.address,
346
+ reply: r.reply,
347
+ lastAttempt: date,
348
+ ...r.orcpt ? { orcpt: r.orcpt } : {}
349
+ })), returnOf(input.ret, "headers"));
350
+ }
334
351
  // src/queue/envelope.ts
335
352
  import { isMailbox } from "@bumail/smtp/client";
336
353
  var ADDRESS = /^[^\s<>]{1,64}@[^\s<>@]{1,253}$/u;
@@ -504,7 +521,7 @@ function limitsOf(options) {
504
521
  maxRecipients: numberOf("limits.maxRecipients", l.maxRecipients, 100, 1),
505
522
  maxItems: l.maxItems === undefined ? undefined : numberOf("limits.maxItems", l.maxItems, 0, 1),
506
523
  maxReplyText: numberOf("limits.maxReplyText", l.maxReplyText, 512, 64, 900),
507
- maxDsnReturn: numberOf("limits.maxDsnReturn", l.maxDsnReturn, 64 * 1024, 0)
524
+ maxDsnReturn: numberOf("limits.maxDsnReturn", l.maxDsnReturn, DEFAULT_MAX_RETURN, 0)
508
525
  };
509
526
  }
510
527
 
@@ -1414,10 +1431,12 @@ function createQueue(options) {
1414
1431
  };
1415
1432
  }
1416
1433
  export {
1434
+ DEFAULT_MAX_RETURN,
1417
1435
  QueueError2 as QueueError,
1418
1436
  createQueue,
1419
- deliveredDsn
1437
+ deliveredDsn,
1438
+ failedDsn
1420
1439
  };
1421
1440
 
1422
- //# debugId=D24C84F35DEF0E8164756E2164756E21
1441
+ //# debugId=9F6E913A6461985264756E2164756E21
1423
1442
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,19 +1,21 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/dsn/build.ts", "../src/dsn/content.ts", "../src/dsn/fields.ts", "../src/dsn/human.ts", "../src/dsn/policy.ts", "../src/dsn/delivered.ts", "../src/queue/envelope.ts", "../src/queue/events.ts", "../src/queue/settings/index.ts", "../src/queue/settings/numbers.ts", "../src/queue/settings/dsn.ts", "../src/queue/settings/limits.ts", "../src/queue/settings/sessions.ts", "../src/queue/settings/routes.ts", "../src/queue/deliver.ts", "../src/queue/attempt.ts", "../src/queue/outcome.ts", "../src/queue/fallback.ts", "../src/queue/route.ts", "../src/queue/session.ts", "../src/queue/fallback-session.ts", "../src/queue/retry.ts", "../src/queue/notify.ts", "../src/queue/settle.ts", "../src/queue/lease.ts", "../src/queue/limiter.ts", "../src/queue/worker.ts", "../src/queue/queue.ts"],
3
+ "sources": ["../src/dsn/build.ts", "../src/dsn/content.ts", "../src/dsn/fields.ts", "../src/dsn/human.ts", "../src/dsn/policy.ts", "../src/dsn/for.ts", "../src/dsn/delivered.ts", "../src/dsn/failed.ts", "../src/queue/envelope.ts", "../src/queue/events.ts", "../src/queue/settings/index.ts", "../src/queue/settings/numbers.ts", "../src/queue/settings/dsn.ts", "../src/queue/settings/limits.ts", "../src/queue/settings/sessions.ts", "../src/queue/settings/routes.ts", "../src/queue/deliver.ts", "../src/queue/attempt.ts", "../src/queue/outcome.ts", "../src/queue/fallback.ts", "../src/queue/route.ts", "../src/queue/session.ts", "../src/queue/fallback-session.ts", "../src/queue/retry.ts", "../src/queue/notify.ts", "../src/queue/settle.ts", "../src/queue/lease.ts", "../src/queue/limiter.ts", "../src/queue/worker.ts", "../src/queue/queue.ts"],
4
4
  "sourcesContent": [
5
5
  "import {\n\tencodeHeaderValue,\n\tencodeQuotedPrintable,\n\tfoldHeader,\n\tformatDate,\n} from '@bumail/mime';\nimport { replaceControls } from '../text';\nimport { returned } from './content';\nimport { type DsnKind, type DsnRecipient, deliveryStatus } from './fields';\nimport { humanText, SUBJECTS } from './human';\n\nexport type { DsnKind, DsnRecipient } from './fields';\n\n/** What a DSN says, about which message, to whom. */\nexport interface DsnInput {\n\treadonly kind: DsnKind;\n\t/** This server's public name: the Reporting-MTA, and the Message-ID's domain. */\n\treadonly reportingMta: string;\n\t/** The DSN's From: the postmaster's address. */\n\treadonly from: string;\n\t/** The original's sender, to whom the DSN goes. */\n\treadonly to: string;\n\t/** When the original was enqueued. */\n\treadonly arrival: Date;\n\t/** When the DSN is written. */\n\treadonly date: Date;\n\t/** `ENVID` of the original, decoded: echoed as `Original-Envelope-Id`. */\n\treadonly envid?: string;\n\treadonly recipients: readonly DsnRecipient[];\n\t/** With `delayed`: when the queue gives up. */\n\treadonly willRetryUntil?: Date;\n\t/**\n\t * The original message, as enqueued; absent when it could not be read,\n\t * and the DSN then has no third part (RFC 6522 §3 makes it optional).\n\t */\n\treadonly original?: Uint8Array;\n\treadonly returnContent: 'headers' | 'full';\n\t/** The most bytes of the original returned. */\n\treadonly maxReturn: number;\n}\n\nconst encoder = new TextEncoder();\nconst strip = (text: string) =>\n\treplaceControls(text, '').replace(/[\\s<>]/g, '');\n\n/** The header fields of the DSN, every value cleaned and folded. */\nfunction headerFields(input: DsnInput, boundary: string): string[] {\n\tconst subject = SUBJECTS[input.kind];\n\tconst domain = strip(input.reportingMta);\n\treturn [\n\t\tfoldHeader('Date', formatDate(input.date)),\n\t\tfoldHeader('From', `Mail Delivery System <${strip(input.from)}>`),\n\t\tfoldHeader('To', `<${strip(input.to)}>`),\n\t\tfoldHeader('Subject', encodeHeaderValue(subject)),\n\t\tfoldHeader('Message-ID', `<${crypto.randomUUID()}@${domain}>`),\n\t\t// RFC 3834 §5: an automatic answer, which no one answers automatically.\n\t\tfoldHeader('Auto-Submitted', 'auto-replied'),\n\t\tfoldHeader('MIME-Version', '1.0'),\n\t\tfoldHeader(\n\t\t\t'Content-Type',\n\t\t\t`multipart/report; report-type=delivery-status; boundary=\"${boundary}\"`,\n\t\t),\n\t];\n}\n\nconst concat = (parts: readonly Uint8Array[]): Uint8Array => {\n\tconst out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n\tlet at = 0;\n\tfor (const part of parts) {\n\t\tout.set(part, at);\n\t\tat += part.length;\n\t}\n\treturn out;\n};\n\n/** A boundary that occurs nowhere in what it separates. */\nfunction boundaryFor(content: Uint8Array): string {\n\tconst text = new TextDecoder('latin1').decode(content);\n\tfor (;;) {\n\t\tconst boundary = `=_dsn_${crypto.randomUUID()}`;\n\t\tif (!text.includes(boundary)) return boundary;\n\t}\n}\n\n/**\n * A delivery status notification (RFC 3464): a `multipart/report`\n * (RFC 6522) of `report-type=delivery-status` holding the text a person\n * reads, the `message/delivery-status` fields a program reads, and the\n * original's header fields (or the whole original, when asked and small\n * enough), bounded by `maxReturn` — or, with no `original`, no third\n * part at all. Nothing from the remote server or the\n * envelope reaches a header field raw: control characters, CR and LF are\n * taken out first.\n */\nexport function buildDsn(input: DsnInput): Uint8Array {\n\tconst original = input.original\n\t\t? returned(input.original, input.returnContent, input.maxReturn)\n\t\t: undefined;\n\tconst boundary = boundaryFor(original?.body ?? new Uint8Array());\n\tconst text = encodeQuotedPrintable(humanText(input));\n\tconst status = deliveryStatus({\n\t\tkind: input.kind,\n\t\treportingMta: input.reportingMta,\n\t\tarrival: input.arrival,\n\t\t...(input.envid === undefined ? {} : { envid: input.envid }),\n\t\trecipients: input.recipients,\n\t\t...(input.willRetryUntil ? { willRetryUntil: input.willRetryUntil } : {}),\n\t});\n\tconst parts = [\n\t\t...headerFields(input, boundary),\n\t\t'',\n\t\t'This is a MIME-formatted delivery status notification.',\n\t\t'',\n\t\t`--${boundary}`,\n\t\t'Content-Type: text/plain; charset=utf-8',\n\t\t'Content-Transfer-Encoding: quoted-printable',\n\t\t'',\n\t\ttext,\n\t\t`--${boundary}`,\n\t\t'Content-Type: message/delivery-status',\n\t\t'',\n\t\tstatus,\n\t];\n\tconst end = `--${boundary}--\\r\\n`;\n\tif (!original) return encoder.encode(`${parts.join('\\r\\n')}\\r\\n${end}`);\n\tconst head = [\n\t\t...parts,\n\t\t`--${boundary}`,\n\t\t`Content-Type: ${original.type}`,\n\t\t...(original.eightBit ? ['Content-Transfer-Encoding: 8bit'] : []),\n\t\t'',\n\t\t'',\n\t].join('\\r\\n');\n\treturn concat([\n\t\tencoder.encode(head),\n\t\toriginal.body,\n\t\tencoder.encode(`\\r\\n${end}`),\n\t]);\n}\n",
6
6
  "/** The part of a DSN that returns the original message (RFC 3464 §2, RFC 6522 §3). */\n\nconst CR = 13;\nconst LF = 10;\n\n/** RFC 5322 §2.1.1: a line is at most 998 characters, its CRLF aside. */\nexport const MAX_LINE = 998;\n\nconst isContinuation = (byte: number | undefined) =>\n\tbyte !== undefined && byte >= 0x80 && byte < 0xc0;\n\n/**\n * Every bare CR or LF as CRLF, and every line cut at 998 bytes, never in\n * the middle of a UTF-8 character: a DSN is sent as lines, whatever the\n * original held, and a longer one would get the DSN itself refused.\n */\nfunction crlf(bytes: Uint8Array): Uint8Array {\n\tconst out: number[] = [];\n\tlet column = 0;\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tconst byte = bytes[i] as number;\n\t\tif (byte === CR || byte === LF) {\n\t\t\tout.push(CR, LF);\n\t\t\tcolumn = 0;\n\t\t\tif (byte === CR && bytes[i + 1] === LF) i++;\n\t\t} else if (column < MAX_LINE) {\n\t\t\tout.push(byte);\n\t\t\tcolumn++;\n\t\t} else if (column === MAX_LINE) {\n\t\t\t// The first byte cut: drop a character it would leave half written.\n\t\t\tif (isContinuation(byte)) {\n\t\t\t\twhile (isContinuation(out.at(-1))) {\n\t\t\t\t\tout.pop();\n\t\t\t\t}\n\t\t\t\tif ((out.at(-1) ?? 0) >= 0xc0) out.pop();\n\t\t\t}\n\t\t\tcolumn++;\n\t\t}\n\t}\n\treturn Uint8Array.from(out);\n}\n\n/** Where the header block ends: past the blank line, or the whole message when it has none. */\nfunction headerEnd(bytes: Uint8Array): number {\n\tfor (let i = 0; i + 3 < bytes.length; i++) {\n\t\tif (\n\t\t\tbytes[i] === CR &&\n\t\t\tbytes[i + 1] === LF &&\n\t\t\tbytes[i + 2] === CR &&\n\t\t\tbytes[i + 3] === LF\n\t\t) {\n\t\t\treturn i + 2;\n\t\t}\n\t}\n\treturn bytes.length;\n}\n\n/** The first `max` bytes at most, cut after the last whole line. */\nfunction wholeLines(bytes: Uint8Array, max: number): Uint8Array {\n\tif (bytes.length <= max) return bytes;\n\tconst cut = bytes.subarray(0, max).lastIndexOf(LF);\n\treturn bytes.subarray(0, cut + 1);\n}\n\nexport interface Returned {\n\t/** `text/rfc822-headers` or `message/rfc822`. */\n\treadonly type: string;\n\t/** Lines ending in CRLF, the last one included. */\n\treadonly body: Uint8Array;\n\t/** It holds a byte past ASCII: the part says `8bit`. */\n\treadonly eightBit: boolean;\n}\n\n/**\n * The original as a DSN returns it: the whole message when asked and it\n * fits `max` bytes, else its header fields, cut after the last whole line\n * that fits. Never more than `max` bytes.\n */\nexport function returned(\n\toriginal: Uint8Array,\n\tmode: 'headers' | 'full',\n\tmax: number,\n): Returned {\n\tconst message = crlf(original.subarray(0, max * 2 + 2));\n\tconst whole = original.length <= max && message.length <= max;\n\tconst body =\n\t\twhole && mode === 'full'\n\t\t\t? message\n\t\t\t: wholeLines(message.subarray(0, headerEnd(message)), max);\n\treturn {\n\t\ttype: whole && mode === 'full' ? 'message/rfc822' : 'text/rfc822-headers',\n\t\tbody,\n\t\teightBit: body.some((byte) => byte > 0x7f),\n\t};\n}\n",
7
7
  "import { foldHeader, formatDate } from '@bumail/mime';\nimport type { Diagnostic, OriginalRecipient } from '../contract/types';\nimport { asciiText, replaceControls } from '../text';\n\n/** One recipient a DSN reports on. */\nexport interface DsnRecipient {\n\treadonly address: string;\n\treadonly reply?: Diagnostic;\n\t/** When it was last tried. */\n\treadonly lastAttempt: Date;\n\t/** `ORCPT`: the recipient as the sender named it (RFC 3464 §2.3.1). */\n\treadonly orcpt?: OriginalRecipient;\n}\n\n/**\n * The `Action` of the report (RFC 3464 §2.3.3): `failed` and `delayed` for\n * what went wrong, `relayed` for a message handed to a next hop that sends\n * no DSN (RFC 3461 §5.2.2), `delivered` for one put in a local mailbox.\n */\nexport type DsnKind = 'delayed' | 'failed' | 'relayed' | 'delivered';\n\n/** What a delivery-status part reports: who reports, on what, and each recipient. */\nexport interface StatusReport {\n\treadonly kind: DsnKind;\n\t/** This server's name. */\n\treadonly reportingMta: string;\n\t/** When the message was enqueued. */\n\treadonly arrival: Date;\n\t/** `ENVID` of the original, decoded (RFC 3464 §2.2.1). */\n\treadonly envid?: string;\n\treadonly recipients: readonly DsnRecipient[];\n\t/** With `delayed`: when the queue gives up. */\n\treadonly willRetryUntil?: Date;\n}\n\n/** Control characters out, CR and LF first: nothing from outside starts a field of its own. */\nconst strip = (text: string) => replaceControls(text, '');\n\n/** The longest escaped address: with its field name, within 998 characters a line. */\nconst MAX_ESCAPED = 900;\n\n/**\n * An address as a delivery-status field types it: `rfc822; addr` when it\n * is ASCII; otherwise `utf-8;` with each non-ASCII character as\n * `\\x{HEX}` (RFC 6533 §3, utf-8-addr-xtext), so the part stays 7-bit,\n * cut at 900 characters so it always fits a header line.\n */\nexport function typedAddress(address: string): string {\n\tconst clean = cleanAddress(address);\n\tif (isAscii(clean)) return `rfc822; ${clean}`;\n\t// One word, so it must fit a line (RFC 5322 §2.1.1): cut, never lost.\n\treturn `utf-8; ${escapedAddress(clean).slice(0, MAX_ESCAPED)}`;\n}\n\nconst cleanAddress = (address: string) => strip(address).replace(/[\\s\\\\]/g, '');\nconst isAscii = (text: string) => /^[\\x21-\\x7e]*$/.test(text);\n\n/** The whole of an address with each non-ASCII character as `\\x{HEX}`, uncut. */\nfunction escapedAddress(clean: string): string {\n\tlet escaped = '';\n\tfor (const c of clean) {\n\t\tescaped += /[\\x21-\\x7e]/.test(c)\n\t\t\t? c\n\t\t\t: `\\\\x{${(c.codePointAt(0) ?? 0).toString(16).toUpperCase()}}`;\n\t}\n\treturn escaped;\n}\n\n/** A host name as `dns; host`, or nothing when it is not one. */\nconst remoteMta = (host: string | undefined) =>\n\thost && /^[A-Za-z0-9.:[\\]-]{1,255}$/.test(host) ? `dns; ${host}` : undefined;\n\n/**\n * The status (RFC 3463) of a recipient: the reply's enhanced code; else\n * its class from the reply code; else, with nothing at all, the kind's.\n */\nexport function statusOf(kind: DsnKind, reply?: Diagnostic): string {\n\tif (reply?.status) return reply.status;\n\tif (reply?.code !== undefined) {\n\t\tif (reply.code < 400) return '2.0.0';\n\t\treturn reply.code >= 500 ? '5.0.0' : '4.0.0';\n\t}\n\tif (kind === 'relayed' || kind === 'delivered') return '2.0.0';\n\treturn kind === 'failed' ? '5.0.0' : '4.0.0';\n}\n\n/**\n * `Original-Recipient` (RFC 3464 §2.3.1): `rfc822` addresses as the final\n * recipient's are typed; another address type is kept when its type is a\n * token and its address plain ASCII, else the field is left out; so is one\n * longer than a line holds.\n */\nfunction originalRecipient(orcpt: OriginalRecipient): string | undefined {\n\tconst type = orcpt.type.toLowerCase();\n\tif (type === 'rfc822' || type === 'utf-8') {\n\t\t// An ORCPT over the line limit leaves the field out: a field that cannot\n\t\t// be folded would lose the whole DSN, every recipient's.\n\t\tconst clean = cleanAddress(orcpt.address);\n\t\tconst whole = isAscii(clean) ? clean : escapedAddress(clean);\n\t\treturn whole.length > MAX_ESCAPED ? undefined : typedAddress(orcpt.address);\n\t}\n\tconst address = strip(orcpt.address).replace(/\\s/g, '');\n\tif (\n\t\t!/^[A-Za-z0-9-]{1,20}$/.test(orcpt.type) ||\n\t\t!/^[\\x21-\\x7e]{1,900}$/.test(address)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn `${orcpt.type.toLowerCase()}; ${address}`;\n}\n\n/** The fields of one recipient (RFC 3464 §2.3), folded, no line from outside. */\nfunction recipientFields(\n\treport: StatusReport,\n\trecipient: DsnRecipient,\n): string[] {\n\tconst { reply } = recipient;\n\tconst original = recipient.orcpt && originalRecipient(recipient.orcpt);\n\tconst fields: [string, string][] = [\n\t\t...(original\n\t\t\t? ([['Original-Recipient', original]] as [string, string][])\n\t\t\t: []),\n\t\t['Final-Recipient', typedAddress(recipient.address)],\n\t\t['Action', report.kind],\n\t\t['Status', statusOf(report.kind, reply)],\n\t];\n\tconst remote = remoteMta(reply?.host);\n\tif (remote) fields.push(['Remote-MTA', remote]);\n\tif (reply) {\n\t\tconst text = asciiText(reply.text, 900);\n\t\tfields.push(\n\t\t\treply.code === undefined\n\t\t\t\t? ['Diagnostic-Code', `X-Bumail; ${text}`]\n\t\t\t\t: ['Diagnostic-Code', `smtp; ${reply.code} ${text}`],\n\t\t);\n\t}\n\tfields.push(['Last-Attempt-Date', formatDate(recipient.lastAttempt)]);\n\tif (report.kind === 'delayed' && report.willRetryUntil) {\n\t\tfields.push(['Will-Retry-Until', formatDate(report.willRetryUntil)]);\n\t}\n\treturn fields.map(([name, value]) => foldHeader(name, value));\n}\n\n/**\n * The body of a `message/delivery-status` part (RFC 3464 §2.1): the\n * per-message fields, then each recipient's, a blank line between, CRLF.\n */\nexport function deliveryStatus(report: StatusReport): string {\n\tconst envid = strip(report.envid ?? '').trim();\n\tconst message = [\n\t\t...(envid === '' ? [] : [foldHeader('Original-Envelope-Id', envid)]),\n\t\tfoldHeader('Reporting-MTA', `dns; ${strip(report.reportingMta)}`),\n\t\tfoldHeader('Arrival-Date', formatDate(report.arrival)),\n\t].join('\\r\\n');\n\tconst blocks = report.recipients.map((r) =>\n\t\trecipientFields(report, r).join('\\r\\n'),\n\t);\n\treturn `${[message, ...blocks].join('\\r\\n\\r\\n')}\\r\\n`;\n}\n",
8
8
  "import { formatDate } from '@bumail/mime';\nimport { cleanText } from '../text';\nimport type { DsnInput } from './build';\nimport { type DsnKind, statusOf } from './fields';\n\n/** The Subject of each kind of DSN. */\nexport const SUBJECTS: Record<DsnKind, string> = {\n\tfailed: 'Undelivered Mail Returned to Sender',\n\tdelayed: 'Delayed Mail (still being retried)',\n\trelayed: 'Mail Relayed (delivery not confirmed)',\n\tdelivered: 'Mail Delivered',\n};\n\n/** The sentences each kind opens with, after the greeting. */\nfunction opening(input: DsnInput): string[] {\n\tswitch (input.kind) {\n\t\tcase 'failed':\n\t\t\treturn [\n\t\t\t\t'Your message could not be delivered to the recipients below.',\n\t\t\t\t'This is a permanent failure: the message will not be retried.',\n\t\t\t];\n\t\tcase 'delayed':\n\t\t\treturn [\n\t\t\t\t'Your message has not been delivered yet to the recipients below.',\n\t\t\t\t'This is a warning only: the message is still being retried',\n\t\t\t\t...(input.willRetryUntil\n\t\t\t\t\t? [`until ${formatDate(input.willRetryUntil)}.`]\n\t\t\t\t\t: []),\n\t\t\t\t'You do not need to send it again.',\n\t\t\t];\n\t\tcase 'relayed':\n\t\t\treturn [\n\t\t\t\t'Your message was passed on to the recipients below, whose server',\n\t\t\t\t'does not report delivery status (RFC 3461 §5.2.2).',\n\t\t\t\t'This server can say no more: no further notice will follow.',\n\t\t\t];\n\t\tcase 'delivered':\n\t\t\treturn ['Your message was delivered to the recipients below.'];\n\t}\n}\n\n/** The text a person reads first: what happened, to whom, and why (RFC 3464 §2's first part). */\nexport function humanText(input: DsnInput): string {\n\tconst lines = [\n\t\t`This is the mail system at ${input.reportingMta}.`,\n\t\t'',\n\t\t...opening(input),\n\t];\n\tif (!input.original && input.kind !== 'delivered') {\n\t\tlines.push(\n\t\t\t'',\n\t\t\t'Your message could not be read from the queue, so it is not returned.',\n\t\t);\n\t}\n\tlines.push('');\n\tfor (const r of input.recipients) {\n\t\tconst said = r.reply\n\t\t\t? `${r.reply.code ?? ''} ${cleanText(r.reply.text, 900)}`.trim()\n\t\t\t: statusOf(input.kind);\n\t\tconst why =\n\t\t\tr.reply?.status === '4.4.7'\n\t\t\t\t? `delivery time expired, still failing: ${said}`\n\t\t\t\t: said;\n\t\tlines.push(`<${cleanText(r.address, 254)}>: ${why}`);\n\t}\n\treturn `${lines.join('\\r\\n')}\\r\\n`;\n}\n",
9
- "import type { RecipientNotify, RetMode } from '../contract/types';\nimport type { DsnKind } from './fields';\n\n/**\n * Whether a recipient asked for a DSN of this kind (RFC 3461 §4.1).\n * `NEVER` asks for none. With no `NOTIFY`, failures and delays are\n * reported (§4.1: the default) and a success is not. With a list, only the\n * events it names: `relayed` and `delivered` stand for `SUCCESS` (§5.2.2,\n * §5.2.3).\n */\nexport function asked(kind: DsnKind, notify: RecipientNotify | undefined) {\n\tif (notify === 'NEVER') return false;\n\tif (notify === undefined) return kind === 'failed' || kind === 'delayed';\n\tconst event = {\n\t\tfailed: 'FAILURE',\n\t\tdelayed: 'DELAY',\n\t\trelayed: 'SUCCESS',\n\t\tdelivered: 'SUCCESS',\n\t} as const;\n\treturn notify.includes(event[kind]);\n}\n\n/**\n * What a DSN returns of the original (RFC 3461 §4.3): `RET=HDRS` the\n * header fields only, `RET=FULL` the whole message, else the queue's own\n * setting.\n */\nexport const returnOf = (\n\tret: RetMode | undefined,\n\tfallback: 'headers' | 'full',\n): 'headers' | 'full' =>\n\tret === 'HDRS' ? 'headers' : ret === 'FULL' ? 'full' : fallback;\n",
10
- "import type { OriginalRecipient, RecipientNotify } from '../contract/types';\nimport { buildDsn } from './build';\nimport { asked } from './policy';\n\n/** One recipient the application put in a local mailbox. */\nexport interface DeliveredRecipient {\n\t/** `local@domain`, the mailbox it was delivered to. */\n\treadonly address: string;\n\t/** Its `NOTIFY`; a `delivered` DSN goes only when `SUCCESS` was asked (RFC 3461 §5.2.3). */\n\treadonly notify?: RecipientNotify;\n\t/** Its `ORCPT`, echoed as `Original-Recipient`. */\n\treadonly orcpt?: OriginalRecipient;\n}\n\n/** What `deliveredDsn` takes. */\nexport interface DeliveredDsnInput {\n\t/** This server's public name: the Reporting-MTA. */\n\treadonly reportingMta: string;\n\t/** The DSN's From: the postmaster's address. */\n\treadonly from: string;\n\t/** The original's reverse-path; `''` (the null sender) gets no DSN. */\n\treadonly to: string;\n\t/** When the original was received. */\n\treadonly arrival: Date;\n\t/** When it was delivered. Default: now. */\n\treadonly date?: Date;\n\treadonly recipients: readonly DeliveredRecipient[];\n\treadonly envid?: string;\n\t/** The original as received; without it the DSN returns nothing of it. */\n\treadonly original?: Uint8Array;\n\t/** The most bytes of the original returned. Default 64 KiB. */\n\treadonly maxReturn?: number;\n}\n\n/**\n * The `delivered` DSN (RFC 3464 `Action: delivered`, RFC 3461 §5.2.3) for a\n * message the application put in local mailboxes: the bytes to\n * `enqueue` from the null sender to `to`, or `undefined` when there is\n * nothing to send — the original came from the null sender, or no\n * recipient asked for `SUCCESS`. Only the recipients that asked are\n * listed.\n */\nexport function deliveredDsn(input: DeliveredDsnInput): Uint8Array | undefined {\n\tconst wanted = input.recipients.filter((r) => asked('delivered', r.notify));\n\tif (input.to === '' || wanted.length === 0) return undefined;\n\tconst date = input.date ?? new Date();\n\treturn buildDsn({\n\t\tkind: 'delivered',\n\t\treportingMta: input.reportingMta,\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tarrival: input.arrival,\n\t\tdate,\n\t\t...(input.envid === undefined ? {} : { envid: input.envid }),\n\t\trecipients: wanted.map((r) => ({\n\t\t\taddress: r.address,\n\t\t\tlastAttempt: date,\n\t\t\t...(r.orcpt ? { orcpt: r.orcpt } : {}),\n\t\t})),\n\t\t...(input.original ? { original: input.original } : {}),\n\t\t// RET speaks of failure DSNs (RFC 3461 §4.3): this one returns headers.\n\t\treturnContent: 'headers',\n\t\tmaxReturn: input.maxReturn ?? 64 * 1024,\n\t});\n}\n",
9
+ "import type { RecipientNotify, RetMode } from '../contract/types';\nimport type { DsnKind } from './fields';\n\n/**\n * Whether a recipient asked for a DSN of this kind (RFC 3461 §4.1).\n * `NEVER` asks for none. With no `NOTIFY`, failures and delays are\n * reported (§4.1: the default) and a success is not. With a list, only the\n * events it names: `relayed` and `delivered` stand for `SUCCESS` (§5.2.2,\n * §5.2.3).\n */\nexport function asked(kind: DsnKind, notify: RecipientNotify | undefined) {\n\tif (notify === 'NEVER') return false;\n\tif (notify === undefined) return kind === 'failed' || kind === 'delayed';\n\tconst event = {\n\t\tfailed: 'FAILURE',\n\t\tdelayed: 'DELAY',\n\t\trelayed: 'SUCCESS',\n\t\tdelivered: 'SUCCESS',\n\t} as const;\n\treturn notify.includes(event[kind]);\n}\n\n/**\n * What a DSN returns of the original (RFC 3461 §4.3): `RET=HDRS` the\n * header fields only, `RET=FULL` the whole message, else the queue's own\n * setting.\n */\nexport const returnOf = (\n\tret: RetMode | undefined,\n\tfallback: 'headers' | 'full',\n): 'headers' | 'full' =>\n\tret === 'HDRS' ? 'headers' : ret === 'FULL' ? 'full' : fallback;\n\n/** The most bytes of the original a DSN returns, unless `maxReturn` or `limits.maxDsnReturn` says otherwise. */\nexport const DEFAULT_MAX_RETURN = 64 * 1024;\n",
10
+ "import { buildDsn, type DsnKind, type DsnRecipient } from './build';\nimport { DEFAULT_MAX_RETURN } from './policy';\n\n/** What the DSNs of a local delivery share. */\nexport interface LocalDsnInput {\n\t/** This server's public name: the Reporting-MTA. */\n\treadonly reportingMta: string;\n\t/** The DSN's From: the postmaster's address. */\n\treadonly from: string;\n\t/** The original's reverse-path; `''` (the null sender) gets no DSN. */\n\treadonly to: string;\n\t/** When the original was received. */\n\treadonly arrival: Date;\n\t/** When the DSN is written. Default: now. */\n\treadonly date?: Date;\n\treadonly envid?: string;\n\t/** The original as received; without it the DSN returns nothing of it. */\n\treadonly original?: Uint8Array;\n\t/** The most bytes of the original returned. Default `DEFAULT_MAX_RETURN`. */\n\treadonly maxReturn?: number;\n}\n\n/**\n * The DSN of `kind` for `recipients` (already filtered by `NOTIFY`), or\n * `undefined` when there is nobody to tell: the null sender, or no\n * recipient.\n */\nexport function dsnFor(\n\tkind: DsnKind,\n\tinput: LocalDsnInput,\n\trecipients: readonly DsnRecipient[],\n\treturnContent: 'headers' | 'full',\n): Uint8Array | undefined {\n\tif (input.to === '' || recipients.length === 0) return undefined;\n\treturn buildDsn({\n\t\tkind,\n\t\treportingMta: input.reportingMta,\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tarrival: input.arrival,\n\t\tdate: input.date ?? new Date(),\n\t\t...(input.envid === undefined ? {} : { envid: input.envid }),\n\t\trecipients,\n\t\t...(input.original ? { original: input.original } : {}),\n\t\treturnContent,\n\t\tmaxReturn: input.maxReturn ?? DEFAULT_MAX_RETURN,\n\t});\n}\n",
11
+ "import type { OriginalRecipient, RecipientNotify } from '../contract/types';\nimport { dsnFor, type LocalDsnInput } from './for';\nimport { asked } from './policy';\n\n/** One recipient the application put in a local mailbox. */\nexport interface DeliveredRecipient {\n\t/** `local@domain`, the mailbox it was delivered to. */\n\treadonly address: string;\n\t/** Its `NOTIFY`; a `delivered` DSN goes only when `SUCCESS` was asked (RFC 3461 §5.2.3). */\n\treadonly notify?: RecipientNotify;\n\t/** Its `ORCPT`, echoed as `Original-Recipient`. */\n\treadonly orcpt?: OriginalRecipient;\n}\n\n/** What `deliveredDsn` takes. */\nexport interface DeliveredDsnInput extends LocalDsnInput {\n\treadonly recipients: readonly DeliveredRecipient[];\n}\n\n/**\n * The `delivered` DSN (RFC 3464 `Action: delivered`, RFC 3461 §5.2.3) for a\n * message the application put in local mailboxes: the bytes to\n * `enqueue` from the null sender to `to`, or `undefined` when there is\n * nothing to send — the original came from the null sender, or no\n * recipient asked for `SUCCESS`. Only the recipients that asked are\n * listed.\n */\nexport function deliveredDsn(input: DeliveredDsnInput): Uint8Array | undefined {\n\tconst date = input.date ?? new Date();\n\tconst wanted = input.recipients.filter((r) => asked('delivered', r.notify));\n\t// RET speaks of failure DSNs (RFC 3461 §4.3): this one returns headers.\n\treturn dsnFor(\n\t\t'delivered',\n\t\t{ ...input, date },\n\t\twanted.map((r) => ({\n\t\t\taddress: r.address,\n\t\t\tlastAttempt: date,\n\t\t\t...(r.orcpt ? { orcpt: r.orcpt } : {}),\n\t\t})),\n\t\t'headers',\n\t);\n}\n",
12
+ "import type {\n\tDiagnostic,\n\tOriginalRecipient,\n\tRecipientNotify,\n\tRetMode,\n} from '../contract/types';\nimport { dsnFor, type LocalDsnInput } from './for';\nimport { asked, returnOf } from './policy';\n\n/** One recipient the application could not deliver here. */\nexport interface FailedRecipient {\n\t/** `local@domain`, as the sender named it. */\n\treadonly address: string;\n\t/** Its `NOTIFY`; a `failed` DSN goes unless `NEVER` or a list without `FAILURE` (RFC 3461 §4.1). */\n\treadonly notify?: RecipientNotify;\n\t/** Its `ORCPT`, echoed as `Original-Recipient`. */\n\treadonly orcpt?: OriginalRecipient;\n\t/** Why: the enhanced status and the text. */\n\treadonly reply: Diagnostic;\n}\n\n/** What `failedDsn` takes. */\nexport interface FailedDsnInput extends LocalDsnInput {\n\treadonly recipients: readonly FailedRecipient[];\n\t/** `RET` of the original: what the DSN returns of it (RFC 3461 §4.3). Default: the headers. With `FULL`, give the whole message as `original`. */\n\treadonly ret?: RetMode;\n}\n\n/**\n * The `failed` DSN (RFC 3464 `Action: failed`) for a message the application\n * could not put in a local mailbox: the bytes to `enqueue` from the null\n * sender to `to`, or `undefined` when there is nothing to send — the\n * original came from the null sender, or no recipient asked for failures\n * (the default, unless `NOTIFY=NEVER` or a list without `FAILURE`). Only the\n * recipients that asked are listed.\n */\nexport function failedDsn(input: FailedDsnInput): Uint8Array | undefined {\n\tconst date = input.date ?? new Date();\n\tconst wanted = input.recipients.filter((r) => asked('failed', r.notify));\n\treturn dsnFor(\n\t\t'failed',\n\t\t{ ...input, date },\n\t\twanted.map((r) => ({\n\t\t\taddress: r.address,\n\t\t\treply: r.reply,\n\t\t\tlastAttempt: date,\n\t\t\t...(r.orcpt ? { orcpt: r.orcpt } : {}),\n\t\t})),\n\t\treturnOf(input.ret, 'headers'),\n\t);\n}\n",
11
13
  "import { isMailbox } from '@bumail/smtp/client';\nimport type { RecipientDsn, RetMode } from '../contract/types';\nimport { invalid, QueueError } from '../errors';\nimport { hasControl } from '../text';\n\n/** What `enqueue` takes as the message: its bytes, its text, or a stream of it. */\nexport type MessageSource = Uint8Array | string | ReadableStream<Uint8Array>;\n\n/** The SMTP envelope of a message to send. */\nexport interface QueueEnvelope {\n\t/** The reverse-path, `local@domain`; `''` for the null sender (a bounce of your own). */\n\treadonly from: string;\n\t/** One recipient or more, `local@domain` each. */\n\treadonly to: string | readonly string[];\n\t/**\n\t * `RET` (RFC 3461 §4.3): what a DSN returns of the message, `HDRS` the\n\t * header fields only, `FULL` the whole message (still bounded by\n\t * `limits.maxDsnReturn`). Absent: the queue's `dsn.returnContent`.\n\t */\n\treadonly ret?: RetMode;\n\t/** `ENVID` (RFC 3461 §4.4), decoded: 1 to 100 printable ASCII characters. Passed on and echoed in a DSN. */\n\treadonly envid?: string;\n\t/**\n\t * `NOTIFY` and `ORCPT` (RFC 3461 §4.1, §4.2) of the recipients that carry\n\t * some, matched to `to` by address (the SMTP server's\n\t * `Envelope.recipients` fits as it is).\n\t */\n\treadonly recipients?: readonly RecipientDsn[];\n}\n\n/** What `checkEnvelope` returns: the envelope without its duplicates. */\nexport interface CheckedEnvelope {\n\treadonly from: string;\n\treadonly to: string[];\n\treadonly ret?: RetMode;\n\treadonly envid?: string;\n\treadonly recipients?: readonly RecipientDsn[];\n}\n\n/**\n * An address as SMTP carries it: a local part, `@`, a domain, 254\n * characters at most (RFC 5321 §4.5.3.1.3's path, less its brackets), with\n * no space, no control character and no angle bracket, so it can never\n * break a command line or a header field — and one `sendMail` takes\n * (`isMailbox`, RFC 5321's grammar), so it is refused here, never at\n * delivery, where it would fail its whole domain's group.\n */\nconst ADDRESS = /^[^\\s<>]{1,64}@[^\\s<>@]{1,253}$/u;\n\nexport function checkAddress(name: string, address: unknown): string {\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\taddress.length > 254 ||\n\t\thasControl(address) ||\n\t\t!ADDRESS.test(address) ||\n\t\t!isMailbox(address)\n\t) {\n\t\tthrow invalid(\n\t\t\t`${name} must be an address, local@domain, not ${JSON.stringify(address)}`,\n\t\t);\n\t}\n\treturn address;\n}\n\n/** The recipient's domain, in lowercase: what deliveries are grouped by. */\nexport const domainOf = (address: string) =>\n\taddress.slice(address.lastIndexOf('@') + 1).toLowerCase();\n\n/** The envelope, checked: the sender, and each recipient once, at most `maxRecipients`. */\nexport function checkEnvelope(\n\tenvelope: QueueEnvelope,\n\tmaxRecipients: number,\n): CheckedEnvelope {\n\tif (typeof envelope !== 'object' || envelope === null) {\n\t\tthrow invalid('The envelope is an object: { from, to }');\n\t}\n\tconst from = envelope.from === '' ? '' : checkAddress('from', envelope.from);\n\tconst list = typeof envelope.to === 'string' ? [envelope.to] : envelope.to;\n\tif (!Array.isArray(list) || list.length === 0) {\n\t\tthrow invalid('to must hold one recipient or more');\n\t}\n\tconst seen = new Set<string>();\n\tconst to: string[] = [];\n\tfor (const address of list) {\n\t\tcheckAddress('Each recipient', address);\n\t\tconst key = `${address.slice(0, address.lastIndexOf('@'))}@${domainOf(address)}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tto.push(address);\n\t}\n\tif (to.length > maxRecipients) {\n\t\tthrow new QueueError(\n\t\t\t'TOO_MANY_RECIPIENTS',\n\t\t\t`The message has ${to.length} recipients; the limit is ${maxRecipients}`,\n\t\t);\n\t}\n\t// An entry for a spelling dropped as a duplicate moves to the kept one\n\t// (the first with an entry wins); any other is the store's to check\n\t// (an address not in `to` is `INVALID`).\n\tconst keyOf = (a: string) =>\n\t\t`${a.slice(0, a.lastIndexOf('@'))}@${domainOf(a)}`;\n\tconst kept = new Map(to.map((a) => [keyOf(a), a]));\n\tconst recipients = Array.isArray(envelope.recipients)\n\t\t? envelope.recipients\n\t\t\t\t.map((r) => {\n\t\t\t\t\tconst target =\n\t\t\t\t\t\ttypeof r?.address === 'string' && list.includes(r.address)\n\t\t\t\t\t\t\t? kept.get(keyOf(r.address))\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn target === undefined ? r : { ...r, address: target };\n\t\t\t\t})\n\t\t\t\t.filter(\n\t\t\t\t\t(r, i, all) => all.findIndex((o) => o?.address === r?.address) === i,\n\t\t\t\t)\n\t\t: envelope.recipients;\n\treturn {\n\t\tfrom,\n\t\tto,\n\t\t...(envelope.ret === undefined ? {} : { ret: envelope.ret }),\n\t\t...(envelope.envid === undefined ? {} : { envid: envelope.envid }),\n\t\t...(recipients === undefined ? {} : { recipients }),\n\t};\n}\n\nconst tooBig = (max: number) =>\n\tnew QueueError(\n\t\t'MESSAGE_TOO_BIG',\n\t\t`The message is larger than the limit of ${max} bytes`,\n\t);\n\nconst CR = 0x0d;\nconst LF = 0x0a;\n\n/**\n * Refuses a message with a CR not followed by an LF, or an LF not after a\n * CR: `sendMail` would refuse it at delivery (`BARE_LINE_BREAK`, SMTP\n * smuggling), failing every recipient.\n */\nexport function checkLineEnds(bytes: Uint8Array): void {\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tconst byte = bytes[i];\n\t\tconst bare =\n\t\t\tbyte === CR\n\t\t\t\t? bytes[i + 1] !== LF\n\t\t\t\t: byte === LF && (i === 0 || bytes[i - 1] !== CR);\n\t\tif (bare) {\n\t\t\tthrow invalid(\n\t\t\t\t`The message has a bare CR or LF at byte ${i}: every line must end in CRLF`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** The message's bytes, read to its end but never past `max`: past it, `MESSAGE_TOO_BIG`. */\nexport async function readMessage(\n\tsource: MessageSource,\n\tmax: number,\n): Promise<Uint8Array> {\n\tif (typeof source === 'string') source = new TextEncoder().encode(source);\n\tif (source instanceof Uint8Array) {\n\t\tif (source.length > max) throw tooBig(max);\n\t\treturn source.slice();\n\t}\n\tif (!(source instanceof ReadableStream)) {\n\t\tthrow invalid(\n\t\t\t'The message is a Uint8Array, a string or a ReadableStream<Uint8Array>',\n\t\t);\n\t}\n\tconst chunks: Uint8Array[] = [];\n\tlet size = 0;\n\tconst reader = source.getReader();\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (!(value instanceof Uint8Array)) {\n\t\t\t\tthrow invalid('The message stream must give Uint8Array chunks');\n\t\t\t}\n\t\t\tsize += value.length;\n\t\t\tif (size > max) throw tooBig(max);\n\t\t\tchunks.push(value);\n\t\t}\n\t} catch (error) {\n\t\tawait reader.cancel().catch(() => {});\n\t\tthrow error;\n\t} finally {\n\t\treader.releaseLock();\n\t}\n\tconst bytes = new Uint8Array(size);\n\tlet at = 0;\n\tfor (const chunk of chunks) {\n\t\tbytes.set(chunk, at);\n\t\tat += chunk.length;\n\t}\n\treturn bytes;\n}\n",
12
14
  "import type { Diagnostic } from '../contract/types';\n\n/** One recipient's outcome. */\nexport interface RecipientEvent {\n\t/** The item's id. */\n\treadonly id: string;\n\treadonly from: string;\n\treadonly recipient: string;\n\t/** What the other side said, or why nobody said anything. */\n\treadonly reply?: Diagnostic;\n\t/** The attempts made so far, this one included. */\n\treadonly attempts: number;\n\t/**\n\t * The route of this recipient's last session: `'mx'`, or `'smarthost'`\n\t * for a smarthost, a host of a route, or the fallback.\n\t */\n\treadonly route?: 'mx' | 'smarthost';\n\t/** `true` when that session was the fallback, after the one by MX failed. */\n\treadonly fallback?: true;\n\t/**\n\t * With `fallback`, what the MX side said (or why nobody said anything)\n\t * before the smarthost took over: `reply` is the smarthost's.\n\t */\n\treadonly mxReply?: Diagnostic;\n\t/**\n\t * Only on `deferred` and `failed`: `true` when a session by MX ended\n\t * after the final dot with no reply, so the MX may hold a copy and the\n\t * queue never fell back to a smarthost for this recipient on its own.\n\t */\n\treadonly mayHaveReachedMx?: true;\n\t/**\n\t * Only on `deferred` and `failed`: `true` when the fallback smarthost's\n\t * session ended after the final dot with no reply, so it may hold a copy\n\t * and the next attempt goes to it again instead of the MX.\n\t */\n\treadonly mayHaveReachedFallback?: true;\n}\n\nexport interface DeferredEvent extends RecipientEvent {\n\t/** When the recipient is tried again, in milliseconds since the epoch. */\n\treadonly nextAttemptAt: number;\n}\n\n/** A DSN, enqueued back to the sender. */\nexport interface DsnEvent {\n\t/** `relayed`: SUCCESS was asked and the next hop sends no DSN (RFC 3461 §5.2.2). */\n\treadonly kind: 'delayed' | 'failed' | 'relayed';\n\t/** The DSN's own item id. */\n\treadonly id: string;\n\t/** The id of the item it reports on. */\n\treadonly of: string;\n\t/** The original's sender, to whom it goes. */\n\treadonly to: string;\n\treadonly recipients: readonly string[];\n}\n\n/** A failure of the queue itself: the store, a DSN that could not be enqueued, a lease lost. */\nexport interface QueueErrorEvent {\n\treadonly error: unknown;\n\t/** The item it happened to, if any. */\n\treadonly id?: string;\n}\n\nexport interface QueueEvents {\n\tdelivered: RecipientEvent;\n\tdeferred: DeferredEvent;\n\tfailed: RecipientEvent;\n\tdsn: DsnEvent;\n\terror: QueueErrorEvent;\n}\n\nexport type QueueListener<E extends keyof QueueEvents> = (\n\tevent: QueueEvents[E],\n) => void;\n\n/** Listeners by event. One that throws is ignored: it never stops a delivery. */\nexport class Events {\n\treadonly #listeners = new Map<keyof QueueEvents, Set<(e: never) => void>>();\n\n\ton<E extends keyof QueueEvents>(\n\t\tevent: E,\n\t\tlistener: QueueListener<E>,\n\t): () => void {\n\t\tlet set = this.#listeners.get(event);\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\tthis.#listeners.set(event, set);\n\t\t}\n\t\tset.add(listener as (e: never) => void);\n\t\treturn () => {\n\t\t\tset.delete(listener as (e: never) => void);\n\t\t};\n\t}\n\n\temit<E extends keyof QueueEvents>(event: E, payload: QueueEvents[E]): void {\n\t\tfor (const listener of this.#listeners.get(event) ?? []) {\n\t\t\ttry {\n\t\t\t\t(listener as QueueListener<E>)(payload);\n\t\t\t} catch {\n\t\t\t\t// A listener's failure is its own.\n\t\t\t}\n\t\t}\n\t}\n}\n",
13
15
  "import { sendMail } from '@bumail/smtp/client';\nimport { checkOwner } from '../../contract/checks';\nimport { invalid } from '../../errors';\nimport type { QueueOptions, Route, Sender } from '../options';\nimport { type DsnSettings, dsnOf } from './dsn';\nimport {\n\ttype LimitSettings,\n\tlimitsOf,\n\ttype RetrySettings,\n\tretryOf,\n} from './limits';\nimport { MAX_TIMER, MINUTE, numberOf } from './numbers';\nimport { checkRoutes } from './routes';\nimport { checkSessions } from './sessions';\n\nexport type { DsnSettings, LimitSettings, RetrySettings };\n\n/** Every option checked, with its default. */\nexport interface Settings {\n\treadonly options: QueueOptions;\n\treadonly hostname: string;\n\t/** The routes by domain, in lowercase. */\n\treadonly routes: ReadonlyMap<string, Route>;\n\treadonly retry: RetrySettings;\n\treadonly limits: LimitSettings;\n\treadonly dsn: DsnSettings;\n\treadonly concurrency: number;\n\treadonly perDomain: number;\n\treadonly leaseMs: number;\n\treadonly pollInterval: number;\n\treadonly owner: string;\n\treadonly now: () => number;\n\treadonly send: Sender;\n\treadonly random: () => number;\n}\n\nconst HOSTNAME =\n\t/^(?=.{1,253}$)[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)*$/;\n\n/** The options, checked, with their defaults; `INVALID` names the first wrong one. */\nexport function settingsOf(options: QueueOptions): Settings {\n\tif (typeof options !== 'object' || options === null) {\n\t\tthrow invalid('createQueue() takes an options object');\n\t}\n\tif (typeof options.store?.claim !== 'function') {\n\t\tthrow invalid('store must be a QueueStore, such as MemoryQueueStore');\n\t}\n\tconst { hostname } = options;\n\tif (typeof hostname !== 'string' || !HOSTNAME.test(hostname)) {\n\t\tthrow invalid(\n\t\t\t`hostname must be this server's public host name, not ${hostname}`,\n\t\t);\n\t}\n\tcheckRoutes(options);\n\tcheckSessions(options);\n\tconst owner = checkOwner(options.owner ?? crypto.randomUUID());\n\tconst clock = options.clock;\n\treturn {\n\t\toptions,\n\t\thostname,\n\t\troutes: new Map(\n\t\t\tObject.entries(options.routes ?? {}).map(([d, r]) => [\n\t\t\t\td.toLowerCase(),\n\t\t\t\tr,\n\t\t\t]),\n\t\t),\n\t\tretry: retryOf(options),\n\t\tlimits: limitsOf(options),\n\t\tdsn: dsnOf(options, hostname),\n\t\tconcurrency: numberOf('concurrency', options.concurrency, 20, 1),\n\t\tperDomain: numberOf('perDomain', options.perDomain, 2, 1),\n\t\tleaseMs: numberOf(\n\t\t\t'leaseMs',\n\t\t\toptions.leaseMs,\n\t\t\t10 * MINUTE,\n\t\t\t1000,\n\t\t\t3 * MAX_TIMER,\n\t\t),\n\t\tpollInterval: numberOf(\n\t\t\t'pollInterval',\n\t\t\toptions.pollInterval,\n\t\t\t5000,\n\t\t\t1,\n\t\t\tMAX_TIMER,\n\t\t),\n\t\towner,\n\t\tnow: clock ? () => clock.now() : Date.now,\n\t\tsend: options.send ?? sendMail,\n\t\trandom: options.random ?? Math.random,\n\t};\n}\n",
14
16
  "import { invalid } from '../../errors';\n\nexport const MINUTE = 60_000;\nexport const HOUR = 60 * MINUTE;\n/** The longest delay a timer takes: past it, Bun fires after 1 ms. */\nexport const MAX_TIMER = 2_147_483_647;\n\n/** A number in `[min, max]`, integer when asked, or its default. */\nexport function numberOf(\n\tname: string,\n\tvalue: unknown,\n\tfallback: number,\n\tmin: number,\n\tmax = Number.MAX_SAFE_INTEGER,\n\tinteger = true,\n): number {\n\tif (value === undefined) return fallback;\n\tconst ok =\n\t\ttypeof value === 'number' &&\n\t\t(integer ? Number.isInteger(value) : Number.isFinite(value)) &&\n\t\tvalue >= min &&\n\t\tvalue <= max;\n\tif (!ok) {\n\t\tconst kind = integer ? 'an integer' : 'a number';\n\t\tconst range =\n\t\t\tmax === Number.MAX_SAFE_INTEGER\n\t\t\t\t? `of at least ${min}`\n\t\t\t\t: `from ${min} to ${max}`;\n\t\tthrow invalid(`${name} must be ${kind} ${range}, not ${value}`);\n\t}\n\treturn value as number;\n}\n",
15
17
  "import { invalid } from '../../errors';\nimport { checkAddress } from '../envelope';\nimport type { QueueOptions } from '../options';\nimport { HOUR, numberOf } from './numbers';\n\nexport interface DsnSettings {\n\treadonly from: string;\n\treadonly delayAfter: number | false;\n\treadonly returnContent: 'headers' | 'full';\n}\n\nexport function dsnOf(options: QueueOptions, hostname: string): DsnSettings {\n\tconst d = options.dsn ?? {};\n\tconst from = checkAddress('dsn.from', d.from ?? `postmaster@${hostname}`);\n\tconst delayAfter =\n\t\td.delayAfter === false\n\t\t\t? false\n\t\t\t: numberOf('dsn.delayAfter', d.delayAfter, 4 * HOUR, 0);\n\tconst returnContent = d.returnContent ?? 'headers';\n\tif (returnContent !== 'headers' && returnContent !== 'full') {\n\t\tthrow invalid(\n\t\t\t`dsn.returnContent must be 'headers' or 'full', not ${returnContent}`,\n\t\t);\n\t}\n\treturn { from, delayAfter, returnContent };\n}\n",
16
- "import type { QueueOptions } from '../options';\nimport { HOUR, MINUTE, numberOf } from './numbers';\n\nexport interface RetrySettings {\n\treadonly first: number;\n\treadonly factor: number;\n\treadonly max: number;\n\treadonly jitter: number;\n\treadonly giveUpAfter: number;\n}\n\nexport interface LimitSettings {\n\treadonly maxMessageSize: number;\n\treadonly maxRecipients: number;\n\treadonly maxItems: number | undefined;\n\treadonly maxReplyText: number;\n\treadonly maxDsnReturn: number;\n}\n\nexport function retryOf(options: QueueOptions): RetrySettings {\n\tconst r = options.retry ?? {};\n\tconst first = numberOf('retry.first', r.first, 30 * MINUTE, 1);\n\treturn {\n\t\tfirst,\n\t\tfactor: numberOf('retry.factor', r.factor, 2, 1, 100, false),\n\t\tmax: numberOf('retry.max', r.max, Math.max(first, 4 * HOUR), first),\n\t\tjitter: numberOf('retry.jitter', r.jitter, 0.1, 0, 1, false),\n\t\tgiveUpAfter: numberOf('retry.giveUpAfter', r.giveUpAfter, 120 * HOUR, 0),\n\t};\n}\n\nexport function limitsOf(options: QueueOptions): LimitSettings {\n\tconst l = options.limits ?? {};\n\treturn {\n\t\tmaxMessageSize: numberOf(\n\t\t\t'limits.maxMessageSize',\n\t\t\tl.maxMessageSize,\n\t\t\t25 * 1024 * 1024,\n\t\t\t1,\n\t\t),\n\t\tmaxRecipients: numberOf('limits.maxRecipients', l.maxRecipients, 100, 1),\n\t\tmaxItems:\n\t\t\tl.maxItems === undefined\n\t\t\t\t? undefined\n\t\t\t\t: numberOf('limits.maxItems', l.maxItems, 0, 1),\n\t\tmaxReplyText: numberOf('limits.maxReplyText', l.maxReplyText, 512, 64, 900),\n\t\tmaxDsnReturn: numberOf('limits.maxDsnReturn', l.maxDsnReturn, 64 * 1024, 0),\n\t};\n}\n",
18
+ "import { DEFAULT_MAX_RETURN } from '../../dsn/policy';\nimport type { QueueOptions } from '../options';\nimport { HOUR, MINUTE, numberOf } from './numbers';\n\nexport interface RetrySettings {\n\treadonly first: number;\n\treadonly factor: number;\n\treadonly max: number;\n\treadonly jitter: number;\n\treadonly giveUpAfter: number;\n}\n\nexport interface LimitSettings {\n\treadonly maxMessageSize: number;\n\treadonly maxRecipients: number;\n\treadonly maxItems: number | undefined;\n\treadonly maxReplyText: number;\n\treadonly maxDsnReturn: number;\n}\n\nexport function retryOf(options: QueueOptions): RetrySettings {\n\tconst r = options.retry ?? {};\n\tconst first = numberOf('retry.first', r.first, 30 * MINUTE, 1);\n\treturn {\n\t\tfirst,\n\t\tfactor: numberOf('retry.factor', r.factor, 2, 1, 100, false),\n\t\tmax: numberOf('retry.max', r.max, Math.max(first, 4 * HOUR), first),\n\t\tjitter: numberOf('retry.jitter', r.jitter, 0.1, 0, 1, false),\n\t\tgiveUpAfter: numberOf('retry.giveUpAfter', r.giveUpAfter, 120 * HOUR, 0),\n\t};\n}\n\nexport function limitsOf(options: QueueOptions): LimitSettings {\n\tconst l = options.limits ?? {};\n\treturn {\n\t\tmaxMessageSize: numberOf(\n\t\t\t'limits.maxMessageSize',\n\t\t\tl.maxMessageSize,\n\t\t\t25 * 1024 * 1024,\n\t\t\t1,\n\t\t),\n\t\tmaxRecipients: numberOf('limits.maxRecipients', l.maxRecipients, 100, 1),\n\t\tmaxItems:\n\t\t\tl.maxItems === undefined\n\t\t\t\t? undefined\n\t\t\t\t: numberOf('limits.maxItems', l.maxItems, 0, 1),\n\t\tmaxReplyText: numberOf('limits.maxReplyText', l.maxReplyText, 512, 64, 900),\n\t\tmaxDsnReturn: numberOf(\n\t\t\t'limits.maxDsnReturn',\n\t\t\tl.maxDsnReturn,\n\t\t\tDEFAULT_MAX_RETURN,\n\t\t\t0,\n\t\t),\n\t};\n}\n",
17
19
  "import { invalid } from '../../errors';\nimport type { QueueOptions } from '../options';\nimport { MAX_TIMER, numberOf } from './numbers';\n\n/** The longest wait `sendMail` takes, in seconds: its timer's own limit. */\nconst MAX_SECONDS = Math.floor(MAX_TIMER / 1000);\n\nfunction checkSeconds(name: string, value: unknown): void {\n\tif (value === undefined) return;\n\tif (\n\t\ttypeof value !== 'number' ||\n\t\t!Number.isFinite(value) ||\n\t\tvalue <= 0 ||\n\t\tvalue > MAX_SECONDS\n\t) {\n\t\tthrow invalid(\n\t\t\t`${name} must be a number of seconds above 0 and at most ${MAX_SECONDS}, not ${value}`,\n\t\t);\n\t}\n}\n\nexport function checkTls(name: string, tls: unknown): void {\n\tif (\n\t\ttls !== undefined &&\n\t\ttls !== 'opportunistic' &&\n\t\ttls !== 'required' &&\n\t\ttls !== 'none'\n\t) {\n\t\tthrow invalid(\n\t\t\t`${name} must be 'opportunistic', 'required' or 'none', not ${tls}`,\n\t\t);\n\t}\n}\n\n/** What every session takes, whatever its route: the MX port and TLS, the timeouts. */\nexport function checkSessions(options: QueueOptions): void {\n\tnumberOf('mxPort', options.mxPort, 25, 1, 65535);\n\tcheckTls('mxTls', options.mxTls);\n\tconst timeouts = options.timeouts;\n\tif (timeouts !== undefined) {\n\t\tif (typeof timeouts !== 'object' || timeouts === null) {\n\t\t\tthrow invalid('timeouts must be an object of seconds');\n\t\t}\n\t\tfor (const [step, value] of Object.entries(timeouts)) {\n\t\t\tcheckSeconds(`timeouts.${step}`, value);\n\t\t}\n\t}\n\tcheckSeconds('deadline', options.deadline);\n}\n",
18
20
  "import { invalid } from '../../errors';\nimport type { QueueOptions, Route, Smarthost } from '../options';\nimport { numberOf } from './numbers';\nimport { checkTls } from './sessions';\n\n/**\n * A smarthost `sendMail` will take, checked now rather than at each\n * delivery: a host, a port, a TLS mode, and credentials only over TLS\n * whose certificate is checked — `sendMail`'s own rule\n * (`@bumail/smtp`'s `client/settings.ts`), with no way out for a test.\n */\nfunction checkRoute(name: string, route: Route): void {\n\tif (route === 'mx') return;\n\tconst smarthost = route as Smarthost | undefined;\n\tconst host = smarthost?.host;\n\tif (typeof host !== 'string' || !/^[^\\s/]+$/.test(host)) {\n\t\tthrow invalid(`${name} must be 'mx' or a smarthost with a host`);\n\t}\n\tconst { port, secure, tls, auth } = smarthost as Smarthost;\n\tnumberOf(`${name}.port`, port, 25, 1, 65535);\n\tif (secure !== undefined && typeof secure !== 'boolean') {\n\t\tthrow invalid(`${name}.secure must be true or false, not ${secure}`);\n\t}\n\tcheckTls(`${name}.tls`, tls);\n\tif (tls === 'none' && secure) {\n\t\tthrow invalid(\n\t\t\t`${name}.secure is TLS from the first byte: it cannot go with tls: 'none'`,\n\t\t);\n\t}\n\tif (auth === undefined) return;\n\tif (typeof auth?.username !== 'string' || auth.username === '') {\n\t\tthrow invalid(`${name}.auth.username must be a non-empty string`);\n\t}\n\tif (typeof auth.password !== 'string' || auth.password === '') {\n\t\tthrow invalid(`${name}.auth.password must be a non-empty string`);\n\t}\n\tconst { mechanism } = auth;\n\tif (\n\t\tmechanism !== undefined &&\n\t\tmechanism !== 'PLAIN' &&\n\t\tmechanism !== 'LOGIN'\n\t) {\n\t\tthrow invalid(\n\t\t\t`${name}.auth.mechanism must be 'PLAIN' or 'LOGIN', not ${mechanism}`,\n\t\t);\n\t}\n\tif (tls !== undefined && tls !== 'required') {\n\t\tthrow invalid(\n\t\t\t`${name}.auth needs tls: 'required', the default with auth: with tls: '${tls}' the password would go to a server whose certificate is not checked`,\n\t\t);\n\t}\n}\n\nexport function checkRoutes(options: QueueOptions): void {\n\tif (options.fallback !== undefined) {\n\t\tconst fallback = options.fallback as Route | null;\n\t\tif (\n\t\t\ttypeof fallback !== 'object' ||\n\t\t\tfallback === null ||\n\t\t\ttypeof fallback.host !== 'string'\n\t\t) {\n\t\t\tthrow invalid(\n\t\t\t\t'fallback must be a smarthost with a host, not an mx route',\n\t\t\t);\n\t\t}\n\t\tcheckRoute('fallback', fallback);\n\t}\n\tcheckRoute('route', options.route ?? 'mx');\n\tconst routes = Object.entries(options.routes ?? {});\n\tfor (const [domain, route] of routes)\n\t\tcheckRoute(`routes[\"${domain}\"]`, route);\n\tconst usesMx =\n\t\t(options.route ?? 'mx') === 'mx' || routes.some(([, r]) => r === 'mx');\n\tif (usesMx && typeof options.resolver?.mx !== 'function') {\n\t\tthrow invalid(\n\t\t\t\"The 'mx' route needs a resolver, such as @bumail/dns's nodeResolver()\",\n\t\t);\n\t}\n}\n",
19
21
  "import { isMailbox } from '@bumail/smtp/client';\nimport type { QueueItem, RecipientUpdate } from '../contract/types';\nimport { QueueError } from '../errors';\nimport { attemptGroup, type Used } from './attempt';\nimport { domainOf } from './envelope';\nimport type { Events } from './events';\nimport type { Lapse } from './lease';\nimport type { KeyedLimiter } from './limiter';\nimport { type NotifyContext, notify } from './notify';\nimport { type Settled, settle } from './settle';\n\nexport interface DeliveryContext extends NotifyContext {\n\treadonly domains: KeyedLimiter;\n\treadonly events: Events;\n\t/** The worker is stopping: a group not started yet is left for later. */\n\treadonly stopping: () => boolean;\n\t/** The outcome is recorded: the lease needs no more renewal. */\n\treadonly recorded: () => void;\n\t/**\n\t * Whether the lease could have passed to another worker by `now`: a\n\t * renewal found it taken, or its last expiry is past. `undefined` while\n\t * it surely held.\n\t */\n\treadonly leaseLapsed: (now: number) => Promise<Lapse | undefined>;\n}\n\n/**\n * Said when the item is gone at `complete` and the lease had lapsed. With\n * no record of who removed it, neither case can tell another worker that\n * finished it from a cancel, so each names both; either way what this\n * worker sent may have been sent again, and it reports no outcome.\n */\nconst goneAfter = (lapse: Lapse, id: string): QueueError =>\n\tnew QueueError(\n\t\t'LEASE_LOST',\n\t\tlapse === 'taken'\n\t\t\t? `The lease on ${id} was lost while it was delivered, and the item is gone: finished by the worker that took it, the message then sent twice, or cancelled`\n\t\t\t: `The lease on ${id} expired before its outcome was recorded, and the item is gone: lost to another worker that finished it, the message then sent twice, or cancelled`,\n\t);\n\n/** The recipients still to deliver, by domain. */\nfunction groupsOf(item: QueueItem): Map<string, string[]> {\n\tconst groups = new Map<string, string[]>();\n\tfor (const r of item.recipients) {\n\t\tif (r.status === 'delivered' || r.status === 'failed') continue;\n\t\tconst domain = domainOf(r.address);\n\t\tconst group = groups.get(domain);\n\t\tif (group) group.push(r.address);\n\t\telse groups.set(domain, [r.address]);\n\t}\n\treturn groups;\n}\n\n/**\n * Every recipient of an item whose sender `sendMail` would refuse — kept\n * by a store written to by other code, since `enqueue` refuses it — fails\n * at once, as X.1.7 (bad sender's mailbox address syntax), rather than be\n * deferred on every attempt until `retry.giveUpAfter`.\n */\nconst badSender = (address: string): RecipientUpdate => ({\n\taddress,\n\tstatus: 'failed',\n\treply: {\n\t\tstatus: '5.1.7',\n\t\ttext: \"The sender's address is not one SMTP can carry\",\n\t},\n});\n\n/**\n * A pending recipient of an item whose message the store no longer gives\n * — a Redis key evicted or deleted, a row removed by hand — fails at once,\n * as X.3.0 (mail system status): no session can send what cannot be read,\n * and an attempt left without an outcome would be claimed again at every\n * lease, forever, keeping its `maxItems` place.\n */\nconst unreadable = (address: string): RecipientUpdate => ({\n\taddress,\n\tstatus: 'failed',\n\treply: {\n\t\tstatus: '5.3.0',\n\t\ttext: 'Message unreadable: the queue store holds the item but not its message',\n\t},\n});\n\nconst unreadableError = (id: string): QueueError =>\n\tnew QueueError(\n\t\t'MESSAGE_UNREADABLE',\n\t\t`The message of ${id} is unreadable: the store holds the item but not its message, so every pending recipient failed`,\n\t);\n\n/** Tells the listeners each recipient's outcome. */\nfunction emitOutcomes(\n\tevents: Events,\n\titem: QueueItem,\n\tsettled: Settled,\n\tused: ReadonlyMap<string, Used>,\n): void {\n\tconst { attempts, nextAttemptAt } = settled.result;\n\tconst base = (u: RecipientUpdate) => ({\n\t\tid: item.id,\n\t\tfrom: item.from,\n\t\trecipient: u.address,\n\t\t...(u.reply ? { reply: u.reply } : {}),\n\t\tattempts,\n\t\t...used.get(u.address),\n\t});\n\tconst marked = (u: RecipientUpdate) => ({\n\t\t...(u.mayHaveReachedMx ? { mayHaveReachedMx: true as const } : {}),\n\t\t...(u.mayHaveReachedFallback\n\t\t\t? { mayHaveReachedFallback: true as const }\n\t\t\t: {}),\n\t});\n\tfor (const u of settled.delivered) events.emit('delivered', base(u));\n\tfor (const u of settled.deferred) {\n\t\tevents.emit('deferred', { ...base(u), ...marked(u), nextAttemptAt });\n\t}\n\tfor (const u of settled.failed) {\n\t\tevents.emit('failed', { ...base(u), ...marked(u) });\n\t}\n}\n\n/**\n * Delivers a claimed item: one session per recipient domain, at most\n * `perDomain` at once to each — none, and no slot taken, when its sender\n * is one `sendMail` would refuse — then the outcome recorded — which lets go\n * of the lease — then the events and the DSNs. An item whose message the\n * store no longer gives fails every pending recipient, said on the `error`\n * event, its DSN without the original.\n */\nexport async function deliverItem(\n\tctx: DeliveryContext,\n\titem: QueueItem,\n): Promise<void> {\n\tconst { store } = ctx;\n\tconst message = await store.readMessage(item.id);\n\tif (!message) {\n\t\t// Gone with its message: cancelled, or finished by another worker.\n\t\tif ((await store.get(item.id)) === undefined) return;\n\t\tconst failed = [...groupsOf(item).values()].flat().map(unreadable);\n\t\tawait record(ctx, item, failed, false, undefined, new Map());\n\t\treturn;\n\t}\n\tconst groups = groupsOf(item);\n\tlet skipped = false;\n\tconst used = new Map<string, Used>();\n\t// A sender sendMail would refuse: no session, no slot, every recipient at once.\n\tconst outcomes =\n\t\titem.from !== '' && !isMailbox(item.from)\n\t\t\t? [[...groups.values()].flat().map(badSender)]\n\t\t\t: await Promise.all(\n\t\t\t\t\t[...groups].map(async ([domain, group]) => {\n\t\t\t\t\t\tconst release = await ctx.domains.acquire(domain);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (ctx.stopping()) {\n\t\t\t\t\t\t\t\tskipped = true;\n\t\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn await attemptGroup(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\tdomain,\n\t\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\t\tused,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\trelease();\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\tawait record(ctx, item, outcomes.flat(), skipped, message, used);\n}\n\n/**\n * Records an attempt's outcomes — which lets go of the lease — then tells\n * the events and sends the DSNs, the original returned when there is one.\n * With no `message` (the store lost it), the `MESSAGE_UNREADABLE` error\n * comes first of the events, and only once the failures are recorded: a\n * lease lost meanwhile, or a `complete` that throws, says nothing of them,\n * and an item cancelled meanwhile tells nothing at all.\n */\nasync function record(\n\tctx: DeliveryContext,\n\titem: QueueItem,\n\tupdates: readonly RecipientUpdate[],\n\tskipped: boolean,\n\tmessage: Uint8Array | undefined,\n\tused: ReadonlyMap<string, Used>,\n): Promise<void> {\n\tconst { settings, store, events } = ctx;\n\tconst now = settings.now();\n\tconst settled = settle(item, updates, skipped, now, settings);\n\tconst after = await store.complete(item.id, settings.owner, settled.result);\n\tctx.recorded();\n\tif (!after && (await store.get(item.id)) === undefined) {\n\t\tconst lapse = await ctx.leaseLapsed(now);\n\t\tif (lapse) {\n\t\t\t// Lost or cancelled: no outcome told, as when the item is still there.\n\t\t\tevents.emit('error', { error: goneAfter(lapse, item.id), id: item.id });\n\t\t\treturn;\n\t\t}\n\t\t// Cancelled under a lease that held, with no session for a lost\n\t\t// message: nothing happened, and nothing was recorded, so nothing is told.\n\t\tif (!message) return;\n\t\t// Otherwise what the sessions did still happened; no DSN.\n\t\temitOutcomes(events, item, settled, used);\n\t\treturn;\n\t}\n\tif (!after) {\n\t\tconst error = new QueueError(\n\t\t\t'LEASE_LOST',\n\t\t\t`The lease on ${item.id} was lost before its outcome was recorded; another worker will try it again`,\n\t\t);\n\t\tevents.emit('error', { error, id: item.id });\n\t\treturn;\n\t}\n\tif (!message) {\n\t\tevents.emit('error', { error: unreadableError(item.id), id: item.id });\n\t}\n\temitOutcomes(events, item, settled, used);\n\tawait notify(ctx, item, message, 'failed', settled.failed, now);\n\t// SUCCESS asked, and the next hop listed no DSN: responsibility stays here (RFC 3461 §5.2.2).\n\tconst relayed = settled.delivered.filter((u) => u.dsnOffered === false);\n\tawait notify(ctx, item, message, 'relayed', relayed, now);\n\tif (settled.delayDsn) {\n\t\tawait notify(ctx, item, message, 'delayed', settled.deferred, now);\n\t}\n}\n",
@@ -31,7 +33,7 @@
31
33
  "import type { QueueItem } from '../contract/types';\nimport { deliverItem } from './deliver';\nimport { type LeaseState, lapsed, leaseOf, renew, settled } from './lease';\nimport { KeyedLimiter, Limiter } from './limiter';\nimport type { NotifyContext } from './notify';\n\n/**\n * Claims due items and delivers them, at most `concurrency` at once,\n * renewing each lease while its item is delivered. `start()` runs passes\n * every `pollInterval`, or at once when woken; `stop()` lets every\n * delivery under way finish and gives back what it had not started.\n */\nexport class Worker {\n\treadonly #ctx: NotifyContext;\n\treadonly #slots: Limiter;\n\treadonly #domains: KeyedLimiter;\n\treadonly #inFlight = new Set<Promise<void>>();\n\t#stopping = false;\n\t/** `start()` was called while a `stop()` was under way: start again once it ends. */\n\t#restart = false;\n\t#loop: Promise<void> | undefined;\n\t#wake: (() => void) | undefined;\n\t/** A wake came while no sleep was under way: the next sleep is skipped. */\n\t#woken = false;\n\n\tconstructor(ctx: NotifyContext) {\n\t\tthis.#ctx = ctx;\n\t\tthis.#slots = new Limiter(ctx.settings.concurrency);\n\t\tthis.#domains = new KeyedLimiter(ctx.settings.perDomain);\n\t}\n\n\t/** Renews the lease every third of it until the outcome is recorded, or a renewal ends them. */\n\t#renewing(lease: LeaseState): () => void {\n\t\tconst timer = setInterval(() => {\n\t\t\tvoid renew(this.#ctx, lease).then((more) => {\n\t\t\t\tif (!more) clearInterval(timer);\n\t\t\t});\n\t\t}, this.#ctx.settings.leaseMs / 3);\n\t\ttimer.unref?.();\n\t\treturn () => {\n\t\t\tlease.done = true;\n\t\t\tclearInterval(timer);\n\t\t};\n\t}\n\n\tasync #deliver(item: QueueItem): Promise<void> {\n\t\tconst lease = leaseOf(this.#ctx, item);\n\t\tconst stop = this.#renewing(lease);\n\t\ttry {\n\t\t\tawait deliverItem(\n\t\t\t\t{\n\t\t\t\t\t...this.#ctx,\n\t\t\t\t\tdomains: this.#domains,\n\t\t\t\t\tstopping: () => this.#stopping,\n\t\t\t\t\trecorded: stop,\n\t\t\t\t\tleaseLapsed: (now) => lapsed(lease, now),\n\t\t\t\t},\n\t\t\t\titem,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthis.#ctx.events.emit('error', { error, id: item.id });\n\t\t} finally {\n\t\t\tstop();\n\t\t\t// A refused renewal's look at the item ends with the delivery.\n\t\t\tawait settled(lease);\n\t\t}\n\t}\n\n\t/** The next due item, or `undefined` when nothing is, or the worker is stopping. */\n\t#claim(): Promise<QueueItem | undefined> {\n\t\tconst { settings, store } = this.#ctx;\n\t\tif (this.#stopping) return Promise.resolve(undefined);\n\t\treturn store.claim({\n\t\t\towner: settings.owner,\n\t\t\tnow: settings.now(),\n\t\t\tleaseMs: settings.leaseMs,\n\t\t});\n\t}\n\n\t/**\n\t * One pass: claims and delivers every item due, `concurrency` at a time,\n\t * claiming again as each one ends — so a DSN enqueued meanwhile goes in\n\t * the same pass. Resolves once all are done, with how many it claimed.\n\t */\n\tasync deliverDue(): Promise<number> {\n\t\tconst mine = new Set<Promise<void>>();\n\t\tlet claimed = 0;\n\t\twhile (!this.#stopping) {\n\t\t\tconst release = await this.#slots.acquire();\n\t\t\tlet item: QueueItem | undefined;\n\t\t\ttry {\n\t\t\t\titem = await this.#claim();\n\t\t\t} catch (error) {\n\t\t\t\trelease();\n\t\t\t\tawait Promise.all(mine);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (!item) {\n\t\t\t\trelease();\n\t\t\t\tif (mine.size === 0) break;\n\t\t\t\tawait Promise.race(mine);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tclaimed++;\n\t\t\tconst delivery: Promise<void> = this.#deliver(item).finally(() => {\n\t\t\t\trelease();\n\t\t\t\tmine.delete(delivery);\n\t\t\t\tthis.#inFlight.delete(delivery);\n\t\t\t});\n\t\t\tmine.add(delivery);\n\t\t\tthis.#inFlight.add(delivery);\n\t\t}\n\t\tawait Promise.all(mine);\n\t\treturn claimed;\n\t}\n\n\t/** Wakes a sleeping `start()` loop, or spares it its next sleep: something was enqueued. */\n\twake(): void {\n\t\tif (this.#wake) this.#wake();\n\t\telse this.#woken = true;\n\t}\n\n\tstart(): void {\n\t\tif (this.#stopping) {\n\t\t\tthis.#restart = true;\n\t\t\treturn;\n\t\t}\n\t\tif (this.#loop) return;\n\t\tthis.#loop = this.#run();\n\t}\n\n\tasync #sleep(): Promise<void> {\n\t\tif (this.#woken) {\n\t\t\tthis.#woken = false;\n\t\t\treturn;\n\t\t}\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timer = setTimeout(resolve, this.#ctx.settings.pollInterval);\n\t\t\tthis.#wake = () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t});\n\t\tthis.#wake = undefined;\n\t}\n\n\tasync #run(): Promise<void> {\n\t\twhile (!this.#stopping) {\n\t\t\tthis.#woken = false;\n\t\t\ttry {\n\t\t\t\tawait this.deliverDue();\n\t\t\t} catch (error) {\n\t\t\t\tthis.#ctx.events.emit('error', { error });\n\t\t\t}\n\t\t\tif (this.#stopping) break;\n\t\t\tawait this.#sleep();\n\t\t}\n\t}\n\n\t/**\n\t * Claims nothing more, lets every delivery under way end, and gives back\n\t * what was claimed but not started, due at once for the next worker. A\n\t * `start()` called meanwhile starts again once this ends.\n\t */\n\tasync stop(): Promise<void> {\n\t\tthis.#restart = false;\n\t\tthis.#stopping = true;\n\t\tthis.#wake?.();\n\t\tawait this.#loop;\n\t\tawait Promise.all(this.#inFlight);\n\t\tthis.#loop = undefined;\n\t\tthis.#stopping = false;\n\t\tif (this.#restart) {\n\t\t\tthis.#restart = false;\n\t\t\tthis.start();\n\t\t}\n\t}\n}\n",
32
34
  "import type { QueueItem, QueueListOptions } from '../contract/types';\nimport {\n\tcheckEnvelope,\n\tcheckLineEnds,\n\ttype MessageSource,\n\ttype QueueEnvelope,\n\treadMessage,\n} from './envelope';\nimport { Events, type QueueEvents, type QueueListener } from './events';\nimport type { QueueOptions } from './options';\nimport { settingsOf } from './settings';\nimport { Worker } from './worker';\n\n/** The outbound queue: what the app enqueues, delivered across restarts. */\nexport interface Queue {\n\t/** This worker's name on its leases. */\n\treadonly owner: string;\n\t/**\n\t * Takes a message to send — already signed, as it will leave — with its\n\t * envelope, and keeps it in the store, every recipient pending, due at\n\t * once. Refuses with `INVALID`, `MESSAGE_TOO_BIG`,\n\t * `TOO_MANY_RECIPIENTS` or `QUEUE_FULL`. The queue sends whatever it is\n\t * given: authenticate the submitter before you enqueue.\n\t */\n\tenqueue(message: MessageSource, envelope: QueueEnvelope): Promise<QueueItem>;\n\t/** One pass by hand: delivers every item due now; resolves with how many it claimed. */\n\tdeliverDue(): Promise<number>;\n\t/** Delivers in the background: a pass every `pollInterval`, and at once after `enqueue`. */\n\tstart(): void;\n\t/** Claims nothing more, lets the deliveries under way end, and gives back the rest. */\n\tstop(): Promise<void>;\n\t/** Listens to an event; returns what stops listening. */\n\ton<E extends keyof QueueEvents>(\n\t\tevent: E,\n\t\tlistener: QueueListener<E>,\n\t): () => void;\n\t/** The items in the queue, the next due first. */\n\tlist(options?: QueueListOptions): Promise<QueueItem[]>;\n\tget(id: string): Promise<QueueItem | undefined>;\n\t/**\n\t * Makes an item due now, and wakes the worker. False when there is no\n\t * such item, or when a worker is delivering it: its outcome sets the\n\t * next attempt, so asking now would change nothing.\n\t */\n\tretryNow(id: string): Promise<boolean>;\n\t/** Drops an item, its message and its recipients, with no DSN; the item as it stood, or `undefined`. */\n\tcancel(id: string): Promise<QueueItem | undefined>;\n}\n\n/**\n * Creates the queue over a store. Nothing is delivered until `start()`,\n * or `deliverDue()` by hand. Several queues — in one process or several —\n * may share a store: each claims items under its own `owner`.\n */\nexport function createQueue(options: QueueOptions): Queue {\n\tconst settings = settingsOf(options);\n\tconst store = options.store;\n\tconst events = new Events();\n\tconst worker = new Worker({ settings, store, events });\n\tconst { limits } = settings;\n\treturn {\n\t\towner: settings.owner,\n\t\tasync enqueue(message, envelope) {\n\t\t\tconst { from, to, ...dsn } = checkEnvelope(\n\t\t\t\tenvelope,\n\t\t\t\tlimits.maxRecipients,\n\t\t\t);\n\t\t\tconst bytes = await readMessage(message, limits.maxMessageSize);\n\t\t\tcheckLineEnds(bytes);\n\t\t\tconst item = await store.add(\n\t\t\t\t{ from, to, message: bytes, createdAt: settings.now(), ...dsn },\n\t\t\t\tlimits.maxItems === undefined ? {} : { maxItems: limits.maxItems },\n\t\t\t);\n\t\t\tworker.wake();\n\t\t\treturn item;\n\t\t},\n\t\tdeliverDue: () => worker.deliverDue(),\n\t\tstart: () => worker.start(),\n\t\tstop: () => worker.stop(),\n\t\ton: (event, listener) => events.on(event, listener),\n\t\tlist: (listOptions) => store.list(listOptions),\n\t\tget: (id) => store.get(id),\n\t\tasync retryNow(id) {\n\t\t\tconst now = settings.now();\n\t\t\tconst lease = (await store.get(id))?.lease;\n\t\t\tif (lease && lease.expiresAt > now) return false;\n\t\t\tconst moved = await store.reschedule(id, now);\n\t\t\tif (moved) worker.wake();\n\t\t\treturn moved;\n\t\t},\n\t\tcancel: (id) => store.cancel(id),\n\t};\n}\n"
33
35
  ],
34
- "mappings": ";;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,gBAGC;AAAA,gBACA;AAAA;;;ACFD,IAAM,KAAK;AACX,IAAM,KAAK;AAGJ,IAAM,WAAW;AAExB,IAAM,iBAAiB,CAAC,SACvB,SAAS,aAAa,QAAQ,OAAQ,OAAO;AAO9C,SAAS,IAAI,CAAC,OAA+B;AAAA,EAC5C,MAAM,MAAgB,CAAC;AAAA,EACvB,IAAI,SAAS;AAAA,EACb,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACtC,MAAM,OAAO,MAAM;AAAA,IACnB,IAAI,SAAS,MAAM,SAAS,IAAI;AAAA,MAC/B,IAAI,KAAK,IAAI,EAAE;AAAA,MACf,SAAS;AAAA,MACT,IAAI,SAAS,MAAM,MAAM,IAAI,OAAO;AAAA,QAAI;AAAA,IACzC,EAAE,KAAK,IAAI,SAAS,UAAU;AAAA,MAC7B,IAAI,KAAK,IAAI;AAAA,MACb;AAAA,IACD,EAAE,KAAK,IAAI,WAAW,UAAU;AAAA,MAE/B,IAAI,eAAe,IAAI,GAAG;AAAA,QACzB,OAAO,eAAe,IAAI,GAAG,EAAE,CAAC,GAAG;AAAA,UAClC,IAAI,IAAI;AAAA,QACT;AAAA,QACA,KAAK,IAAI,GAAG,EAAE,KAAK,MAAM;AAAA,UAAM,IAAI,IAAI;AAAA,MACxC;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA,EACA,OAAO,WAAW,KAAK,GAAG;AAAA;AAI3B,SAAS,SAAS,CAAC,OAA2B;AAAA,EAC7C,SAAS,IAAI,EAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;AAAA,IAC1C,IACC,MAAM,OAAO,MACb,MAAM,IAAI,OAAO,MACjB,MAAM,IAAI,OAAO,MACjB,MAAM,IAAI,OAAO,IAChB;AAAA,MACD,OAAO,IAAI;AAAA,IACZ;AAAA,EACD;AAAA,EACA,OAAO,MAAM;AAAA;AAId,SAAS,UAAU,CAAC,OAAmB,KAAyB;AAAA,EAC/D,IAAI,MAAM,UAAU;AAAA,IAAK,OAAO;AAAA,EAChC,MAAM,MAAM,MAAM,SAAS,GAAG,GAAG,EAAE,YAAY,EAAE;AAAA,EACjD,OAAO,MAAM,SAAS,GAAG,MAAM,CAAC;AAAA;AAiB1B,SAAS,QAAQ,CACvB,UACA,MACA,KACW;AAAA,EACX,MAAM,UAAU,KAAK,SAAS,SAAS,GAAG,MAAM,IAAI,CAAC,CAAC;AAAA,EACtD,MAAM,QAAQ,SAAS,UAAU,OAAO,QAAQ,UAAU;AAAA,EAC1D,MAAM,OACL,SAAS,SAAS,SACf,UACA,WAAW,QAAQ,SAAS,GAAG,UAAU,OAAO,CAAC,GAAG,GAAG;AAAA,EAC3D,OAAO;AAAA,IACN,MAAM,SAAS,SAAS,SAAS,mBAAmB;AAAA,IACpD;AAAA,IACA,UAAU,KAAK,KAAK,CAAC,SAAS,OAAO,GAAI;AAAA,EAC1C;AAAA;;;AC7FD;AAoCA,IAAM,QAAQ,CAAC,SAAiB,gBAAgB,MAAM,EAAE;AAGxD,IAAM,cAAc;AAQb,SAAS,YAAY,CAAC,SAAyB;AAAA,EACrD,MAAM,QAAQ,aAAa,OAAO;AAAA,EAClC,IAAI,QAAQ,KAAK;AAAA,IAAG,OAAO,WAAW;AAAA,EAEtC,OAAO,UAAU,eAAe,KAAK,EAAE,MAAM,GAAG,WAAW;AAAA;AAG5D,IAAM,eAAe,CAAC,YAAoB,MAAM,OAAO,EAAE,QAAQ,WAAW,EAAE;AAC9E,IAAM,UAAU,CAAC,SAAiB,iBAAiB,KAAK,IAAI;AAG5D,SAAS,cAAc,CAAC,OAAuB;AAAA,EAC9C,IAAI,UAAU;AAAA,EACd,WAAW,KAAK,OAAO;AAAA,IACtB,WAAW,cAAc,KAAK,CAAC,IAC5B,IACA,QAAQ,EAAE,YAAY,CAAC,KAAK,GAAG,SAAS,EAAE,EAAE,YAAY;AAAA,EAC5D;AAAA,EACA,OAAO;AAAA;AAIR,IAAM,YAAY,CAAC,SAClB,QAAQ,6BAA6B,KAAK,IAAI,IAAI,QAAQ,SAAS;AAM7D,SAAS,QAAQ,CAAC,MAAe,OAA4B;AAAA,EACnE,IAAI,OAAO;AAAA,IAAQ,OAAO,MAAM;AAAA,EAChC,IAAI,OAAO,SAAS,WAAW;AAAA,IAC9B,IAAI,MAAM,OAAO;AAAA,MAAK,OAAO;AAAA,IAC7B,OAAO,MAAM,QAAQ,MAAM,UAAU;AAAA,EACtC;AAAA,EACA,IAAI,SAAS,aAAa,SAAS;AAAA,IAAa,OAAO;AAAA,EACvD,OAAO,SAAS,WAAW,UAAU;AAAA;AAStC,SAAS,iBAAiB,CAAC,OAA8C;AAAA,EACxE,MAAM,OAAO,MAAM,KAAK,YAAY;AAAA,EACpC,IAAI,SAAS,YAAY,SAAS,SAAS;AAAA,IAG1C,MAAM,QAAQ,aAAa,MAAM,OAAO;AAAA,IACxC,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,eAAe,KAAK;AAAA,IAC3D,OAAO,MAAM,SAAS,cAAc,YAAY,aAAa,MAAM,OAAO;AAAA,EAC3E;AAAA,EACA,MAAM,UAAU,MAAM,MAAM,OAAO,EAAE,QAAQ,OAAO,EAAE;AAAA,EACtD,IACC,CAAC,uBAAuB,KAAK,MAAM,IAAI,KACvC,CAAC,uBAAuB,KAAK,OAAO,GACnC;AAAA,IACD;AAAA,EACD;AAAA,EACA,OAAO,GAAG,MAAM,KAAK,YAAY,MAAM;AAAA;AAIxC,SAAS,eAAe,CACvB,QACA,WACW;AAAA,EACX,QAAQ,UAAU;AAAA,EAClB,MAAM,WAAW,UAAU,SAAS,kBAAkB,UAAU,KAAK;AAAA,EACrE,MAAM,SAA6B;AAAA,IAClC,GAAI,WACA,CAAC,CAAC,sBAAsB,QAAQ,CAAC,IAClC,CAAC;AAAA,IACJ,CAAC,mBAAmB,aAAa,UAAU,OAAO,CAAC;AAAA,IACnD,CAAC,UAAU,OAAO,IAAI;AAAA,IACtB,CAAC,UAAU,SAAS,OAAO,MAAM,KAAK,CAAC;AAAA,EACxC;AAAA,EACA,MAAM,SAAS,UAAU,OAAO,IAAI;AAAA,EACpC,IAAI;AAAA,IAAQ,OAAO,KAAK,CAAC,cAAc,MAAM,CAAC;AAAA,EAC9C,IAAI,OAAO;AAAA,IACV,MAAM,OAAO,UAAU,MAAM,MAAM,GAAG;AAAA,IACtC,OAAO,KACN,MAAM,SAAS,YACZ,CAAC,mBAAmB,aAAa,MAAM,IACvC,CAAC,mBAAmB,SAAS,MAAM,QAAQ,MAAM,CACrD;AAAA,EACD;AAAA,EACA,OAAO,KAAK,CAAC,qBAAqB,WAAW,UAAU,WAAW,CAAC,CAAC;AAAA,EACpE,IAAI,OAAO,SAAS,aAAa,OAAO,gBAAgB;AAAA,IACvD,OAAO,KAAK,CAAC,oBAAoB,WAAW,OAAO,cAAc,CAAC,CAAC;AAAA,EACpE;AAAA,EACA,OAAO,OAAO,IAAI,EAAE,MAAM,WAAW,WAAW,MAAM,KAAK,CAAC;AAAA;AAOtD,SAAS,cAAc,CAAC,QAA8B;AAAA,EAC5D,MAAM,QAAQ,MAAM,OAAO,SAAS,EAAE,EAAE,KAAK;AAAA,EAC7C,MAAM,UAAU;AAAA,IACf,GAAI,UAAU,KAAK,CAAC,IAAI,CAAC,WAAW,wBAAwB,KAAK,CAAC;AAAA,IAClE,WAAW,iBAAiB,QAAQ,MAAM,OAAO,YAAY,GAAG;AAAA,IAChE,WAAW,gBAAgB,WAAW,OAAO,OAAO,CAAC;AAAA,EACtD,EAAE,KAAK;AAAA,CAAM;AAAA,EACb,MAAM,SAAS,OAAO,WAAW,IAAI,CAAC,MACrC,gBAAgB,QAAQ,CAAC,EAAE,KAAK;AAAA,CAAM,CACvC;AAAA,EACA,OAAO,GAAG,CAAC,SAAS,GAAG,MAAM,EAAE,KAAK;AAAA;AAAA,CAAU;AAAA;AAAA;;;AC7J/C,uBAAS;AAMF,IAAM,WAAoC;AAAA,EAChD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AACZ;AAGA,SAAS,OAAO,CAAC,OAA2B;AAAA,EAC3C,QAAQ,MAAM;AAAA,IACb,KAAK;AAAA,MACJ,OAAO;AAAA,QACN;AAAA,QACA;AAAA,MACD;AAAA,IACD,KAAK;AAAA,MACJ,OAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA,GAAI,MAAM,iBACP,CAAC,SAAS,YAAW,MAAM,cAAc,IAAI,IAC7C,CAAC;AAAA,QACJ;AAAA,MACD;AAAA,IACD,KAAK;AAAA,MACJ,OAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD,KAAK;AAAA,MACJ,OAAO,CAAC,qDAAqD;AAAA;AAAA;AAKzD,SAAS,SAAS,CAAC,OAAyB;AAAA,EAClD,MAAM,QAAQ;AAAA,IACb,8BAA8B,MAAM;AAAA,IACpC;AAAA,IACA,GAAG,QAAQ,KAAK;AAAA,EACjB;AAAA,EACA,IAAI,CAAC,MAAM,YAAY,MAAM,SAAS,aAAa;AAAA,IAClD,MAAM,KACL,IACA,uEACD;AAAA,EACD;AAAA,EACA,MAAM,KAAK,EAAE;AAAA,EACb,WAAW,KAAK,MAAM,YAAY;AAAA,IACjC,MAAM,OAAO,EAAE,QACZ,GAAG,EAAE,MAAM,QAAQ,MAAM,UAAU,EAAE,MAAM,MAAM,GAAG,IAAI,KAAK,IAC7D,SAAS,MAAM,IAAI;AAAA,IACtB,MAAM,MACL,EAAE,OAAO,WAAW,UACjB,yCAAyC,SACzC;AAAA,IACJ,MAAM,KAAK,IAAI,UAAU,EAAE,SAAS,GAAG,OAAO,KAAK;AAAA,EACpD;AAAA,EACA,OAAO,GAAG,MAAM,KAAK;AAAA,CAAM;AAAA;AAAA;;;AHxB5B,IAAM,UAAU,IAAI;AACpB,IAAM,SAAQ,CAAC,SACd,gBAAgB,MAAM,EAAE,EAAE,QAAQ,WAAW,EAAE;AAGhD,SAAS,YAAY,CAAC,OAAiB,UAA4B;AAAA,EAClE,MAAM,UAAU,SAAS,MAAM;AAAA,EAC/B,MAAM,SAAS,OAAM,MAAM,YAAY;AAAA,EACvC,OAAO;AAAA,IACN,YAAW,QAAQ,YAAW,MAAM,IAAI,CAAC;AAAA,IACzC,YAAW,QAAQ,yBAAyB,OAAM,MAAM,IAAI,IAAI;AAAA,IAChE,YAAW,MAAM,IAAI,OAAM,MAAM,EAAE,IAAI;AAAA,IACvC,YAAW,WAAW,kBAAkB,OAAO,CAAC;AAAA,IAChD,YAAW,cAAc,IAAI,OAAO,WAAW,KAAK,SAAS;AAAA,IAE7D,YAAW,kBAAkB,cAAc;AAAA,IAC3C,YAAW,gBAAgB,KAAK;AAAA,IAChC,YACC,gBACA,4DAA4D,WAC7D;AAAA,EACD;AAAA;AAGD,IAAM,SAAS,CAAC,UAA6C;AAAA,EAC5D,MAAM,MAAM,IAAI,WAAW,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,EAClE,IAAI,KAAK;AAAA,EACT,WAAW,QAAQ,OAAO;AAAA,IACzB,IAAI,IAAI,MAAM,EAAE;AAAA,IAChB,MAAM,KAAK;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;AAIR,SAAS,WAAW,CAAC,SAA6B;AAAA,EACjD,MAAM,OAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,OAAO;AAAA,EACrD,UAAS;AAAA,IACR,MAAM,WAAW,SAAS,OAAO,WAAW;AAAA,IAC5C,IAAI,CAAC,KAAK,SAAS,QAAQ;AAAA,MAAG,OAAO;AAAA,EACtC;AAAA;AAaM,SAAS,QAAQ,CAAC,OAA6B;AAAA,EACrD,MAAM,WAAW,MAAM,WACpB,SAAS,MAAM,UAAU,MAAM,eAAe,MAAM,SAAS,IAC7D;AAAA,EACH,MAAM,WAAW,YAAY,UAAU,QAAQ,IAAI,UAAY;AAAA,EAC/D,MAAM,OAAO,sBAAsB,UAAU,KAAK,CAAC;AAAA,EACnD,MAAM,SAAS,eAAe;AAAA,IAC7B,MAAM,MAAM;AAAA,IACZ,cAAc,MAAM;AAAA,IACpB,SAAS,MAAM;AAAA,OACX,MAAM,UAAU,YAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,YAAY,MAAM;AAAA,OACd,MAAM,iBAAiB,EAAE,gBAAgB,MAAM,eAAe,IAAI,CAAC;AAAA,EACxE,CAAC;AAAA,EACD,MAAM,QAAQ;AAAA,IACb,GAAG,aAAa,OAAO,QAAQ;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EACA,MAAM,MAAM,KAAK;AAAA;AAAA,EACjB,IAAI,CAAC;AAAA,IAAU,OAAO,QAAQ,OAAO,GAAG,MAAM,KAAK;AAAA,CAAM;AAAA,EAAQ,KAAK;AAAA,EACtE,MAAM,OAAO;AAAA,IACZ,GAAG;AAAA,IACH,KAAK;AAAA,IACL,iBAAiB,SAAS;AAAA,IAC1B,GAAI,SAAS,WAAW,CAAC,iCAAiC,IAAI,CAAC;AAAA,IAC/D;AAAA,IACA;AAAA,EACD,EAAE,KAAK;AAAA,CAAM;AAAA,EACb,OAAO,OAAO;AAAA,IACb,QAAQ,OAAO,IAAI;AAAA,IACnB,SAAS;AAAA,IACT,QAAQ,OAAO;AAAA,EAAO,KAAK;AAAA,EAC5B,CAAC;AAAA;;;AI/HK,SAAS,KAAK,CAAC,MAAe,QAAqC;AAAA,EACzE,IAAI,WAAW;AAAA,IAAS,OAAO;AAAA,EAC/B,IAAI,WAAW;AAAA,IAAW,OAAO,SAAS,YAAY,SAAS;AAAA,EAC/D,MAAM,QAAQ;AAAA,IACb,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACZ;AAAA,EACA,OAAO,OAAO,SAAS,MAAM,KAAK;AAAA;AAQ5B,IAAM,WAAW,CACvB,KACA,aAEA,QAAQ,SAAS,YAAY,QAAQ,SAAS,SAAS;;;ACWjD,SAAS,YAAY,CAAC,OAAkD;AAAA,EAC9E,MAAM,SAAS,MAAM,WAAW,OAAO,CAAC,MAAM,MAAM,aAAa,EAAE,MAAM,CAAC;AAAA,EAC1E,IAAI,MAAM,OAAO,MAAM,OAAO,WAAW;AAAA,IAAG;AAAA,EAC5C,MAAM,OAAO,MAAM,QAAQ,IAAI;AAAA,EAC/B,OAAO,SAAS;AAAA,IACf,MAAM;AAAA,IACN,cAAc,MAAM;AAAA,IACpB,MAAM,MAAM;AAAA,IACZ,IAAI,MAAM;AAAA,IACV,SAAS,MAAM;AAAA,IACf;AAAA,OACI,MAAM,UAAU,YAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,YAAY,OAAO,IAAI,CAAC,OAAO;AAAA,MAC9B,SAAS,EAAE;AAAA,MACX,aAAa;AAAA,SACT,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,IACrC,EAAE;AAAA,OACE,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IAErD,eAAe;AAAA,IACf,WAAW,MAAM,aAAa,KAAK;AAAA,EACpC,CAAC;AAAA;;AC/DF;AA+CA,IAAM,UAAU;AAET,SAAS,YAAY,CAAC,MAAc,SAA0B;AAAA,EACpE,IACC,OAAO,YAAY,YACnB,QAAQ,SAAS,OACjB,WAAW,OAAO,KAClB,CAAC,QAAQ,KAAK,OAAO,KACrB,CAAC,UAAU,OAAO,GACjB;AAAA,IACD,MAAM,QACL,GAAG,8CAA8C,KAAK,UAAU,OAAO,GACxE;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAID,IAAM,WAAW,CAAC,YACxB,QAAQ,MAAM,QAAQ,YAAY,GAAG,IAAI,CAAC,EAAE,YAAY;AAGlD,SAAS,aAAa,CAC5B,UACA,eACkB;AAAA,EAClB,IAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AAAA,IACtD,MAAM,QAAQ,yCAAyC;AAAA,EACxD;AAAA,EACA,MAAM,OAAO,SAAS,SAAS,KAAK,KAAK,aAAa,QAAQ,SAAS,IAAI;AAAA,EAC3E,MAAM,OAAO,OAAO,SAAS,OAAO,WAAW,CAAC,SAAS,EAAE,IAAI,SAAS;AAAA,EACxE,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,IAC9C,MAAM,QAAQ,oCAAoC;AAAA,EACnD;AAAA,EACA,MAAM,OAAO,IAAI;AAAA,EACjB,MAAM,KAAe,CAAC;AAAA,EACtB,WAAW,WAAW,MAAM;AAAA,IAC3B,aAAa,kBAAkB,OAAO;AAAA,IACtC,MAAM,MAAM,GAAG,QAAQ,MAAM,GAAG,QAAQ,YAAY,GAAG,CAAC,KAAK,SAAS,OAAO;AAAA,IAC7E,IAAI,KAAK,IAAI,GAAG;AAAA,MAAG;AAAA,IACnB,KAAK,IAAI,GAAG;AAAA,IACZ,GAAG,KAAK,OAAO;AAAA,EAChB;AAAA,EACA,IAAI,GAAG,SAAS,eAAe;AAAA,IAC9B,MAAM,IAAI,YACT,uBACA,mBAAmB,GAAG,mCAAmC,eAC1D;AAAA,EACD;AAAA,EAIA,MAAM,QAAQ,CAAC,MACd,GAAG,EAAE,MAAM,GAAG,EAAE,YAAY,GAAG,CAAC,KAAK,SAAS,CAAC;AAAA,EAChD,MAAM,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,EACjD,MAAM,aAAa,MAAM,QAAQ,SAAS,UAAU,IACjD,SAAS,WACR,IAAI,CAAC,MAAM;AAAA,IACX,MAAM,SACL,OAAO,GAAG,YAAY,YAAY,KAAK,SAAS,EAAE,OAAO,IACtD,KAAK,IAAI,MAAM,EAAE,OAAO,CAAC,IACzB;AAAA,IACJ,OAAO,WAAW,YAAY,IAAI,KAAK,GAAG,SAAS,OAAO;AAAA,GAC1D,EACA,OACA,CAAC,GAAG,GAAG,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,YAAY,GAAG,OAAO,MAAM,CACpE,IACA,SAAS;AAAA,EACZ,OAAO;AAAA,IACN;AAAA,IACA;AAAA,OACI,SAAS,QAAQ,YAAY,CAAC,IAAI,EAAE,KAAK,SAAS,IAAI;AAAA,OACtD,SAAS,UAAU,YAAY,CAAC,IAAI,EAAE,OAAO,SAAS,MAAM;AAAA,OAC5D,eAAe,YAAY,CAAC,IAAI,EAAE,WAAW;AAAA,EAClD;AAAA;AAGD,IAAM,SAAS,CAAC,QACf,IAAI,YACH,mBACA,2CAA2C,WAC5C;AAED,IAAM,MAAK;AACX,IAAM,MAAK;AAOJ,SAAS,aAAa,CAAC,OAAyB;AAAA,EACtD,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACtC,MAAM,OAAO,MAAM;AAAA,IACnB,MAAM,OACL,SAAS,MACN,MAAM,IAAI,OAAO,MACjB,SAAS,QAAO,MAAM,KAAK,MAAM,IAAI,OAAO;AAAA,IAChD,IAAI,MAAM;AAAA,MACT,MAAM,QACL,2CAA2C,gCAC5C;AAAA,IACD;AAAA,EACD;AAAA;AAIM,eAAe,WAAW,CAChC,QACA,KACsB;AAAA,EACtB,IAAI,OAAO,WAAW;AAAA,IAAU,SAAS,IAAI,YAAY,EAAE,OAAO,MAAM;AAAA,EACxE,IAAI,kBAAkB,YAAY;AAAA,IACjC,IAAI,OAAO,SAAS;AAAA,MAAK,MAAM,OAAO,GAAG;AAAA,IACzC,OAAO,OAAO,MAAM;AAAA,EACrB;AAAA,EACA,IAAI,EAAE,kBAAkB,iBAAiB;AAAA,IACxC,MAAM,QACL,uEACD;AAAA,EACD;AAAA,EACA,MAAM,SAAuB,CAAC;AAAA,EAC9B,IAAI,OAAO;AAAA,EACX,MAAM,SAAS,OAAO,UAAU;AAAA,EAChC,IAAI;AAAA,IACH,UAAS;AAAA,MACR,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,MAC1C,IAAI;AAAA,QAAM;AAAA,MACV,IAAI,EAAE,iBAAiB,aAAa;AAAA,QACnC,MAAM,QAAQ,gDAAgD;AAAA,MAC/D;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,IAAI,OAAO;AAAA,QAAK,MAAM,OAAO,GAAG;AAAA,MAChC,OAAO,KAAK,KAAK;AAAA,IAClB;AAAA,IACC,OAAO,OAAO;AAAA,IACf,MAAM,OAAO,OAAO,EAAE,MAAM,MAAM,EAAE;AAAA,IACpC,MAAM;AAAA,IACL,QAAQ;AAAA,IACT,OAAO,YAAY;AAAA;AAAA,EAEpB,MAAM,QAAQ,IAAI,WAAW,IAAI;AAAA,EACjC,IAAI,KAAK;AAAA,EACT,WAAW,SAAS,QAAQ;AAAA,IAC3B,MAAM,IAAI,OAAO,EAAE;AAAA,IACnB,MAAM,MAAM;AAAA,EACb;AAAA,EACA,OAAO;AAAA;;;ACtHD,MAAM,OAAO;AAAA,EACV,aAAa,IAAI;AAAA,EAE1B,EAA+B,CAC9B,OACA,UACa;AAAA,IACb,IAAI,MAAM,KAAK,WAAW,IAAI,KAAK;AAAA,IACnC,IAAI,CAAC,KAAK;AAAA,MACT,MAAM,IAAI;AAAA,MACV,KAAK,WAAW,IAAI,OAAO,GAAG;AAAA,IAC/B;AAAA,IACA,IAAI,IAAI,QAA8B;AAAA,IACtC,OAAO,MAAM;AAAA,MACZ,IAAI,OAAO,QAA8B;AAAA;AAAA;AAAA,EAI3C,IAAiC,CAAC,OAAU,SAA+B;AAAA,IAC1E,WAAW,YAAY,KAAK,WAAW,IAAI,KAAK,KAAK,CAAC,GAAG;AAAA,MACxD,IAAI;AAAA,QACF,SAA8B,OAAO;AAAA,QACrC,MAAM;AAAA,IAGT;AAAA;AAEF;;;ACvGA;;;ACEO,IAAM,SAAS;AACf,IAAM,OAAO,KAAK;AAElB,IAAM,YAAY;AAGlB,SAAS,QAAQ,CACvB,MACA,OACA,UACA,KACA,MAAM,OAAO,kBACb,UAAU,MACD;AAAA,EACT,IAAI,UAAU;AAAA,IAAW,OAAO;AAAA,EAChC,MAAM,KACL,OAAO,UAAU,aAChB,UAAU,OAAO,UAAU,KAAK,IAAI,OAAO,SAAS,KAAK,MAC1D,SAAS,OACT,SAAS;AAAA,EACV,IAAI,CAAC,IAAI;AAAA,IACR,MAAM,OAAO,UAAU,eAAe;AAAA,IACtC,MAAM,QACL,QAAQ,OAAO,mBACZ,eAAe,QACf,QAAQ,UAAU;AAAA,IACtB,MAAM,QAAQ,GAAG,gBAAgB,QAAQ,cAAc,OAAO;AAAA,EAC/D;AAAA,EACA,OAAO;AAAA;;;ACnBD,SAAS,KAAK,CAAC,SAAuB,UAA+B;AAAA,EAC3E,MAAM,IAAI,QAAQ,OAAO,CAAC;AAAA,EAC1B,MAAM,OAAO,aAAa,YAAY,EAAE,QAAQ,cAAc,UAAU;AAAA,EACxE,MAAM,aACL,EAAE,eAAe,QACd,QACA,SAAS,kBAAkB,EAAE,YAAY,IAAI,MAAM,CAAC;AAAA,EACxD,MAAM,gBAAgB,EAAE,iBAAiB;AAAA,EACzC,IAAI,kBAAkB,aAAa,kBAAkB,QAAQ;AAAA,IAC5D,MAAM,QACL,sDAAsD,eACvD;AAAA,EACD;AAAA,EACA,OAAO,EAAE,MAAM,YAAY,cAAc;AAAA;;;ACLnC,SAAS,OAAO,CAAC,SAAsC;AAAA,EAC7D,MAAM,IAAI,QAAQ,SAAS,CAAC;AAAA,EAC5B,MAAM,QAAQ,SAAS,eAAe,EAAE,OAAO,KAAK,QAAQ,CAAC;AAAA,EAC7D,OAAO;AAAA,IACN;AAAA,IACA,QAAQ,SAAS,gBAAgB,EAAE,QAAQ,GAAG,GAAG,KAAK,KAAK;AAAA,IAC3D,KAAK,SAAS,aAAa,EAAE,KAAK,KAAK,IAAI,OAAO,IAAI,IAAI,GAAG,KAAK;AAAA,IAClE,QAAQ,SAAS,gBAAgB,EAAE,QAAQ,KAAK,GAAG,GAAG,KAAK;AAAA,IAC3D,aAAa,SAAS,qBAAqB,EAAE,aAAa,MAAM,MAAM,CAAC;AAAA,EACxE;AAAA;AAGM,SAAS,QAAQ,CAAC,SAAsC;AAAA,EAC9D,MAAM,IAAI,QAAQ,UAAU,CAAC;AAAA,EAC7B,OAAO;AAAA,IACN,gBAAgB,SACf,yBACA,EAAE,gBACF,KAAK,OAAO,MACZ,CACD;AAAA,IACA,eAAe,SAAS,wBAAwB,EAAE,eAAe,KAAK,CAAC;AAAA,IACvE,UACC,EAAE,aAAa,YACZ,YACA,SAAS,mBAAmB,EAAE,UAAU,GAAG,CAAC;AAAA,IAChD,cAAc,SAAS,uBAAuB,EAAE,cAAc,KAAK,IAAI,GAAG;AAAA,IAC1E,cAAc,SAAS,uBAAuB,EAAE,cAAc,KAAK,MAAM,CAAC;AAAA,EAC3E;AAAA;;;AC1CD,IAAM,cAAc,KAAK,MAAM,YAAY,IAAI;AAE/C,SAAS,YAAY,CAAC,MAAc,OAAsB;AAAA,EACzD,IAAI,UAAU;AAAA,IAAW;AAAA,EACzB,IACC,OAAO,UAAU,YACjB,CAAC,OAAO,SAAS,KAAK,KACtB,SAAS,KACT,QAAQ,aACP;AAAA,IACD,MAAM,QACL,GAAG,wDAAwD,oBAAoB,OAChF;AAAA,EACD;AAAA;AAGM,SAAS,QAAQ,CAAC,MAAc,KAAoB;AAAA,EAC1D,IACC,QAAQ,aACR,QAAQ,mBACR,QAAQ,cACR,QAAQ,QACP;AAAA,IACD,MAAM,QACL,GAAG,2DAA2D,KAC/D;AAAA,EACD;AAAA;AAIM,SAAS,aAAa,CAAC,SAA6B;AAAA,EAC1D,SAAS,UAAU,QAAQ,QAAQ,IAAI,GAAG,KAAK;AAAA,EAC/C,SAAS,SAAS,QAAQ,KAAK;AAAA,EAC/B,MAAM,WAAW,QAAQ;AAAA,EACzB,IAAI,aAAa,WAAW;AAAA,IAC3B,IAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AAAA,MACtD,MAAM,QAAQ,uCAAuC;AAAA,IACtD;AAAA,IACA,YAAY,MAAM,UAAU,OAAO,QAAQ,QAAQ,GAAG;AAAA,MACrD,aAAa,YAAY,QAAQ,KAAK;AAAA,IACvC;AAAA,EACD;AAAA,EACA,aAAa,YAAY,QAAQ,QAAQ;AAAA;;;ACpC1C,SAAS,UAAU,CAAC,MAAc,OAAoB;AAAA,EACrD,IAAI,UAAU;AAAA,IAAM;AAAA,EACpB,MAAM,YAAY;AAAA,EAClB,MAAM,OAAO,WAAW;AAAA,EACxB,IAAI,OAAO,SAAS,YAAY,CAAC,YAAY,KAAK,IAAI,GAAG;AAAA,IACxD,MAAM,QAAQ,GAAG,8CAA8C;AAAA,EAChE;AAAA,EACA,QAAQ,MAAM,QAAQ,KAAK,SAAS;AAAA,EACpC,SAAS,GAAG,aAAa,MAAM,IAAI,GAAG,KAAK;AAAA,EAC3C,IAAI,WAAW,aAAa,OAAO,WAAW,WAAW;AAAA,IACxD,MAAM,QAAQ,GAAG,0CAA0C,QAAQ;AAAA,EACpE;AAAA,EACA,SAAS,GAAG,YAAY,GAAG;AAAA,EAC3B,IAAI,QAAQ,UAAU,QAAQ;AAAA,IAC7B,MAAM,QACL,GAAG,uEACJ;AAAA,EACD;AAAA,EACA,IAAI,SAAS;AAAA,IAAW;AAAA,EACxB,IAAI,OAAO,MAAM,aAAa,YAAY,KAAK,aAAa,IAAI;AAAA,IAC/D,MAAM,QAAQ,GAAG,+CAA+C;AAAA,EACjE;AAAA,EACA,IAAI,OAAO,KAAK,aAAa,YAAY,KAAK,aAAa,IAAI;AAAA,IAC9D,MAAM,QAAQ,GAAG,+CAA+C;AAAA,EACjE;AAAA,EACA,QAAQ,cAAc;AAAA,EACtB,IACC,cAAc,aACd,cAAc,WACd,cAAc,SACb;AAAA,IACD,MAAM,QACL,GAAG,uDAAuD,WAC3D;AAAA,EACD;AAAA,EACA,IAAI,QAAQ,aAAa,QAAQ,YAAY;AAAA,IAC5C,MAAM,QACL,GAAG,sEAAsE,yEAC1E;AAAA,EACD;AAAA;AAGM,SAAS,WAAW,CAAC,SAA6B;AAAA,EACxD,IAAI,QAAQ,aAAa,WAAW;AAAA,IACnC,MAAM,WAAW,QAAQ;AAAA,IACzB,IACC,OAAO,aAAa,YACpB,aAAa,QACb,OAAO,SAAS,SAAS,UACxB;AAAA,MACD,MAAM,QACL,2DACD;AAAA,IACD;AAAA,IACA,WAAW,YAAY,QAAQ;AAAA,EAChC;AAAA,EACA,WAAW,SAAS,QAAQ,SAAS,IAAI;AAAA,EACzC,MAAM,SAAS,OAAO,QAAQ,QAAQ,UAAU,CAAC,CAAC;AAAA,EAClD,YAAY,QAAQ,UAAU;AAAA,IAC7B,WAAW,WAAW,YAAY,KAAK;AAAA,EACxC,MAAM,UACJ,QAAQ,SAAS,UAAU,QAAQ,OAAO,KAAK,IAAI,OAAO,MAAM,IAAI;AAAA,EACtE,IAAI,UAAU,OAAO,QAAQ,UAAU,OAAO,YAAY;AAAA,IACzD,MAAM,QACL,uEACD;AAAA,EACD;AAAA;;;ALzCD,IAAM,WACL;AAGM,SAAS,UAAU,CAAC,SAAiC;AAAA,EAC3D,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AAAA,IACpD,MAAM,QAAQ,uCAAuC;AAAA,EACtD;AAAA,EACA,IAAI,OAAO,QAAQ,OAAO,UAAU,YAAY;AAAA,IAC/C,MAAM,QAAQ,sDAAsD;AAAA,EACrE;AAAA,EACA,QAAQ,aAAa;AAAA,EACrB,IAAI,OAAO,aAAa,YAAY,CAAC,SAAS,KAAK,QAAQ,GAAG;AAAA,IAC7D,MAAM,QACL,wDAAwD,UACzD;AAAA,EACD;AAAA,EACA,YAAY,OAAO;AAAA,EACnB,cAAc,OAAO;AAAA,EACrB,MAAM,QAAQ,WAAW,QAAQ,SAAS,OAAO,WAAW,CAAC;AAAA,EAC7D,MAAM,QAAQ,QAAQ;AAAA,EACtB,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,QAAQ,IAAI,IACX,OAAO,QAAQ,QAAQ,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO;AAAA,MACpD,EAAE,YAAY;AAAA,MACd;AAAA,IACD,CAAC,CACF;AAAA,IACA,OAAO,QAAQ,OAAO;AAAA,IACtB,QAAQ,SAAS,OAAO;AAAA,IACxB,KAAK,MAAM,SAAS,QAAQ;AAAA,IAC5B,aAAa,SAAS,eAAe,QAAQ,aAAa,IAAI,CAAC;AAAA,IAC/D,WAAW,SAAS,aAAa,QAAQ,WAAW,GAAG,CAAC;AAAA,IACxD,SAAS,SACR,WACA,QAAQ,SACR,KAAK,QACL,MACA,IAAI,SACL;AAAA,IACA,cAAc,SACb,gBACA,QAAQ,cACR,MACA,GACA,SACD;AAAA,IACA;AAAA,IACA,KAAK,QAAQ,MAAM,MAAM,IAAI,IAAI,KAAK;AAAA,IACtC,MAAM,QAAQ,QAAQ;AAAA,IACtB,QAAQ,QAAQ,UAAU,KAAK;AAAA,EAChC;AAAA;;;AMzFD,sBAAS;;;ACAT,sBAAS;;;ACcF,IAAM,cAAc,CAAC,UAC3B,iBAAiB,SACjB,MAAM,SAAS,eACf,OAAQ,MAA6B,SAAS;AAOxC,IAAM,eAAe,CAAC,UAC5B,YAAY,KAAK,KAAK,MAAM,SAAS;AAGtC,IAAM,SAAS;AAGR,SAAS,YAAY,CAC3B,OACA,KACA,MACa;AAAA,EACb,MAAM,OACL,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,MAAM,KAAK,KAAK,GAAG;AAAA,EAClE,OAAO;AAAA,IACN,MAAM,MAAM;AAAA,OACR,MAAM,UAAU,OAAO,KAAK,MAAM,MAAM,IACzC,EAAE,QAAQ,MAAM,OAAO,IACvB,CAAC;AAAA,IACJ,MAAM,UAAU,MAAM,GAAG;AAAA,OACrB,OAAO,EAAE,MAAM,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC;AAAA,EAC9C;AAAA;AASD,IAAM,eAAuD;AAAA,EAC5D,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,gBAAgB;AACjB;AAQA,SAAS,iBAAiB,CACzB,OACA,WACA,KACA,MACa;AAAA,EACb,MAAM,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EAClE,MAAM,SAAS,YAAY,KAAK,IAC5B,aAAa,MAAM,SAAS,QAC7B;AAAA,EACH,OAAO;AAAA,IACN,QAAQ,GAAG,YAAY,IAAI,KAAK;AAAA,IAChC,MAAM,UAAU,MAAM,GAAG;AAAA,OACrB,OAAO,EAAE,MAAM,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC;AAAA,EAC9C;AAAA;AAIM,SAAS,UAAU,CACzB,QACA,OACA,KACoB;AAAA,EACpB,MAAM,OAAO,OAAO;AAAA,EACpB,MAAM,UAAU,IAAI;AAAA,EACpB,aAAa,eAAe,OAAO,UAAU;AAAA,IAC5C,QAAQ,IAAI,WAAW;AAAA,MACtB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,aAAa,OAAO,OAAO,KAAK,IAAI;AAAA,SAEvC,OAAO,eAAe,QAAQ,EAAE,YAAY,MAAM,IAAI,CAAC;AAAA,IAC5D,CAAC;AAAA,EACF;AAAA,EACA,aAAa,WAAW,WAAW,OAAO,UAAU;AAAA,IACnD,QAAQ,IAAI,WAAW;AAAA,MACtB,SAAS;AAAA,MACT,QAAQ,MAAM,QAAQ,MAAM,WAAW;AAAA,MACvC,OAAO,aAAa,OAAO,KAAK,IAAI;AAAA,IACrC,CAAC;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,IACZ,CAAC,YACA,QAAQ,IAAI,OAAO,KAAK;AAAA,IACvB;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,MACN,MAAM;AAAA,SACF,OAAO,EAAE,MAAM,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC;AAAA,IAC9C;AAAA,EACD,CACF;AAAA;AASM,SAAS,eAAe,CAC9B,OACA,OACA,KACA,MACoB;AAAA,EACpB,MAAM,WAAW,IAAI,IACpB,YAAY,KAAK,KACb,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,IACxD,CAAC,CACL;AAAA,EACA,MAAM,YACL,CAAC,YAAY,KAAK,KAAK,MAAM,aAAa,aAAa,KAAK;AAAA,EAC7D,OAAO,MAAM,IAAI,CAAC,YAA6B;AAAA,IAC9C,MAAM,MAAM,SAAS,IAAI,OAAO;AAAA,IAChC,IAAI,KAAK;AAAA,MACR,OAAO;AAAA,QACN;AAAA,QACA,QAAQ,IAAI,QAAQ,MAAM,WAAW;AAAA,QACrC,OAAO,aAAa,KAAK,KAAK,IAAI;AAAA,MACnC;AAAA,IACD;AAAA,IACA,MAAM,QACL,YAAY,KAAK,KAAK,MAAM,QACzB,aAAa,MAAM,OAAO,KAAK,IAAI,IACnC,kBAAkB,OAAO,WAAW,KAAK,IAAI;AAAA,IACjD,OAAO,EAAE,SAAS,QAAQ,YAAY,aAAa,UAAU,MAAM;AAAA,GACnE;AAAA;;;AC5JF,IAAM,aACL;AAGD,IAAM,WAAW;AA6BV,SAAS,SAAS,CACxB,OACA,OACU;AAAA,EACV,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EACnB,IAAI,YAAY,KAAK,KAAK,MAAM,aAAa,CAAC,MAAM;AAAA,IAAU,OAAO;AAAA,EACrE,IAAI,YAAY,KAAK,KAAK,MAAM,KAAK,WAAW,MAAM;AAAA,IAAG,OAAO;AAAA,EAChE,IAAI,SAAS,KAAK,MAAM,IAAI;AAAA,IAAG,OAAO;AAAA,EACtC,IAAI,MAAM,SAAS,WAAW;AAAA,IAC7B,OAAO,MAAM,WAAW,WAAW,MAAM,WAAW;AAAA,EACrD;AAAA,EACA,IAAI,MAAM,OAAO;AAAA,IAAK,OAAO;AAAA,EAC7B,IAAI,MAAM,WAAW,WAAW;AAAA,IAC/B,OAAO,iBAAiB,KAAK,MAAM,MAAM;AAAA,EAC1C;AAAA,EACA,OAAO,WAAW,KAAK,MAAM,IAAI;AAAA;;;AC9C3B,SAAS,OAAO,CAAC,UAAoB,QAAuB;AAAA,EAClE,OAAO,SAAS,OAAO,IAAI,MAAM,KAAK,SAAS,QAAQ,SAAS;AAAA;AAI1D,SAAS,MAAM,CAAC,OAAkC;AAAA,EACxD,OAAO,UAAU,OAAO,YAAY,MAAM;AAAA;AAQpC,SAAS,YAAY,CAC3B,MACA,OACwD;AAAA,EACxD,MAAM,OAAO,IAAI,IAAI,KAAK;AAAA,EAC1B,MAAM,aAAa,KAAK,WACtB,OACA,CAAC,MACA,KAAK,IAAI,EAAE,OAAO,MACjB,EAAE,WAAW,aAAa,EAAE,UAAU,UACzC,EACC,IAAI,CAAC,OAAO;AAAA,IACZ,SAAS,EAAE;AAAA,OACP,EAAE,WAAW,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO;AAAA,OACjD,EAAE,UAAU,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM;AAAA,EACnD,EAAE;AAAA,EACH,OAAO;AAAA,OACF,KAAK,QAAQ,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI;AAAA,OAC9C,KAAK,UAAU,YAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM;AAAA,OACpD,WAAW,WAAW,IAAI,CAAC,IAAI,EAAE,WAAW;AAAA,EACjD;AAAA;AAIM,SAAS,aAAa,CAC5B,UACA,QACA,MACA,IACA,UACkB;AAAA,EAClB,QAAQ,SAAS,aAAa;AAAA,EAC9B,MAAM,SAAS;AAAA,IACd;AAAA,IACA;AAAA,IACA,MAAM;AAAA,OACF,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,OACrD,QAAQ,aAAa,YAAY,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,EACxE;AAAA,EACA,MAAM,QAAQ,YAAY,QAAQ,UAAU,MAAM;AAAA,EAClD,IAAI,UAAU,MAAM;AAAA,IACnB,MAAM,WAAW,QAAQ;AAAA,IACzB,IAAI,CAAC;AAAA,MAAU,MAAM,IAAI,MAAM,0CAA0C;AAAA,IACzE,OAAO;AAAA,SACH;AAAA,MACH;AAAA,MACA;AAAA,SACI,QAAQ,WAAW,YAAY,EAAE,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,SAC3D,QAAQ,QAAQ,EAAE,KAAK,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC/C;AAAA,EACD;AAAA,EACA,OAAO;AAAA,OACH;AAAA,IACH,MAAM,MAAM;AAAA,OACR,MAAM,SAAS,YAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,OACnD,MAAM,WAAW,YAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,OACzD,MAAM,MAAM,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,OAClC,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,OACrC,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,EACpC;AAAA;;;AC/DD,IAAM,SAAS,CAAC,GAAoB,QACnC,EAAE,WAAW,cAAc,IAAI,KAAK,IAAI,MAAM,KAAK;AASpD,SAAS,QAAQ,CAChB,SACA,OAIA,KACoB;AAAA,EACpB,IAAI,CAAC,MAAM;AAAA,IAAU,OAAO,QAAQ,IAAI,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC;AAAA,EAG7D,MAAM,QAAQ,IAAI,IAAI,MAAM,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC5D,MAAM,UAAU,IAAI,KAClB,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAC3E;AAAA,EACA,OAAO,QAAQ,IAAI,CAAC,MAAO,QAAQ,IAAI,EAAE,OAAO,IAAI,IAAI,OAAO,GAAG,GAAG,CAAE;AAAA;AAajE,eAAe,OAAO,CAC5B,KACA,MACA,SACA,QACA,OACA,OACA,UACmB;AAAA,EACnB,QAAQ,aAAa;AAAA,EACrB,MAAM,MAAM,SAAS,OAAO;AAAA,EAC5B,IAAI;AAAA,IACH,MAAM,UAAU;AAAA,SACZ,cAAc,UAAU,QAAQ,KAAK,MAAM,OAAO,QAAQ;AAAA,SAC1D,aAAa,MAAM,KAAK;AAAA,IAC5B;AAAA,IACA,MAAM,SAAS,MAAM,SAAS,KAAK,SAAS,OAAO;AAAA,IACnD,OAAO,EAAE,SAAS,WAAW,QAAQ,OAAO,GAAG,EAAE;AAAA,IAChD,OAAO,OAAO;AAAA,IAEf,IAAI,aAAa,KAAK;AAAA,MAAG,IAAI,OAAO,KAAK,SAAS,EAAE,OAAO,IAAI,KAAK,GAAG,CAAC;AAAA,IACxE,MAAM,UAAU,gBAAgB,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,IAEhE,MAAM,MAAM,UAAU,OAAO,qBAAqB;AAAA,IAClD,MAAM,SACJ,UAAU,QAAQ,aAAa,cAChC,YAAY,KAAK,KACjB,MAAM;AAAA,IACP,OAAO,EAAE,SAAS,QAAQ,SAAS,SAAS,OAAO,GAAG,IAAI,SAAS,MAAM;AAAA;AAAA;;;ACrE3E,SAAS,MAAM,CAAC,IAAqB,IAAsC;AAAA,EAC1E,IAAI,GAAG,WAAW,cAAc,GAAG,WAAW,UAAU;AAAA,IACvD,OAAO,KAAK,IAAI,QAAQ,WAAW;AAAA,EACpC;AAAA,EACA,OAAO;AAAA;AAOR,IAAM,YAAY,CAAC,MAClB,EAAE,WAAW,WAAW,KAAK,GAAG,QAAQ,WAAW,IAAI;AASjD,eAAe,cAAc,CACnC,KACA,MACA,SACA,QACA,OACA,UACA,MAC6B;AAAA,EAE7B,MAAM,SAAS,IAAI,IAClB,KAAK,WAAW,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CACvE;AAAA,EACA,MAAM,KAAK,IAAI,IACd,MAAM,QACJ,OACA,CAAC,MACA,EAAE,WAAW,eACb,CAAC,EAAE,oBACH,CAAC,OAAO,IAAI,EAAE,OAAO,KACrB,UAAU,EAAE,OAAO,MAAM,KAAK,CAChC,EACC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAC5B;AAAA,EACA,IAAI,GAAG,SAAS;AAAA,IAAG,OAAO,MAAM;AAAA,EAChC,MAAM,SAAS,MAAM,QACpB,KACA,MACA,SACA,QACA,CAAC,GAAG,GAAG,KAAK,CAAC,GACb,UACA,QACD;AAAA,EACA,YAAY,SAAS,MAAM,IAAI;AAAA,IAC9B,KAAK,IAAI,SAAS;AAAA,MACjB,OAAO;AAAA,MACP,UAAU;AAAA,SACN,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,CAAC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACN,GAAG,MAAM,QAAQ,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC;AAAA,IACjD,GAAG,OAAO,QAAQ,IAAI,CAAC,MAAM;AAAA,MAC5B,MAAM,MAAM,GAAG,IAAI,EAAE,OAAO;AAAA,MAC5B,OAAO,MAAM,OAAO,KAAK,CAAC,IAAI;AAAA,KAC9B;AAAA,EACF;AAAA;AASM,SAAS,cAAc,CAC7B,MACA,OACA,MACA,UACW;AAAA,EACX,IAAI,CAAC,QAAQ,aAAa;AAAA,IAAW,OAAO,CAAC;AAAA,EAC7C,MAAM,OAAO,IAAI,IAChB,KAAK,WACH,OAAO,CAAC,MAAM,EAAE,0BAA0B,CAAC,EAAE,gBAAgB,EAC7D,IAAI,CAAC,MAAM,EAAE,OAAO,CACvB;AAAA,EACA,OAAO,MAAM,OAAO,CAAC,YAAY,KAAK,IAAI,OAAO,CAAC;AAAA;AAI5C,eAAe,WAAW,CAChC,KACA,MACA,SACA,QACA,MACA,UACA,MAC6B;AAAA,EAC7B,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO,CAAC;AAAA,EAC/B,WAAW,WAAW,MAAM;AAAA,IAC3B,KAAK,IAAI,SAAS,EAAE,OAAO,aAAa,UAAU,KAAK,CAAC;AAAA,EACzD;AAAA,EACA,MAAM,SAAS,MAAM,QACpB,KACA,MACA,SACA,QACA,MACA,UACA,QACD;AAAA,EACA,OAAO,OAAO,QAAQ,IAAI,SAAS;AAAA;;;AL7GpC,IAAM,aAAa,CAAC,aAAsC;AAAA,EACzD;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,EACP;AACD;AAUO,eAAe,YAAY,CACjC,KACA,MACA,SACA,QACA,YACA,MAC6B;AAAA,EAC7B,QAAQ,aAAa;AAAA,EACrB,MAAM,MAAM,WAAW,OAAO,CAAC,YAAY,CAAC,WAAU,OAAO,CAAC;AAAA,EAC9D,MAAM,QAAQ,WAAW,OAAO,UAAS;AAAA,EACzC,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO,IAAI,IAAI,UAAU;AAAA,EACjD,MAAM,QAAQ,QAAQ,UAAU,MAAM;AAAA,EACtC,MAAM,QAAQ,UAAU,OAAO,OAAO;AAAA,EACtC,WAAW,WAAW;AAAA,IAAO,KAAK,IAAI,SAAS,EAAE,OAAO,MAAM,CAAC;AAAA,EAC/D,QAAQ,aAAa,SAAS;AAAA,EAC9B,MAAM,OAAO,eAAe,MAAM,OAAO,UAAU,MAAM,QAAQ;AAAA,EAEjE,MAAM,OACL,aAAa,YACV,CAAC,IACD,MAAM,YAAY,KAAK,MAAM,SAAS,QAAQ,MAAM,UAAU,IAAI;AAAA,EACtE,MAAM,QAAQ,MAAM,OAAO,CAAC,YAAY,CAAC,KAAK,SAAS,OAAO,CAAC;AAAA,EAC/D,IAAI,UAA6B,CAAC;AAAA,EAClC,IAAI,MAAM,SAAS,GAAG;AAAA,IACrB,MAAM,QAAQ,MAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ,OAAO,KAAK;AAAA,IACpE,UACC,aAAa,aAAa,UAAU,OACjC,MAAM,eACN,KACA,MACA,SACA,QACA,OACA,UACA,IACD,IACC,MAAM;AAAA,EACX;AAAA,EACA,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,UAAU,CAAC;AAAA;;;AMpE7C,SAAS,UAAU,CACzB,UACA,OACA,QACS;AAAA,EACT,MAAM,WAAW,KAAK,IAAI,GAAG,WAAW,CAAC;AAAA,EACzC,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,MAAM,UAAU,UAAU,MAAM,GAAG;AAAA,EACxE,OAAO,QAAQ,QAAQ,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA;AAIjE,IAAM,WAAW,CAAC,WAAmB,UAC3C,YAAY,MAAM;AAOZ,SAAS,aAAa,CAC5B,WACA,KACA,UACA,OACA,QACqB;AAAA,EACrB,MAAM,MAAM,SAAS,WAAW,KAAK;AAAA,EACrC,IAAI,OAAO;AAAA,IAAK;AAAA,EAChB,OAAO,KAAK,IAAI,MAAM,WAAW,UAAU,OAAO,MAAM,GAAG,GAAG;AAAA;;;ACpB/D,IAAM,mBACL;AAGD,IAAM,4BACL;AAGD,SAAS,QAAQ,CAAC,GAAoB,MAAuC;AAAA,EAC5E,MAAM,OAAO;AAAA,IACZ,GAAI,EAAE,mBAAmB,CAAC,gBAAgB,IAAI,CAAC;AAAA,IAC/C,GAAI,EAAE,yBAAyB,CAAC,yBAAyB,IAAI,CAAC;AAAA,EAC/D;AAAA,EACA,IAAI,SAAS,YAAY,KAAK,WAAW;AAAA,IAAG,OAAO,EAAE;AAAA,EACrD,MAAM,QAAoB,EAAE,SAAS,EAAE,MAAM,GAAG;AAAA,EAChD,OAAO;AAAA,OACH;AAAA,IACH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG;AAAA,EAC7D;AAAA;AAcM,eAAe,MAAM,CAC3B,KACA,MACA,SACA,MACA,YACA,KACgB;AAAA,EAChB,MAAM,SAAS,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;AAAA,EACjE,MAAM,SAAS,WAAW,OAAO,CAAC,MACjC,MAAM,MAAM,OAAO,IAAI,EAAE,OAAO,GAAG,MAAM,CAC1C;AAAA,EACA,IAAI,KAAK,SAAS,MAAM,OAAO,WAAW;AAAA,IAAG;AAAA,EAC7C,QAAQ,UAAU,OAAO,WAAW;AAAA,EACpC,IAAI;AAAA,IACH,MAAM,cAAc,IAAI,KAAK,GAAG;AAAA,IAChC,MAAM,MAAM,SAAS;AAAA,MACpB;AAAA,MACA,cAAc,SAAS;AAAA,MACvB,MAAM,SAAS,IAAI;AAAA,MACnB,IAAI,KAAK;AAAA,MACT,SAAS,IAAI,KAAK,KAAK,SAAS;AAAA,MAChC,MAAM;AAAA,SACF,KAAK,UAAU,YAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM;AAAA,MACxD,YAAY,OAAO,IAAI,CAAC,MAAM;AAAA,QAC7B,MAAM,QAAQ,SAAS,GAAG,IAAI;AAAA,QAC9B,MAAM,QAAQ,OAAO,IAAI,EAAE,OAAO,GAAG;AAAA,QACrC,OAAO;AAAA,UACN,SAAS,EAAE;AAAA,aACP,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,UACzB;AAAA,aACI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,QAC1B;AAAA,OACA;AAAA,SACG,SAAS,YACV,EAAE,gBAAgB,IAAI,KAAK,SAAS,KAAK,WAAW,SAAS,KAAK,CAAC,EAAE,IACrE,CAAC;AAAA,SACA,UAAU,EAAE,UAAU,QAAQ,IAAI,CAAC;AAAA,MAEvC,eACC,SAAS,YACN,YACA,SAAS,KAAK,KAAK,SAAS,IAAI,aAAa;AAAA,MACjD,WAAW,SAAS,OAAO;AAAA,IAC5B,CAAC;AAAA,IACD,MAAM,QAAQ,MAAM,MAAM,IAAI;AAAA,MAC7B,MAAM;AAAA,MACN,IAAI,CAAC,KAAK,IAAI;AAAA,MACd,SAAS;AAAA,MACT,WAAW;AAAA,IACZ,CAAC;AAAA,IACD,OAAO,KAAK,OAAO;AAAA,MAClB;AAAA,MACA,IAAI,MAAM;AAAA,MACV,IAAI,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,YAAY,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IACxC,CAAC;AAAA,IACA,OAAO,OAAO;AAAA,IACf,OAAO,KAAK,SAAS,EAAE,OAAO,IAAI,KAAK,GAAG,CAAC;AAAA;AAAA;;;AChF7C,SAAS,OAAO,CAAC,QAA0C;AAAA,EAC1D,OAAO;AAAA,IACN,SAAS,OAAO;AAAA,IAChB,QAAQ;AAAA,IACR,OAAO,EAAE,MAAM,OAAO,OAAO,OAAO,QAAQ,QAAQ;AAAA,OAChD,OAAO,mBAAmB,EAAE,kBAAkB,KAAc,IAAI,CAAC;AAAA,OACjE,OAAO,yBACR,EAAE,wBAAwB,KAAc,IACxC,CAAC;AAAA,EACL;AAAA;AASM,SAAS,MAAM,CACrB,MACA,SACA,SACA,KACA,UACU;AAAA,EACV,MAAM,WAAW,KAAK,YAAY,QAAQ,SAAS,IAAI,IAAI;AAAA,EAC3D,MAAM,OAAO,cACZ,KAAK,WACL,KACA,UACA,SAAS,OACT,SAAS,MACV;AAAA,EAEA,MAAM,MAAM,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;AAAA,EAC9D,MAAM,MAAM,QACV,IAAI,CAAC,MAAuB;AAAA,IAC5B,MAAM,IAAI,IAAI,IAAI,EAAE,OAAO;AAAA,IAC3B,IAAI,CAAC,KAAK,EAAE,WAAW;AAAA,MAAa,OAAO;AAAA,IAC3C,OAAO;AAAA,SACH;AAAA,SACC,EAAE,mBAAmB,EAAE,kBAAkB,KAAc,IAAI,CAAC;AAAA,SAC5D,EAAE,yBACH,EAAE,wBAAwB,KAAc,IACxC,CAAC;AAAA,IACL;AAAA,GACA,EACA,IAAI,CAAC,MACL,EAAE,WAAW,cAAc,SAAS,YAAY,QAAQ,CAAC,IAAI,CAC9D;AAAA,EACD,MAAM,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU;AAAA,EAC1D,QAAQ,eAAe,SAAS;AAAA,EAChC,MAAM,WACL,CAAC,KAAK,iBACN,SAAS,KAAK,CAAC,MAAM,MAAM,WAAW,IAAI,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,KACjE,KAAK,SAAS,MACd,eAAe,SACf,SAAS,SAAS,KAClB,MAAM,KAAK,aAAa;AAAA,EACzB,OAAO;AAAA,IACN,QAAQ;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MAGZ,eACC,SAAS,aAAc,WAAW,SAAS,WAAW,IAAK,MAAM;AAAA,MAClE;AAAA,MACA,eAAe,KAAK,iBAAiB;AAAA,IACtC;AAAA,IACA,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW;AAAA,IACrD,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAAA,IAC/C;AAAA,IACA;AAAA,EACD;AAAA;;;ATpED,IAAM,YAAY,CAAC,OAAc,OAChC,IAAI,YACH,cACA,UAAU,UACP,gBAAgB,6IAChB,gBAAgB,sJACpB;AAGD,SAAS,QAAQ,CAAC,MAAwC;AAAA,EACzD,MAAM,SAAS,IAAI;AAAA,EACnB,WAAW,KAAK,KAAK,YAAY;AAAA,IAChC,IAAI,EAAE,WAAW,eAAe,EAAE,WAAW;AAAA,MAAU;AAAA,IACvD,MAAM,SAAS,SAAS,EAAE,OAAO;AAAA,IACjC,MAAM,QAAQ,OAAO,IAAI,MAAM;AAAA,IAC/B,IAAI;AAAA,MAAO,MAAM,KAAK,EAAE,OAAO;AAAA,IAC/B;AAAA,MAAK,OAAO,IAAI,QAAQ,CAAC,EAAE,OAAO,CAAC;AAAA,EACpC;AAAA,EACA,OAAO;AAAA;AASR,IAAM,YAAY,CAAC,aAAsC;AAAA,EACxD;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,EACP;AACD;AASA,IAAM,aAAa,CAAC,aAAsC;AAAA,EACzD;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,EACP;AACD;AAEA,IAAM,kBAAkB,CAAC,OACxB,IAAI,YACH,sBACA,kBAAkB,mGACnB;AAGD,SAAS,YAAY,CACpB,QACA,MACA,SACA,MACO;AAAA,EACP,QAAQ,UAAU,kBAAkB,QAAQ;AAAA,EAC5C,MAAM,OAAO,CAAC,OAAwB;AAAA,IACrC,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,WAAW,EAAE;AAAA,OACT,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,IACpC;AAAA,OACG,KAAK,IAAI,EAAE,OAAO;AAAA,EACtB;AAAA,EACA,MAAM,SAAS,CAAC,OAAwB;AAAA,OACnC,EAAE,mBAAmB,EAAE,kBAAkB,KAAc,IAAI,CAAC;AAAA,OAC5D,EAAE,yBACH,EAAE,wBAAwB,KAAc,IACxC,CAAC;AAAA,EACL;AAAA,EACA,WAAW,KAAK,QAAQ;AAAA,IAAW,OAAO,KAAK,aAAa,KAAK,CAAC,CAAC;AAAA,EACnE,WAAW,KAAK,QAAQ,UAAU;AAAA,IACjC,OAAO,KAAK,YAAY,KAAK,KAAK,CAAC,MAAM,OAAO,CAAC,GAAG,cAAc,CAAC;AAAA,EACpE;AAAA,EACA,WAAW,KAAK,QAAQ,QAAQ;AAAA,IAC/B,OAAO,KAAK,UAAU,KAAK,KAAK,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC;AAAA,EACnD;AAAA;AAWM,eAAe,WAAW,CAChC,KACA,MACgB;AAAA,EAChB,QAAQ,UAAU;AAAA,EAClB,MAAM,UAAU,MAAM,MAAM,YAAY,KAAK,EAAE;AAAA,EAC/C,IAAI,CAAC,SAAS;AAAA,IAEb,IAAK,MAAM,MAAM,IAAI,KAAK,EAAE,MAAO;AAAA,MAAW;AAAA,IAC9C,MAAM,SAAS,CAAC,GAAG,SAAS,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU;AAAA,IACjE,MAAM,OAAO,KAAK,MAAM,QAAQ,OAAO,WAAW,IAAI,GAAK;AAAA,IAC3D;AAAA,EACD;AAAA,EACA,MAAM,SAAS,SAAS,IAAI;AAAA,EAC5B,IAAI,UAAU;AAAA,EACd,MAAM,OAAO,IAAI;AAAA,EAEjB,MAAM,WACL,KAAK,SAAS,MAAM,CAAC,WAAU,KAAK,IAAI,IACrC,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,IAC3C,MAAM,QAAQ,IACd,CAAC,GAAG,MAAM,EAAE,IAAI,QAAQ,QAAQ,WAAW;AAAA,IAC1C,MAAM,UAAU,MAAM,IAAI,QAAQ,QAAQ,MAAM;AAAA,IAChD,IAAI;AAAA,MACH,IAAI,IAAI,SAAS,GAAG;AAAA,QACnB,UAAU;AAAA,QACV,OAAO,CAAC;AAAA,MACT;AAAA,MACA,OAAO,MAAM,aACZ,KACA,MACA,SACA,QACA,OACA,IACD;AAAA,MACC,QAAQ;AAAA,MACT,QAAQ;AAAA;AAAA,GAET,CACF;AAAA,EACH,MAAM,OAAO,KAAK,MAAM,SAAS,KAAK,GAAG,SAAS,SAAS,IAAI;AAAA;AAWhE,eAAe,MAAM,CACpB,KACA,MACA,SACA,SACA,SACA,MACgB;AAAA,EAChB,QAAQ,UAAU,OAAO,WAAW;AAAA,EACpC,MAAM,MAAM,SAAS,IAAI;AAAA,EACzB,MAAM,UAAU,OAAO,MAAM,SAAS,SAAS,KAAK,QAAQ;AAAA,EAC5D,MAAM,QAAQ,MAAM,MAAM,SAAS,KAAK,IAAI,SAAS,OAAO,QAAQ,MAAM;AAAA,EAC1E,IAAI,SAAS;AAAA,EACb,IAAI,CAAC,SAAU,MAAM,MAAM,IAAI,KAAK,EAAE,MAAO,WAAW;AAAA,IACvD,MAAM,QAAQ,MAAM,IAAI,YAAY,GAAG;AAAA,IACvC,IAAI,OAAO;AAAA,MAEV,OAAO,KAAK,SAAS,EAAE,OAAO,UAAU,OAAO,KAAK,EAAE,GAAG,IAAI,KAAK,GAAG,CAAC;AAAA,MACtE;AAAA,IACD;AAAA,IAGA,IAAI,CAAC;AAAA,MAAS;AAAA,IAEd,aAAa,QAAQ,MAAM,SAAS,IAAI;AAAA,IACxC;AAAA,EACD;AAAA,EACA,IAAI,CAAC,OAAO;AAAA,IACX,MAAM,QAAQ,IAAI,YACjB,cACA,gBAAgB,KAAK,+EACtB;AAAA,IACA,OAAO,KAAK,SAAS,EAAE,OAAO,IAAI,KAAK,GAAG,CAAC;AAAA,IAC3C;AAAA,EACD;AAAA,EACA,IAAI,CAAC,SAAS;AAAA,IACb,OAAO,KAAK,SAAS,EAAE,OAAO,gBAAgB,KAAK,EAAE,GAAG,IAAI,KAAK,GAAG,CAAC;AAAA,EACtE;AAAA,EACA,aAAa,QAAQ,MAAM,SAAS,IAAI;AAAA,EACxC,MAAM,OAAO,KAAK,MAAM,SAAS,UAAU,QAAQ,QAAQ,GAAG;AAAA,EAE9D,MAAM,UAAU,QAAQ,UAAU,OAAO,CAAC,MAAM,EAAE,eAAe,KAAK;AAAA,EACtE,MAAM,OAAO,KAAK,MAAM,SAAS,WAAW,SAAS,GAAG;AAAA,EACxD,IAAI,QAAQ,UAAU;AAAA,IACrB,MAAM,OAAO,KAAK,MAAM,SAAS,WAAW,QAAQ,UAAU,GAAG;AAAA,EAClE;AAAA;;;AU1MM,SAAS,OAAO,CAAC,KAAoB,MAA6B;AAAA,EACxE,QAAQ,aAAa;AAAA,EACrB,OAAO;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN,WAAW,KAAK,OAAO,aAAa,SAAS,IAAI,IAAI,SAAS;AAAA,IAC9D,OAAO;AAAA,IACP,SAAS,QAAQ,QAAQ;AAAA,EAC1B;AAAA;AAID,eAAe,gBAAgB,CAC9B,KACA,OACgB;AAAA,EAChB,QAAQ,OAAO,MAAM;AAAA,EACrB,IAAK,MAAM,IAAI,MAAM,IAAI,EAAE,MAAO;AAAA,IAAW;AAAA,EAC7C,MAAM,QAAQ;AAAA,EACd,MAAM,QAAQ,IAAI,YACjB,cACA,gBAAgB,oCACjB;AAAA,EACA,IAAI,OAAO,KAAK,SAAS,EAAE,OAAO,GAAG,CAAC;AAAA;AAahC,eAAe,KAAK,CAC1B,KACA,OACmB;AAAA,EACnB,QAAQ,UAAU,OAAO,WAAW;AAAA,EACpC,QAAQ,OAAO,MAAM;AAAA,EACrB,MAAM,OAAO,SAAS,IAAI,IAAI,SAAS;AAAA,EACvC,IAAI;AAAA,EACJ,IAAI;AAAA,IACH,OAAO,MAAM,MAAM,MAAM,IAAI,SAAS,OAAO,IAAI;AAAA,IAChD,OAAO,OAAO;AAAA,IACf,IAAI,CAAC,MAAM;AAAA,MAAM,OAAO,KAAK,SAAS,EAAE,OAAO,GAAG,CAAC;AAAA,IACnD,OAAO,CAAC,MAAM;AAAA;AAAA,EAEf,IAAI;AAAA,IAAM,MAAM,YAAY,KAAK,IAAI,MAAM,WAAW,IAAI;AAAA,EAC1D,IAAI,MAAM;AAAA,IAAM,OAAO;AAAA,EACvB,IAAI;AAAA,IAAM,OAAO;AAAA,EACjB,MAAM,OAAO;AAAA,EACb,MAAM,UAAU,iBAAiB,KAAK,KAAK,EAAE,MAAM,CAAC,UAAmB;AAAA,IACtE,OAAO,KAAK,SAAS,EAAE,OAAO,GAAG,CAAC;AAAA,GAClC;AAAA,EACD,OAAO;AAAA;AAQD,eAAe,MAAM,CAC3B,OACA,KAC6B;AAAA,EAC7B,MAAM,MAAM;AAAA,EACZ,IAAI,MAAM;AAAA,IAAO,OAAO;AAAA,EACxB,OAAO,MAAM,aAAa,MAAM,YAAY;AAAA;AAItC,IAAM,UAAU,CAAC,UAAqC,MAAM;;;AClG5D,MAAM,QAAQ;AAAA,EACX;AAAA,EACT,QAAQ;AAAA,EACC,WAA2B,CAAC;AAAA,EAErC,WAAW,CAAC,MAAc;AAAA,IACzB,KAAK,QAAQ;AAAA;AAAA,QAIR,OAAO,GAAwB;AAAA,IACpC,IAAI,KAAK,SAAS,KAAK,OAAO;AAAA,MAC7B,MAAM,IAAI,QAAc,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,IACjE,EAAE,KAAK;AAAA,MACN,KAAK;AAAA;AAAA,IAEN,IAAI,WAAW;AAAA,IACf,OAAO,MAAM;AAAA,MACZ,IAAI;AAAA,QAAU;AAAA,MACd,WAAW;AAAA,MACX,MAAM,OAAO,KAAK,SAAS,MAAM;AAAA,MAEjC,IAAI;AAAA,QAAM,KAAK;AAAA,MACf;AAAA,QAAK,KAAK;AAAA;AAAA;AAGb;AAAA;AAGO,MAAM,aAAa;AAAA,EAChB;AAAA,EACA,YAAY,IAAI;AAAA,EAEzB,WAAW,CAAC,MAAc;AAAA,IACzB,KAAK,QAAQ;AAAA;AAAA,QAGR,OAAO,CAAC,KAAkC;AAAA,IAC/C,IAAI,QAAQ,KAAK,UAAU,IAAI,GAAG;AAAA,IAClC,IAAI,CAAC,OAAO;AAAA,MACX,QAAQ,EAAE,SAAS,IAAI,QAAQ,KAAK,KAAK,GAAG,OAAO,EAAE;AAAA,MACrD,KAAK,UAAU,IAAI,KAAK,KAAK;AAAA,IAC9B;AAAA,IACA,MAAM;AAAA,IACN,MAAM,UAAU,MAAM,MAAM,QAAQ,QAAQ;AAAA,IAC5C,MAAM,OAAO;AAAA,IACb,OAAO,MAAM;AAAA,MACZ,QAAQ;AAAA,MACR,IAAI,EAAE,KAAK,UAAU;AAAA,QAAG,KAAK,UAAU,OAAO,GAAG;AAAA;AAAA;AAGpD;;;ACxCO,MAAM,OAAO;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,IAAI;AAAA,EACzB,YAAY;AAAA,EAEZ,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EAEA,SAAS;AAAA,EAET,WAAW,CAAC,KAAoB;AAAA,IAC/B,KAAK,OAAO;AAAA,IACZ,KAAK,SAAS,IAAI,QAAQ,IAAI,SAAS,WAAW;AAAA,IAClD,KAAK,WAAW,IAAI,aAAa,IAAI,SAAS,SAAS;AAAA;AAAA,EAIxD,SAAS,CAAC,OAA+B;AAAA,IACxC,MAAM,QAAQ,YAAY,MAAM;AAAA,MAC1B,MAAM,KAAK,MAAM,KAAK,EAAE,KAAK,CAAC,SAAS;AAAA,QAC3C,IAAI,CAAC;AAAA,UAAM,cAAc,KAAK;AAAA,OAC9B;AAAA,OACC,KAAK,KAAK,SAAS,UAAU,CAAC;AAAA,IACjC,MAAM,QAAQ;AAAA,IACd,OAAO,MAAM;AAAA,MACZ,MAAM,OAAO;AAAA,MACb,cAAc,KAAK;AAAA;AAAA;AAAA,OAIf,QAAQ,CAAC,MAAgC;AAAA,IAC9C,MAAM,QAAQ,QAAQ,KAAK,MAAM,IAAI;AAAA,IACrC,MAAM,OAAO,KAAK,UAAU,KAAK;AAAA,IACjC,IAAI;AAAA,MACH,MAAM,YACL;AAAA,WACI,KAAK;AAAA,QACR,SAAS,KAAK;AAAA,QACd,UAAU,MAAM,KAAK;AAAA,QACrB,UAAU;AAAA,QACV,aAAa,CAAC,QAAQ,OAAO,OAAO,GAAG;AAAA,MACxC,GACA,IACD;AAAA,MACC,OAAO,OAAO;AAAA,MACf,KAAK,KAAK,OAAO,KAAK,SAAS,EAAE,OAAO,IAAI,KAAK,GAAG,CAAC;AAAA,MACpD,QAAQ;AAAA,MACT,KAAK;AAAA,MAEL,MAAM,QAAQ,KAAK;AAAA;AAAA;AAAA,EAKrB,MAAM,GAAmC;AAAA,IACxC,QAAQ,UAAU,UAAU,KAAK;AAAA,IACjC,IAAI,KAAK;AAAA,MAAW,OAAO,QAAQ,QAAQ,SAAS;AAAA,IACpD,OAAO,MAAM,MAAM;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,KAAK,SAAS,IAAI;AAAA,MAClB,SAAS,SAAS;AAAA,IACnB,CAAC;AAAA;AAAA,QAQI,UAAU,GAAoB;AAAA,IACnC,MAAM,OAAO,IAAI;AAAA,IACjB,IAAI,UAAU;AAAA,IACd,OAAO,CAAC,KAAK,WAAW;AAAA,MACvB,MAAM,UAAU,MAAM,KAAK,OAAO,QAAQ;AAAA,MAC1C,IAAI;AAAA,MACJ,IAAI;AAAA,QACH,OAAO,MAAM,KAAK,OAAO;AAAA,QACxB,OAAO,OAAO;AAAA,QACf,QAAQ;AAAA,QACR,MAAM,QAAQ,IAAI,IAAI;AAAA,QACtB,MAAM;AAAA;AAAA,MAEP,IAAI,CAAC,MAAM;AAAA,QACV,QAAQ;AAAA,QACR,IAAI,KAAK,SAAS;AAAA,UAAG;AAAA,QACrB,MAAM,QAAQ,KAAK,IAAI;AAAA,QACvB;AAAA,MACD;AAAA,MACA;AAAA,MACA,MAAM,WAA0B,KAAK,SAAS,IAAI,EAAE,QAAQ,MAAM;AAAA,QACjE,QAAQ;AAAA,QACR,KAAK,OAAO,QAAQ;AAAA,QACpB,KAAK,UAAU,OAAO,QAAQ;AAAA,OAC9B;AAAA,MACD,KAAK,IAAI,QAAQ;AAAA,MACjB,KAAK,UAAU,IAAI,QAAQ;AAAA,IAC5B;AAAA,IACA,MAAM,QAAQ,IAAI,IAAI;AAAA,IACtB,OAAO;AAAA;AAAA,EAIR,IAAI,GAAS;AAAA,IACZ,IAAI,KAAK;AAAA,MAAO,KAAK,MAAM;AAAA,IAC3B;AAAA,MAAK,KAAK,SAAS;AAAA;AAAA,EAGpB,KAAK,GAAS;AAAA,IACb,IAAI,KAAK,WAAW;AAAA,MACnB,KAAK,WAAW;AAAA,MAChB;AAAA,IACD;AAAA,IACA,IAAI,KAAK;AAAA,MAAO;AAAA,IAChB,KAAK,QAAQ,KAAK,KAAK;AAAA;AAAA,OAGlB,MAAM,GAAkB;AAAA,IAC7B,IAAI,KAAK,QAAQ;AAAA,MAChB,KAAK,SAAS;AAAA,MACd;AAAA,IACD;AAAA,IACA,MAAM,IAAI,QAAc,CAAC,YAAY;AAAA,MACpC,MAAM,QAAQ,WAAW,SAAS,KAAK,KAAK,SAAS,YAAY;AAAA,MACjE,KAAK,QAAQ,MAAM;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,QAAQ;AAAA;AAAA,KAET;AAAA,IACD,KAAK,QAAQ;AAAA;AAAA,OAGR,IAAI,GAAkB;AAAA,IAC3B,OAAO,CAAC,KAAK,WAAW;AAAA,MACvB,KAAK,SAAS;AAAA,MACd,IAAI;AAAA,QACH,MAAM,KAAK,WAAW;AAAA,QACrB,OAAO,OAAO;AAAA,QACf,KAAK,KAAK,OAAO,KAAK,SAAS,EAAE,MAAM,CAAC;AAAA;AAAA,MAEzC,IAAI,KAAK;AAAA,QAAW;AAAA,MACpB,MAAM,KAAK,OAAO;AAAA,IACnB;AAAA;AAAA,QAQK,IAAI,GAAkB;AAAA,IAC3B,KAAK,WAAW;AAAA,IAChB,KAAK,YAAY;AAAA,IACjB,KAAK,QAAQ;AAAA,IACb,MAAM,KAAK;AAAA,IACX,MAAM,QAAQ,IAAI,KAAK,SAAS;AAAA,IAChC,KAAK,QAAQ;AAAA,IACb,KAAK,YAAY;AAAA,IACjB,IAAI,KAAK,UAAU;AAAA,MAClB,KAAK,WAAW;AAAA,MAChB,KAAK,MAAM;AAAA,IACZ;AAAA;AAEF;;;AC3HO,SAAS,WAAW,CAAC,SAA8B;AAAA,EACzD,MAAM,WAAW,WAAW,OAAO;AAAA,EACnC,MAAM,QAAQ,QAAQ;AAAA,EACtB,MAAM,SAAS,IAAI;AAAA,EACnB,MAAM,SAAS,IAAI,OAAO,EAAE,UAAU,OAAO,OAAO,CAAC;AAAA,EACrD,QAAQ,WAAW;AAAA,EACnB,OAAO;AAAA,IACN,OAAO,SAAS;AAAA,UACV,OAAO,CAAC,SAAS,UAAU;AAAA,MAChC,QAAQ,MAAM,OAAO,QAAQ,cAC5B,UACA,OAAO,aACR;AAAA,MACA,MAAM,QAAQ,MAAM,YAAY,SAAS,OAAO,cAAc;AAAA,MAC9D,cAAc,KAAK;AAAA,MACnB,MAAM,OAAO,MAAM,MAAM,IACxB,EAAE,MAAM,IAAI,SAAS,OAAO,WAAW,SAAS,IAAI,MAAM,IAAI,GAC9D,OAAO,aAAa,YAAY,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS,CAClE;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,OAAO;AAAA;AAAA,IAER,YAAY,MAAM,OAAO,WAAW;AAAA,IACpC,OAAO,MAAM,OAAO,MAAM;AAAA,IAC1B,MAAM,MAAM,OAAO,KAAK;AAAA,IACxB,IAAI,CAAC,OAAO,aAAa,OAAO,GAAG,OAAO,QAAQ;AAAA,IAClD,MAAM,CAAC,gBAAgB,MAAM,KAAK,WAAW;AAAA,IAC7C,KAAK,CAAC,OAAO,MAAM,IAAI,EAAE;AAAA,UACnB,QAAQ,CAAC,IAAI;AAAA,MAClB,MAAM,MAAM,SAAS,IAAI;AAAA,MACzB,MAAM,SAAS,MAAM,MAAM,IAAI,EAAE,IAAI;AAAA,MACrC,IAAI,SAAS,MAAM,YAAY;AAAA,QAAK,OAAO;AAAA,MAC3C,MAAM,QAAQ,MAAM,MAAM,WAAW,IAAI,GAAG;AAAA,MAC5C,IAAI;AAAA,QAAO,OAAO,KAAK;AAAA,MACvB,OAAO;AAAA;AAAA,IAER,QAAQ,CAAC,OAAO,MAAM,OAAO,EAAE;AAAA,EAChC;AAAA;",
35
- "debugId": "D24C84F35DEF0E8164756E2164756E21",
36
+ "mappings": "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",
37
+ "debugId": "9F6E913A6461985264756E2164756E21",
36
38
  "names": []
37
39
  }
@@ -11,7 +11,7 @@ import {
11
11
  applyAttempt,
12
12
  newItem,
13
13
  claimable
14
- } from "../chunks/index-9yp15arf.js";
14
+ } from "../chunks/index-sz13a17b.js";
15
15
 
16
16
  // src/memory/store.ts
17
17
  var byDue = (a, b) => a.item.nextAttemptAt - b.item.nextAttemptAt || a.seq - b.seq;
@@ -19,7 +19,7 @@ import {
19
19
  isDone,
20
20
  applyAttempt,
21
21
  newItem
22
- } from "../chunks/index-9yp15arf.js";
22
+ } from "../chunks/index-sz13a17b.js";
23
23
 
24
24
  // src/postgres/connect.ts
25
25
  var DEFAULT_PREFIX = "bumail_queue_";
@@ -1 +1 @@
1
- {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../../src/queue/settings/limits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAU5D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAiB7D"}
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../../src/queue/settings/limits.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAU5D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAsB7D"}
@@ -15,7 +15,7 @@ import {
15
15
  isDone,
16
16
  applyAttempt,
17
17
  newItem
18
- } from "../chunks/index-9yp15arf.js";
18
+ } from "../chunks/index-sz13a17b.js";
19
19
 
20
20
  // src/redis/connect.ts
21
21
  var DEFAULT_PREFIX = "bumail:queue:";
@@ -14,7 +14,7 @@ import {
14
14
  isDone,
15
15
  applyAttempt,
16
16
  newItem
17
- } from "../chunks/index-9yp15arf.js";
17
+ } from "../chunks/index-sz13a17b.js";
18
18
 
19
19
  // src/sqlite/open.ts
20
20
  import { Database } from "bun:sqlite";
package/docs/guide.md CHANGED
@@ -419,6 +419,36 @@ It returns `undefined` when there is nothing to send: the reverse-path is
419
419
  null, or no recipient asked for `SUCCESS`. Only the recipients that asked
420
420
  are listed.
421
421
 
422
+ ### The `failed` DSN of a local recipient
423
+
424
+ A recipient the application cannot deliver locally is reported with
425
+ `failedDsn()`, which takes the `reply` to show for each recipient and the
426
+ message's `ret`. It returns `undefined` for a null reverse-path, or when no
427
+ recipient asked for failures (`NOTIFY=NEVER`, or a list without `FAILURE`):
428
+
429
+ ```ts
430
+ import { failedDsn } from '@bumail/queue';
431
+
432
+ const dsn = failedDsn({
433
+ reportingMta: 'mail.example.net',
434
+ from: 'postmaster@example.net',
435
+ to: envelope.from, // the reverse-path of the message
436
+ arrival: received,
437
+ recipients: [
438
+ {
439
+ address: 'joe@example.net',
440
+ notify: ['FAILURE'],
441
+ orcpt,
442
+ reply: { code: 550, status: '5.1.1', text: 'mailbox no longer exists' },
443
+ },
444
+ ],
445
+ envid,
446
+ ret: 'FULL', // the whole message in `original`, up to `maxReturn` (DEFAULT_MAX_RETURN, 64 KiB); else the headers
447
+ original: message,
448
+ });
449
+ if (dsn) await queue.enqueue(dsn, { from: '', to: envelope.from });
450
+ ```
451
+
422
452
  Nothing from outside reaches a header field raw: a reply's text, a host
423
453
  name and an address have their control characters taken out (CR and LF
424
454
  included), the `message/delivery-status` part is 7-bit (a UTF-8 address
@@ -165,8 +165,9 @@ checked at `enqueue`, and by every store at `add`, never at delivery:
165
165
  `NEVER` alone, or a non-empty list without repeats.
166
166
  - `orcpt of … must be { type, address }`: both strings, the address not
167
167
  empty, or the type is not a token (letters, digits, hyphens).
168
- - `orcpt of … is over 500 characters once encoded`: `type;` and the xtext of
169
- the address take at most 500 characters (RFC 3461 §4.2).
168
+ - `orcpt of … is over 500 characters once encoded`: `type;` and the address
169
+ as sent (xtext; for `utf-8` its RFC 6533 unitext form: raw UTF-8 octets,
170
+ `\x{HH}` = 6) take at most 500 characters (RFC 3461 §4.2).
170
171
 
171
172
  ```ts
172
173
  await queue.enqueue(message, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bumail/queue",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "The outbound mail queue of a mail server: every recipient's state, retries with back-off, delivery status notifications (RFC 3464), leases for several workers, and a memory, a bun:sqlite, a PostgreSQL (Bun.sql) and a Redis (Bun.redis) store, delivering through @bumail/smtp/client",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -67,12 +67,12 @@
67
67
  "devDependencies": {
68
68
  "@bumail/dns": "^0.2.1",
69
69
  "@bumail/mime": "^0.2.0",
70
- "@bumail/smtp": "^0.10.0",
70
+ "@bumail/smtp": "^0.11.0",
71
71
  "@types/bun": "^1.4.2"
72
72
  },
73
73
  "peerDependencies": {
74
74
  "@bumail/mime": "^0.2.0",
75
- "@bumail/smtp": "^0.10.0",
75
+ "@bumail/smtp": "^0.11.0",
76
76
  "typescript": "^6.0.3 || ^7.0.0"
77
77
  },
78
78
  "peerDependenciesMeta": {