From 4b14222bdae6e370c5cbad97b167ebb91b11f443 Mon Sep 17 00:00:00 2001 From: clockbrain <40568549+clockbrain@users.noreply.github.com> Date: Sat, 25 May 2019 02:21:53 +1000 Subject: [PATCH] Network map error handling (#1565) * Catch errors from failing network scans * Tidier code for process result * Fix eslint format errors --- lib/zigbee.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/zigbee.js b/lib/zigbee.js index dd067efb0..1713e5e28 100644 --- a/lib/zigbee.js +++ b/lib/zigbee.js @@ -309,12 +309,15 @@ class Zigbee { return function(data) { const linkSet = []; return new Promise((resolve) => { - data.forEach(function(devinfo) { - const childDev = shepherd._findDevByAddr(devinfo.ieeeAddr); - devinfo.parent = parent; - devinfo.status = childDev ? childDev.status : 'offline'; - linkSet.push(devinfo); - }); + logger.debug(`Processing scan for: '${parent}'`); + if (data) { + data.forEach(function(devinfo) { + const childDev = shepherd._findDevByAddr(devinfo.ieeeAddr); + devinfo.parent = parent; + devinfo.status = childDev ? childDev.status : 'offline'; + linkSet.push(devinfo); + }); + } resolve(linkSet); logger.debug(`Processed device: '${parent}', linkSet: %j`, linkSet); }); @@ -323,11 +326,15 @@ class Zigbee { const allScans = this.getScanable().map((dev) => { logger.debug(`Preparing asynch network scan for '${dev.ieeeAddr}'`); - return this.shepherd.lqi(dev.ieeeAddr).then(processResponse(dev.ieeeAddr, this.shepherd)); + return this.shepherd.lqi(dev.ieeeAddr) + .then(processResponse(dev.ieeeAddr, this.shepherd)) + .catch(() => { + return new Promise((resolve) => []); + }); }, this); logger.debug('All network map promises created'); - // Collect all lqi scans but timeout after 2 seconds if any fail - Promise.raceAll(allScans, 2000, []).then((linkSets) => { + // Collect all lqi scan results but timeout after specified miliseconds if any haven't completed + Promise.raceAll(allScans, 8000, []).then((linkSets) => { const linkMap = [].concat(...linkSets); logger.info('Network scan completed'); logger.debug(`Link map: %j`, linkMap);