podasync-ws-only 2.9.0-snapshot.2 → 2.9.0-snapshot.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,813 @@
1
+ (function () {
2
+ /*
3
+ * Async module to handle async messaging
4
+ * @module Async
5
+ *
6
+ * @param {Object} params
7
+ */
8
+
9
+ function Async(params) {
10
+ /*******************************************************
11
+ * P R I V A T E V A R I A B L E S *
12
+ *******************************************************/
13
+
14
+ var PodSocketClass, WebRTCClass, PodUtility, LogLevel;
15
+ if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
16
+ PodSocketClass = require('./socket.js');
17
+ WebRTCClass = require('./webrtc.js');
18
+ PodUtility = require('../utility/utility.js');
19
+ LogLevel = require('../utility/logger.js');
20
+ } else {
21
+ PodSocketClass = POD.Socket;
22
+ PodUtility = POD.AsyncUtility;
23
+ LogLevel = POD.LogLevel;
24
+ }
25
+ var Utility = new PodUtility();
26
+ var protocol = params.protocol || 'websocket',
27
+ appId = params.appId || 'PodChat',
28
+ deviceId = params.deviceId,
29
+ eventCallbacks = {
30
+ connect: {},
31
+ disconnect: {},
32
+ reconnect: {},
33
+ message: {},
34
+ asyncReady: {},
35
+ stateChange: {},
36
+ error: {}
37
+ },
38
+ ackCallback = {},
39
+ socket,
40
+ webRTCClass,
41
+ asyncMessageType = {
42
+ PING: 0,
43
+ SERVER_REGISTER: 1,
44
+ DEVICE_REGISTER: 2,
45
+ MESSAGE: 3,
46
+ MESSAGE_ACK_NEEDED: 4,
47
+ MESSAGE_SENDER_ACK_NEEDED: 5,
48
+ ACK: 6,
49
+ GET_REGISTERED_PEERS: 7,
50
+ PEER_REMOVED: -3,
51
+ REGISTER_QUEUE: -2,
52
+ NOT_REGISTERED: -1,
53
+ ERROR_MESSAGE: -99
54
+ },
55
+ socketStateType = {
56
+ CONNECTING: 0,
57
+ // The connection is not yet open.
58
+ OPEN: 1,
59
+ // The connection is open and ready to communicate.
60
+ CLOSING: 2,
61
+ // The connection is in the process of closing.
62
+ CLOSED: 3 // The connection is closed or couldn't be opened.
63
+ },
64
+ logLevel = LogLevel(params.logLevel),
65
+ // isNode = Utility.isNode(),
66
+ isSocketOpen = false,
67
+ isDeviceRegister = false,
68
+ isServerRegister = false,
69
+ socketState = socketStateType.CONNECTING,
70
+ // asyncState = '',
71
+ registerServerTimeoutId,
72
+ registerDeviceTimeoutId,
73
+ checkIfSocketHasOpennedTimeoutId,
74
+ // asyncReadyTimeoutId,
75
+ pushSendDataQueue = [],
76
+ oldPeerId,
77
+ peerId = params.peerId,
78
+ lastMessageId = 0,
79
+ messageTtl = params.messageTtl || 86400,
80
+ serverName = params.serverName || 'oauth-wire',
81
+ serverRegisteration = typeof params.serverRegisteration === 'boolean' ? params.serverRegisteration : true,
82
+ connectionRetryInterval = params.connectionRetryInterval || 5000,
83
+ socketReconnectRetryInterval,
84
+ socketReconnectCheck,
85
+ // retryStep = 4,
86
+ reconnectOnClose = typeof params.reconnectOnClose === 'boolean' ? params.reconnectOnClose : true,
87
+ asyncLogging = params.asyncLogging && typeof params.asyncLogging.onFunction === 'boolean' ? params.asyncLogging.onFunction : false,
88
+ onReceiveLogging = params.asyncLogging && typeof params.asyncLogging.onMessageReceive === 'boolean' ? params.asyncLogging.onMessageReceive : false,
89
+ onSendLogging = params.asyncLogging && typeof params.asyncLogging.onMessageSend === 'boolean' ? params.asyncLogging.onMessageSend : false,
90
+ workerId = params.asyncLogging && typeof parseInt(params.asyncLogging.workerId) === 'number' ? params.asyncLogging.workerId : 0,
91
+ webrtcConfig = params.webrtcConfig ? params.webrtcConfig : null;
92
+
93
+ // function setRetryStep(val){
94
+ // console.log("new retryStep value:", val);
95
+ // retryStep = val;
96
+ // }
97
+ //
98
+ // function getRetryStep() {
99
+ // return retryStep;
100
+ // }
101
+
102
+ const reconnOnClose = {
103
+ value: false,
104
+ oldValue: null,
105
+ get() {
106
+ return reconnOnClose.value;
107
+ },
108
+ set(val) {
109
+ reconnOnClose.value = val;
110
+ },
111
+ getOld() {
112
+ return reconnOnClose.oldValue;
113
+ },
114
+ setOld(val) {
115
+ reconnOnClose.oldValue = val;
116
+ }
117
+ };
118
+ reconnOnClose.set(reconnectOnClose);
119
+ const retryStep = {
120
+ value: 4,
121
+ get() {
122
+ return retryStep.value;
123
+ },
124
+ set(val) {
125
+ logLevel.debug && console.debug("[Async][async.js] retryStep new value:", val);
126
+ retryStep.value = val;
127
+ }
128
+ };
129
+
130
+ /*******************************************************
131
+ * P R I V A T E M E T H O D S *
132
+ *******************************************************/
133
+
134
+ var init = function () {
135
+ switch (protocol) {
136
+ case 'websocket':
137
+ initSocket();
138
+ break;
139
+ case 'webrtc':
140
+ initWebrtc();
141
+ break;
142
+ }
143
+ },
144
+ asyncLogger = function (type, msg) {
145
+ Utility.asyncLogger({
146
+ protocol: protocol,
147
+ workerId: workerId,
148
+ type: type,
149
+ msg: msg,
150
+ peerId: peerId,
151
+ deviceId: deviceId,
152
+ isSocketOpen: isSocketOpen,
153
+ isDeviceRegister: isDeviceRegister,
154
+ isServerRegister: isServerRegister,
155
+ socketState: socketState,
156
+ pushSendDataQueue: pushSendDataQueue
157
+ });
158
+ },
159
+ initSocket = function () {
160
+ socket = new PodSocketClass({
161
+ socketAddress: params.socketAddress,
162
+ wsConnectionWaitTime: params.wsConnectionWaitTime,
163
+ connectionCheckTimeout: params.connectionCheckTimeout,
164
+ connectionCheckTimeoutThreshold: params.connectionCheckTimeoutThreshold,
165
+ logLevel: logLevel
166
+ });
167
+ checkIfSocketHasOpennedTimeoutId = setTimeout(function () {
168
+ if (!isSocketOpen) {
169
+ fireEvent('error', {
170
+ errorCode: 4001,
171
+ errorMessage: 'Can not open Socket!'
172
+ });
173
+ }
174
+ }, 65000);
175
+ socket.on('open', function () {
176
+ checkIfSocketHasOpennedTimeoutId && clearTimeout(checkIfSocketHasOpennedTimeoutId);
177
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
178
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
179
+ isSocketOpen = true;
180
+ retryStep.set(4);
181
+ socketState = socketStateType.OPEN;
182
+ fireEvent('stateChange', {
183
+ socketState: socketState,
184
+ timeUntilReconnect: 0,
185
+ deviceRegister: isDeviceRegister,
186
+ serverRegister: isServerRegister,
187
+ peerId: peerId
188
+ });
189
+ });
190
+ socket.on('message', function (msg) {
191
+ handleSocketMessage(msg);
192
+ if (onReceiveLogging) {
193
+ asyncLogger('Receive', msg);
194
+ }
195
+ });
196
+ socket.on('close', function (event) {
197
+ isSocketOpen = false;
198
+ isDeviceRegister = false;
199
+ oldPeerId = peerId;
200
+ socketState = socketStateType.CLOSED;
201
+
202
+ // socketState = socketStateType.CLOSED;
203
+ //
204
+ // fireEvent('stateChange', {
205
+ // socketState: socketState,
206
+ // timeUntilReconnect: 0,
207
+ // deviceRegister: isDeviceRegister,
208
+ // serverRegister: isServerRegister,
209
+ // peerId: peerId
210
+ // });
211
+
212
+ fireEvent('disconnect', event);
213
+ if (reconnOnClose.get() || reconnOnClose.getOld()) {
214
+ // reconnOnClose.set(reconnOnClose.getOld());
215
+ if (asyncLogging) {
216
+ if (workerId > 0) {
217
+ Utility.asyncStepLogger(workerId + '\t Reconnecting after ' + retryStep.get() + 's');
218
+ } else {
219
+ Utility.asyncStepLogger('Reconnecting after ' + retryStep.get() + 's');
220
+ }
221
+ }
222
+ logLevel.debug && console.debug("[Async][async.js] on socket close, retryStep:", retryStep.get());
223
+ fireEvent('stateChange', {
224
+ socketState: socketState,
225
+ timeUntilReconnect: 1000 * retryStep.get(),
226
+ deviceRegister: isDeviceRegister,
227
+ serverRegister: isServerRegister,
228
+ peerId: peerId
229
+ });
230
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
231
+ socketReconnectRetryInterval = setTimeout(function () {
232
+ socket.connect();
233
+ }, 1000 * retryStep.get());
234
+ if (retryStep.get() < 64) {
235
+ // retryStep += 3;
236
+ retryStep.set(retryStep.get() + 3);
237
+ }
238
+
239
+ // socketReconnectCheck && clearTimeout(socketReconnectCheck);
240
+ //
241
+ // socketReconnectCheck = setTimeout(function() {
242
+ // if (!isSocketOpen) {
243
+ // fireEvent("error", {
244
+ // errorCode: 4001,
245
+ // errorMessage: "Can not open Socket!"
246
+ // });
247
+ //
248
+ // socketState = socketStateType.CLOSED;
249
+ // fireEvent("stateChange", {
250
+ // socketState: socketState,
251
+ // deviceRegister: isDeviceRegister,
252
+ // serverRegister: isServerRegister,
253
+ // peerId: peerId
254
+ // });
255
+ // }
256
+ // }, 65000);
257
+ } else {
258
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
259
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
260
+ fireEvent('error', {
261
+ errorCode: 4005,
262
+ errorMessage: 'Socket Closed!'
263
+ });
264
+ socketState = socketStateType.CLOSED;
265
+ fireEvent('stateChange', {
266
+ socketState: socketState,
267
+ timeUntilReconnect: 0,
268
+ deviceRegister: isDeviceRegister,
269
+ serverRegister: isServerRegister,
270
+ peerId: peerId
271
+ });
272
+ }
273
+ });
274
+ socket.on('customError', function (error) {
275
+ fireEvent('error', {
276
+ errorCode: error.errorCode,
277
+ errorMessage: error.errorMessage,
278
+ errorEvent: error.errorEvent
279
+ });
280
+ });
281
+ socket.on('error', function (error) {
282
+ fireEvent('error', {
283
+ errorCode: '',
284
+ errorMessage: '',
285
+ errorEvent: error
286
+ });
287
+ });
288
+ },
289
+ initWebrtc = function () {
290
+ webRTCClass = new WebRTCClass({
291
+ baseUrl: webrtcConfig ? webrtcConfig.baseUrl : null,
292
+ configuration: webrtcConfig ? webrtcConfig.configuration : null,
293
+ connectionCheckTimeout: params.connectionCheckTimeout,
294
+ logLevel: logLevel
295
+ });
296
+ checkIfSocketHasOpennedTimeoutId = setTimeout(function () {
297
+ if (!isSocketOpen) {
298
+ fireEvent('error', {
299
+ errorCode: 4001,
300
+ errorMessage: 'Can not open Socket!'
301
+ });
302
+ }
303
+ }, 65000);
304
+ webRTCClass.on('open', function () {
305
+ checkIfSocketHasOpennedTimeoutId && clearTimeout(checkIfSocketHasOpennedTimeoutId);
306
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
307
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
308
+ isSocketOpen = true;
309
+ retryStep.set(4);
310
+ socketState = socketStateType.OPEN;
311
+ fireEvent('stateChange', {
312
+ socketState: socketState,
313
+ timeUntilReconnect: 0,
314
+ deviceRegister: isDeviceRegister,
315
+ serverRegister: isServerRegister,
316
+ peerId: peerId
317
+ });
318
+ });
319
+ webRTCClass.on('message', function (msg) {
320
+ console.log({
321
+ msg
322
+ });
323
+ handleSocketMessage(msg);
324
+ if (onReceiveLogging) {
325
+ asyncLogger('Receive', msg);
326
+ }
327
+ });
328
+ webRTCClass.on('close', function (event) {
329
+ isSocketOpen = false;
330
+ isDeviceRegister = false;
331
+ oldPeerId = peerId;
332
+ fireEvent('disconnect', event);
333
+ if (reconnOnClose.get()) {
334
+ if (asyncLogging) {
335
+ if (workerId > 0) {
336
+ Utility.asyncStepLogger(workerId + '\t Reconnecting after ' + retryStep.get() + 's');
337
+ } else {
338
+ Utility.asyncStepLogger('Reconnecting after ' + retryStep.get() + 's');
339
+ }
340
+ }
341
+ logLevel.debug && console.debug("[Async][async.js] on connection close, retryStep:", retryStep.get());
342
+ socketState = socketStateType.CLOSED;
343
+ fireEvent('stateChange', {
344
+ socketState: socketState,
345
+ timeUntilReconnect: 1000 * retryStep.get(),
346
+ deviceRegister: isDeviceRegister,
347
+ serverRegister: isServerRegister,
348
+ peerId: peerId
349
+ });
350
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
351
+ socketReconnectRetryInterval = setTimeout(function () {
352
+ webRTCClass.connect();
353
+ }, 1000 * retryStep.get());
354
+ if (retryStep.get() < 64) {
355
+ // retryStep += 3;
356
+ retryStep.set(retryStep.get() + 3);
357
+ }
358
+ } else {
359
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
360
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
361
+ fireEvent('error', {
362
+ errorCode: 4005,
363
+ errorMessage: 'Connection Closed!'
364
+ });
365
+ socketState = socketStateType.CLOSED;
366
+ fireEvent('stateChange', {
367
+ socketState: socketState,
368
+ timeUntilReconnect: 0,
369
+ deviceRegister: isDeviceRegister,
370
+ serverRegister: isServerRegister,
371
+ peerId: peerId
372
+ });
373
+ }
374
+ });
375
+ webRTCClass.on('customError', function (error) {
376
+ fireEvent('error', {
377
+ errorCode: error.errorCode,
378
+ errorMessage: error.errorMessage,
379
+ errorEvent: error.errorEvent
380
+ });
381
+ });
382
+ webRTCClass.on('error', function (error) {
383
+ fireEvent('error', {
384
+ errorCode: '',
385
+ errorMessage: '',
386
+ errorEvent: error
387
+ });
388
+ });
389
+ },
390
+ handleSocketMessage = function (msg) {
391
+ var ack;
392
+ if (msg.type === asyncMessageType.MESSAGE_ACK_NEEDED || msg.type === asyncMessageType.MESSAGE_SENDER_ACK_NEEDED) {
393
+ ack = function () {
394
+ pushSendData({
395
+ type: asyncMessageType.ACK,
396
+ content: {
397
+ messageId: msg.id
398
+ }
399
+ });
400
+ };
401
+ }
402
+ switch (msg.type) {
403
+ case asyncMessageType.PING:
404
+ handlePingMessage(msg);
405
+ break;
406
+ case asyncMessageType.SERVER_REGISTER:
407
+ handleServerRegisterMessage(msg);
408
+ break;
409
+ case asyncMessageType.DEVICE_REGISTER:
410
+ handleDeviceRegisterMessage(msg.content);
411
+ break;
412
+ case asyncMessageType.MESSAGE:
413
+ fireEvent('message', msg);
414
+ break;
415
+ case asyncMessageType.MESSAGE_ACK_NEEDED:
416
+ case asyncMessageType.MESSAGE_SENDER_ACK_NEEDED:
417
+ ack();
418
+ fireEvent('message', msg);
419
+ break;
420
+ case asyncMessageType.ACK:
421
+ fireEvent('message', msg);
422
+ if (ackCallback[msg.senderMessageId] == 'function') {
423
+ ackCallback[msg.senderMessageId]();
424
+ delete ackCallback[msg.senderMessageId];
425
+ }
426
+ break;
427
+ case asyncMessageType.ERROR_MESSAGE:
428
+ fireEvent('error', {
429
+ errorCode: 4002,
430
+ errorMessage: 'Async Error!',
431
+ errorEvent: msg
432
+ });
433
+ break;
434
+ }
435
+ },
436
+ handlePingMessage = function (msg) {
437
+ if (msg.content) {
438
+ if (deviceId === undefined) {
439
+ deviceId = msg.content;
440
+ registerDevice();
441
+ } else {
442
+ registerDevice();
443
+ }
444
+ } else {
445
+ if (onReceiveLogging) {
446
+ if (workerId > 0) {
447
+ Utility.asyncStepLogger(workerId + '\t Ping Response at (' + new Date() + ')');
448
+ } else {
449
+ Utility.asyncStepLogger('Ping Response at (' + new Date() + ')');
450
+ }
451
+ }
452
+ }
453
+ },
454
+ registerDevice = function (isRetry) {
455
+ if (asyncLogging) {
456
+ if (workerId > 0) {
457
+ Utility.asyncStepLogger(workerId + '\t Registering Device');
458
+ } else {
459
+ Utility.asyncStepLogger('Registering Device');
460
+ }
461
+ }
462
+ var content = {
463
+ appId: appId,
464
+ deviceId: deviceId
465
+ };
466
+ if (peerId !== undefined) {
467
+ content.refresh = true;
468
+ content.renew = false;
469
+ } else {
470
+ content.renew = true;
471
+ content.refresh = false;
472
+ }
473
+ pushSendData({
474
+ type: asyncMessageType.DEVICE_REGISTER,
475
+ content: content
476
+ });
477
+ },
478
+ handleDeviceRegisterMessage = function (recievedPeerId) {
479
+ if (!isDeviceRegister) {
480
+ if (registerDeviceTimeoutId) {
481
+ clearTimeout(registerDeviceTimeoutId);
482
+ }
483
+ isDeviceRegister = true;
484
+ peerId = recievedPeerId;
485
+ }
486
+
487
+ /**
488
+ * If serverRegisteration == true we have to register
489
+ * on server then make async status ready
490
+ */
491
+ if (serverRegisteration) {
492
+ if (isServerRegister && peerId === oldPeerId) {
493
+ fireEvent('asyncReady');
494
+ isServerRegister = true;
495
+ pushSendDataQueueHandler();
496
+ socketState = socketStateType.OPEN;
497
+ fireEvent('stateChange', {
498
+ socketState: socketState,
499
+ timeUntilReconnect: 0,
500
+ deviceRegister: isDeviceRegister,
501
+ serverRegister: isServerRegister,
502
+ peerId: peerId
503
+ });
504
+ } else {
505
+ socketState = socketStateType.OPEN;
506
+ fireEvent('stateChange', {
507
+ socketState: socketState,
508
+ timeUntilReconnect: 0,
509
+ deviceRegister: isDeviceRegister,
510
+ serverRegister: isServerRegister,
511
+ peerId: peerId
512
+ });
513
+ registerServer();
514
+ }
515
+ } else {
516
+ fireEvent('asyncReady');
517
+ isServerRegister = 'Not Needed';
518
+ pushSendDataQueueHandler();
519
+ if (asyncLogging) {
520
+ if (workerId > 0) {
521
+ Utility.asyncStepLogger(workerId + '\t Async is Ready');
522
+ } else {
523
+ Utility.asyncStepLogger('Async is Ready');
524
+ }
525
+ }
526
+ socketState = socketStateType.OPEN;
527
+ fireEvent('stateChange', {
528
+ socketState: socketState,
529
+ timeUntilReconnect: 0,
530
+ deviceRegister: isDeviceRegister,
531
+ serverRegister: isServerRegister,
532
+ peerId: peerId
533
+ });
534
+ }
535
+ },
536
+ registerServer = function () {
537
+ if (asyncLogging) {
538
+ if (workerId > 0) {
539
+ Utility.asyncStepLogger(workerId + '\t Registering Server');
540
+ } else {
541
+ Utility.asyncStepLogger('Registering Server');
542
+ }
543
+ }
544
+ var content = {
545
+ name: serverName
546
+ };
547
+ pushSendData({
548
+ type: asyncMessageType.SERVER_REGISTER,
549
+ content: content
550
+ });
551
+ registerServerTimeoutId = setTimeout(function () {
552
+ if (!isServerRegister) {
553
+ registerServer();
554
+ }
555
+ }, connectionRetryInterval);
556
+ },
557
+ handleServerRegisterMessage = function (msg) {
558
+ if (msg.senderName && msg.senderName === serverName) {
559
+ isServerRegister = true;
560
+ if (registerServerTimeoutId) {
561
+ clearTimeout(registerServerTimeoutId);
562
+ }
563
+ socketState = socketStateType.OPEN;
564
+ fireEvent('stateChange', {
565
+ socketState: socketState,
566
+ timeUntilReconnect: 0,
567
+ deviceRegister: isDeviceRegister,
568
+ serverRegister: isServerRegister,
569
+ peerId: peerId
570
+ });
571
+ fireEvent('asyncReady');
572
+ pushSendDataQueueHandler();
573
+ if (asyncLogging) {
574
+ if (workerId > 0) {
575
+ Utility.asyncStepLogger(workerId + '\t Async is Ready');
576
+ } else {
577
+ Utility.asyncStepLogger('Async is Ready');
578
+ }
579
+ }
580
+ } else {
581
+ isServerRegister = false;
582
+ }
583
+ },
584
+ pushSendData = function (msg) {
585
+ if (onSendLogging) {
586
+ asyncLogger('Send', msg);
587
+ }
588
+ switch (protocol) {
589
+ case 'websocket':
590
+ if (socketState === socketStateType.OPEN) {
591
+ socket.emit(msg);
592
+ } else {
593
+ pushSendDataQueue.push(msg);
594
+ }
595
+ break;
596
+ case 'webrtc':
597
+ if (socketState === socketStateType.OPEN) {
598
+ webRTCClass.emit(msg);
599
+ } else {
600
+ pushSendDataQueue.push(msg);
601
+ }
602
+ break;
603
+ }
604
+ },
605
+ clearTimeouts = function () {
606
+ registerDeviceTimeoutId && clearTimeout(registerDeviceTimeoutId);
607
+ registerServerTimeoutId && clearTimeout(registerServerTimeoutId);
608
+ checkIfSocketHasOpennedTimeoutId && clearTimeout(checkIfSocketHasOpennedTimeoutId);
609
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
610
+ },
611
+ pushSendDataQueueHandler = function () {
612
+ while (pushSendDataQueue.length > 0 && socketState === socketStateType.OPEN) {
613
+ var msg = pushSendDataQueue.splice(0, 1)[0];
614
+ pushSendData(msg);
615
+ }
616
+ },
617
+ fireEvent = function (eventName, param, ack) {
618
+ // try {
619
+ if (ack) {
620
+ for (var id in eventCallbacks[eventName]) {
621
+ eventCallbacks[eventName][id](param, ack);
622
+ }
623
+ } else {
624
+ for (var id in eventCallbacks[eventName]) {
625
+ eventCallbacks[eventName][id](param);
626
+ }
627
+ }
628
+ // }
629
+ // catch (e) {
630
+ // fireEvent('error', {
631
+ // errorCode: 999,
632
+ // errorMessage: 'Unknown ERROR!',
633
+ // errorEvent: e
634
+ // });
635
+ // }
636
+ };
637
+
638
+ /*******************************************************
639
+ * P U B L I C M E T H O D S *
640
+ *******************************************************/
641
+
642
+ this.on = function (eventName, callback) {
643
+ if (eventCallbacks[eventName]) {
644
+ var id = Utility.generateUUID();
645
+ eventCallbacks[eventName][id] = callback;
646
+ return id;
647
+ }
648
+ if (eventName === 'connect' && socketState === socketStateType.OPEN) {
649
+ callback(peerId);
650
+ }
651
+ };
652
+ this.send = function (params, callback) {
653
+ var messageType = typeof params.type === 'number' ? params.type : callback ? asyncMessageType.MESSAGE_SENDER_ACK_NEEDED : asyncMessageType.MESSAGE;
654
+ var socketData = {
655
+ type: messageType,
656
+ uniqueId: params.uniqueId ? params.uniqueId : undefined,
657
+ content: params.content
658
+ };
659
+ if (params.trackerId) {
660
+ socketData.trackerId = params.trackerId;
661
+ }
662
+ lastMessageId += 1;
663
+ var messageId = lastMessageId;
664
+ if (messageType === asyncMessageType.MESSAGE_SENDER_ACK_NEEDED || messageType === asyncMessageType.MESSAGE_ACK_NEEDED) {
665
+ ackCallback[messageId] = function () {
666
+ callback && callback();
667
+ };
668
+ }
669
+ socketData.content.messageId = messageId;
670
+ socketData.content.ttl = messageTtl;
671
+ pushSendData(socketData);
672
+ };
673
+ this.getAsyncState = function () {
674
+ return socketState;
675
+ };
676
+ this.getSendQueue = function () {
677
+ return pushSendDataQueue;
678
+ };
679
+ this.getPeerId = function () {
680
+ return peerId;
681
+ };
682
+ this.getServerName = function () {
683
+ return serverName;
684
+ };
685
+ this.setServerName = function (newServerName) {
686
+ serverName = newServerName;
687
+ };
688
+ this.setDeviceId = function (newDeviceId) {
689
+ deviceId = newDeviceId;
690
+ };
691
+ this.close = function () {
692
+ oldPeerId = peerId;
693
+ isDeviceRegister = false;
694
+ isSocketOpen = false;
695
+ clearTimeouts();
696
+ switch (protocol) {
697
+ case 'websocket':
698
+ socketState = socketStateType.CLOSED;
699
+ fireEvent('stateChange', {
700
+ socketState: socketState,
701
+ timeUntilReconnect: 0,
702
+ deviceRegister: isDeviceRegister,
703
+ serverRegister: isServerRegister,
704
+ peerId: peerId
705
+ });
706
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
707
+ socket.close();
708
+ break;
709
+ case 'webrtc':
710
+ socketState = socketStateType.CLOSED;
711
+ fireEvent('stateChange', {
712
+ socketState: socketState,
713
+ timeUntilReconnect: 0,
714
+ deviceRegister: isDeviceRegister,
715
+ serverRegister: isServerRegister,
716
+ peerId: peerId
717
+ });
718
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
719
+ webRTCClass.close();
720
+ break;
721
+ }
722
+ };
723
+ this.logout = function () {
724
+ oldPeerId = peerId;
725
+ peerId = undefined;
726
+ isServerRegister = false;
727
+ isDeviceRegister = false;
728
+ isSocketOpen = false;
729
+ deviceId = undefined;
730
+ pushSendDataQueue = [];
731
+ ackCallback = {};
732
+ clearTimeouts();
733
+ switch (protocol) {
734
+ case 'websocket':
735
+ socketState = socketStateType.CLOSED;
736
+ fireEvent('stateChange', {
737
+ socketState: socketState,
738
+ timeUntilReconnect: 0,
739
+ deviceRegister: isDeviceRegister,
740
+ serverRegister: isServerRegister,
741
+ peerId: peerId
742
+ });
743
+ reconnOnClose.set(false);
744
+ // reconnectOnClose = false;
745
+
746
+ socket.close();
747
+ break;
748
+ case 'webrtc':
749
+ socketState = socketStateType.CLOSED;
750
+ fireEvent('stateChange', {
751
+ socketState: socketState,
752
+ timeUntilReconnect: 0,
753
+ deviceRegister: isDeviceRegister,
754
+ serverRegister: isServerRegister,
755
+ peerId: peerId
756
+ });
757
+ reconnOnClose.set(false);
758
+ // reconnectOnClose = false;
759
+ webRTCClass.close();
760
+ break;
761
+ }
762
+ };
763
+ let reconnectSocketTimeout;
764
+ this.reconnectSocket = function () {
765
+ oldPeerId = peerId;
766
+ isDeviceRegister = false;
767
+ isSocketOpen = false;
768
+ clearTimeouts();
769
+ socketState = socketStateType.CLOSED;
770
+ fireEvent('stateChange', {
771
+ socketState: socketState,
772
+ timeUntilReconnect: 0,
773
+ deviceRegister: isDeviceRegister,
774
+ serverRegister: isServerRegister,
775
+ peerId: peerId
776
+ });
777
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
778
+ if (protocol === "websocket") socket.close();else if (protocol == "webrtc") webRTCClass.close();
779
+
780
+ // let tmpReconnectOnClose = reconnectOnClose;
781
+ // reconnectOnClose = false;
782
+ if (reconnOnClose.getOld() == null) reconnOnClose.setOld(reconnOnClose.get());
783
+ reconnOnClose.set(false);
784
+ retryStep.set(0);
785
+ if (protocol === "websocket") socket.connect();else if (protocol == "webrtc") webRTCClass.connect();
786
+ reconnectSocketTimeout && clearTimeout(reconnectSocketTimeout);
787
+ reconnectSocketTimeout = setTimeout(function () {
788
+ // retryStep = 4;
789
+ retryStep.set(0);
790
+ // reconnectOnClose = tmpReconnectOnClose;
791
+ reconnOnClose.set(reconnOnClose.getOld());
792
+ if (socketState != socketStateType.OPEN) {
793
+ if (protocol === "websocket") socket.connect();else if (protocol == "webrtc") webRTCClass.connect();
794
+ }
795
+
796
+ // if(protocol === "websocket")
797
+ // socket.connect();
798
+ // else if(protocol == "webrtc")
799
+ // webRTCClass.connect()
800
+ }, 4000);
801
+ };
802
+ this.generateUUID = Utility.generateUUID;
803
+ init();
804
+ }
805
+ if (typeof module !== 'undefined' && typeof module.exports != 'undefined') {
806
+ module.exports = Async;
807
+ } else {
808
+ if (!window.POD) {
809
+ window.POD = {};
810
+ }
811
+ window.POD.Async = Async;
812
+ }
813
+ })();