UNPKG

5.01 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _extends2 = require('babel-runtime/helpers/extends');
8
9var _extends3 = _interopRequireDefault(_extends2);
10
11var _async = require('async');
12
13var _makeErrorCause = require('make-error-cause');
14
15var _makeErrorCause2 = _interopRequireDefault(_makeErrorCause);
16
17var _handleAsync = require('./handleAsync');
18
19var _handleAsync2 = _interopRequireDefault(_handleAsync);
20
21var _pipeSSE = require('./pipeSSE');
22
23var _pipeSSE2 = _interopRequireDefault(_pipeSSE);
24
25function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
27var EError = (0, _makeErrorCause2.default)('EndpointError');
28var CError = (0, _makeErrorCause2.default)('ConfigurationError');
29
30var 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
103var 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 // TODO: get rid of plain function syntax and handle this somewhere else!
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
150exports.default = getRequestHandler;
151module.exports = exports['default'];
\No newline at end of file