UNPKG

mereos

Version:

This is an ai-empowered proctoring solution for online assessments.

264 lines (229 loc) 7.75 kB
/** @license mereos v1.0.0 * mereos.production.min.js * * Copyright (c) DT Education and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ window.openModal = openModal; import { openModal } from './src/ExamsPrechecks'; import { getRoomSid, getToken } from './src/services/twilio.services'; import { createCandidate } from './src/services/candidate.services'; import { startRecording, stopAllRecordings } from './src/StartRecording'; import { logonSchool } from './src/services/auth.services'; import { initialSessionData, preChecksSteps } from './src/utils/constant'; import { addSectionSessionRecord, convertDataIntoParse, findConfigs, getSecureFeatures, logger, updatePersistData } from './src/utils/functions'; import { createCandidateAssessment } from './src/services/assessment.services'; import { v4 } from 'uuid'; import 'notyf/notyf.min.css'; import { customCandidateAssessmentStatus } from './src/services/candidate-assessment.services'; async function init(credentials, candidateData, profileId, assessmentData, schoolTheme) { try { const logonResp = await logonSchool(credentials); if (logonResp.data) { const token = logonResp.data.token; const expiresInDays = 7; const expiresAt = Date.now() + expiresInDays * 24 * 60 * 60 * 1000; localStorage.setItem('mereosToken', JSON.stringify({ token, expiresAt })); const resp = await createCandidate(candidateData); const updateData = { school: logonResp?.data?.school, candidate: resp?.data, }; localStorage.setItem('candidateAssessment', JSON.stringify(updateData)); localStorage.setItem('session', JSON.stringify(initialSessionData)); localStorage.setItem('preChecksSteps', JSON.stringify(preChecksSteps)); localStorage.setItem('socketGroupId', JSON.stringify({ groupName: v4() })); localStorage.setItem('schoolTheme', schoolTheme ? JSON.stringify(schoolTheme) : '{}'); localStorage.setItem('conversationId', v4()); const data = { name: assessmentData?.name, description: assessmentData?.description, external_id: assessmentData?.id || 1, course_id: assessmentData?.course_id, others: { test: 'value' }, branch: assessmentData?.branch }; const assessmentResp = await createCandidateAssessment(data); if (assessmentResp?.data) { const candidateAssessmentData = { status: 'Initiated', candidate: resp?.data?.id, assessment: assessmentResp?.data?.id, profile: profileId, }; const candidateAssessmentResp = await customCandidateAssessmentStatus(candidateAssessmentData); updatePersistData('session', { candidate_assessment: candidateAssessmentResp?.data?.id, assessment: assessmentResp?.data, candidate: resp?.data?.id, }); localStorage.setItem('secureFeatures', JSON.stringify(candidateAssessmentResp?.data?.profile)); } return logonResp.data; } } catch (error) { } } window.globalCallback = null; async function start_prechecks(callback,setting) { try { window.globalCallback = callback; localStorage.setItem('precheckSetting', setting); window.precheckCompleted=false; openModal(callback); } catch (error) { logger.error('Error in start_prechecks:', error); callback({ type: 'error', message: 'error_in_prechecks_setup', code:40000, details: error, }); } } window.stopPrecheckCallBack = null; async function stop_prechecks(callback) { try { window.stopPrecheckCallBack=callback; const modal = document.getElementById('precheck-modal'); modal.style.display = 'none'; modal.remove(); callback({ type: 'success', message: 'prechecks_stopped', code:50002 }); } catch (error) { callback({ type: 'error', message: 'error_in_stop_prechecks', details: error, code:40001 }); } } window.startRecordingCallBack = null; window.recordingStart=false; async function start_session(callback) { try { window.startRecordingCallBack = callback; logger.success('window.precheckCompleted',window.precheckCompleted); if(!window.precheckCompleted){ window.startRecordingCallBack({ type:'error', message: 'please_complete_your_prechecks' , code:40019 }); return; } if(!window.recordingStart){ const secureFeatures = getSecureFeatures(); if (secureFeatures?.entities?.length > 0) { const mobileRoomSessionId = v4(); const newRoomSessionId = v4(); if (findConfigs(['mobile_proctoring'], secureFeatures?.entities).length) { try { const resp = await getRoomSid({ session_id: mobileRoomSessionId, auto_record: true }); const mobileTwilioToken = await getToken({ room_sid: resp.data.room_sid }); updatePersistData('session', { mobileRoomId: resp.data.room_sid, mobileRoomSessionId: mobileRoomSessionId, }); if (window.socket && window.socket.readyState === WebSocket.OPEN) { window.socket.send( JSON.stringify({ event: 'twilioToken', message: mobileTwilioToken?.data?.token, }) ); } } catch (err) { if(window.startRecordingCallBack){ window.startRecordingCallBack({ type: 'error', message: 'error_in_mobile_proctoring_setup', details: err, code:40002 }); } return; } } const roomCreation = ['record_screen', 'record_audio', 'record_video', 'mobile_proctoring']; if (secureFeatures?.entities.filter((entity) => roomCreation.includes(entity.key)).length > 0) { try { const resp = await getRoomSid({ session_id: newRoomSessionId, auto_record: true }); const twilioToken = await getToken({ room_sid: resp.data.room_sid }); if (twilioToken) { updatePersistData('session', { twilioToken: twilioToken.data.token, sessionId: newRoomSessionId, }); } } catch (err) { window.startRecordingCallBack({ type: 'error', message: 'error_in_web_room_creation', details: err, code:40003 }); return; } } startRecording(); } else { window.startRecordingCallBack({ type:'success', message: 'recording_started_successfully', code:50000 }); } } } catch (err) { logger.error('there_was_an_error_in_starting_the_session',err); callback({ type: 'error', message: 'error_in_starting_the_session', details: err, code:40004 }); } } async function stop_session(callback) { try { const stopSessionResp = await stopAllRecordings(); if (stopSessionResp === 'stop_recording') { const candidateInviteAssessmentSection = convertDataIntoParse('candidateAssessment'); const session = convertDataIntoParse('session'); const resp = await addSectionSessionRecord(session, candidateInviteAssessmentSection); if (resp) { const keysToRemove = [ 'candidateAssessment', 'mereosToken', 'session', 'preChecksSteps', 'secureFeatures', 'schoolTheme', 'conversationId', 'precheckSetting', 'socketGroupId', 'navHistory', 'deviceId', 'microphoneID', ]; keysToRemove.forEach((key) => localStorage.removeItem(key)); callback({ type: 'success', message: 'session_is_finished_successfully', code:50003 }); } else { throw new Error('Session can\'t be added'); } } else { throw 'session can\'t add'; } } catch (err) { logger.error(err); callback({ type: 'error', message: 'error_in_stopping_the_session' , code:40016 }); } } // window.mereos = {init, start_prechecks, start_session, stop_session}; export {init, start_prechecks,stop_prechecks, start_session, stop_session };