wifi-setup
Version:
WiFi AP setup, particularly useful for IoT devices
112 lines (110 loc) • 15.7 kB
JavaScript
;
var bodyParser = require('body-parser');
var Promise = require('bluebird');
Promise.onPossiblyUnhandledRejection(function (error) {
throw error;
});
var database;
var wifiManager = require('./modules/wifi-manager')();
var server = require('./modules/server');
module.exports = function (SERVICE_NAME, password, questions, express, app, _database) {
if (!express) {
express = require('express');
}
if (!app) {
app = express();
}
database = _database;
if (!database) {
database = require('./modules/database')(SERVICE_NAME);
database.init().then(function () {
database.start();
});
}
if (!Array.isArray(questions)) {
if (!questions) {
questions = [];
}
}
server = server(questions, wifiManager, {
onClientConfiguring: function () {
console.log('onClientConfiguring');
},
onSetupComplete: function (settings) {
console.log('onSetupComplete');
console.log(settings);
wifiManager.accessPoint.down().then(function () {
wifiManager.client.connect(settings.wifiSSID, settings.wifiPassword).then(function () {
database.setWifiCreds(settings.wifiSSID, settings.wifiPassword);
if (module.exports.callbacks && module.exports.callbacks.onConnectToWIFI) {
module.exports.callbacks.onConnectToWIFI(settings.wifiSSID, '10.0.0.1');
}
server.stop();
}).catch(function () {
console.log('Failed to connect using new creds');
});
});
}
});
var wifiSetup = {
init: function (callbacks) {
return new Promise(function (resolve) {
if (module.exports.callbacks) {
module.exports.callbacks = callbacks;
}
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
Promise.all([wifiManager.init(), server.init(express, app)]).then(function () {
resolve();
}).catch(function (errs) {
console.log('Something failed to initialize');
console.log(errs);
});
});
},
start: function () {
return new Promise(function (resolve) {
database.getWifiCreds().then(function (creds) {
console.log('creds');
console.log(creds);
wifiManager.client.connect(creds.SSID, creds.password).then(function () {
if (module.exports.callbacks && module.exports.callbacks.onConnectToWIFI) {
module.exports.callbacks.onConnectToWIFI(creds.SSID, '10.0.0.1');
}
resolve();
}).catch(function (err) {
console.log(err);
wifiSetup.startConfigServer();
resolve();
});
}).catch(function () {
wifiSetup.startConfigServer();
resolve();
});
});
},
stop: function () {
return new Promise(function (resolve) {
Promise.all([wifiManager.stop()]).then(function () {
resolve();
}).catch(function (errs) {
console.log('Something failed to stop');
console.log(errs);
});
});
},
startConfigServer: function () {
Promise.all([wifiManager.accessPoint.up(SERVICE_NAME, password), server.start(8081)]).then(function (responses) {
if (module.exports.callbacks && module.exports.callbacks.onAPstart) {
module.exports.callbacks.onAPstart(responses[0].SSID, responses[0].password);
}
}).catch(function (errs) {
console.log(errs);
});
}
};
return wifiSetup;
};
//# sourceMappingURL=data:application/json;base64,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QyxDQUFDO1FBQ1AsQ0FBQztRQUVELGlCQUFpQixFQUFFO1lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxTQUFTO2dCQUNqRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUNqRSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pGLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQyxJQUFJO2dCQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQ0osQ0FBQztJQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwiZmlsZSI6Im1haW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1F1ZXN0aW9uLCBRdWVzdGlvblR5cGVzfSBmcm9tICcuL3R5cGVzL3F1ZXN0aW9uLnR5cGUnO1xuXG52YXIgYm9keVBhcnNlciA9IHJlcXVpcmUoJ2JvZHktcGFyc2VyJyk7XG5cbmltcG9ydCAqIGFzIFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuUHJvbWlzZS5vblBvc3NpYmx5VW5oYW5kbGVkUmVqZWN0aW9uKChlcnJvcikgPT4ge1xuICAgIHRocm93IGVycm9yO1xufSk7XG5cbnZhciBkYXRhYmFzZTtcbnZhciB3aWZpTWFuYWdlciA9IHJlcXVpcmUoJy4vbW9kdWxlcy93aWZpLW1hbmFnZXInKSgpO1xudmFyIHNlcnZlciA9IHJlcXVpcmUoJy4vbW9kdWxlcy9zZXJ2ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoU0VSVklDRV9OQU1FOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIHF1ZXN0aW9ucz86IEFycmF5PFF1ZXN0aW9uPiwgZXhwcmVzcz8sIGFwcD8sIF9kYXRhYmFzZT8pID0+IHtcbiAgICBpZiAoIWV4cHJlc3MpIHtcbiAgICAgICAgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTtcbiAgICB9XG4gICAgaWYgKCFhcHApIHtcbiAgICAgICAgYXBwID0gZXhwcmVzcygpO1xuICAgIH1cbiAgICBkYXRhYmFzZSA9IF9kYXRhYmFzZTtcbiAgICBpZiAoIWRhdGFiYXNlKSB7XG4gICAgICAgIGRhdGFiYXNlID0gcmVxdWlyZSgnLi9tb2R1bGVzL2RhdGFiYXNlJykoU0VSVklDRV9OQU1FKTtcbiAgICAgICAgZGF0YWJhc2UuaW5pdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZGF0YWJhc2Uuc3RhcnQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHF1ZXN0aW9ucykpIHtcbiAgICAgICAgaWYgKCFxdWVzdGlvbnMpIHtcbiAgICAgICAgICAgIHF1ZXN0aW9ucyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VydmVyID0gc2VydmVyKHF1ZXN0aW9ucywgd2lmaU1hbmFnZXIsIHtcbiAgICAgICAgb25DbGllbnRDb25maWd1cmluZzogKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ29uQ2xpZW50Q29uZmlndXJpbmcnKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXR1cENvbXBsZXRlOiAoc2V0dGluZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvblNldHVwQ29tcGxldGUnKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHNldHRpbmdzKTtcbiAgICAgICAgICAgIHdpZmlNYW5hZ2VyLmFjY2Vzc1BvaW50LmRvd24oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aWZpTWFuYWdlci5jbGllbnQuY29ubmVjdChzZXR0aW5ncy53aWZpU1NJRCwgc2V0dGluZ3Mud2lmaVBhc3N3b3JkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2Uuc2V0V2lmaUNyZWRzKHNldHRpbmdzLndpZmlTU0lELCBzZXR0aW5ncy53aWZpUGFzc3dvcmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlLmV4cG9ydHMuY2FsbGJhY2tzICYmIG1vZHVsZS5leHBvcnRzLmNhbGxiYWNrcy5vbkNvbm5lY3RUb1dJRkkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzLmNhbGxiYWNrcy5vbkNvbm5lY3RUb1dJRkkoc2V0dGluZ3Mud2lmaVNTSUQsICcxMC4wLjAuMScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGNvbm5lY3QgdXNpbmcgbmV3IGNyZWRzJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHdpZmlTZXR1cCA9IHtcbiAgICAgICAgaW5pdDogKGNhbGxiYWNrcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZS5leHBvcnRzLmNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cy5jYWxsYmFja3MgPSBjYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXBwLnVzZShib2R5UGFyc2VyLmpzb24oKSk7XG4gICAgICAgICAgICAgICAgYXBwLnVzZShib2R5UGFyc2VyLnVybGVuY29kZWQoe1xuICAgICAgICAgICAgICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFt3aWZpTWFuYWdlci5pbml0KCksIHNlcnZlci5pbml0KGV4cHJlc3MsIGFwcCldKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTb21ldGhpbmcgZmFpbGVkIHRvIGluaXRpYWxpemUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJycyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlLmdldFdpZmlDcmVkcygpLnRoZW4oKGNyZWRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjcmVkcycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjcmVkcyk7XG4gICAgICAgICAgICAgICAgICAgIHdpZmlNYW5hZ2VyLmNsaWVudC5jb25uZWN0KGNyZWRzLlNTSUQsIGNyZWRzLnBhc3N3b3JkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUuZXhwb3J0cy5jYWxsYmFja3MgJiYgbW9kdWxlLmV4cG9ydHMuY2FsbGJhY2tzLm9uQ29ubmVjdFRvV0lGSSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzLmNhbGxiYWNrcy5vbkNvbm5lY3RUb1dJRkkoY3JlZHMuU1NJRCwgJzEwLjAuMC4xJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWZpU2V0dXAuc3RhcnRDb25maWdTZXJ2ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB3aWZpU2V0dXAuc3RhcnRDb25maWdTZXJ2ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3A6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFt3aWZpTWFuYWdlci5zdG9wKCldKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTb21ldGhpbmcgZmFpbGVkIHRvIHN0b3AnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJycyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBzdGFydENvbmZpZ1NlcnZlcjogKCkgPT4ge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwoW3dpZmlNYW5hZ2VyLmFjY2Vzc1BvaW50LnVwKFNFUlZJQ0VfTkFNRSwgcGFzc3dvcmQpLCBzZXJ2ZXIuc3RhcnQoODA4MSldKS50aGVuKChyZXNwb25zZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlLmV4cG9ydHMuY2FsbGJhY2tzICYmIG1vZHVsZS5leHBvcnRzLmNhbGxiYWNrcy5vbkFQc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMuY2FsbGJhY2tzLm9uQVBzdGFydChyZXNwb25zZXNbMF0uU1NJRCwgcmVzcG9uc2VzWzBdLnBhc3N3b3JkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJycykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHdpZmlTZXR1cDtcbn07XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=