http-micro
Version:
Micro-framework on top of node's http module
180 lines (179 loc) • 6.31 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const url = require("url");
const route_context_1 = require("./route-context");
const bodyParser = require("./body-parser");
const error_utils_1 = require("./error-utils");
const context_utils_1 = require("./context-utils");
const httpError = require("http-errors");
class Context {
constructor(app, req, res, requestParser) {
this.app = app;
this.req = req;
this.res = res;
this._url = null;
this._ipAddresses = null;
this._routeContext = null;
this._bodyParseTask = null;
if (requestParser !== undefined)
this.requestParser = requestParser;
if (this.requestParser === undefined)
this.requestParser = bodyParser.anyBodyParserFactory();
}
getItem(key) {
if (this.items) {
let res = this.items.get(key);
if (res !== undefined)
return res;
}
let appItems = this.app.items;
if (appItems) {
let res = appItems.get(key);
if (res !== undefined)
return res;
}
return null;
}
setItem(key, value) {
if (!this.items) {
this.items = new Map();
}
this.items.set(key, value);
}
hasItem(key) {
if (this.items) {
let res = this.items.has(key);
if (res)
return res;
}
let appItems = this.app.items;
if (appItems) {
let res = appItems.get(key);
if (res)
return res;
}
return false;
}
getUrl() {
if (this._url === null) {
this._url = url.parse(this.req.url);
}
return this._url;
}
getRouteContext() {
return this._routeContext || (this._routeContext = new route_context_1.RouteContext(this.getUrl().pathname));
}
getRouteParams() {
return this.getRouteContext().params;
}
getHttpMethod() {
return this.req.method;
}
getRequestStream() {
// TODO: Do request stream pre-processing, like
// Content-Encoding, Transfer-Encoding of gzip, etc.
return this.req;
}
getResponseStream() {
// TODO: Do post processing of stream, like
// Content-Encoding, Transfer-Encoding of gzip, etc.
return this.res;
}
getRequestBody(parser) {
if (this._bodyParseTask === null) {
let task = bodyParser.parseBody(this.getRequestStream(), null, parser || this.requestParser);
this._bodyParseTask = task;
return task;
}
return this._bodyParseTask;
}
getContentType() {
if (this._contentType !== undefined)
return this._contentType;
return (this._contentType = context_utils_1.RequestUtils.getContentType(this.req));
}
getClientIpAddress() {
return this.getUpstreamIpAddresses()[0];
}
getUpstreamIpAddresses() {
let existing = this._ipAddresses;
if (existing)
return existing;
return this._ipAddresses = context_utils_1.RequestUtils.getUpstreamIpAddresses(this.req);
}
getHost() {
return context_utils_1.RequestUtils.getHost(this.req);
}
getProtocol() {
return context_utils_1.RequestUtils.getProtocol(this.req);
}
isEncrypted() {
return context_utils_1.RequestUtils.isEncrypted(this.req);
}
setHeader(key, value, replace = true) {
return context_utils_1.ResponseUtils.setHeader(this.res, key, value, replace);
}
setHeaders(headers) {
context_utils_1.ResponseUtils.setHeaders(this.res, headers);
}
appendHeaderValue(key, value, forceAppend = false) {
context_utils_1.ResponseUtils.appendHeaderValue(this.res, key, value, forceAppend);
}
removeHeaderValue(key, value, removeHeaderIfEmpty = true) {
context_utils_1.ResponseUtils.removeHeaderValue(this.res, key, value, removeHeaderIfEmpty);
}
setContentType(value, force = false) {
context_utils_1.ResponseUtils.setContentType(this.res, value, force);
}
setStatus(code, message) {
context_utils_1.ResponseUtils.setStatus(this.res, code, message);
}
sendStatus(code, message, headers) {
context_utils_1.ResponseUtils.sendStatus(this.res, code, message, headers);
}
send(body, headers, code = 200) {
context_utils_1.ResponseUtils.send(this.res, body, headers, code);
}
sendText(text) {
context_utils_1.ResponseUtils.sendText(this.res, text);
}
sendAsJson(data, replacer, spaces) {
context_utils_1.ResponseUtils.sendAsJson(this.res, data, replacer, spaces);
}
sendNoContent(headers) {
context_utils_1.ResponseUtils.sendNoContent(this.res, headers);
}
sendResetContent(headers) {
context_utils_1.ResponseUtils.sendResetContent(this.res, headers);
}
sendBadRequest(body, headers) {
context_utils_1.ResponseUtils.sendBadRequest(this.res, body, headers);
}
sendNotFound(reason = null, headers) {
context_utils_1.ResponseUtils.sendNotFound(this.res, reason, headers);
}
sendForbidden(reason, headers) {
context_utils_1.ResponseUtils.sendForbidden(this.res, reason, headers);
}
sendMethodNotAllowed(allowedMethods, reason = null, headers) {
context_utils_1.ResponseUtils.sendMethodNotAllowed(this.res, allowedMethods, reason, headers);
}
throw(arg1, arg2) {
if (typeof arg1 !== "number") {
let status = arg1;
throw error_utils_1.intoHttpError(status);
}
let status = arg1;
if (!arg2 || typeof arg2 === "string") {
let msg = arg2;
throw httpError(status, msg);
}
let error = arg2;
throw error_utils_1.intoHttpError(error, status, true);
}
}
exports.Context = Context;
function contextFactory(app, req, res, parser) {
return new Context(app, req, res, parser);
}
exports.contextFactory = contextFactory;