88 lines
2.4 KiB
JavaScript
88 lines
2.4 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var staticHandlers = {};
|
||
|
|
||
|
function loadPages(pkgConf, packagedPage, req, res, next) {
|
||
|
var PromiseA = require('bluebird');
|
||
|
var fs = require('fs');
|
||
|
var path = require('path');
|
||
|
var pkgpath = path.join(pkgConf.pagespath, (packagedPage.package || packagedPage.id), (packagedPage.version || ''));
|
||
|
|
||
|
// TODO special cases for /.well_known/ and similar (oauth3.html, oauth3.json, webfinger, etc)
|
||
|
|
||
|
function handlePromise(p) {
|
||
|
p.then(function (app) {
|
||
|
app(req, res, next);
|
||
|
packagedPage._page = app;
|
||
|
}, function (err) {
|
||
|
console.error('[App Promise Error]');
|
||
|
next(err);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (staticHandlers[pkgpath]) {
|
||
|
packagedPage._page = staticHandlers[pkgpath];
|
||
|
packagedPage._page(req, res, next);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (!packagedPage._promise_page) {
|
||
|
packagedPage._promise_page = new PromiseA(function (resolve, reject) {
|
||
|
fs.exists(pkgpath, function (exists) {
|
||
|
var staticServer;
|
||
|
|
||
|
if (!exists) {
|
||
|
reject(new Error("package '" + pkgpath + "' is registered but does not exist"));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//console.log('[static mount]', pkgpath);
|
||
|
// https://github.com/expressjs/serve-static/issues/54
|
||
|
// https://github.com/pillarjs/send/issues/91
|
||
|
// https://example.com/.well-known/acme-challenge/xxxxxxxxxxxxxxx
|
||
|
staticServer = require('serve-static')(pkgpath, { dotfiles: undefined });
|
||
|
resolve(staticServer);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
handlePromise(packagedPage._promise_page);
|
||
|
}
|
||
|
|
||
|
function layerItUp(pkgConf, router, req, res, next) {
|
||
|
var nexti = -1;
|
||
|
// Layers exist so that static apps can use them like a virtual filesystem
|
||
|
// i.e. oauth3.html isn't in *your* app but you may use it and want it mounted at /.well-known/oauth3.html
|
||
|
// or perhaps some dynamic content (like application cache)
|
||
|
function nextify(err) {
|
||
|
var packagedPage;
|
||
|
nexti += 1;
|
||
|
|
||
|
if (err) {
|
||
|
next(err);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// shortest to longest
|
||
|
//route = packages.pop();
|
||
|
// longest to shortest
|
||
|
packagedPage = router.packagedPages[nexti];
|
||
|
if (!packagedPage) {
|
||
|
next();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (packagedPage._page) {
|
||
|
packagedPage._page(req, res, nextify);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// could attach to req.{ pkgConf, pkgDeps, Services}
|
||
|
loadPages(pkgConf, packagedPage, req, res, next);
|
||
|
}
|
||
|
|
||
|
nextify();
|
||
|
}
|
||
|
|
||
|
module.exports.layerItUp = layerItUp;
|