1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.RouterResponseController = void 0;
|
4 | const common_1 = require("@nestjs/common");
|
5 | const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
|
6 | const rxjs_1 = require("rxjs");
|
7 | const operators_1 = require("rxjs/operators");
|
8 | const sse_stream_1 = require("./sse-stream");
|
9 | class 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 |
|
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 | }
|
80 | exports.RouterResponseController = RouterResponseController;
|