UNPKG

4.96 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('handle-async');
18
19var _pipeSSE = require('./pipeSSE');
20
21var _pipeSSE2 = _interopRequireDefault(_pipeSSE);
22
23function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
25var EError = (0, _makeErrorCause2.default)('EndpointError');
26var CError = (0, _makeErrorCause2.default)('ConfigurationError');
27
28var 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
101var 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 // TODO: get rid of plain function syntax and handle this somewhere else!
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
148exports.default = getRequestHandler;
149module.exports = exports['default'];
\No newline at end of file