Aside from a few external process calls there are now zero external dependencies required as part of the node.js boot process. Yay!
139 lignes
3.4 KiB
JavaScript
139 lignes
3.4 KiB
JavaScript
'use strict';
|
|
|
|
var cluster = require('cluster');
|
|
var PromiseA = require('bluebird');
|
|
var memstore;
|
|
// TODO
|
|
// var rootMasterKey;
|
|
|
|
function updateIps() {
|
|
console.log('[UPDATE IP]');
|
|
require('./ddns-updater').update().then(function (results) {
|
|
results.forEach(function (result) {
|
|
if (result.error) {
|
|
console.error(result);
|
|
} else {
|
|
console.log('[SUCCESS]', result.service.hostname);
|
|
}
|
|
});
|
|
}).error(function (err) {
|
|
console.error('[UPDATE IP] ERROR');
|
|
console.error(err);
|
|
});
|
|
}
|
|
|
|
function init(conf/*, state*/) {
|
|
if (!conf.ipcKey) {
|
|
conf.ipcKey = require('crypto').randomBytes(16).toString('base64');
|
|
}
|
|
|
|
var memstoreOpts = {
|
|
sock: conf.memstoreSock || '/tmp/memstore.sock'
|
|
|
|
// If left 'null' or 'undefined' this defaults to a similar memstore
|
|
// with no special logic for 'cookie' or 'expires'
|
|
, store: cluster.isMaster && null //new require('express-session/session/memory')()
|
|
|
|
// a good default to use for instances where you might want
|
|
// to cluster or to run standalone, but with the same API
|
|
, serve: cluster.isMaster
|
|
, connect: cluster.isWorker
|
|
//, standalone: (1 === numCores) // overrides serve and connect
|
|
// TODO implement
|
|
, key: conf.ipcKey
|
|
};
|
|
try {
|
|
require('fs').unlinkSync(memstoreOpts.sock);
|
|
} catch(e) {
|
|
if ('ENOENT' !== e.code) {
|
|
console.error(e.stack);
|
|
console.error(JSON.stringify(e));
|
|
}
|
|
// ignore
|
|
}
|
|
|
|
var cstore = require('cluster-store');
|
|
var memstorePromise = cstore.create(memstoreOpts).then(function (_memstore) {
|
|
memstore = _memstore;
|
|
});
|
|
|
|
// TODO check the IP every 5 minutes and update it every hour
|
|
setInterval(updateIps, 60 * 60 * 1000);
|
|
// we don't want this to load right away (extra procesing time)
|
|
setTimeout(updateIps, 1);
|
|
|
|
return memstorePromise;
|
|
}
|
|
|
|
function touch(conf, state) {
|
|
if (!state.initialize) {
|
|
state.initialize = init(conf, state);
|
|
}
|
|
|
|
// TODO if no xyz worker, start on xyz worker (unlock, for example)
|
|
return state.initialize.then(function () {
|
|
// TODO conf.locked = true|false;
|
|
conf.initialized = true;
|
|
return conf;
|
|
});
|
|
|
|
/*
|
|
setInterval(function () {
|
|
console.log('SIGUSR1 to caddy');
|
|
return caddy.update(caddyConf);
|
|
}, 10 * 60 * 1000);
|
|
*/
|
|
}
|
|
|
|
//var config = require('./device.json');
|
|
|
|
// require('ssl-root-cas').inject();
|
|
|
|
/*
|
|
function phoneHome() {
|
|
var holepunch = require('./holepunch/beacon');
|
|
var ports;
|
|
|
|
ports = [
|
|
{ private: 65022
|
|
, public: 65022
|
|
, protocol: 'tcp'
|
|
, ttl: 0
|
|
, test: { service: 'ssh' }
|
|
, testable: false
|
|
}
|
|
, { private: 650443
|
|
, public: 650443
|
|
, protocol: 'tcp'
|
|
, ttl: 0
|
|
, test: { service: 'https' }
|
|
}
|
|
, { private: 65080
|
|
, public: 65080
|
|
, protocol: 'tcp'
|
|
, ttl: 0
|
|
, test: { service: 'http' }
|
|
}
|
|
];
|
|
|
|
// TODO return a middleware
|
|
holepunch.run(require('./redirects.json').reduce(function (all, redirect) {
|
|
if (!all[redirect.from.hostname]) {
|
|
all[redirect.from.hostname] = true;
|
|
all.push(redirect.from.hostname);
|
|
}
|
|
if (!all[redirect.to.hostname]) {
|
|
all[redirect.to.hostname] = true;
|
|
all.push(redirect.to.hostname);
|
|
}
|
|
|
|
return all;
|
|
}, []), ports).catch(function () {
|
|
console.error("Couldn't phone home. Oh well");
|
|
});
|
|
}
|
|
*/
|
|
|
|
module.exports.init = init;
|
|
module.exports.touch = touch;
|