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

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,814 @@
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: 4,
104
+ oldValue: 4,
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
+ console.log("on.close", reconnOnClose.get(), reconnOnClose.getOld());
198
+ isSocketOpen = false;
199
+ isDeviceRegister = false;
200
+ oldPeerId = peerId;
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
+ socketState = socketStateType.CLOSED;
224
+ fireEvent('stateChange', {
225
+ socketState: socketState,
226
+ timeUntilReconnect: 1000 * retryStep.get(),
227
+ deviceRegister: isDeviceRegister,
228
+ serverRegister: isServerRegister,
229
+ peerId: peerId
230
+ });
231
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
232
+ socketReconnectRetryInterval = setTimeout(function () {
233
+ socket.connect();
234
+ }, 1000 * retryStep.get());
235
+ if (retryStep.get() < 64) {
236
+ // retryStep += 3;
237
+ retryStep.set(retryStep.get() + 3);
238
+ }
239
+
240
+ // socketReconnectCheck && clearTimeout(socketReconnectCheck);
241
+ //
242
+ // socketReconnectCheck = setTimeout(function() {
243
+ // if (!isSocketOpen) {
244
+ // fireEvent("error", {
245
+ // errorCode: 4001,
246
+ // errorMessage: "Can not open Socket!"
247
+ // });
248
+ //
249
+ // socketState = socketStateType.CLOSED;
250
+ // fireEvent("stateChange", {
251
+ // socketState: socketState,
252
+ // deviceRegister: isDeviceRegister,
253
+ // serverRegister: isServerRegister,
254
+ // peerId: peerId
255
+ // });
256
+ // }
257
+ // }, 65000);
258
+ } else {
259
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
260
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
261
+ fireEvent('error', {
262
+ errorCode: 4005,
263
+ errorMessage: 'Socket Closed!'
264
+ });
265
+ socketState = socketStateType.CLOSED;
266
+ fireEvent('stateChange', {
267
+ socketState: socketState,
268
+ timeUntilReconnect: 0,
269
+ deviceRegister: isDeviceRegister,
270
+ serverRegister: isServerRegister,
271
+ peerId: peerId
272
+ });
273
+ }
274
+ });
275
+ socket.on('customError', function (error) {
276
+ fireEvent('error', {
277
+ errorCode: error.errorCode,
278
+ errorMessage: error.errorMessage,
279
+ errorEvent: error.errorEvent
280
+ });
281
+ });
282
+ socket.on('error', function (error) {
283
+ fireEvent('error', {
284
+ errorCode: '',
285
+ errorMessage: '',
286
+ errorEvent: error
287
+ });
288
+ });
289
+ },
290
+ initWebrtc = function () {
291
+ webRTCClass = new WebRTCClass({
292
+ baseUrl: webrtcConfig ? webrtcConfig.baseUrl : null,
293
+ configuration: webrtcConfig ? webrtcConfig.configuration : null,
294
+ connectionCheckTimeout: params.connectionCheckTimeout,
295
+ logLevel: logLevel
296
+ });
297
+ checkIfSocketHasOpennedTimeoutId = setTimeout(function () {
298
+ if (!isSocketOpen) {
299
+ fireEvent('error', {
300
+ errorCode: 4001,
301
+ errorMessage: 'Can not open Socket!'
302
+ });
303
+ }
304
+ }, 65000);
305
+ webRTCClass.on('open', function () {
306
+ checkIfSocketHasOpennedTimeoutId && clearTimeout(checkIfSocketHasOpennedTimeoutId);
307
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
308
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
309
+ isSocketOpen = true;
310
+ retryStep.set(4);
311
+ socketState = socketStateType.OPEN;
312
+ fireEvent('stateChange', {
313
+ socketState: socketState,
314
+ timeUntilReconnect: 0,
315
+ deviceRegister: isDeviceRegister,
316
+ serverRegister: isServerRegister,
317
+ peerId: peerId
318
+ });
319
+ });
320
+ webRTCClass.on('message', function (msg) {
321
+ console.log({
322
+ msg
323
+ });
324
+ handleSocketMessage(msg);
325
+ if (onReceiveLogging) {
326
+ asyncLogger('Receive', msg);
327
+ }
328
+ });
329
+ webRTCClass.on('close', function (event) {
330
+ isSocketOpen = false;
331
+ isDeviceRegister = false;
332
+ oldPeerId = peerId;
333
+ fireEvent('disconnect', event);
334
+ if (reconnOnClose.get()) {
335
+ if (asyncLogging) {
336
+ if (workerId > 0) {
337
+ Utility.asyncStepLogger(workerId + '\t Reconnecting after ' + retryStep.get() + 's');
338
+ } else {
339
+ Utility.asyncStepLogger('Reconnecting after ' + retryStep.get() + 's');
340
+ }
341
+ }
342
+ logLevel.debug && console.debug("[Async][async.js] on connection close, retryStep:", retryStep.get());
343
+ socketState = socketStateType.CLOSED;
344
+ fireEvent('stateChange', {
345
+ socketState: socketState,
346
+ timeUntilReconnect: 1000 * retryStep.get(),
347
+ deviceRegister: isDeviceRegister,
348
+ serverRegister: isServerRegister,
349
+ peerId: peerId
350
+ });
351
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
352
+ socketReconnectRetryInterval = setTimeout(function () {
353
+ webRTCClass.connect();
354
+ }, 1000 * retryStep.get());
355
+ if (retryStep.get() < 64) {
356
+ // retryStep += 3;
357
+ retryStep.set(retryStep.get() + 3);
358
+ }
359
+ } else {
360
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
361
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
362
+ fireEvent('error', {
363
+ errorCode: 4005,
364
+ errorMessage: 'Connection Closed!'
365
+ });
366
+ socketState = socketStateType.CLOSED;
367
+ fireEvent('stateChange', {
368
+ socketState: socketState,
369
+ timeUntilReconnect: 0,
370
+ deviceRegister: isDeviceRegister,
371
+ serverRegister: isServerRegister,
372
+ peerId: peerId
373
+ });
374
+ }
375
+ });
376
+ webRTCClass.on('customError', function (error) {
377
+ fireEvent('error', {
378
+ errorCode: error.errorCode,
379
+ errorMessage: error.errorMessage,
380
+ errorEvent: error.errorEvent
381
+ });
382
+ });
383
+ webRTCClass.on('error', function (error) {
384
+ fireEvent('error', {
385
+ errorCode: '',
386
+ errorMessage: '',
387
+ errorEvent: error
388
+ });
389
+ });
390
+ },
391
+ handleSocketMessage = function (msg) {
392
+ var ack;
393
+ if (msg.type === asyncMessageType.MESSAGE_ACK_NEEDED || msg.type === asyncMessageType.MESSAGE_SENDER_ACK_NEEDED) {
394
+ ack = function () {
395
+ pushSendData({
396
+ type: asyncMessageType.ACK,
397
+ content: {
398
+ messageId: msg.id
399
+ }
400
+ });
401
+ };
402
+ }
403
+ switch (msg.type) {
404
+ case asyncMessageType.PING:
405
+ handlePingMessage(msg);
406
+ break;
407
+ case asyncMessageType.SERVER_REGISTER:
408
+ handleServerRegisterMessage(msg);
409
+ break;
410
+ case asyncMessageType.DEVICE_REGISTER:
411
+ handleDeviceRegisterMessage(msg.content);
412
+ break;
413
+ case asyncMessageType.MESSAGE:
414
+ fireEvent('message', msg);
415
+ break;
416
+ case asyncMessageType.MESSAGE_ACK_NEEDED:
417
+ case asyncMessageType.MESSAGE_SENDER_ACK_NEEDED:
418
+ ack();
419
+ fireEvent('message', msg);
420
+ break;
421
+ case asyncMessageType.ACK:
422
+ fireEvent('message', msg);
423
+ if (ackCallback[msg.senderMessageId] == 'function') {
424
+ ackCallback[msg.senderMessageId]();
425
+ delete ackCallback[msg.senderMessageId];
426
+ }
427
+ break;
428
+ case asyncMessageType.ERROR_MESSAGE:
429
+ fireEvent('error', {
430
+ errorCode: 4002,
431
+ errorMessage: 'Async Error!',
432
+ errorEvent: msg
433
+ });
434
+ break;
435
+ }
436
+ },
437
+ handlePingMessage = function (msg) {
438
+ if (msg.content) {
439
+ if (deviceId === undefined) {
440
+ deviceId = msg.content;
441
+ registerDevice();
442
+ } else {
443
+ registerDevice();
444
+ }
445
+ } else {
446
+ if (onReceiveLogging) {
447
+ if (workerId > 0) {
448
+ Utility.asyncStepLogger(workerId + '\t Ping Response at (' + new Date() + ')');
449
+ } else {
450
+ Utility.asyncStepLogger('Ping Response at (' + new Date() + ')');
451
+ }
452
+ }
453
+ }
454
+ },
455
+ registerDevice = function (isRetry) {
456
+ if (asyncLogging) {
457
+ if (workerId > 0) {
458
+ Utility.asyncStepLogger(workerId + '\t Registering Device');
459
+ } else {
460
+ Utility.asyncStepLogger('Registering Device');
461
+ }
462
+ }
463
+ var content = {
464
+ appId: appId,
465
+ deviceId: deviceId
466
+ };
467
+ if (peerId !== undefined) {
468
+ content.refresh = true;
469
+ content.renew = false;
470
+ } else {
471
+ content.renew = true;
472
+ content.refresh = false;
473
+ }
474
+ pushSendData({
475
+ type: asyncMessageType.DEVICE_REGISTER,
476
+ content: content
477
+ });
478
+ },
479
+ handleDeviceRegisterMessage = function (recievedPeerId) {
480
+ if (!isDeviceRegister) {
481
+ if (registerDeviceTimeoutId) {
482
+ clearTimeout(registerDeviceTimeoutId);
483
+ }
484
+ isDeviceRegister = true;
485
+ peerId = recievedPeerId;
486
+ }
487
+
488
+ /**
489
+ * If serverRegisteration == true we have to register
490
+ * on server then make async status ready
491
+ */
492
+ if (serverRegisteration) {
493
+ if (isServerRegister && peerId === oldPeerId) {
494
+ fireEvent('asyncReady');
495
+ isServerRegister = true;
496
+ pushSendDataQueueHandler();
497
+ socketState = socketStateType.OPEN;
498
+ fireEvent('stateChange', {
499
+ socketState: socketState,
500
+ timeUntilReconnect: 0,
501
+ deviceRegister: isDeviceRegister,
502
+ serverRegister: isServerRegister,
503
+ peerId: peerId
504
+ });
505
+ } else {
506
+ socketState = socketStateType.OPEN;
507
+ fireEvent('stateChange', {
508
+ socketState: socketState,
509
+ timeUntilReconnect: 0,
510
+ deviceRegister: isDeviceRegister,
511
+ serverRegister: isServerRegister,
512
+ peerId: peerId
513
+ });
514
+ registerServer();
515
+ }
516
+ } else {
517
+ fireEvent('asyncReady');
518
+ isServerRegister = 'Not Needed';
519
+ pushSendDataQueueHandler();
520
+ if (asyncLogging) {
521
+ if (workerId > 0) {
522
+ Utility.asyncStepLogger(workerId + '\t Async is Ready');
523
+ } else {
524
+ Utility.asyncStepLogger('Async is Ready');
525
+ }
526
+ }
527
+ socketState = socketStateType.OPEN;
528
+ fireEvent('stateChange', {
529
+ socketState: socketState,
530
+ timeUntilReconnect: 0,
531
+ deviceRegister: isDeviceRegister,
532
+ serverRegister: isServerRegister,
533
+ peerId: peerId
534
+ });
535
+ }
536
+ },
537
+ registerServer = function () {
538
+ if (asyncLogging) {
539
+ if (workerId > 0) {
540
+ Utility.asyncStepLogger(workerId + '\t Registering Server');
541
+ } else {
542
+ Utility.asyncStepLogger('Registering Server');
543
+ }
544
+ }
545
+ var content = {
546
+ name: serverName
547
+ };
548
+ pushSendData({
549
+ type: asyncMessageType.SERVER_REGISTER,
550
+ content: content
551
+ });
552
+ registerServerTimeoutId = setTimeout(function () {
553
+ if (!isServerRegister) {
554
+ registerServer();
555
+ }
556
+ }, connectionRetryInterval);
557
+ },
558
+ handleServerRegisterMessage = function (msg) {
559
+ if (msg.senderName && msg.senderName === serverName) {
560
+ isServerRegister = true;
561
+ if (registerServerTimeoutId) {
562
+ clearTimeout(registerServerTimeoutId);
563
+ }
564
+ socketState = socketStateType.OPEN;
565
+ fireEvent('stateChange', {
566
+ socketState: socketState,
567
+ timeUntilReconnect: 0,
568
+ deviceRegister: isDeviceRegister,
569
+ serverRegister: isServerRegister,
570
+ peerId: peerId
571
+ });
572
+ fireEvent('asyncReady');
573
+ pushSendDataQueueHandler();
574
+ if (asyncLogging) {
575
+ if (workerId > 0) {
576
+ Utility.asyncStepLogger(workerId + '\t Async is Ready');
577
+ } else {
578
+ Utility.asyncStepLogger('Async is Ready');
579
+ }
580
+ }
581
+ } else {
582
+ isServerRegister = false;
583
+ }
584
+ },
585
+ pushSendData = function (msg) {
586
+ if (onSendLogging) {
587
+ asyncLogger('Send', msg);
588
+ }
589
+ switch (protocol) {
590
+ case 'websocket':
591
+ if (socketState === socketStateType.OPEN) {
592
+ socket.emit(msg);
593
+ } else {
594
+ pushSendDataQueue.push(msg);
595
+ }
596
+ break;
597
+ case 'webrtc':
598
+ if (socketState === socketStateType.OPEN) {
599
+ webRTCClass.emit(msg);
600
+ } else {
601
+ pushSendDataQueue.push(msg);
602
+ }
603
+ break;
604
+ }
605
+ },
606
+ clearTimeouts = function () {
607
+ registerDeviceTimeoutId && clearTimeout(registerDeviceTimeoutId);
608
+ registerServerTimeoutId && clearTimeout(registerServerTimeoutId);
609
+ checkIfSocketHasOpennedTimeoutId && clearTimeout(checkIfSocketHasOpennedTimeoutId);
610
+ socketReconnectCheck && clearTimeout(socketReconnectCheck);
611
+ },
612
+ pushSendDataQueueHandler = function () {
613
+ while (pushSendDataQueue.length > 0 && socketState === socketStateType.OPEN) {
614
+ var msg = pushSendDataQueue.splice(0, 1)[0];
615
+ pushSendData(msg);
616
+ }
617
+ },
618
+ fireEvent = function (eventName, param, ack) {
619
+ // try {
620
+ if (ack) {
621
+ for (var id in eventCallbacks[eventName]) {
622
+ eventCallbacks[eventName][id](param, ack);
623
+ }
624
+ } else {
625
+ for (var id in eventCallbacks[eventName]) {
626
+ eventCallbacks[eventName][id](param);
627
+ }
628
+ }
629
+ // }
630
+ // catch (e) {
631
+ // fireEvent('error', {
632
+ // errorCode: 999,
633
+ // errorMessage: 'Unknown ERROR!',
634
+ // errorEvent: e
635
+ // });
636
+ // }
637
+ };
638
+
639
+ /*******************************************************
640
+ * P U B L I C M E T H O D S *
641
+ *******************************************************/
642
+
643
+ this.on = function (eventName, callback) {
644
+ if (eventCallbacks[eventName]) {
645
+ var id = Utility.generateUUID();
646
+ eventCallbacks[eventName][id] = callback;
647
+ return id;
648
+ }
649
+ if (eventName === 'connect' && socketState === socketStateType.OPEN) {
650
+ callback(peerId);
651
+ }
652
+ };
653
+ this.send = function (params, callback) {
654
+ var messageType = typeof params.type === 'number' ? params.type : callback ? asyncMessageType.MESSAGE_SENDER_ACK_NEEDED : asyncMessageType.MESSAGE;
655
+ var socketData = {
656
+ type: messageType,
657
+ uniqueId: params.uniqueId ? params.uniqueId : undefined,
658
+ content: params.content
659
+ };
660
+ if (params.trackerId) {
661
+ socketData.trackerId = params.trackerId;
662
+ }
663
+ lastMessageId += 1;
664
+ var messageId = lastMessageId;
665
+ if (messageType === asyncMessageType.MESSAGE_SENDER_ACK_NEEDED || messageType === asyncMessageType.MESSAGE_ACK_NEEDED) {
666
+ ackCallback[messageId] = function () {
667
+ callback && callback();
668
+ };
669
+ }
670
+ socketData.content.messageId = messageId;
671
+ socketData.content.ttl = messageTtl;
672
+ pushSendData(socketData);
673
+ };
674
+ this.getAsyncState = function () {
675
+ return socketState;
676
+ };
677
+ this.getSendQueue = function () {
678
+ return pushSendDataQueue;
679
+ };
680
+ this.getPeerId = function () {
681
+ return peerId;
682
+ };
683
+ this.getServerName = function () {
684
+ return serverName;
685
+ };
686
+ this.setServerName = function (newServerName) {
687
+ serverName = newServerName;
688
+ };
689
+ this.setDeviceId = function (newDeviceId) {
690
+ deviceId = newDeviceId;
691
+ };
692
+ this.close = function () {
693
+ oldPeerId = peerId;
694
+ isDeviceRegister = false;
695
+ isSocketOpen = false;
696
+ clearTimeouts();
697
+ switch (protocol) {
698
+ case 'websocket':
699
+ socketState = socketStateType.CLOSED;
700
+ fireEvent('stateChange', {
701
+ socketState: socketState,
702
+ timeUntilReconnect: 0,
703
+ deviceRegister: isDeviceRegister,
704
+ serverRegister: isServerRegister,
705
+ peerId: peerId
706
+ });
707
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
708
+ socket.close();
709
+ break;
710
+ case 'webrtc':
711
+ socketState = socketStateType.CLOSED;
712
+ fireEvent('stateChange', {
713
+ socketState: socketState,
714
+ timeUntilReconnect: 0,
715
+ deviceRegister: isDeviceRegister,
716
+ serverRegister: isServerRegister,
717
+ peerId: peerId
718
+ });
719
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
720
+ webRTCClass.close();
721
+ break;
722
+ }
723
+ };
724
+ this.logout = function () {
725
+ oldPeerId = peerId;
726
+ peerId = undefined;
727
+ isServerRegister = false;
728
+ isDeviceRegister = false;
729
+ isSocketOpen = false;
730
+ deviceId = undefined;
731
+ pushSendDataQueue = [];
732
+ ackCallback = {};
733
+ clearTimeouts();
734
+ switch (protocol) {
735
+ case 'websocket':
736
+ socketState = socketStateType.CLOSED;
737
+ fireEvent('stateChange', {
738
+ socketState: socketState,
739
+ timeUntilReconnect: 0,
740
+ deviceRegister: isDeviceRegister,
741
+ serverRegister: isServerRegister,
742
+ peerId: peerId
743
+ });
744
+ reconnOnClose.set(false);
745
+ // reconnectOnClose = false;
746
+
747
+ socket.close();
748
+ break;
749
+ case 'webrtc':
750
+ socketState = socketStateType.CLOSED;
751
+ fireEvent('stateChange', {
752
+ socketState: socketState,
753
+ timeUntilReconnect: 0,
754
+ deviceRegister: isDeviceRegister,
755
+ serverRegister: isServerRegister,
756
+ peerId: peerId
757
+ });
758
+ reconnOnClose.set(false);
759
+ // reconnectOnClose = false;
760
+ webRTCClass.close();
761
+ break;
762
+ }
763
+ };
764
+ let reconnectSocketTimeout;
765
+ this.reconnectSocket = function () {
766
+ oldPeerId = peerId;
767
+ isDeviceRegister = false;
768
+ isSocketOpen = false;
769
+ clearTimeouts();
770
+ socketState = socketStateType.CLOSED;
771
+ fireEvent('stateChange', {
772
+ socketState: socketState,
773
+ timeUntilReconnect: 0,
774
+ deviceRegister: isDeviceRegister,
775
+ serverRegister: isServerRegister,
776
+ peerId: peerId
777
+ });
778
+ socketReconnectRetryInterval && clearTimeout(socketReconnectRetryInterval);
779
+ if (protocol === "websocket") socket.close();else if (protocol == "webrtc") webRTCClass.close();
780
+
781
+ // let tmpReconnectOnClose = reconnectOnClose;
782
+ // reconnectOnClose = false;
783
+ reconnOnClose.setOld(reconnOnClose.get());
784
+ reconnOnClose.set(false);
785
+ retryStep.set(0);
786
+ if (protocol === "websocket") socket.connect();else if (protocol == "webrtc") webRTCClass.connect();
787
+ reconnectSocketTimeout && clearTimeout(reconnectSocketTimeout);
788
+ reconnectSocketTimeout = setTimeout(function () {
789
+ // retryStep = 4;
790
+ retryStep.set(0);
791
+ // reconnectOnClose = tmpReconnectOnClose;
792
+ reconnOnClose.set(reconnOnClose.getOld());
793
+ if (socketState != socketStateType.OPEN) {
794
+ if (protocol === "websocket") socket.connect();else if (protocol == "webrtc") webRTCClass.connect();
795
+ }
796
+
797
+ // if(protocol === "websocket")
798
+ // socket.connect();
799
+ // else if(protocol == "webrtc")
800
+ // webRTCClass.connect()
801
+ }, 4000);
802
+ };
803
+ this.generateUUID = Utility.generateUUID;
804
+ init();
805
+ }
806
+ if (typeof module !== 'undefined' && typeof module.exports != 'undefined') {
807
+ module.exports = Async;
808
+ } else {
809
+ if (!window.POD) {
810
+ window.POD = {};
811
+ }
812
+ window.POD.Async = Async;
813
+ }
814
+ })();