Enkaku 服务器
安装
npm install @enkaku/server
召唤钩
Server, (中文(简体) ), serve() 财务报告和审定财务报表 server.handle(transport, options) 接受选项 onInvocation: InvocationHook 调用.
每节车厢的车钩会覆盖服务器的车钩.
服务器在验证,认证,访问控制,加密和回放检查后等待钩子,然后启动处理器.
它运行一次 对于每个请求,流,频道或事件引用,永远不会 send 或者说 abort 留言.
InvocationContext 包含:
| 外地 | 含义 |
|---|---|
type | 'request', (中文(简体) ), 'stream', (中文(简体) ), 'channel' 或者说 'event' |
procedure | 程序名称 |
signal | 在勾钩等待发送时中止取消的信号 |
rid | 请求身份证明, 因事件缺席 |
caller | InvocationCaller 已核实 iss 和可选的呼叫者 sub |
verifyDelegation() | 同步检查此程序和服务器 |
transport | 特定运输背景,类型为 unknown |
message | 原始消息 |
与 requireAuth: false, (中文(简体) ), caller 缺席和 verifyDelegation() 返回时 false。 。 。 .
sub 只有在 verifyDelegation() 返回时 true。 。 。 .
缺少或无效代表团返回 false,与发行方匹配的主题也是如此。 意外的核查失败拒绝了这一承诺.
取消运输 signal 钩子还在等待中 Hooks可以使用它来取消同步检查.
取消后,解钩从不启动处理器.
检查会记住它的承诺 并分享它与访问控制上游.
访问检查函数返回 AccessDecision 揭发同样的 verifyDelegation() 方法.
import { InvocationRejectedError, Server } from '@enkaku/server'
const server = new Server({
protocol,
handlers,
identity,
accessRules,
async onInvocation(ctx) {
if (ctx.caller?.sub != null && !(await ctx.verifyDelegation())) {
throw new InvocationRejectedError({
code: 'DELEGATION_REQUIRED',
message: 'A valid delegation is required',
})
}
},
})
掷出 InvocationRejectedError({ code, message, cause? }) 跳过处理器并保存错误回复中提供的代码和消息.
其他例外产生代码 EK01 和消息 Invocation hook failed,不披露例外信息.
事件没有得到答复。 所有钩子故障都发出 handlerError 有类别 'invocation' 并标出引用失败的跨度.
流出后压
Server 财务报告和审定财务报表 serve() 接受 streamHighWaterMark,一个正有限安全整数默认为 1。 。 。 .
它将每个流和频道处理器的可读出队列绑定在以数值而不是字节计量的值上.
频道的接通管保持了现有的行为.
const server = serve({
requireAuth: false,
protocol,
handlers,
transport,
streamHighWaterMark: 4,
})
当运输发送站点时,队列会填满,处理器会是下一个 writer.write() 留待处理.
那个作家 desiredSize 减到 0 直到下游恢复消费.
已经存在于运输缓冲器中的值不在此队列限制之内 .
管家必须等待写作或尊重 writer.ready 避免积累待写.
默认现在应用了后压, 以前的版本允许无约束的出行队列 .
频道发送
服务器发送一个 send 仅当其 prc 匹配频道打开程序 rid。 。 。 .
任何其他 send,包括给请求或流的,是一个无效的信息.
服务器发送 invalidMessage 用错误代码回复 EK08 关于这个 rid。 。 。 .
与其他无效发送一样,客户端随后将频道视为失败,而服务器处理器可能继续运行.
abort 信件不带程序, 并按 rid 一个人.
有效载荷编辑
Server 财务报告和审定财务报表 serve() 接受 redactProcedures、一系列程序名称或上游 (procedure: string) => boolean。 。 。 .
投出数为匹配的上方.
服务器从不记录任何级别经编辑程序的有效载荷.
这包括参数、事件数据、发送和接收的频道或流值、结果、处理器或引用钩错误.
命名一个已编辑的程序的无效信件会被登录而不发生其验证错误 .
频道 send 消息和无效消息使用其实时请求的程序 rid,而不是客户端提供的 prc。 。 。 .
在设置了选项后,一个命名为未知程序的无效消息也会被登录,而不会出现其验证错误.
无效也是 send 或者说 abort 请求的认证尚未确定.
日志记录保存程序名,请求ID,消息类型和出错代码.
出错记录也保留出错名称,从不保留其消息或原因.
一个被编辑的程序的Spans只记录出错误代码和名称.
他们的错误消息和状态消息已读取 Error details redacted,如同无效信件的验证错误一样.
电线上的信息没有变化.
进行中 handlerError 财务报告和审定财务报表 invalidMessage 事件仍然携带有效载荷 error.cause 联 合 国 writeFailed 事件也可以发生.
消费者不得登录这些有效载荷.
const server = serve({
requireAuth: false,
protocol,
handlers,
transport,
redactProcedures: ['secrets/provision', 'mcp/callTool'],
})