1 | 'use strict';
|
2 |
|
3 | var _extends2 = require('babel-runtime/helpers/extends');
|
4 |
|
5 | var _extends3 = _interopRequireDefault(_extends2);
|
6 |
|
7 | var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
|
8 |
|
9 | var _defineProperty3 = _interopRequireDefault(_defineProperty2);
|
10 |
|
11 | var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
|
12 |
|
13 | var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
|
14 |
|
15 | var _entries = require('babel-runtime/core-js/object/entries');
|
16 |
|
17 | var _entries2 = _interopRequireDefault(_entries);
|
18 |
|
19 | var _stringify = require('babel-runtime/core-js/json/stringify');
|
20 |
|
21 | var _stringify2 = _interopRequireDefault(_stringify);
|
22 |
|
23 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
24 |
|
25 | var Promise = require('bluebird');
|
26 | var urlLib = require('url');
|
27 | var uuid = require('uuid/v4');
|
28 | var WebSocket = require('isomorphic-ws');
|
29 | Promise.config({ warnings: false });
|
30 |
|
31 | function websocket(url) {
|
32 |
|
33 | var messages = [];
|
34 |
|
35 | url = url.replace('https://', 'wss://').replace('http://', 'ws://');
|
36 | var socket = new WebSocket(url);
|
37 | var connected = false;
|
38 | var httpCallbacks = {};
|
39 | var watchCallbacks = {};
|
40 |
|
41 | function sendMessages() {
|
42 | if (!connected) return;
|
43 | messages.forEach(function (message) {
|
44 | socket.send((0, _stringify2.default)(message));
|
45 | });
|
46 | messages = [];
|
47 | }
|
48 |
|
49 | return new Promise(function (resolve, reject) {
|
50 | socket.onopen = function (event) {
|
51 | connected = true;
|
52 | sendMessages();
|
53 | resolve(socket);
|
54 | };
|
55 |
|
56 | socket.onclose = function (event) {};
|
57 | socket.onmessage = function (event) {
|
58 | var response = JSON.parse(event.data);
|
59 |
|
60 | if (response.requestId) {
|
61 | if (httpCallbacks[response.requestId]) {
|
62 |
|
63 | if (response.status >= 200 && response.status < 300) {
|
64 | httpCallbacks[response.requestId].resolve(response);
|
65 | } else {
|
66 |
|
67 | console.log(httpCallbacks[response.requestId].request, response);
|
68 | var err = new Error('Request failed with status code ' + response.status);
|
69 | err.request = httpCallbacks[response.requestId].request;
|
70 | err.response = {
|
71 | status: response.status,
|
72 | statusText: response.status,
|
73 | headers: response.headers,
|
74 | data: response.data
|
75 | };
|
76 | httpCallbacks[response.requestId].reject(err);
|
77 | }
|
78 | delete httpCallbacks[response.requestId];
|
79 | } else if (watchCallbacks[response.requestId]) {
|
80 | if (watchCallbacks[response.requestId].resolve) {
|
81 | if (response.status === 'success') {
|
82 |
|
83 | watchCallbacks[response.requestId].resolve(response);
|
84 | } else {
|
85 | console.log(watchCallbacks[response.requestId].request, response);
|
86 | var _err = new Error('Request failed with status code ' + response.status);
|
87 | _err.response = response;
|
88 | _err.request = watchCallbacks[response.requestId].request;
|
89 | watchCallbacks[response.requestId].reject(_err);
|
90 | }
|
91 |
|
92 | delete watchCallbacks[response.requestId]['resolve'];
|
93 | delete watchCallbacks[response.requestId]['reject'];
|
94 | } else {
|
95 | if (watchCallbacks[response.requestId].callback == null) throw new Error('The given watch function has an undefined callback:', watchCallbacks[response.requestId]);
|
96 | watchCallbacks[response.requestId].callback(response);
|
97 | }
|
98 | }
|
99 | }
|
100 | };
|
101 | }).then(function () {
|
102 |
|
103 | function _http(request) {
|
104 |
|
105 | return new Promise(function (resolve, reject) {
|
106 | var urlObj = urlLib.parse(request.url);
|
107 | var message = {
|
108 | requestId: uuid(),
|
109 | method: request.method.toLowerCase(),
|
110 | path: urlObj.path,
|
111 | data: request.data,
|
112 | headers: (0, _entries2.default)(request.headers).map(function (_ref) {
|
113 | var _ref2 = (0, _slicedToArray3.default)(_ref, 2),
|
114 | key = _ref2[0],
|
115 | value = _ref2[1];
|
116 |
|
117 | return (0, _defineProperty3.default)({}, key.toLowerCase(), value);
|
118 | }).reduce(function (a, b) {
|
119 | return (0, _extends3.default)({}, a, b);
|
120 | })
|
121 | };
|
122 | messages.push(message);
|
123 | httpCallbacks[message.requestId] = {
|
124 | request: request,
|
125 | resolve: resolve,
|
126 | reject: reject
|
127 | };
|
128 | sendMessages();
|
129 | });
|
130 | }
|
131 |
|
132 | function _unwatch(request, callback) {
|
133 |
|
134 | return new Promise(function (resolve, reject) {
|
135 | var message = {
|
136 | requestId: uuid(),
|
137 | method: 'unwatch',
|
138 | path: request.path,
|
139 | headers: (0, _entries2.default)(request.headers).map(function (_ref4) {
|
140 | var _ref5 = (0, _slicedToArray3.default)(_ref4, 2),
|
141 | key = _ref5[0],
|
142 | value = _ref5[1];
|
143 |
|
144 | return (0, _defineProperty3.default)({}, key.toLowerCase(), value);
|
145 | }).reduce(function (a, b) {
|
146 | return (0, _extends3.default)({}, a, b);
|
147 | })
|
148 | };
|
149 | messages.push(message);
|
150 | watchCallbacks[message.requestId] = { request: request, resolve: resolve, reject: reject, callback: callback };
|
151 | sendMessages();
|
152 | });
|
153 | }
|
154 |
|
155 | function _watch(request, callback) {
|
156 |
|
157 | return new Promise(function (resolve, reject) {
|
158 | var message = {
|
159 | requestId: uuid(),
|
160 | method: 'watch',
|
161 | path: request.path,
|
162 | headers: (0, _entries2.default)(request.headers).map(function (_ref7) {
|
163 | var _ref8 = (0, _slicedToArray3.default)(_ref7, 2),
|
164 | key = _ref8[0],
|
165 | value = _ref8[1];
|
166 |
|
167 | return (0, _defineProperty3.default)({}, key.toLowerCase(), value);
|
168 | }).reduce(function (a, b) {
|
169 | return (0, _extends3.default)({}, a, b);
|
170 | })
|
171 | };
|
172 | messages.push(message);
|
173 | watchCallbacks[message.requestId] = { request: request, resolve: resolve, reject: reject, callback: callback };
|
174 | sendMessages();
|
175 | });
|
176 | }
|
177 |
|
178 | function _close() {
|
179 |
|
180 |
|
181 | messages = [];
|
182 | httpCallbacks = {};
|
183 | watchCallbacks = {};
|
184 |
|
185 | socket.close();
|
186 | }
|
187 |
|
188 | return {
|
189 | url: url,
|
190 | http: _http,
|
191 | close: _close,
|
192 | watch: _watch,
|
193 | unwatch: _unwatch
|
194 | };
|
195 | });
|
196 | }
|
197 |
|
198 | module.exports = websocket; |
\ | No newline at end of file |