1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _extends2 = require('babel-runtime/helpers/extends');
|
8 |
|
9 | var _extends3 = _interopRequireDefault(_extends2);
|
10 |
|
11 | var _async = require('async');
|
12 |
|
13 | var _makeErrorCause = require('make-error-cause');
|
14 |
|
15 | var _makeErrorCause2 = _interopRequireDefault(_makeErrorCause);
|
16 |
|
17 | var _handleAsync = require('./handleAsync');
|
18 |
|
19 | var _handleAsync2 = _interopRequireDefault(_handleAsync);
|
20 |
|
21 | var _pipeSSE = require('./pipeSSE');
|
22 |
|
23 | var _pipeSSE2 = _interopRequireDefault(_pipeSSE);
|
24 |
|
25 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
26 |
|
27 | var EError = (0, _makeErrorCause2.default)('EndpointError');
|
28 | var CError = (0, _makeErrorCause2.default)('ConfigurationError');
|
29 |
|
30 | var createHandlerFunction = function createHandlerFunction(handler) {
|
31 | var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
32 | name = _ref.name,
|
33 | resourceName = _ref.resourceName;
|
34 |
|
35 | if (typeof handler === 'function') handler = { process: handler };
|
36 | if (!handler.process) throw new CError(resourceName + '.' + name + ' missing process function!');
|
37 | if (!name) throw new CError(resourceName + '.' + name + ' missing name!');
|
38 | if (!resourceName) throw new CError(resourceName + '.' + name + ' missing resourceName!');
|
39 |
|
40 | return function (opt, cb) {
|
41 | if (!handler.tailable && opt.tail) {
|
42 | return cb(new EError('Endpoint not capable of SSE!'));
|
43 | }
|
44 |
|
45 | var tasks = {
|
46 | isAuthorized: function isAuthorized(done) {
|
47 | var handleResult = function handleResult(err, allowed) {
|
48 | if (err) {
|
49 | return done(new EError(resourceName + '.' + name + '.isAuthorized returned an error!', err));
|
50 | }
|
51 | if (typeof allowed !== 'boolean') {
|
52 | return done(new EError(resourceName + '.' + name + '.isAuthorized did not return a boolean!'));
|
53 | }
|
54 | if (!allowed) return done({ status: 401 });
|
55 | done(null, true);
|
56 | };
|
57 |
|
58 | if (!handler.isAuthorized) return handleResult(null, true);
|
59 | (0, _handleAsync2.default)(handler.isAuthorized.bind(null, opt), handleResult);
|
60 | },
|
61 | rawData: ['isAuthorized', function (_ref2, done) {
|
62 | var isAuthorized = _ref2.isAuthorized;
|
63 |
|
64 | var handleResult = function handleResult(err, res) {
|
65 | if (err) {
|
66 | return done(new EError(resourceName + '.' + name + '.process returned an error!', err));
|
67 | }
|
68 | done(null, res);
|
69 | };
|
70 |
|
71 | (0, _handleAsync2.default)(handler.process.bind(null, opt), handleResult);
|
72 | }],
|
73 | formattedData: ['rawData', function (_ref3, done) {
|
74 | var rawData = _ref3.rawData;
|
75 |
|
76 | var handleResult = function handleResult(err, data) {
|
77 | if (err) {
|
78 | return done(new EError(resourceName + '.' + name + '.format returned an error!', err));
|
79 | }
|
80 | done(null, data);
|
81 | };
|
82 |
|
83 | if (!handler.format) return handleResult(null, rawData);
|
84 | (0, _handleAsync2.default)(handler.format.bind(null, opt, rawData), handleResult);
|
85 | }]
|
86 | };
|
87 |
|
88 | (0, _async.auto)(tasks, function (err, _ref4) {
|
89 | var formattedData = _ref4.formattedData,
|
90 | rawData = _ref4.rawData;
|
91 |
|
92 | if (opt.tail && rawData && !rawData.pipe) {
|
93 | return cb(new EError(resourceName + '.' + name + '.process didn\'t returned a non-stream for SSE!'));
|
94 | }
|
95 | cb(err, {
|
96 | result: formattedData,
|
97 | stream: opt.tail && rawData
|
98 | });
|
99 | });
|
100 | };
|
101 | };
|
102 |
|
103 | var getRequestHandler = function getRequestHandler(_ref5, resourceName) {
|
104 | var handler = _ref5.handler,
|
105 | name = _ref5.name,
|
106 | successCode = _ref5.successCode,
|
107 | emptyCode = _ref5.emptyCode;
|
108 |
|
109 | var processor = createHandlerFunction(handler, { name: name, resourceName: resourceName });
|
110 | var handleSutroRequest = function handleSutroRequest(req, res, next) {
|
111 | var opt = (0, _extends3.default)({}, req.params, {
|
112 | ip: req.ip,
|
113 | url: req.url,
|
114 | protocol: req.protocol,
|
115 | method: req.method,
|
116 | subdomains: req.subdomains,
|
117 | path: req.path,
|
118 | cookies: req.cookies,
|
119 | user: req.user,
|
120 | data: req.body,
|
121 | options: req.query,
|
122 | session: req.session,
|
123 | tail: req.get('accept') === 'text/event-stream',
|
124 | _req: req,
|
125 | _res: res
|
126 | });
|
127 |
|
128 |
|
129 | var formatter = handler.format && handler.format.bind(null, opt);
|
130 |
|
131 | processor(opt, function (err) {
|
132 | var _ref6 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
133 | result = _ref6.result,
|
134 | stream = _ref6.stream;
|
135 |
|
136 | if (err) return next(err);
|
137 | if (stream) return (0, _pipeSSE2.default)(stream, res, formatter);
|
138 |
|
139 | if (result == null) return res.status(emptyCode).end();
|
140 |
|
141 | res.status(successCode);
|
142 | res.json(result);
|
143 | res.end();
|
144 | });
|
145 | };
|
146 |
|
147 | return handleSutroRequest;
|
148 | };
|
149 |
|
150 | exports.default = getRequestHandler;
|
151 | module.exports = exports['default']; |
\ | No newline at end of file |