UNPKG

3.16 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.RouterResponseController = void 0;
4const common_1 = require("@nestjs/common");
5const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
6const rxjs_1 = require("rxjs");
7const operators_1 = require("rxjs/operators");
8const sse_stream_1 = require("./sse-stream");
9class RouterResponseController {
10 constructor(applicationRef) {
11 this.applicationRef = applicationRef;
12 }
13 async apply(result, response, httpStatusCode) {
14 return this.applicationRef.reply(response, result, httpStatusCode);
15 }
16 async redirect(resultOrDeferred, response, redirectResponse) {
17 const result = await this.transformToResult(resultOrDeferred);
18 const statusCode = result && result.statusCode
19 ? result.statusCode
20 : redirectResponse.statusCode
21 ? redirectResponse.statusCode
22 : common_1.HttpStatus.FOUND;
23 const url = result && result.url ? result.url : redirectResponse.url;
24 this.applicationRef.redirect(response, statusCode, url);
25 }
26 async render(resultOrDeferred, response, template) {
27 const result = await this.transformToResult(resultOrDeferred);
28 return this.applicationRef.render(response, template, result);
29 }
30 async transformToResult(resultOrDeferred) {
31 if (resultOrDeferred && shared_utils_1.isFunction(resultOrDeferred.subscribe)) {
32 return rxjs_1.lastValueFrom(resultOrDeferred);
33 }
34 return resultOrDeferred;
35 }
36 getStatusByMethod(requestMethod) {
37 switch (requestMethod) {
38 case common_1.RequestMethod.POST:
39 return common_1.HttpStatus.CREATED;
40 default:
41 return common_1.HttpStatus.OK;
42 }
43 }
44 setHeaders(response, headers) {
45 headers.forEach(({ name, value }) => this.applicationRef.setHeader(response, name, value));
46 }
47 setStatus(response, statusCode) {
48 this.applicationRef.status(response, statusCode);
49 }
50 async sse(result, response, request) {
51 // It's possible that we sent headers already so don't use a stream
52 if (response.writableEnded) {
53 return;
54 }
55 this.assertObservable(result);
56 const stream = new sse_stream_1.SseStream(request);
57 stream.pipe(response);
58 const subscription = result
59 .pipe(operators_1.debounce((message) => new Promise(resolve => {
60 if (!shared_utils_1.isObject(message)) {
61 message = { data: message };
62 }
63 stream.writeMessage(message, resolve);
64 })))
65 .subscribe({
66 complete: () => {
67 response.end();
68 },
69 });
70 request.on('close', () => {
71 subscription.unsubscribe();
72 });
73 }
74 assertObservable(result) {
75 if (!shared_utils_1.isFunction(result.subscribe)) {
76 throw new ReferenceError('You must return an Observable stream to use Server-Sent Events (SSE).');
77 }
78 }
79}
80exports.RouterResponseController = RouterResponseController;