@postalsys/email-content 0.0.5 → 0.1.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 (96) hide show
  1. package/README.md +192 -17
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/analyze.d.ts +55 -15
  4. package/dist/analyze.d.ts.map +1 -1
  5. package/dist/analyze.js +264 -61
  6. package/dist/analyze.js.map +1 -1
  7. package/dist/canonical/html.d.ts +21 -2
  8. package/dist/canonical/html.d.ts.map +1 -1
  9. package/dist/canonical/html.js +213 -14
  10. package/dist/canonical/html.js.map +1 -1
  11. package/dist/classify/confidence.d.ts +12 -0
  12. package/dist/classify/confidence.d.ts.map +1 -1
  13. package/dist/classify/confidence.js +54 -4
  14. package/dist/classify/confidence.js.map +1 -1
  15. package/dist/classify/reconcile.d.ts +25 -17
  16. package/dist/classify/reconcile.d.ts.map +1 -1
  17. package/dist/classify/reconcile.js +52 -20
  18. package/dist/classify/reconcile.js.map +1 -1
  19. package/dist/cli/annotate.d.ts.map +1 -1
  20. package/dist/cli/annotate.js +6 -3
  21. package/dist/cli/annotate.js.map +1 -1
  22. package/dist/cli/args.d.ts +14 -0
  23. package/dist/cli/args.d.ts.map +1 -1
  24. package/dist/cli/args.js +48 -1
  25. package/dist/cli/args.js.map +1 -1
  26. package/dist/cli/benchmark.d.ts +39 -0
  27. package/dist/cli/benchmark.d.ts.map +1 -1
  28. package/dist/cli/benchmark.js +179 -66
  29. package/dist/cli/benchmark.js.map +1 -1
  30. package/dist/cli/corpus.d.ts.map +1 -1
  31. package/dist/cli/corpus.js +13 -8
  32. package/dist/cli/corpus.js.map +1 -1
  33. package/dist/cli/disagreements.d.ts.map +1 -1
  34. package/dist/cli/disagreements.js +7 -4
  35. package/dist/cli/disagreements.js.map +1 -1
  36. package/dist/cli/evaluate.d.ts.map +1 -1
  37. package/dist/cli/evaluate.js +34 -10
  38. package/dist/cli/evaluate.js.map +1 -1
  39. package/dist/cli/extract.d.ts.map +1 -1
  40. package/dist/cli/extract.js +8 -3
  41. package/dist/cli/extract.js.map +1 -1
  42. package/dist/cli/main.js +8 -0
  43. package/dist/cli/main.js.map +1 -1
  44. package/dist/corpus/scanner.d.ts +9 -1
  45. package/dist/corpus/scanner.d.ts.map +1 -1
  46. package/dist/corpus/scanner.js +52 -13
  47. package/dist/corpus/scanner.js.map +1 -1
  48. package/dist/corpus/store.d.ts +29 -2
  49. package/dist/corpus/store.d.ts.map +1 -1
  50. package/dist/corpus/store.js +45 -2
  51. package/dist/corpus/store.js.map +1 -1
  52. package/dist/detect/patterns.d.ts +29 -0
  53. package/dist/detect/patterns.d.ts.map +1 -1
  54. package/dist/detect/patterns.js +80 -6
  55. package/dist/detect/patterns.js.map +1 -1
  56. package/dist/detect/reply-header.d.ts +14 -0
  57. package/dist/detect/reply-header.d.ts.map +1 -1
  58. package/dist/detect/reply-header.js +80 -37
  59. package/dist/detect/reply-header.js.map +1 -1
  60. package/dist/eval/oracle.d.ts +80 -0
  61. package/dist/eval/oracle.d.ts.map +1 -0
  62. package/dist/eval/oracle.js +250 -0
  63. package/dist/eval/oracle.js.map +1 -0
  64. package/dist/index.d.ts +6 -3
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +94 -56
  67. package/dist/index.js.map +1 -1
  68. package/dist/mime/model.d.ts +28 -3
  69. package/dist/mime/model.d.ts.map +1 -1
  70. package/dist/mime/model.js +41 -1
  71. package/dist/mime/model.js.map +1 -1
  72. package/dist/mime/parse.d.ts.map +1 -1
  73. package/dist/mime/parse.js +19 -2
  74. package/dist/mime/parse.js.map +1 -1
  75. package/dist/mime/select.d.ts +71 -0
  76. package/dist/mime/select.d.ts.map +1 -0
  77. package/dist/mime/select.js +198 -0
  78. package/dist/mime/select.js.map +1 -0
  79. package/dist/segment/html-blocks.d.ts +1 -1
  80. package/dist/segment/html-blocks.d.ts.map +1 -1
  81. package/dist/segment/html-blocks.js +77 -8
  82. package/dist/segment/html-blocks.js.map +1 -1
  83. package/dist/segment/text-blocks.d.ts.map +1 -1
  84. package/dist/segment/text-blocks.js +18 -1
  85. package/dist/segment/text-blocks.js.map +1 -1
  86. package/dist/segment/types.d.ts +14 -0
  87. package/dist/segment/types.d.ts.map +1 -1
  88. package/dist/types.d.ts +132 -11
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/types.js +37 -3
  91. package/dist/types.js.map +1 -1
  92. package/dist/util/worker-pool.d.ts +21 -0
  93. package/dist/util/worker-pool.d.ts.map +1 -1
  94. package/dist/util/worker-pool.js +61 -13
  95. package/dist/util/worker-pool.js.map +1 -1
  96. package/package.json +3 -2
@@ -8,10 +8,50 @@
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.DEFAULT_PARSE_OPTIONS = void 0;
11
+ exports.validateParseOptions = validateParseOptions;
12
+ const types_1 = require("../types");
11
13
  exports.DEFAULT_PARSE_OPTIONS = {
12
14
  maxTextPartBytes: 1024 * 1024,
13
15
  maxParts: 500,
14
16
  maxHeadSize: 1024 * 1024,
15
- ignoreEmbedded: false
17
+ ignoreEmbedded: false,
18
+ maxMessageBytes: 64 * 1024 * 1024,
19
+ maxTotalDecodedTextBytes: 16 * 1024 * 1024
16
20
  };
21
+ function requirePositiveInteger(value, option) {
22
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1) {
23
+ throw new types_1.ConfigurationError(option, 'a positive safe integer');
24
+ }
25
+ return value;
26
+ }
27
+ /**
28
+ * Validate caller supplied parse options and fill in the defaults.
29
+ *
30
+ * Rejects what is meaningless, and does not reject what is merely large. `NaN`, infinities,
31
+ * negatives, zero and fractions are always programmer errors and always throw. Upper bounds are
32
+ * documented as recommendations rather than enforced: a hard failure on a value the caller chose
33
+ * deliberately is more likely to take down a consuming service than to protect it, and the host is
34
+ * better placed than this library to know what its own memory budget is.
35
+ */
36
+ function validateParseOptions(input) {
37
+ if (input === undefined || input === null) {
38
+ return { ...exports.DEFAULT_PARSE_OPTIONS };
39
+ }
40
+ if (typeof input !== 'object') {
41
+ throw new types_1.ConfigurationError('parse', 'an object');
42
+ }
43
+ const options = { ...exports.DEFAULT_PARSE_OPTIONS };
44
+ for (const key of ['maxTextPartBytes', 'maxParts', 'maxHeadSize', 'maxMessageBytes', 'maxTotalDecodedTextBytes']) {
45
+ if (input[key] !== undefined) {
46
+ options[key] = requirePositiveInteger(input[key], `parse.${key}`);
47
+ }
48
+ }
49
+ if (input.ignoreEmbedded !== undefined) {
50
+ if (typeof input.ignoreEmbedded !== 'boolean') {
51
+ throw new types_1.ConfigurationError('parse.ignoreEmbedded', 'a boolean');
52
+ }
53
+ options.ignoreEmbedded = input.ignoreEmbedded;
54
+ }
55
+ return options;
56
+ }
17
57
  //# sourceMappingURL=model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/mime/model.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAgHU,QAAA,qBAAqB,GAA2B;IACzD,gBAAgB,EAAE,IAAI,GAAG,IAAI;IAC7B,QAAQ,EAAE,GAAG;IACb,WAAW,EAAE,IAAI,GAAG,IAAI;IACxB,cAAc,EAAE,KAAK;CACxB,CAAC"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/mime/model.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAwJH,oDAqBC;AA3KD,oCAA4D;AA6H/C,QAAA,qBAAqB,GAA2B;IACzD,gBAAgB,EAAE,IAAI,GAAG,IAAI;IAC7B,QAAQ,EAAE,GAAG;IACb,WAAW,EAAE,IAAI,GAAG,IAAI;IACxB,cAAc,EAAE,KAAK;IACrB,eAAe,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;IACjC,wBAAwB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;CAC7C,CAAC;AAEF,SAAS,sBAAsB,CAAC,KAAc,EAAE,MAAc;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,0BAAkB,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAC,KAAoB;IACrD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,EAAE,GAAG,6BAAqB,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,0BAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,GAAG,6BAAqB,EAAE,CAAC;IACrE,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,0BAA0B,CAAU,EAAE,CAAC;QACxH,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,0BAAkB,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IAClD,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/mime/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,EAA2C,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AA4HxH,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B/H;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAgMlG"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/mime/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,EAAoB,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAwB,MAAM,SAAS,CAAC;AA4HvH,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B/H;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkNlG"}
@@ -164,7 +164,7 @@ function structureSignature(parts, partsById, rootId) {
164
164
  * that is converted into a parsed message carrying a `mime_parse_error` warning.
165
165
  */
166
166
  async function parseMessage(raw, options = {}) {
167
- const opts = { ...model_1.DEFAULT_PARSE_OPTIONS, ...options };
167
+ const opts = (0, model_1.validateParseOptions)(options);
168
168
  const warnings = [];
169
169
  const pendingParts = [];
170
170
  const partsById = new Map();
@@ -301,12 +301,29 @@ async function parseMessage(raw, options = {}) {
301
301
  finish();
302
302
  }
303
303
  });
304
+ // Aggregate budget across every text part. Per part caps do not bound total work: a thousand
305
+ // individually legal parts add up to the same memory as one enormous one.
306
+ let decodedBudget = opts.maxTotalDecodedTextBytes;
307
+ let aggregateReported = false;
304
308
  for (const pending of pendingParts) {
305
309
  if (pending.nonContiguous) {
306
310
  warnings.push({ code: 'non_contiguous_body', mimePart: pending.part.partId });
307
311
  }
312
+ if (pending.collecting && pending.bodyBytes > 0 && decodedBudget <= 0) {
313
+ if (!aggregateReported) {
314
+ aggregateReported = true;
315
+ warnings.push({
316
+ code: 'input_limit_exceeded',
317
+ mimePart: pending.part.partId,
318
+ detail: `maxTotalDecodedTextBytes (${opts.maxTotalDecodedTextBytes})`
319
+ });
320
+ }
321
+ pending.bodyChunks.length = 0;
322
+ continue;
323
+ }
308
324
  if (pending.collecting && pending.bodyBytes > 0) {
309
- pending.part.decoded = await decodeTextPart(pending, opts.maxTextPartBytes, warnings);
325
+ pending.part.decoded = await decodeTextPart(pending, Math.min(opts.maxTextPartBytes, decodedBudget), warnings);
326
+ decodedBudget -= pending.part.decoded.text.length;
310
327
  }
311
328
  else if (pending.collecting) {
312
329
  pending.part.decoded = {
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/mime/parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/mime/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Which parts of a MIME tree hold the message body.
3
+ *
4
+ * This used to be four lines: walk the flat part list, keep the longest `text/plain` and the
5
+ * longest `text/html`. That is wrong in a way that loses content silently. In
6
+ * `multipart/mixed(P, P)` the two children are not two renderings of one thing, they are two
7
+ * pieces of the message, and picking the longer one deleted the shorter. A three line authored
8
+ * reply followed by a long gateway disclaimer came out as the disclaimer alone, with no warning.
9
+ *
10
+ * MIME structure carries the meaning that length does not:
11
+ *
12
+ * - `multipart/alternative` holds alternative renderings of the same content. At most one text and
13
+ * one HTML representation come out of one group.
14
+ * - `multipart/mixed` holds ordered sibling content, all of which may belong to the visible message.
15
+ * Each body-bearing child is an independent section.
16
+ * - `multipart/related` holds one root body plus inline resources. The root is named by the
17
+ * container's `start` parameter or is simply the first child.
18
+ * - `message/rfc822` is embedded content, not the container's own body.
19
+ * - An attachment disposition excludes a part. The *absence* of one does not make sibling parts
20
+ * alternatives, which is the assumption the old code made.
21
+ *
22
+ * Length survives only as a tie breaker inside one structurally equivalent group. Document order
23
+ * decides everything else.
24
+ */
25
+ import { type MimePart, type ParsedMessage } from './model';
26
+ /** Where a section sits in the message. The first body-bearing section is the primary one. */
27
+ export type SectionRole = 'primary' | 'appended';
28
+ /** One structurally independent piece of the body, in whichever representations it has. */
29
+ export interface PlannedSection {
30
+ text: MimePart | null;
31
+ html: MimePart | null;
32
+ role: SectionRole;
33
+ }
34
+ /** Why an eligible looking text part is not in the plan. Machine readable, never free text. */
35
+ export type ExclusionReason =
36
+ /** Another member of the same `multipart/alternative` group represents this content. */
37
+ 'alternative_not_preferred'
38
+ /** An inline resource of a `multipart/related`, not its root. */
39
+ | 'related_resource'
40
+ /** Inside a `message/rfc822`. Embedded messages are content for the caller to render, not body. */
41
+ | 'embedded_message'
42
+ /** Carried an attachment disposition. */
43
+ | 'attachment'
44
+ /** Nesting deeper than the walk is willing to follow. */
45
+ | 'max_depth_exceeded';
46
+ export interface ExcludedPart {
47
+ partId: string;
48
+ reason: ExclusionReason;
49
+ }
50
+ export interface BodyPlan {
51
+ /** Body-bearing sections in document order. Empty when the message has no body. */
52
+ sections: PlannedSection[];
53
+ excluded: ExcludedPart[];
54
+ }
55
+ /**
56
+ * Build the ordered body plan for a parsed message.
57
+ *
58
+ * The first body-bearing section is `primary`; everything after it is `appended`. Appended sections
59
+ * are ordinary content until a rule says otherwise: gateways append substantive text as often as
60
+ * they append disclaimers, so position is evidence, not a label.
61
+ */
62
+ export declare function planBody(message: ParsedMessage): BodyPlan;
63
+ /**
64
+ * Exclusions a caller should be told about.
65
+ *
66
+ * An unused `multipart/alternative` member, an attachment and an embedded message are all excluded
67
+ * by a written rule and are not losses. A text part dropped because it was not the related root, or
68
+ * because the tree nested past the walk's limit, is content that exists and is not represented.
69
+ */
70
+ export declare function reportableExclusions(plan: BodyPlan): ExcludedPart[];
71
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/mime/select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAE5D,8FAA8F;AAC9F,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjD,2FAA2F;AAC3F,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;CACrB;AAED,+FAA+F;AAC/F,MAAM,MAAM,eAAe;AACvB,wFAAwF;AACtF,2BAA2B;AAC7B,iEAAiE;GAC/D,kBAAkB;AACpB,mGAAmG;GACjG,kBAAkB;AACpB,yCAAyC;GACvC,YAAY;AACd,yDAAyD;GACvD,oBAAoB,CAAC;AAE3B,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACrB,mFAAmF;IACnF,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC5B;AA8JD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAazD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,EAAE,CAEnE"}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /**
3
+ * Which parts of a MIME tree hold the message body.
4
+ *
5
+ * This used to be four lines: walk the flat part list, keep the longest `text/plain` and the
6
+ * longest `text/html`. That is wrong in a way that loses content silently. In
7
+ * `multipart/mixed(P, P)` the two children are not two renderings of one thing, they are two
8
+ * pieces of the message, and picking the longer one deleted the shorter. A three line authored
9
+ * reply followed by a long gateway disclaimer came out as the disclaimer alone, with no warning.
10
+ *
11
+ * MIME structure carries the meaning that length does not:
12
+ *
13
+ * - `multipart/alternative` holds alternative renderings of the same content. At most one text and
14
+ * one HTML representation come out of one group.
15
+ * - `multipart/mixed` holds ordered sibling content, all of which may belong to the visible message.
16
+ * Each body-bearing child is an independent section.
17
+ * - `multipart/related` holds one root body plus inline resources. The root is named by the
18
+ * container's `start` parameter or is simply the first child.
19
+ * - `message/rfc822` is embedded content, not the container's own body.
20
+ * - An attachment disposition excludes a part. The *absence* of one does not make sibling parts
21
+ * alternatives, which is the assumption the old code made.
22
+ *
23
+ * Length survives only as a tie breaker inside one structurally equivalent group. Document order
24
+ * decides everything else.
25
+ */
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.planBody = planBody;
28
+ exports.reportableExclusions = reportableExclusions;
29
+ /**
30
+ * Nesting depth the walk follows.
31
+ *
32
+ * Real mail nests a handful of levels. The parser already caps the part count; this caps the shape,
33
+ * so a tree crafted to be deep rather than wide cannot drive the recursion into the stack.
34
+ */
35
+ const MAX_DEPTH = 32;
36
+ function isEligibleLeaf(part) {
37
+ return (part.contentType === 'text/plain' || part.contentType === 'text/html') && part.disposition !== 'attachment' && Boolean(part.decoded);
38
+ }
39
+ /** Every text leaf under a subtree, for recording what a whole branch excluded. */
40
+ function textLeavesUnder(message, part, into, reason, depth = 0) {
41
+ if (depth > MAX_DEPTH) {
42
+ return;
43
+ }
44
+ if (isEligibleLeaf(part)) {
45
+ into.push({ partId: part.partId, reason });
46
+ return;
47
+ }
48
+ for (const childId of part.childIds) {
49
+ const child = message.partsById.get(childId);
50
+ if (child) {
51
+ textLeavesUnder(message, child, into, reason, depth + 1);
52
+ }
53
+ }
54
+ }
55
+ /** Normalise a `Content-ID` or a `start` parameter to a bare token for comparison. */
56
+ function normaliseContentId(value) {
57
+ return (value ?? '').trim().replace(/^</, '').replace(/>$/, '').toLowerCase();
58
+ }
59
+ function contentIdOf(part) {
60
+ return normaliseContentId(part.headers.find(entry => entry.key === 'content-id')?.value);
61
+ }
62
+ /** The root body of a `multipart/related`: named by `start`, else the first child. */
63
+ function relatedRoot(message, part) {
64
+ const children = part.childIds.map(id => message.partsById.get(id)).filter(Boolean);
65
+ if (!children.length) {
66
+ return null;
67
+ }
68
+ const start = normaliseContentId(part.contentTypeParams.start);
69
+ if (start) {
70
+ const named = children.find(child => contentIdOf(child) === start);
71
+ if (named) {
72
+ return named;
73
+ }
74
+ }
75
+ return children[0];
76
+ }
77
+ function sectionsOf(message, part, excluded, depth) {
78
+ if (depth > MAX_DEPTH) {
79
+ textLeavesUnder(message, part, excluded, 'max_depth_exceeded');
80
+ return [];
81
+ }
82
+ if (part.disposition === 'attachment') {
83
+ if (isEligibleLeaf(part) || part.contentType === 'text/plain' || part.contentType === 'text/html') {
84
+ excluded.push({ partId: part.partId, reason: 'attachment' });
85
+ }
86
+ return [];
87
+ }
88
+ // An embedded message is content to classify or to render as an attachment, never the outer
89
+ // message's own body. Descending into one lets a forwarded thread replace what the sender wrote.
90
+ if (part.rfc822 || part.embeddedRoot) {
91
+ textLeavesUnder(message, part, excluded, 'embedded_message');
92
+ return [];
93
+ }
94
+ const children = part.childIds.map(id => message.partsById.get(id)).filter(Boolean);
95
+ if (part.multipart === 'alternative') {
96
+ // The unit of choice is a *branch*, not a part.
97
+ //
98
+ // An alternative member can itself be multipart, and `alternative(P, mixed(H, app, H))` is
99
+ // real mail: the HTML rendering is spread over two parts. Choosing "the last html part"
100
+ // there keeps the second and deletes the first, which is the loss this module exists to
101
+ // stop. So each branch is evaluated whole, the last branch offering each representation
102
+ // wins, and the two winners are paired position by position.
103
+ const branches = children.map(child => ({ child, sections: sectionsOf(message, child, excluded, depth + 1) }));
104
+ const textBranch = [...branches].reverse().find(branch => branch.sections.some(section => section.text));
105
+ const htmlBranch = [...branches].reverse().find(branch => branch.sections.some(section => section.html));
106
+ for (const branch of branches) {
107
+ if (branch !== textBranch && branch !== htmlBranch) {
108
+ textLeavesUnder(message, branch.child, excluded, 'alternative_not_preferred');
109
+ }
110
+ }
111
+ if (!textBranch || textBranch === htmlBranch) {
112
+ return htmlBranch?.sections ?? [];
113
+ }
114
+ if (!htmlBranch) {
115
+ return textBranch.sections;
116
+ }
117
+ // Two different branches, so one supplies the text rendering and the other the HTML one.
118
+ // Pairing by position keeps a multi part branch intact instead of flattening it.
119
+ const merged = [];
120
+ const length = Math.max(textBranch.sections.length, htmlBranch.sections.length);
121
+ for (let i = 0; i < length; i++) {
122
+ const fromText = textBranch.sections[i];
123
+ const fromHtml = htmlBranch.sections[i];
124
+ if (fromText?.html) {
125
+ excluded.push({ partId: fromText.html.partId, reason: 'alternative_not_preferred' });
126
+ }
127
+ if (fromHtml?.text) {
128
+ excluded.push({ partId: fromHtml.text.partId, reason: 'alternative_not_preferred' });
129
+ }
130
+ const text = fromText?.text ?? null;
131
+ const html = fromHtml?.html ?? null;
132
+ if (text || html) {
133
+ merged.push({ text, html, role: 'primary' });
134
+ }
135
+ }
136
+ return merged;
137
+ }
138
+ if (part.multipart === 'related') {
139
+ const root = relatedRoot(message, part);
140
+ const sections = [];
141
+ for (const child of children) {
142
+ if (child === root) {
143
+ sections.push(...sectionsOf(message, child, excluded, depth + 1));
144
+ }
145
+ else {
146
+ textLeavesUnder(message, child, excluded, 'related_resource');
147
+ }
148
+ }
149
+ return sections;
150
+ }
151
+ if (part.multipart) {
152
+ // mixed, signed, report, digest and anything unrecognised. Ordered sibling content: keep
153
+ // every body-bearing child, in document order. Treating an unknown subtype as mixed retains
154
+ // more rather than less, which is the safe direction when a tree is malformed or novel.
155
+ const sections = [];
156
+ for (const child of children) {
157
+ sections.push(...sectionsOf(message, child, excluded, depth + 1));
158
+ }
159
+ return sections;
160
+ }
161
+ if (part.contentType === 'text/plain' && part.decoded) {
162
+ return [{ text: part, html: null, role: 'primary' }];
163
+ }
164
+ if (part.contentType === 'text/html' && part.decoded) {
165
+ return [{ text: null, html: part, role: 'primary' }];
166
+ }
167
+ return [];
168
+ }
169
+ /**
170
+ * Build the ordered body plan for a parsed message.
171
+ *
172
+ * The first body-bearing section is `primary`; everything after it is `appended`. Appended sections
173
+ * are ordinary content until a rule says otherwise: gateways append substantive text as often as
174
+ * they append disclaimers, so position is evidence, not a label.
175
+ */
176
+ function planBody(message) {
177
+ const root = message.partsById.get(message.rootId) ?? message.parts[0];
178
+ if (!root) {
179
+ return { sections: [], excluded: [] };
180
+ }
181
+ const excluded = [];
182
+ const sections = sectionsOf(message, root, excluded, 0).filter(section => section.text || section.html);
183
+ return {
184
+ sections: sections.map((section, index) => ({ ...section, role: index === 0 ? 'primary' : 'appended' })),
185
+ excluded
186
+ };
187
+ }
188
+ /**
189
+ * Exclusions a caller should be told about.
190
+ *
191
+ * An unused `multipart/alternative` member, an attachment and an embedded message are all excluded
192
+ * by a written rule and are not losses. A text part dropped because it was not the related root, or
193
+ * because the tree nested past the walk's limit, is content that exists and is not represented.
194
+ */
195
+ function reportableExclusions(plan) {
196
+ return plan.excluded.filter(entry => entry.reason === 'related_resource' || entry.reason === 'max_depth_exceeded');
197
+ }
198
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/mime/select.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;AAyMH,4BAaC;AASD,oDAEC;AA3LD;;;;;GAKG;AACH,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,SAAS,cAAc,CAAC,IAAc;IAClC,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,YAAY,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjJ,CAAC;AAED,mFAAmF;AACnF,SAAS,eAAe,CAAC,OAAsB,EAAE,IAAc,EAAE,IAAoB,EAAE,MAAuB,EAAE,KAAK,GAAG,CAAC;IACrH,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;QACpB,OAAO;IACX,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO;IACX,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,EAAE,CAAC;YACR,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;AACL,CAAC;AAED,sFAAsF;AACtF,SAAS,kBAAkB,CAAC,KAAgC;IACxD,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAClF,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IAC/B,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED,sFAAsF;AACtF,SAAS,WAAW,CAAC,OAAsB,EAAE,IAAc;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAe,CAAC;IAClG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,KAAK,EAAE,CAAC;QACR,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;QACnE,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAa,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,OAAsB,EAAE,IAAc,EAAE,QAAwB,EAAE,KAAa;IAC/F,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;QACpB,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAC/D,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QACpC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;YAChG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,4FAA4F;IAC5F,iGAAiG;IACjG,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAC7D,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAe,CAAC;IAElG,IAAI,IAAI,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;QACnC,gDAAgD;QAChD,EAAE;QACF,2FAA2F;QAC3F,wFAAwF;QACxF,wFAAwF;QACxF,wFAAwF;QACxF,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/G,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzG,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzG,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjD,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,2BAA2B,CAAC,CAAC;YAClF,CAAC;QACL,CAAC;QAED,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YAC3C,OAAO,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,UAAU,CAAC,QAAQ,CAAC;QAC/B,CAAC;QAED,yFAAyF;QACzF,iFAAiF;QACjF,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,QAAQ,EAAE,IAAI,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACzF,CAAC;YACD,IAAI,QAAQ,EAAE,IAAI,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC;YACpC,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC;YACpC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACJ,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YAClE,CAAC;QACL,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,yFAAyF;QACzF,4FAA4F;QAC5F,wFAAwF;QACxF,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACpD,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CAAC,OAAsB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExG,OAAO;QACH,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACxG,QAAQ;KACX,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,IAAc;IAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,kBAAkB,IAAI,KAAK,CAAC,MAAM,KAAK,oBAAoB,CAAC,CAAC;AACvH,CAAC"}
@@ -22,7 +22,7 @@ export interface HtmlSegmentation {
22
22
  /** True when parsing failed and a degraded single block was produced. */
23
23
  degraded: boolean;
24
24
  }
25
- /** True when markup is unbalanced enough that parsing it is not worth the time. */
25
+ /** True when markup is shaped badly enough that parsing it is not worth the time. */
26
26
  export declare function isPathologicalHtml(html: string): boolean;
27
27
  export declare function segmentHtmlBlocks(html: string, mimePart: string): HtmlSegmentation;
28
28
  //# sourceMappingURL=html-blocks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-blocks.d.ts","sourceRoot":"","sources":["../../src/segment/html-blocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,OAAO,EAAE,KAAK,KAAK,EAAiC,MAAM,SAAS,CAAC;AAmWpE,MAAM,WAAW,gBAAgB;IAC7B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAC;CACrB;AA+BD,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAyOlF"}
1
+ {"version":3,"file":"html-blocks.d.ts","sourceRoot":"","sources":["../../src/segment/html-blocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,OAAO,EAAE,KAAK,KAAK,EAAiC,MAAM,SAAS,CAAC;AAmWpE,MAAM,WAAW,gBAAgB;IAC7B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAC;CACrB;AA4ED,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAgQlF"}
@@ -357,6 +357,24 @@ function kindFor(nodes, ancestors, text, evidence) {
357
357
  * does not come close to this threshold.
358
358
  */
359
359
  const MAX_UNCLOSED_TAGS = 500;
360
+ /**
361
+ * Runs of character data between tags tolerated before the DOM parse is skipped.
362
+ *
363
+ * node-html-parser appends every text node through a path that first calls `remove()` on it, and
364
+ * `remove()` scans the prospective parent's child list for the node. The node is not in that list
365
+ * yet, so the scan always runs to the end: appending the k-th text child of one element costs O(k),
366
+ * and a document that is one element holding many text children is quadratic. Measured on
367
+ * `<div>` wrapping `a<br>` repeated: 5,000 runs 52ms, 10,000 runs 247ms, 20,000 runs 1,362ms, on
368
+ * only 120 KB of markup. Elements are unaffected, because the parser constructs them with a null
369
+ * parent.
370
+ *
371
+ * Text runs are counted before parsing as an upper bound on how many of them can end up siblings.
372
+ * The threshold is set from the corpus rather than guessed: over a deterministic 19,982 message
373
+ * sample holding 16,867 HTML parts, the highest count seen was 8,337 and the slowest real parse was
374
+ * 21.5 milliseconds. 15,000 leaves most of a doubling of headroom above the worst real message and
375
+ * still caps the adversarial case well under a second.
376
+ */
377
+ const MAX_TEXT_RUNS = 15000;
360
378
  const OPEN_BLOCK_TAG = /<(?:div|table|tr|td|span|p|blockquote|ul|ol|li|font)\b/gi;
361
379
  const CLOSE_BLOCK_TAG = /<\/(?:div|table|tr|td|span|p|blockquote|ul|ol|li|font)\b/gi;
362
380
  function countPattern(text, regex) {
@@ -368,9 +386,37 @@ function countPattern(text, regex) {
368
386
  regex.lastIndex = 0;
369
387
  return count;
370
388
  }
371
- /** True when markup is unbalanced enough that parsing it is not worth the time. */
389
+ /**
390
+ * Count non empty gaps between tags, stopping as soon as the cap is passed.
391
+ *
392
+ * Matches the parser's own rule, which creates a text node for any non empty gap, whitespace
393
+ * included, so an indented document counts its indentation.
394
+ */
395
+ function exceedsTextRunCap(html) {
396
+ let runs = 0;
397
+ let i = 0;
398
+ while (i < html.length) {
399
+ const lt = html.indexOf('<', i);
400
+ if (lt === -1) {
401
+ return runs + 1 > MAX_TEXT_RUNS;
402
+ }
403
+ if (lt > i && ++runs > MAX_TEXT_RUNS) {
404
+ return true;
405
+ }
406
+ const gt = html.indexOf('>', lt + 1);
407
+ if (gt === -1) {
408
+ return false;
409
+ }
410
+ i = gt + 1;
411
+ }
412
+ return false;
413
+ }
414
+ /** True when markup is shaped badly enough that parsing it is not worth the time. */
372
415
  function isPathologicalHtml(html) {
373
- return countPattern(html, OPEN_BLOCK_TAG) - countPattern(html, CLOSE_BLOCK_TAG) > MAX_UNCLOSED_TAGS;
416
+ if (countPattern(html, OPEN_BLOCK_TAG) - countPattern(html, CLOSE_BLOCK_TAG) > MAX_UNCLOSED_TAGS) {
417
+ return true;
418
+ }
419
+ return exceedsTextRunCap(html);
374
420
  }
375
421
  function segmentHtmlBlocks(html, mimePart) {
376
422
  const patterns = (0, patterns_1.loadPatterns)();
@@ -385,6 +431,15 @@ function segmentHtmlBlocks(html, mimePart) {
385
431
  }
386
432
  catch {
387
433
  // A parse failure must still yield the content, as one unknown block.
434
+ //
435
+ // `content` is the block's projected text, and everything downstream reads it: `toSegments`
436
+ // drops segments whose text is blank, and the never-empty invariant guard tests it too.
437
+ // Leaving it empty, which is what this did, meant a malformed body carrying authored text
438
+ // came back as zero visible segments, zero hidden segments and a lone `html_parse_error`.
439
+ // Total content loss whose only trace was a warning.
440
+ //
441
+ // `text` stays the raw HTML so blocks still tile the source exactly.
442
+ const projected = (0, html_1.stripTagsToText)(html);
388
443
  return {
389
444
  source: html,
390
445
  degraded: true,
@@ -395,11 +450,11 @@ function segmentHtmlBlocks(html, mimePart) {
395
450
  representation: 'html',
396
451
  mimePart,
397
452
  text: html,
398
- content: '',
453
+ content: projected,
399
454
  start: 0,
400
455
  end: html.length,
401
456
  html,
402
- features: (0, features_1.computeFeatures)('', { index: 0, total: 1, start: 0, totalChars: html.length, quoteDepth: 0 }),
457
+ features: (0, features_1.computeFeatures)(projected, { index: 0, total: 1, start: 0, totalChars: html.length, quoteDepth: 0 }),
403
458
  evidence: []
404
459
  }
405
460
  ]
@@ -472,12 +527,26 @@ function segmentHtmlBlocks(html, mimePart) {
472
527
  const blocks = [];
473
528
  let previousEnd = 0;
474
529
  for (const { run, domPath } of runs) {
475
- const ranges = run.nodes.map(node => node.range).filter(Boolean);
476
- if (!ranges.length) {
530
+ // Loops rather than Math.min/max over a spread. A run of an HTML document can hold more
531
+ // nodes than V8 allows call arguments, and the resulting RangeError would degrade the whole
532
+ // message for no reason.
533
+ let nodeStart = Infinity;
534
+ let nodeEnd = -Infinity;
535
+ for (const node of run.nodes) {
536
+ const range = node.range;
537
+ if (!range) {
538
+ continue;
539
+ }
540
+ if (range[0] < nodeStart) {
541
+ nodeStart = range[0];
542
+ }
543
+ if (range[1] > nodeEnd) {
544
+ nodeEnd = range[1];
545
+ }
546
+ }
547
+ if (nodeStart === Infinity) {
477
548
  continue;
478
549
  }
479
- const nodeStart = Math.min(...ranges.map(range => range[0]));
480
- const nodeEnd = Math.max(...ranges.map(range => range[1]));
481
550
  if (nodeEnd <= previousEnd) {
482
551
  continue;
483
552
  }