(function(i,n){typeof exports=="object"&&typeof module<"u"?n(exports):typeof define=="function"&&define.amd?define(["exports"],n):(i=typeof globalThis<"u"?globalThis:i||self,n(i.honorlock={}))})(this,function(i){"use strict";var w=Object.defineProperty;var x=(i,n,c)=>n in i?w(i,n,{enumerable:!0,configurable:!0,writable:!0,value:c}):i[n]=c;var l=(i,n,c)=>(x(i,typeof n!="symbol"?n+"":n,c),c);function n(t){return{message:"platformInit",pageHasExtensionInstallIframe:t}}function c(t){const e=t.session.configurations.exam_toggles;return{alerts:t.session.alerts??[],message:"sessionSetup",app_url:t.app_url,student:t.session.session,exam_toggles:h(e),translations:t.session.configurations.translations,shortcut_detection_enabled:t.session.configurations.shortcut_detection_enabled,simulated:t.session.configurations.simulated,guidelines:{allowed_messages:t.session.configurations.guidelines.allowed_messages,not_allowed_messages:t.session.configurations.guidelines.not_allowed_messages},whitelisted_urls:t.session.configurations.whitelisted_urls,additional_instructions:t.session.configurations.additional_instructions,camera_url:t.session.camera_url,external_exam_id:t.external_exam_id,exam_taker_id:t.exam_taker_id,exam_taker_name:t.exam_taker_name,exam_taker_attempt_id:t.exam_taker_attempt_id}}function h(t){const e={};return t.forEach(s=>{e[s.id]=s}),e}function m(t,e){return{message:"launchCamera",session_id:t,camera_url:e}}function g(t,e,s){return{message:"questionLoaded",question:{number:t,text:e,html:s}}}const k={message:"examSubmit"},p={message:"examLoaded"},f={message:"examClosed"};class b{constructor(){l(this,"callbacks");l(this,"protectedCallbacks");this.callbacks=new Map,this.protectedCallbacks=new Map}reset(){this.callbacks=new Map,this.protectedCallbacks=new Map}put(e,s,o=!1,a=!1){if(o&&this.clear(e),this.callbacks.has(e)||(this.callbacks.set(e,[]),this.protectedCallbacks.set(e,[])),a){const u=this.protectedCallbacks.get(e);u==null||u.push(s.toString()),this.protectedCallbacks.set(e,u)}const r=this.callbacks.get(e);r==null||r.push(s),this.callbacks.set(e,r)}get(e){return this.callbacks.get(e)}has(e){const s=this.callbacks.get(e);return s!==void 0&&s.length>0}clear(e){const s=this.protectedCallbacks.get(e);if(s===void 0||(s==null?void 0:s.length)===0){this.callbacks.set(e,[]);return}const o=this.callbacks.get(e);o==null||o.forEach((a,r)=>{s!=null&&s.includes(a.toString())||o.splice(r,1)}),this.callbacks.set(e,o)}run(e){const s=this.callbacks.get(e.data.message);s==null||s.forEach(o=>o(e.data))}runForEventName(e,s){const o=this.callbacks.get(e);o==null||o.forEach(a=>a(s))}}class d{constructor(){l(this,"allowedCallbackEvents",["honorlock:instructions:launchProctoring","honorlock:extension:installedSuccessfully","honorlock:extension:sessionSetupSuccess","honorlock:extension:sessionSetupError","honorlock:extension:beginExam","honorlock:instructions:resized","honorlock:extension:contentScriptInjected","honorlock:extension:removed","honorlock:extension:offline","honorlock:extension:installed","honorlock:exam:loaded"]);l(this,"callbackCollection");l(this,"sessionConfig");l(this,"sessionSetupError",!1);l(this,"listeningForMessages",!1);l(this,"initialized");l(this,"handleMessageListeners",e=>{this.allowedCallbackEvents.includes(e.data.message)&&this.runCallbacks(e)});this.callbackCollection=new b,this.initialized=!1,this.setupDefaultCallbacks()}get isInitialized(){return this.initialized}get isListeningForMessages(){return this.listeningForMessages}async init(){if(this.isInitialized)return;this.setupListeners(),window.postMessage(n(this.pageHasExtensionInstallIframe()),window.origin);const e=new Date;return new Promise((s,o)=>{const a=()=>{if(new Date().getTime()-e.getTime()>1e4)return o("platformInit timed out");if(this.initialized)return s();setTimeout(a,100)};a()})}async setupSession(e){if(this.sessionConfig)throw"Session has already been setup!";window.postMessage(c(e),window.origin),this.callbackCollection.put("honorlock:extension:sessionSetupSuccess",()=>{this.sessionConfig=e,this.callbackCollection.put("honorlock:instructions:launchProctoring",()=>{window.postMessage(m(e.session.session.uuid,e.session.camera_url),window.origin)},!0)},!0),this.callbackCollection.put("honorlock:extension:sessionSetupError",()=>{this.sessionSetupError=!0},!0);const s=new Date;return new Promise((o,a)=>{const r=()=>{if(new Date().getTime()-s.getTime()>1e4||this.sessionSetupError)return a("Session setup failed!");if(this.sessionConfig)return o();setTimeout(r,100)};r()})}onLaunchProctoringIframeResize(e){this.callbackCollection.put("honorlock:instructions:resized",e)}onExtensionVerified(e){this.callbackCollection.put("honorlock:extension:installedSuccessfully",e)}onBeginExam(e){this.callbackCollection.put("honorlock:extension:beginExam",e)}onExtensionRemoved(e){this.callbackCollection.put("honorlock:extension:removed",e)}onExtensionOffline(e){this.callbackCollection.put("honorlock:extension:offline",e)}onExamSubmit(e){if(this.callbackCollection.has("honorlock:exam:submit"))throw"An onExamSubmit callback has already been registered. Only 1 onExamSubmit callback is supported.";this.callbackCollection.put("honorlock:exam:submit",e,!1,!0)}examClosed(){window.postMessage(f,window.origin),this.reset()}examSubmit(){if(!this.callbackCollection.has("honorlock:exam:submit"))throw"No exam submit callback!";window.postMessage(k,window.origin),this.callbackCollection.runForEventName("honorlock:exam:submit"),this.reset()}pageHasExtensionInstallIframe(){const e=Array.from(document.getElementsByTagName("iframe")),s=new RegExp(/^(?:[^.]+\.)*honorlock\.com(\/.*)?\/install\/extension(\?.*)?$/);return!e.every(a=>!s.test(a.src))}questionLoaded(e,s,o){window.postMessage(g(e,s,o),window.origin)}onExamLoaded(e){this.callbackCollection.put("honorlock:exam:loaded",e,!1,!0)}examLoaded(){window.postMessage(p,window.origin)}setupListeners(){this.listeningForMessages||(window.addEventListener("message",this.handleMessageListeners),this.listeningForMessages=!0)}reset(){window.removeEventListener("message",this.handleMessageListeners),this.listeningForMessages=!1,this.callbackCollection.reset(),this.sessionConfig=void 0,this.sessionSetupError=!1,this.initialized=!1,this.setupDefaultCallbacks()}runCallbacks(e){this.callbackCollection.run(e)}setupDefaultCallbacks(){this.callbackCollection.put("honorlock:extension:contentScriptInjected",()=>{this.initialized=!0}),this.callbackCollection.put("honorlock:extension:installed",()=>{window.location.reload()})}}globalThis.Honorlock=new d,i.Honorlock=d,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});