#json-rpc #stdio #ipc #http #http-request #http-response #child-process

multilink

用于通过stdio或HTTP与本地或远程进程通信的IPC库

2个稳定版本

1.0.1 2023年8月1日

#26 in #stdio

Download history 24/week @ 2024-03-11 28/week @ 2024-03-18 48/week @ 2024-03-25 89/week @ 2024-04-01 27/week @ 2024-04-08 17/week @ 2024-04-15 27/week @ 2024-04-22 27/week @ 2024-04-29 27/week @ 2024-05-06 24/week @ 2024-05-13 29/week @ 2024-05-20 24/week @ 2024-05-27 21/week @ 2024-06-03 23/week @ 2024-06-10 33/week @ 2024-06-17 35/week @ 2024-06-24

113 每月下载量
9 个crate(2个直接) 中使用

MPL-2.0 许可证

79KB
1.5K SLoC

multilink

Crates.io docs.rs GitHub

一个IPC库,为本地和远程进程提供通信功能。支持响应流/事件。基于tower构建。

通信

远程进程之间的通信是通过HTTP客户端和服务器实现的。本地客户端将服务器作为子进程调用,并通过“stdio上的JSON-RPC”进行通信。

使用方法

您可以通过启用某些功能来配置支持的IPC方法

[dependencies]
multilink = { version = "<version>", features = ["<http-server|http-client|stdio-server|stdio-client>"] }

组件

以下是使用multilink的解决方案的组件

  1. 一组协议无关的请求和响应类型:在所有服务中使用的类型,无论底层协议如何;通常是一组枚举
  2. 处理服务:处理协议无关的请求,执行一些逻辑并返回响应
  3. 转换trait实现:将协议无关的请求/响应转换为JSON-RPC或HTTP请求/响应
  4. HTTP和“stdio上的JSON-RPC”客户端和服务器:multilink实现的唯一部分;将上述三个项目组合在一起

multilink客户端的调用者将仅使用协议无关的请求和响应类型,这允许在协议之间无缝切换。

diagram

本地通信

在本地IPC场景中,客户端将作为子进程启动服务器,并通过stdin/stdout与它通信,使用JSON-RPC作为协议。

协议无关的请求被转换为 JsonRpcRequest,响应被转换为 JsonRpcResponseJsonRpcNotification

此协议的客户端/服务器组合是 StdioServerStdioClient

远程通信

在远程IPC场景中,客户端将向定义的服务器发出HTTP请求。该库使用hyper实现此功能。

协议无关的请求被转换为 HttpRequest<Body>。响应被转换为 ModalHttpResponse 枚举,它包含 SingleMultiple 变体。

该协议的客户端/服务器组合是 HttpServerHttpClient

流式响应/通知

该库支持每个请求多个响应。如果服务以包含在 ServiceResponse<Response>::Multiple 值中的 Stream 响应,则将传输多个响应。

所有流式响应都必须与一个请求相关联。

将响应转换为 JSON-RPC 消息时,必须使用 JsonRpcNotification,原始请求 ID 作为方法。

对于 HTTP 流,底层使用 服务器端事件

示例和参考文档

有关上述功能的完整示例,请参阅 examples/ 目录中的问候服务器和客户端。

参考文档可在 docs.rs 上找到。

许可证

Mozilla 公共许可证,版本 2.0

依赖项

~4–15MB
~188K SLoC