use ferogram_tl_types::RemoteCall;
use crate::message::{Message, MessageId};
pub struct Session {
msg_counter: u32,
seq_no: i32,
}
impl Session {
pub fn new() -> Self {
Self {
msg_counter: 0,
seq_no: 0,
}
}
pub fn next_msg_id(&mut self) -> MessageId {
self.msg_counter = self.msg_counter.wrapping_add(1);
MessageId::generate(self.msg_counter)
}
pub fn next_seq_no(&mut self) -> i32 {
let n = self.seq_no;
self.seq_no += 2;
n | 1 }
pub fn next_seq_no_unrelated(&mut self) -> i32 {
let n = self.seq_no;
n & !1 }
pub fn pack<R: RemoteCall>(&mut self, call: &R) -> Message {
let id = self.next_msg_id();
let seq_no = self.next_seq_no();
let body = call.to_bytes();
Message::plaintext(id, seq_no, body)
}
}
impl Default for Session {
fn default() -> Self {
Self::new()
}
}