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