-
Notifications
You must be signed in to change notification settings - Fork 6
Description
- use property on task stream instance instead of data on custom event
For duplex streams, this is obvious.
But for tasks that create files:
const task = Task({
input: 'foo'
output: new File('*.txt')
}, ({ input, output }) => shell(`echo ${input} > log.txt`))We wait for the task to finish:
inside Task
stream.on('end' /* or finish */, () => {
// resolve output glob pattern and emit it
const resolvedOutput = globby.sync(output.value)
stream.emit('task.done', resolvedOutput)
})Then it is Join's job to pass these on:
function join(...tasks) {
const doTaskAndTryNext = (i, tasks) => {
const task = tasks[i]
task()
.on('task.done', (output) => {
console.log('Task finished with output:')
console.log(tab(1) + output)
if (i+1 !== tasks.length) {
doTaskAndTryNext(i+1, tasks)
}
})
}
doTaskAndTryNext(0, tasks)
}But nothing is being passed in yet.
Idea 1
Make Task always be a duplex object stream. It's first and final chunks will be objects pertaining to input and output. Then we need to wrap the actual stream of the task, for example, a Readable whose this._source is just another stream. This may complicated doing duplex streams piping together.
Idea 2
Wow. This feels so obvious now. Pass items in the first param of Task. (which right now is just () => { ... }. I'll say my third idea anyways lol.
Idea 3
Have a task.made event emitted that emits a callback which can then pass in resolved outputs which become resolved inputs in the new task.
It is important to handle this case well, because with these pipelines, not everything is streamable. For example, doing an alignment requires an indexing on the reference which needs to run fully. But I think having Task always be a stream (i.e. it wraps promises into streams) makes it easier to then orchestrate things. And having an output as a File tells the orchestrator that this Task cannot be piped into another - unless we go the route where Task is always a duplex stream that wraps over other streams.