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
JavaScript
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