UNPKG

email-scrubber-core

Version:

A privacy-focused email sanitizer that removes trackers and cleans URLs, powered by the ClearURLs ruleset.

72 lines 2.49 kB
import { LinkCleaner } from "./cleaners/LinkCleaner.js"; import { TrackerPixelRemover, } from "./cleaners/TrackerPixelRemover.js"; /** * An adapter that makes an HTMLRewriter element look like a SanitizableElement. * This allows us to reuse the same logic from TrackerPixelRemover. */ class HTMLRewriterElementAdapter { element; constructor(element) { this.element = element; } getAttribute(name) { return this.element.getAttribute(name); } hasAttribute(name) { return this.element.hasAttribute(name); } removeAttribute(name) { this.element.removeAttribute(name); } setAttribute(name, value) { this.element.setAttribute(name, value); } remove() { this.element.remove(); } } /** * Returns a set of handler objects that can be attached to an HTMLRewriter instance. * This function decouples the sanitization logic from the Cloudflare-specific environment. * The caller is responsible for creating the HTMLRewriter instance. * * @param rules The ClearURL rules for cleaning links. * @returns An object containing `linkHandler` and `pixelHandler` for use with `HTMLRewriter`. */ export function getStreamingHandlers(rules) { const linkCleaner = new LinkCleaner(rules); const pixelRemover = new TrackerPixelRemover(); return { /** * An HTMLRewriter element handler for sanitizing anchor (`<a>`) tags. * Attach to a selector like "a[href]". */ linkHandler: { element(element) { const href = element.getAttribute("href"); if (href) { try { const cleanedUrl = linkCleaner.clean(href); element.setAttribute("href", cleanedUrl.toString()); } catch (error) { console.warn(`Failed to clean URL during streaming: ${href}`, error); } } }, }, /** * An HTMLRewriter element handler for removing tracking pixels. * Attach to a selector like "img". */ pixelHandler: { element(element) { const adapter = new HTMLRewriterElementAdapter(element); if (pixelRemover.isTrackingPixel(adapter)) { adapter.remove(); } }, }, }; } //# sourceMappingURL=stream-sanitizer.js.map