UNPKG

6.7 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8
9var _events = require("events");
10
11var _events2 = _interopRequireDefault(_events);
12
13var _net = require("net");
14
15var _net2 = _interopRequireDefault(_net);
16
17var _util = require("util");
18
19var _util2 = _interopRequireDefault(_util);
20
21var _stream = require("stream");
22
23var _stream2 = _interopRequireDefault(_stream);
24
25var _koaCompose = require("koa-compose");
26
27var _koaCompose2 = _interopRequireDefault(_koaCompose);
28
29var _debug = require("debug");
30
31var _debug2 = _interopRequireDefault(_debug);
32
33var _only = require("only");
34
35var _only2 = _interopRequireDefault(_only);
36
37var _session = require("./session");
38
39var _session2 = _interopRequireDefault(_session);
40
41var _context = require("./context");
42
43var _context2 = _interopRequireDefault(_context);
44
45function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
46
47function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
48
49function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
50
51function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
52
53var debug = new _debug2.default("whisper");
54
55/**
56 * Expose `Application` class.
57 * Inherits from `Emitter.prototype`.
58 */
59
60var Application = function (_Emitter) {
61 _inherits(Application, _Emitter);
62
63 /**
64 * Initialize a new `Application`.
65 *
66 * @api public
67 */
68
69 function Application() {
70 _classCallCheck(this, Application);
71
72 var _this = _possibleConstructorReturn(this, (Application.__proto__ || Object.getPrototypeOf(Application)).call(this));
73
74 _this.middleware = [];
75 _this.env = process.env.NODE_ENV || "development";
76
77 if (_util2.default.inspect.custom) {
78 _this[_util2.default.inspect.custom] = _this.inspect;
79 }
80 return _this;
81 }
82
83 /**
84 * Shorthand for:
85 *
86 * net.createServer(app.callback()).listen(...)
87 *
88 * @param {Mixed} ...
89 * @return {Server}
90 * @api public
91 */
92
93 _createClass(Application, [{
94 key: "listen",
95 value: function listen() {
96 debug("listen");
97 var server = _net2.default.createServer(this.callback());
98 return server.listen.apply(server, arguments);
99 }
100
101 /**
102 * Return JSON representation.
103 * We only bother showing settings.
104 *
105 * @return {Object}
106 * @api public
107 */
108
109 }, {
110 key: "toJSON",
111 value: function toJSON() {
112 return (0, _only2.default)(this, ["env"]);
113 }
114
115 /**
116 * Inspect implementation.
117 *
118 * @return {Object}
119 * @api public
120 */
121
122 }, {
123 key: "inspect",
124 value: function inspect() {
125 return this.toJSON();
126 }
127
128 /**
129 * Use the given middleware `fn`.
130 *
131 * Old-style middleware will be converted.
132 *
133 * @param {Function} fn
134 * @return {Application} self
135 * @api public
136 */
137
138 }, {
139 key: "use",
140 value: function use(fn) {
141 if (typeof fn !== "function") throw new TypeError("middleware must be a function!");
142 debug("use %s", fn._name || fn.name || "-");
143 this.middleware.push(fn);
144 return this;
145 }
146
147 /**
148 * Return a socket handler callback
149 * for node's net server.
150 *
151 * @return {Function}
152 * @api public
153 */
154
155 }, {
156 key: "callback",
157 value: function callback() {
158 var _this2 = this;
159
160 var fn = (0, _koaCompose2.default)(this.middleware);
161
162 if (!this.listenerCount("error")) this.on("error", this.onerror);
163
164 var handleConnect = function handleConnect(socket) {
165 // create session while new connection
166 var session = new _session2.default(_this2, socket);
167 socket.on("data", function (data) {
168 var ctx = new _context2.default(session, data);
169 _this2.handleRequest(ctx, fn);
170 });
171 };
172
173 return handleConnect;
174 }
175
176 /**
177 * Handle request in callback.
178 *
179 * @api private
180 */
181
182 }, {
183 key: "handleRequest",
184 value: function handleRequest(ctx, fnMiddleware) {
185 debug("data comming with seq %s", ctx.seq);
186 debug(ctx.data);
187
188 var onerror = function onerror(err) {
189 return ctx.onerror(err);
190 };
191 var handleResponse = function handleResponse() {
192 return respond(ctx);
193 };
194 return fnMiddleware(ctx).then(handleResponse).catch(onerror);
195 }
196
197 /**
198 * Default error handler.
199 *
200 * @param {Error} err
201 * @api private
202 */
203
204 }, {
205 key: "onerror",
206 value: function onerror(err) {
207 if (!(err instanceof Error)) throw new TypeError(_util2.default.format("non-error thrown: %j", err));
208
209 if (this.silent) return;
210
211 var msg = err.stack || err.toString();
212 console.error();
213 console.error(msg.replace(/^/gm, " "));
214 console.error();
215 }
216 }]);
217
218 return Application;
219}(_events2.default);
220
221/**
222 * Response helper.
223 */
224
225exports.default = Application;
226function respond(ctx) {
227 var socket = ctx.socket,
228 dumb = ctx.dumb,
229 body = ctx.body;
230
231 // allow bypassing whisper
232
233 if (dumb) return;
234
235 // socket close
236 if (!socket.writable) return;
237
238 // no body
239 if (!body) {
240 return debug("no body");
241 }
242
243 debug("respond body");
244 debug(body);
245
246 // responses
247 if (Buffer.isBuffer(body)) return socket.write(body);
248 if ("string" === typeof body) return socket.write(body);
249 if (body instanceof _stream2.default) return body.pipe(socket);
250
251 // body: json
252 var str = JSON.stringify(body);
253 socket.write(str);
254}
\No newline at end of file