diff --git a/README.md b/README.md index 44b0cc64..0a9ae9e0 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ 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 = fs.readFileSync('./data/uBlockOrigin/resources.txt', { encoding: 'utf-8' }); +let resources = AdBlockClient.uBlockResources('uBlockOrigin/src/web_accessible_resources', 'uBlockOrigin/src/js/redirect-engine.js', 'uBlockOrigin/assets/resources/scriptlets.js'); // create client with debug = true const client = new AdBlockClient.Engine(rules, true); diff --git a/lib/index.js b/lib/index.js index e3d50b6a..33fceab1 100644 --- a/lib/index.js +++ b/lib/index.js @@ -2,3 +2,4 @@ const blocker = require('../native'); exports.Engine = blocker.Engine; exports.lists = blocker.lists; +exports.uBlockResources = blocker.uBlockResources; diff --git a/native/src/lib.rs b/native/src/lib.rs index dc8ee9ad..72ab2940 100644 --- a/native/src/lib.rs +++ b/native/src/lib.rs @@ -7,8 +7,12 @@ extern crate serde; use neon::prelude::*; use serde::{Deserialize, Serialize}; +use std::path::Path; use adblock::engine::Engine; use adblock::filter_lists; +use adblock::resources::Resource; +use adblock::resource_assembler::{assemble_web_accessible_resources, assemble_scriptlet_resources}; + #[derive(Serialize, Deserialize)] struct EngineOptions { @@ -127,7 +131,8 @@ declare_types! { } method updateResources(mut cx) { - let resources: String = cx.argument::(0)?.value(); + let resources_arg = cx.argument::(0)?; + let resources: Vec = neon_serde::from_value(&mut cx, resources_arg)?; let mut this = cx.this(); let guard = cx.lock(); @@ -174,15 +179,14 @@ declare_types! { } method addResource(mut cx) { - let name: String = cx.argument::(0)?.value(); - let content_type: String = cx.argument::(1)?.value(); - let data: String = cx.argument::(2)?.value(); + let resource_arg = cx.argument::(0)?; + let resource: Resource = neon_serde::from_value(&mut cx, resource_arg)?; let mut this = cx.this(); let guard = cx.lock(); { let mut engine = this.borrow_mut(&guard); - engine.resource_add(&name, &content_type, &data); + engine.resource_add(resource); } Ok(JsNull::new().upcast()) } @@ -225,10 +229,24 @@ fn validate_request(mut cx: FunctionContext) -> JsResult { Ok(cx.boolean(request_ok)) } +fn ublock_resources(mut cx: FunctionContext) -> JsResult { + let web_accessible_resource_dir: String = cx.argument::(0)?.value(); + let redirect_engine_path: String = cx.argument::(1)?.value(); + let scriptlets_path: String = cx.argument::(2)?.value(); + + let mut resources = assemble_web_accessible_resources(&Path::new(&web_accessible_resource_dir), &Path::new(&redirect_engine_path)); + resources.append(&mut assemble_scriptlet_resources(&Path::new(&scriptlets_path))); + + let js_resources = neon_serde::to_value(&mut cx, &resources)?; + + Ok(js_resources) +} + register_module!(mut m, { // Export the `JsEngine` class m.export_class::("Engine")?; m.export_function("lists", lists)?; m.export_function("validateRequest", validate_request)?; + m.export_function("uBlockResources", ublock_resources)?; Ok(()) });