#json-rpc-server #rpc-server #write #error #async #client #stack-future

embedded-jsonrpc

A JSON-RPC 2.0 server implementation for embedded systems

19 releases (7 breaking)

new 0.8.0 Jan 2, 2025
0.7.0 Dec 14, 2024
0.6.3 Dec 3, 2024
0.5.5 Dec 1, 2024
0.1.0 Nov 26, 2024

#252 in Embedded development

Download history 34/week @ 2024-11-20 800/week @ 2024-11-27 290/week @ 2024-12-04 111/week @ 2024-12-11 10/week @ 2024-12-18

542 downloads per month

MPL-2.0 license

150KB
3K SLoC

embedded-jsonrpc

A JSON-RPC 2.0 server implementation for embedded systems.


lib.rs:

JSON-RPC for Embedded Systems

This crate provides a JSON-RPC server implementation for embedded systems.

Features

  • #![no_std] Support: Fully compatible with environments lacking a standard library.
  • Predictable Memory Usage: Zero dynamic allocation with statically sized buffers.
  • Async: Non-blocking I/O with embedded-io-async.
  • Client Compatibility: Uses LSP style framing for JSON-RPC messages.
  • Error Handling: Adheres to JSON-RPC standards with robust error reporting.

Example Usage

use embedded_jsonrpc::{RpcError, RpcResponse, RpcServer, RpcHandler, JSONRPC_VERSION, DEFAULT_HANDLER_STACK_SIZE};
use embedded_jsonrpc::stackfuture::StackFuture;
use embedded_io_async::{Read, Write, ErrorType};

struct MyStream;

impl ErrorType for MyStream {
  type Error = embedded_io_async::ErrorKind;
}

impl Read for MyStream {
  async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
    Ok(0)
  }
}

impl Write for MyStream {
 async fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
  Ok(0)
 }
}

struct MyHandler;

impl RpcHandler for MyHandler {
   fn handle<'a>(&self, id: Option<u64>, _method: &'a str, _request_json: &'a [u8], response_json: &'a mut [u8]) -> StackFuture<'a, Result<usize, RpcError>, DEFAULT_HANDLER_STACK_SIZE> {
      StackFuture::from(async move {
         let response: RpcResponse<'static, ()> = RpcResponse {
           jsonrpc: JSONRPC_VERSION,
           error: None,
           result: None,
           id,
         };
        Ok(serde_json_core::to_slice(&response, response_json).unwrap())
     })
  }
}

async fn serve_requests() {
  let mut server: RpcServer<'_, _> = RpcServer::new();
  server.register_handler("echo", &MyHandler);

  loop {
    let mut stream: MyStream = MyStream;
    server.serve(&mut stream).await.unwrap();
  }
}

License

This crate is licensed under the Mozilla Public License 2.0 (MPL-2.0). See the LICENSE file for more details.

References

Dependencies

~1.8–2.8MB
~58K SLoC