hubs
Version:
``` Caryl ------ courier3 / \ / \ courier1 courier2
80 lines (63 loc) • 2.05 kB
JavaScript
const Context = require('./context')
const EventEmitter = require('events')
const promiseTree = require('./promiseTree')
/**
* Courier
* @desc lifecycle: 一个请求配置有一个实例, 存在于应用的整个生命周期
* @class Courier
* @extends EventEmitter
*/
class Courier extends EventEmitter {
/**
* Creates an instance of Courier.
*
* @memberof Courier
*/
constructor(items, protocol) {
super()
this.items = Context.preprocess(items, protocol)
}
applyPlugin(plugin){
plugin.call(this)
}
/**
* 发送信息
*
* @param {any} context
* @member uri
* @member params
* @member shoudStop
* @member model
* @memberof Courier
*/
async send(context, key) {
try {
var cur = context.reqItems[key]
this.emit('courierBeforeParamReady', context, key)
cur.params = cur.prepareParams && cur.prepareParams(cur, key,context)
this.emit('courierParamsReady', context, key)
this.emit('courierBeforeRequest', context, key)
var payload = await context.reqItems[key].requestor.call(context, cur)
context.payloads[key] = payload
this.emit('courierAfterRequest', context, key)
context.payloads[key] = cur.processResult && cur.processResult(context.payloads[key], key,context)
this.emit('courierResultReady', context, key)
} catch (error) {
context.errs[key] = error
this.emit('courierError', context, error)
}
return context
}
async deliver(state) {
var context = new Context(this.items, state)
this.emit('contextReady', context)
this.emit('beforeRequest', context)
await promiseTree(this.items, ({key})=>{
return this.send(context, key)
})
this.emit('afterRequest', context)
this.emit('resultReady', context)
return context
}
}
module.exports = Courier