vulcain-corejs
Version:
Vulcain micro-service framework
139 lines (137 loc) • 5.94 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments)).next());
});
};
const express = require("express");
const abstractAdapter_1 = require("./../abstractAdapter");
const annotations_1 = require("../../di/annotations");
const conventions_1 = require("../../utils/conventions");
const response_1 = require("./../../pipeline/response");
const system_1 = require("./../../configurations/globals/system");
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const cors = require("cors");
class ExpressAdapter extends abstractAdapter_1.AbstractAdapter {
constructor(domainName, container, app) {
super(domainName, container);
this.app = app;
const self = this;
this.express = express();
this.express.use(function (req, res, next) {
self.createRequestContext(req);
return next();
});
this.express.use(cookieParser());
this.express.use(cors());
this.express.use(bodyParser.urlencoded({ extended: true }));
this.express.use(bodyParser.json());
let auth = this.container.get(annotations_1.DefaultServiceNames.Authentication, true);
this.auth = auth && auth.init(this.testUser);
}
sendResponse(expressResponse, response) {
if (!response) {
expressResponse.end();
return;
}
if (response.headers) {
for (const [k, v] of response.headers) {
expressResponse.setHeader(k, v);
}
}
expressResponse.statusCode = response.statusCode || 200;
if (response.contentType && response.contentType !== response_1.HttpResponse.VulcainContentType) {
expressResponse.contentType(response.contentType);
}
if (response.content) {
if (response.encoding) {
expressResponse.end(response.content, response.encoding);
}
else {
expressResponse.send(response.content);
}
}
}
initializeRequestContext(ctx, request) {
ctx.headers = request.headers;
ctx.hostName = request.get('Host');
// Set requestcontext for authentication middlewares
request.requestContext = ctx;
}
initialize() {
this.express.get('/health', (req, res) => {
res.status(200).end();
});
this.express.get(conventions_1.Conventions.instance.defaultUrlprefix + '/_schemas/:name?', (req, res) => {
let domain = this.container.get(annotations_1.DefaultServiceNames.Domain);
let name = req.params.name;
if (name) {
let schema = domain.getSchema(name, true);
res.send(schema);
}
else {
res.send(domain.schemas);
}
});
this.express.get(conventions_1.Conventions.instance.defaultUrlprefix + '/:schemaAction?/:id?', this.auth, (req, res) => __awaiter(this, void 0, void 0, function* () {
let ctx = req.requestContext;
req.requestContext = null; // release for gc
let result = yield this.executeQueryRequest(req, ctx);
this.sendResponse(res, result);
}));
// All actions by post
this.express.post(conventions_1.Conventions.instance.defaultUrlprefix + '/:schemaAction?', this.auth, (req, res) => __awaiter(this, void 0, void 0, function* () {
let ctx = req.requestContext;
req.requestContext = null; // release for gc
let result = yield this.executeActionRequest(req, ctx);
this.sendResponse(res, result);
}));
}
addActionCustomRoute(verb, path, callback) {
this.express[verb](path, this.auth, (req, res) => __awaiter(this, void 0, void 0, function* () {
let ctx = req.requestContext;
req.requestContext = null; // release for gc
let command = callback(req);
if (!command || !command.action) {
throw new Error("Invalid custom command configuration");
}
command.domain = this.domainName;
let result = yield this.executeActionRequest(req, ctx, command);
this.sendResponse(res, result);
}));
}
/**
* Set static root for public web site
*
* @param {string} basePath
*
* @memberOf ExpressAdapter
*/
setStaticRoot(basePath) {
system_1.System.log.info(null, "Set wwwroot to " + basePath);
if (!basePath) {
throw new Error("BasePath is required.");
}
this.express.use(express.static(basePath));
/* this.express.use('/assets', express.static(basePath + '/assets'));
this.express.all('/*', function (req, res, next) {
// Just send the index.html for other files to support HTML5Mode
res.sendFile('index.html', { root: basePath });
});*/
}
start(port) {
let listener = this.express.listen(port, (err) => {
system_1.System.log.info(null, 'Listening on port ' + port);
});
this.app.onServerStarted(listener, this);
}
useMiddleware(verb, path, handler) {
this.express[verb](path, handler);
}
}
exports.ExpressAdapter = ExpressAdapter;
//# sourceMappingURL=expressAdapter.js.map
;