Files
aitu/apps/web/public/sw-debug/postmessage-duplex.js
liquid a91afda0f4 docs: 更新 postmessage-duplex 规则 (v1.1.0)
- 更新通信模式:broadcast/onBroadcast 用于单向通知
- 更新初始化:enableGlobalRouting 自动管理 channel
- 新增客户端配置:autoReconnect 处理 SW 更新
- 新增任务队列双服务同步规则
2026-01-31 14:09:20 +08:00

3 lines
43 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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