瀏覽代碼

fix(GlobalOnErrorHandler) avoid calling it when we handle the error

release-8443
Saúl Ibarra Corretgé 1 年之前
父節點
當前提交
30cb694dff

+ 0
- 4
JitsiConference.js 查看文件

38
 import LocalStatsCollector from './modules/statistics/LocalStatsCollector';
38
 import LocalStatsCollector from './modules/statistics/LocalStatsCollector';
39
 import SpeakerStatsCollector from './modules/statistics/SpeakerStatsCollector';
39
 import SpeakerStatsCollector from './modules/statistics/SpeakerStatsCollector';
40
 import Statistics from './modules/statistics/statistics';
40
 import Statistics from './modules/statistics/statistics';
41
-import GlobalOnErrorHandler from './modules/util/GlobalOnErrorHandler';
42
 import { safeSubtract } from './modules/util/MathUtil';
41
 import { safeSubtract } from './modules/util/MathUtil';
43
 import RandomUtil from './modules/util/RandomUtil';
42
 import RandomUtil from './modules/util/RandomUtil';
44
 import ComponentsVersions from './modules/version/ComponentsVersions';
43
 import ComponentsVersions from './modules/version/ComponentsVersions';
2195
                 enableInsertableStreams: this.isE2EEEnabled() || FeatureFlags.isRunInLiteModeEnabled()
2194
                 enableInsertableStreams: this.isE2EEEnabled() || FeatureFlags.isRunInLiteModeEnabled()
2196
             });
2195
             });
2197
     } catch (error) {
2196
     } catch (error) {
2198
-        GlobalOnErrorHandler.callErrorHandler(error);
2199
         logger.error(error);
2197
         logger.error(error);
2200
 
2198
 
2201
         return;
2199
         return;
2223
                 }
2221
                 }
2224
             },
2222
             },
2225
             error => {
2223
             error => {
2226
-                GlobalOnErrorHandler.callErrorHandler(error);
2227
                 logger.error('Failed to accept incoming Jingle session', error);
2224
                 logger.error('Failed to accept incoming Jingle session', error);
2228
             },
2225
             },
2229
             localTracks
2226
             localTracks
2235
 
2232
 
2236
         this.statistics.startRemoteStats(this.jvbJingleSession.peerconnection);
2233
         this.statistics.startRemoteStats(this.jvbJingleSession.peerconnection);
2237
     } catch (e) {
2234
     } catch (e) {
2238
-        GlobalOnErrorHandler.callErrorHandler(e);
2239
         logger.error(e);
2235
         logger.error(e);
2240
     }
2236
     }
2241
 };
2237
 };

+ 0
- 2
modules/RTC/BridgeChannel.js 查看文件

4
 import RTCEvents from '../../service/RTC/RTCEvents';
4
 import RTCEvents from '../../service/RTC/RTCEvents';
5
 import { createBridgeChannelClosedEvent } from '../../service/statistics/AnalyticsEvents';
5
 import { createBridgeChannelClosedEvent } from '../../service/statistics/AnalyticsEvents';
6
 import Statistics from '../statistics/statistics';
6
 import Statistics from '../statistics/statistics';
7
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
8
 
7
 
9
 const logger = getLogger(__filename);
8
 const logger = getLogger(__filename);
10
 
9
 
295
             try {
294
             try {
296
                 obj = safeJsonParse(data);
295
                 obj = safeJsonParse(data);
297
             } catch (error) {
296
             } catch (error) {
298
-                GlobalOnErrorHandler.callErrorHandler(error);
299
                 logger.error('Failed to parse channel message as JSON: ', data, error);
297
                 logger.error('Failed to parse channel message as JSON: ', data, error);
300
 
298
 
301
                 return;
299
                 return;

+ 0
- 2
modules/RTC/RTC.js 查看文件

5
 import { MediaType } from '../../service/RTC/MediaType';
5
 import { MediaType } from '../../service/RTC/MediaType';
6
 import RTCEvents from '../../service/RTC/RTCEvents';
6
 import RTCEvents from '../../service/RTC/RTCEvents';
7
 import browser from '../browser';
7
 import browser from '../browser';
8
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
9
 import Listenable from '../util/Listenable';
8
 import Listenable from '../util/Listenable';
10
 import { safeCounterIncrement } from '../util/MathUtil';
9
 import { safeCounterIncrement } from '../util/MathUtil';
11
 
10
 
198
 
197
 
199
         this._channelOpenListener = () => {
198
         this._channelOpenListener = () => {
200
             const logError = (error, msgType, value) => {
199
             const logError = (error, msgType, value) => {
201
-                GlobalOnErrorHandler.callErrorHandler(error);
202
                 logger.error(`Cannot send ${msgType}(${JSON.stringify(value)}) endpoint message`, error);
200
                 logger.error(`Cannot send ${msgType}(${JSON.stringify(value)}) endpoint message`, error);
203
             };
201
             };
204
 
202
 

+ 1
- 7
modules/RTC/RTCUtils.js 查看文件

12
 import { AVAILABLE_DEVICE } from '../../service/statistics/AnalyticsEvents';
12
 import { AVAILABLE_DEVICE } from '../../service/statistics/AnalyticsEvents';
13
 import browser from '../browser';
13
 import browser from '../browser';
14
 import Statistics from '../statistics/statistics';
14
 import Statistics from '../statistics/statistics';
15
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
16
 import Listenable from '../util/Listenable';
15
 import Listenable from '../util/Listenable';
17
 
16
 
18
 import screenObtainer from './ScreenObtainer';
17
 import screenObtainer from './ScreenObtainer';
873
 
872
 
874
                 // we skip setting audio output if there was no explicit change
873
                 // we skip setting audio output if there was no explicit change
875
                 && audioOutputChanged) {
874
                 && audioOutputChanged) {
876
-            return element.setSinkId(rtcUtils.getAudioOutputDevice()).catch(function(ex) {
875
+            return element.setSinkId(rtcUtils.getAudioOutputDevice()).catch(ex => {
877
                 const err
876
                 const err
878
                     = new JitsiTrackError(ex, null, [ 'audiooutput' ]);
877
                     = new JitsiTrackError(ex, null, [ 'audiooutput' ]);
879
 
878
 
880
-                GlobalOnErrorHandler.callUnhandledRejectionHandler({
881
-                    promise: this, // eslint-disable-line no-invalid-this
882
-                    reason: err
883
-                });
884
-
885
                 logger.warn(
879
                 logger.warn(
886
                     'Failed to set audio output device for the element.'
880
                     'Failed to set audio output device for the element.'
887
                         + ' Default audio output device will be used'
881
                         + ' Default audio output device will be used'

+ 12
- 18
modules/RTC/TraceablePeerConnection.js 查看文件

19
 import SdpConsistency from '../sdp/SdpConsistency';
19
 import SdpConsistency from '../sdp/SdpConsistency';
20
 import SdpSimulcast from '../sdp/SdpSimulcast';
20
 import SdpSimulcast from '../sdp/SdpSimulcast';
21
 import { SdpTransformWrap } from '../sdp/SdpTransformUtil';
21
 import { SdpTransformWrap } from '../sdp/SdpTransformUtil';
22
-import * as GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
23
 
22
 
24
 import JitsiRemoteTrack from './JitsiRemoteTrack';
23
 import JitsiRemoteTrack from './JitsiRemoteTrack';
25
 import RTC from './RTC';
24
 import RTC from './RTC';
959
 
958
 
960
     // look up an associated JID for a stream id
959
     // look up an associated JID for a stream id
961
     if (!mediaType) {
960
     if (!mediaType) {
962
-        GlobalOnErrorHandler.callErrorHandler(
963
-            new Error(`MediaType undefined for remote track, stream id: ${streamId}, track creation failed!`));
961
+        logger.error(`MediaType undefined for remote track, stream id: ${streamId}, track creation failed!`);
964
 
962
 
965
         return;
963
         return;
966
     }
964
     }
988
     }
986
     }
989
 
987
 
990
     if (!mediaLine) {
988
     if (!mediaLine) {
991
-        GlobalOnErrorHandler.callErrorHandler(
992
-            new Error(`Matching media line not found in remote SDP for remote stream[id=${streamId},type=${mediaType}],`
993
-                + 'track creation failed!'));
989
+        logger.error(`Matching media line not found in remote SDP for remote stream[id=${streamId},type=${mediaType}],`
990
+                + 'track creation failed!');
994
 
991
 
995
         return;
992
         return;
996
     }
993
     }
999
 
996
 
1000
     ssrcLines = ssrcLines.filter(line => line.indexOf(`msid:${streamId}`) !== -1);
997
     ssrcLines = ssrcLines.filter(line => line.indexOf(`msid:${streamId}`) !== -1);
1001
     if (!ssrcLines.length) {
998
     if (!ssrcLines.length) {
1002
-        GlobalOnErrorHandler.callErrorHandler(
1003
-            new Error(`No SSRC lines found in remote SDP for remote stream[msid=${streamId},type=${mediaType}]`
1004
-                + 'track creation failed!'));
999
+        logger.error(`No SSRC lines found in remote SDP for remote stream[msid=${streamId},type=${mediaType}]`
1000
+                + 'track creation failed!');
1005
 
1001
 
1006
         return;
1002
         return;
1007
     }
1003
     }
1013
     const ownerEndpointId = this.signalingLayer.getSSRCOwner(trackSsrc);
1009
     const ownerEndpointId = this.signalingLayer.getSSRCOwner(trackSsrc);
1014
 
1010
 
1015
     if (isNaN(trackSsrc) || trackSsrc < 0) {
1011
     if (isNaN(trackSsrc) || trackSsrc < 0) {
1016
-        GlobalOnErrorHandler.callErrorHandler(
1017
-            new Error(`Invalid SSRC for remote stream[ssrc=${trackSsrc},id=${streamId},type=${mediaType}]`
1018
-                + 'track creation failed!'));
1012
+        logger.error(`Invalid SSRC for remote stream[ssrc=${trackSsrc},id=${streamId},type=${mediaType}]`
1013
+                + 'track creation failed!');
1019
 
1014
 
1020
         return;
1015
         return;
1021
     }
1016
     }
1022
 
1017
 
1023
     if (!ownerEndpointId) {
1018
     if (!ownerEndpointId) {
1024
-        GlobalOnErrorHandler.callErrorHandler(
1025
-            new Error(`No SSRC owner known for remote stream[ssrc=${trackSsrc},id=${streamId},type=${mediaType}]`
1026
-            + 'track creation failed!'));
1019
+        logger.error(`No SSRC owner known for remote stream[ssrc=${trackSsrc},id=${streamId},type=${mediaType}]`
1020
+            + 'track creation failed!');
1027
 
1021
 
1028
         return;
1022
         return;
1029
     }
1023
     }
1152
     }
1146
     }
1153
 
1147
 
1154
     if (!streamId) {
1148
     if (!streamId) {
1155
-        GlobalOnErrorHandler.callErrorHandler(new Error(`${this} remote track removal failed - no stream ID`));
1149
+        logger.error(`${this} remote track removal failed - no stream ID`);
1156
 
1150
 
1157
         return;
1151
         return;
1158
     }
1152
     }
1159
 
1153
 
1160
     if (!trackId) {
1154
     if (!trackId) {
1161
-        GlobalOnErrorHandler.callErrorHandler(new Error(`${this} remote track removal failed - no track ID`));
1155
+        logger.error(`${this} remote track removal failed - no track ID`);
1162
 
1156
 
1163
         return;
1157
         return;
1164
     }
1158
     }
1167
         remoteTrack => remoteTrack.getStreamId() === streamId && remoteTrack.getTrackId() === trackId);
1161
         remoteTrack => remoteTrack.getStreamId() === streamId && remoteTrack.getTrackId() === trackId);
1168
 
1162
 
1169
     if (!toBeRemoved) {
1163
     if (!toBeRemoved) {
1170
-        GlobalOnErrorHandler.callErrorHandler(new Error(`${this} remote track removal failed - track not found`));
1164
+        logger.error(`${this} remote track removal failed - track not found`);
1171
 
1165
 
1172
         return;
1166
         return;
1173
     }
1167
     }

+ 0
- 4
modules/statistics/RTPStatsCollector.js 查看文件

5
 import browser from '../browser';
5
 import browser from '../browser';
6
 import FeatureFlags from '../flags/FeatureFlags';
6
 import FeatureFlags from '../flags/FeatureFlags';
7
 
7
 
8
-const GlobalOnErrorHandler = require('../util/GlobalOnErrorHandler');
9
-
10
 const logger = getLogger(__filename);
8
 const logger = getLogger(__filename);
11
 
9
 
12
 /**
10
 /**
185
  * @param error an error that occurred on <tt>getStats</tt> call.
183
  * @param error an error that occurred on <tt>getStats</tt> call.
186
  */
184
  */
187
 StatsCollector.prototype.errorCallback = function(error) {
185
 StatsCollector.prototype.errorCallback = function(error) {
188
-    GlobalOnErrorHandler.callErrorHandler(error);
189
     logger.error('Get stats error', error);
186
     logger.error('Get stats error', error);
190
     this.stop();
187
     this.stop();
191
 };
188
 };
228
                 try {
225
                 try {
229
                     this.processStatsReport();
226
                     this.processStatsReport();
230
                 } catch (error) {
227
                 } catch (error) {
231
-                    GlobalOnErrorHandler.callErrorHandler(error);
232
                     logger.error('Processing of RTP stats failed:', error);
228
                     logger.error('Processing of RTP stats failed:', error);
233
                 }
229
                 }
234
                 this.previousStatsReport = this.currentStatsReport;
230
                 this.previousStatsReport = this.currentStatsReport;

+ 1
- 8
modules/xmpp/ChatRoom.js 查看文件

11
 import { XMPPEvents } from '../../service/xmpp/XMPPEvents';
11
 import { XMPPEvents } from '../../service/xmpp/XMPPEvents';
12
 import Settings from '../settings/Settings';
12
 import Settings from '../settings/Settings';
13
 import EventEmitterForwarder from '../util/EventEmitterForwarder';
13
 import EventEmitterForwarder from '../util/EventEmitterForwarder';
14
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
15
 import Listenable from '../util/Listenable';
14
 import Listenable from '../util/Listenable';
16
 
15
 
17
 import AVModeration from './AVModeration';
16
 import AVModeration from './AVModeration';
404
                 }
403
                 }
405
             }
404
             }
406
         }, error => {
405
         }, error => {
407
-            GlobalOnErrorHandler.callErrorHandler(error);
408
             logger.error('Error getting room info: ', error);
406
             logger.error('Error getting room info: ', error);
409
         });
407
         });
410
     }
408
     }
445
             if (!$(form).find(
443
             if (!$(form).find(
446
                     '>query>x[xmlns="jabber:x:data"]'
444
                     '>query>x[xmlns="jabber:x:data"]'
447
                     + '>field[var="muc#roomconfig_whois"]').length) {
445
                     + '>field[var="muc#roomconfig_whois"]').length) {
448
-                const errmsg = 'non-anonymous rooms not supported';
449
-
450
-                GlobalOnErrorHandler.callErrorHandler(new Error(errmsg));
451
-                logger.error(errmsg);
446
+                logger.error('non-anonymous rooms not supported');
452
 
447
 
453
                 return;
448
                 return;
454
             }
449
             }
470
             this.connection.sendIQ(formSubmit);
465
             this.connection.sendIQ(formSubmit);
471
 
466
 
472
         }, error => {
467
         }, error => {
473
-            GlobalOnErrorHandler.callErrorHandler(error);
474
             logger.error('Error getting room configuration form: ', error);
468
             logger.error('Error getting room configuration form: ', error);
475
         });
469
         });
476
     }
470
     }
895
                 });
889
                 });
896
             }
890
             }
897
         } catch (e) {
891
         } catch (e) {
898
-            GlobalOnErrorHandler.callErrorHandler(e);
899
             logger.error(`Error processing:${node.tagName} node.`, e);
892
             logger.error(`Error processing:${node.tagName} node.`, e);
900
         }
893
         }
901
     }
894
     }

+ 2
- 8
modules/xmpp/JingleSessionPC.js 查看文件

17
 import SDPUtil from '../sdp/SDPUtil';
17
 import SDPUtil from '../sdp/SDPUtil';
18
 import Statistics from '../statistics/statistics';
18
 import Statistics from '../statistics/statistics';
19
 import AsyncQueue, { ClearedQueueError } from '../util/AsyncQueue';
19
 import AsyncQueue, { ClearedQueueError } from '../util/AsyncQueue';
20
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
21
 
20
 
22
 import browser from './../browser';
21
 import browser from './../browser';
23
 import JingleSession from './JingleSession';
22
 import JingleSession from './JingleSession';
706
             const jcand = SDPUtil.candidateToJingle(candidate.candidate);
705
             const jcand = SDPUtil.candidateToJingle(candidate.candidate);
707
 
706
 
708
             if (!(ice && jcand)) {
707
             if (!(ice && jcand)) {
709
-                const errorMesssage = 'failed to get ice && jcand';
710
-
711
-                GlobalOnErrorHandler.callErrorHandler(new Error(errorMesssage));
712
-                logger.error(errorMesssage);
708
+                logger.error('failed to get ice && jcand');
713
 
709
 
714
                 return;
710
                 return;
715
             }
711
             }
2777
                 // We don't want to have that logged on error level.
2773
                 // We don't want to have that logged on error level.
2778
                 logger.debug(`${this} Jingle error: ${JSON.stringify(error)}`);
2774
                 logger.debug(`${this} Jingle error: ${JSON.stringify(error)}`);
2779
             } else {
2775
             } else {
2780
-                GlobalOnErrorHandler.callErrorHandler(
2781
-                    new Error(
2782
-                        `Jingle error: ${JSON.stringify(error)}`));
2776
+                logger.error(`Jingle error: ${JSON.stringify(error)}`);
2783
             }
2777
             }
2784
         };
2778
         };
2785
     }
2779
     }

+ 2
- 10
modules/xmpp/moderator.js 查看文件

11
 const AuthenticationEvents
11
 const AuthenticationEvents
12
     = require('../../service/authentication/AuthenticationEvents');
12
     = require('../../service/authentication/AuthenticationEvents');
13
 const { XMPPEvents } = require('../../service/xmpp/XMPPEvents');
13
 const { XMPPEvents } = require('../../service/xmpp/XMPPEvents');
14
-const GlobalOnErrorHandler = require('../util/GlobalOnErrorHandler');
15
 
14
 
16
 const logger = getLogger(__filename);
15
 const logger = getLogger(__filename);
17
 
16
 
449
             window.setTimeout(() => this.sendConferenceRequest(roomJid)
448
             window.setTimeout(() => this.sendConferenceRequest(roomJid)
450
                 .then(callback), waitMs);
449
                 .then(callback), waitMs);
451
         } else {
450
         } else {
452
-            const errmsg = 'Failed to get a successful response, giving up.';
453
-            const error = new Error(errmsg);
454
-
455
-            logger.error(errmsg, error);
456
-            GlobalOnErrorHandler.callErrorHandler(error);
451
+            logger.error('Failed to get a successful response, giving up.');
457
 
452
 
458
             // This is a "fatal" error and the user of the lib should handle it accordingly.
453
             // This is a "fatal" error and the user of the lib should handle it accordingly.
459
             // TODO: change the event name to something accurate.
454
             // TODO: change the event name to something accurate.
579
                 callback();
574
                 callback();
580
             },
575
             },
581
             error => {
576
             error => {
582
-                const errmsg = 'Logout error';
583
-
584
-                GlobalOnErrorHandler.callErrorHandler(new Error(errmsg));
585
-                logger.error(errmsg, error);
577
+                logger.error('Logout error', error);
586
             }
578
             }
587
         );
579
         );
588
     }
580
     }

+ 0
- 2
modules/xmpp/strophe.jingle.js 查看文件

11
 } from '../../service/statistics/AnalyticsEvents';
11
 } from '../../service/statistics/AnalyticsEvents';
12
 import { XMPPEvents } from '../../service/xmpp/XMPPEvents';
12
 import { XMPPEvents } from '../../service/xmpp/XMPPEvents';
13
 import Statistics from '../statistics/statistics';
13
 import Statistics from '../statistics/statistics';
14
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
15
 import RandomUtil from '../util/RandomUtil';
14
 import RandomUtil from '../util/RandomUtil';
16
 
15
 
17
 import ConnectionPlugin from './ConnectionPlugin';
16
 import ConnectionPlugin from './ConnectionPlugin';
285
                         value: successTime
284
                         value: successTime
286
                     }));
285
                     }));
287
             }, error => {
286
             }, error => {
288
-                GlobalOnErrorHandler.callErrorHandler(error);
289
                 logger.error('Transport replace failed', error);
287
                 logger.error('Transport replace failed', error);
290
                 sess.sendTransportReject();
288
                 sess.sendTransportReject();
291
             });
289
             });

+ 0
- 3
modules/xmpp/strophe.ping.js 查看文件

1
 import { getLogger } from '@jitsi/logger';
1
 import { getLogger } from '@jitsi/logger';
2
 import { $iq, Strophe } from 'strophe.js';
2
 import { $iq, Strophe } from 'strophe.js';
3
 
3
 
4
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
5
-
6
 import ConnectionPlugin from './ConnectionPlugin';
4
 import ConnectionPlugin from './ConnectionPlugin';
7
 
5
 
8
 
6
 
129
                 const errmsg = `Ping ${error ? 'error' : 'timeout'}`;
127
                 const errmsg = `Ping ${error ? 'error' : 'timeout'}`;
130
 
128
 
131
                 if (this.failedPings >= this.pingThreshold) {
129
                 if (this.failedPings >= this.pingThreshold) {
132
-                    GlobalOnErrorHandler.callErrorHandler(new Error(errmsg));
133
                     logger.error(errmsg, error);
130
                     logger.error(errmsg, error);
134
                     this._onPingThresholdExceeded && this._onPingThresholdExceeded();
131
                     this._onPingThresholdExceeded && this._onPingThresholdExceeded();
135
                 } else {
132
                 } else {

+ 1
- 6
modules/xmpp/strophe.util.js 查看文件

4
 import { getLogger } from '@jitsi/logger';
4
 import { getLogger } from '@jitsi/logger';
5
 import { Strophe } from 'strophe.js';
5
 import { Strophe } from 'strophe.js';
6
 
6
 
7
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
8
-
9
 const logger = getLogger(__filename);
7
 const logger = getLogger(__filename);
10
 
8
 
11
 /**
9
 /**
83
             break;
81
             break;
84
         case Strophe.LogLevel.ERROR:
82
         case Strophe.LogLevel.ERROR:
85
         case Strophe.LogLevel.FATAL:
83
         case Strophe.LogLevel.FATAL:
86
-            // eslint-disable-next-line no-param-reassign
87
-            msg = `Strophe: ${msg}`;
88
-            GlobalOnErrorHandler.callErrorHandler(new Error(msg));
89
-            logger.error(msg);
84
+            logger.error(`Strophe: ${msg}`, msg);
90
             break;
85
             break;
91
         }
86
         }
92
 
87
 

+ 1
- 6
modules/xmpp/xmpp.js 查看文件

11
 import { E2EEncryption } from '../e2ee/E2EEncryption';
11
 import { E2EEncryption } from '../e2ee/E2EEncryption';
12
 import FeatureFlags from '../flags/FeatureFlags';
12
 import FeatureFlags from '../flags/FeatureFlags';
13
 import Statistics from '../statistics/statistics';
13
 import Statistics from '../statistics/statistics';
14
-import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
15
 import Listenable from '../util/Listenable';
14
 import Listenable from '../util/Listenable';
16
 import RandomUtil from '../util/RandomUtil';
15
 import RandomUtil from '../util/RandomUtil';
17
 
16
 
339
                         identities, undefined /* when querying we will query for features */);
338
                         identities, undefined /* when querying we will query for features */);
340
                 })
339
                 })
341
                 .catch(error => {
340
                 .catch(error => {
342
-                    const errmsg = 'Feature discovery error';
343
-
344
-                    GlobalOnErrorHandler.callErrorHandler(
345
-                        new Error(`${errmsg}: ${error}`));
346
-                    logger.error(errmsg, error);
341
+                    logger.error('Feature discovery error', error);
347
 
342
 
348
                     this._maybeSendDeploymentInfoStat(true);
343
                     this._maybeSendDeploymentInfoStat(true);
349
                 });
344
                 });

Loading…
取消
儲存