mhtml-stream
Version:
Streaming MHTML parser
60 lines (59 loc) • 1.61 kB
JavaScript
export class Headers {
// keyed by lowercased name; the original name casing (first seen) is
// preserved for iteration while lookups are case-insensitive, per RFC 5322
#raw = new Map();
[Symbol.iterator]() {
return this.entries();
}
append(key, value) {
const entry = this.#raw.get(key.toLowerCase());
if (entry === undefined) {
this.#raw.set(key.toLowerCase(), { key, values: [value] });
}
else {
entry.values.push(value);
}
}
*entries(delim = ", ") {
for (const { key, values } of this.#raw.values()) {
yield [key, values.join(delim)];
}
}
*entriesAll() {
for (const { key, values } of this.#raw.values()) {
for (const val of values) {
yield [key, val];
}
}
}
get(key, delim = ", ") {
const entry = this.#raw.get(key.toLowerCase());
if (entry === undefined) {
return null;
}
else {
return entry.values.join(delim);
}
}
getAll(key) {
return this.#raw.get(key.toLowerCase())?.values ?? [];
}
has(key) {
return this.#raw.has(key.toLowerCase());
}
*keys() {
for (const { key } of this.#raw.values()) {
yield key;
}
}
*values(delim = ", ") {
for (const { values } of this.#raw.values()) {
yield values.join(delim);
}
}
*valuesAll() {
for (const { values } of this.#raw.values()) {
yield* values;
}
}
}