UNPKG

11.2 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.ExpressAdapter = void 0;
4const common_1 = require("@nestjs/common");
5const interfaces_1 = require("@nestjs/common/interfaces");
6const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
7const http_adapter_1 = require("@nestjs/core/adapters/http-adapter");
8const router_method_factory_1 = require("@nestjs/core/helpers/router-method-factory");
9const body_parser_1 = require("body-parser");
10const cors = require("cors");
11const express = require("express");
12const http = require("http");
13const https = require("https");
14class ExpressAdapter extends http_adapter_1.AbstractHttpAdapter {
15 constructor(instance) {
16 super(instance || express());
17 this.routerMethodFactory = new router_method_factory_1.RouterMethodFactory();
18 }
19 reply(response, body, statusCode) {
20 if (statusCode) {
21 response.status(statusCode);
22 }
23 if ((0, shared_utils_1.isNil)(body)) {
24 return response.send();
25 }
26 if (body instanceof common_1.StreamableFile) {
27 const streamHeaders = body.getHeaders();
28 if (response.getHeader('Content-Type') === undefined &&
29 streamHeaders.type !== undefined) {
30 response.setHeader('Content-Type', streamHeaders.type);
31 }
32 if (response.getHeader('Content-Disposition') === undefined &&
33 streamHeaders.disposition !== undefined) {
34 response.setHeader('Content-Disposition', streamHeaders.disposition);
35 }
36 if (response.getHeader('Content-Length') === undefined &&
37 streamHeaders.length !== undefined) {
38 response.setHeader('Content-Length', streamHeaders.length);
39 }
40 return body.getStream().pipe(response);
41 }
42 return (0, shared_utils_1.isObject)(body) ? response.json(body) : response.send(String(body));
43 }
44 status(response, statusCode) {
45 return response.status(statusCode);
46 }
47 render(response, view, options) {
48 return response.render(view, options);
49 }
50 redirect(response, statusCode, url) {
51 return response.redirect(statusCode, url);
52 }
53 setErrorHandler(handler, prefix) {
54 return this.use(handler);
55 }
56 setNotFoundHandler(handler, prefix) {
57 return this.use(handler);
58 }
59 setHeader(response, name, value) {
60 return response.set(name, value);
61 }
62 listen(port, ...args) {
63 return this.httpServer.listen(port, ...args);
64 }
65 close() {
66 if (!this.httpServer) {
67 return undefined;
68 }
69 return new Promise(resolve => this.httpServer.close(resolve));
70 }
71 set(...args) {
72 return this.instance.set(...args);
73 }
74 enable(...args) {
75 return this.instance.enable(...args);
76 }
77 disable(...args) {
78 return this.instance.disable(...args);
79 }
80 engine(...args) {
81 return this.instance.engine(...args);
82 }
83 useStaticAssets(path, options) {
84 if (options && options.prefix) {
85 return this.use(options.prefix, express.static(path, options));
86 }
87 return this.use(express.static(path, options));
88 }
89 setBaseViewsDir(path) {
90 return this.set('views', path);
91 }
92 setViewEngine(engine) {
93 return this.set('view engine', engine);
94 }
95 getRequestHostname(request) {
96 return request.hostname;
97 }
98 getRequestMethod(request) {
99 return request.method;
100 }
101 getRequestUrl(request) {
102 return request.originalUrl;
103 }
104 enableCors(options) {
105 return this.use(cors(options));
106 }
107 createMiddlewareFactory(requestMethod) {
108 return this.routerMethodFactory
109 .get(this.instance, requestMethod)
110 .bind(this.instance);
111 }
112 initHttpServer(options) {
113 const isHttpsEnabled = options && options.httpsOptions;
114 if (isHttpsEnabled) {
115 this.httpServer = https.createServer(options.httpsOptions, this.getInstance());
116 return;
117 }
118 this.httpServer = http.createServer(this.getInstance());
119 }
120 registerParserMiddleware(prefix, rawBody) {
121 let bodyParserJsonOptions;
122 if (rawBody === true) {
123 bodyParserJsonOptions = {
124 verify: (req, _res, buffer) => {
125 if (Buffer.isBuffer(buffer)) {
126 req.rawBody = buffer;
127 }
128 return true;
129 },
130 };
131 }
132 const parserMiddleware = {
133 jsonParser: (0, body_parser_1.json)(bodyParserJsonOptions),
134 urlencodedParser: (0, body_parser_1.urlencoded)({ extended: true }),
135 };
136 Object.keys(parserMiddleware)
137 .filter(parser => !this.isMiddlewareApplied(parser))
138 .forEach(parserKey => this.use(parserMiddleware[parserKey]));
139 }
140 setLocal(key, value) {
141 this.instance.locals[key] = value;
142 return this;
143 }
144 getType() {
145 return 'express';
146 }
147 applyVersionFilter(handler, version, versioningOptions) {
148 const callNextHandler = (req, res, next) => {
149 if (!next) {
150 throw new common_1.InternalServerErrorException('HTTP adapter does not support filtering on version');
151 }
152 return next();
153 };
154 if (version === interfaces_1.VERSION_NEUTRAL ||
155 // URL Versioning is done via the path, so the filter continues forward
156 versioningOptions.type === common_1.VersioningType.URI) {
157 const handlerForNoVersioning = (req, res, next) => handler(req, res, next);
158 return handlerForNoVersioning;
159 }
160 // Custom Extractor Versioning Handler
161 if (versioningOptions.type === common_1.VersioningType.CUSTOM) {
162 const handlerForCustomVersioning = (req, res, next) => {
163 const extractedVersion = versioningOptions.extractor(req);
164 if (Array.isArray(version)) {
165 if (Array.isArray(extractedVersion) &&
166 version.filter(v => extractedVersion.includes(v)).length) {
167 return handler(req, res, next);
168 }
169 if ((0, shared_utils_1.isString)(extractedVersion) &&
170 version.includes(extractedVersion)) {
171 return handler(req, res, next);
172 }
173 }
174 else if ((0, shared_utils_1.isString)(version)) {
175 // Known bug here - if there are multiple versions supported across separate
176 // handlers/controllers, we can't select the highest matching handler.
177 // Since this code is evaluated per-handler, then we can't see if the highest
178 // specified version exists in a different handler.
179 if (Array.isArray(extractedVersion) &&
180 extractedVersion.includes(version)) {
181 return handler(req, res, next);
182 }
183 if ((0, shared_utils_1.isString)(extractedVersion) && version === extractedVersion) {
184 return handler(req, res, next);
185 }
186 }
187 return callNextHandler(req, res, next);
188 };
189 return handlerForCustomVersioning;
190 }
191 // Media Type (Accept Header) Versioning Handler
192 if (versioningOptions.type === common_1.VersioningType.MEDIA_TYPE) {
193 const handlerForMediaTypeVersioning = (req, res, next) => {
194 var _a, _b;
195 const MEDIA_TYPE_HEADER = 'Accept';
196 const acceptHeaderValue = ((_a = req.headers) === null || _a === void 0 ? void 0 : _a[MEDIA_TYPE_HEADER]) ||
197 ((_b = req.headers) === null || _b === void 0 ? void 0 : _b[MEDIA_TYPE_HEADER.toLowerCase()]);
198 const acceptHeaderVersionParameter = acceptHeaderValue
199 ? acceptHeaderValue.split(';')[1]
200 : undefined;
201 // No version was supplied
202 if ((0, shared_utils_1.isUndefined)(acceptHeaderVersionParameter)) {
203 if (Array.isArray(version)) {
204 if (version.includes(interfaces_1.VERSION_NEUTRAL)) {
205 return handler(req, res, next);
206 }
207 }
208 }
209 else {
210 const headerVersion = acceptHeaderVersionParameter.split(versioningOptions.key)[1];
211 if (Array.isArray(version)) {
212 if (version.includes(headerVersion)) {
213 return handler(req, res, next);
214 }
215 }
216 else if ((0, shared_utils_1.isString)(version)) {
217 if (version === headerVersion) {
218 return handler(req, res, next);
219 }
220 }
221 }
222 return callNextHandler(req, res, next);
223 };
224 return handlerForMediaTypeVersioning;
225 }
226 // Header Versioning Handler
227 if (versioningOptions.type === common_1.VersioningType.HEADER) {
228 const handlerForHeaderVersioning = (req, res, next) => {
229 var _a, _b;
230 const customHeaderVersionParameter = ((_a = req.headers) === null || _a === void 0 ? void 0 : _a[versioningOptions.header]) ||
231 ((_b = req.headers) === null || _b === void 0 ? void 0 : _b[versioningOptions.header.toLowerCase()]);
232 // No version was supplied
233 if ((0, shared_utils_1.isUndefined)(customHeaderVersionParameter)) {
234 if (Array.isArray(version)) {
235 if (version.includes(interfaces_1.VERSION_NEUTRAL)) {
236 return handler(req, res, next);
237 }
238 }
239 }
240 else {
241 if (Array.isArray(version)) {
242 if (version.includes(customHeaderVersionParameter)) {
243 return handler(req, res, next);
244 }
245 }
246 else if ((0, shared_utils_1.isString)(version)) {
247 if (version === customHeaderVersionParameter) {
248 return handler(req, res, next);
249 }
250 }
251 }
252 return callNextHandler(req, res, next);
253 };
254 return handlerForHeaderVersioning;
255 }
256 }
257 isMiddlewareApplied(name) {
258 const app = this.getInstance();
259 return (!!app._router &&
260 !!app._router.stack &&
261 (0, shared_utils_1.isFunction)(app._router.stack.filter) &&
262 app._router.stack.some((layer) => layer && layer.handle && layer.handle.name === name));
263 }
264}
265exports.ExpressAdapter = ExpressAdapter;