UNPKG

1.45 kBJavaScriptView Raw
1// @flow
2
3import type { RequestorInterface } from 'subrequests/types/Requestor';
4
5const ExpressRequestor = require('./ExpressRequestor');
6const subrequests = require('subrequests');
7const util = require('util');
8
9type enhancedRequest = express$Request & {
10 subrequestsResponseMerger: any,
11 subrequestsRequestor: ?RequestorInterface,
12};
13
14/**
15 * Executes a blueprint and composes the Express response.
16 *
17 * @param {string} blueprint
18 * The blueprint to execute.
19 * @param {enhancedRequest} req
20 * The request from Express.
21 * @param {express$Response} res
22 * The response from Express.
23 *
24 * @return {Promise<void>}
25 * A promise that will send the request when ready.
26 */
27module.exports = (
28 blueprint: string,
29 req: enhancedRequest,
30 res: express$Response
31): Promise<void> => subrequests
32 .request(
33 blueprint,
34 req.subrequestsRequestor || new ExpressRequestor(req),
35 req.subrequestsResponseMerger
36 )
37 .then((response) => {
38 // Write all the headers to the response.
39 const headers = [...response.headers].reduce((heads, keyval) => {
40 heads[keyval[0]] = keyval[1]; // eslint-disable-line prefer-destructuring
41 return heads;
42 }, {});
43 res
44 .set(headers)
45 .status(parseInt(response.headers.get('Status') || '207', 10))
46 .send(response.body);
47 })
48 .catch((e) => {
49 res
50 .status(500)
51 .set('Content-Type', 'text/plain')
52 .send(util.inspect(e, { depth: null }));
53 });