workflow: use EventEmitter