Seneca BatchProcessor is a plugin for Seneca
INTRO
This open source module is sponsored and supported by Voxgig. |
---|
$ npm install @seneca/batch-processor
// Seneca setup script:
seneca.use('BatchProcessor', {
send: {
mode: 'async', // wait for transition, global setting
},
where: {
'aim:foo,color:red': {
match: { // on out
'ok:true': {
send: [ // zero or more next messages
{
msg: {
aim: 'bar',
color: 'blue',
planet: 'out~planet' // dot path ref (see npm package `inks` .evaluate)
order: 'ctx~place.order~Number' // Gubu validation expression
}
},
{
mode: 'sync', // use .act, don't await
msg: 'aim:bar,color:green,planet:out~planet',
body: { // msg has precedence
order: 'ctx~place.order~Number'
}
}
]
}
}
}
}
})
// Within aim:foo,color:red action script:
const process = seneca.export('BatchProcessor/process')
let out = {ok:true,planet:'mars'}
let ctx = {place:{order:1}} // for data not returned by message action
out = await process(seneca, ctx, out)
// send = [{aim:bar,color:blue,planet:mars,order:1}, {aim:bar,color:green,planet:mars,order:1}]
// out = {ok:true,planet:'mars',batch:BATCHID,run:RUNID}
The message send operations are executed by the plugin with code equivalent to:
await seneca.post({aim:'bar',color:'blue',planet:'mars',order:1})
seneca.act({aim:bar,color:green,planet:mars,order:1})
// Seneca setup script:
seneca
.use('BatchMonitor', {...})
.use('BatchProcessor', {
send: {
mode: 'async', // wait for transition, global setting
},
where: {
'aim:foo,color:red': {
match: {
'*': { // catch all if no other patterns match
// Create BatchMonitor entry if ctx.BatchMonitorEntry$ defined
entry: 'fail' // entry state, entry.info={why:'batch-process-no-match'}
},
'ok:false': {
entry: { state: 'fail', info: { why: 'out~why' } },
send: { // if single msg, no array needed
// ctx has original message in msg$
// out~ means entire contents of out object
msg: 'aim:monitor,fail:msg,msg:ctx~msg$,out:out~'
}
},
'ok:true': { // matches are in same Patrun set, so usual Seneca pattern rules apply
entry: 'done', // only created after all msgs sent
send: [ // zero or more next messages
{
msg: {
aim: 'bar',
color: 'blue',
planet: 'out~planet' // dot path ref
order: 'ctx~place.order~Number' // Gubu validation expression
}
},
{
mode: 'sync', // use .act, don't await
msg: 'aim:bar,color:green,planet:out~planet',
body: { // msg has precedence
order: 'ctx~place.order~Number'
}
}
]
}
}
}
}
})
// Within aim:foo,color:red action script:
const process = seneca.export('BatchProcessor/process')
const bme = seneca.BatchMonitor(...).entry(...)
let out = {ok:true,planet:'mars'}
let ctx = {place:{order:1},BatchMonitorEntry$:bme}
out = await process(seneca, ctx, out)
// send = [{aim:bar,color:blue,planet:mars,order:1}, {aim:bar,color:green,planet:mars,order:1}]
// out = {ok:true,planet:'mars',batch:BATCHID,run:RUNID}
// The ctx object is used for returning additional information, such as send msg results.
// ctx = {place:{order:1}, result$:[{msg:,out:,bgn:,end:,dur:},...]}
Review the unit tests for more examples.