- 更新通信模式:broadcast/onBroadcast 用于单向通知 - 更新初始化:enableGlobalRouting 自动管理 channel - 新增客户端配置:autoReconnect 处理 SW 更新 - 新增任务队列双服务同步规则
3 lines
43 KiB
JavaScript
3 lines
43 KiB
JavaScript
function e(){return"undefined"!=typeof window?window:"undefined"!=typeof self?self:{}}function t(e){return JSON.parse(JSON.stringify(e))}function i(e){const t=Date.now().toString(36);let i;if("undefined"!=typeof crypto&&crypto.getRandomValues){const e=new Uint32Array(2);crypto.getRandomValues(e),i=e[0].toString(36)+e[1].toString(36)}else i=Math.floor(1e10*Math.random()).toString(36);return`${e}${t}${i}_`}function s(e){try{return JSON.parse(JSON.stringify(e))}catch{return"[Unserializable]"}}const r="postmessage-duplex",n="1.1.0",a=e();var o,l;a.__POSTMESSAGE_DUPLEX__||(a.__POSTMESSAGE_DUPLEX__={}),a.__POSTMESSAGE_DUPLEX__.version=n,a.__POSTMESSAGE_DUPLEX__.name=r,function(e){e[e.Success=0]="Success",e[e.ReceiverCallbackError=-1]="ReceiverCallbackError",e[e.SendCallbackError=-2]="SendCallbackError",e[e.NoSubscribe=-3]="NoSubscribe",e[e.TimeOut=-99]="TimeOut"}(o||(o={})),function(e){e.ConnectionDestroyed="CONNECTION_DESTROYED",e.ConnectionTimeout="CONNECTION_TIMEOUT",e.MethodCallTimeout="METHOD_CALL_TIMEOUT",e.MethodNotFound="METHOD_NOT_FOUND",e.TransmissionFailed="TRANSMISSION_FAILED",e.MessageSizeExceeded="MESSAGE_SIZE_EXCEEDED",e.RateLimitExceeded="RATE_LIMIT_EXCEEDED",e.HandlerError="HANDLER_ERROR",e.InvalidMessage="INVALID_MESSAGE",e.OriginMismatch="ORIGIN_MISMATCH"}(l||(l={}));class c extends Error{constructor(e,t,i){super(e),Object.defineProperty(this,"code",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"details",{enumerable:1,configurable:1,writable:1,value:void 0}),this.name="ChannelError",this.code=t,this.details=i,Error.captureStackTrace&&Error.captureStackTrace(this,c)}toJSON(){return{name:this.name,message:this.message,code:this.code,details:this.details,stack:this.stack}}}function h(e){return new c("Channel has been destroyed",l.ConnectionDestroyed,e?{requestId:e}:void 0)}function u(e,t){return new c(`Request "${e}" timed out after ${t}ms`,l.MethodCallTimeout,{cmdname:e,timeout:t})}function b(e,t){return new c(t.message||`Handler for "${e}" threw an error`,l.HandlerError,{cmdname:e,originalError:t.message,stack:t.stack})}class d{constructor(){Object.defineProperty(this,"timeouts",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"timer",{enumerable:1,configurable:1,writable:1,value:null}),Object.defineProperty(this,"nextDeadline",{enumerable:1,configurable:1,writable:1,value:1/0}),Object.defineProperty(this,"destroyed",{enumerable:1,configurable:1,writable:1,value:0})}add(e,t,i){if(this.destroyed)return;const s=Date.now()+t;this.timeouts.set(e,{deadline:s,callback:i}),s<this.nextDeadline&&this.reschedule(s)}remove(e){return this.timeouts.delete(e)}has(e){return this.timeouts.has(e)}get size(){return this.timeouts.size}reschedule(e){null!==this.timer&&clearTimeout(this.timer),this.nextDeadline=e;const t=Math.max(0,e-Date.now());this.timer=setTimeout(()=>this.processTimeouts(),t)}processTimeouts(){if(this.destroyed)return;const e=Date.now(),t=[];for(const[i,{deadline:s,callback:r}]of this.timeouts)s<=e&&(t.push(r),this.timeouts.delete(i));for(const e of t)try{e()}catch(e){console.error("[TimeoutManager] Callback error:",e)}this.scheduleNext()}scheduleNext(){if(0===this.timeouts.size)return this.nextDeadline=1/0,void(this.timer=null);let e=1/0;for(const{deadline:t}of this.timeouts.values())t<e&&(e=t);e<1/0&&this.reschedule(e)}destroy(){this.destroyed=1,null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.timeouts.clear(),this.nextDeadline=1/0}clear(){null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.timeouts.clear(),this.nextDeadline=1/0}}class f{constructor(e,t=1e3){Object.defineProperty(this,"limit",{enumerable:1,configurable:1,writable:1,value:e}),Object.defineProperty(this,"windowMs",{enumerable:1,configurable:1,writable:1,value:t}),Object.defineProperty(this,"timestamps",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"head",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(this,"tail",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(this,"count",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(this,"enabled",{enumerable:1,configurable:1,writable:1,value:void 0}),this.enabled=e>0,this.timestamps=this.enabled?new Array(e).fill(0):[]}tryAcquire(){if(!this.enabled)return 1;const e=Date.now(),t=e-this.windowMs;for(;this.count>0&&this.timestamps[this.head]<=t;)this.head=(this.head+1)%this.limit,this.count--;return this.count>=this.limit?0:(this.timestamps[this.tail]=e,this.tail=(this.tail+1)%this.limit,this.count++,1)}getCurrentCount(){if(!this.enabled)return 0;const e=Date.now()-this.windowMs;let t=0,i=this.head;for(let s=0;s<this.count;s++)this.timestamps[i]>e&&t++,i=(i+1)%this.limit;return t}getRemainingCapacity(){return this.enabled?Math.max(0,this.limit-this.getCurrentCount()):1/0}getTimeUntilAvailable(){if(!this.enabled||this.count<this.limit)return 0;const e=Date.now()-this.windowMs;let t=this.head;for(;t!==this.tail;){if(this.timestamps[t]>e)return this.timestamps[t]-e;t=(t+1)%this.limit}return 0}isLimited(){return this.enabled?this.getCurrentCount()>=this.limit:0}reset(){this.head=0,this.tail=0,this.count=0,this.enabled&&this.timestamps.fill(0)}getLimit(){return this.limit}getWindowMs(){return this.windowMs}isEnabled(){return this.enabled}}class g{constructor(){Object.defineProperty(this,"eventHandlers",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"eventsEnabled",{enumerable:1,configurable:1,writable:1,value:1})}on(e,t){let i=this.eventHandlers.get(e);return i||(i=new Set,this.eventHandlers.set(e,i)),i.add(t),()=>{i?.delete(t),0===i?.size&&this.eventHandlers.delete(e)}}once(e,t){const i=s=>{this.off(e,i),t(s)};return this.on(e,i)}off(e,t){const i=this.eventHandlers.get(e);if(!i)return 0;const s=i.delete(t);return 0===i.size&&this.eventHandlers.delete(e),s}offAll(e){e?this.eventHandlers.delete(e):this.eventHandlers.clear()}emit(e,t){if(!this.eventsEnabled)return;const i=this.eventHandlers.get(e);if(i)for(const s of[...i])try{s(t)}catch(t){console.error(`[ChannelEventEmitter] Error in ${e} handler:`,t)}}hasListeners(e){const t=this.eventHandlers.get(e);return void 0!==t&&t.size>0}listenerCount(e){return this.eventHandlers.get(e)?.size??0}setEventsEnabled(e){this.eventsEnabled=e}destroyEventEmitter(){this.eventHandlers.clear(),this.eventsEnabled=0}}function m(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function v(e){return"string"==typeof e&&e.length>0}const p=e=>({valid:0,error:e});function w(e){if(!m(e))return p("Message must be an object");const t=e,i="requestId"in t,s="cmdname"in t,r="msg"in t,n="ret"in t;return i||s||r?i&&"string"!=typeof t.requestId?p("requestId must be a string"):s&&"string"!=typeof t.cmdname?p("cmdname must be a string"):r&&"string"!=typeof t.msg?p("msg must be a string"):!n||"number"==typeof(a=t.ret)&&Object.values(o).includes(a)?"data"in t&&void 0!==t.data&&!m(t.data)?p("data must be an object"):"_senderKey"in t&&void 0!==t._senderKey&&"string"!=typeof t._senderKey?p("_senderKey must be a string"):!("time"in t)||void 0===t.time||"number"==typeof t.time&&Number.isFinite(t.time)?{valid:1,message:t}:p("time must be a finite number"):p("ret must be a valid ReturnCode"):p("Message must have requestId, cmdname, or msg field");var a}function y(e){const t=w(e);return t.valid?v(t.message.requestId)?v(t.message.cmdname)?t:p("Request must have a non-empty cmdname"):p("Request must have a non-empty requestId"):t}function S(e){const t=w(e);return t.valid?"ret"in t.message?t:p("Response must have a ret field"):t}function C(e){return"ret"in e&&"number"==typeof e.ret}function O(e){return"ready"===e.msg}function _(e){return 1==e._broadcast&&"string"==typeof e.cmdname}function I(e){const t={};for(const i of["requestId","cmdname","ret","msg","time","_senderKey"])i in e&&(t[i]=e[i]);return"data"in e&&void 0!==e.data&&(t.data=s(e.data)),t}function k(e){try{const t=JSON.stringify(e);return"undefined"!=typeof Blob?new Blob([t]).size:2*t.length}catch{return 1/0}}const M=e(),E=[],j=[],T={totalSent:0,totalReceived:0,timeouts:0,errors:0,activeChannels:0};let W=0;function $(e){j.length>=200&&j.shift(),j.push(e)}function D(e,t){for(let i=j.length-1;i>=0;i--)if(j[i].requestId===e&&"pending"===j[i].status){j[i].status=t,j[i].duration=Date.now()-j[i].timestamp;break}}function H(){const e=new Date;return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}:${String(e.getSeconds()).padStart(2,"0")}.${String(e.getMilliseconds()).padStart(3,"0")}`}function A(e,t,i,s=0){const r=H();console.log(`%c[${r}] ${"send"===e?"📤":"📥"} ${"send"===e?"→":"←"} ${t||i}${s?" (response)":""}`,`color: ${"send"===e?"#2196F3":"#4CAF50"}; font-weight: bold`)}class R{help(){console.log(`\n%c╔══════════════════════════════════════════════════════════════╗\n║ PostMessage Channel Debugger v${n.padEnd(10)} ║\n╠══════════════════════════════════════════════════════════════╣\n║ Available Commands: ║\n║ ║\n║ debug.help() - Show this help message ║\n║ debug.getChannels() - List all active channels ║\n║ debug.getHistory(opts?) - View message history ║\n║ debug.enableLiveLog(bool) - Toggle real-time logging ║\n║ debug.getPending() - List pending requests ║\n║ debug.getStats() - Show statistics ║\n║ debug.exportReport() - Export debug report as JSON ║\n║ debug.clear() - Clear history and stats ║\n╚══════════════════════════════════════════════════════════════╝`,"color: #2196F3; font-family: monospace")}getChannels(){const e=[],t=[];for(const i of E){const s=i.deref();if(s){t.push(i);const r={type:s.channelType||"unknown",isReady:s.isReady,isDestroyed:s.isDestroyed||0,baseKey:s.baseKey||"",peerKey:s.getPeerKey(),pendingCount:s.getPendingCount(),subscriptions:Array.from(s.subscribeMap?.keys()||[])};"function"==typeof s.getTargetOrigin&&(r.targetOrigin=s.getTargetOrigin()),e.push(r)}}return E.length=0,E.push(...t),T.activeChannels=t.length,0===e.length?console.log("%cNo active channels found.","color: #999"):e.forEach((e,t)=>{const i=e.isDestroyed?"#999":e.isReady?"#4CAF50":"#FF9800";console.log(`\n%cChannel #${t+1} (${e.type})\n%c├─ Status: ${e.isDestroyed?"💀":e.isReady?"✓":"⏳"} ${e.isDestroyed?"Destroyed":e.isReady?"Ready":"Connecting"}\n├─ BaseKey: ${e.baseKey}\n├─ PeerKey: ${e.peerKey||"(not paired)"}\n├─ Pending: ${e.pendingCount} requests\n├─ Subscriptions: ${e.subscriptions.join(", ")||"(none)"}\n${e.targetOrigin?`└─ Target: ${e.targetOrigin}`:"└─ (no target info)"}`,"color: #2196F3; font-weight: bold",`color: ${i}`)}),e}getHistory(e){let t=[...j];if(e?.filter){const i=e.filter.toLowerCase();t=t.filter(e=>e.cmdname.toLowerCase().includes(i)||e.requestId.toLowerCase().includes(i))}if(e?.limit&&e.limit>0&&(t=t.slice(-e.limit)),0===t.length)console.log("%cNo message history.","color: #999");else{const e=t.map(e=>({Dir:"send"===e.direction?"→":"←",Command:e.cmdname||e.requestId.slice(-8),Status:"ok"===e.status?"✓":"timeout"===e.status?"⏱":"error"===e.status?"✗":"...",Time:void 0!==e.duration?`${e.duration}ms`:"-",Timestamp:new Date(e.timestamp).toLocaleTimeString("en-US",{hour12:0})}));console.table(e)}return t}enableLiveLog(e){W=e,e?console.log("%c🔴 Live logging ENABLED. Messages will appear in real-time.","color: #4CAF50; font-weight: bold"):console.log("%c⚪ Live logging DISABLED.","color: #999")}getPending(){const e=[];return E.forEach((t,i)=>{const s=t.deref();if(s){const t=s.requestCmdMap;if(t)for(const[s,r]of t)e.push({channelIndex:i,requestId:s,cmdname:r})}}),0===e.length?console.log("%cNo pending requests.","color: #999"):console.table(e),e}getStats(){return console.log(`\n%c╔══════════════════════════════════════╗\n║ PostMessage Channel Statistics ║\n╠══════════════════════════════════════╣\n║ 📤 Total Sent: ${String(T.totalSent).padStart(10)} ║\n║ 📥 Total Received: ${String(T.totalReceived).padStart(10)} ║\n║ ⏱ Timeouts: ${String(T.timeouts).padStart(10)} ║\n║ ❌ Errors: ${String(T.errors).padStart(10)} ║\n║ 📡 Active Channels: ${String(T.activeChannels).padStart(10)} ║\n╚══════════════════════════════════════╝`,"color: #2196F3; font-family: monospace"),{...T}}exportReport(){const e={version:n,name:r,timestamp:(new Date).toISOString(),stats:{...T},channels:this.getChannels(),history:j.slice(-100),pending:this.getPending()},t=JSON.stringify(e,null,2);return console.log("%cDebug report exported. Use copy() to copy to clipboard.","color: #4CAF50"),t}clear(){j.length=0,T.totalSent=0,T.totalReceived=0,T.timeouts=0,T.errors=0,console.log("%cHistory and stats cleared.","color: #999")}isLiveLogEnabled(){return W}}let N=null;function q(){return N||(N=new R),M.__POSTMESSAGE_DUPLEX__||(M.__POSTMESSAGE_DUPLEX__={}),Object.defineProperty(M.__POSTMESSAGE_DUPLEX__,"debug",{value:N,writable:0,configurable:1}),console.log("%c🔧 PostMessage Debugger enabled. Type __POSTMESSAGE_DUPLEX__.debug.help() for commands.","color: #4CAF50; font-weight: bold"),N}function L(){return null!==N&&void 0!==M.__POSTMESSAGE_DUPLEX__?.debug}function F(){return N}class x extends g{constructor(e){if(super(),Object.defineProperty(this,"baseKey",{enumerable:1,configurable:1,writable:1,value:""}),Object.defineProperty(this,"peerKey",{enumerable:1,configurable:1,writable:1,value:""}),Object.defineProperty(this,"reqTime",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(this,"callbackMap",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"subscribeMap",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"broadcastHandlers",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"timeout",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"isReady",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(this,"isDestroyed",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(this,"postTasks",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"bindOnMessage",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"console",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"maxMessageSize",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"timeoutManager",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"rateLimiter",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"strictValidation",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"requestCmdMap",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"isProcessingBatch",{enumerable:1,configurable:1,writable:1,value:0}),this.timeout=e?.timeout??5e3,this.console=e?.log??{log:()=>{},warn:()=>{},error:()=>{},info:()=>{}},this.maxMessageSize=e?.maxMessageSize??1048576,this.strictValidation=e?.strictValidation??1,this.timeoutManager=new d,this.rateLimiter=new f(e?.rateLimit??100,1e3),e?.subscribeMap)for(const t in e.subscribeMap)this.subscribeMap.set(t,e.subscribeMap[t]);var t;this.bindOnMessage=this.onMessage.bind(this),t=this,E.push(new WeakRef(t)),T.activeChannels++,t.on("message:sent",({cmdname:e,requestId:t})=>{T.totalSent++,$({direction:"send",cmdname:e,requestId:t,status:"pending",timestamp:Date.now(),dataSummary:""}),W&&A("send",e,t)}),t.on("message:received",({cmdname:e,requestId:t,isResponse:i})=>{T.totalReceived++;const s=e||"",r=t||"";i?D(r,"ok"):$({direction:"receive",cmdname:s,requestId:r,status:"ok",timestamp:Date.now(),dataSummary:""}),W&&A("receive",s,r,i)}),t.on("timeout",({cmdname:e,requestId:t})=>{T.timeouts++,D(t,"timeout"),W&&function(e,t){const i=H();console.log(`%c[${i}] ⏱ TIMEOUT: ${e||t}`,"color: #FF9800; font-weight: bold")}(e,t)}),t.on("error",({context:e})=>{T.errors++,W&&function(e){const t=H();console.log(`%c[${t}] ❌ ERROR: ${e}`,"color: #F44336; font-weight: bold")}(e||"unknown")}),t.on("destroy",()=>{T.activeChannels=Math.max(0,T.activeChannels-1)})}checkRateLimit(){if(!this.rateLimiter.isEnabled())return 1;if(!this.rateLimiter.tryAcquire()){const e=this.rateLimiter.getCurrentCount(),t=this.rateLimiter.getLimit();return this.log("warn","Rate limit exceeded:",e,"/",t,"messages per second"),this.emit("rate:limited",{currentCount:e,limit:t}),0}return 1}validateMessageSize(e){if(this.maxMessageSize<=0)return;const t=k(e);if(t>this.maxMessageSize){const e=new c(`Message size (${t} bytes) exceeds limit (${this.maxMessageSize} bytes)`,l.MessageSizeExceeded,{size:t,limit:this.maxMessageSize});throw this.emit("error",{error:e,context:"validateMessageSize"}),e}}init(){this.setupMessageListener(),this.sendMessage({requestId:this.baseKey+this.reqTime,msg:"ready",_senderKey:this.baseKey})}log(e,...t){this.console?.[e]?.(`[${this.channelType}]: `,...t)}isFromPeer(e){return this.peerKey?e._senderKey&&e._senderKey!==this.peerKey?(this.log("log","Message from non-paired channel, ignored",e._senderKey,"expected:",this.peerKey),0):C(e)&&e.requestId&&!e.requestId.startsWith(this.baseKey)?0:1:1}sendMessage(e,t){this.validateMessageSize(e),this.checkRateLimit()?(e.time=Date.now(),e._senderKey=this.baseKey,this.sendRawMessage(e,t)):this.log("warn","Message dropped due to rate limiting")}async onMessage(e){if(this.log("log","onMessage",e.data),!this.isValidSource(e))return;if(this.strictValidation){const t=w(e.data);if(!t.valid)return this.log("warn","Invalid message structure:",t.error),void this.emit("validation:failed",{reason:t.error,data:e.data})}const t=e.data;if(!t)return;if(!this.isFromPeer(t))return;this.emit("message:received",{cmdname:t.cmdname||"",requestId:t.requestId||"",isResponse:C(t)});const{requestId:i,cmdname:s}=t;this.handleResponseMessage(t,i)||this.handleBroadcastMessage(t,s)||await this.handleSubscriptionMessage(t,i,s)||this.handleReadyMessage(t,i)||this.handleUnhandledMessage(t,i,s)}handleResponseMessage(e,t){const i=t?this.callbackMap.get(t):void 0;return i&&t?(this.timeoutManager.remove(t),this.requestCmdMap.delete(t),i.resolve(e),this.deleteCallback(t),1):0}handleBroadcastMessage(e,t){if(!_(e))return 0;const i=t?this.broadcastHandlers.get(t):void 0;if(i)try{i({cmdname:t,data:e.data})}catch(e){const i=e instanceof Error?e.message:String(e);this.emit("error",{error:e instanceof Error?e:new Error(i),context:`broadcast:${t}`})}return 1}async handleSubscriptionMessage(e,t,i){if(!i)return 0;const s=this.subscribeMap.get(i);if(!s)return 0;try{const i=await s(e);this.sendMessage({requestId:t,ret:o.Success,data:i})}catch(s){const r=s instanceof Error?s.message:String(s);this.sendMessage({req:e,requestId:t,ret:o.ReceiverCallbackError,msg:r||"unknown error"}),this.emit("error",{error:s instanceof Error?s:new Error(r),context:`handler:${i}`})}return 1}handleReadyMessage(e,t){if(!O(e))return 0;const{_senderKey:i}=e;return i&&!this.peerKey&&(this.peerKey=i,this.log("log","Point-to-point pairing established","self:",this.baseKey,"peer:",this.peerKey)),this.isReady=1,this.executePosts(),this.emit("ready",{peerKey:this.peerKey}),C(e)||this.sendMessage({requestId:t,ret:o.Success,msg:"ready"}),1}handleUnhandledMessage(e,t,i){t&&!C(e)&&(this.log("warn","No registered handler for:",i||t),this.sendMessage({requestId:t,ret:o.NoSubscribe}))}postMessage(e,t){try{this.sendMessage(e,t),this.emit("message:sent",{cmdname:e.cmdname||"",requestId:e.requestId||""})}catch(t){this.log("error",t,e),this.emit("error",{error:t instanceof Error?t:new Error(String(t)),context:"postMessage"})}}publish(e,t,i){if(this.isDestroyed)return Promise.reject(new c("Cannot publish: channel has been destroyed",l.ConnectionDestroyed,{cmdname:e}));const s=this.baseKey+ ++this.reqTime,r={requestId:s,cmdname:e,data:t};this.requestCmdMap.set(s,e);const n=new Promise((e,t)=>{this.callbackMap.set(s,{resolve:e,reject:t})});return this.log("log","publish",this.isReady,this.postTasks.size),this.isReady?this.doPublish(r,i):this.postTasks.set(s,{data:r,prm:n,options:i}),n}doPublish(e,t){const{requestId:i,cmdname:s}=e,r=t?.timeout??this.timeout;this.timeoutManager.add(i,r,()=>{const t=this.callbackMap.get(i);if(t){const n={req:e,requestId:i,ret:o.TimeOut,time:Date.now(),msg:"timeout"};this.log("error","postmessage timeout",n),this.emit("timeout",{requestId:i,cmdname:s,timeoutMs:r}),t.resolve(n),this.deleteCallback(i),this.requestCmdMap.delete(i)}}),this.postMessage(e,t?.transferables)}deleteCallback(e){this.callbackMap.delete(e),this.postTasks.delete(e),this.timeoutManager.remove(e)}executePosts(){0===this.postTasks.size||this.isProcessingBatch||(this.isProcessingBatch=1,queueMicrotask(()=>{this.processBatch(),this.isProcessingBatch=0}))}processBatch(){const e=Array.from(this.postTasks.entries());for(const[t,i]of e)this.postTasks.has(t)&&(t.startsWith("_broadcast_")?(this.doBroadcast(i.data,i.options),this.postTasks.delete(t)):this.doPublish(i.data,i.options))}call(e,t,i){return this.publish(e,t,i)}subscribe(e,t){return this.subscribeMap.has(e)&&this.log("warn",`${e} has been subscribed`),this.subscribeMap.set(e,t),this}unSubscribe(e){return this.subscribeMap.delete(e),this}subscribeOnce(e,t){return this.subscribe(e,async i=>(this.unSubscribe(e),t(i)))}broadcast(e,t,i){if(this.isDestroyed)return void this.log("warn","Cannot broadcast: channel has been destroyed");const s={cmdname:e,data:t,time:Date.now(),_broadcast:1};if(this.log("log","broadcast",e,this.isReady),this.isReady)this.doBroadcast(s,i);else{const e=`_broadcast_${Date.now()}_${Math.random()}`;this.postTasks.set(e,{data:s,prm:Promise.resolve({}),options:i})}}doBroadcast(e,t){try{this.sendMessage(e,t?.transferables),this.emit("broadcast:sent",{cmdname:e.cmdname})}catch(t){this.log("error","broadcast error",t,e),this.emit("error",{error:t instanceof Error?t:new Error(String(t)),context:"broadcast"})}}onBroadcast(e,t){return this.broadcastHandlers.has(e)&&this.log("warn",`Broadcast handler for ${e} already registered, replacing`),this.broadcastHandlers.set(e,t),this}offBroadcast(e){return this.broadcastHandlers.delete(e),this}getPeerKey(){return this.peerKey}getRateLimitStats(){return{current:this.rateLimiter.getCurrentCount(),limit:this.rateLimiter.getLimit(),remaining:this.rateLimiter.getRemainingCapacity()}}getPendingCount(){return this.callbackMap.size}destroy(){if(this.isDestroyed)return;this.isDestroyed=1,this.emit("destroy",{reason:"explicit"}),function(e){const t=E.findIndex(t=>t.deref()===e);-1!==t&&E.splice(t,1)}(this);const e=new c("Channel has been destroyed",l.ConnectionDestroyed);for(const[t,i]of this.callbackMap)try{i.reject({ret:o.SendCallbackError,msg:e.message})}catch(e){this.log("warn","Error rejecting pending request:",t,e)}this.removeMessageListener(),this.subscribeMap.clear(),this.broadcastHandlers.clear(),this.postTasks.clear(),this.callbackMap.clear(),this.requestCmdMap.clear(),this.timeoutManager.destroy(),this.rateLimiter.reset(),this.destroyEventEmitter(),this.isReady=0,this.peerKey=""}}function P(e){const t=document.createElement("div");t.innerHTML="<a/>";const i=t.firstChild;return i.href=e,i}class B extends x{constructor(e,t){if(super(t),Object.defineProperty(this,"channelType",{enumerable:1,configurable:1,writable:1,value:"IframeChannel"}),Object.defineProperty(this,"isSon",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"link",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"targetOrigin",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"url",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"iframe",{enumerable:1,configurable:1,writable:1,value:void 0}),"string"==typeof e){this.isSon=1,this.url=e,this.link=P(e),this.targetOrigin=this.link.origin;const t=P(document.referrer).origin;if(this.targetOrigin!==t)throw new Error(`父页面 ${document.referrer} 非指定域名的页面 ${e} !`);this.baseKey=i("son_")}else this.isSon=0,this.iframe=e,this.url=e.src,this.link=P(this.url),this.targetOrigin=this.link.origin,this.baseKey=i("parent_");this.log("log","baseKey",this.baseKey,this.isSon),this.init()}setupMessageListener(){window.addEventListener("message",this.bindOnMessage,1)}removeMessageListener(){window.removeEventListener("message",this.bindOnMessage,1)}sendRawMessage(e,i){try{if(this.isSon){const s=t(e);i&&i.length>0?parent.postMessage(s,this.targetOrigin,i):parent.postMessage(s,this.targetOrigin)}else i&&i.length>0?this.iframe.contentWindow.postMessage(e,this.targetOrigin,i):this.iframe.contentWindow.postMessage(e,this.targetOrigin)}catch(t){this.log("error",t,e,this.targetOrigin)}}isValidSource(e){return e.origin!==this.targetOrigin?(this.log("log","未处理",e.data,e,"非目标源:",this.targetOrigin),0):this.isSon||e.source===this.iframe?.contentWindow?1:0}log(e,...t){this.console?.[e]?.(`[${this.targetOrigin||"IframeChannel"}](${this.isSon?"son":"parent"}): `,...t)}getTargetOrigin(){return this.targetOrigin}getTargetUrl(){return this.url}}class z{constructor(){Object.defineProperty(this,"clientMeta",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"channelsByClientId",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"globalSubscribeMap",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(this,"initialized",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(this,"options",{enumerable:1,configurable:1,writable:1,value:{}}),Object.defineProperty(this,"cleanupIntervalId",{enumerable:1,configurable:1,writable:1,value:null}),Object.defineProperty(this,"globalListenerSetup",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(this,"unknownClientCallback",{enumerable:1,configurable:1,writable:1,value:null}),Object.defineProperty(this,"channelFactory",{enumerable:1,configurable:1,writable:1,value:null}),Object.defineProperty(this,"globalMessageHandler",{enumerable:1,configurable:1,writable:1,value:e=>{const t=e.source,i=t?.id;if(!i)return;const s=this.channelsByClientId.get(i);s?s.handleMessage(e):this.unknownClientCallback&&this.unknownClientCallback(i,e)}})}static getInstance(){return z.instance||(z.instance=new z),z.instance}static resetInstance(){z.instance&&(z.instance.shutdown(),z.instance=null)}setup(e,t){if(this.initialized)return void console.warn("[ServiceWorkerHub] Already initialized");this.options=e,this.channelFactory=t,this.initialized=1,this.registerBuiltInHandlers(),this.setupLifecycleEvents();const i=e.cleanupInterval??3e4;i>0&&(this.cleanupIntervalId=setInterval(()=>this.cleanupInactiveClients(),i)),console.log("[ServiceWorkerHub] Initialized",e.version?`v${e.version}`:"")}shutdown(){this.cleanupIntervalId&&(clearInterval(this.cleanupIntervalId),this.cleanupIntervalId=null),this.globalListenerSetup&&(self.removeEventListener("message",this.globalMessageHandler),this.globalListenerSetup=0);for(const e of this.channelsByClientId.values())try{e.destroy()}catch{}this.channelsByClientId.clear(),this.clientMeta.clear(),this.globalSubscribeMap.clear(),this.initialized=0}isInitialized(){return this.initialized}getOptions(){return this.options}enableGlobalRouting(e){this.unknownClientCallback=e??null,this.globalListenerSetup||(self.addEventListener("message",this.globalMessageHandler),this.globalListenerSetup=1)}disableGlobalRouting(){this.globalListenerSetup&&(self.removeEventListener("message",this.globalMessageHandler),this.globalListenerSetup=0)}isGlobalRoutingEnabled(){return this.globalListenerSetup}registerChannel(e,t){this.channelsByClientId.set(e,t),this.applyGlobalHandlersToChannel(t,e)}unregisterChannel(e){this.channelsByClientId.delete(e),this.clientMeta.delete(e),this.options.onClientDisconnect?.(e)}getChannel(e){return this.channelsByClientId.get(e)}hasChannel(e){return this.channelsByClientId.has(e)}getChannelCount(){return this.channelsByClientId.size}createChannelForClient(e){if(!this.channelFactory)return console.warn("[ServiceWorkerHub] No channel factory configured"),null;const t=this.channelFactory(e);return this.registerChannel(e,t),t}registerClientMeta(e,t){const i={clientId:e,appType:t.appType,appName:t.appName,connectedAt:(new Date).toISOString()};return this.clientMeta.set(e,i),this.options.onClientConnect?.(e,i),i}getClientMeta(e){return this.clientMeta.get(e)}getAllClientMeta(){return new Map(this.clientMeta)}getClientsByType(e){const t=[];for(const i of this.clientMeta.values())i.appType===e&&t.push(i);return t}subscribeGlobal(e,t){e.startsWith("__")&&console.warn(`[ServiceWorkerHub] Handler name '${e}' uses reserved prefix '__'.`),this.globalSubscribeMap.set(e,t);for(const[i,s]of this.channelsByClientId)this.applyHandlerToChannel(s,i,e,t)}unsubscribeGlobal(e){this.globalSubscribeMap.delete(e);for(const t of this.channelsByClientId.values())t.unSubscribe(e)}applyGlobalHandlersToChannel(e,t){for(const[i,s]of this.globalSubscribeMap)this.applyHandlerToChannel(e,t,i,s)}applyHandlerToChannel(e,t,i,s){e.subscribe(i,async e=>{const i=this.clientMeta.get(t);return s({data:e.data||{},clientId:t,clientMeta:i})})}registerBuiltInHandlers(){this.globalSubscribeMap.set("__register__",({data:e,clientId:t})=>{const i=this.registerClientMeta(t,{appType:e.appType,appName:e.appName});return console.log("[ServiceWorkerHub] Client registered:",t,i.appName||i.appType||""),{success:1,clientId:t,totalClients:this.clientMeta.size}}),this.globalSubscribeMap.set("__ping__",({clientId:e})=>({pong:1,timestamp:Date.now(),clientId:e,activeClients:this.channelsByClientId.size}))}setupLifecycleEvents(){self.addEventListener("install",e=>{console.log("[ServiceWorkerHub] Installing",this.options.version?`v${this.options.version}`:""),"function"==typeof self.skipWaiting&&self.skipWaiting()}),self.addEventListener("activate",e=>{console.log("[ServiceWorkerHub] Activating",this.options.version?`v${this.options.version}`:"");const t=(async()=>{"function"==typeof self.clients?.claim&&await self.clients.claim(),await this.notifyAllClientsSwActivated()})();"function"==typeof e.waitUntil&&e.waitUntil(t)})}async notifyAllClientsSwActivated(){try{const e=await self.clients.matchAll();console.log("[ServiceWorkerHub] Notifying",e.length,"clients of SW activation");for(const t of e)t.postMessage({cmdname:"__sw-activated__",data:{version:this.options.version},_broadcast:1})}catch(e){console.error("[ServiceWorkerHub] Error notifying clients:",e)}}async cleanupInactiveClients(){try{const e=await self.clients.matchAll(),t=new Set(e.map(e=>e.id));for(const[e,i]of this.channelsByClientId)t.has(e)||(i.destroy(),this.channelsByClientId.delete(e),this.clientMeta.delete(e),this.options.onClientDisconnect?.(e),console.log("[ServiceWorkerHub] Cleaned up inactive client:",e))}catch(e){console.error("[ServiceWorkerHub] Cleanup error:",e)}}async broadcastToAll(e,t,i){if(!this.initialized)return console.warn("[ServiceWorkerHub] Not initialized"),0;try{const s=await self.clients.matchAll();let r=0;for(const n of s){if(i&&n.id===i)continue;const s=this.channelsByClientId.get(n.id);if(s)try{s.broadcast(e,{...t,t:1,i:Date.now()}),r++}catch(e){console.warn("[ServiceWorkerHub] Failed to broadcast to client:",n.id,e)}}return r}catch(e){return console.error("[ServiceWorkerHub] broadcastToAll error:",e),0}}async broadcastToType(e,t,i,s){if(!this.initialized)return console.warn("[ServiceWorkerHub] Not initialized"),0;try{const r=await self.clients.matchAll();let n=0;for(const a of r){if(s&&a.id===s)continue;const r=this.clientMeta.get(a.id);if(!r||r.appType!==e)continue;const o=this.channelsByClientId.get(a.id);if(o)try{o.broadcast(t,{...i,t:1,o:e,i:Date.now()}),n++}catch(e){console.warn("[ServiceWorkerHub] Failed to broadcast to client:",a.id,e)}}return n}catch(e){return console.error("[ServiceWorkerHub] broadcastToType error:",e),0}}}Object.defineProperty(z,"instance",{enumerable:1,configurable:1,writable:1,value:null});class G extends x{static enableGlobalRouting(e){G.useGlobalRouting=1,G.unknownClientCallback=e??null,G.globalListenerSetup||(self.addEventListener("message",G.globalMessageHandler),G.globalListenerSetup=1)}static disableGlobalRouting(){G.useGlobalRouting=0,G.globalListenerSetup&&(self.removeEventListener("message",G.globalMessageHandler),G.globalListenerSetup=0)}static setupHub(e={}){if(G.hubInitialized)return void console.warn("[ServiceWorkerChannel] Hub already initialized");G.hubOptions=e,G.hubInitialized=1,z.getInstance().setup(e,e=>G.createFromWorker(e)),G.enableGlobalRouting((e,t)=>{const i=G.createFromWorker(e);G.setupChannelHandlers(i,e),i.handleMessage(t)}),G.registerBuiltInHandlers();const t=e.cleanupInterval??3e4;t>0&&(G.cleanupIntervalId=setInterval(()=>G.cleanupInactiveClients(),t)),console.log("[ServiceWorkerChannel] Hub initialized",e.version?`v${e.version}`:"")}static registerBuiltInHandlers(){G.globalSubscribeMap.set("__register__",({data:e,clientId:t})=>{const i={clientId:t,appType:e.appType,appName:e.appName,connectedAt:(new Date).toISOString()};return G.clientMeta.set(t,i),console.log("[ServiceWorkerChannel] Client registered:",t,i.appName||i.appType||""),G.hubOptions.onClientConnect?.(t,i),{success:1,clientId:t,totalClients:G.clientMeta.size}}),G.globalSubscribeMap.set("__ping__",({clientId:e})=>({pong:1,timestamp:Date.now(),clientId:e,activeClients:G.channelsByClientId.size}))}static setupChannelHandlers(e,t){for(const[i,s]of G.globalSubscribeMap)e.subscribe(i,async e=>{const i=G.clientMeta.get(t);return s({data:e.data||{},clientId:t,clientMeta:i})})}static setupLifecycleEvents(){self.addEventListener("install",e=>{console.log("[ServiceWorkerChannel] Installing",G.hubOptions.version?`v${G.hubOptions.version}`:""),"function"==typeof self.skipWaiting&&self.skipWaiting()}),self.addEventListener("activate",e=>{console.log("[ServiceWorkerChannel] Activating",G.hubOptions.version?`v${G.hubOptions.version}`:"");const t=(async()=>{"function"==typeof self.clients?.claim&&await self.clients.claim(),await G.notifyAllClientsSwActivated()})();"function"==typeof e.waitUntil&&e.waitUntil(t)})}static async notifyAllClientsSwActivated(){try{const e=await self.clients.matchAll();console.log("[ServiceWorkerChannel] Notifying",e.length,"clients of SW activation");for(const t of e)t.postMessage({cmdname:"__sw-activated__",data:{version:G.hubOptions.version},_broadcast:1})}catch(e){console.error("[ServiceWorkerChannel] Error notifying clients:",e)}}static async cleanupInactiveClients(){try{const e=await self.clients.matchAll(),t=new Set(e.map(e=>e.id));for(const[e]of G.channelsByClientId)if(!t.has(e)){const t=G.channelsByClientId.get(e);t&&t.destroy(),G.clientMeta.delete(e),G.hubOptions.onClientDisconnect?.(e),console.log("[ServiceWorkerChannel] Cleaned up inactive client:",e)}}catch(e){console.error("[ServiceWorkerChannel] Cleanup error:",e)}}static async broadcastToAll(e,t,i){if(!G.hubInitialized)return console.warn("[ServiceWorkerChannel] Hub not initialized. Call setupHub() first."),0;try{const s=await self.clients.matchAll();let r=0;for(const n of s){if(i&&n.id===i)continue;const s=G.channelsByClientId.get(n.id);if(s)try{s.broadcast(e,{...t,t:1,i:Date.now()}),r++}catch(e){console.warn("[ServiceWorkerChannel] Failed to broadcast to client:",n.id,e)}}return r}catch(e){return console.error("[ServiceWorkerChannel] broadcastToAll error:",e),0}}static async broadcastToType(e,t,i,s){if(!G.hubInitialized)return console.warn("[ServiceWorkerChannel] Hub not initialized. Call setupHub() first."),0;try{const r=await self.clients.matchAll();let n=0;for(const a of r){if(s&&a.id===s)continue;const r=G.clientMeta.get(a.id);if(!r||r.appType!==e)continue;const o=G.channelsByClientId.get(a.id);if(o)try{o.broadcast(t,{...i,t:1,o:e,i:Date.now()}),n++}catch(e){console.warn("[ServiceWorkerChannel] Failed to broadcast to client:",a.id,e)}}return n}catch(e){return console.error("[ServiceWorkerChannel] broadcastToType error:",e),0}}static getClientInfo(e){return G.clientMeta.get(e)}static getAllClients(){return new Map(G.clientMeta)}static getClientsByType(e){const t=[];for(const i of G.clientMeta.values())i.appType===e&&t.push(i);return t}static subscribeGlobal(e,t){e.startsWith("__")&&console.warn(`[ServiceWorkerChannel] Handler name '${e}' uses reserved prefix '__'. This may conflict with internal handlers.`),G.globalSubscribeMap.set(e,t);for(const[i,s]of G.channelsByClientId)s.subscribe(e,async e=>{const s=G.clientMeta.get(i);return t({data:e.data||{},clientId:i,clientMeta:s})})}static unsubscribeGlobal(e){G.globalSubscribeMap.delete(e);for(const t of G.channelsByClientId.values())t.unSubscribe(e)}registerInGlobalRouter(){this.isWorkerSide&&this.clientId&&G.useGlobalRouting&&G.channelsByClientId.set(this.clientId,this)}unregisterFromGlobalRouter(){this.isWorkerSide&&this.clientId&&G.channelsByClientId.delete(this.clientId)}static getChannelByClientId(e){return G.channelsByClientId.get(e)}static hasChannel(e){return G.channelsByClientId.has(e)}static getChannelCount(){return G.channelsByClientId.size}handleMessage(e){return this.onMessage(e)}constructor(e,t){if(super(t),Object.defineProperty(this,"channelType",{enumerable:1,configurable:1,writable:1,value:"ServiceWorkerChannel"}),Object.defineProperty(this,"isWorkerSide",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"worker",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:1,configurable:1,writable:1,value:void 0}),Object.defineProperty(this,"swContainer",{enumerable:1,configurable:1,writable:1,value:void 0}),this.isWorkerSide=t?.isWorkerSide??0,this.isWorkerSide){if("string"!=typeof e)throw new Error("Service Worker 端必须传入 clientId 字符串");this.clientId=e,this.baseKey=i("sw_")}else{if(!e||"string"==typeof e)throw new Error("页面端必须传入有效的 ServiceWorker 实例");this.worker=e,this.swContainer=navigator.serviceWorker,this.baseKey=i("page_")}this.log("log","baseKey",this.baseKey,this.isWorkerSide?"worker":"page"),this.registerInGlobalRouter(),this.init()}setupMessageListener(){if(this.isWorkerSide){if(G.useGlobalRouting)return void(G.globalListenerSetup||(self.addEventListener("message",G.globalMessageHandler),G.globalListenerSetup=1));self.addEventListener("message",this.bindOnMessage)}else this.swContainer?.addEventListener("message",this.bindOnMessage)}removeMessageListener(){if(this.unregisterFromGlobalRouter(),this.isWorkerSide){if(G.useGlobalRouting)return;self.removeEventListener("message",this.bindOnMessage)}else this.swContainer?.removeEventListener("message",this.bindOnMessage)}sendRawMessage(e,i){try{const s=t(e);this.isWorkerSide?this.sendToClient(s,i):i&&i.length>0?this.worker?.postMessage(s,i):this.worker?.postMessage(s)}catch(t){this.log("error","sendMessage error",t,e)}}async sendToClient(e,t){const i=this.clientId;if(i)try{const s=await self.clients.get(i);s?t&&t.length>0?s.postMessage(e,t):s.postMessage(e):this.log("warn","Client not found:",i)}catch(e){this.log("error","sendToClient error",e)}else this.log("error","No clientId available")}isValidSource(e){if(this.isWorkerSide){const t=e.source;return t?.id===this.clientId}return 1}log(e,...t){const i=this.isWorkerSide?"worker":"page";this.console?.[e]?.(`[ServiceWorkerChannel](${i}): `,...t)}getClientId(){return this.clientId}isWorkerAvailable(){return this.isWorkerSide||"activated"===this.worker?.state}async refreshWorker(){if(this.isWorkerSide)throw new Error("refreshWorker() can only be called on page side");const e=(await navigator.serviceWorker.ready).active||navigator.serviceWorker.controller;e?(this.worker=e,this.peerKey="",this.isReady=0,this.sendMessage({requestId:this.baseKey+this.reqTime,msg:"ready",_senderKey:this.baseKey}),console.log("[ServiceWorkerChannel] Worker reference refreshed and re-pairing initiated")):console.warn("[ServiceWorkerChannel] No active Service Worker found during refresh")}static async createFromPage(e){if(!("serviceWorker"in navigator))throw new Error("Service Worker is not supported in this browser");if(e?.swUrl)try{const t={};e.swScope&&(t.scope=e.swScope),await navigator.serviceWorker.register(e.swUrl,t),console.log("[ServiceWorkerChannel] Service Worker registered:",e.swUrl)}catch(e){throw console.error("[ServiceWorkerChannel] Failed to register Service Worker:",e),e}const t=(await navigator.serviceWorker.ready).active||navigator.serviceWorker.controller;if(!t)throw new Error("No active Service Worker found");const i=new G(t,e),s=e?.appType||e?.appName;let r=0,n=0;const a=async()=>{if(!n){n=1;try{await i.publish("__register__",{appType:e?.appType,appName:e?.appName}),r=1}catch(e){console.warn("[ServiceWorkerChannel] Auto-registration failed:",e)}finally{n=0}}};return s&&(i.isReady?a():i.once("ready",a)),0!=e?.autoReconnect&&i.onBroadcast("__sw-activated__",async({data:e})=>{console.log("[ServiceWorkerChannel] SW activated",e?.version?`v${e.version}`:""),i.emit("sw-activated",{version:e?.version}),s&&(await i.refreshWorker(),r=0,await a(),r&&console.log("[ServiceWorkerChannel] Re-registered successfully"))}),i}static createFromWorker(e,t){return new G(e,{...t,isWorkerSide:1})}static createFromEvent(e,t){const i=e.source;if(!i?.id)throw new Error("Invalid message event: no client source");return G.createFromWorker(i.id,t)}}Object.defineProperty(G,"channelsByClientId",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(G,"globalListenerSetup",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(G,"unknownClientCallback",{enumerable:1,configurable:1,writable:1,value:null}),Object.defineProperty(G,"useGlobalRouting",{enumerable:1,configurable:1,writable:1,value:1}),Object.defineProperty(G,"clientMeta",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(G,"globalSubscribeMap",{enumerable:1,configurable:1,writable:1,value:new Map}),Object.defineProperty(G,"hubInitialized",{enumerable:1,configurable:1,writable:1,value:0}),Object.defineProperty(G,"hubOptions",{enumerable:1,configurable:1,writable:1,value:{}}),Object.defineProperty(G,"cleanupIntervalId",{enumerable:1,configurable:1,writable:1,value:null}),Object.defineProperty(G,"globalMessageHandler",{enumerable:1,configurable:1,writable:1,value:e=>{const t=e.source,i=t?.id;if(!i)return;const s=G.channelsByClientId.get(i);s?s.handleMessage(e):G.unknownClientCallback&&G.unknownClientCallback(i,e)}});export{x as BaseChannel,c as ChannelError,g as ChannelEventEmitter,l as ErrorCode,B as IframeChannel,r as PKG_NAME,n as PKG_VERSION,o as ReturnCode,G as ServiceWorkerChannel,z as ServiceWorkerHub,f as SlidingWindowRateLimiter,d as TimeoutManager,t as cloneMessage,h as createConnectionDestroyedError,b as createHandlerError,u as createTimeoutError,q as enableDebugger,k as estimateMessageSize,i as generateUniqueId,F as getDebugger,e as getGlobalScope,_ as isBroadcastMessage,L as isDebuggerEnabled,O as isReadyMessage,C as isResponseMessage,s as safeSerialize,I as sanitizeForLogging,w as validateMessage,y as validateRequest,S as validateResponse};
|
||
//# sourceMappingURL=index.esm.js.map
|