UNPKG

@realsee/vr-signals

Version:

vr 信号器

23 lines 45.5 kB
/*! * @realsee/vr-signals v2.0.0 * (c) 2025 Beike Realsee Technology (HK) Limited * @license https://vr-static.realsee-cdn.cn/release/web/@realsee/vr-signals/2.0.0/LICENSE */ var J=Object.defineProperty,X=Object.defineProperties;var Z=Object.getOwnPropertyDescriptors;var R=Object.getOwnPropertySymbols,ee=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable,te=Reflect.get;var K=(a,t,e)=>t in a?J(a,t,{enumerable:true,configurable:true,writable:true,value:e}):a[t]=e,y=(a,t)=>{for(var e in t||(t={}))B.call(t,e)&&K(a,e,t[e]);if(R)for(var e of R(t))$.call(t,e)&&K(a,e,t[e]);return a},T=(a,t)=>X(a,Z(t));var C=(a,t)=>{var e={};for(var n in a)B.call(a,n)&&t.indexOf(n)<0&&(e[n]=a[n]);if(a!=null&&R)for(var n of R(a))t.indexOf(n)<0&&$.call(a,n)&&(e[n]=a[n]);return e};var H=(a,t,e)=>te(ee(a),e,t);var h=(a,t,e)=>new Promise((n,i)=>{var s=d=>{try{o(e.next(d));}catch(c){i(c);}},r=d=>{try{o(e.throw(d));}catch(c){i(c);}},o=d=>d.done?n(d.value):Promise.resolve(d.value).then(s,r);o((e=e.apply(a,t)).next());});var w=()=>{try{return window.self!==window.top}catch(a){return true}},f=()=>{if(typeof window!="undefined"&&window.crypto&&window.crypto.getRandomValues){let a=new Uint8Array(8);return window.crypto.getRandomValues(a),Array.from(a,t=>t.toString(16).padStart(2,"0")).join("").substring(0,8)}return Math.random().toString(36).substring(2,10)};var ne=(a,t,e=false)=>{let n=null;return function(...s){let r=()=>{n=null,e||a(...s);},o=e&&!n;n&&clearTimeout(n),n=setTimeout(r,t),o&&a(...s);}},ie=(a,t)=>{let e;return function(...i){e||(a(...i),e=true,setTimeout(()=>e=false,t));}},G=a=>{let t=(c,g)=>{let m=c.toString();for(;m.length<g;)m="0"+m;return m},e=a.getFullYear(),n=t(a.getMonth()+1,2),i=t(a.getDate(),2),s=t(a.getHours(),2),r=t(a.getMinutes(),2),o=t(a.getSeconds(),2),d=t(a.getMilliseconds(),3);return `${e}-${n}-${i} ${s}:${r}:${o}.${d}`},O=a=>{if(a===null||typeof a!="object")return a;if(a instanceof Date)return new Date(a.getTime());if(a instanceof Array)return a.map(t=>O(t));if(typeof a=="object"){let t={};for(let e in a)a.hasOwnProperty(e)&&(t[e]=O(a[e]));return t}return a};var P=a=>new Promise(t=>setTimeout(t,a)),ae=(a,t=3,e=1e3)=>h(null,null,function*(){let n;for(let i=1;i<=t;i++)try{return yield a()}catch(s){if(n=s,i===t)throw n;yield P(e);}throw n});var E={NONE:0,ERROR:1,WARN:2,INFO:3,DEBUG:4},se={[E.DEBUG]:"DEBUG",[E.INFO]:"INFO",[E.WARN]:"WARN",[E.ERROR]:"ERROR",[E.NONE]:"NONE"},p=class a{constructor(t,e=""){this.level=E[t],this.prefix=e;}debug(t,e){this.logIfEnabled(E.DEBUG,"#2ecc71",t,e);}info(t,e){this.logIfEnabled(E.INFO,"#3498db",t,e);}warn(t,e){this.logIfEnabled(E.WARN,"#f39c12",t,e);}error(t,e){this.logIfEnabled(E.ERROR,"#e74c3c",t,e);}formatMessage(t,e){return e?`${t} ${JSON.stringify(e,a.replacer,2)}`:t}logIfEnabled(t,e,n,i){t<=this.level&&this.log(t,e,n,i);}log(t,e,n,i){let s=this.formatMessage(n,i);console.log(`%c${this.prefix} [${G(new Date)}] <${se[t]}> ${s}`,`color: ${e}; font-weight: bold;`);}static replacer(t,e){return Array.isArray(e)?e.map(n=>a.replacer(t,n)):e instanceof Error?`${e.name}: ${e.message}`:e}};var v=class{static getCurrentDomainInfo(){let t=window.location.origin,e=window.location.hostname,n=window.location.protocol,i=window.location.port;return {origin:t,hostname:e,protocol:n,port:i,isLocalhost:e==="localhost"||e==="127.0.0.1",isSecure:n==="https:",accessible:true}}static getTargetDomainInfo(t){try{let e=t.location.origin,n=t.location.hostname,i=t.location.protocol,s=t.location.port;return {origin:e,hostname:n,protocol:i,port:s,isLocalhost:n==="localhost"||n==="127.0.0.1",isSecure:i==="https:",accessible:!0}}catch(e){return {origin:"unknown",hostname:"unknown",protocol:"unknown",port:"unknown",isLocalhost:false,isSecure:false,accessible:false}}}static generateAdaptiveAllowedOrigins(t,e,n=[]){let i=this.getCurrentDomainInfo(),s=this.getTargetDomainInfo(e),r=[];if(r.push(i.origin),s.accessible&&r.push(s.origin),n.length>0&&r.push(...n),(i.isLocalhost||s.isLocalhost)&&(r.push("http://localhost:*"),r.push("https://localhost:*"),r.push("http://127.0.0.1:*"),r.push("https://127.0.0.1:*"),i.isLocalhost&&s.isLocalhost&&(r.push("http://localhost:*"),r.push("https://localhost:*"),r.push("http://127.0.0.1:*"),r.push("https://127.0.0.1:*"))),!s.accessible&&i.isLocalhost&&(r.push("http://localhost:*"),r.push("https://localhost:*"),r.push("http://127.0.0.1:*"),r.push("https://127.0.0.1:*")),i.hostname===s.hostname&&i.accessible&&s.accessible&&(r.push(`http://${i.hostname}:*`),r.push(`https://${i.hostname}:*`)),!i.isLocalhost&&!s.isLocalhost){let o=this.extractDomain(i.hostname),d=this.extractDomain(s.hostname);o===d&&(r.push(`https://*.${o}`),r.push(`http://*.${o}`));}return [...new Set(r)]}static extractDomain(t){let e=t.split(".");return e.length>=2?e.slice(-2).join("."):t}static validateOriginAdaptive(t,e,n,i=false){if(!i)return true;let s=this.generateAdaptiveAllowedOrigins(e,n);return this.validateOrigin(t,s,i)}static validateOrigin(t,e=[],n=false){return n?t===window.location.origin?true:e.some(i=>{if(i.startsWith("*.")){let s=i.slice(2);return t.endsWith(s)||t===s}if(i.includes(":*")){let s=i.replace(":*","");return t.replace(/:\d+$/,"")===s}return t===i}):true}static validateMessageStructure(t){if(!t||typeof t!="object")return false;let e=["type","uid","payload","fromId","toId","timestamp"];for(let r of e)if(!(r in t))return false;if(typeof t.type!="string"||typeof t.uid!="string"||typeof t.fromId!="string"||typeof t.timestamp!="number")return false;let i=Date.now()-t.timestamp,s=300*1e3;return !(i>s||i<-6e4)}static isDevToolsMessage(t){if(!t||typeof t!="object")return false;if(t.source==="react-devtools-content-script"||t.source==="react-devtools-bridge"||t.source==="react-devtools-backend-manager")return true;if(t.payload&&typeof t.payload=="object"){let e=t.payload;if(e.event==="operations"||e.event==="backendInitialized"||e.event==="getBackendVersion"||e.event==="getIfHasUnsupportedRendererVersion"||e.event==="getHookSettings"||e.event==="backendVersion"||e.event==="hookSettings"||e.event==="setTraceUpdatesEnabled"||e.event==="extensionBackendInitialized")return true}return false}static validateMessageStructureDetailed(t){if(this.isDevToolsMessage(t))return {valid:false,reason:"DevTools message - silently ignored",details:{source:"devtools",message:t}};if(!t||typeof t!="object")return {valid:false,reason:"Message is not an object",details:{received:t,type:typeof t}};let n=["type","uid","payload","fromId","toId","timestamp"].filter(d=>!(d in t));if(n.length>0)return {valid:false,reason:`Missing required fields: ${n.join(", ")}`,details:{missing:n,present:Object.keys(t),message:t}};let i=[];if(typeof t.type!="string"&&i.push(`type should be string, got ${typeof t.type}`),typeof t.uid!="string"&&i.push(`uid should be string, got ${typeof t.uid}`),typeof t.fromId!="string"&&i.push(`fromId should be string, got ${typeof t.fromId}`),typeof t.timestamp!="number"&&i.push(`timestamp should be number, got ${typeof t.timestamp}`),i.length>0)return {valid:false,reason:`Type validation failed: ${i.join(", ")}`,details:{errors:i,message:t}};let s=Date.now(),r=s-t.timestamp,o=300*1e3;return r>o||r<-6e4?{valid:false,reason:`Timestamp validation failed: message age ${r}ms is outside allowed range`,details:{messageAge:r,maxAge:o,messageTimestamp:t.timestamp,currentTime:s}}:{valid:true}}static generateSignature(t,e){let d=t,{signature:n}=d,i=C(d,["signature"]),s=JSON.stringify(i),r=0;for(let c=0;c<s.length;c++){let g=s.charCodeAt(c);r=(r<<5)-r+g,r=r&r;}let o=0;for(let c=0;c<e.length;c++){let g=e.charCodeAt(c);o=(o<<5)-o+g,o=o&o;}return (r^o).toString(36)}static validateSignature(t,e){if(!t.signature)return false;let n=this.generateSignature(t,e);return t.signature===n}static sanitizeMessage(t){let i=t,{signature:e}=i;return C(i,["signature"])}static getSecureTargetOriginAdaptive(t,e=false,n=[]){try{let i=t.location.origin,s=this.generateAdaptiveAllowedOrigins(window,t,n);return this.validateOrigin(i,s,e)?i:e?"":"*"}catch(i){return this.getCurrentDomainInfo().isLocalhost?"*":e?"":"*"}}static getSecureTargetOrigin(t,e=[],n=false){try{let i=t.location.origin;return this.validateOrigin(i,e,n)?i:n?"":"*"}catch(i){return n?"":"*"}}};var I=class{constructor(t){this.toIds=[];this.handshakedIds=[];this.ready=false;this.connectionStatus="disconnected";this.currentReconnectAttempts=0;this.reconnectTimer=null;this.handshakeTimer=null;this.messageQueue=[];this.isHandshaking=false;this.updateConnectionStatus=t=>{this.connectionStatus!==t&&(this.connectionStatus=t,this.eventTarget.dispatchEvent(new CustomEvent("connection.status",{detail:t})),this.logger.info(`Connection status changed to: ${t}`));};this.startHandshake=()=>{if(this.logger.info(`startHandshake called, isHandshaking: ${this.isHandshaking}`),this.isHandshaking){this.logger.warn("Already handshaking, skipping");return}this.logger.info("Starting handshake process"),this.isHandshaking=true,this.updateConnectionStatus("connecting"),this.handshake(this.shakehandRetryTimes);};this.onMessage=t=>{var o,d,c,g;let e=((o=this.instance.getOptions())==null?void 0:o.security)||{},n=(d=e.validateOrigin)!=null?d:false,i=(c=e.strictMode)!=null?c:false;if(n&&!v.validateOriginAdaptive(t.origin,window,this.targetWindow,i))return this.logger.warn(`Rejected message from untrusted origin: ${t.origin}`),false;let s=v.validateMessageStructureDetailed(t.data);if(!s.valid){if(s.reason==="DevTools message - silently ignored")return false;if(i)return this.logger.warn("Rejected message with invalid structure",{reason:s.reason,details:s.details,origin:t.origin,source:(g=t.source)==null?void 0:g.toString()}),false;this.logger.debug("Message validation warning (compatibility mode):",{reason:s.reason,details:s.details});}if(this.logger.debug("receive message: ",t.data),t.data.type!=="event"&&t.data.type!=="action.request"&&t.data.type!=="action.response"&&t.data.type!=="handshake")return this.logger.debug("message type is not valid, ignore",{type:t.data.type}),false;let r=Array.isArray(t.data.toId)?t.data.toId:[t.data.toId];if(r.indexOf(this.uuid)===-1&&r.indexOf("*")===-1)return this.logger.debug("message is not for me, ignore",{toIds:r}),false;if(e.validateSignature&&e.signatureKey&&!v.validateSignature(t.data,e.signatureKey))return this.logger.warn("Rejected message with invalid signature"),false;switch(t.data.type){case "event":return this.onEventMessage(t.data);case "action.request":return this.onActionRequestMessage(t.data);case "action.response":return this.onActionResponseMessage(t.data);case "handshake":return this.onHandshakeMessage(t.data)}};this.onHandshakeMessage=t=>{this.logger.info(`receive handshake message from: ${t.fromId}`,t),this.logger.info(`Current toIds: ${JSON.stringify(this.toIds)}, handshakedIds: ${JSON.stringify(this.handshakedIds)}`),this.toIds.indexOf(t.fromId)===-1&&this.handshakedIds.indexOf(t.fromId)===-1?(this.logger.info(`Adding ${t.fromId} to toIds and handshakedIds`),this.toIds.push(t.fromId),this.handshakedIds.push(t.fromId),this.logger.info(`Sending handshake response to ${t.fromId}`),this.sendMessage({type:"handshake",uid:f(),payload:{},fromId:this.uuid,toId:t.fromId,timestamp:Date.now()}),this.eventTarget.dispatchEvent(new CustomEvent("handshake.success",{detail:t.fromId}))):this.logger.debug(`handshake message from ${t.fromId} has been received before`),this.toIds.length>0?(this.logger.info(`Setting ready to true, toIds: ${JSON.stringify(this.toIds)}`),this.ready=true,this.isHandshaking=false,this.updateConnectionStatus("connected"),this.logger.info("Dispatching ready event"),this.eventTarget.dispatchEvent(new Event("ready")),this.flushMessageQueue()):this.logger.warn(`Handshake received but toIds is empty: ${JSON.stringify(this.toIds)}`);};this.onEventMessage=t=>{this.logger.info("receive event message: ",t);let e=t.payload,{eventName:n,eventData:i}=e;this.instance.dispatchCustomEvent(String(n),i);};this.onActionRequestMessage=t=>h(this,null,function*(){this.logger.info("receive action request message: ",t);let e=t.payload,{method:n,data:i}=e,s=t.uid;try{let r=yield this.executeRequest(n,i);this.sendMessage({type:"action.response",uid:f(),payload:{uid:s,method:n,data:r},fromId:this.uuid,toId:t.fromId,timestamp:Date.now()});}catch(r){let o=r;this.sendMessage({type:"action.response",uid:f(),payload:{method:n,uid:s,error:{name:o.name,message:o.message,stack:o.stack}},fromId:this.uuid,toId:t.fromId,timestamp:Date.now()});}});this.executeRequest=(t,e)=>h(this,null,function*(){var i;if(typeof this.instance.handleActionRequest=="function")return yield this.instance.handleActionRequest(String(t),e);let n=(i=this.instance.actionMap)==null?void 0:i[t];if(!n)throw new Error(`action ${String(t)} not found`);return yield n(e)});this.onActionResponseMessage=t=>{this.logger.info("receive action response message: ",t);let e=t.payload,{method:n,data:i,error:s}=e,r=e.uid||t.uid;if(s){let o=new Error(s.message);o.name=s.name,o.stack=s.stack,this.eventTarget.dispatchEvent(new CustomEvent("action.request.error",{detail:{method:n,uid:r,error:o}}));}else this.eventTarget.dispatchEvent(new CustomEvent("action.request.success",{detail:{method:n,uid:r,data:i}}));};this.requestAcion=(t,e)=>new Promise((n,i)=>{let s=f(),r=[],o=()=>{r.forEach(u=>u());},d=u=>{u.uid===s&&(n(u.data),o());},c=u=>{u.uid===s&&(i(u.error),o());},g=u=>{u instanceof CustomEvent&&d(u.detail);},m=u=>{u instanceof CustomEvent&&c(u.detail);};r.push(()=>this.eventTarget.removeEventListener("action.request.success",g),()=>this.eventTarget.removeEventListener("action.request.error",m)),this.eventTarget.addEventListener("action.request.success",g),this.eventTarget.addEventListener("action.request.error",m),this.sendMessage({type:"action.request",uid:s,payload:{method:t,uid:s,data:e},fromId:this.uuid,toId:this.toIds,timestamp:Date.now()});});this.handshake=t=>h(this,null,function*(){this.logger.info(`Starting handshake with ${t} retry attempts`),this.logger.info("Using exponential backoff with jitter strategy");let e=null,n=[],i=()=>{n.forEach(c=>c());},s=c=>{e!==null&&cancelAnimationFrame(e),this.logger.info(`Handshake with ${c} successful!`),this.logger.info(`Current ready status: ${this.ready}`),i();},r=c=>{e!==null&&cancelAnimationFrame(e),this.logger.error("Handshake failed:",c),i(),this.handleHandshakeFailure();},o=c=>{c instanceof CustomEvent&&s(c.detail);},d=c=>{c instanceof CustomEvent&&r(c.detail);};n.push(()=>this.eventTarget.removeEventListener("handshake.success",o),()=>this.eventTarget.removeEventListener("handshake.fail",d)),this.eventTarget.addEventListener("handshake.success",o),this.eventTarget.addEventListener("handshake.fail",d);for(let c=0;c<t;c++){if(this.ready){this.logger.info(`Handshake completed early at attempt ${c+1}`);break}if(this.logger.info(`Handshake attempt ${c+1}/${t}`),e=requestAnimationFrame(()=>{let g={type:"handshake",uid:f(),payload:{},fromId:this.uuid,toId:"*",timestamp:Date.now()};this.logger.debug("Sending handshake message:",g),this.sendMessage(g);}),c<t-1){let u=Math.min(500*Math.pow(2,c),5e3),z=Math.random()*.3+.85,L=Math.floor(u*z);this.logger.info(`Waiting ${L}ms before next attempt (exponential backoff + jitter)`),yield new Promise(Q=>setTimeout(Q,L));}}this.ready||(this.logger.error(`Handshake failed after ${t} attempts`),this.eventTarget.dispatchEvent(new CustomEvent("handshake.fail",{detail:new Error(`handshake fail after ${t} times`)})));});this.handleHandshakeFailure=()=>{this.isHandshaking=false,this.updateConnectionStatus("error"),this.enableAutoReconnect&&this.currentReconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect();};this.scheduleReconnect=()=>{var d;this.currentReconnectAttempts++,this.updateConnectionStatus("reconnecting");let t=((d=this.instance.getOptions())==null?void 0:d.reconnectStrategy)||{},e=t.baseDelay||2e3,n=t.maxDelay||3e4,i=t.jitterRange||[.8,1.2],s=Math.min(e*Math.pow(2,this.currentReconnectAttempts-1),n),r=Math.random()*(i[1]-i[0])+i[0],o=Math.floor(s*r);this.logger.info(`Scheduling reconnect attempt ${this.currentReconnectAttempts}/${this.maxReconnectAttempts}`),this.logger.info(`Reconnect will happen in ${o}ms (exponential backoff + jitter)`),this.reconnectTimer=setTimeout(()=>{this.logger.info(`Executing scheduled reconnect attempt ${this.currentReconnectAttempts}/${this.maxReconnectAttempts}`),this.startHandshake();},o);};this.sendMessage=t=>{var r,o;this.logger.debug("send message: ",t);let e=((r=this.instance.getOptions())==null?void 0:r.security)||{},n=(o=e.strictMode)!=null?o:false,i=e.allowedOrigins||[],s=v.getSecureTargetOriginAdaptive(this.targetWindow,n,i);if(!s&&n){this.logger.warn("Cannot send message: no secure target origin available");return}if(t.type==="handshake"){try{this.logger.debug("Sending handshake message directly"),this.targetWindow.postMessage(t,s),this.logger.debug("Handshake message sent successfully");}catch(d){this.logger.error("Failed to send handshake message:",d),this.updateConnectionStatus("error");}return}if(!this.ready){this.messageQueue.push(t),this.logger.debug("Message queued, connection not ready");return}try{this.targetWindow.postMessage(t,s);}catch(d){this.logger.error("Failed to send message:",d),this.updateConnectionStatus("error");}};this.flushMessageQueue=()=>{var s,r;if(this.messageQueue.length===0)return;this.logger.info(`Flushing ${this.messageQueue.length} queued messages`);let t=((s=this.instance.getOptions())==null?void 0:s.security)||{},e=(r=t.strictMode)!=null?r:false,n=t.allowedOrigins||[],i=v.getSecureTargetOriginAdaptive(this.targetWindow,e,n);for(;this.messageQueue.length>0;){let o=this.messageQueue.shift();try{this.targetWindow.postMessage(o,i);}catch(d){this.logger.error("Failed to send queued message:",d),this.messageQueue.unshift(o);break}}};this.sendEvent=(t,e)=>{let n=f();this.sendMessage({type:"event",uid:n,payload:{eventName:t,eventData:e,uid:n},fromId:this.uuid,toId:this.toIds,timestamp:Date.now()});};this.onReady=t=>{this.logger.info(`onReady called, current ready status: ${this.ready}`),this.ready?(this.logger.info("Already ready, executing callback immediately"),t()):(this.logger.info("Not ready yet, adding callback to event listener"),this.eventTarget.addEventListener("ready",t,{once:true}));};this.getConnectionStatus=()=>this.connectionStatus;this.onError=t=>{let e=n=>{n instanceof CustomEvent&&t(n.detail);};return this.eventTarget.addEventListener("error",e),()=>{this.eventTarget.removeEventListener("error",e);}};this.onConnectionStatusChange=t=>{let e=n=>{n instanceof CustomEvent&&t(n.detail);};return this.eventTarget.addEventListener("connection.status",e),()=>{this.eventTarget.removeEventListener("connection.status",e);}};this.offConnectionStatusChange=t=>{this.logger.warn("offConnectionStatusChange() method is deprecated, use removeEventListener() instead");};this.reconnect=()=>{this.logger.info("Manual reconnect called"),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.logger.info("Resetting connection state for reconnect"),this.currentReconnectAttempts=0,this.messageQueue=[],this.ready=false,this.toIds=[],this.handshakedIds=[],this.logger.info("Starting handshake after reconnect"),this.startHandshake();};this.dispose=()=>{this.selfWindow.removeEventListener("message",this.onMessage),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.handshakeTimer&&(clearTimeout(this.handshakeTimer),this.handshakeTimer=null),this.messageQueue=[],this.updateConnectionStatus("disconnected");};var e;this.uuid=t.uuid||f(),this.logger=t.logger||new p("INFO","Realsee MessageBridge"),this.eventTarget=new EventTarget,this.selfWindow=t.selfWindow,this.targetWindow=t.targetWindow,this.instance=t.instance,this.shakehandRetryTimes=t.shakehandRetryTimes||10,this.enableAutoReconnect=(e=t.enableAutoReconnect)!=null?e:true,this.reconnectInterval=t.reconnectInterval||5e3,this.maxReconnectAttempts=t.maxReconnectAttempts||5,this.logger.info(`MessageBridge constructor called with UUID: ${this.uuid}`),this.logger.info(`Handshake retry times: ${this.shakehandRetryTimes}`),this.logger.info(`Auto reconnect enabled: ${this.enableAutoReconnect}`),this.logger.info(`Max reconnect attempts: ${this.maxReconnectAttempts}`),this.selfWindow.addEventListener("message",this.onMessage),this.logger.info("Message listener added, starting handshake"),this.startHandshake();}};var b=class extends EventTarget{addEventListener(t,e,n){super.addEventListener(t,e,n);}removeEventListener(t,e,n){super.removeEventListener(t,e,n);}dispatchEvent(t){return super.dispatchEvent(t)}dispatchCustomEvent(t,e,n){let i=new CustomEvent(t,y({detail:e,bubbles:true,cancelable:true},n));return this.dispatchEvent(i)}dispatchBuiltInEvent(t,e){let n=new Event(t,y({bubbles:true,cancelable:true},e));return this.dispatchEvent(n)}hasEventListener(t){return true}getListenerCount(t){return 0}removeAllListeners(t){}addEventListenerWithAbort(t,e,n,i){return i&&i.addEventListener("abort",()=>{this.removeEventListener(t,e,n);}),this.addEventListener(t,e,n),()=>{this.removeEventListener(t,e,n);}}};var S=class{constructor(t=console){this.actions=new Map;this.logger=t;}register(t,e){this.actions.has(t)&&this.logger.warn(`Action '${String(t)}' is already registered, overwriting...`),this.actions.set(t,e),this.logger.info(`Action '${String(t)}' registered successfully`);}registerActions(t){for(let[e,n]of Object.entries(t))this.register(e,n);}unregister(t){let e=this.actions.delete(t);return e?this.logger.info(`Action '${String(t)}' unregistered successfully`):this.logger.warn(`Action '${String(t)}' was not registered`),e}has(t){return this.actions.has(t)}getRegisteredActions(){return Array.from(this.actions.keys())}execute(i,s){return h(this,arguments,function*(t,e,n={}){let{signal:r,timeout:o}=n;if(!this.actions.has(t))throw new Error(`Action '${String(t)}' is not registered`);let d=new AbortController,c=o?setTimeout(()=>d.abort(),o):null;try{let g=this.combineSignals(r,d.signal);if(g!=null&&g.aborted)throw new Error(`Action '${String(t)}' execution was aborted`);let u=yield this.actions.get(t)(e);return this.logger.debug(`Action '${String(t)}' executed successfully`),u}catch(g){throw this.logger.error(`Action '${String(t)}' execution failed`,g),g}finally{c&&clearTimeout(c);}})}executeWithAbort(t,e,n={}){let i=new AbortController,{signal:s}=n,r=this.combineSignals(i.signal,s);return {promise:this.execute(t,e,T(y({},n),{signal:r})),abort:()=>i.abort(),signal:i.signal}}clear(){let t=this.actions.size;this.actions.clear(),this.logger.info(`Cleared ${t} actions`);}get size(){return this.actions.size}combineSignals(...t){let e=t.filter(Boolean);if(e.length===0)return;if(e.length===1)return e[0];let n=new AbortController;for(let i of e){if(i.aborted){n.abort();break}i.addEventListener("abort",()=>{n.abort();});}return n.signal}};var A=class extends b{constructor(e){super();this.parentElement=document.body;this.iframeElement=null;this.vrLink=null;this.uuid=f();this.messageBridge=null;this.t="disconnected";this.validateControlModeOptions=e=>{if(!(e!=null&&e.vrLink))throw new Error("vrLink is required for control mode");try{this.vrLink=new URL(e.vrLink);}catch(n){throw new Error(`Invalid vrLink: ${e.vrLink}. Must be a valid URL.`)}if(!(e!=null&&e.element))throw new Error("element is required for control mode");if(!(e.element instanceof HTMLIFrameElement)&&!(e.element instanceof HTMLElement))throw new Error("element must be a HTMLIFrameElement or HTMLElement")};this.setupControlMode=e=>{var n;(e==null?void 0:e.element)instanceof HTMLIFrameElement?(this.iframeElement=e.element,this.parentElement=((n=this.iframeElement)==null?void 0:n.parentElement)||document.body):(e==null?void 0:e.element)instanceof HTMLElement&&(this.parentElement=e.element,this.iframeElement=this.createIframe(this.parentElement)),this.iframeElement&&this.vrLink&&(this.iframeElement.allow="fullscreen; xr-spatial-tracking",this.iframeElement.src=this.vrLink.href,this.iframeElement.onerror=i=>{this.logger.error("Iframe load error:",i),this.t="error";},this.iframeElement.onload=()=>{this.logger.info("Iframe loaded successfully");});};this.createIframe=e=>{let n=document.createElement("iframe");return n.style.width="100%",n.style.height="100%",n.style.border="none",n.style.display="block",n.onerror=i=>{this.logger.error("Iframe creation error:",i);},e.appendChild(n),n};this.initMessageBridge=(e=10)=>{this.logger.info("Initializing MessageBridge..."),this.logger.info(`Handshake retry times: ${e}`),this.logger.info(`Target window: ${!!this.targetWindow}`),this.logger.info(`Mode: ${this.mode}`),this.targetWindow?(this.logger.info("Target window available, creating MessageBridge"),this.messageBridge=new I({selfWindow:window,targetWindow:this.targetWindow,logger:this.logger,uuid:this.uuid,instance:this,shakehandRetryTimes:e,enableAutoReconnect:this.options.enableAutoReconnect,reconnectInterval:this.options.reconnectInterval,maxReconnectAttempts:this.options.maxReconnectAttempts}),this.logger.info("MessageBridge created successfully"),this.messageBridge.onConnectionStatusChange(n=>{var i;this.t=n,this.logger.info(`Connection status changed to: ${n}`),(i=this.onConnectionStatusChanged)==null||i.call(this,n);}),this.messageBridge.onError(n=>{this.logger.error("MessageBridge error:",n),this.t="error";}),this.logger.info("MessageBridge event listeners configured")):(this.logger.error("Target window not available, cannot initialize MessageBridge"),this.logger.error(`Mode: ${this.mode}, iframeElement: ${!!this.iframeElement}, vrLink: ${!!this.vrLink}`));};this.onReady=e=>{if(this.logger.info("Base.onReady called"),this.messageBridge)return this.logger.info("MessageBridge exists, delegating to MessageBridge.onReady"),this.messageBridge.onReady(e);this.logger.error("MessageBridge is null, cannot register onReady callback");};this.reconnect=()=>{this.messageBridge&&this.messageBridge.reconnect();};this.dispose=()=>{this.logger.info("Disposing Base instance"),this.messageBridge&&this.messageBridge.dispose(),this.iframeElement&&(this.iframeElement.onerror=null,this.iframeElement.onload=null,this.iframeElement.remove()),this.t="disconnected",this.logger.info("Base instance disposed");};this.options=e||{},this.logger=new p((e==null?void 0:e.logLevel)||"NONE",`Realsee Signals <ID:${w()?"child":"parent"}-${this.uuid}>`),this.e=new S(console);let n=w();n?this.logger.info("I`m in iframe"):this.logger.info("I`m in window"),this.mode=n?"controlled":"control",this.mode==="control"&&(this.validateControlModeOptions(e),this.setupControlMode(e)),e!=null&&e.actionMap&&this.e.registerActions(e.actionMap),this.initMessageBridge(e==null?void 0:e.shakehandRetryTimes);}get actionMap(){return this.n}get actionManager(){return this.e}get targetWindow(){var e;return this.mode==="control"?(e=this.iframeElement)==null?void 0:e.contentWindow:window.parent}get connectionStatus(){return this.t}getOptions(){return this.options}onConnectionStatusChange(e){var n;return (n=this.messageBridge)==null?void 0:n.onConnectionStatusChange(e)}offConnectionStatusChange(e){var n;return (n=this.messageBridge)==null?void 0:n.offConnectionStatusChange(e)}handleActionRequest(e,n){return h(this,null,function*(){if(this.e.has(e))return this.e.execute(e,n);if(this.n&&e in this.n){let i=this.n[e];if(i)return i(n)}throw new Error(`Action '${e}' is not implemented`)})}sendEvent(e,n){var i;if(this.connectionStatus!=="connected"){this.logger.warn(`Cannot send event: connection not ready. Current status: ${this.connectionStatus}`);return}return this.dispatchCustomEvent(String(e),n),(i=this.messageBridge)==null?void 0:i.sendEvent(e,n)}send(e,n){return h(this,null,function*(){var s;if(this.connectionStatus!=="connected")throw new Error(`Cannot send action: connection not ready. Current status: ${this.connectionStatus}`);let i=yield (s=this.messageBridge)==null?void 0:s.requestAcion(e,n);if(i===void 0&&this.messageBridge===void 0)throw new Error(`Action '${String(e)}' execution failed: no message bridge`);return i})}on(e,n){let i=s=>{s instanceof CustomEvent?n(s.detail):n(s);};return this.addEventListener(String(e),i),()=>{this.removeEventListener(String(e),i);}}off(e,n){this.logger.warn("off() method is deprecated, use removeEventListener() instead");}once(e,n){let i=s=>{s instanceof CustomEvent?n(s.detail):n(s);};return this.addEventListener(String(e),i,{once:true}),()=>{this.removeEventListener(String(e),i);}}};var k=class extends EventTarget{constructor(){super(...arguments);this.availableActions=new Set;this.logger=new p("INFO");}updateAvailability(e,n){if(!Array.isArray(e)||e.length===0){this.logger.warn("updateAvailability: actions parameter must be a non-empty array",{actions:e,available:n});return}n?(e.forEach(i=>this.availableActions.add(i)),this.logger.debug(`Actions ${e.map(String).join(", ")} are now available`)):(e.forEach(i=>this.availableActions.delete(i)),this.logger.debug(`Actions ${e.map(String).join(", ")} are no longer available`)),this.dispatchEvent(new CustomEvent("availability.changed",{detail:{actions:e,available:n}}));}isAvailable(e){return this.availableActions.has(e)}getAvailableActions(){return Array.from(this.availableActions)}onAvailabilityChange(e){let n=i=>{i instanceof CustomEvent&&e(i.detail);};return this.addEventListener("availability.changed",n),()=>{this.removeEventListener("availability.changed",n);}}onActionAvailabilityChange(e,n){let i=s=>{if(s instanceof CustomEvent){let r=s.detail;r.actions.includes(e)&&n(r.available);}};return this.addEventListener("availability.changed",i),()=>{this.removeEventListener("availability.changed",i);}}clear(){let e=this.availableActions.size;this.availableActions.clear(),this.logger.info(`Cleared ${e} available actions`);}},D=class a extends A{constructor(e){super(e);this.logger=new p("INFO");this.subscribe=this;this.logger.info("Client constructor called"),this.actionAvailabilityManager=new k,this.addEventListener("sdk.availability.action.registered",this.handleActionAvailabilityChange.bind(this)),this.addEventListener("sdk.availability.action.unregistered",this.handleActionAvailabilityChange.bind(this)),this.addEventListener("sdk.availability.action.batch_registered",this.handleActionAvailabilityChange.bind(this)),this.addEventListener("sdk.availability.action.batch_unregistered",this.handleActionAvailabilityChange.bind(this)),this.addEventListener("sdk.availability.action.cleared",this.handleActionAvailabilityChange.bind(this)),this.logger.info("Client initialized with action availability management"),this.logger.info(`Client connection status: ${this.connectionStatus}`);}send(e,n){return h(this,null,function*(){if(!this.actionAvailabilityManager.isAvailable(e)){let i=new Error(`Action '${String(e)}' is not available on the remote side`);throw this.logger.error(`Action request failed: ${i.message}`),i}if(this.connectionStatus!=="connected"){let i=new Error(`Cannot send action: connection not ready. Current status: ${this.connectionStatus}`);throw this.logger.error(`Action request failed: ${i.message}`),i}try{let i=yield H(a.prototype,this,"send").call(this,e,n);return this.logger.debug(`Action '${String(e)}' executed successfully`),i}catch(i){throw this.logger.error(`Action '${String(e)}' execution failed`,i),i}})}callAction(e,n){return h(this,null,function*(){return this.logger.warn(`callAction() method is deprecated, use send() instead. Action: ${String(e)}`),this.send(e,n)})}isActionAvailable(e){return this.actionAvailabilityManager.isAvailable(e)}getAvailableActions(){return this.actionAvailabilityManager.getAvailableActions()}onActionAvailabilityChange(e,n){return this.actionAvailabilityManager.onActionAvailabilityChange(e,n)}onActionAvailabilityChangeAll(e){return this.actionAvailabilityManager.onAvailabilityChange(e)}waitForAction(e,n=3e4){return new Promise((i,s)=>{if(this.isActionAvailable(e)){i();return}let r=setTimeout(()=>{s(new Error(`Timeout waiting for action '${String(e)}' to become available`));},n),o=this.onActionAvailabilityChange(e,d=>{d&&(clearTimeout(r),o(),i());});})}getActionStats(){let e=this.getAvailableActions();return {available:e.length,total:8,availableActions:e}}handleActionAvailabilityChange(e){let n=e.detail||e,{actionName:i,stats:s}=n;if(!Array.isArray(i)){this.logger.warn("Invalid action availability event: actionName is not an array",{eventData:n});return}e.type==="sdk.availability.action.registered"||e.type==="sdk.availability.action.batch_registered"?this.actionAvailabilityManager.updateAvailability(i,true):e.type==="sdk.availability.action.unregistered"||e.type==="sdk.availability.action.batch_unregistered"?this.actionAvailabilityManager.updateAvailability(i,false):e.type==="sdk.availability.action.cleared"&&this.actionAvailabilityManager.clear(),this.logger.info(`Action availability updated: ${e.type}`,{actionName:i,stats:s});}onConnectionStatusChanged(e){var n;(n=super.onConnectionStatusChanged)==null||n.call(this,e),(e==="disconnected"||e==="error")&&(this.actionAvailabilityManager.clear(),this.logger.info("Connection lost, cleared action availability"));}};var x=class{constructor(){this.actions=new Map;this.logger=new p("INFO");}register(t,e){this.actions.has(t)&&this.logger.warn(`Action '${String(t)}' is already registered, overwriting...`),this.actions.set(t,e),this.logger.info(`Action '${String(t)}' registered successfully`);}unregister(t){let e=this.actions.delete(t);return e?this.logger.info(`Action '${String(t)}' unregistered successfully`):this.logger.warn(`Action '${String(t)}' was not registered`),e}has(t){return this.actions.has(t)}getRegisteredActions(){return Array.from(this.actions.keys())}execute(t,e){return h(this,null,function*(){let n=this.actions.get(t);if(!n)throw new Error(`Action '${String(t)}' is not registered`);try{let i=yield n(e);return this.logger.debug(`Action '${String(t)}' executed successfully`),i}catch(i){throw this.logger.error(`Action '${String(t)}' execution failed`,i),i}})}clear(){let t=this.actions.size;this.actions.clear(),this.logger.info(`Cleared ${t} actions`);}get size(){return this.actions.size}},_=class extends A{constructor(e={}){super(e);this.logger=new p("INFO");this.actionRegistry=new x,e.actionMap&&this.registerActions(e.actionMap),this.logger.info("Remote initialized with dynamic action support");}registerAction(e,n){this.actionRegistry.register(e,n),this.notifyActionChange("registered",e);}registerActions(e){for(let[n,i]of Object.entries(e))this.actionRegistry.register(n,i);this.notifyActionChange("batch_registered",Object.keys(e));}unregisterAction(e){let n=this.actionRegistry.unregister(e);return n&&this.notifyActionChange("unregistered",e),n}unregisterActions(e){let n=0;for(let i of e)this.actionRegistry.unregister(i)&&n++;return n>0&&this.notifyActionChange("batch_unregistered",e),n}hasAction(e){return this.actionRegistry.has(e)}getRegisteredActions(){return this.actionRegistry.getRegisteredActions()}clearActions(){let e=this.actionRegistry.size;this.actionRegistry.clear(),this.notifyActionChange("cleared",e);}onActionChange(e){let n=i=>{i instanceof CustomEvent&&e(i.detail);};return this.addEventListener("action.change",n),()=>{this.removeEventListener("action.change",n);}}onActionAvailabilityChange(e,n){let i=s=>{if(s instanceof CustomEvent){let r=s.detail;(r.actionName.includes(e)||r.type==="batch_registered"||r.type==="batch_unregistered")&&n(this.hasAction(e));}};return this.addEventListener("action.change",i),()=>{this.removeEventListener("action.change",i);}}getActionStats(){return {total:this.actionRegistry.size,registered:this.actionRegistry.getRegisteredActions(),timestamp:Date.now()}}notifyActionChange(e,n){let i={type:e,actionName:Array.isArray(n)?n:[n],timestamp:Date.now(),stats:this.getActionStats()};switch(this.dispatchCustomEvent("action.change",i),e){case "registered":this.sendEvent("sdk.availability.action.registered",i);break;case "unregistered":this.sendEvent("sdk.availability.action.unregistered",i);break;case "batch_registered":this.sendEvent("sdk.availability.action.batch_registered",i);break;case "batch_unregistered":this.sendEvent("sdk.availability.action.batch_unregistered",i);break;case "cleared":this.sendEvent("sdk.availability.action.cleared",i);break}}handleActionRequest(e,n){return h(this,null,function*(){if(!this.actionRegistry.has(e)){let i=new Error(`Action '${e}' is not registered`);throw this.logger.error(`Action request failed: ${i.message}`),i}return this.actionRegistry.execute(e,n)})}getActionRegistry(){return this.actionRegistry}};var re=(n=>(n.INNER="inner",n.SDK="sdk",n.REGISTERED="registered",n))(re||{}),F=(c=>(c.CONNECTION="connection",c.STATE="state",c.MESSAGE="message",c.ACTION="action",c.TAG="tag",c.MONITOR="monitor",c.CAMERA="camera",c.OVERLAY="overlay",c.CUSTOM="custom",c))(F||{}),W=(l=>(l.INNER_CONNECTION_HANDSHAKE="inner.connection.handshake",l.INNER_CONNECTION_HANDSHAKE_SUCCESS="inner.connection.handshake.success",l.INNER_CONNECTION_HANDSHAKE_FAIL="inner.connection.handshake.fail",l.INNER_CONNECTION_RECONNECT="inner.connection.reconnect",l.INNER_MESSAGE_QUEUED="inner.message.queued",l.INNER_MESSAGE_SENT="inner.message.sent",l.INNER_MESSAGE_RECEIVED="inner.message.received",l.INNER_MESSAGE_ERROR="inner.message.error",l.INNER_ACTION_REQUEST="inner.action.request",l.INNER_ACTION_RESPONSE="inner.action.response",l.INNER_ACTION_TIMEOUT="inner.action.timeout",l.INNER_ACTION_ERROR="inner.action.error",l.SDK_CONNECTION_CONNECT="sdk.connection.connect",l.SDK_CONNECTION_DISCONNECT="sdk.connection.disconnect",l.SDK_CONNECTION_RECONNECT="sdk.connection.reconnect",l.SDK_CONNECTION_ERROR="sdk.connection.error",l.SDK_CONNECTION_STATUS_CHANGE="sdk.connection.status.change",l.SDK_LIFECYCLE_READY="sdk.lifecycle.ready",l.SDK_LIFECYCLE_DESTROY="sdk.lifecycle.destroy",l.SDK_LIFECYCLE_STATE_CHANGE="sdk.lifecycle.state.change",l.SDK_MESSAGE_SENT="sdk.message.sent",l.SDK_MESSAGE_RECEIVED="sdk.message.received",l.SDK_MESSAGE_ERROR="sdk.message.error",l.SDK_ACTION_EXECUTED="sdk.action.executed",l.SDK_ACTION_SUCCESS="sdk.action.success",l.SDK_ACTION_FAILED="sdk.action.failed",l.SDK_ACTION_TIMEOUT="sdk.action.timeout",l.SDK_ACTION_ABORTED="sdk.action.aborted",l.SDK_AVAILABILITY_ACTION_REGISTERED="sdk.availability.action.registered",l.SDK_AVAILABILITY_ACTION_UNREGISTERED="sdk.availability.action.unregistered",l.SDK_AVAILABILITY_ACTION_BATCH_REGISTERED="sdk.availability.action.batch.registered",l.SDK_AVAILABILITY_ACTION_BATCH_UNREGISTERED="sdk.availability.action.batch.unregistered",l.SDK_AVAILABILITY_ACTION_CLEARED="sdk.availability.action.cleared",l.REGISTERED_STATE_SYNCED="registered.state.synced",l.REGISTERED_CAMERA_UPDATE="registered.camera.update",l.REGISTERED_TAG_CLICK="registered.tag.click",l.REGISTERED_TAG_LIST_RETRIEVED="registered.tag.list.retrieved",l.REGISTERED_TAG_LIST_ERROR="registered.tag.list.error",l.REGISTERED_MONITOR_OPEN="registered.monitor.open",l.REGISTERED_MONITOR_CLOSE="registered.monitor.close",l.REGISTERED_OVERLAY_VISIBLE="registered.overlay.visible",l.REGISTERED_CUSTOM="registered.custom",l))(W||{}),M={INNER:["inner.connection.handshake","inner.connection.handshake.success","inner.connection.handshake.fail","inner.connection.reconnect","inner.message.queued","inner.message.sent","inner.message.received","inner.message.error","inner.action.request","inner.action.response","inner.action.timeout","inner.action.error"],SDK:["sdk.connection.connect","sdk.connection.disconnect","sdk.connection.reconnect","sdk.connection.error","sdk.connection.status.change","sdk.lifecycle.ready","sdk.lifecycle.destroy","sdk.lifecycle.state.change","sdk.message.sent","sdk.message.received","sdk.message.error","sdk.action.executed","sdk.action.success","sdk.action.failed","sdk.action.timeout","sdk.action.aborted","sdk.availability.action.registered","sdk.availability.action.unregistered","sdk.availability.action.batch.registered","sdk.availability.action.batch.unregistered","sdk.availability.action.cleared"],REGISTERED:["registered.state.synced","registered.camera.update","registered.tag.click","registered.tag.list.retrieved","registered.tag.list.error","registered.monitor.open","registered.monitor.close","registered.overlay.visible","registered.custom"]},V=class{static isEventOfCategory(t,e){return t.startsWith(`${e}.`)}static isEventOfNamespace(t,e){return t.includes(`.${e}.`)}static getEventCategory(t){return t.startsWith("inner.")?"inner":t.startsWith("sdk.")?"sdk":t.startsWith("registered.")?"registered":null}static getEventNamespace(t){for(let e of Object.values(F))if(t.includes(`.${e}.`))return e;return null}static isInnerEvent(t){return this.isEventOfCategory(t,"inner")}static isSDKEvent(t){return this.isEventOfCategory(t,"sdk")}static isRegisteredEvent(t){return this.isEventOfCategory(t,"registered")}static getInnerEventTypes(){return [...M.INNER]}static getSDKEventTypes(){return [...M.SDK]}static getRegisteredEventTypes(){return [...M.REGISTERED]}static getEventTypesByCategory(t){switch(t){case "inner":return [...M.INNER];case "sdk":return [...M.SDK];case "registered":return [...M.REGISTERED];default:return []}}static getEventTypesByNamespace(t){return Object.values(W).filter(e=>this.isEventOfNamespace(e,t))}},tt={CONNECT:"sdk.connection.connect",DISCONNECT:"sdk.connection.disconnect",RECONNECT:"sdk.connection.reconnect",ERROR:"sdk.connection.error",READY:"sdk.lifecycle.ready",STATE_CHANGE:"sdk.lifecycle.state.change",MESSAGE:"sdk.message.received",ACTION_REQUEST:"inner.action.request",ACTION_RESPONSE:"inner.action.response",CUSTOM:"registered.custom"};function it(){return {strictMode:false,validateOrigin:false,validateSignature:false,allowedOrigins:["*"]}}function at(a=true){return a?{strictMode:false,validateOrigin:false,validateSignature:false}:{strictMode:true,validateOrigin:true,validateSignature:false}}function st(){return !!window.RealseeVRSignalsClientV1||!!window.i}function N(){return {strictMode:false,validateOrigin:false,validateSignature:false,allowedOrigins:["*"],allowWildcardDomains:true}}function q(){var t;return process.env.NODE_ENV==="development"||typeof window!="undefined"&&((t=window.location)==null?void 0:t.hostname)==="localhost"?N():{strictMode:false,validateOrigin:true,validateSignature:false,allowedOrigins:["*"],allowWildcardDomains:true}}function Y(a){return {strictMode:true,validateOrigin:true,validateSignature:!!a,signatureKey:a,allowedOrigins:[],allowWildcardDomains:false}}function oe(a){if(!a||typeof a!="object")return false;let t="type"in a&&"uid"in a&&"payload"in a&&"fromId"in a&&"toId"in a&&"timestamp"in a,e="version"in a||"signature"in a;return t&&!e}function ce(a){var t;return !a||typeof a!="object"?false:"version"in a&&(a.version==="2.0"||((t=a.version)==null?void 0:t.startsWith("2.")))}function le(a){return T(y({},a),{version:"1.0"})}function de(a){let i=a,{version:t,signature:e}=i;return C(i,["version","signature"])}function j(a,t){let e={compatible:true,version:"unknown",suggestedConfig:N(),warnings:[]},n=parseInt(a.split(".")[0]),i=t?parseInt(t.split(".")[0]):null;return n===2&&i===1?(e.version="1.x",e.suggestedConfig=N(),e.warnings.push("Remote 2.x \u4E0E Client 1.x \u901A\u4FE1\uFF0C\u5EFA\u8BAE\u4F7F\u7528 getV1CompatibilityConfig()")):n===1&&i===2?(e.version="1.x",e.compatible=true,e.warnings.push("Client 2.x \u53EF\u4EE5\u6B63\u5E38\u4E0E Remote 1.x \u901A\u4FE1\uFF0C\u65E0\u9700\u7279\u6B8A\u914D\u7F6E")):n===2&&i===2?(e.version="2.x",e.suggestedConfig=Y(),e.warnings.push("Remote 2.x \u4E0E Client 2.x \u901A\u4FE1\uFF0C\u53EF\u4EE5\u4F7F\u7528\u66F4\u9AD8\u5B89\u5168\u914D\u7F6E")):n===1&&i===1?(e.version="1.x",e.compatible=true):n===2&&!i&&(e.version="unknown",e.suggestedConfig=q(),e.warnings.push("Client \u7248\u672C\u672A\u77E5\uFF0C\u4F7F\u7528\u81EA\u52A8\u517C\u5BB9\u914D\u7F6E")),e}function ge(a,t){let e=j(a,t);console.group("\u{1F504} VR Signals \u517C\u5BB9\u6027\u4FE1\u606F"),console.log(`Remote \u7248\u672C: ${a}`),console.log(`Client \u7248\u672C: ${t||"\u672A\u77E5"}`),console.log(`\u517C\u5BB9\u6027: ${e.compatible?"\u2705 \u517C\u5BB9":"\u274C \u4E0D\u517C\u5BB9"}`),console.log(`\u68C0\u6D4B\u7248\u672C: ${e.version}`),e.warnings.length>0&&(console.warn("\u8B66\u544A:"),e.warnings.forEach(n=>console.warn(` - ${n}`))),console.log("\u5EFA\u8BAE\u914D\u7F6E:",e.suggestedConfig),console.groupEnd();}/** * 兼容性层 * * 提供 1.x 和 2.x 版本之间的兼容性支持 * * @fileoverview 兼容性适配器和配置 * @author Realsee * @version 2.0 * @license MIT */ /** * @fileoverview VR 信号通信库 - 用于在 VR 应用和父窗口之间建立双向通信 * @author BEIKE REALSEE TECHNOLOGY (HK) LIMITED * @version 2.0.0-beta.7 * @license MIT */export{A as Base,re as EventCategory,F as EventNamespace,W as EventType,M as EventTypeGroups,V as EventTypeUtils,tt as LegacyEventType,p as Logger,D as RealseeVRSignalsClient,_ as RealseeVRSignalsRemote,v as SecurityUtils,S as StandardActionManager,b as StandardEventTarget,W as StandardEventType,M as StandardEventTypeGroups,V as StandardEventTypeUtils,le as adaptV1ToV2Message,de as adaptV2ToV1Message,j as checkCompatibility,ne as debounce,O as deepClone,P as delay,q as getAutoCompatibilityConfig,at as getMixedEnvironmentConfig,it as getV1CompatibilityConfig,N as getV1Config,Y as getV2DefaultConfig,st as isV1Environment,oe as isV1Message,ce as isV2Message,ge as logCompatibilityInfo,ae as retry,ie as throttle};//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map