bs-config.js 3.32 KB
'use strict';
/*
 |--------------------------------------------------------------------------
 | Browser-sync config file
 |--------------------------------------------------------------------------
 |
 | For up-to-date information about the options:
 |   http://www.browsersync.io/docs/options/
 |
 | There are more options than you see here, these are just the ones that are
 | set internally. See the website for more info.
 |
 |
 */
var fs = require('fs');
var httpProxy = require('http-proxy');

var proxy = httpProxy.createProxyServer({
  target: 'http://localhost:8182',
});

if (process.env.ONOS_EXTERNAL_APP_DIRS) {
    var external_apps = process.env.ONOS_EXTERNAL_APP_DIRS.replace(/\s/,'').split(',');
    external_apps = external_apps.reduce(function(dict, app){
        var pieces = app.split(':');
        var appName = pieces[0];
        var appPath = pieces[1];
        dict[appName] = appPath;
        return dict;
    }, {});
}

var defaultViews = fs.readdirSync('./app/view/');
var viewNameMatcher = new RegExp(/\/onos\/ui\/app\/view\/(.+)\/.+\.(?:js|css|html)/);

var checkExternalApp = function (url) {
    if(external_apps){
        for(var i = 0; i < Object.keys(external_apps).length; i++){
            var key = Object.keys(external_apps)[i];
            if(url.indexOf(key) !== -1){
                return key;
            };
        }
    }
    return false;
};

proxy.on('upgrade', function (req, socket, head) {
  console.log('[WS]: ', head);
  proxy.ws(req, socket, head);
});

proxy.on('error', function (error, req, res) {
  res.writeHead(500, {
    'Content-Type': 'text/plain'
  });
  console.error('[Proxy]', error);
});

module.exports = {
  'files': [
    './app/**/*.css',
    './app/**/*.js',
    './app/**/*.json',
    './app/**/*.html',
    './app/**/*.jpg',
    './app/**/*.png',
    './app/**/*.gif',
    '../../../../../apps/**/*.js',
    '../../../../../apps/**/*.html',
    '../../../../../apps/**/*.css'
  ],
  proxy: {
    target: "http://localhost:8181",
    ws: true,
    middleware: function (req, res, next) {

      var viewName = viewNameMatcher.exec(req.url);
      var isExternalApp = checkExternalApp(req.url);

      if (!!viewName && !isExternalApp && defaultViews.indexOf(viewName[1]) === -1) {
        // in this case it is an application that extend the view
        // so we redirect the request to the app folder in case of .js, .css, .html
        req.url = req.url.replace('/onos/ui/', '/apps/' + viewName[1] + '/app/src/main/resources/');
        proxy.web(req, res);
      }
      else if (isExternalApp) {
        // in this case it is an external application (not in ONOS source code) that extend the view
        // so we redirect the request to the app folder in case of .js, .css, .html
        req.url = req.url.replace('/onos/ui/', '/src/main/resources/');
        proxy.web(req, res);
      }
      // NOTE onos.js and index.html should not be proxied (require server side injection)
      else if (req.url.match(/(?:js|css|html)/) && req.url !== '/onos/ui/onos.js' && 
               req.url !== '/onos/ui/index.html' && req.url !== '/onos/ui/nav.html') {
        // redirect onos base js files to the source folder
        req.url = req.url.replace('/onos/ui/', '/web/gui/src/main/webapp/');
        proxy.web(req, res);
      }
      else {
        return next();
      }
    }
  },
  'port': 3000,
  'open': false
};