Skip to content

Commit 6f75fcb

Browse files
committed
make it try to change ipaddresses when NIC changes
1 parent 3f78dd5 commit 6f75fcb

File tree

4 files changed

+103
-26
lines changed

4 files changed

+103
-26
lines changed

lib/iputils.js

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
*/
3131
"use strict";
3232

33+
var events = require('events');
34+
35+
var g_emitter = new events.EventEmitter();
36+
3337
/**
3438
* @module
3539
*/
@@ -47,7 +51,6 @@ var getIpAddress = (function() {
4751
var os = require('os');
4852

4953
return function() {
50-
5154
var now = Date.now();
5255
if (!addresses || now - lastRead > cacheTime) {
5356
lastRead = now;
@@ -66,21 +69,59 @@ var getIpAddress = (function() {
6669
};
6770
}());
6871

69-
var getOneIpAddress = function() {
70-
var address;
71-
var addresses = getIpAddress();
72+
var arraysEqual = function(a, b) {
73+
if ((!a && b) || (!b && a)) {
74+
return false;
75+
}
76+
77+
if (a.length != b.length) {
78+
return false;
79+
}
7280

73-
if (addresses.length < 1) {
74-
console.error("No IP address found!!!");
75-
} else {
76-
address = addresses[0];
77-
if (addresses.length > 1) {
78-
console.log("more than 1 IP address found: " + addresses);
81+
var len = a.length;
82+
for (var ii = 0; ii < len; ++ii) {
83+
if (a[ii] !== b[ii]) {
84+
return false;
7985
}
8086
}
81-
return address;
87+
return true;
8288
};
8389

90+
var getOneIpAddress = (function() {
91+
var lastAddress;
92+
var oldAddresses;
93+
94+
return function() {
95+
var address;
96+
var addresses = getIpAddress();
97+
98+
if (addresses.length < 1) {
99+
console.error("No IP address found!!!");
100+
} else {
101+
address = addresses[0];
102+
if (addresses.length > 1) {
103+
var newAddresses = addresses.slice().sort();
104+
if (!arraysEqual(newAddresses, oldAddresses)) {
105+
console.log("more than 1 IP address found: " + addresses);
106+
oldAddresses = newAddresses;
107+
}
108+
}
109+
}
110+
111+
if (address !== lastAddress) {
112+
lastAddress = address;
113+
g_emitter.emit('changed', lastAddress);
114+
}
115+
116+
return address;
117+
};
118+
}());
119+
84120
exports.getIpAddress = getIpAddress;
85121
exports.getOneIpAddress = getOneIpAddress;
122+
exports.on = g_emitter.on.bind(g_emitter);
123+
exports.addListener = exports.on;
124+
exports.removeListener = g_emitter.removeListener.bind(g_emitter);
125+
126+
86127

server/hft-server.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ var HFTServer = function(options, startedCallback) {
105105
relayServer.setOptions({baseUrl: getBaseUrl()});
106106
}
107107
hftSite.setup({address: address});
108+
hftSite.inform();
108109
if (appleCaptivePortalHandler) {
109110
appleCaptivePortalHandler.setOptions({address: address});
110111
}
@@ -124,6 +125,8 @@ var HFTServer = function(options, startedCallback) {
124125
};
125126
}());
126127

128+
var ipIntervalId = setInterval(getAddress, 15 * 1000);
129+
127130
var getBaseUrl = function() {
128131
return "http://" + getAddress() + ":" + g.port;
129132
};
@@ -612,7 +615,10 @@ var HFTServer = function(options, startedCallback) {
612615
servers.forEach(function(server) {
613616
server.close();
614617
});
615-
618+
if (ipIntervalId) {
619+
clearInterval(ipIntervalId);
620+
ipIntervalId = undefined;
621+
}
616622
}.bind(this);
617623

618624
this.getSettings = function() {

server/hftsite.js

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,44 @@ var io = require('../lib/io');
3737
var restUrl = require('rest-url');
3838

3939
var g = {
40+
throttleTime: 1000
41+
};
42+
43+
var getTime = function() {
44+
return Date.now();
4045
};
4146

4247
// Sends the local ip address and port
43-
var inform = function() {
44-
if (!g.privateServer) {
45-
var url = restUrl.make(process.env.HFT_RENDEZVOUS_URL || config.getSettings().settings.rendezvousUrl, {
46-
hftip: g.address,
47-
hftport: g.port,
48-
})
49-
debug("ping: " + url);
50-
io.sendJSON(url, {}, {}, function(err, result) {
51-
// do I care?
52-
if (err) {
53-
console.error(err);
48+
var inform = (function() {
49+
var lastAddress;
50+
var lastPort;
51+
var lastTime = 0;
52+
53+
return function() {
54+
if (!g.privateServer && g.port && g.address) {
55+
var now = getTime();
56+
var elapsedTime = now - lastTime;
57+
if (lastAddress != g.address ||
58+
lastPort != g.port ||
59+
elapsedTime > g.throttleTime) {
60+
lastTime = now;
61+
lastAddress = g.address;
62+
lastPort = g.port;
63+
var url = restUrl.make(process.env.HFT_RENDEZVOUS_URL || config.getSettings().settings.rendezvousUrl, {
64+
hftip: g.address,
65+
hftport: g.port,
66+
})
67+
debug("ping: " + url);
68+
io.sendJSON(url, {}, {}, function(err, result) {
69+
// do I care?
70+
if (err) {
71+
console.error(err);
72+
}
73+
});
5474
}
55-
});
56-
}
57-
};
75+
}
76+
};
77+
}());
5878

5979
/**
6080
* @typedef {Object} HFTSite~Options

todo.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
To Do
22
=====
33

4+
* unity plugin
5+
* make package.json editor
6+
* make "new project" button?
7+
* make "start HFT?" button (or should running it be enough)
8+
* make "location of HFT" button?
9+
* make stages of commands
10+
* cmd with cmd string RegisterCmdHandler<type>(fn)
11+
* RegisterCmdHandler<type>(name, fn)
12+
* RegisterCmdHandler(fn);
13+
* Use RegisterCmdHandler(fn) for gamestart
414
* move tiled support to hft-tiled?
515
* add tiled support to jumpjump
616
* add glow processing to powpow?

0 commit comments

Comments
 (0)