@@ -11,6 +11,7 @@ import 'package:sendbird_chat_sdk/src/internal/main/chat_context/chat_context.da
1111import 'package:sendbird_chat_sdk/src/internal/main/chat_manager/collection_manager/collection_manager.dart' ;
1212import 'package:sendbird_chat_sdk/src/internal/main/chat_manager/event_manager.dart' ;
1313import 'package:sendbird_chat_sdk/src/internal/main/connection_state/connected_state.dart' ;
14+ import 'package:sendbird_chat_sdk/src/internal/main/connection_state/delayed_connecting_state.dart' ;
1415import 'package:sendbird_chat_sdk/src/internal/main/logger/sendbird_logger.dart' ;
1516import 'package:sendbird_chat_sdk/src/internal/main/model/delivery_status.dart' ;
1617import 'package:sendbird_chat_sdk/src/internal/main/model/read_status.dart' ;
@@ -233,6 +234,8 @@ class CommandManager {
233234 await _processSessionRefresh (cmd);
234235 } else if (cmd.isLogin) {
235236 await _processLogin (cmd);
237+ } else if (cmd.isBusy) {
238+ await _processBusy (cmd);
236239 } else if (cmd.isSessionExpired) {
237240 await _processSessionExpired (cmd);
238241 } else if (cmd.isNewMessage) {
@@ -341,6 +344,7 @@ class CommandManager {
341344 _chat.chatContext
342345 ..currentUser = event.user
343346 ..currentUserId = event.user.userId
347+ ..nickname = event.user.nickname
344348 ..sessionKey = event.sessionKey
345349 ..eKey = event.eKey
346350 ..appInfo = event.appInfo
@@ -398,6 +402,70 @@ class CommandManager {
398402 }
399403 }
400404
405+ Future <void > _processBusy (Command cmd) async {
406+ int ? retryAfter;
407+ int ? reasonCode;
408+ String ? message;
409+
410+ if (cmd.payload['retry_after' ] != null &&
411+ cmd.payload['retry_after' ] is int &&
412+ cmd.payload['retry_after' ] >= 0 ) {
413+ retryAfter = cmd.payload['retry_after' ] as int ;
414+
415+ if (cmd.payload['reason_code' ] != null &&
416+ cmd.payload['reason_code' ] is int ) {
417+ reasonCode = cmd.payload['reason_code' ] as int ;
418+ }
419+
420+ if (cmd.payload['message' ] != null && cmd.payload['message' ] is String ) {
421+ message = cmd.payload['message' ] as String ;
422+ }
423+
424+ final e = ServerOverloadedException (
425+ message: message,
426+ data: {
427+ 'retry_after' : retryAfter,
428+ 'reason_code' : reasonCode,
429+ 'message' : message,
430+ },
431+ );
432+
433+ if (_chat.connectionManager.isConnecting ()) {
434+ _chat.statManager.endWsConnectStat (
435+ hostUrl: _chat.chatContext.connectingUrl ?? '' ,
436+ success: false ,
437+ errorCode: e.code,
438+ errorDescription: e.message,
439+ accumTrial: 1 ,
440+ );
441+
442+ if (_chat.chatContext.loginCompleter != null &&
443+ ! _chat.chatContext.loginCompleter! .isCompleted) {
444+ _chat.chatContext.loginCompleter? .completeError (e);
445+ }
446+ } else if (_chat.connectionManager.isReconnecting ()) {
447+ _chat.statManager.endWsConnectStat (
448+ hostUrl: _chat.chatContext.reconnectTask? .url ?? '' ,
449+ success: false ,
450+ errorCode: e.code,
451+ errorDescription: e.message,
452+ accumTrial: _chat.chatContext.reconnectTask? .retryCount ?? 1 ,
453+ connectionId:
454+ _chat.chatContext.reconnectTask? .id ?? const Uuid ().v1 (),
455+ );
456+ } else if (_chat.connectionManager.isConnected ()) {
457+ await _chat.connectionManager.disconnect (logout: false );
458+ }
459+
460+ _chat.connectionManager.changeState (DelayedConnectingState (
461+ chat: _chat,
462+ retryAfter: retryAfter,
463+ reasonCode: reasonCode,
464+ message: message,
465+ ));
466+ }
467+ }
468+
401469 Future <void > _enterEnteredOpenChannels () async {
402470 final enteredOpenChannelUrlCopied = {
403471 ..._chat.chatContext.enteredOpenChannelUrls
@@ -654,7 +722,7 @@ class CommandManager {
654722 }
655723 }
656724
657- // only for open channel and broadcast channel
725+ // only for open channel and broadcast channel
658726 Future <void > _processMemberCountChange (Command cmd) async {
659727 final event = MCNTEvent .fromJsonWithChat (_chat, cmd.payload);
660728
0 commit comments