@ earendil- works/ pi- 客户端
实验Pi服务协议的运输中性客户端.
import { Client, type ByteTransportFactory } from "@earendil-works/pi-client";
const transportFactory: ByteTransportFactory = async (handlers) => {
// Connect using WebSocket, Unix socket, or another ordered byte transport.
return {
async send(chunk) {
// Deliver bytes in invocation order and honor backpressure.
},
close() {},
};
};
const client = await Client.connect({
serverId: "01234567-89ab-4def-8123-456789abcdef",
transportFactory,
});
const result = await client.request(
{ serverId: client.hello.serverId },
{ serviceId: "example.service", member: "read", args: [] },
);
客户端验证物理端点报告预期逻辑 serverId。全服务器请求携带该ID,每个会话请求都携带全程直播目标 { serverId, sessionId, attachmentId }。合并持久地址可以防止交叉服务器或交叉会话错误的路由;服务器生成的附件ID在切换或重新连接后拒绝延迟帧.
已打入的服务器和会话API由应用程序拥有的Chord服务绑定提供. createClientServiceTransport() 将懒解的服务器或会话路由调整为和弦传输; request() 财务报告和审定财务报表 subscribeService() 仍然是低等原始人 客户端使用Chord的服务控制解析器和每个订阅状态解码器; pi-protocol 只验证路由信封和严格的JSON边界。 服务订阅返回一个完整的提供者快照; 装订安装然后调用 start() 以释放水合过程中缓冲的更新. Client 应用命令外附件更改,但故意不构建打字服务代理或解释应用合同.
应用观察 API 如编码代理 Transcript 是普通的和弦服务。 客户端不解释其快照或更新.
在断开或处理时,待处理的请求会在当地拒绝,但在附件发布之前,被接受的工作仍可能远程完成. 客户端清除其活性附件路径. 它永远不会自动重接或重放请求. 断开后,请拨 reconnect(),通过应用程序的管理服务再次附加,并明确重复已知的安全操作.
实验性局部协调员只提供稳定的终点并接通流量. 可替换服务器进程在公共客户端协议之外拥有会话和工人生命周期.
调用运输处理器如下:
handlers.onData(chunk)用于输入字节;handlers.onClose()有序关闭终端;handlers.onError(error)运输故障.
运输厂为每次尝试创造了新的认证连接. 请求与ID相关,服务器失败被曝光为 ServerError。 。 。 .
Unix 域插座
节点.js和Bun消费者可以使用单独的Unix运输:
import { Client } from "@earendil-works/pi-client";
import { createUnixTransportFactory } from "@earendil-works/pi-client/unix";
const client = new Client({
serverId: "01234567-89ab-4def-8123-456789abcdef",
transportFactory: createUnixTransportFactory({ path: "/tmp/pi.sock" }),
});
await client.connect();
Unix 发现扫描一个明确的物理路由目录,从文件名中获取每个预期的服务器ID,并通过现有的握手方式验证:
import { discoverUnixServers } from "@earendil-works/pi-client/unix";
const routes = await discoverUnixServers({ directory: "/run/user/1000/pi" });
// [{ serverId: "...", path: "/run/user/1000/pi/<serverId>.sock" }]
错误的条目,非sockets, stale或无响应端点,以及服务器-ID不匹配被忽略. 发现是只读的,最多16个套接字同时进行探测。 无法预料的文件系统和套接字错误拒绝发现 。 过 timeoutMs 覆盖默认探测器超时.
ClientOptions.maxFrameLength 限定协议有效载荷. maxPendingBytes 将 Unix 传输输出排队。 配置对等端的匹配限制 .