pipework 0.70.0 → 0.71.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/REFERENCE.md +34 -4
  3. package/dist/REFERENCE.md +124 -2
  4. package/dist/core/config/schema.js +1 -1
  5. package/dist/core/config/schema.js.map +1 -1
  6. package/dist/data/migrate/internal-definitions.d.ts.map +1 -1
  7. package/dist/data/migrate/internal-definitions.js +2 -1
  8. package/dist/data/migrate/internal-definitions.js.map +1 -1
  9. package/dist/infra/email/audit.d.ts +2 -2
  10. package/dist/infra/email/audit.d.ts.map +1 -1
  11. package/dist/infra/email/audit.js +3 -3
  12. package/dist/infra/email/audit.js.map +1 -1
  13. package/dist/infra/email/inbound.d.ts +199 -0
  14. package/dist/infra/email/inbound.d.ts.map +1 -0
  15. package/dist/infra/email/inbound.js +451 -0
  16. package/dist/infra/email/inbound.js.map +1 -0
  17. package/dist/infra/email/index.d.ts +1 -0
  18. package/dist/infra/email/index.d.ts.map +1 -1
  19. package/dist/infra/email/index.js +1 -0
  20. package/dist/infra/email/index.js.map +1 -1
  21. package/dist/infra/email/mail.d.ts +14 -1
  22. package/dist/infra/email/mail.d.ts.map +1 -1
  23. package/dist/infra/email/mail.js +39 -3
  24. package/dist/infra/email/mail.js.map +1 -1
  25. package/dist/infra/email/mime.d.ts +38 -0
  26. package/dist/infra/email/mime.d.ts.map +1 -0
  27. package/dist/infra/email/mime.js +474 -0
  28. package/dist/infra/email/mime.js.map +1 -0
  29. package/dist/infra/email/namespace.d.ts +8 -1
  30. package/dist/infra/email/namespace.d.ts.map +1 -1
  31. package/dist/infra/email/namespace.js +8 -1
  32. package/dist/infra/email/namespace.js.map +1 -1
  33. package/dist/infra/email/providers.d.ts +3 -1
  34. package/dist/infra/email/providers.d.ts.map +1 -1
  35. package/dist/infra/email/providers.js +8 -3
  36. package/dist/infra/email/providers.js.map +1 -1
  37. package/dist/infra/email/schema.d.ts +109 -0
  38. package/dist/infra/email/schema.d.ts.map +1 -1
  39. package/dist/infra/email/schema.js +39 -1
  40. package/dist/infra/email/schema.js.map +1 -1
  41. package/dist/infra/email/sns.d.ts +14 -0
  42. package/dist/infra/email/sns.d.ts.map +1 -1
  43. package/dist/infra/email/sns.js +37 -23
  44. package/dist/infra/email/sns.js.map +1 -1
  45. package/package.json +1 -1
@@ -0,0 +1,474 @@
1
+ // A hand-written MIME parser for received mail. Pure: bytes in, a plain object out.
2
+ // It never throws; malformed input degrades to the best reading. Internal to the
3
+ // inbound pipeline (not public API); exported for its tests.
4
+ //
5
+ // The message is held as a latin1 string (one char per byte) while it is split, so
6
+ // offsets are byte offsets and slices convert back losslessly; charsets are decoded
7
+ // only on the final text of a header or body.
8
+ const MAX_DEPTH = 20;
9
+ function header(entity, name) {
10
+ return entity.headers.find(h => h.name === name)?.value;
11
+ }
12
+ function splitEntity(raw) {
13
+ let at = -1;
14
+ let bodyAt = 0;
15
+ if (raw.startsWith('\r\n')) {
16
+ at = 0;
17
+ bodyAt = 2;
18
+ }
19
+ else if (raw.startsWith('\n')) {
20
+ at = 0;
21
+ bodyAt = 1;
22
+ }
23
+ else {
24
+ const m = /\r?\n\r?\n/.exec(raw);
25
+ if (m !== null) {
26
+ at = m.index;
27
+ bodyAt = m.index + m[0].length;
28
+ }
29
+ }
30
+ const head = at < 0 ? raw : raw.slice(0, at);
31
+ const body = at < 0 ? '' : raw.slice(bodyAt);
32
+ const headers = [];
33
+ let current = null;
34
+ for (const line of head.split(/\r?\n/)) {
35
+ if (/^[ \t]/.test(line)) {
36
+ if (current !== null)
37
+ current.value += ` ${line.trim()}`;
38
+ continue;
39
+ }
40
+ const colon = line.indexOf(':');
41
+ if (colon <= 0 || /[\s\x00-\x1f]/.test(line.slice(0, colon))) {
42
+ current = null;
43
+ continue;
44
+ }
45
+ current = { name: line.slice(0, colon).toLowerCase(), value: line.slice(colon + 1).trim() };
46
+ headers.push(current);
47
+ }
48
+ // A header with 8-bit bytes is UTF-8 when it is valid UTF-8, otherwise latin1 as read.
49
+ return { headers: headers.map(h => ({ name: h.name, value: decodeRawHeader(h.value) })), body };
50
+ }
51
+ function decodeRawHeader(value) {
52
+ if (!/[^\x00-\x7f]/.test(value))
53
+ return value;
54
+ try {
55
+ return new TextDecoder('utf-8', { fatal: true }).decode(Buffer.from(value, 'latin1'));
56
+ }
57
+ catch {
58
+ return value;
59
+ }
60
+ }
61
+ function decodeCharset(bytes, charset) {
62
+ const label = (charset ?? 'utf-8').trim().replace(/^"|"$/g, '').toLowerCase();
63
+ try {
64
+ return new TextDecoder(label === '' ? 'utf-8' : label).decode(bytes);
65
+ }
66
+ catch {
67
+ return new TextDecoder('utf-8').decode(bytes);
68
+ }
69
+ }
70
+ // ---- RFC 2047 encoded words ----
71
+ function decodeQ(text) {
72
+ const bytes = [];
73
+ for (let i = 0; i < text.length; i++) {
74
+ const c = text[i];
75
+ if (c === '_')
76
+ bytes.push(0x20);
77
+ else if (c === '=' && /^[0-9a-fA-F]{2}$/.test(text.slice(i + 1, i + 3))) {
78
+ bytes.push(parseInt(text.slice(i + 1, i + 3), 16));
79
+ i += 2;
80
+ }
81
+ else
82
+ bytes.push(c.charCodeAt(0) & 0xff);
83
+ }
84
+ return Buffer.from(bytes);
85
+ }
86
+ const ENCODED_WORD = /=\?([^?\s]+)\?([bBqQ])\?([^?\s]*)\?=/g;
87
+ /** Decodes RFC 2047 encoded words in `text`. Adjacent words are joined without the whitespace between them, and words in the same charset are decoded together so a multibyte character split across words survives. */
88
+ export function decodeWords(text) {
89
+ if (!text.includes('=?'))
90
+ return text;
91
+ const out = [];
92
+ let run = null;
93
+ const flush = () => {
94
+ if (run !== null)
95
+ out.push(decodeCharset(Buffer.concat(run.bytes), run.charset));
96
+ run = null;
97
+ };
98
+ let last = 0;
99
+ for (const m of text.matchAll(ENCODED_WORD)) {
100
+ const between = text.slice(last, m.index);
101
+ if (run !== null && between.trim() === '') {
102
+ // whitespace between adjacent encoded words is dropped
103
+ }
104
+ else {
105
+ flush();
106
+ out.push(between);
107
+ }
108
+ const charset = m[1].split('*')[0].toLowerCase();
109
+ const bytes = m[2].toLowerCase() === 'b' ? Buffer.from(m[3], 'base64') : decodeQ(m[3]);
110
+ if (run !== null && run.charset !== charset)
111
+ flush();
112
+ if (run === null)
113
+ run = { charset, bytes: [] };
114
+ run.bytes.push(bytes);
115
+ last = m.index + m[0].length;
116
+ }
117
+ flush();
118
+ out.push(text.slice(last));
119
+ return out.join('');
120
+ }
121
+ // ---- structured header values ----
122
+ function unquote(text) {
123
+ const t = text.trim();
124
+ if (t.length >= 2 && t.startsWith('"') && t.endsWith('"'))
125
+ return t.slice(1, -1).replace(/\\(.)/g, '$1');
126
+ return t;
127
+ }
128
+ function splitTop(text, separator) {
129
+ const parts = [];
130
+ let cur = '';
131
+ let quoted = false;
132
+ for (let i = 0; i < text.length; i++) {
133
+ const c = text[i];
134
+ if (quoted) {
135
+ cur += c;
136
+ if (c === '\\' && i + 1 < text.length)
137
+ cur += text[++i];
138
+ else if (c === '"')
139
+ quoted = false;
140
+ continue;
141
+ }
142
+ if (c === '"') {
143
+ quoted = true;
144
+ cur += c;
145
+ continue;
146
+ }
147
+ if (c === separator) {
148
+ parts.push(cur);
149
+ cur = '';
150
+ continue;
151
+ }
152
+ cur += c;
153
+ }
154
+ parts.push(cur);
155
+ return parts;
156
+ }
157
+ function percentBytes(text) {
158
+ const bytes = [];
159
+ for (let i = 0; i < text.length; i++) {
160
+ if (text[i] === '%' && /^[0-9a-fA-F]{2}$/.test(text.slice(i + 1, i + 3))) {
161
+ bytes.push(parseInt(text.slice(i + 1, i + 3), 16));
162
+ i += 2;
163
+ }
164
+ else
165
+ bytes.push(text.charCodeAt(i) & 0xff);
166
+ }
167
+ return Buffer.from(bytes);
168
+ }
169
+ /** Parses `value; name=param; name*=utf-8''enc; name*0*=...` and resolves RFC 2231 extended and continued parameters. */
170
+ function parseStructured(text) {
171
+ if (text === undefined)
172
+ return { value: '', params: new Map() };
173
+ const [first, ...rest] = splitTop(text, ';');
174
+ const plain = new Map();
175
+ const groups = new Map();
176
+ for (const part of rest) {
177
+ const eq = part.indexOf('=');
178
+ if (eq <= 0)
179
+ continue;
180
+ const key = part.slice(0, eq).trim().toLowerCase();
181
+ const value = unquote(part.slice(eq + 1));
182
+ const m = /^([^*]+)(?:\*(\d+))?(\*)?$/.exec(key);
183
+ if (m === null || (m[2] === undefined && m[3] === undefined)) {
184
+ plain.set(key, value);
185
+ continue;
186
+ }
187
+ const list = groups.get(m[1]) ?? [];
188
+ list.push({ n: m[2] === undefined ? 0 : Number(m[2]), ext: m[3] !== undefined, value });
189
+ groups.set(m[1], list);
190
+ }
191
+ const params = new Map(plain);
192
+ for (const [name, list] of groups) {
193
+ list.sort((a, b) => a.n - b.n);
194
+ let charset;
195
+ const chunks = [];
196
+ list.forEach((seg, i) => {
197
+ let v = seg.value;
198
+ if (i === 0 && seg.ext) {
199
+ const m = /^([^']*)'[^']*'(.*)$/s.exec(v);
200
+ if (m !== null) {
201
+ charset = m[1] === '' ? undefined : m[1];
202
+ v = m[2];
203
+ }
204
+ }
205
+ chunks.push(seg.ext ? percentBytes(v) : Buffer.from(v, 'latin1'));
206
+ });
207
+ params.set(name, decodeCharset(Buffer.concat(chunks), charset));
208
+ }
209
+ return { value: (first ?? '').trim(), params };
210
+ }
211
+ // ---- addresses ----
212
+ /** Parses an address list (RFC 5322 mailboxes, groups, quoted names, comments, encoded words). */
213
+ export function parseAddresses(text) {
214
+ if (text === undefined || text.trim() === '')
215
+ return [];
216
+ const mailboxes = [];
217
+ let cur = '';
218
+ let quoted = false;
219
+ let angle = false;
220
+ let comment = 0;
221
+ for (let i = 0; i < text.length; i++) {
222
+ const c = text[i];
223
+ if (quoted) {
224
+ cur += c;
225
+ if (c === '\\' && i + 1 < text.length)
226
+ cur += text[++i];
227
+ else if (c === '"')
228
+ quoted = false;
229
+ continue;
230
+ }
231
+ if (comment > 0) {
232
+ cur += c;
233
+ if (c === '\\' && i + 1 < text.length)
234
+ cur += text[++i];
235
+ else if (c === '(')
236
+ comment++;
237
+ else if (c === ')')
238
+ comment--;
239
+ continue;
240
+ }
241
+ if (c === '"') {
242
+ quoted = true;
243
+ cur += c;
244
+ continue;
245
+ }
246
+ if (c === '(') {
247
+ comment = 1;
248
+ cur += c;
249
+ continue;
250
+ }
251
+ if (c === '<')
252
+ angle = true;
253
+ else if (c === '>')
254
+ angle = false;
255
+ if (!angle && c === ':') {
256
+ cur = '';
257
+ continue;
258
+ } // group name
259
+ if (!angle && (c === ',' || c === ';')) {
260
+ mailboxes.push(cur);
261
+ cur = '';
262
+ continue;
263
+ }
264
+ cur += c;
265
+ }
266
+ mailboxes.push(cur);
267
+ const result = [];
268
+ for (const box of mailboxes) {
269
+ const parsed = parseMailbox(box);
270
+ if (parsed !== null)
271
+ result.push(parsed);
272
+ }
273
+ return result;
274
+ }
275
+ function stripComments(text) {
276
+ const comments = [];
277
+ let out = '';
278
+ let depth = 0;
279
+ let quoted = false;
280
+ let current = '';
281
+ for (let i = 0; i < text.length; i++) {
282
+ const c = text[i];
283
+ if (quoted) {
284
+ out += c;
285
+ if (c === '\\' && i + 1 < text.length)
286
+ out += text[++i];
287
+ else if (c === '"')
288
+ quoted = false;
289
+ continue;
290
+ }
291
+ if (depth > 0) {
292
+ if (c === '\\' && i + 1 < text.length) {
293
+ current += text[++i];
294
+ continue;
295
+ }
296
+ if (c === '(')
297
+ depth++;
298
+ else if (c === ')') {
299
+ depth--;
300
+ if (depth === 0) {
301
+ comments.push(current);
302
+ current = '';
303
+ continue;
304
+ }
305
+ }
306
+ current += c;
307
+ continue;
308
+ }
309
+ if (c === '"') {
310
+ quoted = true;
311
+ out += c;
312
+ continue;
313
+ }
314
+ if (c === '(') {
315
+ depth = 1;
316
+ continue;
317
+ }
318
+ out += c;
319
+ }
320
+ return { text: out, comments };
321
+ }
322
+ function parseMailbox(box) {
323
+ const { text, comments } = stripComments(box);
324
+ const t = text.trim();
325
+ if (t === '')
326
+ return null;
327
+ const lt = t.lastIndexOf('<');
328
+ const gt = t.lastIndexOf('>');
329
+ if (lt >= 0 && gt > lt) {
330
+ const address = t.slice(lt + 1, gt).trim().replace(/^.*:/, '');
331
+ const name = decodeWords(unquote(t.slice(0, lt)));
332
+ return address === '' ? null : { address, name };
333
+ }
334
+ const address = unquote(t);
335
+ if (!address.includes('@'))
336
+ return null;
337
+ return { address, name: comments.length > 0 ? decodeWords(comments[0].trim()) : '' };
338
+ }
339
+ function idsOf(text) {
340
+ if (text === undefined)
341
+ return [];
342
+ return [...text.matchAll(/<([^<>\s]+)>/g)].map(m => m[1]);
343
+ }
344
+ // ---- bodies ----
345
+ function decodeTransfer(body, encoding) {
346
+ const e = (encoding ?? '7bit').trim().toLowerCase();
347
+ if (e === 'base64')
348
+ return Buffer.from(body.replace(/[^A-Za-z0-9+/=_-]/g, ''), 'base64');
349
+ if (e === 'quoted-printable') {
350
+ const joined = body.replace(/[ \t]+(?=\r?\n)/g, '').replace(/=\r?\n/g, '');
351
+ const bytes = [];
352
+ for (let i = 0; i < joined.length; i++) {
353
+ const c = joined[i];
354
+ if (c === '=' && /^[0-9a-fA-F]{2}$/.test(joined.slice(i + 1, i + 3))) {
355
+ bytes.push(parseInt(joined.slice(i + 1, i + 3), 16));
356
+ i += 2;
357
+ }
358
+ else
359
+ bytes.push(joined.charCodeAt(i) & 0xff);
360
+ }
361
+ return Buffer.from(bytes);
362
+ }
363
+ return Buffer.from(body, 'latin1');
364
+ }
365
+ function splitMultipart(body, boundary) {
366
+ const delim = `--${boundary}`;
367
+ const parts = [];
368
+ let start = -1;
369
+ let pos = 0;
370
+ for (;;) {
371
+ const idx = body.indexOf(delim, pos);
372
+ if (idx < 0)
373
+ break;
374
+ pos = idx + 1;
375
+ if (idx > 0 && body[idx - 1] !== '\n')
376
+ continue;
377
+ const after = idx + delim.length;
378
+ const eol = body.indexOf('\n', after);
379
+ const rest = body.slice(after, eol < 0 ? body.length : eol);
380
+ const closing = rest.startsWith('--');
381
+ if (!closing && !/^[ \t]*\r?$/.test(rest))
382
+ continue;
383
+ if (start >= 0) {
384
+ let end = idx;
385
+ if (body[end - 1] === '\n')
386
+ end--;
387
+ if (body[end - 1] === '\r')
388
+ end--;
389
+ parts.push(body.slice(start, Math.max(start, end)));
390
+ start = -1;
391
+ }
392
+ if (closing || eol < 0)
393
+ return parts;
394
+ start = eol + 1;
395
+ pos = start;
396
+ }
397
+ if (start >= 0)
398
+ parts.push(body.slice(start)); // no closing boundary
399
+ return parts;
400
+ }
401
+ function walk(entity, depth, out) {
402
+ const type = parseStructured(header(entity, 'content-type'));
403
+ const mediaType = (type.value === '' ? 'text/plain' : type.value).toLowerCase();
404
+ const disposition = parseStructured(header(entity, 'content-disposition'));
405
+ const disp = disposition.value.toLowerCase();
406
+ const contentId = idsOf(header(entity, 'content-id'))[0] ?? null;
407
+ if (mediaType.startsWith('multipart/') && depth < MAX_DEPTH) {
408
+ const boundary = type.params.get('boundary');
409
+ if (boundary !== undefined && boundary !== '') {
410
+ for (const part of splitMultipart(entity.body, boundary))
411
+ walk(splitEntity(part), depth + 1, out);
412
+ return;
413
+ }
414
+ }
415
+ const rawName = disposition.params.get('filename') ?? type.params.get('name');
416
+ const filename = rawName === undefined ? null : decodeWords(rawName);
417
+ const isText = mediaType === 'text/plain' || mediaType === 'text/html';
418
+ const attached = disp === 'attachment' || filename !== null || !isText || mediaType.startsWith('multipart/');
419
+ const content = decodeTransfer(entity.body, header(entity, 'content-transfer-encoding'));
420
+ if (!attached) {
421
+ const decoded = decodeCharset(content, type.params.get('charset'));
422
+ if (mediaType === 'text/html') {
423
+ if (out.html === null)
424
+ out.html = decoded;
425
+ }
426
+ else if (out.text === null)
427
+ out.text = decoded;
428
+ return;
429
+ }
430
+ out.attachments.push({
431
+ filename,
432
+ mediaType: mediaType.startsWith('multipart/') ? 'application/octet-stream' : mediaType,
433
+ size: content.length,
434
+ contentId,
435
+ inline: disp === 'inline' || (disp === '' && contentId !== null),
436
+ content,
437
+ });
438
+ }
439
+ const EMPTY = {
440
+ messageId: null, inReplyTo: null, threadIds: [], references: [], from: null, to: [], cc: [], replyTo: [],
441
+ subject: '', date: null, text: null, html: null, attachments: [],
442
+ };
443
+ /** Parses a raw RFC 5322 message. Never throws; unreadable input yields as much as could be read. */
444
+ export function parseMime(raw) {
445
+ try {
446
+ const entity = splitEntity(raw.toString('latin1'));
447
+ const out = { text: null, html: null, attachments: [] };
448
+ walk(entity, 0, out);
449
+ const inReplyToIds = idsOf(header(entity, 'in-reply-to'));
450
+ const references = idsOf(header(entity, 'references'));
451
+ const threadIds = [...new Set([...inReplyToIds, ...references])];
452
+ const date = header(entity, 'date');
453
+ const parsedDate = date === undefined ? null : new Date(date);
454
+ return {
455
+ messageId: idsOf(header(entity, 'message-id'))[0] ?? null,
456
+ inReplyTo: inReplyToIds[0] ?? null,
457
+ threadIds,
458
+ references,
459
+ from: parseAddresses(header(entity, 'from'))[0] ?? null,
460
+ to: parseAddresses(header(entity, 'to')),
461
+ cc: parseAddresses(header(entity, 'cc')),
462
+ replyTo: parseAddresses(header(entity, 'reply-to')),
463
+ subject: decodeWords(header(entity, 'subject') ?? ''),
464
+ date: parsedDate === null || Number.isNaN(parsedDate.getTime()) ? null : parsedDate,
465
+ text: out.text,
466
+ html: out.html,
467
+ attachments: out.attachments,
468
+ };
469
+ }
470
+ catch {
471
+ return EMPTY;
472
+ }
473
+ }
474
+ //# sourceMappingURL=mime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime.js","sourceRoot":"","sources":["../../../src/infra/email/mime.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { createMail } from './mail.js';
2
2
  import { ses, devStandIn } from './providers.js';
3
3
  import { snsWebhook } from './sns.js';
4
- /** Mail namespace — transactional email through a job queue, SES v2 or a dev stand-in, bounce and complaint suppression. */
4
+ import { createInbound, sesReceipt, inboundFolder } from './inbound.js';
5
+ /** Mail namespace — email through a job queue, SES v2 or a dev stand-in, bounce and complaint suppression, and receiving. */
5
6
  export declare const mail: {
6
7
  /** Creates the mail interface: `send(db, { to, template, data, key })` in the caller's transaction, and the `jobs` that deliver. */
7
8
  readonly create: typeof createMail;
@@ -11,5 +12,11 @@ export declare const mail: {
11
12
  readonly devStandIn: typeof devStandIn;
12
13
  /** Inbound handler for SES bounce and complaint events delivered through SNS; suppresses the address. */
13
14
  readonly snsWebhook: typeof snsWebhook;
15
+ /** Receiving email: `inbound({ source, queue, onMessage, ... })` returns `{ webhook, jobs, scan, sweep, get }`; messages arrive parsed, threaded into conversations, attachments stored as tenant files. */
16
+ readonly inbound: typeof createInbound;
17
+ /** Inbound source: SES receipt rule storing raw messages in S3 and notifying a signed SNS topic. */
18
+ readonly sesReceipt: typeof sesReceipt;
19
+ /** Inbound development source: `.eml` files dropped in a folder, received by `scan()`; refused in production. */
20
+ readonly inboundFolder: typeof inboundFolder;
14
21
  };
15
22
  //# sourceMappingURL=namespace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/infra/email/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,4HAA4H;AAC5H,eAAO,MAAM,IAAI;IACf,oIAAoI;;IAEpI,gEAAgE;;IAEhE,yGAAyG;;IAEzG,yGAAyG;;CAEjG,CAAA"}
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/infra/email/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEvE,6HAA6H;AAC7H,eAAO,MAAM,IAAI;IACf,oIAAoI;;IAEpI,gEAAgE;;IAEhE,yGAAyG;;IAEzG,yGAAyG;;IAEzG,4MAA4M;;IAE5M,oGAAoG;;IAEpG,iHAAiH;;CAEzG,CAAA"}
@@ -1,7 +1,8 @@
1
1
  import { createMail } from './mail.js';
2
2
  import { ses, devStandIn } from './providers.js';
3
3
  import { snsWebhook } from './sns.js';
4
- /** Mail namespace — transactional email through a job queue, SES v2 or a dev stand-in, bounce and complaint suppression. */
4
+ import { createInbound, sesReceipt, inboundFolder } from './inbound.js';
5
+ /** Mail namespace — email through a job queue, SES v2 or a dev stand-in, bounce and complaint suppression, and receiving. */
5
6
  export const mail = {
6
7
  /** Creates the mail interface: `send(db, { to, template, data, key })` in the caller's transaction, and the `jobs` that deliver. */
7
8
  create: createMail,
@@ -11,5 +12,11 @@ export const mail = {
11
12
  devStandIn,
12
13
  /** Inbound handler for SES bounce and complaint events delivered through SNS; suppresses the address. */
13
14
  snsWebhook,
15
+ /** Receiving email: `inbound({ source, queue, onMessage, ... })` returns `{ webhook, jobs, scan, sweep, get }`; messages arrive parsed, threaded into conversations, attachments stored as tenant files. */
16
+ inbound: createInbound,
17
+ /** Inbound source: SES receipt rule storing raw messages in S3 and notifying a signed SNS topic. */
18
+ sesReceipt,
19
+ /** Inbound development source: `.eml` files dropped in a folder, received by `scan()`; refused in production. */
20
+ inboundFolder,
14
21
  };
15
22
  //# sourceMappingURL=namespace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/infra/email/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,4HAA4H;AAC5H,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,oIAAoI;IACpI,MAAM,EAAE,UAAU;IAClB,gEAAgE;IAChE,GAAG;IACH,yGAAyG;IACzG,UAAU;IACV,yGAAyG;IACzG,UAAU;CACF,CAAA"}
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/infra/email/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEvE,6HAA6H;AAC7H,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,oIAAoI;IACpI,MAAM,EAAE,UAAU;IAClB,gEAAgE;IAChE,GAAG;IACH,yGAAyG;IACzG,UAAU;IACV,yGAAyG;IACzG,UAAU;IACV,4MAA4M;IAC5M,OAAO,EAAE,aAAa;IACtB,oGAAoG;IACpG,UAAU;IACV,iHAAiH;IACjH,aAAa;CACL,CAAA"}
@@ -9,6 +9,8 @@ export interface OutgoingMessage {
9
9
  readonly text: string;
10
10
  readonly html?: string;
11
11
  readonly configurationSet?: string;
12
+ /** Extra headers, e.g. `In-Reply-To` and `References` for a reply. */
13
+ readonly headers?: Readonly<Record<string, string>>;
12
14
  }
13
15
  /** Sends one rendered message. A throw means it was not accepted and may be retried. */
14
16
  export interface MailProvider {
@@ -33,7 +35,7 @@ export interface SesConfig {
33
35
  export declare function ses(config: SesConfig): MailProvider;
34
36
  /**
35
37
  * Development stand-in: writes each rendered message to `<dir>/<messageId>.json`
36
- * (from, to, subject, text, html) and logs one line, sending nothing.
38
+ * (from, to, subject, text, html, and headers when there are any) and logs one line, sending nothing.
37
39
  * `mail.create` refuses it when the environment is production.
38
40
  */
39
41
  export declare function devStandIn(config: {
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/infra/email/providers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAE7D,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACvE;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAA;IACnD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAsCnD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAYzE"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/infra/email/providers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAE7D,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,sEAAsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACpD;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACvE;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAA;IACnD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAwCnD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAezE"}
@@ -13,12 +13,14 @@ export function ses(config) {
13
13
  name: 'ses',
14
14
  async send(message) {
15
15
  const set = message.configurationSet ?? config.configurationSet;
16
+ const headerList = Object.entries(message.headers ?? {}).map(([Name, Value]) => ({ Name, Value }));
16
17
  const body = JSON.stringify({
17
18
  FromEmailAddress: message.from,
18
19
  Destination: { ToAddresses: [message.to] },
19
20
  Content: {
20
21
  Simple: {
21
22
  Subject: { Data: message.subject, Charset: 'UTF-8' },
23
+ ...(headerList.length > 0 ? { Headers: headerList } : {}),
22
24
  Body: {
23
25
  Text: { Data: message.text, Charset: 'UTF-8' },
24
26
  ...(message.html !== undefined ? { Html: { Data: message.html, Charset: 'UTF-8' } } : {}),
@@ -52,7 +54,7 @@ export function ses(config) {
52
54
  }
53
55
  /**
54
56
  * Development stand-in: writes each rendered message to `<dir>/<messageId>.json`
55
- * (from, to, subject, text, html) and logs one line, sending nothing.
57
+ * (from, to, subject, text, html, and headers when there are any) and logs one line, sending nothing.
56
58
  * `mail.create` refuses it when the environment is production.
57
59
  */
58
60
  export function devStandIn(config) {
@@ -61,8 +63,11 @@ export function devStandIn(config) {
61
63
  async send(message) {
62
64
  await mkdir(config.dir, { recursive: true });
63
65
  const file = join(config.dir, `${message.messageId}.json`);
64
- const { from, to, subject, text, html } = message;
65
- await writeFile(file, JSON.stringify({ from, to, subject, text, ...(html !== undefined ? { html } : {}) }, null, 2));
66
+ const { from, to, subject, text, html, headers } = message;
67
+ await writeFile(file, JSON.stringify({
68
+ from, to, subject, text, ...(html !== undefined ? { html } : {}),
69
+ ...(headers !== undefined && Object.keys(headers).length > 0 ? { headers } : {}),
70
+ }, null, 2));
66
71
  getBaseLogger().info({ event: 'email dev stand-in', to, file }, 'email written to file instead of sent');
67
72
  return { providerMessageId: `dev-${message.messageId}` };
68
73
  },
@@ -1 +1 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/infra/email/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAuB,MAAM,iBAAiB,CAAA;AA6B7D;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,MAAiB;IACnC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,iBAAiB,MAAM,CAAC,MAAM,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACpG,OAAO;QACL,IAAI,EAAE,KAAK;QACX,KAAK,CAAC,IAAI,CAAC,OAAO;YAChB,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAA;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC1B,gBAAgB,EAAE,OAAO,CAAC,IAAI;gBAC9B,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;gBAC1C,OAAO,EAAE;oBACP,MAAM,EAAE;wBACN,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;wBACpD,IAAI,EAAE;4BACJ,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;4BAC9C,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC1F;qBACF;iBACF;gBACD,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5D,CAAC,CAAA;YACF,MAAM,GAAG,GAAG,GAAG,IAAI,2BAA2B,CAAA;YAC9C,MAAM,OAAO,GAAG,MAAM,CAAC;gBACrB,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI;gBAC1E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC,WAAW,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC5B,IAAI,MAAM,GAA4B,EAAE,CAAA;YACxC,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;YACpF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;gBAClF,MAAM,IAAI,KAAK,CAAC,4CAA4C,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;YACtJ,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAA;YAC9B,IAAI,OAAO,EAAE,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;YAC3F,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAA;QAClC,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAgC;IACzD,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,KAAK,CAAC,IAAI,CAAC,OAAO;YAChB,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,OAAO,CAAC,CAAA;YAC1D,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;YACjD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACpH,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,uCAAuC,CAAC,CAAA;YACxG,OAAO,EAAE,iBAAiB,EAAE,OAAO,OAAO,CAAC,SAAS,EAAE,EAAE,CAAA;QAC1D,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/infra/email/providers.ts"],"names":[],"mappings":"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"}