var syrup = require('stf-syrup') var Promise = require('bluebird') var logger = require('../../../util/logger') var wire = require('../../../wire') var wireutil = require('../../../wire/util') var lifecycle = require('../../../util/lifecycle') module.exports = syrup.serial() .dependency(require('../support/adb')) .dependency(require('../support/router')) .dependency(require('../support/push')) .dependency(require('./group')) .define(function(options, adb, router, push, group) { var log = logger.createLogger('device:plugins:logcat') var plugin = Object.create(null) var activeLogcat = null plugin.start = function(filters) { return group.get() .then(function(group) { return plugin.stop() .then(function() { log.info('Starting logcat') return adb.openLogcat(options.serial, { clear: true }) }) .timeout(10000) .then(function(logcat) { activeLogcat = logcat function entryListener(entry) { push.send([ group.group , wireutil.envelope(new wire.DeviceLogcatEntryMessage( options.serial , entry.date.getTime() / 1000 , entry.pid , entry.tid , entry.priority , entry.tag , entry.message )) ]) } logcat.on('entry', entryListener) return plugin.reset(filters) }) }) } plugin.stop = Promise.method(function() { if (plugin.isRunning()) { log.info('Stopping logcat') activeLogcat.end() activeLogcat = null } }) plugin.reset = Promise.method(function(filters) { if (plugin.isRunning()) { activeLogcat .resetFilters() if (filters.length) { activeLogcat.excludeAll() filters.forEach(function(filter) { activeLogcat.include(filter.tag, filter.priority) }) } } else { throw new Error('Logcat is not running') } }) plugin.isRunning = function() { return !!activeLogcat } lifecycle.observe(plugin.stop) group.on('leave', plugin.stop) router .on(wire.LogcatStartMessage, function(channel, message) { var reply = wireutil.reply(options.serial) plugin.start(message.filters) .then(function() { push.send([ channel , reply.okay('success') ]) }) .catch(function(err) { log.error('Unable to open logcat', err.stack) push.send([ channel , reply.fail('fail') ]) }) }) .on(wire.LogcatApplyFiltersMessage, function(channel, message) { var reply = wireutil.reply(options.serial) plugin.reset(message.filters) .then(function() { push.send([ channel , reply.okay('success') ]) }) .catch(function(err) { log.error('Failed to apply logcat filters', err.stack) push.send([ channel , reply.fail('fail') ]) }) }) .on(wire.LogcatStopMessage, function(channel) { var reply = wireutil.reply(options.serial) plugin.stop() .then(function() { push.send([ channel , reply.okay('success') ]) }) .catch(function(err) { log.error('Failed to stop logcat', err.stack) push.send([ channel , reply.fail('fail') ]) }) }) return plugin })