'use strict'; module.exports.create = function (deps, conf) { var loopback = require('./loopback').create(deps, conf); var dnsCtrl = require('./dns-ctrl').create(deps, conf); async function getSession() { var sessions = await deps.storage.owners.all(); var session = sessions.filter(function (sess) { return sess.token.scp.indexOf('dns') >= 0; })[0]; if (!session) { throw new Error('no sessions with DNS grants'); } // The OAUTH3 library stores some things on the root session object that we usually // just leave inside the token, but we need to pull those out before we use it here session.provider_uri = session.provider_uri || session.token.provider_uri || session.token.iss; session.client_uri = session.client_uri || session.token.azp; session.scope = session.scope || session.token.scp; return session; } var publicAddress; async function recheckPubAddr() { if (!conf.ddns.enabled) { return; } var session = await getSession(); var directives = await deps.OAUTH3.discover(session.token.aud); var addr = await loopback.checkPublicAddr(directives.api); if (publicAddress === addr) { return; } if (conf.debug) { console.log('previous public address',publicAddress, 'does not match current public address', addr); } await dnsCtrl.setDeviceAddress(session, addr); publicAddress = addr; } recheckPubAddr(); setInterval(recheckPubAddr, 5*60*1000); return { loopbackServer: loopback.server , setDeviceAddress: dnsCtrl.setDeviceAddress , getDeviceAddresses: dnsCtrl.getDeviceAddresses , recheckPubAddr: recheckPubAddr }; };