controller and vsorc data viewers done
[VSoRC/.git] / node_modules / express-ws / lib / index.js
1 'use strict';
2
3 Object.defineProperty(exports, "__esModule", {
4   value: true
5 });
6 exports.default = expressWs;
7
8 var _http = require('http');
9
10 var _http2 = _interopRequireDefault(_http);
11
12 var _express = require('express');
13
14 var _express2 = _interopRequireDefault(_express);
15
16 var _ws = require('ws');
17
18 var _ws2 = _interopRequireDefault(_ws);
19
20 var _websocketUrl = require('./websocket-url');
21
22 var _websocketUrl2 = _interopRequireDefault(_websocketUrl);
23
24 var _addWsMethod = require('./add-ws-method');
25
26 var _addWsMethod2 = _interopRequireDefault(_addWsMethod);
27
28 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
30 function expressWs(app, httpServer) {
31   var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
32
33   var server = httpServer;
34
35   if (server === null || server === undefined) {
36     /* No HTTP server was explicitly provided, create one for our Express application. */
37     server = _http2.default.createServer(app);
38
39     app.listen = function serverListen() {
40       var _server;
41
42       return (_server = server).listen.apply(_server, arguments);
43     };
44   }
45
46   /* Make our custom `.ws` method available directly on the Express application. You should
47    * really be using Routers, though. */
48   (0, _addWsMethod2.default)(app);
49
50   /* Monkeypatch our custom `.ws` method into Express' Router prototype. This makes it possible,
51    * when using the standard Express Router, to use the `.ws` method without any further calls
52    * to `makeRouter`. When using a custom router, the use of `makeRouter` may still be necessary.
53    *
54    * This approach works, because Express does a strange mixin hack - the Router factory
55    * function is simultaneously the prototype that gets assigned to the resulting Router
56    * object. */
57   if (!options.leaveRouterUntouched) {
58     (0, _addWsMethod2.default)(_express2.default.Router);
59   }
60
61   // allow caller to pass in options to WebSocketServer constructor
62   var wsOptions = options.wsOptions || {};
63   wsOptions.server = server;
64   var wsServer = new _ws2.default.Server(wsOptions);
65
66   wsServer.on('connection', function (socket, request) {
67     if ('upgradeReq' in socket) {
68       request = socket.upgradeReq;
69     }
70
71     request.ws = socket;
72     request.wsHandled = false;
73
74     /* By setting this fake `.url` on the request, we ensure that it will end up in the fake
75      * `.get` handler that we defined above - where the wrapper will then unpack the `.ws`
76      * property, indicate that the WebSocket has been handled, and call the actual handler. */
77     request.url = (0, _websocketUrl2.default)(request.url);
78
79     var dummyResponse = new _http2.default.ServerResponse(request);
80
81     dummyResponse.writeHead = function writeHead(statusCode) {
82       if (statusCode > 200) {
83         /* Something in the middleware chain signalled an error. */
84         dummyResponse._header = '';
85         socket.close();
86       }
87     };
88
89     app.handle(request, dummyResponse, function () {
90       if (!request.wsHandled) {
91         /* There was no matching WebSocket-specific route for this request. We'll close
92          * the connection, as no endpoint was able to handle the request anyway... */
93         socket.close();
94       }
95     });
96   });
97
98   return {
99     app: app,
100     getWss: function getWss() {
101       return wsServer;
102     },
103     applyTo: function applyTo(router) {
104       (0, _addWsMethod2.default)(router);
105     }
106   };
107 } /* This module does a lot of monkeypatching, but unfortunately that appears to be the only way to
108    * accomplish this kind of stuff in Express.
109    *
110    * Here be dragons. */