1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-10 21:33:38 +00:00

1. Merged GC optimization for promise.js

2. Fixed crash that can occur if dgram is GC'ed during event dispatch
3. Fixed compiler warning in ILibWebClient.c
4. Updated GC for dhcp.js
This commit is contained in:
Bryan Roe
2021-07-17 11:32:25 -07:00
parent 980005b40b
commit c7a4356dac
5 changed files with 152 additions and 96 deletions

View File

@@ -193,9 +193,7 @@ function createPacket(messageType, data)
function raw(localAddress, port, buffer, handler)
{
var ret = new promise(promise_default);
ret.handler = handler;
ret.socket = require('dgram').createSocket({ type: 'udp4' });
ret.socket.promise = ret;
try
{
ret.socket.bind({ address: localAddress, port: (port != null && port != 0) ? port : null });
@@ -205,6 +203,7 @@ function raw(localAddress, port, buffer, handler)
ret._rej('Unable to bind to ' + localAddress);
return (ret);
}
ret.socket.setBroadcast(true);
ret.socket.setMulticastInterface(localAddress);
ret.socket.setMulticastTTL(1);
@@ -213,6 +212,7 @@ function raw(localAddress, port, buffer, handler)
ret.socket.send(buffer, 67, '255.255.255.255');
return (ret);
}
function info(interfaceName, port)
{
var f = require('os').networkInterfaces();
@@ -226,18 +226,23 @@ function info(interfaceName, port)
try
{
var b = createPacket(8, { ciaddress: f[interfaceName][i].address, chaddress: f[interfaceName][i].mac });
var p = raw(f[interfaceName][i].address, port, b, function infoHandler(msg)
_hide(raw(f[interfaceName][i].address, port, b, function infoHandler(msg)
{
var res = parseDHCP(msg);
if (res.chaddr.toUpperCase() == this.hwaddr.toUpperCase() && res.options != null && res.options.lease != null)
{
clearTimeout(this.timeout);
setImmediate(function (s) { s.removeAllListeners('message'); }, this.socket); // Works around bug in older dgram.js
this._res(res);
}
});
p.hwaddr = f[interfaceName][i].mac;
p.timeout = setTimeout(function (x) { x._rej('timeout'); }, 2000, p);
return (p);
}));
_hide().hwaddr = f[interfaceName][i].mac;
_hide().timeout = setTimeout(function (x)
{
x.socket.removeAllListeners('message');
x._rej('timeout');
}, 2000, _hide());
return (_hide(true));
}
catch(e)
{