blob: c63f2083f63a5bce7967b0687d9f44f622d6d0ec [file] [log] [blame]
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
})