Package Exports
- adblock-rs
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (adblock-rs) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Ad Block engine in Rust
Native Rust module for Adblock Plus syntax (e.g. EasyList, EasyPrivacy) filter parsing and matching.
It uses a tokenisation approach for quickly reducing the potentially matching rule search space against a URL.
The algorithm is inspired by, and closely follows the algorithm of uBlock Origin and Cliqz.
Somewhat graphical explanation of the algorithm:
Demo
Demo use in Rust:
use adblock::engine::Engine;
use adblock::lists::{FilterFormat, FilterSet};
fn main() {
let rules = vec![
String::from("-advertisement-icon."),
String::from("-advertisement-management/"),
String::from("-advertisement."),
String::from("-advertisement/script."),
];
let mut filter_set = FilterSet::new(true);
filter_set.add_filters(&rules, FilterFormat::Standard);
let blocker = Engine::from_filter_set(&filter_set, true);
let blocker_result = blocker.check_network_urls("http://example.com/-advertisement-icon.", "http://example.com/helloworld", "image");
println!("Blocker result: {:?}", blocker_result);
}
Node.js module demo
Note the Node.js module has overheads inherent to boundary crossing between JS and native code.
const AdBlockClient = require('adblock-rs');
let el_rules = fs.readFileSync('./data/easylist.to/easylist/easylist.txt', { encoding: 'utf-8' }).split('\n');
let ubo_unbreak_rules = fs.readFileSync('./data/uBlockOrigin/unbreak.txt', { encoding: 'utf-8' }).split('\n');
let rules = el_rules.concat(ubo_unbreak_rules);
let resources = AdBlockClient.uBlockResources('uBlockOrigin/src/web_accessible_resources', 'uBlockOrigin/src/js/redirect-engine.js', 'uBlockOrigin/assets/resources/scriptlets.js');
const filterSet = new AdBlockClient.FilterSet(true);
filterSet.addFilters(rules);
const client = new AdBlockClient.Engine(filterSet, true);
client.updateResources(resources);
const serializedArrayBuffer = client.serialize(); // Serialize the engine to an ArrayBuffer
console.log(`Engine size: ${(serializedArrayBuffer.byteLength / 1024 / 1024).toFixed(2)} MB`);
console.log("Matching:", client.check("http://example.com/-advertisement-icon.", "http://example.com/helloworld", "image"))
// Match with full debuging info
console.log("Matching:", client.check("http://example.com/-advertisement-icon.", "http://example.com/helloworld", "image", true))
// No, but still with debugging info
console.log("Matching:", client.check("https://github.githubassets.com/assets/frameworks-64831a3d.js", "https://github.com/AndriusA", "script", true))
// Example that inlcludes a redirect response
console.log("Matching:", client.check("https://bbci.co.uk/test/analytics.js", "https://bbc.co.uk", "script", true))
TODO
- Function for extracting CSP directives
- Generate string representation of a rule when debug mode is off (i.e. initial rule is not available)
- Cosmetic filters