@webex/plugin-meetings 3.12.0-next.46 → 3.12.0-next.48
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.
- package/dist/aiEnableRequest/index.js +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/hashTree/hashTreeParser.js +44 -13
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +4 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +3 -1
- package/dist/locus-info/index.js.map +1 -1
- package/dist/meeting/index.js +6 -2
- package/dist/meeting/index.js.map +1 -1
- package/dist/metrics/constants.js +2 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/types/hashTree/hashTreeParser.d.ts +8 -0
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +1 -1
- package/src/hashTree/hashTreeParser.ts +29 -1
- package/src/locus-info/controlsUtils.ts +3 -1
- package/src/locus-info/index.ts +2 -0
- package/src/meeting/index.ts +3 -1
- package/src/metrics/constants.ts +1 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +158 -0
- package/test/unit/spec/locus-info/controlsUtils.js +172 -57
- package/test/unit/spec/locus-info/index.js +46 -0
- package/test/unit/spec/meeting/index.js +87 -0
|
@@ -100,6 +100,7 @@ var BEHAVIORAL_METRICS = exports.default = {
|
|
|
100
100
|
DEPRECATED_SET_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_set_codec_parameters_used',
|
|
101
101
|
DEPRECATED_DELETE_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_delete_codec_parameters_used',
|
|
102
102
|
SET_CUSTOM_CODEC_PARAMETERS_USED: 'js_sdk_set_custom_codec_parameters_used',
|
|
103
|
-
MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED: 'js_sdk_mark_custom_codec_parameters_for_deletion_used'
|
|
103
|
+
MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED: 'js_sdk_mark_custom_codec_parameters_for_deletion_used',
|
|
104
|
+
HASH_TREE_SYNC_FAILURE: 'js_sdk_hash_tree_sync_failure'
|
|
104
105
|
};
|
|
105
106
|
//# sourceMappingURL=constants.js.map
|
|
@@ -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","LLM_HEALTHCHECK_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","MEETING_IS_IN_PROGRESS_ERROR","STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR","FETCH_MEETING_INFO_V1_SUCCESS","FETCH_MEETING_INFO_V1_FAILURE","ENABLE_STATIC_METTING_LINK_SUCCESS","ENABLE_STATIC_METTING_LINK_FAILURE","DISABLE_STATIC_MEETING_LINK_SUCCESS","DISABLE_STATIC_MEETING_LINK_FAILURE","ADHOC_MEETING_SUCCESS","ADHOC_MEETING_FAILURE","FETCH_STATIC_MEETING_LINK_SUCCESS","FETCH_STATIC_MEETING_LINK_FAILURE","MEETING_LINK_DOES_NOT_EXIST_ERROR","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","LOCUS_SYNC_HANDLING_FAILED","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","VERIFY_REGISTRATION_ID_SUCCESS","VERIFY_REGISTRATION_ID_ERROR","JOIN_FORBIDDEN_ERROR","MEDIA_ISSUE_DETECTED","LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH","LOCUS_HASH_TREE_UNSUPPORTED_OPERATION","MEDIA_STILL_NOT_CONNECTED","DEPRECATED_SET_CODEC_PARAMETERS_USED","DEPRECATED_DELETE_CODEC_PARAMETERS_USED","SET_CUSTOM_CODEC_PARAMETERS_USED","MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED"],"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 LLM_HEALTHCHECK_FAILURE: 'js_sdk_llm_healthcheck_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 MEETING_IS_IN_PROGRESS_ERROR: 'js_sdk_meeting_is_in_progress_error',\n STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR: 'js_sdk_static_meeting_link_already_exists_error',\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 ENABLE_STATIC_METTING_LINK_SUCCESS: 'js_sdk_enable_static_meeting_link_success',\n ENABLE_STATIC_METTING_LINK_FAILURE: 'js_sdk_enable_static_meeting_link_failure',\n DISABLE_STATIC_MEETING_LINK_SUCCESS: 'js_sdk_disable_static_meeting_link_success',\n DISABLE_STATIC_MEETING_LINK_FAILURE: 'js_sdk_disable_static_meeting_link_failure',\n ADHOC_MEETING_SUCCESS: 'js_sdk_adhoc_meeting_success',\n ADHOC_MEETING_FAILURE: 'js_sdk_adhoc_meeting_failure',\n FETCH_STATIC_MEETING_LINK_SUCCESS: 'js_sdk_fetch_static_meeting_link_success',\n FETCH_STATIC_MEETING_LINK_FAILURE: 'js_sdk_fetch_static_meeting_link_failure',\n MEETING_LINK_DOES_NOT_EXIST_ERROR: 'js_sdk_meeting_link_does_not_exist_error',\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 LOCUS_SYNC_HANDLING_FAILED: 'js_sdk_locus_sync_handling_failed',\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 VERIFY_REGISTRATION_ID_SUCCESS: 'js_sdk_verify_registrationId_success',\n VERIFY_REGISTRATION_ID_ERROR: 'js_sdk_verify_registrationId_error',\n JOIN_FORBIDDEN_ERROR: 'js_sdk_join_forbidden_error',\n MEDIA_ISSUE_DETECTED: 'js_sdk_media_issue_detected',\n LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH: 'js_sdk_locus_classic_vs_hash_tree_mismatch',\n LOCUS_HASH_TREE_UNSUPPORTED_OPERATION: 'js_sdk_locus_hash_tree_unsupported_operation',\n MEDIA_STILL_NOT_CONNECTED: 'js_sdk_media_still_not_connected',\n DEPRECATED_SET_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_set_codec_parameters_used',\n DEPRECATED_DELETE_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_delete_codec_parameters_used',\n SET_CUSTOM_CODEC_PARAMETERS_USED: 'js_sdk_set_custom_codec_parameters_used',\n MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED:\n 'js_sdk_mark_custom_codec_parameters_for_deletion_used',\n};\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":"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","ignoreList":[]}
|
|
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","LLM_HEALTHCHECK_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","MEETING_IS_IN_PROGRESS_ERROR","STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR","FETCH_MEETING_INFO_V1_SUCCESS","FETCH_MEETING_INFO_V1_FAILURE","ENABLE_STATIC_METTING_LINK_SUCCESS","ENABLE_STATIC_METTING_LINK_FAILURE","DISABLE_STATIC_MEETING_LINK_SUCCESS","DISABLE_STATIC_MEETING_LINK_FAILURE","ADHOC_MEETING_SUCCESS","ADHOC_MEETING_FAILURE","FETCH_STATIC_MEETING_LINK_SUCCESS","FETCH_STATIC_MEETING_LINK_FAILURE","MEETING_LINK_DOES_NOT_EXIST_ERROR","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","LOCUS_SYNC_HANDLING_FAILED","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","VERIFY_REGISTRATION_ID_SUCCESS","VERIFY_REGISTRATION_ID_ERROR","JOIN_FORBIDDEN_ERROR","MEDIA_ISSUE_DETECTED","LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH","LOCUS_HASH_TREE_UNSUPPORTED_OPERATION","MEDIA_STILL_NOT_CONNECTED","DEPRECATED_SET_CODEC_PARAMETERS_USED","DEPRECATED_DELETE_CODEC_PARAMETERS_USED","SET_CUSTOM_CODEC_PARAMETERS_USED","MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED","HASH_TREE_SYNC_FAILURE"],"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 LLM_HEALTHCHECK_FAILURE: 'js_sdk_llm_healthcheck_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 MEETING_IS_IN_PROGRESS_ERROR: 'js_sdk_meeting_is_in_progress_error',\n STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR: 'js_sdk_static_meeting_link_already_exists_error',\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 ENABLE_STATIC_METTING_LINK_SUCCESS: 'js_sdk_enable_static_meeting_link_success',\n ENABLE_STATIC_METTING_LINK_FAILURE: 'js_sdk_enable_static_meeting_link_failure',\n DISABLE_STATIC_MEETING_LINK_SUCCESS: 'js_sdk_disable_static_meeting_link_success',\n DISABLE_STATIC_MEETING_LINK_FAILURE: 'js_sdk_disable_static_meeting_link_failure',\n ADHOC_MEETING_SUCCESS: 'js_sdk_adhoc_meeting_success',\n ADHOC_MEETING_FAILURE: 'js_sdk_adhoc_meeting_failure',\n FETCH_STATIC_MEETING_LINK_SUCCESS: 'js_sdk_fetch_static_meeting_link_success',\n FETCH_STATIC_MEETING_LINK_FAILURE: 'js_sdk_fetch_static_meeting_link_failure',\n MEETING_LINK_DOES_NOT_EXIST_ERROR: 'js_sdk_meeting_link_does_not_exist_error',\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 LOCUS_SYNC_HANDLING_FAILED: 'js_sdk_locus_sync_handling_failed',\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 VERIFY_REGISTRATION_ID_SUCCESS: 'js_sdk_verify_registrationId_success',\n VERIFY_REGISTRATION_ID_ERROR: 'js_sdk_verify_registrationId_error',\n JOIN_FORBIDDEN_ERROR: 'js_sdk_join_forbidden_error',\n MEDIA_ISSUE_DETECTED: 'js_sdk_media_issue_detected',\n LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH: 'js_sdk_locus_classic_vs_hash_tree_mismatch',\n LOCUS_HASH_TREE_UNSUPPORTED_OPERATION: 'js_sdk_locus_hash_tree_unsupported_operation',\n MEDIA_STILL_NOT_CONNECTED: 'js_sdk_media_still_not_connected',\n DEPRECATED_SET_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_set_codec_parameters_used',\n DEPRECATED_DELETE_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_delete_codec_parameters_used',\n SET_CUSTOM_CODEC_PARAMETERS_USED: 'js_sdk_set_custom_codec_parameters_used',\n MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED:\n 'js_sdk_mark_custom_codec_parameters_for_deletion_used',\n HASH_TREE_SYNC_FAILURE: 'js_sdk_hash_tree_sync_failure',\n};\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -228,6 +228,14 @@ declare class HashTreeParser {
|
|
|
228
228
|
* @returns {void}
|
|
229
229
|
*/
|
|
230
230
|
private updateDataSetInfo;
|
|
231
|
+
/**
|
|
232
|
+
* Updates the leaf count for a data set, resizing its hash tree accordingly.
|
|
233
|
+
*
|
|
234
|
+
* @param {InternalDataSet} dataSet - The data set to update
|
|
235
|
+
* @param {number} newLeafCount - The new leaf count
|
|
236
|
+
* @returns {void}
|
|
237
|
+
*/
|
|
238
|
+
private updateDataSetLeafCount;
|
|
231
239
|
/**
|
|
232
240
|
* Checks for changes in the visible data sets based on the updated objects.
|
|
233
241
|
* @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.
|
|
@@ -92,5 +92,6 @@ declare const BEHAVIORAL_METRICS: {
|
|
|
92
92
|
DEPRECATED_DELETE_CODEC_PARAMETERS_USED: string;
|
|
93
93
|
SET_CUSTOM_CODEC_PARAMETERS_USED: string;
|
|
94
94
|
MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED: string;
|
|
95
|
+
HASH_TREE_SYNC_FAILURE: string;
|
|
95
96
|
};
|
|
96
97
|
export { BEHAVIORAL_METRICS as default };
|
package/dist/webinar/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {cloneDeep, isEmpty, zip} from 'lodash';
|
|
2
2
|
import HashTree, {LeafDataItem} from './hashTree';
|
|
3
3
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
4
|
+
import Metrics from '../metrics';
|
|
5
|
+
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
4
6
|
import {Enum, HTTP_VERBS} from '../constants';
|
|
5
7
|
import {DataSetNames, DATA_SET_INIT_PRIORITY, EMPTY_HASH} from './constants';
|
|
6
8
|
import {ObjectType, HtMeta, HashTreeObject} from './types';
|
|
@@ -753,6 +755,18 @@ class HashTreeParser {
|
|
|
753
755
|
}
|
|
754
756
|
}
|
|
755
757
|
|
|
758
|
+
/**
|
|
759
|
+
* Updates the leaf count for a data set, resizing its hash tree accordingly.
|
|
760
|
+
*
|
|
761
|
+
* @param {InternalDataSet} dataSet - The data set to update
|
|
762
|
+
* @param {number} newLeafCount - The new leaf count
|
|
763
|
+
* @returns {void}
|
|
764
|
+
*/
|
|
765
|
+
private updateDataSetLeafCount(dataSet: InternalDataSet, newLeafCount: number): void {
|
|
766
|
+
dataSet.hashTree?.resize(newLeafCount);
|
|
767
|
+
dataSet.leafCount = newLeafCount;
|
|
768
|
+
}
|
|
769
|
+
|
|
756
770
|
/**
|
|
757
771
|
* Checks for changes in the visible data sets based on the updated objects.
|
|
758
772
|
* @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.
|
|
@@ -1213,7 +1227,7 @@ class HashTreeParser {
|
|
|
1213
1227
|
|
|
1214
1228
|
receivedHashes = hashesResult.hashes;
|
|
1215
1229
|
|
|
1216
|
-
|
|
1230
|
+
this.updateDataSetLeafCount(dataSet, hashesResult.dataSet.leafCount);
|
|
1217
1231
|
} catch (error: any) {
|
|
1218
1232
|
if (error?.statusCode === 409) {
|
|
1219
1233
|
// this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus
|
|
@@ -1667,6 +1681,13 @@ class HashTreeParser {
|
|
|
1667
1681
|
error
|
|
1668
1682
|
);
|
|
1669
1683
|
this.checkForSentinelHttpResponse(error, dataSet.name);
|
|
1684
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {
|
|
1685
|
+
debugId: this.debugId,
|
|
1686
|
+
dataSetName,
|
|
1687
|
+
request: 'GET /hashtree',
|
|
1688
|
+
statusCode: error.statusCode,
|
|
1689
|
+
reason: error.message,
|
|
1690
|
+
});
|
|
1670
1691
|
|
|
1671
1692
|
throw error;
|
|
1672
1693
|
});
|
|
@@ -1745,6 +1766,13 @@ class HashTreeParser {
|
|
|
1745
1766
|
error
|
|
1746
1767
|
);
|
|
1747
1768
|
this.checkForSentinelHttpResponse(error, dataSet.name);
|
|
1769
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {
|
|
1770
|
+
debugId: this.debugId,
|
|
1771
|
+
dataSetName: dataSet.name,
|
|
1772
|
+
request: 'POST /sync',
|
|
1773
|
+
statusCode: error.statusCode,
|
|
1774
|
+
reason: error.message,
|
|
1775
|
+
});
|
|
1748
1776
|
|
|
1749
1777
|
throw error;
|
|
1750
1778
|
});
|
|
@@ -26,7 +26,9 @@ ControlsUtils.parse = (controls: any) => {
|
|
|
26
26
|
modifiedBy: ControlsUtils.getId(controls),
|
|
27
27
|
paused: controls.record.paused ? controls.record.paused : false,
|
|
28
28
|
recording: controls.record.recording,
|
|
29
|
-
lastModified: controls.record.meta
|
|
29
|
+
lastModified: controls.record.meta?.lastModified,
|
|
30
|
+
modifiedByServiceAppName: controls.record.meta?.modifiedByServiceAppName,
|
|
31
|
+
modifiedByServiceAppId: controls.record.meta?.modifiedByServiceAppId,
|
|
30
32
|
};
|
|
31
33
|
}
|
|
32
34
|
|
package/src/locus-info/index.ts
CHANGED
|
@@ -2085,6 +2085,8 @@ export default class LocusInfo extends EventsScope {
|
|
|
2085
2085
|
state,
|
|
2086
2086
|
modifiedBy: current.record.modifiedBy,
|
|
2087
2087
|
lastModified: current.record.lastModified,
|
|
2088
|
+
modifiedByServiceAppName: current.record.modifiedByServiceAppName,
|
|
2089
|
+
modifiedByServiceAppId: current.record.modifiedByServiceAppId,
|
|
2088
2090
|
}
|
|
2089
2091
|
);
|
|
2090
2092
|
}
|
package/src/meeting/index.ts
CHANGED
|
@@ -2791,7 +2791,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2791
2791
|
private setupLocusControlsListener() {
|
|
2792
2792
|
this.locusInfo.on(
|
|
2793
2793
|
LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,
|
|
2794
|
-
({state, modifiedBy, lastModified}) => {
|
|
2794
|
+
({state, modifiedBy, lastModified, modifiedByServiceAppName, modifiedByServiceAppId}) => {
|
|
2795
2795
|
let event;
|
|
2796
2796
|
|
|
2797
2797
|
switch (state) {
|
|
@@ -2817,6 +2817,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2817
2817
|
state: state === RECORDING_STATE.RESUMED ? RECORDING_STATE.RECORDING : state,
|
|
2818
2818
|
modifiedBy,
|
|
2819
2819
|
lastModified,
|
|
2820
|
+
modifiedByServiceAppName,
|
|
2821
|
+
modifiedByServiceAppId,
|
|
2820
2822
|
};
|
|
2821
2823
|
Trigger.trigger(
|
|
2822
2824
|
this,
|
package/src/metrics/constants.ts
CHANGED
|
@@ -96,6 +96,7 @@ const BEHAVIORAL_METRICS = {
|
|
|
96
96
|
SET_CUSTOM_CODEC_PARAMETERS_USED: 'js_sdk_set_custom_codec_parameters_used',
|
|
97
97
|
MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED:
|
|
98
98
|
'js_sdk_mark_custom_codec_parameters_for_deletion_used',
|
|
99
|
+
HASH_TREE_SYNC_FAILURE: 'js_sdk_hash_tree_sync_failure',
|
|
99
100
|
};
|
|
100
101
|
|
|
101
102
|
export {BEHAVIORAL_METRICS as default};
|
|
@@ -8,6 +8,8 @@ import sinon from 'sinon';
|
|
|
8
8
|
import {assert} from '@webex/test-helper-chai';
|
|
9
9
|
import {EMPTY_HASH} from '@webex/plugin-meetings/src/hashTree/constants';
|
|
10
10
|
import { some } from 'lodash';
|
|
11
|
+
import Metrics from '@webex/plugin-meetings/src/metrics';
|
|
12
|
+
import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
|
|
11
13
|
|
|
12
14
|
const visibleDataSetsUrl = 'https://locus-a.wbx2.com/locus/api/v1/loci/97d64a5f/visibleDataSets';
|
|
13
15
|
|
|
@@ -152,16 +154,19 @@ describe('HashTreeParser', () => {
|
|
|
152
154
|
let webexRequest: sinon.SinonStub;
|
|
153
155
|
let callback: sinon.SinonStub;
|
|
154
156
|
let mathRandomStub: sinon.SinonStub;
|
|
157
|
+
let metricsStub: sinon.SinonStub;
|
|
155
158
|
|
|
156
159
|
beforeEach(() => {
|
|
157
160
|
clock = sinon.useFakeTimers();
|
|
158
161
|
webexRequest = sinon.stub();
|
|
159
162
|
callback = sinon.stub();
|
|
160
163
|
mathRandomStub = sinon.stub(Math, 'random').returns(0);
|
|
164
|
+
metricsStub = sinon.stub(Metrics, 'sendBehavioralMetric');
|
|
161
165
|
});
|
|
162
166
|
afterEach(() => {
|
|
163
167
|
clock.restore();
|
|
164
168
|
mathRandomStub.restore();
|
|
169
|
+
metricsStub.restore();
|
|
165
170
|
});
|
|
166
171
|
|
|
167
172
|
// Helper to create a HashTreeParser instance with common defaults
|
|
@@ -1817,6 +1822,9 @@ describe('HashTreeParser', () => {
|
|
|
1817
1822
|
assert.isUndefined(ds.timer);
|
|
1818
1823
|
assert.isUndefined(ds.heartbeatWatchdogTimer);
|
|
1819
1824
|
});
|
|
1825
|
+
|
|
1826
|
+
// Verify no sync failure metric was sent for end-meeting sentinel
|
|
1827
|
+
assert.notCalled(metricsStub);
|
|
1820
1828
|
});
|
|
1821
1829
|
|
|
1822
1830
|
it(`when /sync returns ${statusCode}`, async () => {
|
|
@@ -1880,6 +1888,9 @@ describe('HashTreeParser', () => {
|
|
|
1880
1888
|
assert.isUndefined(ds.timer);
|
|
1881
1889
|
assert.isUndefined(ds.heartbeatWatchdogTimer);
|
|
1882
1890
|
});
|
|
1891
|
+
|
|
1892
|
+
// Verify no sync failure metric was sent for end-meeting sentinel
|
|
1893
|
+
assert.notCalled(metricsStub);
|
|
1883
1894
|
});
|
|
1884
1895
|
});
|
|
1885
1896
|
});
|
|
@@ -2125,6 +2136,153 @@ describe('HashTreeParser', () => {
|
|
|
2125
2136
|
})
|
|
2126
2137
|
);
|
|
2127
2138
|
});
|
|
2139
|
+
|
|
2140
|
+
it('updates dataSet.leafCount when hash tree is resized during sync so that the sync request has the correct leafCount', async () => {
|
|
2141
|
+
const parser = createHashTreeParser();
|
|
2142
|
+
|
|
2143
|
+
// Send a heartbeat with a mismatched root hash to trigger runSyncAlgorithm
|
|
2144
|
+
const heartbeatMessage = {
|
|
2145
|
+
dataSets: [
|
|
2146
|
+
{
|
|
2147
|
+
...createDataSet('main', 16, 1100),
|
|
2148
|
+
root: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1', // different from ours
|
|
2149
|
+
},
|
|
2150
|
+
],
|
|
2151
|
+
visibleDataSetsUrl,
|
|
2152
|
+
locusUrl,
|
|
2153
|
+
};
|
|
2154
|
+
|
|
2155
|
+
parser.handleMessage(heartbeatMessage, 'heartbeat with mismatch');
|
|
2156
|
+
|
|
2157
|
+
// The sync timer should be set
|
|
2158
|
+
expect(parser.dataSets.main.timer).to.not.be.undefined;
|
|
2159
|
+
|
|
2160
|
+
const mainDataSetUrl = parser.dataSets.main.url;
|
|
2161
|
+
const newLeafCount = 32;
|
|
2162
|
+
|
|
2163
|
+
// Mock getHashesFromLocus response with a DIFFERENT leafCount (32 instead of 16)
|
|
2164
|
+
mockGetHashesFromLocusResponse(
|
|
2165
|
+
mainDataSetUrl,
|
|
2166
|
+
new Array(newLeafCount).fill('00000000000000000000000000000000'),
|
|
2167
|
+
createDataSet('main', newLeafCount, 1101)
|
|
2168
|
+
);
|
|
2169
|
+
|
|
2170
|
+
// Mock the sync request - use matching root hash
|
|
2171
|
+
const syncResponseDataSet = createDataSet('main', newLeafCount, 1102);
|
|
2172
|
+
syncResponseDataSet.root = parser.dataSets.main.hashTree.getRootHash();
|
|
2173
|
+
mockSendSyncRequestResponse(mainDataSetUrl, {
|
|
2174
|
+
dataSets: [syncResponseDataSet],
|
|
2175
|
+
visibleDataSetsUrl,
|
|
2176
|
+
locusUrl,
|
|
2177
|
+
locusStateElements: [],
|
|
2178
|
+
});
|
|
2179
|
+
|
|
2180
|
+
// Advance time to fire the sync timer (idleMs=1000 + backoff=0)
|
|
2181
|
+
await clock.tickAsync(1000);
|
|
2182
|
+
|
|
2183
|
+
// Verify the sync request was sent with the NEW leafCount (32), not the old one (16)
|
|
2184
|
+
assert.calledWith(
|
|
2185
|
+
webexRequest,
|
|
2186
|
+
sinon.match({
|
|
2187
|
+
method: 'POST',
|
|
2188
|
+
uri: `${mainDataSetUrl}/sync`,
|
|
2189
|
+
body: sinon.match({
|
|
2190
|
+
leafCount: newLeafCount,
|
|
2191
|
+
}),
|
|
2192
|
+
})
|
|
2193
|
+
);
|
|
2194
|
+
});
|
|
2195
|
+
|
|
2196
|
+
it('sends HASH_TREE_SYNC_FAILURE metric when GET /hashtree request fails', async () => {
|
|
2197
|
+
const parser = createHashTreeParser();
|
|
2198
|
+
|
|
2199
|
+
// Send a heartbeat with a mismatched root hash to trigger runSyncAlgorithm
|
|
2200
|
+
const heartbeatMessage = {
|
|
2201
|
+
dataSets: [
|
|
2202
|
+
{
|
|
2203
|
+
...createDataSet('main', 16, 1100),
|
|
2204
|
+
root: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1',
|
|
2205
|
+
},
|
|
2206
|
+
],
|
|
2207
|
+
visibleDataSetsUrl,
|
|
2208
|
+
locusUrl,
|
|
2209
|
+
};
|
|
2210
|
+
|
|
2211
|
+
parser.handleMessage(heartbeatMessage, 'heartbeat with mismatch');
|
|
2212
|
+
|
|
2213
|
+
const mainDataSetUrl = parser.dataSets.main.url;
|
|
2214
|
+
const hashTreeError = new Error('server error') as any;
|
|
2215
|
+
hashTreeError.statusCode = 500;
|
|
2216
|
+
|
|
2217
|
+
webexRequest
|
|
2218
|
+
.withArgs(
|
|
2219
|
+
sinon.match({
|
|
2220
|
+
method: 'GET',
|
|
2221
|
+
uri: `${mainDataSetUrl}/hashtree`,
|
|
2222
|
+
})
|
|
2223
|
+
)
|
|
2224
|
+
.rejects(hashTreeError);
|
|
2225
|
+
|
|
2226
|
+
await clock.tickAsync(1000);
|
|
2227
|
+
|
|
2228
|
+
assert.calledOnceWithExactly(metricsStub, BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {
|
|
2229
|
+
debugId: 'test',
|
|
2230
|
+
dataSetName: 'main',
|
|
2231
|
+
request: 'GET /hashtree',
|
|
2232
|
+
statusCode: 500,
|
|
2233
|
+
reason: 'server error',
|
|
2234
|
+
});
|
|
2235
|
+
});
|
|
2236
|
+
|
|
2237
|
+
it('sends HASH_TREE_SYNC_FAILURE metric when POST /sync request fails', async () => {
|
|
2238
|
+
const parser = createHashTreeParser();
|
|
2239
|
+
|
|
2240
|
+
// Send a heartbeat with a mismatched root hash to trigger runSyncAlgorithm
|
|
2241
|
+
const heartbeatMessage = {
|
|
2242
|
+
dataSets: [
|
|
2243
|
+
{
|
|
2244
|
+
...createDataSet('main', 16, 1100),
|
|
2245
|
+
root: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1',
|
|
2246
|
+
},
|
|
2247
|
+
],
|
|
2248
|
+
visibleDataSetsUrl,
|
|
2249
|
+
locusUrl,
|
|
2250
|
+
};
|
|
2251
|
+
|
|
2252
|
+
parser.handleMessage(heartbeatMessage, 'heartbeat with mismatch');
|
|
2253
|
+
|
|
2254
|
+
const mainDataSetUrl = parser.dataSets.main.url;
|
|
2255
|
+
|
|
2256
|
+
// Mock getHashesFromLocus to succeed
|
|
2257
|
+
mockGetHashesFromLocusResponse(
|
|
2258
|
+
mainDataSetUrl,
|
|
2259
|
+
new Array(16).fill('00000000000000000000000000000000'),
|
|
2260
|
+
createDataSet('main', 16, 1101)
|
|
2261
|
+
);
|
|
2262
|
+
|
|
2263
|
+
// Mock sendSyncRequestToLocus to fail
|
|
2264
|
+
const syncError = new Error('sync failed') as any;
|
|
2265
|
+
syncError.statusCode = 500;
|
|
2266
|
+
|
|
2267
|
+
webexRequest
|
|
2268
|
+
.withArgs(
|
|
2269
|
+
sinon.match({
|
|
2270
|
+
method: 'POST',
|
|
2271
|
+
uri: `${mainDataSetUrl}/sync`,
|
|
2272
|
+
})
|
|
2273
|
+
)
|
|
2274
|
+
.rejects(syncError);
|
|
2275
|
+
|
|
2276
|
+
await clock.tickAsync(1000);
|
|
2277
|
+
|
|
2278
|
+
assert.calledOnceWithExactly(metricsStub, BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {
|
|
2279
|
+
debugId: 'test',
|
|
2280
|
+
dataSetName: 'main',
|
|
2281
|
+
request: 'POST /sync',
|
|
2282
|
+
statusCode: 500,
|
|
2283
|
+
reason: 'sync failed',
|
|
2284
|
+
});
|
|
2285
|
+
});
|
|
2128
2286
|
});
|
|
2129
2287
|
|
|
2130
2288
|
describe('handles visible data sets changes correctly', () => {
|