Frontend Architecture Overview
The Linera client library is written in Rust. To make it available to Web
applications, we first compile it to WebAssembly, then wrap it with some
JavaScript convenience APIs using
wasm-bindgen
. This wrapper will
first download the client WebAssembly blob, and then forward calls to it, doing
marshalling as necessary.
In addition, on the Web some system APIs are provided in the browser as JavaScript APIs, so making system calls for these is replaced by FFI calls to the equivalent browser APIs. Notably:
- to get the current date/time, we use the JavaScript
Date::now
API - as our source of cryptographic randomness, we use the Web Crypto API
- Tokio is replaced by JavaScript promises on the browser event loop
- communication with validators over gRPC is replaced with
gRPC-Web over the browser
fetch
API - filesystem access is replaced with IndexedDB
- the client is run single-threaded, except for bytecode execution, which uses Web Workers
The architecture for a dApp frontend with the client library embedded can be summarized as follows:
graph TD classDef empty fill:none,stroke:none subgraph "@linera/client (Rust)" linera-web-client["linera-web-client"] --> linera-protocol["linera-protocol"] end subgraph "Browser APIs" linera-protocol --> web-workers-api["Web Worker API"] linera-protocol --> wasm-api["WASM API"] linera-protocol --> fetch-api["Fetch API"] linera-protocol --> crypto-api["Crypto API"] browser-apis[". . ."]:::empty end fetch-api <--> network["Linera network"]@{shape: "lean-r"} subgraph "Hosted dApp (JS)" hosted-frontend["Frontend"] --> linera-web-client end