1 | /**
|
2 | * @class TheClient
|
3 | */
|
4 | ;
|
5 |
|
6 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
7 |
|
8 | var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
9 |
|
10 | var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
11 |
|
12 | var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
13 |
|
14 | var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
15 |
|
16 | var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
|
17 |
|
18 | var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
19 |
|
20 | var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
21 |
|
22 | var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
23 |
|
24 | var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
25 |
|
26 | var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
27 |
|
28 | var argx = require('argx');
|
29 |
|
30 | var asleep = require('asleep');
|
31 |
|
32 | var cookies = require('browser-cookies');
|
33 |
|
34 | var _require = require('bstorage'),
|
35 | restore = _require.restore,
|
36 | save = _require.save;
|
37 |
|
38 | var _require2 = require('bwindow'),
|
39 | _get = _require2.get;
|
40 |
|
41 | var qs = require('qs');
|
42 |
|
43 | var _require3 = require('rfunc-client/shim/browser'),
|
44 | RFuncClient = _require3.RFuncClient;
|
45 |
|
46 | var io = require('socket.io-client');
|
47 |
|
48 | var _require4 = require('the-check'),
|
49 | isBrowser = _require4.isBrowser,
|
50 | isProduction = _require4.isProduction,
|
51 | unlessProduction = _require4.unlessProduction;
|
52 |
|
53 | var _require5 = require('the-pack'),
|
54 | ThePack = _require5.ThePack;
|
55 |
|
56 | var _require6 = require('url'),
|
57 | resolveUrl = _require6.resolve;
|
58 |
|
59 | var uuid = require('uuid');
|
60 |
|
61 | var IOEvents = require('./constants/IOEvents');
|
62 |
|
63 | var _require7 = require('./helpers'),
|
64 | asController = _require7.asController,
|
65 | debugController = _require7.debugController,
|
66 | debugStream = _require7.debugStream,
|
67 | parseClientUrl = _require7.parseClientUrl;
|
68 |
|
69 | var _require8 = require('./mixins'),
|
70 | infoMix = _require8.infoMix,
|
71 | pingPongMix = _require8.pingPongMix,
|
72 | streamMix = _require8.streamMix;
|
73 |
|
74 | var debug = require('debug')('the:client');
|
75 |
|
76 | var NAMESPACE = '/rpc';
|
77 | var TheClientBase = [pingPongMix, infoMix, streamMix].reduce(function (Class, mix) {
|
78 | return mix(Class);
|
79 | }, RFuncClient);
|
80 |
|
81 | var _ref = new ThePack({}),
|
82 | decode = _ref.decode,
|
83 | encode = _ref.encode;
|
84 | /** @lends TheClient */
|
85 |
|
86 |
|
87 | var TheClient =
|
88 | /*#__PURE__*/
|
89 | function (_TheClientBase) {
|
90 | (0, _inherits2.default)(TheClient, _TheClientBase);
|
91 | (0, _createClass2.default)(TheClient, null, [{
|
92 | key: "for",
|
93 | // noinspection ReservedWordAsName
|
94 |
|
95 | /**
|
96 | * Create the client instance
|
97 | * @param {string} namespace
|
98 | * @param {Object} [config={}]
|
99 | * @returns {TheClient}
|
100 | */
|
101 | value: function _for() {
|
102 | var namespace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'default';
|
103 | var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
104 | var key = [TheClient.CID_KEY, namespace].join('/').trim();
|
105 | var cid = restore(key) || TheClient.newCID();
|
106 | var client = new TheClient((0, _objectSpread2.default)({}, config, {
|
107 | cid: cid
|
108 | }));
|
109 | var isBrowser = !!_get('document');
|
110 |
|
111 | if (isBrowser) {
|
112 | save(key, cid);
|
113 | cookies.set(key, cid, {});
|
114 | }
|
115 |
|
116 | return client;
|
117 | }
|
118 | }]);
|
119 |
|
120 | function TheClient(url, config) {
|
121 | var _this;
|
122 |
|
123 | (0, _classCallCheck2.default)(this, TheClient);
|
124 | var args = argx(arguments);
|
125 | url = args.shift('string');
|
126 | config = args.pop('object') || {};
|
127 |
|
128 | if (!url) {
|
129 | url = parseClientUrl(config);
|
130 | }
|
131 |
|
132 | var _config = config,
|
133 | _config$cid = _config.cid,
|
134 | cid = _config$cid === void 0 ? TheClient.newCID() : _config$cid,
|
135 | _config$forceNewSocke = _config.forceNewSocket,
|
136 | forceNewSocket = _config$forceNewSocke === void 0 ? false : _config$forceNewSocke,
|
137 | onGone = _config.onGone,
|
138 | _config$version = _config.version,
|
139 | version = _config$version === void 0 ? 'unknown' : _config$version,
|
140 | restOptions = (0, _objectWithoutProperties2.default)(_config, ["cid", "forceNewSocket", "onGone", "version"]);
|
141 |
|
142 | if (!url) {
|
143 | throw new Error("[TheClient] Failed to parse urls with args ".concat(JSON.stringify(arguments)));
|
144 | }
|
145 |
|
146 | _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TheClient).call(this, url, restOptions));
|
147 | _this._onGone = onGone;
|
148 | _this._forceNewSocket = forceNewSocket;
|
149 | _this._gone = false;
|
150 | _this._controllers = {};
|
151 | _this._cid = cid;
|
152 | _this._version = version;
|
153 | _this._socket = null;
|
154 | _this._closed = false;
|
155 | return _this;
|
156 | }
|
157 |
|
158 | (0, _createClass2.default)(TheClient, [{
|
159 | key: "assertNotClosed",
|
160 | value: function assertNotClosed() {
|
161 | if (this.closed) {
|
162 | throw new Error("[TheClient] Already closed!");
|
163 | }
|
164 | }
|
165 | }, {
|
166 | key: "handleCallback",
|
167 | value: function handleCallback(controllerName, handleName, data) {
|
168 | var values = decode(data);
|
169 | var controller = this._controllers[controllerName];
|
170 |
|
171 | if (!controller) {
|
172 | console.warn("[TheClient] Callback controller not found: ".concat(controllerName));
|
173 | return;
|
174 | }
|
175 |
|
176 | var callback = controller.callbacks[handleName];
|
177 |
|
178 | if (!callback) {
|
179 | console.warn("[TheClient] Callback controller not found: ".concat(controllerName));
|
180 | return;
|
181 | }
|
182 |
|
183 | unlessProduction(function () {
|
184 | console.groupCollapsed("[TheClient] Callback `".concat(controllerName, ".").concat(handleName, "()`"));
|
185 | console.log('Signature', "`".concat(controllerName, ".").concat(handleName, "()`"));
|
186 | console.log('Arguments', values);
|
187 | console.groupEnd();
|
188 | });
|
189 | callback.apply(void 0, (0, _toConsumableArray2.default)(values));
|
190 | }
|
191 | }, {
|
192 | key: "markAsGone",
|
193 | value: function markAsGone() {
|
194 | if (this._gone) {
|
195 | return;
|
196 | }
|
197 |
|
198 | this._onGone && this._onGone();
|
199 | this._gone = true;
|
200 | }
|
201 | }, {
|
202 | key: "close",
|
203 | value: function () {
|
204 | var _close = (0, _asyncToGenerator2.default)(
|
205 | /*#__PURE__*/
|
206 | _regenerator.default.mark(function _callee() {
|
207 | var socket;
|
208 | return _regenerator.default.wrap(function _callee$(_context) {
|
209 | while (1) {
|
210 | switch (_context.prev = _context.next) {
|
211 | case 0:
|
212 | this._closed = true;
|
213 | socket = this._socket;
|
214 |
|
215 | if (socket) {
|
216 | socket.close();
|
217 | }
|
218 |
|
219 | case 3:
|
220 | case "end":
|
221 | return _context.stop();
|
222 | }
|
223 | }
|
224 | }, _callee, this);
|
225 | }));
|
226 |
|
227 | function close() {
|
228 | return _close.apply(this, arguments);
|
229 | }
|
230 |
|
231 | return close;
|
232 | }()
|
233 | /**
|
234 | * Invoke a method
|
235 | * @param {string} moduleName
|
236 | * @param {string} methodName - Name of method to invoke
|
237 | * @param {...*} params - Parameters
|
238 | */
|
239 |
|
240 | }, {
|
241 | key: "invoke",
|
242 | value: function () {
|
243 | var _invoke = (0, _asyncToGenerator2.default)(
|
244 | /*#__PURE__*/
|
245 | _regenerator.default.mark(function _callee2(moduleName, methodName) {
|
246 | var _len,
|
247 | params,
|
248 | _key,
|
249 | cid,
|
250 | socket,
|
251 | iid,
|
252 | _args2 = arguments;
|
253 |
|
254 | return _regenerator.default.wrap(function _callee2$(_context2) {
|
255 | while (1) {
|
256 | switch (_context2.prev = _context2.next) {
|
257 | case 0:
|
258 | for (_len = _args2.length, params = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
259 | params[_key - 2] = _args2[_key];
|
260 | }
|
261 |
|
262 | this.assertNotClosed();
|
263 | cid = this.cid, socket = this.socket;
|
264 | iid = uuid.v4(); // Invocation id
|
265 |
|
266 | _context2.next = 6;
|
267 | return new Promise(function (resolve, reject) {
|
268 | var keptGoneTimer = -1;
|
269 |
|
270 | var _onReturn = function onReturn(returned) {
|
271 | if (!_onReturn) {
|
272 | return null;
|
273 | }
|
274 |
|
275 | returned = decode(returned);
|
276 |
|
277 | if (returned.iid !== iid) {
|
278 | return;
|
279 | }
|
280 |
|
281 | socket.off(IOEvents.RPC_RETURN, _onReturn);
|
282 | _onReturn = null;
|
283 | _onKeep = null;
|
284 | clearTimeout(keptGoneTimer);
|
285 | var _returned = returned,
|
286 | data = _returned.data,
|
287 | errors = _returned.errors,
|
288 | ok = _returned.ok;
|
289 | debug('rpc return', moduleName, methodName, returned);
|
290 |
|
291 | if (ok) {
|
292 | resolve(data);
|
293 | } else {
|
294 | var e = errors[0];
|
295 | reject(e.message || e);
|
296 | }
|
297 | };
|
298 |
|
299 | var _onKeep = function onKeep(kept) {
|
300 | if (!_onKeep) {
|
301 | return;
|
302 | }
|
303 |
|
304 | kept = decode(kept);
|
305 |
|
306 | if (kept.iid !== iid) {
|
307 | return;
|
308 | }
|
309 |
|
310 | socket.off(IOEvents.RPC_KEEP, _onKeep);
|
311 | _onKeep = null;
|
312 | debug('rpc keep', moduleName, methodName);
|
313 | clearTimeout(keptGoneTimer);
|
314 | var _kept = kept,
|
315 | duration = _kept.duration;
|
316 | keptGoneTimer = setTimeout(function () {
|
317 | // TODO throw error?
|
318 | console.error("[TheClient] RPC call seems gone: `".concat(moduleName, ".").concat(methodName, "()`"));
|
319 | }, duration * 2);
|
320 | };
|
321 |
|
322 | socket.on(IOEvents.RPC_RETURN, _onReturn);
|
323 | socket.emit(IOEvents.RPC_CALL, encode({
|
324 | cid: cid,
|
325 | iid: iid,
|
326 | methodName: methodName,
|
327 | moduleName: moduleName,
|
328 | params: params
|
329 | }));
|
330 | debug('rpc call', moduleName, methodName, params);
|
331 | });
|
332 |
|
333 | case 6:
|
334 | return _context2.abrupt("return", _context2.sent);
|
335 |
|
336 | case 7:
|
337 | case "end":
|
338 | return _context2.stop();
|
339 | }
|
340 | }
|
341 | }, _callee2, this);
|
342 | }));
|
343 |
|
344 | function invoke(_x, _x2) {
|
345 | return _invoke.apply(this, arguments);
|
346 | }
|
347 |
|
348 | return invoke;
|
349 | }()
|
350 | }, {
|
351 | key: "newSocket",
|
352 | value: function () {
|
353 | var _newSocket = (0, _asyncToGenerator2.default)(
|
354 | /*#__PURE__*/
|
355 | _regenerator.default.mark(function _callee3() {
|
356 | var _this2 = this;
|
357 |
|
358 | var query, socket;
|
359 | return _regenerator.default.wrap(function _callee3$(_context3) {
|
360 | while (1) {
|
361 | switch (_context3.prev = _context3.next) {
|
362 | case 0:
|
363 | this.assertNotClosed();
|
364 | query = qs.stringify(this.scope);
|
365 | socket = io(resolveUrl(this.baseUrl, "".concat(NAMESPACE, "?").concat(query)), {
|
366 | forceNew: this._forceNewSocket
|
367 | });
|
368 | socket.on('disconnect', function () {
|
369 | debug('disconnect');
|
370 |
|
371 | if (_this2.closed) {
|
372 | return;
|
373 | }
|
374 |
|
375 | var goneTimer = setTimeout(function () {
|
376 | return _this2.markAsGone();
|
377 | }, 2 * 1000 + 2 * 1000 * Math.random());
|
378 |
|
379 | var cancelGone = function cancelGone() {
|
380 | debug('cancelGone');
|
381 | clearTimeout(goneTimer);
|
382 | socket.off('connect', cancelGone);
|
383 | socket.off('reconnect', cancelGone);
|
384 | };
|
385 |
|
386 | socket.once('connect', cancelGone);
|
387 | socket.once('reconnect', cancelGone);
|
388 | socket.connect();
|
389 | });
|
390 | _context3.next = 6;
|
391 | return new Promise(function (resolve, reject) {
|
392 | socket.on('connect', function () {
|
393 | debug('connect');
|
394 | resolve(socket);
|
395 | });
|
396 | socket.on('error', function (e) {
|
397 | debug('error', e);
|
398 | reject(e);
|
399 | });
|
400 | });
|
401 |
|
402 | case 6:
|
403 | return _context3.abrupt("return", socket);
|
404 |
|
405 | case 7:
|
406 | case "end":
|
407 | return _context3.stop();
|
408 | }
|
409 | }
|
410 | }, _callee3, this);
|
411 | }));
|
412 |
|
413 | function newSocket() {
|
414 | return _newSocket.apply(this, arguments);
|
415 | }
|
416 |
|
417 | return newSocket;
|
418 | }()
|
419 | /**
|
420 | * Create an stream to server
|
421 | * @param {string} name
|
422 | * @param {Object} params - Stream params
|
423 | * @param {Object} [options={}] - Optional setting
|
424 | * @param {Boolean} [options.debug] - With debug mode
|
425 | * @returns {*}
|
426 | */
|
427 |
|
428 | }, {
|
429 | key: "stream",
|
430 | value: function () {
|
431 | var _stream = (0, _asyncToGenerator2.default)(
|
432 | /*#__PURE__*/
|
433 | _regenerator.default.mark(function _callee4(name) {
|
434 | var params,
|
435 | options,
|
436 | _options$debug,
|
437 | debug,
|
438 | stream,
|
439 | _args4 = arguments;
|
440 |
|
441 | return _regenerator.default.wrap(function _callee4$(_context4) {
|
442 | while (1) {
|
443 | switch (_context4.prev = _context4.next) {
|
444 | case 0:
|
445 | params = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : {};
|
446 | options = _args4.length > 2 && _args4[2] !== undefined ? _args4[2] : {};
|
447 | this.assertNotClosed();
|
448 | _options$debug = options.debug, debug = _options$debug === void 0 ? !isProduction() && isBrowser() : _options$debug;
|
449 |
|
450 | if (this._socket) {
|
451 | _context4.next = 8;
|
452 | break;
|
453 | }
|
454 |
|
455 | _context4.next = 7;
|
456 | return this.newSocket();
|
457 |
|
458 | case 7:
|
459 | this._socket = _context4.sent;
|
460 |
|
461 | case 8:
|
462 | _context4.next = 10;
|
463 | return this.openStream(name, params);
|
464 |
|
465 | case 10:
|
466 | stream = _context4.sent;
|
467 | return _context4.abrupt("return", debug ? debugStream(stream) : stream);
|
468 |
|
469 | case 12:
|
470 | case "end":
|
471 | return _context4.stop();
|
472 | }
|
473 | }
|
474 | }, _callee4, this);
|
475 | }));
|
476 |
|
477 | function stream(_x3) {
|
478 | return _stream.apply(this, arguments);
|
479 | }
|
480 |
|
481 | return stream;
|
482 | }()
|
483 | /**
|
484 | * Use a controller module
|
485 | * @param {string} controllerName - Module name
|
486 | * @param {Object} [options={}] - Optional setting
|
487 | * @param {Boolean} [options.debug] - With debug mode
|
488 | * @returns {*}
|
489 | */
|
490 |
|
491 | }, {
|
492 | key: "use",
|
493 | value: function () {
|
494 | var _use = (0, _asyncToGenerator2.default)(
|
495 | /*#__PURE__*/
|
496 | _regenerator.default.mark(function _callee5(controllerName) {
|
497 | var _this3 = this;
|
498 |
|
499 | var options,
|
500 | _options$debug2,
|
501 | debug,
|
502 | controller,
|
503 | instance,
|
504 | spec,
|
505 | cid,
|
506 | _args5 = arguments;
|
507 |
|
508 | return _regenerator.default.wrap(function _callee5$(_context5) {
|
509 | while (1) {
|
510 | switch (_context5.prev = _context5.next) {
|
511 | case 0:
|
512 | options = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : {};
|
513 | this.assertNotClosed();
|
514 | _options$debug2 = options.debug, debug = _options$debug2 === void 0 ? !isProduction() && isBrowser() : _options$debug2;
|
515 | controller = this._controllers[controllerName];
|
516 |
|
517 | if (this._socket) {
|
518 | _context5.next = 8;
|
519 | break;
|
520 | }
|
521 |
|
522 | _context5.next = 7;
|
523 | return this.newSocket();
|
524 |
|
525 | case 7:
|
526 | this._socket = _context5.sent;
|
527 |
|
528 | case 8:
|
529 | if (controller) {
|
530 | _context5.next = 19;
|
531 | break;
|
532 | }
|
533 |
|
534 | _context5.next = 11;
|
535 | return this.connect(controllerName);
|
536 |
|
537 | case 11:
|
538 | instance = _context5.sent;
|
539 | _context5.next = 14;
|
540 | return this.describe(controllerName);
|
541 |
|
542 | case 14:
|
543 | spec = _context5.sent;
|
544 | cid = this.cid;
|
545 | controller = asController(instance, spec, {
|
546 | cid: cid
|
547 | }, {
|
548 | onToggleHandler: function onToggleHandler(handlerName, enabled) {
|
549 | var socket = _this3.socket;
|
550 | var event = [IOEvents.CLIENT_CALLBACK, cid, controllerName, handlerName].join('/');
|
551 |
|
552 | if (enabled) {
|
553 | socket.on(event, function (data) {
|
554 | _this3.handleCallback(controllerName, handlerName, data);
|
555 | });
|
556 | } else {
|
557 | socket.off(event);
|
558 | }
|
559 | }
|
560 | });
|
561 |
|
562 | if (debug) {
|
563 | controller = debugController(controller);
|
564 | }
|
565 |
|
566 | this._controllers[controllerName] = controller;
|
567 |
|
568 | case 19:
|
569 | return _context5.abrupt("return", controller);
|
570 |
|
571 | case 20:
|
572 | case "end":
|
573 | return _context5.stop();
|
574 | }
|
575 | }
|
576 | }, _callee5, this);
|
577 | }));
|
578 |
|
579 | function use(_x4) {
|
580 | return _use.apply(this, arguments);
|
581 | }
|
582 |
|
583 | return use;
|
584 | }()
|
585 | /**
|
586 | * Use all controller modules
|
587 | * @param {Object} [options={}] - Optional setting
|
588 | * @returns {Promise<Object>}
|
589 | */
|
590 |
|
591 | }, {
|
592 | key: "useAll",
|
593 | value: function () {
|
594 | var _useAll = (0, _asyncToGenerator2.default)(
|
595 | /*#__PURE__*/
|
596 | _regenerator.default.mark(function _callee6() {
|
597 | var options,
|
598 | serverInfo,
|
599 | controllers,
|
600 | controllerSpecs,
|
601 | _iteratorNormalCompletion,
|
602 | _didIteratorError,
|
603 | _iteratorError,
|
604 | _iterator,
|
605 | _step,
|
606 | _ref3,
|
607 | methods,
|
608 | name,
|
609 | _args6 = arguments;
|
610 |
|
611 | return _regenerator.default.wrap(function _callee6$(_context6) {
|
612 | while (1) {
|
613 | switch (_context6.prev = _context6.next) {
|
614 | case 0:
|
615 | options = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {};
|
616 | _context6.next = 3;
|
617 | return this.serverInfo();
|
618 |
|
619 | case 3:
|
620 | serverInfo = _context6.sent;
|
621 | controllers = {};
|
622 | controllerSpecs = serverInfo.controllers;
|
623 | _iteratorNormalCompletion = true;
|
624 | _didIteratorError = false;
|
625 | _iteratorError = undefined;
|
626 | _context6.prev = 9;
|
627 | _iterator = controllerSpecs[Symbol.iterator]();
|
628 |
|
629 | case 11:
|
630 | if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
|
631 | _context6.next = 21;
|
632 | break;
|
633 | }
|
634 |
|
635 | _ref3 = _step.value;
|
636 | methods = _ref3.methods, name = _ref3.name;
|
637 | this.specs[name] = {
|
638 | methods: methods,
|
639 | name: name
|
640 | };
|
641 | _context6.next = 17;
|
642 | return this.use(name, options);
|
643 |
|
644 | case 17:
|
645 | controllers[name] = _context6.sent;
|
646 |
|
647 | case 18:
|
648 | _iteratorNormalCompletion = true;
|
649 | _context6.next = 11;
|
650 | break;
|
651 |
|
652 | case 21:
|
653 | _context6.next = 27;
|
654 | break;
|
655 |
|
656 | case 23:
|
657 | _context6.prev = 23;
|
658 | _context6.t0 = _context6["catch"](9);
|
659 | _didIteratorError = true;
|
660 | _iteratorError = _context6.t0;
|
661 |
|
662 | case 27:
|
663 | _context6.prev = 27;
|
664 | _context6.prev = 28;
|
665 |
|
666 | if (!_iteratorNormalCompletion && _iterator.return != null) {
|
667 | _iterator.return();
|
668 | }
|
669 |
|
670 | case 30:
|
671 | _context6.prev = 30;
|
672 |
|
673 | if (!_didIteratorError) {
|
674 | _context6.next = 33;
|
675 | break;
|
676 | }
|
677 |
|
678 | throw _iteratorError;
|
679 |
|
680 | case 33:
|
681 | return _context6.finish(30);
|
682 |
|
683 | case 34:
|
684 | return _context6.finish(27);
|
685 |
|
686 | case 35:
|
687 | unlessProduction(function () {
|
688 | if (typeof Proxy === 'undefined') {
|
689 | return controllers;
|
690 | }
|
691 |
|
692 | return new Proxy(controllers, {
|
693 | get: function get(target, key) {
|
694 | var has = key in target;
|
695 |
|
696 | if (!has) {
|
697 | console.warn("[TheClient] Unknown controller name: \"".concat(key, "\""));
|
698 | }
|
699 |
|
700 | return target[key];
|
701 | }
|
702 | });
|
703 | });
|
704 | return _context6.abrupt("return", controllers);
|
705 |
|
706 | case 37:
|
707 | case "end":
|
708 | return _context6.stop();
|
709 | }
|
710 | }
|
711 | }, _callee6, this, [[9, 23, 27, 35], [28,, 30, 34]]);
|
712 | }));
|
713 |
|
714 | function useAll() {
|
715 | return _useAll.apply(this, arguments);
|
716 | }
|
717 |
|
718 | return useAll;
|
719 | }()
|
720 | }, {
|
721 | key: "cid",
|
722 | get: function get() {
|
723 | return this._cid;
|
724 | }
|
725 | }, {
|
726 | key: "closed",
|
727 | get: function get() {
|
728 | return this._closed;
|
729 | }
|
730 | }, {
|
731 | key: "scope",
|
732 | get: function get() {
|
733 | var cid = this._cid,
|
734 | rpc = this._rpc,
|
735 | version = this._version;
|
736 |
|
737 | var language = _get('navigator.language');
|
738 |
|
739 | return {
|
740 | /** Caller key */
|
741 | callerKey: rpc && rpc.as,
|
742 |
|
743 | /** Client ID */
|
744 | cid: cid,
|
745 |
|
746 | /** Host of client */
|
747 | host: _get('location.host'),
|
748 |
|
749 | /** Detected lang */
|
750 | lang: language && language.split('-')[0],
|
751 |
|
752 | /** Connecting protocol */
|
753 | protocol: _get('location.protocol'),
|
754 |
|
755 | /** Client instance version number */
|
756 | v: version,
|
757 |
|
758 | /** Via client */
|
759 | via: 'client'
|
760 | };
|
761 | }
|
762 | }, {
|
763 | key: "socket",
|
764 | get: function get() {
|
765 | return this._socket;
|
766 | }
|
767 | }]);
|
768 | return TheClient;
|
769 | }(TheClientBase);
|
770 |
|
771 | TheClient.RPC_ACTOR_NAME = 'rpc';
|
772 | TheClient.CID_KEY = 'the:cid';
|
773 |
|
774 | TheClient.newCID = function () {
|
775 | return uuid.v4();
|
776 | };
|
777 |
|
778 | module.exports = TheClient;
|
779 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRoZUNsaWVudC5qcyJdLCJuYW1lcyI6WyJhcmd4IiwicmVxdWlyZSIsImFzbGVlcCIsImNvb2tpZXMiLCJyZXN0b3JlIiwic2F2ZSIsImdldCIsInFzIiwiUkZ1bmNDbGllbnQiLCJpbyIsImlzQnJvd3NlciIsImlzUHJvZHVjdGlvbiIsInVubGVzc1Byb2R1Y3Rpb24iLCJUaGVQYWNrIiwicmVzb2x2ZVVybCIsInJlc29sdmUiLCJ1dWlkIiwiSU9FdmVudHMiLCJhc0NvbnRyb2xsZXIiLCJkZWJ1Z0NvbnRyb2xsZXIiLCJkZWJ1Z1N0cmVhbSIsInBhcnNlQ2xpZW50VXJsIiwiaW5mb01peCIsInBpbmdQb25nTWl4Iiwic3RyZWFtTWl4IiwiZGVidWciLCJOQU1FU1BBQ0UiLCJUaGVDbGllbnRCYXNlIiwicmVkdWNlIiwiQ2xhc3MiLCJtaXgiLCJkZWNvZGUiLCJlbmNvZGUiLCJUaGVDbGllbnQiLCJuYW1lc3BhY2UiLCJjb25maWciLCJrZXkiLCJDSURfS0VZIiwiam9pbiIsInRyaW0iLCJjaWQiLCJuZXdDSUQiLCJjbGllbnQiLCJzZXQiLCJ1cmwiLCJhcmdzIiwiYXJndW1lbnRzIiwic2hpZnQiLCJwb3AiLCJmb3JjZU5ld1NvY2tldCIsIm9uR29uZSIsInZlcnNpb24iLCJyZXN0T3B0aW9ucyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9vbkdvbmUiLCJfZm9yY2VOZXdTb2NrZXQiLCJfZ29uZSIsIl9jb250cm9sbGVycyIsIl9jaWQiLCJfdmVyc2lvbiIsIl9zb2NrZXQiLCJfY2xvc2VkIiwiY2xvc2VkIiwiY29udHJvbGxlck5hbWUiLCJoYW5kbGVOYW1lIiwiZGF0YSIsInZhbHVlcyIsImNvbnRyb2xsZXIiLCJjb25zb2xlIiwid2FybiIsImNhbGxiYWNrIiwiY2FsbGJhY2tzIiwiZ3JvdXBDb2xsYXBzZWQiLCJsb2ciLCJncm91cEVuZCIsInNvY2tldCIsImNsb3NlIiwibW9kdWxlTmFtZSIsIm1ldGhvZE5hbWUiLCJwYXJhbXMiLCJhc3NlcnROb3RDbG9zZWQiLCJpaWQiLCJ2NCIsIlByb21pc2UiLCJyZWplY3QiLCJrZXB0R29uZVRpbWVyIiwib25SZXR1cm4iLCJyZXR1cm5lZCIsIm9mZiIsIlJQQ19SRVRVUk4iLCJvbktlZXAiLCJjbGVhclRpbWVvdXQiLCJlcnJvcnMiLCJvayIsImUiLCJtZXNzYWdlIiwia2VwdCIsIlJQQ19LRUVQIiwiZHVyYXRpb24iLCJzZXRUaW1lb3V0IiwiZXJyb3IiLCJvbiIsImVtaXQiLCJSUENfQ0FMTCIsInF1ZXJ5Iiwic2NvcGUiLCJiYXNlVXJsIiwiZm9yY2VOZXciLCJnb25lVGltZXIiLCJtYXJrQXNHb25lIiwiTWF0aCIsInJhbmRvbSIsImNhbmNlbEdvbmUiLCJvbmNlIiwiY29ubmVjdCIsIm5hbWUiLCJvcHRpb25zIiwibmV3U29ja2V0Iiwib3BlblN0cmVhbSIsInN0cmVhbSIsImluc3RhbmNlIiwiZGVzY3JpYmUiLCJzcGVjIiwib25Ub2dnbGVIYW5kbGVyIiwiaGFuZGxlck5hbWUiLCJlbmFibGVkIiwiZXZlbnQiLCJDTElFTlRfQ0FMTEJBQ0siLCJoYW5kbGVDYWxsYmFjayIsInNlcnZlckluZm8iLCJjb250cm9sbGVycyIsImNvbnRyb2xsZXJTcGVjcyIsIm1ldGhvZHMiLCJzcGVjcyIsInVzZSIsIlByb3h5IiwidGFyZ2V0IiwiaGFzIiwicnBjIiwiX3JwYyIsImxhbmd1YWdlIiwiY2FsbGVyS2V5IiwiYXMiLCJob3N0IiwibGFuZyIsInNwbGl0IiwicHJvdG9jb2wiLCJ2IiwidmlhIiwiUlBDX0FDVE9SX05BTUUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLElBQUksR0FBR0MsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsSUFBTUMsTUFBTSxHQUFHRCxPQUFPLENBQUMsUUFBRCxDQUF0Qjs7QUFDQSxJQUFNRSxPQUFPLEdBQUdGLE9BQU8sQ0FBQyxpQkFBRCxDQUF2Qjs7ZUFDMEJB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KipcbiAqIEBjbGFzcyBUaGVDbGllbnRcbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGFyZ3ggPSByZXF1aXJlKCdhcmd4JylcbmNvbnN0IGFzbGVlcCA9IHJlcXVpcmUoJ2FzbGVlcCcpXG5jb25zdCBjb29raWVzID0gcmVxdWlyZSgnYnJvd3Nlci1jb29raWVzJylcbmNvbnN0IHsgcmVzdG9yZSwgc2F2ZSB9ID0gcmVxdWlyZSgnYnN0b3JhZ2UnKVxuY29uc3QgeyBnZXQgfSA9IHJlcXVpcmUoJ2J3aW5kb3cnKVxuY29uc3QgcXMgPSByZXF1aXJlKCdxcycpXG5jb25zdCB7IFJGdW5jQ2xpZW50IH0gPSByZXF1aXJlKCdyZnVuYy1jbGllbnQvc2hpbS9icm93c2VyJylcbmNvbnN0IGlvID0gcmVxdWlyZSgnc29ja2V0LmlvLWNsaWVudCcpXG5jb25zdCB7IGlzQnJvd3NlciwgaXNQcm9kdWN0aW9uLCB1bmxlc3NQcm9kdWN0aW9uIH0gPSByZXF1aXJlKCd0aGUtY2hlY2snKVxuY29uc3QgeyBUaGVQYWNrIH0gPSByZXF1aXJlKCd0aGUtcGFjaycpXG5jb25zdCB7IHJlc29sdmU6IHJlc29sdmVVcmwgfSA9IHJlcXVpcmUoJ3VybCcpXG5jb25zdCB1dWlkID0gcmVxdWlyZSgndXVpZCcpXG5jb25zdCBJT0V2ZW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzL0lPRXZlbnRzJylcbmNvbnN0IHtcbiAgYXNDb250cm9sbGVyLFxuICBkZWJ1Z0NvbnRyb2xsZXIsXG4gIGRlYnVnU3RyZWFtLFxuICBwYXJzZUNsaWVudFVybCxcbn0gPSByZXF1aXJlKCcuL2hlbHBlcnMnKVxuY29uc3QgeyBpbmZvTWl4LCBwaW5nUG9uZ01peCwgc3RyZWFtTWl4IH0gPSByZXF1aXJlKCcuL21peGlucycpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3RoZTpjbGllbnQnKVxuY29uc3QgTkFNRVNQQUNFID0gJy9ycGMnXG5cbmNvbnN0IFRoZUNsaWVudEJhc2UgPSBbXG4gIHBpbmdQb25nTWl4LFxuICBpbmZvTWl4LFxuICBzdHJlYW1NaXgsXG5dLnJlZHVjZSgoQ2xhc3MsIG1peCkgPT4gbWl4KENsYXNzKSwgUkZ1bmNDbGllbnQpXG5cbmNvbnN0IHsgZGVjb2RlLCBlbmNvZGUgfSA9IG5ldyBUaGVQYWNrKHt9KVxuXG4vKiogQGxlbmRzIFRoZUNsaWVudCAqL1xuY2xhc3MgVGhlQ2xpZW50IGV4dGVuZHMgVGhlQ2xpZW50QmFzZSB7XG4gIC8vIG5vaW5zcGVjdGlvbiBSZXNlcnZlZFdvcmRBc05hbWVcbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb25maWc9e31dXG4gICAqIEByZXR1cm5zIHtUaGVDbGllbnR9XG4gICAqL1xuICBzdGF0aWMgZm9yIChuYW1lc3BhY2UgPSAnZGVmYXVsdCcsIGNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3Qga2V5ID0gW1RoZUNsaWVudC5DSURfS0VZLCBuYW1lc3BhY2VdLmpvaW4oJy8nKS50cmltKClcbiAgICBjb25zdCBjaWQgPSByZXN0b3JlKGtleSkgfHwgVGhlQ2xpZW50Lm5ld0NJRCgpXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFRoZUNsaWVudCh7IC4uLmNvbmZpZywgY2lkIH0pXG4gICAgY29uc3QgaXNCcm93c2VyID0gISFnZXQoJ2RvY3VtZW50JylcbiAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICBzYXZlKGtleSwgY2lkKVxuICAgICAgY29va2llcy5zZXQoa2V5LCBjaWQsIHt9KVxuICAgIH1cbiAgICByZXR1cm4gY2xpZW50XG4gIH1cblxuICBjb25zdHJ1Y3RvciAodXJsLCBjb25maWcpIHtcbiAgICBjb25zdCBhcmdzID0gYXJneChhcmd1bWVudHMpXG4gICAgdXJsID0gYXJncy5zaGlmdCgnc3RyaW5nJylcbiAgICBjb25maWcgPSBhcmdzLnBvcCgnb2JqZWN0JykgfHwge31cbiAgICBpZiAoIXVybCkge1xuICAgICAgdXJsID0gcGFyc2VDbGllbnRVcmwoY29uZmlnKVxuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjaWQgPSBUaGVDbGllbnQubmV3Q0lEKCksXG4gICAgICBmb3JjZU5ld1NvY2tldCA9IGZhbHNlLFxuICAgICAgb25Hb25lLFxuICAgICAgdmVyc2lvbiA9ICd1bmtub3duJyxcbiAgICAgIC4uLnJlc3RPcHRpb25zXG4gICAgfSA9IGNvbmZpZ1xuICAgIGlmICghdXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtUaGVDbGllbnRdIEZhaWxlZCB0byBwYXJzZSB1cmxzIHdpdGggYXJncyAke0pTT04uc3RyaW5naWZ5KGFyZ3VtZW50cyl9YClcbiAgICB9XG4gICAgc3VwZXIodXJsLCByZXN0T3B0aW9ucylcbiAgICB0aGlzLl9vbkdvbmUgPSBvbkdvbmVcbiAgICB0aGlzLl9mb3JjZU5ld1NvY2tldCA9IGZvcmNlTmV3U29ja2V0XG4gICAgdGhpcy5fZ29uZSA9IGZhbHNlXG4gICAgdGhpcy5fY29udHJvbGxlcnMgPSB7fVxuICAgIHRoaXMuX2NpZCA9IGNpZFxuICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uXG4gICAgdGhpcy5fc29ja2V0ID0gbnVsbFxuICAgIHRoaXMuX2Nsb3NlZCA9IGZhbHNlXG4gIH1cblxuICBnZXQgY2lkICgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2lkXG4gIH1cblxuICBnZXQgY2xvc2VkICgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvc2VkXG4gIH1cblxuICBnZXQgc2NvcGUgKCkge1xuICAgIGNvbnN0IHsgX2NpZDogY2lkLCBfcnBjOiBycGMsIF92ZXJzaW9uOiB2ZXJzaW9uIH0gPSB0aGlzXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBnZXQoJ25hdmlnYXRvci5sYW5ndWFnZScpXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKiBDYWxsZXIga2V5ICovXG4gICAgICBjYWxsZXJLZXk6IHJwYyAmJiBycGMuYXMsXG4gICAgICAvKiogQ2xpZW50IElEICovXG4gICAgICBjaWQ6IGNpZCxcbiAgICAgIC8qKiBIb3N0IG9mIGNsaWVudCAqL1xuICAgICAgaG9zdDogZ2V0KCdsb2NhdGlvbi5ob3N0JyksXG4gICAgICAvKiogRGV0ZWN0ZWQgbGFuZyAqL1xuICAgICAgbGFuZzogbGFuZ3VhZ2UgJiYgbGFuZ3VhZ2Uuc3BsaXQoJy0nKVswXSxcbiAgICAgIC8qKiBDb25uZWN0aW5nIHByb3RvY29sICovXG4gICAgICBwcm90b2NvbDogZ2V0KCdsb2NhdGlvbi5wcm90b2NvbCcpLFxuICAgICAgLyoqIENsaWVudCBpbnN0YW5jZSB2ZXJzaW9uIG51bWJlciAqL1xuICAgICAgdjogdmVyc2lvbixcbiAgICAgIC8qKiBWaWEgY2xpZW50ICovXG4gICAgICB2aWE6ICdjbGllbnQnLFxuICAgIH1cbiAgfVxuXG4gIGdldCBzb2NrZXQgKCkge1xuICAgIHJldHVybiB0aGlzLl9zb2NrZXRcbiAgfVxuXG4gIGFzc2VydE5vdENsb3NlZCAoKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtUaGVDbGllbnRdIEFscmVhZHkgY2xvc2VkIWApXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2FsbGJhY2sgKGNvbnRyb2xsZXJOYW1lLCBoYW5kbGVOYW1lLCBkYXRhKSB7XG4gICAgY29uc3QgdmFsdWVzID0gZGVjb2RlKGRhdGEpXG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2NvbnRyb2xsZXJzW2NvbnRyb2xsZXJOYW1lXVxuICAgIGlmICghY29udHJvbGxlcikge1xuICAgICAgY29uc29sZS53YXJuKGBbVGhlQ2xpZW50XSBDYWxsYmFjayBjb250cm9sbGVyIG5vdCBmb3VuZDogJHtjb250cm9sbGVyTmFtZX1gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGNhbGxiYWNrID0gY29udHJvbGxlci5jYWxsYmFja3NbaGFuZGxlTmFtZV1cbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtUaGVDbGllbnRdIENhbGxiYWNrIGNvbnRyb2xsZXIgbm90IGZvdW5kOiAke2NvbnRyb2xsZXJOYW1lfWApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdW5sZXNzUHJvZHVjdGlvbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKGBbVGhlQ2xpZW50XSBDYWxsYmFjayBcXGAke2NvbnRyb2xsZXJOYW1lfS4ke2hhbmRsZU5hbWV9KClcXGBgKVxuICAgICAgY29uc29sZS5sb2coJ1NpZ25hdHVyZScsIGBcXGAke2NvbnRyb2xsZXJOYW1lfS4ke2hhbmRsZU5hbWV9KClcXGBgKVxuICAgICAgY29uc29sZS5sb2coJ0FyZ3VtZW50cycsIHZhbHVlcylcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICAgIH0pXG4gICAgY2FsbGJhY2soLi4udmFsdWVzKVxuICB9XG5cbiAgbWFya0FzR29uZSAoKSB7XG4gICAgaWYgKHRoaXMuX2dvbmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLl9vbkdvbmUgJiYgdGhpcy5fb25Hb25lKClcbiAgICB0aGlzLl9nb25lID0gdHJ1ZVxuICB9XG5cbiAgYXN5bmMgY2xvc2UgKCkge1xuICAgIHRoaXMuX2Nsb3NlZCA9IHRydWVcbiAgICBjb25zdCBzb2NrZXQgPSB0aGlzLl9zb2NrZXRcbiAgICBpZiAoc29ja2V0KSB7XG4gICAgICBzb2NrZXQuY2xvc2UoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgYSBtZXRob2RcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZU5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgLSBOYW1lIG9mIG1ldGhvZCB0byBpbnZva2VcbiAgICogQHBhcmFtIHsuLi4qfSBwYXJhbXMgLSBQYXJhbWV0ZXJzXG4gICAqL1xuICBhc3luYyBpbnZva2UgKG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIC4uLnBhcmFtcykge1xuICAgIHRoaXMuYXNzZXJ0Tm90Q2xvc2VkKClcbiAgICBjb25zdCB7IGNpZCwgc29ja2V0IH0gPSB0aGlzXG4gICAgY29uc3QgaWlkID0gdXVpZC52NCgpIC8vIEludm9jYXRpb24gaWRcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQga2VwdEdvbmVUaW1lciA9IC0xXG4gICAgICBsZXQgb25SZXR1cm4gPSAocmV0dXJuZWQpID0+IHtcbiAgICAgICAgaWYgKCFvblJldHVybikge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuZWQgPSBkZWNvZGUocmV0dXJuZWQpXG4gICAgICAgIGlmIChyZXR1cm5lZC5paWQgIT09IGlpZCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHNvY2tldC5vZmYoSU9FdmVudHMuUlBDX1JFVFVSTiwgb25SZXR1cm4pXG4gICAgICAgIG9uUmV0dXJuID0gbnVsbFxuICAgICAgICBvbktlZXAgPSBudWxsXG4gICAgICAgIGNsZWFyVGltZW91dChrZXB0R29uZVRpbWVyKVxuICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9ycywgb2sgfSA9IHJldHVybmVkXG4gICAgICAgIGRlYnVnKCdycGMgcmV0dXJuJywgbW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgcmV0dXJuZWQpXG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgIHJlc29sdmUoZGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBlID0gZXJyb3JzWzBdXG4gICAgICAgICAgcmVqZWN0KGUubWVzc2FnZSB8fCBlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgb25LZWVwID0gKGtlcHQpID0+IHtcbiAgICAgICAgaWYgKCFvbktlZXApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBrZXB0ID0gZGVjb2RlKGtlcHQpXG4gICAgICAgIGlmIChrZXB0LmlpZCAhPT0gaWlkKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgc29ja2V0Lm9mZihJT0V2ZW50cy5SUENfS0VFUCwgb25LZWVwKVxuICAgICAgICBvbktlZXAgPSBudWxsXG4gICAgICAgIGRlYnVnKCdycGMga2VlcCcsIG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUpXG4gICAgICAgIGNsZWFyVGltZW91dChrZXB0R29uZVRpbWVyKVxuICAgICAgICBjb25zdCB7IGR1cmF0aW9uIH0gPSBrZXB0XG4gICAgICAgIGtlcHRHb25lVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyBUT0RPIHRocm93IGVycm9yP1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtUaGVDbGllbnRdIFJQQyBjYWxsIHNlZW1zIGdvbmU6IFxcYCR7bW9kdWxlTmFtZX0uJHttZXRob2ROYW1lfSgpXFxgYClcbiAgICAgICAgfSwgZHVyYXRpb24gKiAyKVxuICAgICAgfVxuICAgICAgc29ja2V0Lm9uKElPRXZlbnRzLlJQQ19SRVRVUk4sIG9uUmV0dXJuKVxuXG4gICAgICBzb2NrZXQuZW1pdChJT0V2ZW50cy5SUENfQ0FMTCwgZW5jb2RlKHtcbiAgICAgICAgY2lkLFxuICAgICAgICBpaWQsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgIH0pKVxuICAgICAgZGVidWcoJ3JwYyBjYWxsJywgbW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgcGFyYW1zKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBuZXdTb2NrZXQgKCkge1xuICAgIHRoaXMuYXNzZXJ0Tm90Q2xvc2VkKClcbiAgICBjb25zdCBxdWVyeSA9IHFzLnN0cmluZ2lmeSh0aGlzLnNjb3BlKVxuICAgIGNvbnN0IHNvY2tldCA9IGlvKHJlc29sdmVVcmwodGhpcy5iYXNlVXJsLCBgJHtOQU1FU1BBQ0V9PyR7cXVlcnl9YCksIHtcbiAgICAgIGZvcmNlTmV3OiB0aGlzLl9mb3JjZU5ld1NvY2tldCxcbiAgICB9KVxuICAgIHNvY2tldC5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgIGRlYnVnKCdkaXNjb25uZWN0JylcbiAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGdvbmVUaW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IHRoaXMubWFya0FzR29uZSgpLFxuICAgICAgICAyICogMTAwMCArIDIgKiAxMDAwICogTWF0aC5yYW5kb20oKVxuICAgICAgKVxuICAgICAgY29uc3QgY2FuY2VsR29uZSA9ICgpID0+IHtcbiAgICAgICAgZGVidWcoJ2NhbmNlbEdvbmUnKVxuICAgICAgICBjbGVhclRpbWVvdXQoZ29uZVRpbWVyKVxuICAgICAgICBzb2NrZXQub2ZmKCdjb25uZWN0JywgY2FuY2VsR29uZSlcbiAgICAgICAgc29ja2V0Lm9mZigncmVjb25uZWN0JywgY2FuY2VsR29uZSlcbiAgICAgIH1cbiAgICAgIHNvY2tldC5vbmNlKCdjb25uZWN0JywgY2FuY2VsR29uZSlcbiAgICAgIHNvY2tldC5vbmNlKCdyZWNvbm5lY3QnLCBjYW5jZWxHb25lKVxuICAgICAgc29ja2V0LmNvbm5lY3QoKVxuICAgIH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc29ja2V0Lm9uKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICBkZWJ1ZygnY29ubmVjdCcpXG4gICAgICAgIHJlc29sdmUoc29ja2V0KVxuICAgICAgfSlcbiAgICAgIHNvY2tldC5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICBkZWJ1ZygnZXJyb3InLCBlKVxuICAgICAgICByZWplY3QoZSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICByZXR1cm4gc29ja2V0XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIHN0cmVhbSB0byBzZXJ2ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIFN0cmVhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kZWJ1Z10gLSBXaXRoIGRlYnVnIG1vZGVcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzdHJlYW0gKG5hbWUsIHBhcmFtcyA9IHt9LCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmFzc2VydE5vdENsb3NlZCgpXG4gICAgY29uc3Qge1xuICAgICAgZGVidWcgPSAhaXNQcm9kdWN0aW9uKCkgJiYgaXNCcm93c2VyKCksXG4gICAgfSA9IG9wdGlvbnNcbiAgICBpZiAoIXRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fc29ja2V0ID0gYXdhaXQgdGhpcy5uZXdTb2NrZXQoKVxuICAgIH1cbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB0aGlzLm9wZW5TdHJlYW0obmFtZSwgcGFyYW1zKVxuICAgIHJldHVybiBkZWJ1ZyA/IGRlYnVnU3RyZWFtKHN0cmVhbSkgOiBzdHJlYW1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgYSBjb250cm9sbGVyIG1vZHVsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udHJvbGxlck5hbWUgLSBNb2R1bGUgbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRlYnVnXSAtIFdpdGggZGVidWcgbW9kZVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVzZSAoY29udHJvbGxlck5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90Q2xvc2VkKClcbiAgICBjb25zdCB7XG4gICAgICBkZWJ1ZyA9ICFpc1Byb2R1Y3Rpb24oKSAmJiBpc0Jyb3dzZXIoKSxcbiAgICB9ID0gb3B0aW9uc1xuICAgIGxldCBjb250cm9sbGVyID0gdGhpcy5fY29udHJvbGxlcnNbY29udHJvbGxlck5hbWVdXG4gICAgaWYgKCF0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRoaXMuX3NvY2tldCA9IGF3YWl0IHRoaXMubmV3U29ja2V0KClcbiAgICB9XG4gICAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IHRoaXMuY29ubmVjdChjb250cm9sbGVyTmFtZSlcbiAgICAgIGNvbnN0IHNwZWMgPSBhd2FpdCB0aGlzLmRlc2NyaWJlKGNvbnRyb2xsZXJOYW1lKVxuICAgICAgY29uc3QgeyBjaWQgfSA9IHRoaXNcbiAgICAgIGNvbnRyb2xsZXIgPSBhc0NvbnRyb2xsZXIoaW5zdGFuY2UsIHNwZWMsIHsgY2lkIH0sIHtcbiAgICAgICAgb25Ub2dnbGVIYW5kbGVyOiAoaGFuZGxlck5hbWUsIGVuYWJsZWQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNvY2tldCB9ID0gdGhpc1xuICAgICAgICAgIGNvbnN0IGV2ZW50ID0gW0lPRXZlbnRzLkNMSUVOVF9DQUxMQkFDSywgY2lkLCBjb250cm9sbGVyTmFtZSwgaGFuZGxlck5hbWVdLmpvaW4oJy8nKVxuICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICBzb2NrZXQub24oZXZlbnQsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2FsbGJhY2soY29udHJvbGxlck5hbWUsIGhhbmRsZXJOYW1lLCBkYXRhKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc29ja2V0Lm9mZihldmVudClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnRyb2xsZXIgPSBkZWJ1Z0NvbnRyb2xsZXIoY29udHJvbGxlcilcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbnRyb2xsZXJzW2NvbnRyb2xsZXJOYW1lXSA9IGNvbnRyb2xsZXJcbiAgICB9XG5cbiAgICByZXR1cm4gY29udHJvbGxlclxuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBhbGwgY29udHJvbGxlciBtb2R1bGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBzZXR0aW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gICAqL1xuICBhc3luYyB1c2VBbGwgKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHNlcnZlckluZm8gPSBhd2FpdCB0aGlzLnNlcnZlckluZm8oKVxuICAgIGNvbnN0IGNvbnRyb2xsZXJzID0ge31cbiAgICBjb25zdCBjb250cm9sbGVyU3BlY3MgPSBzZXJ2ZXJJbmZvLmNvbnRyb2xsZXJzXG4gICAgZm9yIChjb25zdCB7IG1ldGhvZHMsIG5hbWUgfSBvZiBjb250cm9sbGVyU3BlY3MpIHtcbiAgICAgIHRoaXMuc3BlY3NbbmFtZV0gPSB7IG1ldGhvZHMsIG5hbWUgfVxuICAgICAgY29udHJvbGxlcnNbbmFtZV0gPSBhd2FpdCB0aGlzLnVzZShuYW1lLCBvcHRpb25zKVxuICAgIH1cbiAgICB1bmxlc3NQcm9kdWN0aW9uKCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyc1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm94eShjb250cm9sbGVycywge1xuICAgICAgICBnZXQgKHRhcmdldCwga2V5KSB7XG4gICAgICAgICAgY29uc3QgaGFzID0ga2V5IGluIHRhcmdldFxuICAgICAgICAgIGlmICghaGFzKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtUaGVDbGllbnRdIFVua25vd24gY29udHJvbGxlciBuYW1lOiBcIiR7a2V5fVwiYClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0pXG4gICAgcmV0dXJuIGNvbnRyb2xsZXJzXG4gIH1cbn1cblxuVGhlQ2xpZW50LlJQQ19BQ1RPUl9OQU1FID0gJ3JwYydcblRoZUNsaWVudC5DSURfS0VZID0gJ3RoZTpjaWQnXG5cblRoZUNsaWVudC5uZXdDSUQgPSAoKSA9PiB1dWlkLnY0KClcblxubW9kdWxlLmV4cG9ydHMgPSBUaGVDbGllbnRcbiJdfQ== |
\ | No newline at end of file |