AI图鉴

AI图鉴首页 › AI 资讯 › 服务器类型协议

服务器类型协议

来源:Hacker News · 发布时间:10-27 · 由 AI图鉴每小时自动聚合

文章 URL: https://github.com/microsoft/pylance-release/blob/main/docs/tsp/type-server-protocol.md 互联网档案馆的存檔,存档日期2013-12-21. 评论 URL:https://news.ycombinator.com/robject?id=50248371 网易新闻。

类型服务器协议(TSP)是一个JSON-RPC协议,用于为Python分析数据询问类型服务器。 一个类型服务器维护一个工作空间的类型分析状态,并对协议版本,快照,Python搜索路径,导入解析度,以及类型查询(计算,声明,以及预期类型)进行解答。

协议使用语言服务器协议(LSP)的数据形状和实用的常规,如位置和范围,它代表URI,就像LSP一样的字符串。 TSP方法使用类型Server/前缀。

本文件夹中的协议文物是权威定义:

- 类型ServerProtocol.ts定义了类型脚本接口和请求类型。

- Tsp.json是机器可读协议模型。

- tsp.schema.json是协议模型的JSON计划。

TSP使用语义版本字符串进行客户端/服务器兼容性检查。 当协议处于0.x行时,小版本的修改可能正在中断。 补丁版本的修改在同一小行内保持向后兼容。

一个客户端启动一个类型服务器,并在JSON-RPC主连接上使用服务器支持的传输,如stdio或Node IPC与它通信。 在使用stdio时,stdout必须保留给JSON-RPC协议消息。

一个类型服务器预计将获得足够的工作空间和文件状态,以响应它支持的TSP请求。 客户端通常为此状态使用普通的LSP初始化和文档同步,然后在同一JSON-RPC连接上发送类型Server/*请求。

TSP还支持可选的额外只读连接。 原始连接仍然是主要连接并拥有初始化,工作空间状态,文档同步,状态变化通知,以及连接控制。 只有在客户端和服务器在初始化过程中谈判支持后,才会打开额外的连接。

按此顺序排列的典型会话:

- 客户端启动或连接到类型服务器。

- 客户端和服务器初始化任何共享的工作空间状态,通常通过LSP初始化和初始化消息。

- 客户端调用类型Server/getPresided ProtocolVersion,并验证返回的Semver字符串与其预期的协议版本兼容。

- 客户端呼叫类型Server/getSnapshot来获取第一个快照标识符。

- 客户端发送类型- query、 导入- 分辨率或搜索- 路径请求,包括当请求形状需要时的当前快照。

- 服务器发送类型Server/snapshotChanged 当以前的类型结果不再有效时。

多连接模式是一个可选的性能功能。 它让一个客户端为同一类型的服务器打开额外的本地频道,用于只读的TSP请求,而主连接继续拥有可变的工作空间状态。

客户端只有在能够从同时进行的只读工作中受益时,如量大类型的查询或背景工作者,才应使用多连接模式,这些查询不应阻碍主要的JSON-RPC连接。 一个服务器仍然必须在单连接模式下正确工作。 协议正确性不得需要多连接支持。

多连接支持是通过正常的LSP初始化请求和响应来谈判的。 一个可以打开额外TSP频道的客户端在能力。 experiment.typeServer MultiConnection下广告支持的运输类型:

{

"能力":{

"实验":{

"类型Server多连接":{

"支持的运输": ["ipc"]

}

}

}

}

可以服务额外 TSP 通道的服务器在初始化结果中返回相同的容量形状:

{

"能力":{

"实验":{

"类型Server多连接":{

"支持的运输": ["ipc"]

}

}

}

}

多连接模式只有在双方广告型号Server MultiConnection和两个支持的Transport列表至少有一个通用的运输时才启用。 如果任何一方省略了能力,或者没有通用的传输,会话仍然是单连接,客户端不得发送类型Server/连接。

目前支持的额外连接的内置运输类型是ipc. 这种谈判与主连接是分开的,主连接可以使用stdio或Node IPC.

在初始化和运输谈判之后,客户端通过在主连接上发送类型Server/连接打开一个额外的通道:

{

"类型":"开"

"仁":"ip"

"args": ["<ipc-endpoint>] (中文(简体) ).

}

对于ipc,args阵列识别服务器应该连接的终点或终点。 服务器应该验证请求,迅速连接到提供的端点,并成功返回结果:接受请求时为真。 如果服务器无法打开频道,它应该返回成功:错误,并且包含一个对日志有用的短消息。

当平台IPC机制支持时,ipc端点预计将提供全复式JSON-RPC流。 在这种情况下,参数包含一个终点字符串:

{

"类型":"开"

"仁":"ip"

"args": ["<full-duplex-ipc-endpoint>] (中文(简体) ).

}

如果平台IPC机制只暴露单向端点,则args包含两个端点字符串。 端点名称来自类型服务器的视角:第一个端点是服务器输入流,第二个端点是服务器输出流。

{

"类型":"开"

"仁":"ip"

"args":["<输入-ipc-endpoint>","<输出-ipc-endpoint>]]].

}

客户端通过发送类型Server/连接到同一运输类型和端点身份的主要连接上来关闭一个额外的通道:

{

"类型":"接近"

"仁":"ip"

"args": ["<ipc-endpoint>] (中文(简体) ).

}

服务器应当停止服务匹配的额外通道,并迅速关闭传输。 如果服务器未在客户端的超时预算内完成关闭,客户端也可以拆除其本地运输。

近端请求应当使用打开通道的相同方格形状:一个完整复式IPC流的端点,或者一个拆分的IPC流的相同输入/输出端点对。

主要连接拥有所有改变状态的流量。 下列情况必须保持主连接:

- LSP初始化和生命周期信息。

- 工作空间、配置、文件监视器和文件同步通知。

- 服务器对客户快照通知。

- Server/连接控制请求。

额外的连接是 TSP 仅读。 它们可能被用于不突变服务器状态的请求,其结果对客户端提供的快照有效。

在额外连接上允许的TSP消息与谈判的TSP版本绑定。 如果一个服务器报告支持一个TSP版本并为该会话发布多连接支持的广告,它必须支持为该版本定义的每一个额外连接的TSP消息。

下表列出首先允许每个消息在额外连接上的 TSP 版本:

服务器应拒绝LSP流量,状态变化通知,类型Server/连接,以及任何在额外连接收到时不允许谈判的TSP版本的TSP消息。

一个快照是一个非负整数,它能识别类型服务器分析状态的点-时间视图。 类型控件、声明、符号和其他返回对象仅对返回时的快照有效,除非另有明确请求。

当先前返回的类型分析结果无效时,类型服务器必须推进快照。 典型的无效事件包括打开文件更改,关闭文件,配置更改,被监视文件更改,依赖性更改,或任何更改分析结果的缓存重置。

快照规则:

- 类型Server/getSnapshot 返回当前快照标识符。

- 不得在会议期间减少快照识别器。

- 类型Server/snapshotChanged报告上一个和新的快照标识符。

- 包含 Stale 快照的请求会因 JSON- RPC 错误而失败,让客户端用新快照重试。 LSP的服务器无效错误代码(-32802)是这个案例的首选错误。

TSP遵循LSP的立场公约:

- 线路是零基的

- 字符偏移是零基的UTF-16代码单元。

- 使用起始位置和终点位置确定源段。

如果一个类型服务器在另一个编码中存储源位置,它必须转换协议边界的位置。 不正确的转换可能导致客户端请求错误的语法节点的信息。

类型query请求(类型Server/getComputedType,类型Server/getDecaledType,类型Server/getExpectedType)以节点或声明的参数识别源构造。 节点是URI+源范围。 声明描述一个符号的定义地点和方式,或者是一个由源 AST 节点支持的常规声明,或者是一个由类型检查器创建且没有源节点的合成声明。

无效的 Handle 是 - 1,并代表一个无效或无法使用的控件。 客户端和服务器应当将其作为一个哨卡值,而不是一个有效的对象标识符。

类型结果为 JSON 可序列标记的对象。 每个类型都包含一个歧视者,告诉客户如何解释其他对象。 协议支持内置类型,声明类型,函数,类,联盟,模块,类型变量,超载集,合成类型,以及类型引用。

每个类型对象都带有一个数字类型的区分符,一个数字代号,和一个位域的旗帜:

类型对象为快照绑定,类型ID为响应-局部:

- 返回类型对象只对生成它的请求所使用的快照有效。

- 类型ID用于将类型参考对象与同一序列化响应图中较早的类型对象连接起来。

- 身份证类型不是一张快照的稳定的全球身份,不应在不同的答复中进行比较。

- 应使用类型参考,以避免在一个答复中重复大型或递归型图表。

目前的协议是故意小的。 确切的参数和结果形状在协议文物中定义;下表列出每个带有方向和有效载荷形状的TSP消息。

一个类型服务器应当执行它与客户端集成并返回未定义的信息,只有在协议的结果类型允许的情况下。

三种类型query请求因同一节点或声明而不同:

- 类型Server/getComputedType返回从代码流推断出来的类型。 在缩小 到 int 后,b = a + 1 中的 b 类型计算为 int。

- 类型Server/getDeclaredType 返回来源中明确写入的类型。 对于 def foo(a:int QQ str),所申报的型号是 int QQ str.

- 类型Server/getExpectedType返回周围上下文所期望的类型。 对于调用foo(4),预期的论证类型是int QQ str.

使用标准的JSON-RPC错误响应。

错误应当包含足够的消息细节,使客户端日志能够识别失败的请求,但错误不应当暴露本地机密或只显示执行状态。

兼容类型服务器应验证这些行为:

- 类型Server/get 支持协议Version 返回客户端支持的 semver 字符串。

- 所有请求和通知的有效载荷都按照规程对文物进行序列化和去序列化。

- 类型Server/getSnapshot返回非阴性快照,快照不会往后走。

- 文档、配置和监视文件更改在可以更改返回分析数据时使快照失效。

- 带有 Stale 快照的请求以可重试的取消错误失败。

- 位置和范围转换采用基于零的UTF-16常规。

- 导入解析请求返回文件URI或根据协议结果类型没有结果。

- 对客户端提供的快照进行类型查询(计算、申报和预期)返回成型良好或未定义的类型对象。

- 多连接支持只有在服务器能够服务于谈判后的额外运输时才发布广告。

- 额外连接接受允许的每个 TSP 请求

本文由 AI图鉴自动抓取并翻译,版权归原作者所有;如需查看原文请点下方链接。

相关 AI 工具

相关免费羊毛

同源资讯

阅读原文(github.com)

标题、摘要与正文均来自该信源的公开页面,版权归原作者所有;本站自动聚合与翻译,仅作出处跳转。

← 返回 AI 资讯列表AI工具图鉴首页

返回 AI图鉴首页 · 提交工具 · 商务合作 · 关于本站 · 591 款 AI 工具分类导航 · 每日 AI 热门项目与动态