Skip to content

EventProcessor ​

EventProcessor处理具有生命周期的Event请求,在Processor基础上增加中途信号。

接口 ​

ts
import type {
  EventProcessor,
  ProcessorSignalSpec,
} from '@nyirusu/nasdk/types'

interface EventProcessor extends Processor {
  signal(spec: ProcessorSignalSpec): Promise<void>
}

type ProcessorSignalSpec =
  | {
      signalId: string
      reqId: string
      kind: 'normal'
      payload: unknown
    }
  | {
      signalId: string
      reqId: string
      kind: 'pause' | 'resume' | 'abort'
    }

EventProcessor可以多次调用onProcess(),但只能通过onResponse()提交一个终局结果。

默认实现 ​

NACEB通过naceb.nacpAdaptor提供默认EventProcessor:

ts
app.bindProcessor('event', naceb.nacpAdaptor)

Adaptor只使用NACEB公开接口,将Processor操作映射到EventInstance。

list ​

list()返回naceb.listEventAlias(),使EventAlias中的名称与描述进入NApp声明。

push ​

text
Processor.push(spec, hooks)
  → pushEvent({ name: spec.target, payload: spec.payload })
  → Event停在idle
  → 监听runtime:message
  → 挂载afterTDone与afterTFailure
  → 保存reqId ↔ eventId
  → Event.start()

Adaptor保留idle窗口,不使用bypassIdle。过程消息Listener与终局Hook会在第一次状态转移前挂载,避免丢失同步完成的Event结果。

输出映射 ​

NACEB输出Processor回调NACP消息
processingResultReport(chunk)onProcess(chunk)Notify
Event doneonResponse(result, true)成功Response
Event failureonResponse(result, false, 'processor-failed')失败Response

Event终局时,Adaptor会移除过程消息Listener、删除ID映射并消费EventInstance。

Event创建前失败时,没有EventInstance可以进入终局。Adaptor会直接调用:

ts
hooks.onResponse(
  { error: errorDetail(error) },
  false,
  'processor-rejected',
)

processor-rejected表示请求没有开始;processor-failed表示请求已经进入NACEB并以失败终局。

ID 隔离 ​

NACP使用reqId关联远端Request,NACEB使用eventId管理本地EventInstance。Adaptor内部保存两者映射:

text
reqId ↔ eventId

eventId不会作为协议ID交给NACP,push()的返回值也不会被NACP使用。

信号映射 ​

signal()按reqId找到仍然活跃的EventInstance:

kindNACEB操作
normalevent.normalSIG(),交给PipelineHandler的onNormalSIG()
pauseevent.pause()
resumeevent.resume()
abortevent.abort()

信号执行前会广播naceb:runtime:signal:{eventId}。找不到活跃Event,或暂停、恢复未成功时,signal()会抛错。

NACP如何接收并调用Processor见onRequest与onSignal。

Released under the MIT License.