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