1
0
Fork 0
mirror of https://github.com/openstf/stf synced 2025-10-04 18:29:17 +02:00

Only track devices when we need to.

This commit is contained in:
Simo Kinnunen 2014-02-27 15:04:57 +09:00
parent 615088edcd
commit 2692f71219
4 changed files with 102 additions and 69 deletions

View file

@ -237,23 +237,32 @@ module.exports = function(options) {
}
var messageListener = wirerouter()
.on(wire.JoinGroupMessage, function(channel, message) {
socket.emit('group.join', message)
})
.on(wire.LeaveGroupMessage, function(channel, message) {
socket.emit('group.leave', message)
})
.on(wire.DevicePresentMessage, function(channel, message) {
socket.emit('device.present', message)
socket.emit('device.add', {
serial: message.serial
, present: true
})
})
.on(wire.DeviceAbsentMessage, function(channel, message) {
socket.emit('device.absent', message)
socket.emit('device.remove', {
serial: message.serial
, present: false
})
})
.on(wire.JoinGroupMessage, function(channel, message) {
socket.emit('device.change', message)
})
.on(wire.LeaveGroupMessage, function(channel, message) {
socket.emit('device.change', {
serial: message.serial
, owner: null
})
})
.on(wire.DeviceStatusMessage, function(channel, message) {
socket.emit('device.status', message)
socket.emit('device.change', message)
})
.on(wire.DeviceIdentityMessage, function(channel, message) {
socket.emit('device.identity', message)
socket.emit('device.change', message)
})
.on(wire.TransactionProgressMessage, function(channel, message) {
socket.emit('tx.progress', channel.toString(), message)

View file

@ -3,78 +3,80 @@ var _ = require('lodash')
var Promise = require('bluebird')
module.exports = function DeviceServiceFactory($rootScope, $http, socket) {
var deviceService = {
devices: [],
devicesBySerial: {}
}
var deviceService = {}
function get(data) {
return deviceService.devices[deviceService.devicesBySerial[data.serial]]
}
function Tracker($scope, options) {
var devices = []
, devicesBySerial = Object.create(null)
, scopedSocket = socket.scoped($scope)
function insert(data, alter) {
deviceService.devicesBySerial[data.serial] =
deviceService.devices.push(data) - 1
_.assign(data, alter)
$rootScope.$digest()
}
function modify(data, properties) {
if (data) {
_.assign(data, properties)
$rootScope.$digest()
function get(data) {
return devices[devicesBySerial[data.serial]]
}
}
function remove(data) {
var index = deviceService.devicesBySerial[data.serial]
if (index >= 0) {
deviceService.devices.splice(index, 1)
delete deviceService.devicesBySerial[data.serial]
$rootScope.$digest()
function insert(data) {
devicesBySerial[data.serial] = devices.push(data) - 1
$scope.$digest()
}
}
socket.on('device.present', function (data) {
remove(data)
insert(data, {
present: true
function modify(oldData, newData) {
_.assign(oldData, newData)
$scope.$digest()
}
function remove(data) {
var index = devicesBySerial[data.serial]
if (index >= 0) {
devices.splice(index, 1)
delete devicesBySerial[data.serial]
$scope.$digest()
}
}
scopedSocket.on('device.add', function (data) {
var device = get(data)
if (device) {
modify(device, data)
}
else if (options.auto) {
insert(data)
}
})
})
socket.on('device.status', function (data) {
modify(get(data), data)
})
socket.on('device.absent', function (data) {
remove(data)
})
socket.on('device.identity', function (data) {
modify(get(data), data)
})
socket.on('group.join', function (data) {
modify(get(data), data)
})
socket.on('group.leave', function (data) {
modify(get(data), {
owner: null
scopedSocket.on('device.remove', function (data) {
var device = get(data)
if (device) {
modify(device, data)
remove(data)
}
})
})
oboe('/api/v1/devices')
.node('devices[*]', function (device) {
// We want to skip other arguments
scopedSocket.on('device.change', function (data) {
var device = get(data)
if (device) {
modify(device, data)
}
})
this.add = function(device) {
remove(device)
insert(device)
}
this.devices = devices
}
deviceService.trackAll = function ($scope) {
var tracker = new Tracker($scope, {
auto: true
})
deviceService.list = function () {
return $http.get('/api/v1/devices')
.then(function(response) {
return response.data.devices
oboe('/api/v1/devices')
.node('devices[*]', function (device) {
tracker.add(device)
})
return tracker
}
deviceService.get = function (serial) {

View file

@ -2,5 +2,27 @@ var io = require('socket.io')
module.exports = function SocketServiceFactory() {
var socketService = io.connect()
socketService.scoped = function($scope) {
var listeners = []
$scope.$on('$destroy', function() {
listeners.forEach(function(listener) {
socket.removeListener(listener.event, listener.handler)
})
})
return {
on: function(event, handler) {
listeners.push({
event: event
, handler: handler
})
socketService.on(event, handler)
return this
}
}
}
return socketService
}

View file

@ -1,7 +1,7 @@
h1 Devices list
ul.device-list
li(ng-repeat='device in devices.value track by device.serial')
li(ng-repeat='device in tracker.devices track by device.serial')
span {{ device.serial }} {{ device.present ? 'present' : 'absent' }} {{ device.owner.email }}
a(href='#!/devices/{{ device.serial }}') Linky
button(ng-click="invite(device)") invite