1 | // Copyright IBM Corp. and LoopBack contributors 2017,2020. All Rights Reserved.
|
2 | // Node module: @loopback/rest
|
3 | // This file is licensed under the MIT License.
|
4 | // License text available at https://opensource.org/licenses/MIT
|
5 |
|
6 | import {Readable} from 'stream';
|
7 | import {OperationRetval, Response} from './types';
|
8 |
|
9 | /**
|
10 | * Writes the result from Application controller method
|
11 | * into the HTTP response
|
12 | *
|
13 | * @param response - HTTP Response
|
14 | * @param result - Result from the API to write into HTTP Response
|
15 | */
|
16 | export function writeResultToResponse(
|
17 | // not needed and responsibility should be in the sequence.send
|
18 | response: Response,
|
19 | // result returned back from invoking controller method
|
20 | result: OperationRetval,
|
21 | ): void {
|
22 | // Bypass response writing if the controller method returns `response` itself
|
23 | // or the response headers have been sent
|
24 | if (result === response || response.headersSent) {
|
25 | return;
|
26 | }
|
27 | if (result === undefined) {
|
28 | response.statusCode = 204;
|
29 | response.end();
|
30 | return;
|
31 | }
|
32 |
|
33 | const isStream =
|
34 | result instanceof Readable || typeof result?.pipe === 'function';
|
35 |
|
36 | if (isStream) {
|
37 | response.setHeader('Content-Type', 'application/octet-stream');
|
38 | // Stream
|
39 | result.pipe(response);
|
40 | return;
|
41 | }
|
42 | switch (typeof result) {
|
43 | case 'object':
|
44 | case 'boolean':
|
45 | case 'number':
|
46 | if (Buffer.isBuffer(result)) {
|
47 | // Buffer for binary data
|
48 | response.setHeader('Content-Type', 'application/octet-stream');
|
49 | } else {
|
50 | // TODO(ritch) remove this, should be configurable
|
51 | // See https://github.com/loopbackio/loopback-next/issues/436
|
52 | response.setHeader('Content-Type', 'application/json');
|
53 | // TODO(bajtos) handle errors - JSON.stringify can throw
|
54 | result = JSON.stringify(result);
|
55 | }
|
56 | break;
|
57 | default:
|
58 | response.setHeader('Content-Type', 'text/plain');
|
59 | result = result.toString();
|
60 | break;
|
61 | }
|
62 | response.end(result);
|
63 | }
|