WeaveDocs
Weave Browser Engine

Protocol Routing

Protocol routing for the Weave Browser Engine — pluggable schemes for http, did:, weave://, and custom agent protocols.

Purpose

Agent browser engine for fetch, parse, search, perceive, research, protocol routing, and HTTP serving.

This page follows the real source shape for Weave Browser Engine and explains the workflow a developer is likely to use first.

Developer workflow

Start from the smallest constructor or builder, perform one meaningful operation, inspect the returned state, then add the relevant policy, storage, or network integration. The examples below should be expanded whenever the crate API changes.

Primary types to know

  • DuckDuckGoEngine — libs/weave-browser-engine/src/search.rs
  • FetchOptions — libs/weave-browser-engine/src/fetch.rs
  • FetchRequest — libs/weave-browser-engine/src/serve.rs
  • HnsResolver — libs/weave-browser-engine/src/protocol.rs
  • HttpResolver — libs/weave-browser-engine/src/protocol.rs
  • HttpsResolver — libs/weave-browser-engine/src/protocol.rs
  • LocalPerceptionBackend — libs/weave-browser-engine/src/perceive.rs
  • PerceiveRequest — libs/weave-browser-engine/src/serve.rs
  • ProtocolRouter — libs/weave-browser-engine/src/protocol.rs
  • ResearchConfig — libs/weave-browser-engine/src/research.rs
  • ResearchRequest — libs/weave-browser-engine/src/serve.rs
  • SearchRequest — libs/weave-browser-engine/src/serve.rs

Example shape

use weave_browser_engine::protocol::{
    HnsResolver, HttpsResolver, ProtocolRouter,
};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // ProtocolRouter dispatches a URL to the registered resolver by scheme.
    // Built-in resolvers cover https://, hns://, and weave://.
    let mut router = ProtocolRouter::new();
    router.register(Box::new(HttpsResolver));
    router.register(Box::new(HnsResolver));

    // extract_scheme normalizes the URL so the router can index by scheme key.
    let scheme = ProtocolRouter::extract_scheme("hns://siasky/index.html");

    // resolve() returns the raw response bytes from whichever resolver wins.
    let body = router.resolve("https://example.com").await?;
    println!("scheme={} response_bytes={}", scheme, body.len());
    Ok(())
}