You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.0 KiB

/* jshint -W097 */// jshint strict:false
/*jslint node: true */
'use strict';
var utils = require(__dirname + '/lib/utils'); // Get common adapter utils
var SimpleAPI = require(__dirname + '/lib/simpleapi.js');
var LE = require(utils.controllerDir + '/lib/letsencrypt.js');
var webServer = null;
var fs = null;
var adapter = new utils.Adapter({
name: 'simple-api',
stateChange: function (id, state) {
if (webServer && webServer.api) {
webServer.api.stateChange(id, state);
}
},
objectChange: function (id, obj) {
if (webServer && webServer.api) {
webServer.api.objectChange(id, obj);
}
},
unload: function (callback) {
try {
adapter.log.info('terminating http' + (webServer.settings.secure ? 's' : '') + ' server on port ' + webServer.settings.port);
//if (webServer.api) webServer.api.close();
callback();
} catch (e) {
callback();
}
},
ready: function () {
main();
}
});
function main() {
if (adapter.config.webInstance) {
console.log('Adapter runs as a part of web service');
adapter.log.warn('Adapter runs as a part of web service');
adapter.setForeignState('system.adapter.' + adapter.namespace + '.alive', false, true, function () {
setTimeout(function () {
process.exit();
}, 1000);
});
return;
}
if (adapter.config.secure) {
// subscribe on changes of permissions
adapter.subscribeForeignObjects('system.group.*');
adapter.subscribeForeignObjects('system.user.*');
// Load certificates
adapter.getCertificates(function (err, certificates, leConfig) {
adapter.config.certificates = certificates;
adapter.config.leConfig = leConfig;
webServer = initWebServer(adapter.config);
});
} else {
webServer = initWebServer(adapter.config);
}
}
function requestProcessor(req, res) {
if (req.url.indexOf('favicon.ico') !== -1) {
if (!fs) fs = require('fs');
var stat = fs.statSync(__dirname + '/img/favicon.ico');
res.writeHead(200, {
'Content-Type': 'image/x-icon',
'Content-Length': stat.size
});
var readStream = fs.createReadStream(__dirname + '/img/favicon.ico');
// We replaced all the event handlers with a simple call to readStream.pipe()
readStream.pipe(res);
} else {
webServer.api.restApi(req, res);
}
}
//settings: {
// "port": 8080,
// "auth": false,
// "secure": false,
// "bind": "0.0.0.0", // "::"
// "cache": false
//}
function initWebServer(settings) {
var server = {
app: null,
server: null,
api: null,
io: null,
settings: settings
};
settings.port = parseInt(settings.port, 10);
if (settings.port) {
if (settings.secure && !adapter.config.certificates) return null;
server.server = LE.createServer(requestProcessor, settings, adapter.config.certificates, adapter.config.leConfig, adapter.log);
server.server.__server = server;
} else {
adapter.log.error('port missing');
process.exit(1);
}
if (server.server) {
adapter.getPort(settings.port, function (port) {
if (port !== settings.port && !adapter.config.findNextPort) {
adapter.log.error('port ' + settings.port + ' already in use');
process.exit(1);
}
server.server.listen(port);
adapter.log.info('http' + (settings.secure ? 's' : '') + ' server listening on port ' + port);
});
}
server.api = new SimpleAPI(server.server, settings, adapter);
if (server.server) {
return server;
} else {
return null;
}
}