@webex/plugin-meetings 3.7.0-next.52 → 3.7.0-next.54

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.
@@ -1 +1 @@
1
- {"version":3,"names":["BEHAVIORAL_METRICS","exports","default","MEETINGS_REGISTRATION_FAILED","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_STEP","MERCURY_CONNECTION_FAILURE","MERCURY_CONNECTION_RESTORED","JOIN_SUCCESS","JOIN_FAILURE","ADD_MEDIA_SUCCESS","ADD_MEDIA_FAILURE","ADD_MEDIA_RETRY","ROAP_MERCURY_EVENT_RECEIVED","CONNECTION_SUCCESS","CONNECTION_FAILURE","MEETING_LEAVE_FAILURE","MEETING_END_ALL_FAILURE","MEETING_END_ALL_INITIATED","GET_USER_MEDIA_FAILURE","GET_DISPLAY_MEDIA_FAILURE","JOIN_WITH_MEDIA_FAILURE","LLM_CONNECTION_AFTER_JOIN_FAILURE","RECEIVE_TRANSCRIPTION_AFTER_JOIN_FAILURE","DISCONNECT_DUE_TO_INACTIVITY","MEETING_MEDIA_INACTIVE","MEETING_RECONNECT_FAILURE","MEETING_MAX_REJOIN_FAILURE","MEETING_SHARE_SUCCESS","MEETING_SHARE_FAILURE","MEETING_START_WHITEBOARD_SHARE_FAILURE","MEETING_STOP_WHITEBOARD_SHARE_FAILURE","MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE","MUTE_AUDIO_FAILURE","MUTE_VIDEO_FAILURE","SET_MEETING_QUALITY_FAILURE","STOP_FLOOR_REQUEST_FAILURE","ADD_DIAL_IN_FAILURE","ADD_DIAL_OUT_FAILURE","UPDATE_MEDIA_FAILURE","UNMUTE_AUDIO_FAILURE","UNMUTE_VIDEO_FAILURE","ROAP_ANSWER_FAILURE","ROAP_GLARE_CONDITION","PEERCONNECTION_FAILURE","INVALID_ICE_CANDIDATE","UPLOAD_LOGS_FAILURE","UPLOAD_LOGS_SUCCESS","RECEIVE_TRANSCRIPTION_FAILURE","FETCH_MEETING_INFO_V1_SUCCESS","FETCH_MEETING_INFO_V1_FAILURE","ADHOC_MEETING_SUCCESS","ADHOC_MEETING_FAILURE","VERIFY_PASSWORD_SUCCESS","VERIFY_PASSWORD_ERROR","VERIFY_CAPTCHA_ERROR","MOVE_TO_SUCCESS","MOVE_TO_FAILURE","MOVE_FROM_SUCCESS","MOVE_FROM_FAILURE","TURN_DISCOVERY_FAILURE","MEETING_INFO_POLICY_ERROR","LOCUS_DELTA_SYNC_FAILED","LOCUS_DELTA_OUT_OF_ORDER","PERMISSION_TOKEN_REFRESH","PERMISSION_TOKEN_REFRESH_ERROR","TURN_DISCOVERY_LATENCY","ROAP_OFFER_TO_ANSWER_LATENCY","ROAP_HTTP_RESPONSE_MISSING","TURN_DISCOVERY_REQUIRES_OK","REACHABILITY_COMPLETED","JOIN_WEBINAR_ERROR","GUEST_ENTERED_LOBBY","GUEST_EXITED_LOBBY"],"sources":["constants.ts"],"sourcesContent":["// Metrics constants ----------------------------------------------------------\n\nconst BEHAVIORAL_METRICS = {\n MEETINGS_REGISTRATION_FAILED: 'js_sdk_meetings_registration_failed',\n MEETINGS_REGISTRATION_SUCCESS: 'js_sdk_meetings_registration_success',\n MEETINGS_REGISTRATION_STEP: 'meetings_registration_step',\n MERCURY_CONNECTION_FAILURE: 'js_sdk_mercury_connection_failure',\n MERCURY_CONNECTION_RESTORED: 'js_sdk_mercury_connection_restored',\n JOIN_SUCCESS: 'js_sdk_join_success',\n JOIN_FAILURE: 'js_sdk_join_failures',\n ADD_MEDIA_SUCCESS: 'js_sdk_add_media_success',\n ADD_MEDIA_FAILURE: 'js_sdk_add_media_failures',\n ADD_MEDIA_RETRY: 'js_sdk_add_media_retry',\n ROAP_MERCURY_EVENT_RECEIVED: 'js_sdk_roap_mercury_received',\n CONNECTION_SUCCESS: 'js_sdk_connection_success',\n CONNECTION_FAILURE: 'js_sdk_connection_failures',\n MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',\n MEETING_END_ALL_FAILURE: 'js_sdk_meeting_end_for_all_failure',\n MEETING_END_ALL_INITIATED: 'js_sdk_meeting_end_for_all_initiated',\n GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',\n GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',\n JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',\n LLM_CONNECTION_AFTER_JOIN_FAILURE: 'js_sdk_llm_connection_after_join_failure',\n RECEIVE_TRANSCRIPTION_AFTER_JOIN_FAILURE: 'js_sdk_receive_transcription_after_join_failure',\n\n DISCONNECT_DUE_TO_INACTIVITY: 'js_sdk_disconnect_due_to_inactivity',\n MEETING_MEDIA_INACTIVE: 'js_sdk_meeting_media_inactive',\n MEETING_RECONNECT_FAILURE: 'js_sdk_meeting_reconnect_failures',\n MEETING_MAX_REJOIN_FAILURE: 'js_sdk_meeting_max_rejoin_failure',\n MEETING_SHARE_SUCCESS: 'js_sdk_meeting_share_success',\n MEETING_SHARE_FAILURE: 'js_sdk_meeting_share_failures',\n MEETING_START_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_start_whiteboard_share_failures',\n MEETING_STOP_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_stop_whiteboard_share_failures',\n MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE: 'js_sdk_meeting_share_video_mute_state_change',\n MUTE_AUDIO_FAILURE: 'js_sdk_mute_audio_failures',\n MUTE_VIDEO_FAILURE: 'js_sdk_mute_video_failures',\n SET_MEETING_QUALITY_FAILURE: 'js_sdk_set_meeting_quality_failures',\n STOP_FLOOR_REQUEST_FAILURE: 'js_sdk_stop_floor_request_failures',\n ADD_DIAL_IN_FAILURE: 'js_sdk_add_dial_in_failure',\n ADD_DIAL_OUT_FAILURE: 'js_sdk_add_dial_out_failure',\n UPDATE_MEDIA_FAILURE: 'js_sdk_update_media_failures',\n UNMUTE_AUDIO_FAILURE: 'js_sdk_unmute_audio_failures',\n UNMUTE_VIDEO_FAILURE: 'js_sdk_unmute_video_failures',\n ROAP_ANSWER_FAILURE: 'js_sdk_roap_answer_failures',\n ROAP_GLARE_CONDITION: 'js_sdk_roap_glar_condition',\n PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',\n INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',\n UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',\n UPLOAD_LOGS_SUCCESS: 'js_sdk_upload_logs_success',\n RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure',\n FETCH_MEETING_INFO_V1_SUCCESS: 'js_sdk_fetch_meeting_info_v1_success',\n FETCH_MEETING_INFO_V1_FAILURE: 'js_sdk_fetch_meeting_info_v1_failure',\n ADHOC_MEETING_SUCCESS: 'js_sdk_adhoc_meeting_success',\n ADHOC_MEETING_FAILURE: 'js_sdk_adhoc_meeting_failure',\n VERIFY_PASSWORD_SUCCESS: 'js_sdk_verify_password_success',\n VERIFY_PASSWORD_ERROR: 'js_sdk_verify_password_error',\n VERIFY_CAPTCHA_ERROR: 'js_sdk_verify_captcha_error',\n MOVE_TO_SUCCESS: 'js_sdk_move_to_success',\n MOVE_TO_FAILURE: 'js_sdk_move_to_failure',\n MOVE_FROM_SUCCESS: 'js_sdk_move_from_success',\n MOVE_FROM_FAILURE: 'js_sdk_move_from_failure',\n TURN_DISCOVERY_FAILURE: 'js_sdk_turn_discovery_failure',\n MEETING_INFO_POLICY_ERROR: 'js_sdk_meeting_info_policy_error',\n LOCUS_DELTA_SYNC_FAILED: 'js_sdk_locus_delta_sync_failed',\n LOCUS_DELTA_OUT_OF_ORDER: 'js_sdk_locus_delta_ooo',\n PERMISSION_TOKEN_REFRESH: 'js_sdk_permission_token_refresh',\n PERMISSION_TOKEN_REFRESH_ERROR: 'js_sdk_permission_token_refresh_error',\n TURN_DISCOVERY_LATENCY: 'js_sdk_turn_discovery_latency',\n ROAP_OFFER_TO_ANSWER_LATENCY: 'js_sdk_roap_offer_to_answer_latency',\n ROAP_HTTP_RESPONSE_MISSING: 'js_sdk_roap_http_response_missing',\n TURN_DISCOVERY_REQUIRES_OK: 'js_sdk_turn_discovery_requires_ok',\n REACHABILITY_COMPLETED: 'js_sdk_reachability_completed',\n JOIN_WEBINAR_ERROR: 'js_sdk_join_webinar_error',\n GUEST_ENTERED_LOBBY: 'js_sdk_guest_entered_lobby',\n GUEST_EXITED_LOBBY: 'js_sdk_guest_exited_lobby',\n};\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":";;;;;;;AAAA;;AAEA,IAAMA,kBAAkB,GAAAC,OAAA,CAAAC,OAAA,GAAG;EACzBC,4BAA4B,EAAE,qCAAqC;EACnEC,6BAA6B,EAAE,sCAAsC;EACrEC,0BAA0B,EAAE,4BAA4B;EACxDC,0BAA0B,EAAE,mCAAmC;EAC/DC,2BAA2B,EAAE,oCAAoC;EACjEC,YAAY,EAAE,qBAAqB;EACnCC,YAAY,EAAE,sBAAsB;EACpCC,iBAAiB,EAAE,0BAA0B;EAC7CC,iBAAiB,EAAE,2BAA2B;EAC9CC,eAAe,EAAE,wBAAwB;EACzCC,2BAA2B,EAAE,8BAA8B;EAC3DC,kBAAkB,EAAE,2BAA2B;EAC/CC,kBAAkB,EAAE,4BAA4B;EAChDC,qBAAqB,EAAE,8BAA8B;EACrDC,uBAAuB,EAAE,oCAAoC;EAC7DC,yBAAyB,EAAE,sCAAsC;EACjEC,sBAAsB,EAAE,gCAAgC;EACxDC,yBAAyB,EAAE,mCAAmC;EAC9DC,uBAAuB,EAAE,iCAAiC;EAC1DC,iCAAiC,EAAE,0CAA0C;EAC7EC,wCAAwC,EAAE,iDAAiD;EAE3FC,4BAA4B,EAAE,qCAAqC;EACnEC,sBAAsB,EAAE,+BAA+B;EACvDC,yBAAyB,EAAE,mCAAmC;EAC9DC,0BAA0B,EAAE,mCAAmC;EAC/DC,qBAAqB,EAAE,8BAA8B;EACrDC,qBAAqB,EAAE,+BAA+B;EACtDC,sCAAsC,EAAE,gDAAgD;EACxFC,qCAAqC,EAAE,+CAA+C;EACtFC,qCAAqC,EAAE,8CAA8C;EACrFC,kBAAkB,EAAE,4BAA4B;EAChDC,kBAAkB,EAAE,4BAA4B;EAChDC,2BAA2B,EAAE,qCAAqC;EAClEC,0BAA0B,EAAE,oCAAoC;EAChEC,mBAAmB,EAAE,4BAA4B;EACjDC,oBAAoB,EAAE,6BAA6B;EACnDC,oBAAoB,EAAE,8BAA8B;EACpDC,oBAAoB,EAAE,8BAA8B;EACpDC,oBAAoB,EAAE,8BAA8B;EACpDC,mBAAmB,EAAE,6BAA6B;EAClDC,oBAAoB,EAAE,4BAA4B;EAClDC,sBAAsB,EAAE,gCAAgC;EACxDC,qBAAqB,EAAE,8BAA8B;EACrDC,mBAAmB,EAAE,4BAA4B;EACjDC,mBAAmB,EAAE,4BAA4B;EACjDC,6BAA6B,EAAE,sCAAsC;EACrEC,6BAA6B,EAAE,sCAAsC;EACrEC,6BAA6B,EAAE,sCAAsC;EACrEC,qBAAqB,EAAE,8BAA8B;EACrDC,qBAAqB,EAAE,8BAA8B;EACrDC,uBAAuB,EAAE,gCAAgC;EACzDC,qBAAqB,EAAE,8BAA8B;EACrDC,oBAAoB,EAAE,6BAA6B;EACnDC,eAAe,EAAE,wBAAwB;EACzCC,eAAe,EAAE,wBAAwB;EACzCC,iBAAiB,EAAE,0BAA0B;EAC7CC,iBAAiB,EAAE,0BAA0B;EAC7CC,sBAAsB,EAAE,+BAA+B;EACvDC,yBAAyB,EAAE,kCAAkC;EAC7DC,uBAAuB,EAAE,gCAAgC;EACzDC,wBAAwB,EAAE,wBAAwB;EAClDC,wBAAwB,EAAE,iCAAiC;EAC3DC,8BAA8B,EAAE,uCAAuC;EACvEC,sBAAsB,EAAE,+BAA+B;EACvDC,4BAA4B,EAAE,qCAAqC;EACnEC,0BAA0B,EAAE,mCAAmC;EAC/DC,0BAA0B,EAAE,mCAAmC;EAC/DC,sBAAsB,EAAE,+BAA+B;EACvDC,kBAAkB,EAAE,2BAA2B;EAC/CC,mBAAmB,EAAE,4BAA4B;EACjDC,kBAAkB,EAAE;AACtB,CAAC"}
1
+ {"version":3,"names":["BEHAVIORAL_METRICS","exports","default","MEETINGS_REGISTRATION_FAILED","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_STEP","MERCURY_CONNECTION_FAILURE","MERCURY_CONNECTION_RESTORED","JOIN_SUCCESS","JOIN_FAILURE","ADD_MEDIA_SUCCESS","ADD_MEDIA_FAILURE","ADD_MEDIA_RETRY","ROAP_MERCURY_EVENT_RECEIVED","CONNECTION_SUCCESS","CONNECTION_FAILURE","MEETING_LEAVE_FAILURE","MEETING_END_ALL_FAILURE","MEETING_END_ALL_INITIATED","GET_USER_MEDIA_FAILURE","GET_DISPLAY_MEDIA_FAILURE","JOIN_WITH_MEDIA_FAILURE","LLM_CONNECTION_AFTER_JOIN_FAILURE","RECEIVE_TRANSCRIPTION_AFTER_JOIN_FAILURE","DISCONNECT_DUE_TO_INACTIVITY","MEETING_MEDIA_INACTIVE","MEETING_RECONNECT_FAILURE","MEETING_MAX_REJOIN_FAILURE","MEETING_SHARE_SUCCESS","MEETING_SHARE_FAILURE","MEETING_START_WHITEBOARD_SHARE_FAILURE","MEETING_STOP_WHITEBOARD_SHARE_FAILURE","MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE","MUTE_AUDIO_FAILURE","MUTE_VIDEO_FAILURE","SET_MEETING_QUALITY_FAILURE","STOP_FLOOR_REQUEST_FAILURE","ADD_DIAL_IN_FAILURE","ADD_DIAL_OUT_FAILURE","UPDATE_MEDIA_FAILURE","UNMUTE_AUDIO_FAILURE","UNMUTE_VIDEO_FAILURE","ROAP_ANSWER_FAILURE","ROAP_GLARE_CONDITION","PEERCONNECTION_FAILURE","INVALID_ICE_CANDIDATE","UPLOAD_LOGS_FAILURE","UPLOAD_LOGS_SUCCESS","RECEIVE_TRANSCRIPTION_FAILURE","FETCH_MEETING_INFO_V1_SUCCESS","FETCH_MEETING_INFO_V1_FAILURE","ADHOC_MEETING_SUCCESS","ADHOC_MEETING_FAILURE","VERIFY_PASSWORD_SUCCESS","VERIFY_PASSWORD_ERROR","VERIFY_CAPTCHA_ERROR","MOVE_TO_SUCCESS","MOVE_TO_FAILURE","MOVE_FROM_SUCCESS","MOVE_FROM_FAILURE","TURN_DISCOVERY_FAILURE","MEETING_INFO_POLICY_ERROR","LOCUS_DELTA_SYNC_FAILED","LOCUS_DELTA_OUT_OF_ORDER","PERMISSION_TOKEN_REFRESH","PERMISSION_TOKEN_REFRESH_ERROR","TURN_DISCOVERY_LATENCY","ROAP_OFFER_TO_ANSWER_LATENCY","ROAP_HTTP_RESPONSE_MISSING","TURN_DISCOVERY_REQUIRES_OK","REACHABILITY_COMPLETED","JOIN_WEBINAR_ERROR","GUEST_ENTERED_LOBBY","GUEST_EXITED_LOBBY","JOIN_FORBIDDEN_ERROR"],"sources":["constants.ts"],"sourcesContent":["// Metrics constants ----------------------------------------------------------\n\nconst BEHAVIORAL_METRICS = {\n MEETINGS_REGISTRATION_FAILED: 'js_sdk_meetings_registration_failed',\n MEETINGS_REGISTRATION_SUCCESS: 'js_sdk_meetings_registration_success',\n MEETINGS_REGISTRATION_STEP: 'meetings_registration_step',\n MERCURY_CONNECTION_FAILURE: 'js_sdk_mercury_connection_failure',\n MERCURY_CONNECTION_RESTORED: 'js_sdk_mercury_connection_restored',\n JOIN_SUCCESS: 'js_sdk_join_success',\n JOIN_FAILURE: 'js_sdk_join_failures',\n ADD_MEDIA_SUCCESS: 'js_sdk_add_media_success',\n ADD_MEDIA_FAILURE: 'js_sdk_add_media_failures',\n ADD_MEDIA_RETRY: 'js_sdk_add_media_retry',\n ROAP_MERCURY_EVENT_RECEIVED: 'js_sdk_roap_mercury_received',\n CONNECTION_SUCCESS: 'js_sdk_connection_success',\n CONNECTION_FAILURE: 'js_sdk_connection_failures',\n MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',\n MEETING_END_ALL_FAILURE: 'js_sdk_meeting_end_for_all_failure',\n MEETING_END_ALL_INITIATED: 'js_sdk_meeting_end_for_all_initiated',\n GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',\n GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',\n JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',\n LLM_CONNECTION_AFTER_JOIN_FAILURE: 'js_sdk_llm_connection_after_join_failure',\n RECEIVE_TRANSCRIPTION_AFTER_JOIN_FAILURE: 'js_sdk_receive_transcription_after_join_failure',\n\n DISCONNECT_DUE_TO_INACTIVITY: 'js_sdk_disconnect_due_to_inactivity',\n MEETING_MEDIA_INACTIVE: 'js_sdk_meeting_media_inactive',\n MEETING_RECONNECT_FAILURE: 'js_sdk_meeting_reconnect_failures',\n MEETING_MAX_REJOIN_FAILURE: 'js_sdk_meeting_max_rejoin_failure',\n MEETING_SHARE_SUCCESS: 'js_sdk_meeting_share_success',\n MEETING_SHARE_FAILURE: 'js_sdk_meeting_share_failures',\n MEETING_START_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_start_whiteboard_share_failures',\n MEETING_STOP_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_stop_whiteboard_share_failures',\n MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE: 'js_sdk_meeting_share_video_mute_state_change',\n MUTE_AUDIO_FAILURE: 'js_sdk_mute_audio_failures',\n MUTE_VIDEO_FAILURE: 'js_sdk_mute_video_failures',\n SET_MEETING_QUALITY_FAILURE: 'js_sdk_set_meeting_quality_failures',\n STOP_FLOOR_REQUEST_FAILURE: 'js_sdk_stop_floor_request_failures',\n ADD_DIAL_IN_FAILURE: 'js_sdk_add_dial_in_failure',\n ADD_DIAL_OUT_FAILURE: 'js_sdk_add_dial_out_failure',\n UPDATE_MEDIA_FAILURE: 'js_sdk_update_media_failures',\n UNMUTE_AUDIO_FAILURE: 'js_sdk_unmute_audio_failures',\n UNMUTE_VIDEO_FAILURE: 'js_sdk_unmute_video_failures',\n ROAP_ANSWER_FAILURE: 'js_sdk_roap_answer_failures',\n ROAP_GLARE_CONDITION: 'js_sdk_roap_glar_condition',\n PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',\n INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',\n UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',\n UPLOAD_LOGS_SUCCESS: 'js_sdk_upload_logs_success',\n RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure',\n FETCH_MEETING_INFO_V1_SUCCESS: 'js_sdk_fetch_meeting_info_v1_success',\n FETCH_MEETING_INFO_V1_FAILURE: 'js_sdk_fetch_meeting_info_v1_failure',\n ADHOC_MEETING_SUCCESS: 'js_sdk_adhoc_meeting_success',\n ADHOC_MEETING_FAILURE: 'js_sdk_adhoc_meeting_failure',\n VERIFY_PASSWORD_SUCCESS: 'js_sdk_verify_password_success',\n VERIFY_PASSWORD_ERROR: 'js_sdk_verify_password_error',\n VERIFY_CAPTCHA_ERROR: 'js_sdk_verify_captcha_error',\n MOVE_TO_SUCCESS: 'js_sdk_move_to_success',\n MOVE_TO_FAILURE: 'js_sdk_move_to_failure',\n MOVE_FROM_SUCCESS: 'js_sdk_move_from_success',\n MOVE_FROM_FAILURE: 'js_sdk_move_from_failure',\n TURN_DISCOVERY_FAILURE: 'js_sdk_turn_discovery_failure',\n MEETING_INFO_POLICY_ERROR: 'js_sdk_meeting_info_policy_error',\n LOCUS_DELTA_SYNC_FAILED: 'js_sdk_locus_delta_sync_failed',\n LOCUS_DELTA_OUT_OF_ORDER: 'js_sdk_locus_delta_ooo',\n PERMISSION_TOKEN_REFRESH: 'js_sdk_permission_token_refresh',\n PERMISSION_TOKEN_REFRESH_ERROR: 'js_sdk_permission_token_refresh_error',\n TURN_DISCOVERY_LATENCY: 'js_sdk_turn_discovery_latency',\n ROAP_OFFER_TO_ANSWER_LATENCY: 'js_sdk_roap_offer_to_answer_latency',\n ROAP_HTTP_RESPONSE_MISSING: 'js_sdk_roap_http_response_missing',\n TURN_DISCOVERY_REQUIRES_OK: 'js_sdk_turn_discovery_requires_ok',\n REACHABILITY_COMPLETED: 'js_sdk_reachability_completed',\n JOIN_WEBINAR_ERROR: 'js_sdk_join_webinar_error',\n GUEST_ENTERED_LOBBY: 'js_sdk_guest_entered_lobby',\n GUEST_EXITED_LOBBY: 'js_sdk_guest_exited_lobby',\n JOIN_FORBIDDEN_ERROR: 'js_sdk_join_forbidden_error',\n};\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":";;;;;;;AAAA;;AAEA,IAAMA,kBAAkB,GAAAC,OAAA,CAAAC,OAAA,GAAG;EACzBC,4BAA4B,EAAE,qCAAqC;EACnEC,6BAA6B,EAAE,sCAAsC;EACrEC,0BAA0B,EAAE,4BAA4B;EACxDC,0BAA0B,EAAE,mCAAmC;EAC/DC,2BAA2B,EAAE,oCAAoC;EACjEC,YAAY,EAAE,qBAAqB;EACnCC,YAAY,EAAE,sBAAsB;EACpCC,iBAAiB,EAAE,0BAA0B;EAC7CC,iBAAiB,EAAE,2BAA2B;EAC9CC,eAAe,EAAE,wBAAwB;EACzCC,2BAA2B,EAAE,8BAA8B;EAC3DC,kBAAkB,EAAE,2BAA2B;EAC/CC,kBAAkB,EAAE,4BAA4B;EAChDC,qBAAqB,EAAE,8BAA8B;EACrDC,uBAAuB,EAAE,oCAAoC;EAC7DC,yBAAyB,EAAE,sCAAsC;EACjEC,sBAAsB,EAAE,gCAAgC;EACxDC,yBAAyB,EAAE,mCAAmC;EAC9DC,uBAAuB,EAAE,iCAAiC;EAC1DC,iCAAiC,EAAE,0CAA0C;EAC7EC,wCAAwC,EAAE,iDAAiD;EAE3FC,4BAA4B,EAAE,qCAAqC;EACnEC,sBAAsB,EAAE,+BAA+B;EACvDC,yBAAyB,EAAE,mCAAmC;EAC9DC,0BAA0B,EAAE,mCAAmC;EAC/DC,qBAAqB,EAAE,8BAA8B;EACrDC,qBAAqB,EAAE,+BAA+B;EACtDC,sCAAsC,EAAE,gDAAgD;EACxFC,qCAAqC,EAAE,+CAA+C;EACtFC,qCAAqC,EAAE,8CAA8C;EACrFC,kBAAkB,EAAE,4BAA4B;EAChDC,kBAAkB,EAAE,4BAA4B;EAChDC,2BAA2B,EAAE,qCAAqC;EAClEC,0BAA0B,EAAE,oCAAoC;EAChEC,mBAAmB,EAAE,4BAA4B;EACjDC,oBAAoB,EAAE,6BAA6B;EACnDC,oBAAoB,EAAE,8BAA8B;EACpDC,oBAAoB,EAAE,8BAA8B;EACpDC,oBAAoB,EAAE,8BAA8B;EACpDC,mBAAmB,EAAE,6BAA6B;EAClDC,oBAAoB,EAAE,4BAA4B;EAClDC,sBAAsB,EAAE,gCAAgC;EACxDC,qBAAqB,EAAE,8BAA8B;EACrDC,mBAAmB,EAAE,4BAA4B;EACjDC,mBAAmB,EAAE,4BAA4B;EACjDC,6BAA6B,EAAE,sCAAsC;EACrEC,6BAA6B,EAAE,sCAAsC;EACrEC,6BAA6B,EAAE,sCAAsC;EACrEC,qBAAqB,EAAE,8BAA8B;EACrDC,qBAAqB,EAAE,8BAA8B;EACrDC,uBAAuB,EAAE,gCAAgC;EACzDC,qBAAqB,EAAE,8BAA8B;EACrDC,oBAAoB,EAAE,6BAA6B;EACnDC,eAAe,EAAE,wBAAwB;EACzCC,eAAe,EAAE,wBAAwB;EACzCC,iBAAiB,EAAE,0BAA0B;EAC7CC,iBAAiB,EAAE,0BAA0B;EAC7CC,sBAAsB,EAAE,+BAA+B;EACvDC,yBAAyB,EAAE,kCAAkC;EAC7DC,uBAAuB,EAAE,gCAAgC;EACzDC,wBAAwB,EAAE,wBAAwB;EAClDC,wBAAwB,EAAE,iCAAiC;EAC3DC,8BAA8B,EAAE,uCAAuC;EACvEC,sBAAsB,EAAE,+BAA+B;EACvDC,4BAA4B,EAAE,qCAAqC;EACnEC,0BAA0B,EAAE,mCAAmC;EAC/DC,0BAA0B,EAAE,mCAAmC;EAC/DC,sBAAsB,EAAE,+BAA+B;EACvDC,kBAAkB,EAAE,2BAA2B;EAC/CC,mBAAmB,EAAE,4BAA4B;EACjDC,kBAAkB,EAAE,2BAA2B;EAC/CC,oBAAoB,EAAE;AACxB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Error occurred while join the meeting
3
+ */
4
+ export default class JoinForbiddenError extends Error {
5
+ code: number;
6
+ error: any;
7
+ sdkMessage: string;
8
+ wbxAppApiCode: number;
9
+ /**
10
+ * @constructor
11
+ * @param {String} [message]
12
+ * @param {Object} [error]
13
+ */
14
+ constructor(message?: string, error?: any);
15
+ }
@@ -140,6 +140,7 @@ export declare const ICE_AND_DTLS_CONNECTION_TIMEOUT = 20000;
140
140
  export declare const ROAP_OFFER_ANSWER_EXCHANGE_TIMEOUT = 35000;
141
141
  export declare const WEBINAR_ERROR_WEBCAST: number[];
142
142
  export declare const WEBINAR_ERROR_REGISTRATIONID: number[];
143
+ export declare const JOIN_BEFORE_HOST = 403003;
143
144
  export declare const DIALER_REGEX: {
144
145
  SIP_ADDRESS: RegExp;
145
146
  PHONE_NUMBER: RegExp;
@@ -432,6 +433,11 @@ export declare const ERROR_DICTIONARY: {
432
433
  MESSAGE: string;
433
434
  CODE: number;
434
435
  };
436
+ JoinForbiddenError: {
437
+ NAME: string;
438
+ MESSAGE: string;
439
+ CODE: number;
440
+ };
435
441
  };
436
442
  export declare const FLOOR_ACTION: {
437
443
  GRANTED: string;
@@ -1112,6 +1118,8 @@ export declare const MEETING_INFO_FAILURE_REASON: {
1112
1118
  WEBINAR_REGISTRATION: string;
1113
1119
  NEED_JOIN_WITH_WEBCAST: string;
1114
1120
  WEBINAR_NEED_REGISTRATIONID: string;
1121
+ NOT_REACH_JBH: string;
1122
+ JOIN_FORBIDDEN: string;
1115
1123
  OTHER: string;
1116
1124
  };
1117
1125
  export declare const BNR_STATUS: {
@@ -81,6 +81,23 @@ export declare class MeetingInfoV2JoinWebinarError extends Error {
81
81
  */
82
82
  constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string);
83
83
  }
84
+ /**
85
+ * Error preventing join because of a forbidden error
86
+ */
87
+ export declare class MeetingInfoV2JoinForbiddenError extends Error {
88
+ meetingInfo: any;
89
+ sdkMessage: any;
90
+ wbxAppApiCode: any;
91
+ body: any;
92
+ /**
93
+ *
94
+ * @constructor
95
+ * @param {Number} [wbxAppApiErrorCode]
96
+ * @param {Object} [meetingInfo]
97
+ * @param {String} [message]
98
+ */
99
+ constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string);
100
+ }
84
101
  /**
85
102
  * @class MeetingInfo
86
103
  */
@@ -112,6 +129,12 @@ export default class MeetingInfoV2 {
112
129
  * @returns {void}
113
130
  */
114
131
  handleJoinWebinarError: (err: any) => void;
132
+ /**
133
+ * Raises a handleForbiddenError for join meeting forbidden error
134
+ * @param {any} err the error from the request
135
+ * @returns {void}
136
+ */
137
+ handleForbiddenError: (err: any) => void;
115
138
  /**
116
139
  * Creates adhoc space meetings for a space by fetching the conversation infomation
117
140
  * @param {String} conversationUrl conversationUrl to start adhoc meeting on
@@ -70,5 +70,6 @@ declare const BEHAVIORAL_METRICS: {
70
70
  JOIN_WEBINAR_ERROR: string;
71
71
  GUEST_ENTERED_LOBBY: string;
72
72
  GUEST_EXITED_LOBBY: string;
73
+ JOIN_FORBIDDEN_ERROR: string;
73
74
  };
74
75
  export { BEHAVIORAL_METRICS as default };
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.7.0-next.52"
461
+ version: "3.7.0-next.54"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -43,8 +43,8 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-meetings": "3.7.0-next.52",
47
- "@webex/plugin-rooms": "3.7.0-next.20",
46
+ "@webex/plugin-meetings": "3.7.0-next.54",
47
+ "@webex/plugin-rooms": "3.7.0-next.21",
48
48
  "@webex/test-helper-chai": "3.7.0-next.15",
49
49
  "@webex/test-helper-mocha": "3.7.0-next.15",
50
50
  "@webex/test-helper-mock-webex": "3.7.0-next.15",
@@ -64,17 +64,17 @@
64
64
  "@webex/common": "3.7.0-next.15",
65
65
  "@webex/event-dictionary-ts": "^1.0.1643",
66
66
  "@webex/internal-media-core": "2.14.2",
67
- "@webex/internal-plugin-conversation": "3.7.0-next.20",
67
+ "@webex/internal-plugin-conversation": "3.7.0-next.21",
68
68
  "@webex/internal-plugin-device": "3.7.0-next.15",
69
- "@webex/internal-plugin-llm": "3.7.0-next.18",
70
- "@webex/internal-plugin-mercury": "3.7.0-next.18",
69
+ "@webex/internal-plugin-llm": "3.7.0-next.19",
70
+ "@webex/internal-plugin-mercury": "3.7.0-next.19",
71
71
  "@webex/internal-plugin-metrics": "3.7.0-next.15",
72
- "@webex/internal-plugin-support": "3.7.0-next.21",
72
+ "@webex/internal-plugin-support": "3.7.0-next.22",
73
73
  "@webex/internal-plugin-user": "3.7.0-next.15",
74
- "@webex/internal-plugin-voicea": "3.7.0-next.52",
74
+ "@webex/internal-plugin-voicea": "3.7.0-next.54",
75
75
  "@webex/media-helpers": "3.7.0-next.20",
76
- "@webex/plugin-people": "3.7.0-next.18",
77
- "@webex/plugin-rooms": "3.7.0-next.20",
76
+ "@webex/plugin-people": "3.7.0-next.19",
77
+ "@webex/plugin-rooms": "3.7.0-next.21",
78
78
  "@webex/web-capabilities": "^1.4.0",
79
79
  "@webex/webex-core": "3.7.0-next.15",
80
80
  "ampersand-collection": "^2.0.2",
@@ -92,5 +92,5 @@
92
92
  "//": [
93
93
  "TODO: upgrade jwt-decode when moving to node 18"
94
94
  ],
95
- "version": "3.7.0-next.52"
95
+ "version": "3.7.0-next.54"
96
96
  }
@@ -0,0 +1,26 @@
1
+ import {ERROR_DICTIONARY} from '../../constants';
2
+
3
+ /**
4
+ * Error occurred while join the meeting
5
+ */
6
+ export default class JoinForbiddenError extends Error {
7
+ code: number;
8
+ error: any;
9
+ sdkMessage: string;
10
+ wbxAppApiCode: number;
11
+
12
+ /**
13
+ * @constructor
14
+ * @param {String} [message]
15
+ * @param {Object} [error]
16
+ */
17
+ constructor(message: string = ERROR_DICTIONARY.JoinForbiddenError.MESSAGE, error: any = null) {
18
+ super(message);
19
+ this.name = ERROR_DICTIONARY.JoinForbiddenError.NAME;
20
+ this.sdkMessage = message;
21
+ this.error = error;
22
+ this.stack = error ? error.stack : new Error().stack;
23
+ this.code = ERROR_DICTIONARY.JoinForbiddenError.CODE;
24
+ this.wbxAppApiCode = error?.wbxAppApiCode;
25
+ }
26
+ }
package/src/constants.ts CHANGED
@@ -203,6 +203,7 @@ export const ICE_AND_DTLS_CONNECTION_TIMEOUT = 20000;
203
203
  export const ROAP_OFFER_ANSWER_EXCHANGE_TIMEOUT = 35000;
204
204
  export const WEBINAR_ERROR_WEBCAST = [403026];
205
205
  export const WEBINAR_ERROR_REGISTRATIONID = [403037, 403137];
206
+ export const JOIN_BEFORE_HOST = 403003;
206
207
 
207
208
  // ******************** REGEX **********************
208
209
  // Please alphabetize
@@ -553,6 +554,11 @@ export const ERROR_DICTIONARY = {
553
554
  MESSAGE: 'Client asked for multistream backend (Homer), but got something else instead',
554
555
  CODE: 17,
555
556
  },
557
+ JoinForbiddenError: {
558
+ NAME: 'JoinForbiddenError',
559
+ MESSAGE: 'Meeting join forbidden.',
560
+ CODE: 18,
561
+ },
556
562
  };
557
563
 
558
564
  export const FLOOR_ACTION = {
@@ -1333,6 +1339,8 @@ export const MEETING_INFO_FAILURE_REASON = {
1333
1339
  WEBINAR_REGISTRATION: 'WEBINAR_REGISTRATION', // webinar need registration
1334
1340
  NEED_JOIN_WITH_WEBCAST: 'NEED_JOIN_WITH_WEBCAST', // webinar need using webcast join
1335
1341
  WEBINAR_NEED_REGISTRATIONID: 'WEBINAR_NEED_REGISTRATIONID', // webinar need registrationID
1342
+ NOT_REACH_JBH: 'NOT_REACH_JBH', // Meeting is not allow to access since not reach JBH (join before host) time
1343
+ JOIN_FORBIDDEN: 'JOIN_FORBIDDEN', // meeting is not allow join
1336
1344
  OTHER: 'OTHER', // any other error (network, etc)
1337
1345
  };
1338
1346
 
@@ -123,6 +123,7 @@ import {
123
123
  NAMED_MEDIA_GROUP_TYPE_AUDIO,
124
124
  WEBINAR_ERROR_WEBCAST,
125
125
  WEBINAR_ERROR_REGISTRATIONID,
126
+ JOIN_BEFORE_HOST,
126
127
  } from '../constants';
127
128
  import BEHAVIORAL_METRICS from '../metrics/constants';
128
129
  import ParameterError from '../common/errors/parameter';
@@ -131,6 +132,7 @@ import {
131
132
  MeetingInfoV2CaptchaError,
132
133
  MeetingInfoV2PolicyError,
133
134
  MeetingInfoV2JoinWebinarError,
135
+ MeetingInfoV2JoinForbiddenError,
134
136
  } from '../meeting-info/meeting-info-v2';
135
137
  import {CSI, ReceiveSlotManager} from '../multistream/receiveSlotManager';
136
138
  import SendSlotManager from '../multistream/sendSlotManager';
@@ -162,6 +164,7 @@ import {ConnectionStateHandler, ConnectionStateEvent} from './connectionStateHan
162
164
  import JoinWebinarError from '../common/errors/join-webinar-error';
163
165
  import Member from '../member';
164
166
  import MultistreamNotSupportedError from '../common/errors/multistream-not-supported-error';
167
+ import JoinForbiddenError from '../common/errors/join-forbidden-error';
165
168
 
166
169
  // default callback so we don't call an undefined function, but in practice it should never be used
167
170
  const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
@@ -1784,6 +1787,20 @@ export default class Meeting extends StatelessWebexPlugin {
1784
1787
  }
1785
1788
 
1786
1789
  throw new JoinWebinarError();
1790
+ } else if (err instanceof MeetingInfoV2JoinForbiddenError) {
1791
+ this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.JOIN_FORBIDDEN;
1792
+ this.meetingInfoFailureCode = err.wbxAppApiCode;
1793
+
1794
+ if (err.meetingInfo) {
1795
+ this.meetingInfo = err.meetingInfo;
1796
+ }
1797
+
1798
+ // Handle the case where user hasn't reached Join Before Host (JBH) time (error code 403003)
1799
+ if (JOIN_BEFORE_HOST === err.wbxAppApiCode) {
1800
+ this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.NOT_REACH_JBH;
1801
+ }
1802
+
1803
+ throw new JoinForbiddenError(this.meetingInfoFailureReason, err);
1787
1804
  } else if (err instanceof MeetingInfoV2PasswordError) {
1788
1805
  LoggerProxy.logger.info(
1789
1806
  // @ts-ignore
@@ -18,6 +18,7 @@ const ADHOC_MEETING_DEFAULT_ERROR =
18
18
  'Failed starting the adhoc meeting, Please contact support team ';
19
19
  const CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES = [423005, 423006];
20
20
  const POLICY_ERROR_CODES = [403049, 403104, 403103, 403048, 403102, 403101];
21
+ const JOIN_FORBIDDEN_CODES = [403003];
21
22
  /**
22
23
  * 403021 - Meeting registration is required
23
24
  * 403022 - Meeting registration is still pending
@@ -162,6 +163,31 @@ export class MeetingInfoV2JoinWebinarError extends Error {
162
163
  }
163
164
  }
164
165
 
166
+ /**
167
+ * Error preventing join because of a forbidden error
168
+ */
169
+ export class MeetingInfoV2JoinForbiddenError extends Error {
170
+ meetingInfo: any;
171
+ sdkMessage: any;
172
+ wbxAppApiCode: any;
173
+ body: any;
174
+ /**
175
+ *
176
+ * @constructor
177
+ * @param {Number} [wbxAppApiErrorCode]
178
+ * @param {Object} [meetingInfo]
179
+ * @param {String} [message]
180
+ */
181
+ constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string) {
182
+ super(`${message}, code=${wbxAppApiErrorCode}`);
183
+ this.name = 'MeetingInfoV2JoinForbiddenError';
184
+ this.sdkMessage = message;
185
+ this.stack = new Error().stack;
186
+ this.wbxAppApiCode = wbxAppApiErrorCode;
187
+ this.meetingInfo = meetingInfo;
188
+ }
189
+ }
190
+
165
191
  /**
166
192
  * @class MeetingInfo
167
193
  */
@@ -238,6 +264,29 @@ export default class MeetingInfoV2 {
238
264
  }
239
265
  };
240
266
 
267
+ /**
268
+ * Raises a handleForbiddenError for join meeting forbidden error
269
+ * @param {any} err the error from the request
270
+ * @returns {void}
271
+ */
272
+ handleForbiddenError = (err) => {
273
+ if (!err.body) {
274
+ return;
275
+ }
276
+
277
+ if (JOIN_FORBIDDEN_CODES.includes(err.body?.code)) {
278
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_FORBIDDEN_ERROR, {
279
+ code: err.body?.code,
280
+ });
281
+
282
+ throw new MeetingInfoV2JoinForbiddenError(
283
+ err.body?.code,
284
+ err.body?.data?.meetingInfo,
285
+ err.body?.message
286
+ );
287
+ }
288
+ };
289
+
241
290
  /**
242
291
  * Creates adhoc space meetings for a space by fetching the conversation infomation
243
292
  * @param {String} conversationUrl conversationUrl to start adhoc meeting on
@@ -299,6 +348,7 @@ export default class MeetingInfoV2 {
299
348
  .catch((err) => {
300
349
  this.handlePolicyError(err);
301
350
  this.handleJoinWebinarError(err);
351
+ this.handleForbiddenError(err);
302
352
 
303
353
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE, {
304
354
  reason: err.message,
@@ -454,6 +504,7 @@ export default class MeetingInfoV2 {
454
504
  if (err?.statusCode === 403) {
455
505
  this.handlePolicyError(err);
456
506
  this.handleJoinWebinarError(err);
507
+ this.handleForbiddenError(err);
457
508
 
458
509
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_PASSWORD_ERROR, {
459
510
  reason: err.message,
@@ -65,6 +65,7 @@ import PermissionError from '../common/errors/permission';
65
65
  import JoinWebinarError from '../common/errors/join-webinar-error';
66
66
  import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
67
67
  import NoMeetingInfoError from '../common/errors/no-meeting-info';
68
+ import JoinForbiddenError from '../common/errors/join-forbidden-error';
68
69
 
69
70
  let mediaLogger;
70
71
 
@@ -1463,7 +1464,8 @@ export default class Meetings extends WebexPlugin {
1463
1464
  !(err instanceof CaptchaError) &&
1464
1465
  !(err instanceof PasswordError) &&
1465
1466
  !(err instanceof PermissionError) &&
1466
- !(err instanceof JoinWebinarError)
1467
+ !(err instanceof JoinWebinarError) &&
1468
+ !(err instanceof JoinForbiddenError)
1467
1469
  ) {
1468
1470
  LoggerProxy.logger.info(
1469
1471
  `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
@@ -73,6 +73,7 @@ const BEHAVIORAL_METRICS = {
73
73
  JOIN_WEBINAR_ERROR: 'js_sdk_join_webinar_error',
74
74
  GUEST_ENTERED_LOBBY: 'js_sdk_guest_entered_lobby',
75
75
  GUEST_EXITED_LOBBY: 'js_sdk_guest_exited_lobby',
76
+ JOIN_FORBIDDEN_ERROR: 'js_sdk_join_forbidden_error',
76
77
  };
77
78
 
78
79
  export {BEHAVIORAL_METRICS as default};
@@ -99,7 +99,7 @@ import {
99
99
  MeetingInfoV2CaptchaError,
100
100
  MeetingInfoV2PasswordError,
101
101
  MeetingInfoV2PolicyError,
102
- MeetingInfoV2JoinWebinarError,
102
+ MeetingInfoV2JoinWebinarError, MeetingInfoV2JoinForbiddenError,
103
103
  } from '../../../../src/meeting-info/meeting-info-v2';
104
104
  import {
105
105
  DTLS_HANDSHAKE_FAILED_CLIENT_CODE,
@@ -114,6 +114,7 @@ import {ERROR_DESCRIPTIONS} from '@webex/internal-plugin-metrics/src/call-diagno
114
114
  import MeetingCollection from '@webex/plugin-meetings/src/meetings/collection';
115
115
 
116
116
  import {EVENT_TRIGGERS as VOICEAEVENTS} from '@webex/internal-plugin-voicea';
117
+ import JoinForbiddenError from '../../../../src/common/errors/join-forbidden-error';
117
118
 
118
119
  describe('plugin-meetings', () => {
119
120
  const logger = {
@@ -6339,6 +6340,38 @@ describe('plugin-meetings', () => {
6339
6340
  assert.equal(meeting.passwordStatus, PASSWORD_STATUS.REQUIRED);
6340
6341
  });
6341
6342
 
6343
+ it('handles meetingInfoProvider not reach JBH', async () => {
6344
+ meeting.destination = FAKE_DESTINATION;
6345
+ meeting.destinationType = FAKE_TYPE;
6346
+ meeting.attrs.meetingInfoProvider = {
6347
+ fetchMeetingInfo: sinon
6348
+ .stub()
6349
+ .throws(new MeetingInfoV2JoinForbiddenError(403003, FAKE_MEETING_INFO)),
6350
+ };
6351
+
6352
+ await assert.isRejected(meeting.fetchMeetingInfo({sendCAevents: true}), JoinForbiddenError);
6353
+
6354
+ assert.calledWith(
6355
+ meeting.attrs.meetingInfoProvider.fetchMeetingInfo,
6356
+ FAKE_DESTINATION,
6357
+ FAKE_TYPE,
6358
+ null,
6359
+ null,
6360
+ undefined,
6361
+ 'locus-id',
6362
+ {},
6363
+ {meetingId: meeting.id, sendCAevents: true}
6364
+ );
6365
+
6366
+ assert.deepEqual(meeting.meetingInfo, FAKE_MEETING_INFO);
6367
+ assert.equal(meeting.meetingInfoFailureCode, 403003);
6368
+ assert.equal(
6369
+ meeting.meetingInfoFailureReason,
6370
+ MEETING_INFO_FAILURE_REASON.NOT_REACH_JBH
6371
+ );
6372
+ assert.equal(meeting.requiredCaptcha, null);
6373
+ });
6374
+
6342
6375
  it('handles meetingInfoProvider policy error', async () => {
6343
6376
  meeting.destination = FAKE_DESTINATION;
6344
6377
  meeting.destinationType = FAKE_TYPE;
@@ -19,6 +19,7 @@ import MeetingInfo, {
19
19
  MeetingInfoV2AdhocMeetingError,
20
20
  MeetingInfoV2PolicyError,
21
21
  MeetingInfoV2JoinWebinarError,
22
+ MeetingInfoV2JoinForbiddenError,
22
23
  } from '@webex/plugin-meetings/src/meeting-info/meeting-info-v2';
23
24
  import MeetingInfoUtil from '@webex/plugin-meetings/src/meeting-info/utilv2';
24
25
  import Metrics from '@webex/plugin-meetings/src/metrics';
@@ -930,6 +931,42 @@ describe('plugin-meetings', () => {
930
931
  });
931
932
  }
932
933
  );
934
+
935
+ forEach(
936
+ [
937
+ {errorCode: 403003},
938
+ ],
939
+ ({errorCode}) => {
940
+ it(`should throw a MeetingInfoV2JoinForbiddenError for error code ${errorCode}`, async () => {
941
+ const message = 'a message';
942
+ const meetingInfoData = 'meeting info';
943
+
944
+ webex.request = sinon.stub().rejects({
945
+ statusCode: 403,
946
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
947
+ });
948
+ try {
949
+ await meetingInfo.fetchMeetingInfo('1234323', DESTINATION_TYPE.MEETING_ID, 'abc', {
950
+ id: '999',
951
+ code: 'aabbcc11',
952
+ });
953
+ } catch (err) {
954
+ assert.instanceOf(err, MeetingInfoV2JoinForbiddenError);
955
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
956
+ assert.equal(err.wbxAppApiCode, errorCode);
957
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
958
+
959
+ assert(Metrics.sendBehavioralMetric.calledOnce);
960
+ assert.calledWith(
961
+ Metrics.sendBehavioralMetric,
962
+ BEHAVIORAL_METRICS.JOIN_FORBIDDEN_ERROR,
963
+ {code: errorCode}
964
+ );
965
+
966
+ }
967
+ });
968
+ }
969
+ );
933
970
  });
934
971
  });
935
972
  });
@@ -43,6 +43,7 @@ import CaptchaError from '@webex/plugin-meetings/src/common/errors/captcha-error
43
43
  import {forEach} from 'lodash';
44
44
  import PasswordError from '@webex/plugin-meetings/src/common/errors/password-error';
45
45
  import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
46
+ import JoinForbiddenError from '@webex/plugin-meetings/src/common/errors/join-forbidden-error';
46
47
  import {NoiseReductionEffect, VirtualBackgroundEffect} from '@webex/media-helpers';
47
48
  import NoMeetingInfoError from '../../../../src/common/errors/no-meeting-info';
48
49
 
@@ -2052,6 +2053,11 @@ describe('plugin-meetings', () => {
2052
2053
  debugLogMessage:
2053
2054
  'Meetings:index#createMeeting --> Debug PermissionError: Not allowed to execute the function, some properties on server, or local client state do not allow you to complete this action. fetching /meetingInfo for creation.',
2054
2055
  },
2056
+ {
2057
+ error: new JoinForbiddenError(),
2058
+ debugLogMessage:
2059
+ 'Meetings:index#createMeeting --> Debug JoinForbiddenError: Meeting join forbidden. fetching /meetingInfo for creation.',
2060
+ },
2055
2061
  {
2056
2062
  error: new Error(),
2057
2063
  infoLogMessage: true,