forked from coolaj86/walnut.js
		
	
		
			
	
	
		
			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; |