Skip to content

PipelineHandler ​

PipelineHandler允许外部编排 TaskHandler,根据上一轮结果和状态派发下一个Task。

PipelineInstance 执行期间会绑定对应的PipelineHandler。

接口 ​

ts
abstract class PipelineHandler {
  abstract readonly name: string
  readonly description?: string
  abstract next(this: any, lastResult: unknown): PipelineStep | undefined
  onNormalSIG?(this: any, signal: NormalSignal): void | Promise<void>
}
成员作用
nameEvent选择Pipeline时使用的名称
descriptionPipeline的用途说明
next()根据上一个Task的结果派发下一步
onNormalSIG()接收发给当前Event的普通信号

next()返回一个PipelineStep:

ts
interface PipelineStep {
  task: string
  input: unknown
}

task对应已注册的TaskHandler,input会成为该TaskInstance的输入。

定义 Handler ​

ts
import { PipelineHandler } from '@nyirusu/nasdk/NACEB'
import type { PipelineInstance } from '@nyirusu/nasdk/NACEB'

class GreetingPipeline extends PipelineHandler { 
  readonly name = 'greeting'
  readonly description = '生成问候语'

  next(this: PipelineInstance, lastResult: unknown) {
    if (!this.state.started) {
      this.state.started = true
      return {
        task: 'greet',
        input: this.event.payload,
      }
    }

    return { task: '$terminal', input: lastResult }
  }
}

TIP

Pipeline第一次运行时,lastResult为undefined,此后是上一个Task的返回值。

由于Task也可能返回undefined,需要区分步骤时应使用this.state记录。

DANGER

next()和onNormalSIG()的this绑定在PipelineInstance,而不是PipelineHandler。

成员作用
this.event当前Pipeline处理的EventInstance
this.state跨Task步骤共享的状态空间
this.getTask()获取当前TaskInstance
this.signalTask()将信号继续发送给当前Task

因此next()和onNormalSIG()应使用普通方法,不应使用箭头函数。

Handler内对this的修改是在对应实例上完成的,并不会修改Handler本身。这一点和TaskHandler一致。

结束 Pipeline ​

Pipeline必须派发 $terminal 任务才能视为正常完成:

ts
return { task: '$terminal', input: finalResult }

$terminal的输入就是Pipeline最终结果。

普通信号 ​

普通信号会先交给onNormalSIG(),不会立刻传给当前Task,信号入口见Event层。

ts
async onNormalSIG(this: PipelineInstance, signal: NormalSignal) {
  await this.signalTask(signal)
}

注册 ​

在构造NACEB时传入实例:

ts
const naceb = new NACEB({
  pipelineHandlers: [new GreetingPipeline()], 
  taskHandlers: [],
})

也可以在构造后注册:

ts
naceb.registerPipelineHandler(new GreetingPipeline())

Released under the MIT License.