8个版本

0.3.2 2022年9月13日
0.3.1 2022年4月21日
0.3.0 2021年12月14日
0.2.2 2021年11月30日
0.1.0 2020年3月19日

#1161 in 编码

Download history 100/week @ 2024-03-09 107/week @ 2024-03-16 121/week @ 2024-03-23 145/week @ 2024-03-30 80/week @ 2024-04-06 116/week @ 2024-04-13 68/week @ 2024-04-20 23/week @ 2024-04-27 164/week @ 2024-05-04 60/week @ 2024-05-11 58/week @ 2024-05-18 66/week @ 2024-05-25 103/week @ 2024-06-01 72/week @ 2024-06-08 30/week @ 2024-06-15 13/week @ 2024-06-22

每月226次下载

MIT/Apache

125KB
3K SLoC

rmp-futures - 异步Rust MessagePack和MessagePack-RPC

异步编码/解码msgpack和msgpack-rpc。旨在允许确定性的内存使用,使客户端负责分配。由于msgpack是可流式传输的格式,因此可以暴露在写入器可写时动态序列化的能力。同样,读取器可以写入以处理在流中遇到的单个编码对象。除非请求,否则库不执行内存分配,例如返回Rust String形式的字符串或作为动态rmpv::Value返回整个对象。

数据类型尽可能与rmprmpv存储库兼容。

工作原理

每次读取某些数据并达到决策点时,例如到达新项目的开始,客户端都会获得一个代表流状态的新对象,并且只提供在该点有效的操作。因此,客户端可以有一个预期的消息的静态解码序列,并且预先知道存储需求。

底层读取器或写入器被移动到解码器或编码器中。只有通过在解析器上执行一系列有效操作并返回具有自己有效操作集的新类型,才能再次获得所有权。这强制在编译时读取元素后再处理下一个元素,并且确保编码消息是良好格式的。

递归对象产生递归类型。例如,读取包含一个元素的数组的示例数据类型进度:[true]

  • R: 初始纯异步读取器
  • MsgPackFuture: 客户端使用MsgPackFuture::new()包装读取器,以表示此读取器位于消息的开始
  • ValueFuture::Array(ArrayFuture): decode()返回一个枚举
  • ArrayFuture: 客户端在枚举上匹配并解构内部ArrayFuture
  • MsgPackFuture< ArrayFuture >: 客户端调用next(),解包MsgPackOption。现在我们位于新消息的开始,该消息是一个数组元素,如数据类型所示
  • ValueFuture::Boolean(true, ArrayFuture): 消息解码为 "true"
  • ArrayFuture: 解构 Boolean,现在 ArrayFuture 已准备好读取下一个元素
  • MsgPackOption::End(R): ArrayFuture::next() 返回一个枚举表示数组结束
  • R: 解构数组结束返回原始的读取器

编码和解码支持动态的 write_value()into_value() 函数,用于处理堆分配的消息。这以内存为代价更容易使用,但也允许更容易地从使用 rmpv::Value 的其他库(如 rmp-rpc)过渡。

待办事项

  • RpcMessage::Request 应生成一个用于发送消息的句柄。目前客户端必须保存 ID 并在开始响应消息时使用正确的 ID。

许可证

根据您的选择,许可如下

任选一项。

贡献

除非您明确声明,否则任何旨在包含在您的工作中的贡献,根据 Apache-2.0 许可证的定义,都应按上述方式双许可,不附加任何额外条款或条件。

依赖项

~3MB
~61K SLoC