simplified how the admin routes are handled
This commit is contained in:
parent
cfcc1acb8c
commit
3d3fac5087
|
@ -0,0 +1,38 @@
|
||||||
|
var adminDomains = [
|
||||||
|
'localhost.alpha.daplie.me'
|
||||||
|
, 'localhost.admin.daplie.me'
|
||||||
|
, 'alpha.localhost.daplie.me'
|
||||||
|
, 'admin.localhost.daplie.me'
|
||||||
|
, 'localhost.daplie.invalid'
|
||||||
|
];
|
||||||
|
module.exports.adminDomains = adminDomains;
|
||||||
|
|
||||||
|
module.exports.create = function (deps, conf) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var path = require('path');
|
||||||
|
var express = require('express');
|
||||||
|
var app = express();
|
||||||
|
|
||||||
|
var apis = require('./apis').create(deps, conf);
|
||||||
|
function handleApis(req, res, next) {
|
||||||
|
if (typeof apis[req.params.name] === 'function') {
|
||||||
|
apis[req.params.name](req, res);
|
||||||
|
} else {
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
app.use('/api/goldilocks@daplie.com/:name', handleApis);
|
||||||
|
app.use('/api/com.daplie.goldilocks/:name', handleApis);
|
||||||
|
|
||||||
|
// Serve the static assets for the UI (even though it probably won't be used very
|
||||||
|
// often since it only works on localhost domains). Note that we are using the default
|
||||||
|
// .well-known directory from the oauth3 library even though it indicates we have
|
||||||
|
// capabilities we don't support because it's simpler and it's unlikely anything will
|
||||||
|
// actually use it to determine our API (it is needed to log into the web page).
|
||||||
|
app.use('/.well-known', express.static(path.join(__dirname, '../../packages/assets/well-known')));
|
||||||
|
app.use('/assets', express.static(path.join(__dirname, '../../packages/assets')));
|
||||||
|
app.use('/', express.static(path.join(__dirname, '../../admin/public')));
|
||||||
|
|
||||||
|
return require('http').createServer(app);
|
||||||
|
};
|
325
lib/app.js
325
lib/app.js
|
@ -1,325 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = function (myDeps, conf, overrideHttp) {
|
|
||||||
var express = require('express');
|
|
||||||
//var finalhandler = require('finalhandler');
|
|
||||||
var serveStatic = require('serve-static');
|
|
||||||
var serveIndex = require('serve-index');
|
|
||||||
//var assetServer = serveStatic(opts.assetsPath);
|
|
||||||
var path = require('path');
|
|
||||||
//var wellKnownServer = serveStatic(path.join(opts.assetsPath, 'well-known'));
|
|
||||||
|
|
||||||
var serveStaticMap = {};
|
|
||||||
var serveIndexMap = {};
|
|
||||||
var content = conf.content;
|
|
||||||
//var server;
|
|
||||||
var goldilocksApis;
|
|
||||||
var app;
|
|
||||||
var request;
|
|
||||||
|
|
||||||
function createGoldilocksApis() {
|
|
||||||
var PromiseA = require('bluebird');
|
|
||||||
var OAUTH3 = require('../packages/assets/org.oauth3');
|
|
||||||
require('../packages/assets/org.oauth3/oauth3.domains.js');
|
|
||||||
require('../packages/assets/org.oauth3/oauth3.dns.js');
|
|
||||||
require('../packages/assets/org.oauth3/oauth3.tunnel.js');
|
|
||||||
OAUTH3._hooks = require('../packages/assets/org.oauth3/oauth3.node.storage.js');
|
|
||||||
|
|
||||||
request = request || PromiseA.promisify(require('request'));
|
|
||||||
|
|
||||||
myDeps.PromiseA = PromiseA;
|
|
||||||
myDeps.OAUTH3 = OAUTH3;
|
|
||||||
myDeps.recase = require('recase').create({});
|
|
||||||
myDeps.request = request;
|
|
||||||
|
|
||||||
return require('../packages/apis/com.daplie.goldilocks').create(myDeps, conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
app = express();
|
|
||||||
|
|
||||||
var Sites = {
|
|
||||||
add: function (sitesMap, site) {
|
|
||||||
if (!sitesMap[site.$id]) {
|
|
||||||
sitesMap[site.$id] = site;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!site.paths) {
|
|
||||||
site.paths = [];
|
|
||||||
}
|
|
||||||
if (!site.paths._map) {
|
|
||||||
site.paths._map = {};
|
|
||||||
}
|
|
||||||
site.paths.forEach(function (path) {
|
|
||||||
|
|
||||||
site.paths._map[path.$id] = path;
|
|
||||||
|
|
||||||
if (!path.modules) {
|
|
||||||
path.modules = [];
|
|
||||||
}
|
|
||||||
if (!path.modules._map) {
|
|
||||||
path.modules._map = {};
|
|
||||||
}
|
|
||||||
path.modules.forEach(function (module) {
|
|
||||||
|
|
||||||
path.modules._map[module.$id] = module;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var opts = overrideHttp || conf.http;
|
|
||||||
if (!opts.defaults) {
|
|
||||||
opts.defaults = {};
|
|
||||||
}
|
|
||||||
if (!opts.global) {
|
|
||||||
opts.global = {};
|
|
||||||
}
|
|
||||||
if (!opts.sites) {
|
|
||||||
opts.sites = [];
|
|
||||||
}
|
|
||||||
opts.sites._map = {};
|
|
||||||
opts.sites.forEach(function (site) {
|
|
||||||
|
|
||||||
Sites.add(opts.sites._map, site);
|
|
||||||
});
|
|
||||||
|
|
||||||
function mapMap(el, i, arr) {
|
|
||||||
arr._map[el.$id] = el;
|
|
||||||
}
|
|
||||||
opts.global.modules._map = {};
|
|
||||||
opts.global.modules.forEach(mapMap);
|
|
||||||
opts.global.paths._map = {};
|
|
||||||
opts.global.paths.forEach(function (path, i, arr) {
|
|
||||||
mapMap(path, i, arr);
|
|
||||||
//opts.global.paths._map[path.$id] = path;
|
|
||||||
path.modules._map = {};
|
|
||||||
path.modules.forEach(mapMap);
|
|
||||||
});
|
|
||||||
opts.sites.forEach(function (site) {
|
|
||||||
site.paths._map = {};
|
|
||||||
site.paths.forEach(function (path, i, arr) {
|
|
||||||
mapMap(path, i, arr);
|
|
||||||
//site.paths._map[path.$id] = path;
|
|
||||||
path.modules._map = {};
|
|
||||||
path.modules.forEach(mapMap);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
opts.defaults.modules._map = {};
|
|
||||||
opts.defaults.modules.forEach(mapMap);
|
|
||||||
opts.defaults.paths._map = {};
|
|
||||||
opts.defaults.paths.forEach(function (path, i, arr) {
|
|
||||||
mapMap(path, i, arr);
|
|
||||||
//opts.global.paths._map[path.$id] = path;
|
|
||||||
path.modules._map = {};
|
|
||||||
path.modules.forEach(mapMap);
|
|
||||||
});
|
|
||||||
|
|
||||||
function _goldApis(req, res, next) {
|
|
||||||
if (!goldilocksApis) {
|
|
||||||
goldilocksApis = createGoldilocksApis();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof goldilocksApis[req.params.name] === 'function') {
|
|
||||||
goldilocksApis[req.params.name](req, res);
|
|
||||||
} else {
|
|
||||||
next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return app
|
|
||||||
.use('/api/com.daplie.goldilocks/:name', _goldApis)
|
|
||||||
.use('/api/goldilocks@daplie.com/:name', _goldApis)
|
|
||||||
.use('/', function (req, res, next) {
|
|
||||||
if (!req.headers.host) {
|
|
||||||
next(new Error('missing HTTP Host header'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (content && '/' === req.url) {
|
|
||||||
// res.setHeader('Content-Type', 'application/octet-stream');
|
|
||||||
res.end(content);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//var done = finalhandler(req, res);
|
|
||||||
var host = req.headers.host;
|
|
||||||
var hostname = (host||'').split(':')[0].toLowerCase();
|
|
||||||
|
|
||||||
console.log('opts.global', opts.global);
|
|
||||||
var sites = [ opts.global || null, opts.sites._map[hostname] || null, opts.defaults || null ];
|
|
||||||
var loadables = {
|
|
||||||
serve: function (config, hostname, pathname, req, res, next) {
|
|
||||||
var originalUrl = req.url;
|
|
||||||
var dirpaths = config.paths.slice(0);
|
|
||||||
|
|
||||||
function nextServe() {
|
|
||||||
var dirname = dirpaths.pop();
|
|
||||||
if (!dirname) {
|
|
||||||
req.url = originalUrl;
|
|
||||||
next();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('[serve]', req.url, hostname, pathname, dirname);
|
|
||||||
dirname = path.resolve(conf.cwd, dirname.replace(/:hostname/, hostname));
|
|
||||||
if (!serveStaticMap[dirname]) {
|
|
||||||
serveStaticMap[dirname] = serveStatic(dirname);
|
|
||||||
}
|
|
||||||
|
|
||||||
serveStaticMap[dirname](req, res, nextServe);
|
|
||||||
}
|
|
||||||
|
|
||||||
req.url = req.url.substr(pathname.length - 1);
|
|
||||||
nextServe();
|
|
||||||
}
|
|
||||||
, indexes: function (config, hostname, pathname, req, res, next) {
|
|
||||||
var originalUrl = req.url;
|
|
||||||
var dirpaths = config.paths.slice(0);
|
|
||||||
|
|
||||||
function nextIndex() {
|
|
||||||
var dirname = dirpaths.pop();
|
|
||||||
if (!dirname) {
|
|
||||||
req.url = originalUrl;
|
|
||||||
next();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('[indexes]', req.url, hostname, pathname, dirname);
|
|
||||||
dirname = path.resolve(conf.cwd, dirname.replace(/:hostname/, hostname));
|
|
||||||
if (!serveStaticMap[dirname]) {
|
|
||||||
serveIndexMap[dirname] = serveIndex(dirname);
|
|
||||||
}
|
|
||||||
serveIndexMap[dirname](req, res, nextIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
req.url = req.url.substr(pathname.length - 1);
|
|
||||||
nextIndex();
|
|
||||||
}
|
|
||||||
, app: function (config, hostname, pathname, req, res, next) {
|
|
||||||
//var appfile = path.resolve(/*process.cwd(), */config.path.replace(/:hostname/, hostname));
|
|
||||||
var appfile = config.path.replace(/:hostname/, hostname);
|
|
||||||
try {
|
|
||||||
var app = require(appfile);
|
|
||||||
app(req, res, next);
|
|
||||||
} catch (err) {
|
|
||||||
next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function runModule(module, hostname, pathname, modulename, req, res, next) {
|
|
||||||
if (!loadables[modulename]) {
|
|
||||||
next(new Error("no module '" + modulename + "' found"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
loadables[modulename](module, hostname, pathname, req, res, next);
|
|
||||||
}
|
|
||||||
|
|
||||||
function iterModules(modules, hostname, pathname, req, res, next) {
|
|
||||||
console.log('modules');
|
|
||||||
console.log(modules);
|
|
||||||
var modulenames = Object.keys(modules._map);
|
|
||||||
|
|
||||||
function nextModule() {
|
|
||||||
var modulename = modulenames.pop();
|
|
||||||
if (!modulename) {
|
|
||||||
next();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('modules', modules);
|
|
||||||
runModule(modules._map[modulename], hostname, pathname, modulename, req, res, nextModule);
|
|
||||||
}
|
|
||||||
|
|
||||||
nextModule();
|
|
||||||
}
|
|
||||||
|
|
||||||
function iterPaths(site, hostname, req, res, next) {
|
|
||||||
console.log('site', hostname);
|
|
||||||
console.log(site);
|
|
||||||
var pathnames = Object.keys(site.paths._map);
|
|
||||||
console.log('pathnames', pathnames);
|
|
||||||
pathnames = pathnames.filter(function (pathname) {
|
|
||||||
// TODO ensure that pathname has trailing /
|
|
||||||
return (0 === req.url.indexOf(pathname));
|
|
||||||
//return req.url.match(pathname);
|
|
||||||
});
|
|
||||||
pathnames.sort(function (a, b) {
|
|
||||||
return b.length - a.length;
|
|
||||||
});
|
|
||||||
console.log('pathnames', pathnames);
|
|
||||||
|
|
||||||
function nextPath() {
|
|
||||||
var pathname = pathnames.shift();
|
|
||||||
if (!pathname) {
|
|
||||||
next();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('iterPaths', hostname, pathname, req.url);
|
|
||||||
iterModules(site.paths._map[pathname].modules, hostname, pathname, req, res, nextPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
nextPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
function nextSite() {
|
|
||||||
console.log('hostname', hostname, sites);
|
|
||||||
var site;
|
|
||||||
if (!sites.length) {
|
|
||||||
next(); // 404
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
site = sites.shift();
|
|
||||||
if (!site) {
|
|
||||||
nextSite();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
iterPaths(site, hostname, req, res, nextSite);
|
|
||||||
}
|
|
||||||
|
|
||||||
nextSite();
|
|
||||||
|
|
||||||
/*
|
|
||||||
function serveStaticly(server) {
|
|
||||||
function serveTheStatic() {
|
|
||||||
server.serve(req, res, function (err) {
|
|
||||||
if (err) { return done(err); }
|
|
||||||
server.index(req, res, function (err) {
|
|
||||||
if (err) { return done(err); }
|
|
||||||
req.url = req.url.replace(/\/assets/, '');
|
|
||||||
assetServer(req, res, function () {
|
|
||||||
if (err) { return done(err); }
|
|
||||||
req.url = req.url.replace(/\/\.well-known/, '');
|
|
||||||
wellKnownServer(req, res, done);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (server.expressApp) {
|
|
||||||
server.expressApp(req, res, serveTheStatic);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
serveTheStatic();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (opts.livereload) {
|
|
||||||
res.__my_livereload = '<script src="//'
|
|
||||||
+ (host || opts.sites[0].name).split(':')[0]
|
|
||||||
+ ':35729/livereload.js?snipver=1"></script>';
|
|
||||||
res.__my_addLen = res.__my_livereload.length;
|
|
||||||
|
|
||||||
// TODO modify prototype instead of each instance?
|
|
||||||
res.__write = res.write;
|
|
||||||
res.write = _reloadWrite;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('hostname:', hostname, opts.sites[0].paths);
|
|
||||||
|
|
||||||
addServer(hostname);
|
|
||||||
server = hostsMap[hostname] || hostsMap[opts.sites[0].name];
|
|
||||||
serveStaticly(server);
|
|
||||||
*/
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,67 +0,0 @@
|
||||||
var adminDomains = [
|
|
||||||
'localhost.alpha.daplie.me'
|
|
||||||
, 'localhost.admin.daplie.me'
|
|
||||||
, 'alpha.localhost.daplie.me'
|
|
||||||
, 'admin.localhost.daplie.me'
|
|
||||||
, 'localhost.daplie.invalid'
|
|
||||||
];
|
|
||||||
module.exports.adminDomains = adminDomains;
|
|
||||||
|
|
||||||
module.exports.create = function (deps, conf) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var path = require('path');
|
|
||||||
//var defaultServername = 'localhost.daplie.me';
|
|
||||||
//var defaultWebRoot = '.';
|
|
||||||
var assetsPath = path.join(__dirname, '..', '..', 'packages', 'assets');
|
|
||||||
var opts = {};
|
|
||||||
|
|
||||||
opts.global = opts.global || {};
|
|
||||||
opts.sites = opts.sites || [];
|
|
||||||
opts.sites._map = {};
|
|
||||||
|
|
||||||
// argv.sites
|
|
||||||
|
|
||||||
opts.groups = [];
|
|
||||||
|
|
||||||
// 'packages', 'assets', 'com.daplie.goldilocks'
|
|
||||||
opts.global = {
|
|
||||||
modules: [ // TODO uh-oh we've got a mixed bag of modules (various types), a true map
|
|
||||||
{ $id: 'greenlock', email: opts.email, tos: opts.tos }
|
|
||||||
, { $id: 'rvpn', email: opts.email, tos: opts.tos }
|
|
||||||
//, { $id: 'content', content: content }
|
|
||||||
, { $id: 'livereload', on: opts.livereload }
|
|
||||||
, { $id: 'app', path: opts.expressApp }
|
|
||||||
]
|
|
||||||
, paths: [
|
|
||||||
{ $id: '/assets/', modules: [ { $id: 'serve', paths: [ assetsPath ] } ] }
|
|
||||||
// TODO figure this b out
|
|
||||||
, { $id: '/.well-known/', modules: [
|
|
||||||
{ $id: 'serve', paths: [ path.join(assetsPath, 'well-known') ] }
|
|
||||||
] }
|
|
||||||
]
|
|
||||||
};
|
|
||||||
opts.defaults = {
|
|
||||||
modules: []
|
|
||||||
, paths: [
|
|
||||||
/*
|
|
||||||
{ $id: '/', modules: [
|
|
||||||
{ $id: 'serve', paths: [ defaultWebRoot ] }
|
|
||||||
, { $id: 'indexes', paths: [ defaultWebRoot ] }
|
|
||||||
] }
|
|
||||||
*/
|
|
||||||
]
|
|
||||||
};
|
|
||||||
adminDomains.forEach(function (id) {
|
|
||||||
opts.sites.push({
|
|
||||||
$id: id
|
|
||||||
, paths: [
|
|
||||||
{ $id: '/', modules: [ { $id: 'serve', paths: [ path.resolve(__dirname, '..', '..', 'admin', 'public') ] } ] }
|
|
||||||
, { $id: '/api/', modules: [ { $id: 'app', path: path.join(__dirname, 'admin') } ] }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
var app = require('../app.js')(deps, conf, opts);
|
|
||||||
return require('http').createServer(app);
|
|
||||||
};
|
|
|
@ -202,11 +202,11 @@ module.exports.create = function (deps, conf, greenlockMiddleware) {
|
||||||
var host = separatePort(headers.host).host;
|
var host = separatePort(headers.host).host;
|
||||||
|
|
||||||
if (!adminDomains) {
|
if (!adminDomains) {
|
||||||
adminDomains = require('./admin').adminDomains;
|
adminDomains = require('../admin').adminDomains;
|
||||||
}
|
}
|
||||||
if (adminDomains.indexOf(host) !== -1) {
|
if (adminDomains.indexOf(host) !== -1) {
|
||||||
if (!adminServer) {
|
if (!adminServer) {
|
||||||
adminServer = require('./admin').create(deps, conf);
|
adminServer = require('../admin').create(deps, conf);
|
||||||
}
|
}
|
||||||
return emitConnection(adminServer, conn, opts);
|
return emitConnection(adminServer, conn, opts);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,10 +19,20 @@ function update(conf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function create(conf) {
|
function create(conf) {
|
||||||
|
var PromiseA = require('bluebird');
|
||||||
|
var OAUTH3 = require('../packages/assets/org.oauth3');
|
||||||
|
require('../packages/assets/org.oauth3/oauth3.domains.js');
|
||||||
|
require('../packages/assets/org.oauth3/oauth3.dns.js');
|
||||||
|
require('../packages/assets/org.oauth3/oauth3.tunnel.js');
|
||||||
|
OAUTH3._hooks = require('../packages/assets/org.oauth3/oauth3.node.storage.js');
|
||||||
|
|
||||||
config = conf;
|
config = conf;
|
||||||
var deps = {
|
var deps = {
|
||||||
messenger: process
|
messenger: process
|
||||||
, PromiseA: require('bluebird')
|
, PromiseA: PromiseA
|
||||||
|
, OAUTH3: OAUTH3
|
||||||
|
, request: PromiseA.promisify(require('request'))
|
||||||
|
, recase: require('recase').create({})
|
||||||
// Note that if a custom createConnections is used it will be called with different
|
// Note that if a custom createConnections is used it will be called with different
|
||||||
// sets of custom options based on what is actually being proxied. Most notably the
|
// sets of custom options based on what is actually being proxied. Most notably the
|
||||||
// HTTP proxying connection creation is not something we currently control.
|
// HTTP proxying connection creation is not something we currently control.
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var api = require('./index.js').api;
|
|
||||||
var OAUTH3 = require('../../assets/org.oauth3/');
|
|
||||||
// these all auto-register
|
|
||||||
require('../../assets/org.oauth3/oauth3.domains.js');
|
|
||||||
require('../../assets/org.oauth3/oauth3.dns.js');
|
|
||||||
require('../../assets/org.oauth3/oauth3.tunnel.js');
|
|
||||||
OAUTH3._hooks = require('../../assets/org.oauth3/oauth3.node.storage.js');
|
|
||||||
|
|
||||||
api.tunnel(
|
|
||||||
{
|
|
||||||
OAUTH3: OAUTH3
|
|
||||||
, options: {
|
|
||||||
device: {
|
|
||||||
hostname: 'test.local'
|
|
||||||
, id: ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// OAUTH3.hooks.session.get('oauth3.org').then(function (result) { console.log(result) });
|
|
||||||
, require('./test.session.json')
|
|
||||||
);
|
|
Loading…
Reference in New Issue