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;
 |