@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.
- package/README.md +192 -17
- package/dist/.tsbuildinfo +1 -1
- package/dist/analyze.d.ts +55 -15
- package/dist/analyze.d.ts.map +1 -1
- package/dist/analyze.js +264 -61
- package/dist/analyze.js.map +1 -1
- package/dist/canonical/html.d.ts +21 -2
- package/dist/canonical/html.d.ts.map +1 -1
- package/dist/canonical/html.js +213 -14
- package/dist/canonical/html.js.map +1 -1
- package/dist/classify/confidence.d.ts +12 -0
- package/dist/classify/confidence.d.ts.map +1 -1
- package/dist/classify/confidence.js +54 -4
- package/dist/classify/confidence.js.map +1 -1
- package/dist/classify/reconcile.d.ts +25 -17
- package/dist/classify/reconcile.d.ts.map +1 -1
- package/dist/classify/reconcile.js +52 -20
- package/dist/classify/reconcile.js.map +1 -1
- package/dist/cli/annotate.d.ts.map +1 -1
- package/dist/cli/annotate.js +6 -3
- package/dist/cli/annotate.js.map +1 -1
- package/dist/cli/args.d.ts +14 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +48 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/benchmark.d.ts +39 -0
- package/dist/cli/benchmark.d.ts.map +1 -1
- package/dist/cli/benchmark.js +179 -66
- package/dist/cli/benchmark.js.map +1 -1
- package/dist/cli/corpus.d.ts.map +1 -1
- package/dist/cli/corpus.js +13 -8
- package/dist/cli/corpus.js.map +1 -1
- package/dist/cli/disagreements.d.ts.map +1 -1
- package/dist/cli/disagreements.js +7 -4
- package/dist/cli/disagreements.js.map +1 -1
- package/dist/cli/evaluate.d.ts.map +1 -1
- package/dist/cli/evaluate.js +34 -10
- package/dist/cli/evaluate.js.map +1 -1
- package/dist/cli/extract.d.ts.map +1 -1
- package/dist/cli/extract.js +8 -3
- package/dist/cli/extract.js.map +1 -1
- package/dist/cli/main.js +8 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/corpus/scanner.d.ts +9 -1
- package/dist/corpus/scanner.d.ts.map +1 -1
- package/dist/corpus/scanner.js +52 -13
- package/dist/corpus/scanner.js.map +1 -1
- package/dist/corpus/store.d.ts +29 -2
- package/dist/corpus/store.d.ts.map +1 -1
- package/dist/corpus/store.js +45 -2
- package/dist/corpus/store.js.map +1 -1
- package/dist/detect/patterns.d.ts +29 -0
- package/dist/detect/patterns.d.ts.map +1 -1
- package/dist/detect/patterns.js +80 -6
- package/dist/detect/patterns.js.map +1 -1
- package/dist/detect/reply-header.d.ts +14 -0
- package/dist/detect/reply-header.d.ts.map +1 -1
- package/dist/detect/reply-header.js +80 -37
- package/dist/detect/reply-header.js.map +1 -1
- package/dist/eval/oracle.d.ts +80 -0
- package/dist/eval/oracle.d.ts.map +1 -0
- package/dist/eval/oracle.js +250 -0
- package/dist/eval/oracle.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -56
- package/dist/index.js.map +1 -1
- package/dist/mime/model.d.ts +28 -3
- package/dist/mime/model.d.ts.map +1 -1
- package/dist/mime/model.js +41 -1
- package/dist/mime/model.js.map +1 -1
- package/dist/mime/parse.d.ts.map +1 -1
- package/dist/mime/parse.js +19 -2
- package/dist/mime/parse.js.map +1 -1
- package/dist/mime/select.d.ts +71 -0
- package/dist/mime/select.d.ts.map +1 -0
- package/dist/mime/select.js +198 -0
- package/dist/mime/select.js.map +1 -0
- package/dist/segment/html-blocks.d.ts +1 -1
- package/dist/segment/html-blocks.d.ts.map +1 -1
- package/dist/segment/html-blocks.js +77 -8
- package/dist/segment/html-blocks.js.map +1 -1
- package/dist/segment/text-blocks.d.ts.map +1 -1
- package/dist/segment/text-blocks.js +18 -1
- package/dist/segment/text-blocks.js.map +1 -1
- package/dist/segment/types.d.ts +14 -0
- package/dist/segment/types.d.ts.map +1 -1
- package/dist/types.d.ts +132 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +37 -3
- package/dist/types.js.map +1 -1
- package/dist/util/worker-pool.d.ts +21 -0
- package/dist/util/worker-pool.d.ts.map +1 -1
- package/dist/util/worker-pool.js +61 -13
- package/dist/util/worker-pool.js.map +1 -1
- package/package.json +3 -2
package/dist/mime/model.js
CHANGED
|
@@ -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
|
package/dist/mime/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/mime/model.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
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"}
|
package/dist/mime/parse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/mime/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,
|
|
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"}
|
package/dist/mime/parse.js
CHANGED
|
@@ -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 =
|
|
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 = {
|
package/dist/mime/parse.js.map
CHANGED
|
@@ -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
|
|
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;
|
|
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
|
-
/**
|
|
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
|
-
|
|
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)(
|
|
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
|
-
|
|
476
|
-
|
|
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
|
}
|