PageRenderTime 62ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/remote/petbot.js

https://gitlab.com/jforge/petbot
JavaScript | 168 lines | 154 code | 12 blank | 2 comment | 20 complexity | ac6a1849147e3f5a792a05ec31175cc8 MD5 | raw file
  1. process.title = 'petbot';
  2. var config = require('../common/config');
  3. var express = require('express');
  4. var app = express();
  5. var socket = require('socket.io');
  6. var _ = require('underscore');
  7. var queue = [];
  8. var localServerUp = null;
  9. var T = require('tbone').tbone;
  10. var tbone = T;
  11. var browsers = tbone.collections.base.make({
  12. lookupById: true
  13. });
  14. T('browsers', browsers);
  15. T('drive', function () {
  16. var driving = _.filter(_.pluck(T('browsers') || {}, 'drive'), function (drive) {
  17. return drive && (!!drive.right || !!drive.forward);
  18. });
  19. return driving.length === 0 ? {} : driving[0];
  20. });
  21. T('isDriving', function () {
  22. return !!T('drive.forward') || !!T('drive.right');
  23. });
  24. T('botOnline', function () {
  25. return _.keys(T('bots')).length > 0;
  26. });
  27. var bots = tbone.collections.base.make({
  28. lookupById: true
  29. });
  30. T('bots', bots);
  31. app.configure(function () {
  32. var username = process.env.AUTH_USERNAME;
  33. var password = process.env.AUTH_PASSWORD;
  34. if (username != null && password != null) {
  35. app.use(express.basicAuth(username, password));
  36. }
  37. app.use(express.static(__dirname + '/../public'));
  38. });
  39. var server = app.listen(process.env.PORT || 5000);
  40. // Gracefully shutdown (preferably releasing port immediately) on SIGHUP
  41. process.on('SIGHUP', function () {
  42. try {
  43. server.close(function() {
  44. process.exit(0);
  45. });
  46. } catch(e) {
  47. process.exit(0);
  48. }
  49. });
  50. var io = socket.listen(server);
  51. io.configure(function () {
  52. io.set("transports", ["xhr-polling"]);
  53. io.set("polling duration", 10);
  54. io.set("log level", 1);
  55. io.set('heartbeat interval', 12);
  56. io.set('heartbeat timeout', 20);
  57. });
  58. io.sockets.on('connection', function (socket) {
  59. var address = socket.handshake.address;
  60. console.log('new connection ' + socket.id + ' from ' + address.address + ":" + address.port);
  61. socket.on('clientId', function (data) {
  62. if (data.id === config.DEVICE_ID) {
  63. handleLocalServer(socket);
  64. } else {
  65. handleBrowser(socket);
  66. }
  67. });
  68. if (address.address.match(/^127.0.0.1/)) {
  69. socket.on('reloadui', function () {
  70. console.log('broadcasting UI reload');
  71. io.sockets.emit('reloadui');
  72. });
  73. }
  74. });
  75. var nextId = 1;
  76. var handleLocalServer = function (socket) {
  77. console.log('local server is connected');
  78. var me = tbone.make();
  79. var myId = nextId++;
  80. socket.emit('yourId', myId);
  81. me.query('id', myId);
  82. bots.add(me);
  83. T(function () {
  84. if (!socket.disconnected) {
  85. socket.emit('drive', T('drive'));
  86. }
  87. });
  88. T(function () {
  89. if (!socket.disconnected) {
  90. if (T('isDriving')) {
  91. socket.emit('keepDriving');
  92. T('isDrivingTimer');
  93. setTimeout(function () {
  94. T.toggle('isDrivingTimer');
  95. }, 500);
  96. }
  97. }
  98. });
  99. socket.on('pins', function (data) {
  100. me('pins', data);
  101. });
  102. socket.on('drive', function (data) {
  103. me('drive', data);
  104. });
  105. socket.on('disconnect', function () {
  106. bots.remove(me);
  107. console.log('local server disconnected');
  108. });
  109. };
  110. function handleBrowser (socket) {
  111. var me = tbone.make();
  112. var myId = nextId++;
  113. socket.emit('yourId', myId);
  114. me.query('id', myId);
  115. browsers.add(me);
  116. T(function () {
  117. if (!socket.disconnected) {
  118. socket.emit('browsers', T('browsers'));
  119. }
  120. });
  121. T(function () {
  122. if (!socket.disconnected) {
  123. socket.emit('bots', T('bots'));
  124. }
  125. });
  126. T(function () {
  127. if (!socket.disconnected) {
  128. socket.emit('drive', T('drive'));
  129. }
  130. });
  131. T(function () {
  132. if (!socket.disconnected) {
  133. socket.emit('botOnline', !!T('botOnline'));
  134. }
  135. });
  136. // Expect the client to say "keepDriving" every ~500 ms.
  137. var driveTimeout;
  138. function stopDrivingAfterTimeout() {
  139. if (driveTimeout) {
  140. clearTimeout(driveTimeout);
  141. }
  142. driveTimeout = setTimeout(function () {
  143. me.query('drive', {});
  144. }, 1000);
  145. }
  146. socket.on('drive', function (data) {
  147. me.query('drive', _.extend(data, { browserId: myId }));
  148. stopDrivingAfterTimeout();
  149. });
  150. socket.on('keepDriving', function () {
  151. stopDrivingAfterTimeout();
  152. });
  153. socket.on('disconnect', function () {
  154. browsers.remove(me);
  155. });
  156. }