ckb-light-client-protocol-server 0.115.0-rc2

Server-side implementation for CKB light client protocol.
Documentation
use ckb_network::{CKBProtocolContext, PeerIndex};
use ckb_types::{packed, prelude::*};

use crate::{Status, StatusCode};

pub(crate) trait LightClientProtocolReply<'a> {
    fn reply(&'a self, peer_index: PeerIndex, message: &packed::LightClientMessage) -> Status;
}

impl<'a> LightClientProtocolReply<'a> for &(dyn CKBProtocolContext + 'a) {
    fn reply(&'a self, peer_index: PeerIndex, message: &packed::LightClientMessage) -> Status {
        let enum_message = message.to_enum();
        let item_name = enum_message.item_name();
        let protocol_id = self.protocol_id();
        if let Err(err) = self.send_message(protocol_id, peer_index, message.as_bytes()) {
            let error_message = format!("nc.send_message {item_name} failed since {err:?}");
            StatusCode::Network.with_context(error_message)
        } else {
            Status::ok()
        }
    }
}