diff --git a/lib/roles/app.js b/lib/roles/app.js index 4ccca8c0..10899965 100644 --- a/lib/roles/app.js +++ b/lib/roles/app.js @@ -22,7 +22,7 @@ module.exports = function(options) { , app = express() , server = http.createServer(app) , io = socketio.listen(server) - , router = new events.EventEmitter() + , groupRouter = new events.EventEmitter() app.set('view engine', 'jade') app.set('views', pathutil.resource('app/views')) @@ -69,11 +69,7 @@ module.exports = function(options) { }) sub.on('message', function(channel, data) { - router.emit( - channel.toString() - , channel - , wire.Envelope.decode(data) - ) + groupRouter.emit(channel.toString(), channel, data) }) app.get('/partials/:name', function(req, res) { @@ -171,10 +167,10 @@ module.exports = function(options) { var messageListener = wirerouter() .on(wire.JoinGroupMessage, function(channel, message) { - socket.emit('join', message) + socket.emit('group.join', message) }) .on(wire.LeaveGroupMessage, function(channel, message) { - socket.emit('leave', message) + socket.emit('group.leave', message) }) .handler() @@ -183,23 +179,23 @@ module.exports = function(options) { // @todo Use socket.io to push global events to all clients instead // of listening on every connection, otherwise we're very likely to // hit EventEmitter's leak complaints (plus it's more work) - channels.push(wireutil.global) - router.on(wireutil.global, messageListener) + groupRouter.on(wireutil.global, messageListener) // User's private group channels.push(group) sub.subscribe(group) - router.on(group, messageListener) + groupRouter.on(group, messageListener) // Clean up all listeners and subscriptions socket.on('disconnect', function() { + groupRouter.removeListener(wireutil.global, messageListener) channels.forEach(function(channel) { - router.removeListener(channel, messageListener) + groupRouter.removeListener(channel, messageListener) sub.unsubscribe(channel) }) }) - socket.on('invite', function(data) { + socket.on('group.invite', function(data) { push.send([wireutil.global, wireutil.makeGroupMessage( group , options.groupTimeout @@ -207,7 +203,7 @@ module.exports = function(options) { )]) }) - socket.on('kick', function(data) { + socket.on('group.kick', function(data) { push.send([group, wireutil.makeUngroupMessage( group , data diff --git a/lib/util/devutil.js b/lib/util/devutil.js index f09652bd..151a4f4f 100644 --- a/lib/util/devutil.js +++ b/lib/util/devutil.js @@ -37,6 +37,8 @@ devutil.matchesRequirements = function(capabilities, requirements) { default: return false } + + return true }) } diff --git a/lib/wire/channelmanager.js b/lib/wire/channelmanager.js index f7c15c8a..3349d7d9 100644 --- a/lib/wire/channelmanager.js +++ b/lib/wire/channelmanager.js @@ -22,7 +22,7 @@ ChannelManager.prototype.register = function(id, timeout) { ChannelManager.prototype.unregister = function(id) { var channel = this.channels[id] delete this.channels[id] - clearInterval(channel.timer) + clearTimeout(channel.timer) } ChannelManager.prototype.keepalive = function(id) { diff --git a/lib/wire/util.js b/lib/wire/util.js index 37d28279..c64d6eb8 100644 --- a/lib/wire/util.js +++ b/lib/wire/util.js @@ -35,12 +35,27 @@ var wireutil = { return wireutil.envelope(new wire.GroupMessage( channel , timeout - , requirements + , Object.keys(requirements).map(function(name) { + var item = requirements[name] + return new wire.DeviceRequirement( + name + , item.value + , wire.RequirementType[item.match.toUpperCase()] + ) + }) )) } -, makeUngroupMessage: function(requirements) { +, makeUngroupMessage: function(channel, requirements) { return wireutil.envelope(new wire.UngroupMessage( - requirements + channel + , Object.keys(requirements).map(function(name) { + var item = requirements[name] + return new wire.DeviceRequirement( + name + , item.value + , wire.RequirementType[item.match.toUpperCase()] + ) + }) )) } , makeJoinGroupMessage: function(serial) { diff --git a/res/app/scripts/controllers/DeviceListCtrl.js b/res/app/scripts/controllers/DeviceListCtrl.js index 0f02ca76..74bebf4d 100644 --- a/res/app/scripts/controllers/DeviceListCtrl.js +++ b/res/app/scripts/controllers/DeviceListCtrl.js @@ -1,11 +1,30 @@ -define(['./module', 'oboe'], function(mod, oboe) { - function DeviceListCtrl($scope, deviceService) { +define(['./module'], function(mod) { + function DeviceListCtrl($scope, deviceService, groupService) { $scope.devices = deviceService.devices + + $scope.invite = function(device) { + groupService.invite({ + serial: { + value: device.serial + , match: 'exact' + } + }) + } + + $scope.kick = function(device) { + groupService.kick({ + serial: { + value: device.serial + , match: 'exact' + } + }) + } } mod.controller('DeviceListCtrl' , [ '$scope' , 'deviceService' + , 'groupService' , DeviceListCtrl ]) }) diff --git a/res/app/scripts/services/groupService.js b/res/app/scripts/services/groupService.js index bd00129c..6d07e7f8 100644 --- a/res/app/scripts/services/groupService.js +++ b/res/app/scripts/services/groupService.js @@ -6,11 +6,13 @@ define(['./module', 'lodash'], function(mod, _) { socket.on('group.join', function(data) { groupService.members.push(data.serial) + console.log('group.join', data) $rootScope.$digest() }) - socket.on('group.left', function(data) { + socket.on('group.leave', function(data) { _.pull(groupService.members, data.serial) + console.log('group.leave', data) $rootScope.$digest() })