cloud-red
Version:
Harnessing Serverless for your cloud integration needs
164 lines (147 loc) • 4.2 kB
JavaScript
/**
* Copyright JS Foundation and other contributors, http://js.foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
/**
* This module provides an Express application to serve the Node-RED editor.
*
* It implements the Node-RED HTTP Admin API the Editor uses to interact
* with the Node-RED runtime.
*
* @namespace @node-red/editor-api
*/
var express = require('express');
var bodyParser = require('body-parser');
var util = require('util');
var passport = require('passport');
var when = require('when');
var cors = require('cors');
var auth = require('./auth');
var apiUtil = require('./util');
var adminApp;
var server;
var editor;
let settings;
/**
* Initialise the module.
* @param {Object} settings The runtime settings
* @param {HTTPServer} server An instance of HTTP Server
* @param {Storage} storage An instance of Node-RED Storage
* @param {Runtime} runtimeAPI An instance of Node-RED Runtime
* @memberof @node-red/editor-api
*/
function init(userSettings, _server, storage, runtimeAPI) {
settings = userSettings;
server = _server;
if (settings.httpAdminRoot !== false) {
adminApp = express();
var cors = require('cors');
var corsHandler = cors({
origin: '*',
methods: 'GET,PUT,POST,DELETE'
});
adminApp.use(corsHandler);
auth.init(settings, storage);
var maxApiRequestSize = settings.apiMaxLength || '5mb';
adminApp.use(bodyParser.json({ limit: maxApiRequestSize }));
adminApp.use(
bodyParser.urlencoded({ limit: maxApiRequestSize, extended: true })
);
adminApp.get('/auth/login', auth.login, apiUtil.errorHandler);
if (settings.adminAuth) {
if (settings.adminAuth.type === 'strategy') {
auth.genericStrategy(adminApp, settings.adminAuth.strategy);
} else if (settings.adminAuth.type === 'credentials') {
adminApp.use(passport.initialize());
adminApp.post(
'/auth/token',
auth.ensureClientSecret,
auth.authenticateClient,
auth.getToken,
auth.errorHandler
);
}
adminApp.post(
'/auth/revoke',
auth.needsPermission(''),
auth.revoke,
apiUtil.errorHandler
);
}
// Editor
if (!settings.disableEditor) {
editor = require('./editor');
var editorApp = editor.init(server, settings, runtimeAPI);
adminApp.use(editorApp);
}
if (settings.httpAdminCors) {
var corsHandler = cors(settings.httpAdminCors);
adminApp.use(corsHandler);
}
var adminApiApp = require('./admin').init(runtimeAPI);
adminApp.use(adminApiApp);
} else {
adminApp = null;
}
}
/**
* Start the module.
* @return {Promise} resolves when the application is ready to handle requests
* @memberof @node-red/editor-api
*/
function start() {
if (editor) {
return editor.start();
} else {
return when.resolve();
}
}
/**
* Stop the module.
* @return {Promise} resolves when the application is stopped
* @memberof @node-red/editor-api
*/
function stop() {
if (editor) {
editor.stop();
}
return when.resolve();
}
module.exports = {
init: init,
start: start,
stop: stop,
/**
* @memberof @node-red/editor-api
* @mixes @node-red/editor-api_auth
*/
auth: {
needsPermission: auth.needsPermission
},
/**
* The Express app used to serve the Node-RED Editor
* @type ExpressApplication
* @memberof @node-red/editor-api
*/
get httpAdmin() {
return adminApp;
},
/**
* The runtime settings used to initialize the editorAPI
* @returns {object} settings object
*/
get userSettings() {
return settings;
}
};