UNPKG

6.24 kBJavaScriptView Raw
1'use strict';
2
3var _extends2 = require('babel-runtime/helpers/extends');
4
5var _extends3 = _interopRequireDefault(_extends2);
6
7var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
8
9var _defineProperty3 = _interopRequireDefault(_defineProperty2);
10
11var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
12
13var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
14
15var _entries = require('babel-runtime/core-js/object/entries');
16
17var _entries2 = _interopRequireDefault(_entries);
18
19var _stringify = require('babel-runtime/core-js/json/stringify');
20
21var _stringify2 = _interopRequireDefault(_stringify);
22
23function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
25var Promise = require('bluebird');
26var urlLib = require('url');
27var uuid = require('uuid/v4');
28var WebSocket = require('isomorphic-ws');
29Promise.config({ warnings: false });
30
31function websocket(url) {
32 //Create the message queue
33 var messages = [];
34 //Create the socket
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 //Look for id in httpCallbacks
60 if (response.requestId) {
61 if (httpCallbacks[response.requestId]) {
62 //Resolve Promise
63 if (response.status >= 200 && response.status < 300) {
64 httpCallbacks[response.requestId].resolve(response);
65 } else {
66 //Create error like axios
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 //Successfully setup websocket, resolve promise
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 //Remove resolve and reject so we process change as a signal next time
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 //Do a HTTP request
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 //Watch for changes on requested resource and trigger provided signal
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 //Watch for changes on requested resource and trigger provided signal
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 //TODO reject all callbacks that have not resolved
180 //Clear everything
181 messages = [];
182 httpCallbacks = {};
183 watchCallbacks = {};
184 //Close socket
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
198module.exports = websocket;
\No newline at end of file