From fcd0d1506ef5b7e6f09e6740986a97178bc29832 Mon Sep 17 00:00:00 2001 From: Vishal Banthia Date: Wed, 3 Feb 2016 23:25:06 +0900 Subject: [PATCH] Save initialPackages in DB instead of memory --- lib/db/api.js | 6 +++++ lib/units/device/plugins/cleanup.js | 37 ++++++++++++++++++++++------- lib/units/processor/index.js | 21 ++++++++++++++++ lib/wire/wire.proto | 16 +++++++++++++ 4 files changed, 72 insertions(+), 8 deletions(-) diff --git a/lib/db/api.js b/lib/db/api.js index 59c801f0..f737d61e 100644 --- a/lib/db/api.js +++ b/lib/db/api.js @@ -176,6 +176,12 @@ dbapi.setDeviceOwner = function(serial, owner) { })) } +dbapi.saveDeviceInitialPackages = function(serial, packages) { + return db.run(r.table('devices').get(serial).update({ + initialPackages: packages + })) +} + dbapi.unsetDeviceOwner = function(serial) { return db.run(r.table('devices').get(serial).update({ owner: null diff --git a/lib/units/device/plugins/cleanup.js b/lib/units/device/plugins/cleanup.js index 00b4a33a..bfdb0e10 100644 --- a/lib/units/device/plugins/cleanup.js +++ b/lib/units/device/plugins/cleanup.js @@ -3,12 +3,16 @@ var Promise = require('bluebird') var _ = require('lodash') var logger = require('../../../util/logger') +var wire = require('../../../wire') +var wireutil = require('../../../wire/util') module.exports = syrup.serial() .dependency(require('../support/adb')) .dependency(require('../resources/service')) .dependency(require('./group')) - .define(function(options, adb, service, group) { + .dependency(require('../support/router')) + .dependency(require('../support/push')) + .define(function(options, adb, service, group, router, push) { var log = logger.createLogger('device:plugins:cleanup') var plugin = Object.create(null) @@ -25,17 +29,34 @@ module.exports = syrup.serial() }) } + router.on(wire.InitialPackagesReceivedMessage, function(channel, message) { + listPackages() + .then(function(currentPackages) { + var remove = _.difference(currentPackages, message.packageNames) + return Promise.map(remove, uninstallPackage) + }) + }) + + plugin.removePackages = function() { + push.send([ + wireutil.global + , wireutil.envelope(new wire.InitialPackagesGetMessage( + options.serial + )) + ]) + } + return listPackages() .then(function(initialPackages) { initialPackages.push(service.pkg) - plugin.removePackages = function() { - return listPackages() - .then(function(currentPackages) { - var remove = _.difference(currentPackages, initialPackages) - return Promise.map(remove, uninstallPackage) - }) - } + push.send([ + wireutil.global + , wireutil.envelope(new wire.InitialPackagesSaveMessage( + options.serial + , initialPackages + )) + ]) group.on('leave', function() { plugin.removePackages() diff --git a/lib/units/processor/index.js b/lib/units/processor/index.js index 7b022d91..08d13798 100644 --- a/lib/units/processor/index.js +++ b/lib/units/processor/index.js @@ -217,6 +217,27 @@ module.exports = function(options) { dbapi.setDeviceReverseForwards(message.serial, message.forwards) appDealer.send([channel, data]) }) + .on(wire.InitialPackagesSaveMessage, function(channel, message, data) { + dbapi.saveDeviceInitialPackages(message.serial, message.packageNames) + }) + .on(wire.InitialPackagesGetMessage, function(channel, message, data) { + dbapi.loadDevice(message.serial) + .then(function(device) { + devDealer.send([ + device.channel + , wireutil.envelope(new wire.InitialPackagesReceivedMessage( + device.initialPackages + )) + ]) + }) + .catch(function(err) { + log.error( + 'Unable to load device "%s"' + , message.serial + , err.stack + ) + }) + }) .handler()) lifecycle.observe(function() { diff --git a/lib/wire/wire.proto b/lib/wire/wire.proto index 868e507e..1b8b9997 100644 --- a/lib/wire/wire.proto +++ b/lib/wire/wire.proto @@ -76,6 +76,9 @@ enum MessageType { ReverseForwardsEvent = 72; FileSystemListMessage = 81; FileSystemGetMessage = 82; + InitialPackagesSaveMessage = 92; + InitialPackagesGetMessage = 93; + InitialPackagesReceivedMessage = 94; } message FileSystemListMessage { @@ -551,3 +554,16 @@ message RotationEvent { required string serial = 1; required int32 rotation = 2; } + +message InitialPackagesSaveMessage { + required string serial = 1; + repeated string packageNames = 2; +} + +message InitialPackagesGetMessage { + required string serial = 1; +} + +message InitialPackagesReceivedMessage { + repeated string packageNames = 2; +}