@bumail/queue 0.1.0 → 0.2.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 +37 -5
- package/dist/chunks/{index-xhsw4xcz.js → index-vg971acr.js} +70 -6
- package/dist/chunks/index-vg971acr.js.map +12 -0
- package/dist/contract/checks.d.ts +6 -0
- package/dist/contract/checks.d.ts.map +1 -1
- package/dist/index.js +14 -33
- package/dist/index.js.map +5 -6
- package/dist/memory/index.js +3 -5
- package/dist/memory/index.js.map +2 -2
- package/dist/postgres/connect.d.ts +17 -0
- package/dist/postgres/connect.d.ts.map +1 -0
- package/dist/postgres/index.d.ts +2 -0
- package/dist/postgres/index.d.ts.map +1 -0
- package/dist/postgres/index.js +383 -0
- package/dist/postgres/index.js.map +14 -0
- package/dist/postgres/options.d.ts +37 -0
- package/dist/postgres/options.d.ts.map +1 -0
- package/dist/postgres/rows.d.ts +21 -0
- package/dist/postgres/rows.d.ts.map +1 -0
- package/dist/postgres/schema.d.ts +20 -0
- package/dist/postgres/schema.d.ts.map +1 -0
- package/dist/postgres/statements.d.ts +54 -0
- package/dist/postgres/statements.d.ts.map +1 -0
- package/dist/postgres/store.d.ts +38 -0
- package/dist/postgres/store.d.ts.map +1 -0
- package/dist/queue/outcome.d.ts.map +1 -1
- package/dist/queue/settings/index.d.ts.map +1 -1
- package/dist/sqlite/index.js +3 -5
- package/dist/sqlite/index.js.map +2 -2
- package/dist/text.d.ts +9 -3
- package/dist/text.d.ts.map +1 -1
- package/docs/README.md +1 -1
- package/docs/guide.md +130 -2
- package/docs/roadmap.md +50 -19
- package/docs/troubleshooting.md +99 -5
- package/package.json +9 -3
- package/dist/chunks/index-p4k4rjb7.js +0 -15
- package/dist/chunks/index-p4k4rjb7.js.map +0 -10
- package/dist/chunks/index-xhsw4xcz.js.map +0 -10
package/README.md
CHANGED
|
@@ -4,8 +4,9 @@ The outbound queue of a mail server: it keeps every message your server
|
|
|
4
4
|
sends to another one, delivers it through `@bumail/smtp/client`, retries
|
|
5
5
|
what failed for now, and sends a delivery status notification (RFC 3464)
|
|
6
6
|
back when it gives up. Each recipient has its own state, the queue
|
|
7
|
-
survives a restart on `bun:sqlite
|
|
8
|
-
|
|
7
|
+
survives a restart on `bun:sqlite` or PostgreSQL, and several workers —
|
|
8
|
+
on one machine, or on many with PostgreSQL — can share one queue. No
|
|
9
|
+
runtime dependency: only peers.
|
|
9
10
|
|
|
10
11
|
## Install
|
|
11
12
|
|
|
@@ -25,6 +26,7 @@ queue that only uses a smarthost needs none.
|
|
|
25
26
|
| `@bumail/queue` | `createQueue`, the `QueueStore` contract, `QueueError` and the types |
|
|
26
27
|
| `@bumail/queue/memory` | `MemoryQueueStore`: in memory, lost on a restart — for specs and trials |
|
|
27
28
|
| `@bumail/queue/sqlite` | `SqliteQueueStore`: on disk with `bun:sqlite`, shared by the processes of one machine |
|
|
29
|
+
| `@bumail/queue/postgres` | `PostgresQueueStore`: on PostgreSQL through Bun's own `Bun.sql`, shared by instances on several machines |
|
|
28
30
|
|
|
29
31
|
## Usage
|
|
30
32
|
|
|
@@ -144,6 +146,35 @@ makes is 0700; one that exists keeps its mode.
|
|
|
144
146
|
item opens one session per recipient domain — and `perDomain` (2) its
|
|
145
147
|
sessions to one recipient domain.
|
|
146
148
|
|
|
149
|
+
## PostgreSQL, for several machines
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
import { nodeResolver } from '@bumail/dns';
|
|
153
|
+
import { createQueue } from '@bumail/queue';
|
|
154
|
+
import { PostgresQueueStore } from '@bumail/queue/postgres';
|
|
155
|
+
|
|
156
|
+
// In each instance, on the same database. A Bun.SQL client of your own works too:
|
|
157
|
+
// PostgresQueueStore.open({ sql: new Bun.SQL({ url, max: 10 }) }).
|
|
158
|
+
const store = PostgresQueueStore.open({
|
|
159
|
+
sql: Bun.env['DATABASE_URL'] ?? 'postgres://bumail@localhost:5432/mail',
|
|
160
|
+
tablePrefix: 'bumail_queue_', // the default: bumail_queue_items, …_messages, …_schema
|
|
161
|
+
});
|
|
162
|
+
await store.migrate(); // makes the tables; the first call would anyway
|
|
163
|
+
const queue = createQueue({ store, hostname: 'mail.example.net', resolver: nodeResolver() });
|
|
164
|
+
queue.start();
|
|
165
|
+
|
|
166
|
+
process.on('SIGTERM', async () => {
|
|
167
|
+
await queue.stop();
|
|
168
|
+
await store.close(); // closes the client it opened for the URL, never yours
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
A claim is one `UPDATE … RETURNING` whose item a `SELECT … FOR UPDATE
|
|
173
|
+
SKIP LOCKED` picks: two instances never take the same item, and none
|
|
174
|
+
waits on one another is taking. An instance that crashes loses its items
|
|
175
|
+
when their leases expire, as with `bun:sqlite`. No driver to install:
|
|
176
|
+
`Bun.sql` is Bun's.
|
|
177
|
+
|
|
147
178
|
## Events and admin
|
|
148
179
|
|
|
149
180
|
```ts
|
|
@@ -212,8 +243,8 @@ control character in it.
|
|
|
212
243
|
|
|
213
244
|
## Traps
|
|
214
245
|
|
|
215
|
-
- **Bun only.** The
|
|
216
|
-
on Bun 1.4.2 or later, not on Node.
|
|
246
|
+
- **Bun only.** The stores use `bun:sqlite` and `Bun.sql`, so the package
|
|
247
|
+
runs on Bun 1.4.2 or later, not on Node.
|
|
217
248
|
- **It sends what you enqueue, to anyone.** The queue is not a relay
|
|
218
249
|
policy: enqueue only what an authenticated user submitted, or what your
|
|
219
250
|
own server writes, never what an unauthenticated client handed you.
|
|
@@ -232,12 +263,13 @@ control character in it.
|
|
|
232
263
|
| `QueueError`, `QueueErrorCode` | `INVALID`, `MESSAGE_TOO_BIG`, `TOO_MANY_RECIPIENTS`, `QUEUE_FULL`, `CLOSED`, `LEASE_LOST` |
|
|
233
264
|
| `MemoryQueueStore` | from `@bumail/queue/memory` |
|
|
234
265
|
| `SqliteQueueStore`, `SqliteQueueStoreOptions` | from `@bumail/queue/sqlite`: `SqliteQueueStore.open({ directory, busyTimeout? })`, `close()` |
|
|
266
|
+
| `PostgresQueueStore`, `PostgresQueueStoreOptions`, `PostgresClient`, `PostgresQueryable` | from `@bumail/queue/postgres`: `PostgresQueueStore.open({ sql, tablePrefix? })`, `migrate()`, `close()`; `sql` a `Bun.SQL` client or a `postgres://` URL |
|
|
235
267
|
|
|
236
268
|
## Documentation
|
|
237
269
|
|
|
238
270
|
These pages ship in the package, under `docs/`.
|
|
239
271
|
|
|
240
272
|
- [Index](https://github.com/softistx/bumail/blob/develop/packages/queue/docs/README.md): the pages, and when to read each.
|
|
241
|
-
- [Guide](https://github.com/softistx/bumail/blob/develop/packages/queue/docs/guide.md): enqueuing, delivery and routing, the retry schedule, DSNs, several workers and leases, events and admin, the stores, testing, and writing a store of your own.
|
|
273
|
+
- [Guide](https://github.com/softistx/bumail/blob/develop/packages/queue/docs/guide.md): enqueuing, delivery and routing, the retry schedule, DSNs, several workers and leases, events and admin, the stores (PostgreSQL included), testing, and writing a store of your own.
|
|
242
274
|
- [Troubleshooting](https://github.com/softistx/bumail/blob/develop/packages/queue/docs/troubleshooting.md): every `QueueError`, and what to do about it.
|
|
243
275
|
- [Roadmap](https://github.com/softistx/bumail/blob/develop/packages/queue/docs/roadmap.md): what is coming, and what is not planned.
|
|
@@ -1,6 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
class QueueError2 extends Error {
|
|
3
|
+
name = "QueueError";
|
|
4
|
+
code;
|
|
5
|
+
constructor(code, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
var invalid = (message) => new QueueError2("INVALID", message);
|
|
11
|
+
|
|
12
|
+
// src/text.ts
|
|
13
|
+
var isControl = (code) => code < 32 || code >= 127 && code <= 159;
|
|
14
|
+
function hasControl(text) {
|
|
15
|
+
for (let i = 0;i < text.length; i++) {
|
|
16
|
+
if (isControl(text.charCodeAt(i)))
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
function replaceControls(text, by) {
|
|
22
|
+
let out = "";
|
|
23
|
+
for (let i = 0;i < text.length; i++) {
|
|
24
|
+
out += isControl(text.charCodeAt(i)) ? by : text[i];
|
|
25
|
+
}
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
function cleanText(text, max) {
|
|
29
|
+
const clean = replaceControls(text.toWellFormed(), " ").replace(/ {2,}/g, " ").trim();
|
|
30
|
+
return clean.length > max ? `${cut(clean, max - 3)}...` : clean;
|
|
31
|
+
}
|
|
32
|
+
function cut(text, length) {
|
|
33
|
+
const head = text.slice(0, length);
|
|
34
|
+
const last = head.charCodeAt(head.length - 1);
|
|
35
|
+
return last >= 55296 && last <= 56319 ? head.slice(0, -1) : head;
|
|
36
|
+
}
|
|
37
|
+
var isStorable = (text) => text.isWellFormed() && !text.includes("\x00");
|
|
38
|
+
var asciiText = (text, max) => cleanText(text, max).replace(/[^ -~]/g, "?");
|
|
4
39
|
|
|
5
40
|
// src/contract/checks.ts
|
|
6
41
|
var isTime = (value) => typeof value === "number" && Number.isFinite(value);
|
|
@@ -9,22 +44,49 @@ function checkTime(name, value) {
|
|
|
9
44
|
throw invalid(`${name} must be a finite number`);
|
|
10
45
|
return value;
|
|
11
46
|
}
|
|
47
|
+
function checkStorable(name, text) {
|
|
48
|
+
if (!isStorable(text)) {
|
|
49
|
+
throw invalid(`${name} holds a NUL or a lone surrogate, which a store cannot keep`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
12
52
|
function checkOwner(owner) {
|
|
13
53
|
if (typeof owner !== "string" || owner === "") {
|
|
14
54
|
throw invalid("owner must be a non-empty string");
|
|
15
55
|
}
|
|
56
|
+
checkStorable("owner", owner);
|
|
16
57
|
return owner;
|
|
17
58
|
}
|
|
59
|
+
function checkUpdate(update) {
|
|
60
|
+
checkStorable("A recipient", update.address);
|
|
61
|
+
const reply = update.reply;
|
|
62
|
+
if (reply === undefined)
|
|
63
|
+
return;
|
|
64
|
+
if (typeof reply !== "object" || reply === null || typeof reply.text !== "string") {
|
|
65
|
+
throw invalid("A reply is an object with a text");
|
|
66
|
+
}
|
|
67
|
+
checkStorable("reply.text", reply.text);
|
|
68
|
+
for (const name of ["status", "host"]) {
|
|
69
|
+
const value = reply[name];
|
|
70
|
+
if (value === undefined)
|
|
71
|
+
continue;
|
|
72
|
+
if (typeof value !== "string")
|
|
73
|
+
throw invalid(`reply.${name} must be a string`);
|
|
74
|
+
checkStorable(`reply.${name}`, value);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
18
77
|
function checkNewItem(item) {
|
|
19
78
|
if (typeof item !== "object" || item === null) {
|
|
20
79
|
throw invalid("A new item is an object");
|
|
21
80
|
}
|
|
22
81
|
if (typeof item.from !== "string")
|
|
23
82
|
throw invalid("from must be a string");
|
|
83
|
+
checkStorable("from", item.from);
|
|
24
84
|
const to = item.to;
|
|
25
85
|
if (!Array.isArray(to) || to.length === 0 || !to.every((a) => typeof a === "string" && a !== "")) {
|
|
26
86
|
throw invalid("to must be a non-empty array of addresses");
|
|
27
87
|
}
|
|
88
|
+
for (const address of to)
|
|
89
|
+
checkStorable("A recipient", address);
|
|
28
90
|
if (!(item.message instanceof Uint8Array)) {
|
|
29
91
|
throw invalid("message must be a Uint8Array");
|
|
30
92
|
}
|
|
@@ -64,6 +126,8 @@ function checkResult(result) {
|
|
|
64
126
|
if (!Array.isArray(result.recipients) || !result.recipients.every((u) => typeof u?.address === "string" && statuses.includes(u.status))) {
|
|
65
127
|
throw invalid("recipients must be an array of { address, status: delivered, deferred or failed }");
|
|
66
128
|
}
|
|
129
|
+
for (const update of result.recipients)
|
|
130
|
+
checkUpdate(update);
|
|
67
131
|
}
|
|
68
132
|
function checkList(options = {}) {
|
|
69
133
|
const offset = options.offset ?? 0;
|
|
@@ -113,7 +177,7 @@ function newItem(id, item) {
|
|
|
113
177
|
}
|
|
114
178
|
var claimable = (item, now) => item.nextAttemptAt <= now && (item.lease === undefined || item.lease.expiresAt <= now);
|
|
115
179
|
|
|
116
|
-
export { checkTime, checkOwner, checkNewItem, checkMaxItems, checkClaim, checkResult, checkList, isDone, applyAttempt, newItem, claimable };
|
|
180
|
+
export { QueueError2, invalid, hasControl, replaceControls, cleanText, isStorable, asciiText, checkTime, checkOwner, checkNewItem, checkMaxItems, checkClaim, checkResult, checkList, isDone, applyAttempt, newItem, claimable };
|
|
117
181
|
|
|
118
|
-
//# debugId=
|
|
119
|
-
//# sourceMappingURL=index-
|
|
182
|
+
//# debugId=81614FFC0DB6330C64756E2164756E21
|
|
183
|
+
//# sourceMappingURL=index-vg971acr.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/errors.ts", "../src/text.ts", "../src/contract/checks.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\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.\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\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",
|
|
6
|
+
"/** 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",
|
|
7
|
+
"import { invalid } from '../errors';\nimport { isStorable } from '../text';\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/**\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\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\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}\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...(update.reply ? { reply: update.reply } : {}),\n\t\t\tupdatedAt: result.now,\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\treturn {\n\t\tid,\n\t\tfrom: item.from,\n\t\trecipients: item.to.map((address) => ({ address, status: 'pending' })),\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};\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"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "81614FFC0DB6330C64756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { AttemptResult, ClaimRequest, NewQueueItem, QueueItem, QueueListOptions } from './types';
|
|
2
2
|
/** A time in milliseconds since the epoch, or `INVALID` naming it. */
|
|
3
3
|
export declare function checkTime(name: string, value: unknown): number;
|
|
4
|
+
/**
|
|
5
|
+
* Text a store keeps: refused, the same way by every store, when it holds
|
|
6
|
+
* a NUL or a lone surrogate, which PostgreSQL cannot keep and no UTF-8
|
|
7
|
+
* encode can carry.
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkStorable(name: string, text: string): void;
|
|
4
10
|
/** A lease owner: a non-empty string. */
|
|
5
11
|
export declare function checkOwner(owner: unknown): string;
|
|
6
12
|
export declare function checkNewItem(item: NewQueueItem): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/contract/checks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/contract/checks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EAEZ,YAAY,EACZ,SAAS,EACT,gBAAgB,EAGhB,MAAM,SAAS,CAAC;AAOjB,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAG9D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAM9D;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMjD;AAwBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAmBrD;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAM9D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAStD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAwBvD;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACd,CAUA;AAED,kDAAkD;AAClD,eAAO,MAAM,MAAM,GAAI,MAAM,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,KAAG,OAG3D,CAAC;AAEH;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,aAAa,GACnB,SAAS,CAoBX;AAED,4CAA4C;AAC5C,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,SAAS,CAWjE;AAED,uEAAuE;AACvE,eAAO,MAAM,SAAS,GAAI,MAAM,SAAS,EAAE,KAAK,MAAM,KAAG,OAEC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,33 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
QueueError2,
|
|
3
|
-
invalid
|
|
4
|
-
|
|
3
|
+
invalid,
|
|
4
|
+
hasControl,
|
|
5
|
+
replaceControls,
|
|
6
|
+
cleanText,
|
|
7
|
+
asciiText,
|
|
8
|
+
checkOwner
|
|
9
|
+
} from "./chunks/index-vg971acr.js";
|
|
5
10
|
// src/queue/envelope.ts
|
|
6
11
|
import { isMailbox } from "@bumail/smtp/client";
|
|
7
|
-
|
|
8
|
-
// src/text.ts
|
|
9
|
-
var isControl = (code) => code < 32 || code >= 127 && code <= 159;
|
|
10
|
-
function hasControl(text) {
|
|
11
|
-
for (let i = 0;i < text.length; i++) {
|
|
12
|
-
if (isControl(text.charCodeAt(i)))
|
|
13
|
-
return true;
|
|
14
|
-
}
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
function replaceControls(text, by) {
|
|
18
|
-
let out = "";
|
|
19
|
-
for (let i = 0;i < text.length; i++) {
|
|
20
|
-
out += isControl(text.charCodeAt(i)) ? by : text[i];
|
|
21
|
-
}
|
|
22
|
-
return out;
|
|
23
|
-
}
|
|
24
|
-
function cleanText(text, max) {
|
|
25
|
-
const clean = replaceControls(text, " ").replace(/ {2,}/g, " ").trim();
|
|
26
|
-
return clean.length > max ? `${clean.slice(0, max - 3)}...` : clean;
|
|
27
|
-
}
|
|
28
|
-
var asciiText = (text, max) => cleanText(text, max).replace(/[^ -~]/g, "?");
|
|
29
|
-
|
|
30
|
-
// src/queue/envelope.ts
|
|
31
12
|
var ADDRESS = /^[^\s<>]{1,64}@[^\s<>@]{1,253}$/u;
|
|
32
13
|
function checkAddress(name, address) {
|
|
33
14
|
if (typeof address !== "string" || address.length > 254 || hasControl(address) || !ADDRESS.test(address) || !isMailbox(address)) {
|
|
@@ -280,10 +261,7 @@ function settingsOf(options) {
|
|
|
280
261
|
}
|
|
281
262
|
checkRoutes(options);
|
|
282
263
|
checkSessions(options);
|
|
283
|
-
const owner = options.owner ?? crypto.randomUUID();
|
|
284
|
-
if (typeof owner !== "string" || owner === "") {
|
|
285
|
-
throw invalid("owner must be a non-empty string");
|
|
286
|
-
}
|
|
264
|
+
const owner = checkOwner(options.owner ?? crypto.randomUUID());
|
|
287
265
|
const clock = options.clock;
|
|
288
266
|
return {
|
|
289
267
|
options,
|
|
@@ -619,7 +597,7 @@ function diagnosticOfError(error, temporary, max, host) {
|
|
|
619
597
|
return {
|
|
620
598
|
status: `${temporary ? 4 : 5}.${detail}`,
|
|
621
599
|
text: cleanText(text, max),
|
|
622
|
-
...host ? { host } : {}
|
|
600
|
+
...host ? { host: cleanText(host, 255) } : {}
|
|
623
601
|
};
|
|
624
602
|
}
|
|
625
603
|
function outcomesOf(result, group, max) {
|
|
@@ -642,7 +620,10 @@ function outcomesOf(result, group, max) {
|
|
|
642
620
|
return group.map((address) => updates.get(address) ?? {
|
|
643
621
|
address,
|
|
644
622
|
status: "deferred",
|
|
645
|
-
reply: {
|
|
623
|
+
reply: {
|
|
624
|
+
text: "The delivery said nothing of this recipient",
|
|
625
|
+
...host ? { host: cleanText(host, 255) } : {}
|
|
626
|
+
}
|
|
646
627
|
});
|
|
647
628
|
}
|
|
648
629
|
function outcomesOfError(error, group, max, host) {
|
|
@@ -1085,5 +1066,5 @@ export {
|
|
|
1085
1066
|
createQueue
|
|
1086
1067
|
};
|
|
1087
1068
|
|
|
1088
|
-
//# debugId=
|
|
1069
|
+
//# debugId=D3F637CD4BEA969664756E2164756E21
|
|
1089
1070
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/queue/envelope.ts", "../src/
|
|
3
|
+
"sources": ["../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/dsn/build.ts", "../src/dsn/content.ts", "../src/dsn/fields.ts", "../src/queue/retry.ts", "../src/queue/notify.ts", "../src/queue/outcome.ts", "../src/queue/route.ts", "../src/queue/settle.ts", "../src/queue/limiter.ts", "../src/queue/worker.ts", "../src/queue/queue.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { isMailbox } from '@bumail/smtp/client';\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}\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): { from: string; to: string[] } {\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\treturn { from, to };\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",
|
|
6
|
-
"/** 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, runs of space\n * as one, cut at `max` characters with `...`: what a reply leaves in an\n * item, an event and a DSN.\n */\nexport function cleanText(text: string, max: number): string {\n\tconst clean = replaceControls(text, ' ').replace(/ {2,}/g, ' ').trim();\n\treturn clean.length > max ? `${clean.slice(0, max - 3)}...` : clean;\n}\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",
|
|
7
6
|
"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}\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\treadonly kind: 'delayed' | 'failed';\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",
|
|
8
|
-
"import { sendMail } from '@bumail/smtp/client';\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 = options.owner ?? crypto.randomUUID()
|
|
7
|
+
"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",
|
|
9
8
|
"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",
|
|
10
9
|
"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",
|
|
11
10
|
"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",
|
|
@@ -17,14 +16,14 @@
|
|
|
17
16
|
"import { foldHeader, formatDate } from '@bumail/mime';\nimport type { Diagnostic } 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}\n\nexport type DsnKind = 'delayed' | 'failed';\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\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 = strip(address).replace(/[\\s\\\\]/g, '');\n\tif (/^[\\x21-\\x7e]*$/.test(clean)) return `rfc822; ${clean}`;\n\tlet escaped = '';\n\tfor (const c of clean) {\n\t\tconst piece = /[\\x21-\\x7e]/.test(c)\n\t\t\t? c\n\t\t\t: `\\\\x{${(c.codePointAt(0) ?? 0).toString(16).toUpperCase()}}`;\n\t\t// One word, so it must fit a line (RFC 5322 §2.1.1): cut, never lost.\n\t\tif (escaped.length + piece.length > MAX_ESCAPED) break;\n\t\tescaped += piece;\n\t}\n\treturn `utf-8; ${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\treturn reply.code >= 500 ? '5.0.0' : '4.0.0';\n\t}\n\treturn kind === 'failed' ? '5.0.0' : '4.0.0';\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 fields: [string, string][] = [\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 message = [\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",
|
|
18
17
|
"import type { RetrySettings } from './settings';\n\n/**\n * The wait after the `attempts`-th attempt failed for now: `first`, then\n * `factor` times the wait before, at most `max`, plus up to `jitter` of\n * itself — never less, so RFC 5321 §4.5.4.1's 30 minutes stay a floor.\n */\nexport function retryDelay(\n\tattempts: number,\n\tretry: RetrySettings,\n\trandom: () => number,\n): number {\n\tconst exponent = Math.max(0, attempts - 1);\n\tconst delay = Math.min(retry.first * retry.factor ** exponent, retry.max);\n\treturn delay + delay * retry.jitter * Math.min(1, Math.max(0, random()));\n}\n\n/** When a message's deferred recipients give up: `giveUpAfter` after it was enqueued. */\nexport const giveUpAt = (createdAt: number, retry: RetrySettings) =>\n\tcreatedAt + retry.giveUpAfter;\n\n/**\n * The next attempt after the `attempts`-th, at `now`: the back-off, but no\n * later than the moment of giving up, so the last try falls on it.\n * `undefined` when that moment has come: what is still deferred fails.\n */\nexport function nextAttemptAt(\n\tcreatedAt: number,\n\tnow: number,\n\tattempts: number,\n\tretry: RetrySettings,\n\trandom: () => number,\n): number | undefined {\n\tconst end = giveUpAt(createdAt, retry);\n\tif (now >= end) return undefined;\n\treturn Math.min(now + retryDelay(attempts, retry, random), end);\n}\n",
|
|
19
18
|
"import type { QueueStore } from '../contract/queue-store';\nimport type { QueueItem, RecipientUpdate } from '../contract/types';\nimport { buildDsn, type DsnKind } from '../dsn/build';\nimport type { Events } from './events';\nimport { giveUpAt } from './retry';\nimport type { Settings } from './settings';\n\nexport interface NotifyContext {\n\treadonly settings: Settings;\n\treadonly store: QueueStore;\n\treadonly events: Events;\n}\n\n/**\n * Enqueues a DSN (RFC 3464) back to the item's sender for these\n * recipients, from the null sender, so it never causes one of its own.\n * Nothing for an item from the null sender (RFC 5321 §4.5.5, RFC 3464\n * §2: a DSN is never sent about a DSN). It bypasses `maxItems`: a full\n * queue loses no bounce. A failure goes to the `error` event.\n */\nexport async function notify(\n\tctx: NotifyContext,\n\titem: QueueItem,\n\tmessage: Uint8Array,\n\tkind: DsnKind,\n\trecipients: readonly RecipientUpdate[],\n\tnow: number,\n): Promise<void> {\n\tif (item.from === '' || recipients.length === 0) return;\n\tconst { settings, store, events } = ctx;\n\ttry {\n\t\tconst lastAttempt = new Date(now);\n\t\tconst dsn = buildDsn({\n\t\t\tkind,\n\t\t\treportingMta: settings.hostname,\n\t\t\tfrom: settings.dsn.from,\n\t\t\tto: item.from,\n\t\t\tarrival: new Date(item.createdAt),\n\t\t\tdate: lastAttempt,\n\t\t\trecipients: recipients.map((r) => ({\n\t\t\t\taddress: r.address,\n\t\t\t\t...(r.reply ? { reply: r.reply } : {}),\n\t\t\t\tlastAttempt,\n\t\t\t})),\n\t\t\t...(kind === 'delayed'\n\t\t\t\t? { willRetryUntil: new Date(giveUpAt(item.createdAt, settings.retry)) }\n\t\t\t\t: {}),\n\t\t\toriginal: message,\n\t\t\treturnContent: settings.dsn.returnContent,\n\t\t\tmaxReturn: settings.limits.maxDsnReturn,\n\t\t});\n\t\tconst added = await store.add({\n\t\t\tfrom: '',\n\t\t\tto: [item.from],\n\t\t\tmessage: dsn,\n\t\t\tcreatedAt: now,\n\t\t});\n\t\tevents.emit('dsn', {\n\t\t\tkind,\n\t\t\tid: added.id,\n\t\t\tof: item.id,\n\t\t\tto: item.from,\n\t\t\trecipients: recipients.map((r) => r.address),\n\t\t});\n\t} catch (error) {\n\t\tevents.emit('error', { error, id: item.id });\n\t}\n}\n",
|
|
20
|
-
"import type {\n\tReply,\n\tSendMailResult,\n\tSmtpError,\n\tSmtpErrorCode,\n} from '@bumail/smtp/client';\nimport type { Diagnostic, RecipientUpdate } from '../contract/types';\nimport { cleanText } from '../text';\n\n/**\n * An `SmtpError`, read by its `name`: a second copy of `@bumail/smtp` (a\n * different version installed for the app) throws errors of another\n * class, which `instanceof` would take for unknown ones.\n */\nexport const isSmtpError = (error: unknown): error is SmtpError =>\n\terror instanceof Error &&\n\terror.name === 'SmtpError' &&\n\ttypeof (error as { code?: unknown }).code === 'string';\n\n/**\n * `sendMail` refused its options: the route is misconfigured (a smarthost\n * it cannot use, a bad timeout), not the recipient. Retried, never bounced\n * at once: fixing the configuration and restarting delivers the message.\n */\nexport const isRouteError = (error: unknown): boolean =>\n\tisSmtpError(error) && error.code === 'INVALID_OPTION';\n\n/** An enhanced status code, `x.y.z` (RFC 3463 §2). */\nconst STATUS = /^[245]\\.\\d{1,3}\\.\\d{1,3}$/;\n\n/** What a reply says, bounded and cleaned. */\nexport function diagnosticOf(\n\treply: Reply,\n\tmax: number,\n\thost?: string,\n): Diagnostic {\n\tconst text =\n\t\ttypeof reply.text === 'string' ? reply.text : reply.text.join(' ');\n\treturn {\n\t\tcode: reply.code,\n\t\t...(reply.status && STATUS.test(reply.status)\n\t\t\t? { status: reply.status }\n\t\t\t: {}),\n\t\ttext: cleanText(text, max),\n\t\t...(host ? { host: cleanText(host, 255) } : {}),\n\t};\n}\n\n/**\n * The status code an error with no reply stands for (RFC 3463 §3): a null\n * MX is X.1.10 (RFC 7505 §4.2), a domain that cannot be found X.1.2, a\n * host that does not answer X.4.1, a connection lost or timed out X.4.2,\n * TLS X.7.0 (security).\n */\nconst ERROR_STATUS: Partial<Record<SmtpErrorCode, string>> = {\n\tNULL_MX: '1.10',\n\tDNS_FAILED: '1.2',\n\tCONNECTION_FAILED: '4.1',\n\tCONNECTION_LOST: '4.2',\n\tTIMEOUT: '4.2',\n\tTLS_UNAVAILABLE: '7.10',\n\tTLS_FAILED: '7.0',\n\tAUTH_UNAVAILABLE: '7.0',\n\tINVALID_OPTION: '3.5',\n};\n\n/** A failure that never got a reply: an error of the network, the DNS, TLS, or anything else. */\nfunction diagnosticOfError(\n\terror: unknown,\n\ttemporary: boolean,\n\tmax: number,\n\thost?: string,\n): Diagnostic {\n\tconst text = error instanceof Error ? error.message : String(error);\n\tconst detail = isSmtpError(error)\n\t\t? (ERROR_STATUS[error.code] ?? '0.0')\n\t\t: '0.0';\n\treturn {\n\t\tstatus: `${temporary ? 4 : 5}.${detail}`,\n\t\ttext: cleanText(text, max),\n\t\t...(host ? { host } : {}),\n\t};\n}\n\n/** Each recipient of a delivery `sendMail` resolved: taken, or refused one by one. */\nexport function outcomesOf(\n\tresult: SendMailResult,\n\tgroup: readonly string[],\n\tmax: number,\n): RecipientUpdate[] {\n\tconst host = result.host;\n\tconst updates = new Map<string, RecipientUpdate>();\n\tfor (const { recipient } of result.accepted) {\n\t\tupdates.set(recipient, {\n\t\t\taddress: recipient,\n\t\t\tstatus: 'delivered',\n\t\t\treply: diagnosticOf(result.reply, max, host),\n\t\t});\n\t}\n\tfor (const { recipient, reply } of result.rejected) {\n\t\tupdates.set(recipient, {\n\t\t\taddress: recipient,\n\t\t\tstatus: reply.code >= 500 ? 'failed' : 'deferred',\n\t\t\treply: diagnosticOf(reply, max, host),\n\t\t});\n\t}\n\t// sendMail names every recipient it was given; a fake may not.\n\treturn group.map(\n\t\t(address) =>\n\t\t\tupdates.get(address) ?? {\n\t\t\t\taddress,\n\t\t\t\tstatus: 'deferred',\n\t\t\t\treply: {
|
|
19
|
+
"import type {\n\tReply,\n\tSendMailResult,\n\tSmtpError,\n\tSmtpErrorCode,\n} from '@bumail/smtp/client';\nimport type { Diagnostic, RecipientUpdate } from '../contract/types';\nimport { cleanText } from '../text';\n\n/**\n * An `SmtpError`, read by its `name`: a second copy of `@bumail/smtp` (a\n * different version installed for the app) throws errors of another\n * class, which `instanceof` would take for unknown ones.\n */\nexport const isSmtpError = (error: unknown): error is SmtpError =>\n\terror instanceof Error &&\n\terror.name === 'SmtpError' &&\n\ttypeof (error as { code?: unknown }).code === 'string';\n\n/**\n * `sendMail` refused its options: the route is misconfigured (a smarthost\n * it cannot use, a bad timeout), not the recipient. Retried, never bounced\n * at once: fixing the configuration and restarting delivers the message.\n */\nexport const isRouteError = (error: unknown): boolean =>\n\tisSmtpError(error) && error.code === 'INVALID_OPTION';\n\n/** An enhanced status code, `x.y.z` (RFC 3463 §2). */\nconst STATUS = /^[245]\\.\\d{1,3}\\.\\d{1,3}$/;\n\n/** What a reply says, bounded and cleaned. */\nexport function diagnosticOf(\n\treply: Reply,\n\tmax: number,\n\thost?: string,\n): Diagnostic {\n\tconst text =\n\t\ttypeof reply.text === 'string' ? reply.text : reply.text.join(' ');\n\treturn {\n\t\tcode: reply.code,\n\t\t...(reply.status && STATUS.test(reply.status)\n\t\t\t? { status: reply.status }\n\t\t\t: {}),\n\t\ttext: cleanText(text, max),\n\t\t...(host ? { host: cleanText(host, 255) } : {}),\n\t};\n}\n\n/**\n * The status code an error with no reply stands for (RFC 3463 §3): a null\n * MX is X.1.10 (RFC 7505 §4.2), a domain that cannot be found X.1.2, a\n * host that does not answer X.4.1, a connection lost or timed out X.4.2,\n * TLS X.7.0 (security).\n */\nconst ERROR_STATUS: Partial<Record<SmtpErrorCode, string>> = {\n\tNULL_MX: '1.10',\n\tDNS_FAILED: '1.2',\n\tCONNECTION_FAILED: '4.1',\n\tCONNECTION_LOST: '4.2',\n\tTIMEOUT: '4.2',\n\tTLS_UNAVAILABLE: '7.10',\n\tTLS_FAILED: '7.0',\n\tAUTH_UNAVAILABLE: '7.0',\n\tINVALID_OPTION: '3.5',\n};\n\n/** A failure that never got a reply: an error of the network, the DNS, TLS, or anything else. */\nfunction diagnosticOfError(\n\terror: unknown,\n\ttemporary: boolean,\n\tmax: number,\n\thost?: string,\n): Diagnostic {\n\tconst text = error instanceof Error ? error.message : String(error);\n\tconst detail = isSmtpError(error)\n\t\t? (ERROR_STATUS[error.code] ?? '0.0')\n\t\t: '0.0';\n\treturn {\n\t\tstatus: `${temporary ? 4 : 5}.${detail}`,\n\t\ttext: cleanText(text, max),\n\t\t...(host ? { host: cleanText(host, 255) } : {}),\n\t};\n}\n\n/** Each recipient of a delivery `sendMail` resolved: taken, or refused one by one. */\nexport function outcomesOf(\n\tresult: SendMailResult,\n\tgroup: readonly string[],\n\tmax: number,\n): RecipientUpdate[] {\n\tconst host = result.host;\n\tconst updates = new Map<string, RecipientUpdate>();\n\tfor (const { recipient } of result.accepted) {\n\t\tupdates.set(recipient, {\n\t\t\taddress: recipient,\n\t\t\tstatus: 'delivered',\n\t\t\treply: diagnosticOf(result.reply, max, host),\n\t\t});\n\t}\n\tfor (const { recipient, reply } of result.rejected) {\n\t\tupdates.set(recipient, {\n\t\t\taddress: recipient,\n\t\t\tstatus: reply.code >= 500 ? 'failed' : 'deferred',\n\t\t\treply: diagnosticOf(reply, max, host),\n\t\t});\n\t}\n\t// sendMail names every recipient it was given; a fake may not.\n\treturn group.map(\n\t\t(address) =>\n\t\t\tupdates.get(address) ?? {\n\t\t\t\taddress,\n\t\t\t\tstatus: 'deferred',\n\t\t\t\treply: {\n\t\t\t\t\ttext: 'The delivery said nothing of this recipient',\n\t\t\t\t\t...(host ? { host: cleanText(host, 255) } : {}),\n\t\t\t\t},\n\t\t\t},\n\t);\n}\n\n/**\n * Each recipient of a delivery `sendMail` rejected: by its own reply when\n * the server refused every one, else all alike — deferred when the error\n * is temporary (a 4xx, the network, a timeout) or the route's own\n * (`INVALID_OPTION`, X.3.5), failed otherwise.\n */\nexport function outcomesOfError(\n\terror: unknown,\n\tgroup: readonly string[],\n\tmax: number,\n\thost?: string,\n): RecipientUpdate[] {\n\tconst rejected = new Map(\n\t\tisSmtpError(error)\n\t\t\t? (error.rejected ?? []).map((r) => [r.recipient, r.reply])\n\t\t\t: [],\n\t);\n\tconst temporary =\n\t\t!isSmtpError(error) || error.temporary || isRouteError(error);\n\treturn group.map((address): RecipientUpdate => {\n\t\tconst own = rejected.get(address);\n\t\tif (own) {\n\t\t\treturn {\n\t\t\t\taddress,\n\t\t\t\tstatus: own.code >= 500 ? 'failed' : 'deferred',\n\t\t\t\treply: diagnosticOf(own, max, host),\n\t\t\t};\n\t\t}\n\t\tconst reply =\n\t\t\tisSmtpError(error) && error.reply\n\t\t\t\t? diagnosticOf(error.reply, max, host)\n\t\t\t\t: diagnosticOfError(error, temporary, max, host);\n\t\treturn { address, status: temporary ? 'deferred' : 'failed', reply };\n\t});\n}\n",
|
|
21
20
|
"import type { SendMailOptions } from '@bumail/smtp/client';\nimport type { Route } from './options';\nimport type { Settings } from './settings';\n\n/** The route for a recipient domain: its own, else the default. */\nexport function routeOf(settings: Settings, domain: string): Route {\n\treturn settings.routes.get(domain) ?? settings.options.route ?? 'mx';\n}\n\n/** The host an attempt goes to, as far as the route says: the smarthost, or nothing for MX. */\nexport function hostOf(route: Route): string | undefined {\n\treturn route === 'mx' ? undefined : route.host;\n}\n\n/** What `sendMail` takes to send one domain's recipients of a message. */\nexport function sendOptionsOf(\n\tsettings: Settings,\n\tdomain: string,\n\tfrom: string,\n\tto: readonly string[],\n): SendMailOptions {\n\tconst { options, hostname } = settings;\n\tconst common = {\n\t\tfrom,\n\t\tto,\n\t\thelo: hostname,\n\t\t...(options.timeouts ? { timeouts: options.timeouts } : {}),\n\t\t...(options.deadline !== undefined ? { deadline: options.deadline } : {}),\n\t};\n\tconst route = routeOf(settings, domain);\n\tif (route === 'mx') {\n\t\tconst resolver = options.resolver;\n\t\tif (!resolver) throw new Error('unreachable: settings check the resolver');\n\t\treturn {\n\t\t\t...common,\n\t\t\tdomain,\n\t\t\tresolver,\n\t\t\t...(options.mxPort !== undefined ? { port: options.mxPort } : {}),\n\t\t\t...(options.mxTls ? { tls: options.mxTls } : {}),\n\t\t};\n\t}\n\treturn {\n\t\t...common,\n\t\thost: route.host,\n\t\t...(route.port !== undefined ? { port: route.port } : {}),\n\t\t...(route.secure !== undefined ? { secure: route.secure } : {}),\n\t\t...(route.tls ? { tls: route.tls } : {}),\n\t\t...(route.auth ? { auth: route.auth } : {}),\n\t\t...(route.ca ? { ca: route.ca } : {}),\n\t};\n}\n",
|
|
22
21
|
"import type {\n\tAttemptResult,\n\tQueueItem,\n\tRecipientUpdate,\n} from '../contract/types';\nimport { nextAttemptAt } from './retry';\nimport type { Settings } from './settings';\n\n/** An attempt's outcomes, sorted, and what to record and send for them. */\nexport interface Settled {\n\treadonly result: AttemptResult;\n\treadonly delivered: readonly RecipientUpdate[];\n\t/** Failed in this attempt: a 5xx, or given up. */\n\treadonly failed: readonly RecipientUpdate[];\n\t/** Still deferred, to try again at `result.nextAttemptAt`. */\n\treadonly deferred: readonly RecipientUpdate[];\n\t/** A \"delayed\" DSN is due for the deferred recipients. */\n\treadonly delayDsn: boolean;\n}\n\n/**\n * A deferred recipient past the moment of giving up: failed, as X.4.7\n * (RFC 3463 §3.5, delivery time expired), the remote reply's code and text\n * kept as they were said.\n */\nfunction expired(update: RecipientUpdate): RecipientUpdate {\n\treturn {\n\t\taddress: update.address,\n\t\tstatus: 'failed',\n\t\treply: { text: '', ...update.reply, status: '4.4.7' },\n\t};\n}\n\n/**\n * What an attempt comes to: the count, the next attempt (RFC 5321\n * §4.5.4.1's back-off, or now when some recipients were left out because\n * the worker is stopping), the deferred recipients that gave up, and\n * whether the \"delayed\" DSN is due — once, for a sender that is not null.\n */\nexport function settle(\n\titem: QueueItem,\n\tupdates: readonly RecipientUpdate[],\n\tskipped: boolean,\n\tnow: number,\n\tsettings: Settings,\n): Settled {\n\tconst attempts = item.attempts + (updates.length > 0 ? 1 : 0);\n\tconst next = nextAttemptAt(\n\t\titem.createdAt,\n\t\tnow,\n\t\tattempts,\n\t\tsettings.retry,\n\t\tsettings.random,\n\t);\n\tconst all = updates.map((u) =>\n\t\tu.status === 'deferred' && next === undefined ? expired(u) : u,\n\t);\n\tconst deferred = all.filter((u) => u.status === 'deferred');\n\tconst { delayAfter } = settings.dsn;\n\tconst delayDsn =\n\t\t!item.delayNotified &&\n\t\titem.from !== '' &&\n\t\tdelayAfter !== false &&\n\t\tdeferred.length > 0 &&\n\t\tnow - item.createdAt >= delayAfter;\n\treturn {\n\t\tresult: {\n\t\t\tnow,\n\t\t\trecipients: all,\n\t\t\t// Left out by a stop with nothing deferred: due at once. Otherwise the\n\t\t\t// back-off holds for the whole item, the left-out domains included.\n\t\t\tnextAttemptAt:\n\t\t\t\tnext === undefined || (skipped && deferred.length === 0) ? now : next,\n\t\t\tattempts,\n\t\t\tdelayNotified: item.delayNotified || delayDsn,\n\t\t},\n\t\tdelivered: all.filter((u) => u.status === 'delivered'),\n\t\tfailed: all.filter((u) => u.status === 'failed'),\n\t\tdeferred,\n\t\tdelayDsn,\n\t};\n}\n",
|
|
23
22
|
"/** A count of slots: who asks past it waits, first come first served. */\nexport class Limiter {\n\treadonly #size: number;\n\t#used = 0;\n\treadonly #waiting: (() => void)[] = [];\n\n\tconstructor(size: number) {\n\t\tthis.#size = size;\n\t}\n\n\t/** A slot, once one is free; call what it resolves to, once, to give it back. */\n\tasync acquire(): Promise<() => void> {\n\t\tif (this.#used >= this.#size) {\n\t\t\tawait new Promise<void>((resolve) => this.#waiting.push(resolve));\n\t\t} else {\n\t\t\tthis.#used++;\n\t\t}\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tconst next = this.#waiting.shift();\n\t\t\t// The slot passes to the next in line without being freed in between.\n\t\t\tif (next) next();\n\t\t\telse this.#used--;\n\t\t};\n\t}\n}\n\n/** One `Limiter` per key, made when first asked for and dropped once idle. */\nexport class KeyedLimiter {\n\treadonly #size: number;\n\treadonly #limiters = new Map<string, { limiter: Limiter; users: number }>();\n\n\tconstructor(size: number) {\n\t\tthis.#size = size;\n\t}\n\n\tasync acquire(key: string): Promise<() => void> {\n\t\tlet entry = this.#limiters.get(key);\n\t\tif (!entry) {\n\t\t\tentry = { limiter: new Limiter(this.#size), users: 0 };\n\t\t\tthis.#limiters.set(key, entry);\n\t\t}\n\t\tentry.users++;\n\t\tconst release = await entry.limiter.acquire();\n\t\tconst held = entry;\n\t\treturn () => {\n\t\t\trelease();\n\t\t\tif (--held.users === 0) this.#limiters.delete(key);\n\t\t};\n\t}\n}\n",
|
|
24
23
|
"import type { QueueItem } from '../contract/types';\nimport { QueueError } from '../errors';\nimport { deliverItem } from './deliver';\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/**\n\t * Renews the lease every third of it until the outcome is recorded. A\n\t * renewal that finds the lease taken says so once, and stops; one that\n\t * fails (the store busy, unreachable) says so, and the next one tries\n\t * again: the lease may still be held.\n\t */\n\t#renewing(item: QueueItem): () => void {\n\t\tconst { settings, store, events } = this.#ctx;\n\t\tlet done = false;\n\t\tconst stop = () => {\n\t\t\tdone = true;\n\t\t\tclearInterval(timer);\n\t\t};\n\t\tconst timer = setInterval(() => {\n\t\t\tconst expiresAt = settings.now() + settings.leaseMs;\n\t\t\tstore.renew(item.id, settings.owner, expiresAt).then(\n\t\t\t\t(held) => {\n\t\t\t\t\tif (held || done) return;\n\t\t\t\t\tstop();\n\t\t\t\t\tconst error = new QueueError(\n\t\t\t\t\t\t'LEASE_LOST',\n\t\t\t\t\t\t`The lease on ${item.id} was lost while it was delivered`,\n\t\t\t\t\t);\n\t\t\t\t\tevents.emit('error', { error, id: item.id });\n\t\t\t\t},\n\t\t\t\t(error: unknown) => {\n\t\t\t\t\tif (!done) events.emit('error', { error, id: item.id });\n\t\t\t\t},\n\t\t\t);\n\t\t}, settings.leaseMs / 3);\n\t\ttimer.unref?.();\n\t\treturn stop;\n\t}\n\n\tasync #deliver(item: QueueItem): Promise<void> {\n\t\tconst stopRenewing = this.#renewing(item);\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: stopRenewing,\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\tstopRenewing();\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",
|
|
25
24
|
"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 } = checkEnvelope(envelope, limits.maxRecipients);\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() },\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"
|
|
26
25
|
],
|
|
27
|
-
"mappings": "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",
|
|
28
|
-
"debugId": "
|
|
26
|
+
"mappings": "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",
|
|
27
|
+
"debugId": "D3F637CD4BEA969664756E2164756E21",
|
|
29
28
|
"names": []
|
|
30
29
|
}
|