niimbot-canvas-sdk 1.0.4 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var vt=Object.defineProperty;var gt=(m,E,v)=>E in m?vt(m,E,{enumerable:!0,configurable:!0,writable:!0,value:v}):m[E]=v;var y=(m,E,v)=>(gt(m,typeof E!="symbol"?E+"":E,v),v),Ae=(m,E,v)=>{if(!E.has(m))throw TypeError("Cannot "+v)};var h=(m,E,v)=>(Ae(m,E,"read from private field"),v?v.call(m):E.get(m)),I=(m,E,v)=>{if(E.has(m))throw TypeError("Cannot add the same private member more than once");E instanceof WeakSet?E.add(m):E.set(m,v)},O=(m,E,v,z)=>(Ae(m,E,"write to private field"),z?z.call(m,v):E.set(m,v),v);(function(m,E){typeof exports=="object"&&typeof module<"u"?E(exports):typeof define=="function"&&define.amd?define(["exports"],E):(m=typeof globalThis<"u"?globalThis:m||self,E(m.NiimbotCanvasSDK={}))})(this,function(m){var ee,ge,ye,te,me,R,k,U,$,L,D,S,x,B,j,F,V,q,be;"use strict";var E=class extends Error{constructor(n,t){super(t);y(this,"code");this.name="PenpalError",this.code=n}},v=E,z=e=>({name:e.name,message:e.message,stack:e.stack,penpalCode:e instanceof v?e.code:void 0}),Ee=({name:e,message:n,stack:t,penpalCode:s})=>{const r=s?new v(s,n):new Error(n);return r.name=e,r.stack=t,r},we=Symbol("Reply"),Ie=(ge=class{constructor(e,n){y(this,"value");y(this,"transferables");I(this,ee,we);this.value=e,this.transferables=n==null?void 0:n.transferables}},ee=new WeakMap,ge),Me=Ie,C="penpal",Y=e=>typeof e=="object"&&e!==null,ne=e=>typeof e=="function",Pe=e=>Y(e)&&e.namespace===C,K=e=>e.type==="SYN",J=e=>e.type==="ACK1",Z=e=>e.type==="ACK2",se=e=>e.type==="CALL",re=e=>e.type==="REPLY",Ce=e=>e.type==="DESTROY",ie=(e,n=[])=>{const t=[];for(const s of Object.keys(e)){const r=e[s];ne(r)?t.push([...n,s]):Y(r)&&t.push(...ie(r,[...n,s]))}return t},Se=(e,n)=>{const t=e.reduce((s,r)=>Y(s)?s[r]:void 0,n);return ne(t)?t:void 0},N=e=>e.join("."),ae=(e,n,t)=>({namespace:C,channel:e,type:"REPLY",callId:n,isError:!0,...t instanceof Error?{value:z(t),isSerializedErrorInstance:!0}:{value:t}}),_e=(e,n,t,s)=>{let r=!1;const g=async u=>{if(r||!se(u))return;s==null||s(`Received ${N(u.methodPath)}() call`,u);const{methodPath:l,args:c,id:a}=u;let i,o;try{const f=Se(l,n);if(!f)throw new v("METHOD_NOT_FOUND",`Method \`${N(l)}\` is not found.`);let p=await f(...c);p instanceof Me&&(o=p.transferables,p=await p.value),i={namespace:C,channel:t,type:"REPLY",callId:a,value:p}}catch(f){i=ae(t,a,f)}if(!r)try{s==null||s(`Sending ${N(l)}() reply`,i),e.sendMessage(i,o)}catch(f){throw f.name==="DataCloneError"&&(i=ae(t,a,f),s==null||s(`Sending ${N(l)}() reply`,i),e.sendMessage(i)),f}};return e.addMessageHandler(g),()=>{r=!0,e.removeMessageHandler(g)}},Oe=_e,oe=((ye=crypto.randomUUID)==null?void 0:ye.bind(crypto))??(()=>new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")),Te=Symbol("CallOptions"),Ne=(me=class{constructor(e){y(this,"transferables");y(this,"timeout");I(this,te,Te);this.transferables=e==null?void 0:e.transferables,this.timeout=e==null?void 0:e.timeout}},te=new WeakMap,me),Re=Ne,De=new Set(["apply","call","bind"]),ce=(e,n,t=[])=>new Proxy(t.length?()=>{}:Object.create(null),{get(s,r){if(r!=="then")return t.length&&De.has(r)?Reflect.get(s,r):ce(e,n,[...t,r])},apply(s,r,g){return e(t,g)}}),de=e=>new v("CONNECTION_DESTROYED",`Method call ${N(e)}() failed due to destroyed connection`),ke=(e,n,t)=>{let s=!1;const r=new Map,g=c=>{if(!re(c))return;const{callId:a,value:i,isError:o,isSerializedErrorInstance:f}=c,p=r.get(a);p&&(r.delete(a),t==null||t(`Received ${N(p.methodPath)}() call`,c),o?p.reject(f?Ee(i):i):p.resolve(i))};return e.addMessageHandler(g),{remoteProxy:ce((c,a)=>{if(s)throw de(c);const i=oe(),o=a[a.length-1],f=o instanceof Re,{timeout:p,transferables:w}=f?o:{},M=f?a.slice(0,-1):a;return new Promise((d,P)=>{const _=p!==void 0?window.setTimeout(()=>{r.delete(i),P(new v("METHOD_CALL_TIMEOUT",`Method call ${N(c)}() timed out after ${p}ms`))},p):void 0;r.set(i,{methodPath:c,resolve:d,reject:P,timeoutId:_});try{const b={namespace:C,channel:n,type:"CALL",id:i,methodPath:c,args:M};t==null||t(`Sending ${N(c)}() call`,b),e.sendMessage(b,w)}catch(b){P(new v("TRANSMISSION_FAILED",b.message))}})},t),destroy:()=>{s=!0,e.removeMessageHandler(g);for(const{methodPath:c,reject:a,timeoutId:i}of r.values())clearTimeout(i),a(de(c));r.clear()}}},Le=ke,xe=()=>{let e,n;return{promise:new Promise((s,r)=>{e=s,n=r}),resolve:e,reject:n}},He=xe,Ue=class extends Error{constructor(e){super(`You've hit a bug in Penpal. Please file an issue with the following information: ${e}`)}},W=Ue,X="deprecated-penpal",$e=e=>Y(e)&&"penpal"in e,je=e=>e.split("."),he=e=>e.join("."),ue=e=>new W(`Unexpected message to translate: ${JSON.stringify(e)}`),qe=e=>{if(e.penpal==="syn")return{namespace:C,channel:void 0,type:"SYN",participantId:X};if(e.penpal==="ack")return{namespace:C,channel:void 0,type:"ACK2"};if(e.penpal==="call")return{namespace:C,channel:void 0,type:"CALL",id:e.id,methodPath:je(e.methodName),args:e.args};if(e.penpal==="reply")return e.resolution==="fulfilled"?{namespace:C,channel:void 0,type:"REPLY",callId:e.id,value:e.returnValue}:{namespace:C,channel:void 0,type:"REPLY",callId:e.id,isError:!0,...e.returnValueIsError?{value:e.returnValue,isSerializedErrorInstance:!0}:{value:e.returnValue}};throw ue(e)},Fe=e=>{if(J(e))return{penpal:"synAck",methodNames:e.methodPaths.map(he)};if(se(e))return{penpal:"call",id:e.id,methodName:he(e.methodPath),args:e.args};if(re(e))return e.isError?{penpal:"reply",id:e.callId,resolution:"rejected",...e.isSerializedErrorInstance?{returnValue:e.value,returnValueIsError:!0}:{returnValue:e.value}}:{penpal:"reply",id:e.callId,resolution:"fulfilled",returnValue:e.value};throw ue(e)},Ve=({messenger:e,methods:n,timeout:t,channel:s,log:r})=>{const g=oe();let u;const l=[];let c=!1;const a=ie(n),{promise:i,resolve:o,reject:f}=He(),p=t!==void 0?setTimeout(()=>{f(new v("CONNECTION_TIMEOUT",`Connection timed out after ${t}ms`))},t):void 0,w=()=>{for(const A of l)A()},M=()=>{if(c)return;l.push(Oe(e,n,s,r));const{remoteProxy:A,destroy:H}=Le(e,s,r);l.push(H),clearTimeout(p),c=!0,o({remoteProxy:A,destroy:w})},d=()=>{const A={namespace:C,type:"SYN",channel:s,participantId:g};r==null||r("Sending handshake SYN",A);try{e.sendMessage(A)}catch(H){f(new v("TRANSMISSION_FAILED",H.message))}},P=A=>{if(r==null||r("Received handshake SYN",A),A.participantId===u&&u!==X||(u=A.participantId,d(),!(g>u||u===X)))return;const G={namespace:C,channel:s,type:"ACK1",methodPaths:a};r==null||r("Sending handshake ACK1",G);try{e.sendMessage(G)}catch(pt){f(new v("TRANSMISSION_FAILED",pt.message));return}},_=A=>{r==null||r("Received handshake ACK1",A);const H={namespace:C,channel:s,type:"ACK2"};r==null||r("Sending handshake ACK2",H);try{e.sendMessage(H)}catch(G){f(new v("TRANSMISSION_FAILED",G.message));return}M()},b=A=>{r==null||r("Received handshake ACK2",A),M()},Q=A=>{K(A)&&P(A),J(A)&&_(A),Z(A)&&b(A)};return e.addMessageHandler(Q),l.push(()=>e.removeMessageHandler(Q)),d(),i},ze=Ve,Ye=e=>{let n=!1,t;return(...s)=>(n||(n=!0,t=e(...s)),t)},Ke=Ye,le=new WeakSet,We=({messenger:e,methods:n={},timeout:t,channel:s,log:r})=>{if(!e)throw new v("INVALID_ARGUMENT","messenger must be defined");if(le.has(e))throw new v("INVALID_ARGUMENT","A messenger can only be used for a single connection");le.add(e);const g=[e.destroy],u=Ke(a=>{if(a){const i={namespace:C,channel:s,type:"DESTROY"};try{e.sendMessage(i)}catch{}}for(const i of g)i();r==null||r("Connection destroyed")}),l=a=>Pe(a)&&a.channel===s;return{promise:(async()=>{try{e.initialize({log:r,validateReceivedMessage:l}),e.addMessageHandler(o=>{Ce(o)&&u(!1)});const{remoteProxy:a,destroy:i}=await ze({messenger:e,methods:n,timeout:t,channel:s,log:r});return g.push(i),a}catch(a){throw u(!0),a}})(),destroy:()=>{u(!0)}}},Be=We,Qe=(be=class{constructor({remoteWindow:e,allowedOrigins:n}){I(this,R,void 0);I(this,k,void 0);I(this,U,void 0);I(this,$,void 0);I(this,L,void 0);I(this,D,new Set);I(this,S,void 0);I(this,x,!1);y(this,"initialize",({log:e,validateReceivedMessage:n})=>{O(this,U,e),O(this,$,n),window.addEventListener("message",h(this,V))});y(this,"sendMessage",(e,n)=>{if(K(e)){const t=h(this,j).call(this,e);h(this,R).postMessage(e,{targetOrigin:t,transfer:n});return}if(J(e)||h(this,x)){const t=h(this,x)?Fe(e):e,s=h(this,j).call(this,e);h(this,R).postMessage(t,{targetOrigin:s,transfer:n});return}if(Z(e)){const{port1:t,port2:s}=new MessageChannel;O(this,S,t),t.addEventListener("message",h(this,q)),t.start();const r=[s,...n||[]],g=h(this,j).call(this,e);h(this,R).postMessage(e,{targetOrigin:g,transfer:r});return}if(h(this,S)){h(this,S).postMessage(e,{transfer:n});return}throw new W("Port is undefined")});y(this,"addMessageHandler",e=>{h(this,D).add(e)});y(this,"removeMessageHandler",e=>{h(this,D).delete(e)});y(this,"destroy",()=>{window.removeEventListener("message",h(this,V)),h(this,F).call(this),h(this,D).clear()});I(this,B,e=>h(this,k).some(n=>n instanceof RegExp?n.test(e):n===e||n==="*"));I(this,j,e=>{if(K(e))return"*";if(!h(this,L))throw new W("Concrete remote origin not set");return h(this,L)==="null"&&h(this,k).includes("*")?"*":h(this,L)});I(this,F,()=>{var e,n;(e=h(this,S))==null||e.removeEventListener("message",h(this,q)),(n=h(this,S))==null||n.close(),O(this,S,void 0)});I(this,V,({source:e,origin:n,ports:t,data:s})=>{var r,g,u;if(e===h(this,R)&&($e(s)&&((r=h(this,U))==null||r.call(this,"Please upgrade the child window to the latest version of Penpal."),O(this,x,!0),s=qe(s)),!!((g=h(this,$))!=null&&g.call(this,s)))){if(!h(this,B).call(this,n)){(u=h(this,U))==null||u.call(this,`Received a message from origin \`${n}\` which did not match allowed origins \`[${h(this,k).join(", ")}]\``);return}if(K(s)&&(h(this,F).call(this),O(this,L,n)),Z(s)&&!h(this,x)){if(O(this,S,t[0]),!h(this,S))throw new W("No port received on ACK2");h(this,S).addEventListener("message",h(this,q)),h(this,S).start()}for(const l of h(this,D))l(s)}});I(this,q,({data:e})=>{var n;if((n=h(this,$))!=null&&n.call(this,e))for(const t of h(this,D))t(e)});if(!e)throw new v("INVALID_ARGUMENT","remoteWindow must be defined");O(this,R,e),O(this,k,n!=null&&n.length?n:[window.origin])}},R=new WeakMap,k=new WeakMap,U=new WeakMap,$=new WeakMap,L=new WeakMap,D=new WeakMap,S=new WeakMap,x=new WeakMap,B=new WeakMap,j=new WeakMap,F=new WeakMap,V=new WeakMap,q=new WeakMap,be),Ge=Qe,Je=e=>(...n)=>{console.log(`✍️ %c${e}%c`,"font-weight: bold;","",...n)},Ze=Je;function Xe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var fe={exports:{}};(function(e){var n=Object.prototype.hasOwnProperty,t="~";function s(){}Object.create&&(s.prototype=Object.create(null),new s().__proto__||(t=!1));function r(c,a,i){this.fn=c,this.context=a,this.once=i||!1}function g(c,a,i,o,f){if(typeof i!="function")throw new TypeError("The listener must be a function");var p=new r(i,o||c,f),w=t?t+a:a;return c._events[w]?c._events[w].fn?c._events[w]=[c._events[w],p]:c._events[w].push(p):(c._events[w]=p,c._eventsCount++),c}function u(c,a){--c._eventsCount===0?c._events=new s:delete c._events[a]}function l(){this._events=new s,this._eventsCount=0}l.prototype.eventNames=function(){var a=[],i,o;if(this._eventsCount===0)return a;for(o in i=this._events)n.call(i,o)&&a.push(t?o.slice(1):o);return Object.getOwnPropertySymbols?a.concat(Object.getOwnPropertySymbols(i)):a},l.prototype.listeners=function(a){var i=t?t+a:a,o=this._events[i];if(!o)return[];if(o.fn)return[o.fn];for(var f=0,p=o.length,w=new Array(p);f<p;f++)w[f]=o[f].fn;return w},l.prototype.listenerCount=function(a){var i=t?t+a:a,o=this._events[i];return o?o.fn?1:o.length:0},l.prototype.emit=function(a,i,o,f,p,w){var M=t?t+a:a;if(!this._events[M])return!1;var d=this._events[M],P=arguments.length,_,b;if(d.fn){switch(d.once&&this.removeListener(a,d.fn,void 0,!0),P){case 1:return d.fn.call(d.context),!0;case 2:return d.fn.call(d.context,i),!0;case 3:return d.fn.call(d.context,i,o),!0;case 4:return d.fn.call(d.context,i,o,f),!0;case 5:return d.fn.call(d.context,i,o,f,p),!0;case 6:return d.fn.call(d.context,i,o,f,p,w),!0}for(b=1,_=new Array(P-1);b<P;b++)_[b-1]=arguments[b];d.fn.apply(d.context,_)}else{var Q=d.length,A;for(b=0;b<Q;b++)switch(d[b].once&&this.removeListener(a,d[b].fn,void 0,!0),P){case 1:d[b].fn.call(d[b].context);break;case 2:d[b].fn.call(d[b].context,i);break;case 3:d[b].fn.call(d[b].context,i,o);break;case 4:d[b].fn.call(d[b].context,i,o,f);break;default:if(!_)for(A=1,_=new Array(P-1);A<P;A++)_[A-1]=arguments[A];d[b].fn.apply(d[b].context,_)}}return!0},l.prototype.on=function(a,i,o){return g(this,a,i,o,!1)},l.prototype.once=function(a,i,o){return g(this,a,i,o,!0)},l.prototype.removeListener=function(a,i,o,f){var p=t?t+a:a;if(!this._events[p])return this;if(!i)return u(this,p),this;var w=this._events[p];if(w.fn)w.fn===i&&(!f||w.once)&&(!o||w.context===o)&&u(this,p);else{for(var M=0,d=[],P=w.length;M<P;M++)(w[M].fn!==i||f&&!w[M].once||o&&w[M].context!==o)&&d.push(w[M]);d.length?this._events[p]=d.length===1?d[0]:d:u(this,p)}return this},l.prototype.removeAllListeners=function(a){var i;return a?(i=t?t+a:a,this._events[i]&&u(this,i)):(this._events=new s,this._eventsCount=0),this},l.prototype.off=l.prototype.removeListener,l.prototype.addListener=l.prototype.on,l.prefixed=t,l.EventEmitter=l,e.exports=l})(fe);var et=fe.exports;const tt=Xe(et);class pe extends tt{on(n,t,s){return super.on(n,t,s)}once(n,t,s){return super.once(n,t,s)}off(n,t,s){return super.off(n,t,s)}emit(n,...t){return super.emit(n,...t)}}class nt{constructor(){y(this,"queue",[]);y(this,"maxSize",100)}enqueue(n,t=3){this.queue.length>=this.maxSize&&this.queue.shift();const s={...n,retryCount:0,maxRetries:t};return this.queue.push(s),n.messageId}dequeue(){return this.queue.shift()}hasMessages(){return this.queue.length>0}getMessageById(n){return this.queue.find(t=>t.messageId===n)}removeMessageById(n){const t=this.queue.findIndex(s=>s.messageId===n);t!==-1&&this.queue.splice(t,1)}clear(){this.queue=[]}}class st{constructor(n,t=!1){this.context=n,this.debug=t}formatMessage(n,...t){return[`[${new Date().toISOString()}] [${this.context}] [${n}]`,...t]}info(...n){console.info(...this.formatMessage("INFO",...n))}debug(...n){this.debug&&console.debug(...this.formatMessage("DEBUG",...n))}warn(...n){console.warn(...this.formatMessage("WARN",...n))}error(...n){console.error(...this.formatMessage("ERROR",...n))}}let rt=e=>crypto.getRandomValues(new Uint8Array(e)),it=(e,n,t)=>{let s=(2<<Math.log2(e.length-1))-1,r=-~(1.6*s*n/e.length);return(g=n)=>{let u="";for(;;){let l=t(r),c=r|0;for(;c--;)if(u+=e[l[c]&s]||"",u.length>=g)return u}}};const at=((e,n=21)=>it(e,n|0,rt))("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",12);class ot extends pe{constructor(t,s={}){super();y(this,"connection",null);y(this,"iframe");y(this,"options");y(this,"messageQueue");y(this,"logger");y(this,"isConnected",!1);y(this,"reconnectAttempts",0);y(this,"maxReconnectAttempts",3);this.iframe=t,this.options={timeout:3e4,debug:!1,retryCount:3,retryDelay:1e3,childOrigin:"*",...s},this.messageQueue=new nt,this.logger=new st("PenpalBridge",this.options.debug)}async connect(t={}){try{this.logger.info("正在建立连接...");const s=new Ge({remoteWindow:this.iframe,allowedOrigins:["http://127.0.0.1:3000"]});this.connection=Be({messenger:s,methods:{add(r,g){return r+g},emitEvent:(r,g)=>{this.emit(r,g)},...t},timeout:this.options.timeout,log:Ze("parent")}),await this.connection.promise,this.isConnected=!0,this.reconnectAttempts=0,await this.processQueuedMessages(),this.logger.info("连接建立成功"),this.emit("connected")}catch(s){throw this.logger.error("连接失败:",s),await this.handleReconnect(),s}}async send(t,s){var g;const r={action:t,params:s,timestamp:Date.now(),messageId:at()};if(!this.isConnected)throw this.messageQueue.enqueue(r),new Error("Connection not ready, message queued");try{if(this.logger.debug("发送消息:",r),!((g=this.connection)!=null&&g.child))throw new Error("连接未就绪");const u=await this.connection.child.handleMessage(r);return this.logger.debug("收到响应:",u),this.validateResponse(u)}catch(u){throw this.logger.error("发送消息失败:",u),this.messageQueue.enqueue(r),u}}async processQueuedMessages(){for(;this.messageQueue.hasMessages();){const t=this.messageQueue.dequeue();if(t)try{await this.send(t.action,t.params)}catch(s){this.logger.warn("队列消息发送失败:",s),this.messageQueue.enqueue(t)}}}async handleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){this.logger.error("重连次数达到上限"),this.emit("connection-lost");return}this.reconnectAttempts++,this.logger.info(`尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})`),await new Promise(t=>setTimeout(t,this.options.retryDelay*this.reconnectAttempts));try{await this.connect()}catch{await this.handleReconnect()}}validateResponse(t){if(!t||t.success===void 0)throw new Error("Invalid response format");if(!t.success){const s=t.error||{code:"UNKNOWN",message:"Unknown error"};throw new Error(`${s.code}: ${s.message}`)}return t.data}disconnect(){this.connection&&(this.connection.destroy(),this.isConnected=!1,this.emit("disconnected"),this.logger.info("连接已断开"))}getConnectionStatus(){return this.isConnected}}class ct{constructor(n){this.bridge=n}async initialize(n){return this.bridge.send("canvas.initialize",n)}async setData(n){return this.bridge.send("canvas.setData",n)}async getData(){return this.bridge.send("canvas.getData")}async clear(){return this.bridge.send("canvas.clear")}async undo(){return this.bridge.send("canvas.undo")}async redo(){return this.bridge.send("canvas.redo")}async export(n){return this.bridge.send("canvas.export",{format:n})}async save(){return this.bridge.send("canvas.save")}async invoke(n,...t){return this.bridge.send("canvas.invoke",{method:n,args:t})}async setZoom(n){return this.bridge.send("canvas.setZoom",{zoom:n})}async getSnapshot(){return this.bridge.send("canvas.getSnapshot")}}class dt{constructor(n){this.bridge=n}async setAbilities(n){return this.bridge.send("abilities.set",n)}async getAbilities(){return this.bridge.send("abilities.get")}async enableAbility(n){return this.bridge.send("abilities.enable",{name:n})}async disableAbility(n){return this.bridge.send("abilities.disable",{name:n})}}class ht{constructor(n){this.bridge=n}async setTheme(n){return this.bridge.send("theme.set",{theme:n})}async getCurrentTheme(){return this.bridge.send("theme.get")}async updateToken(n){return this.bridge.send("theme.updateToken",n)}}class ut{constructor(n){this.bridge=n}async setLocale(n,t){return this.bridge.send("i18n.setLocale",{locale:n,messages:t})}async getCurrentLocale(){return this.bridge.send("i18n.getLocale")}async updateMessages(n){return this.bridge.send("i18n.updateMessages",n)}}class lt{constructor(n){this.bridge=n}async validateToken(){return this.bridge.send("auth.validateToken")}}const T={READY:"ready",CHANGE:"change",SAVE:"save",ERROR:"error",SELECTION_CHANGED:"selection-changed",CONNECTED:"connected",DISCONNECTED:"disconnected",LOADED:"loaded",BEFORE_UNLOAD:"before-unload",OBJECT_ADDED:"object-added",OBJECT_MODIFIED:"object-modified",OBJECT_REMOVED:"object-removed",MOUSE_DOWN:"mouse-down",MOUSE_UP:"mouse-up",MOUSE_MOVE:"mouse-move",KEY_DOWN:"key-down",KEY_UP:"key-up"};class ve extends pe{constructor(t,s){super();y(this,"bridge");y(this,"canvasAPI");y(this,"abilityAPI");y(this,"themeAPI");y(this,"i18nAPI");y(this,"authAPI");y(this,"config");y(this,"iframe");y(this,"isInitialized",!1);this.validateConfig(s),this.config=s,this.iframe=t,this.bridge=new ot(t,{debug:s.debug||!1,timeout:3e4,childOrigin:this.extractOrigin(t.src)}),this.canvasAPI=new ct(this.bridge),this.abilityAPI=new dt(this.bridge),this.themeAPI=new ht(this.bridge),this.i18nAPI=new ut(this.bridge),this.authAPI=new lt(this.bridge),this.setupEventHandlers()}async init(){if(!this.isInitialized)try{await this.bridge.connect({getConfig:()=>this.config,log:(t,s)=>{console.log(`[Canvas ${t.toUpperCase()}]`,s)}}),await this.canvasAPI.initialize(this.config),this.config.abilities&&await this.abilityAPI.setAbilities(this.config.abilities),this.config.theme&&await this.themeAPI.setTheme(this.config.theme),this.config.locale&&await this.i18nAPI.setLocale(this.config.locale,this.config.messages),this.isInitialized=!0,this.emit(T.READY)}catch(t){throw this.emit(T.ERROR,t),t}}get canvas(){return{setData:t=>this.canvasAPI.setData(t),getData:()=>this.canvasAPI.getData(),clear:()=>this.canvasAPI.clear(),undo:()=>this.canvasAPI.undo(),redo:()=>this.canvasAPI.redo(),export:(t="png")=>this.canvasAPI.export(t),save:()=>this.canvasAPI.save(),setZoom:t=>this.canvasAPI.setZoom(t),getSnapshot:()=>this.canvasAPI.getSnapshot(),invoke:(t,...s)=>this.canvasAPI.invoke(t,...s)}}get abilities(){return{set:t=>this.abilityAPI.setAbilities(t),get:()=>this.abilityAPI.getAbilities(),enable:t=>this.abilityAPI.enableAbility(t),disable:t=>this.abilityAPI.disableAbility(t),updateConfig:(t,s)=>this.abilityAPI.updateAbilityConfig(t,s)}}get theme(){return{set:t=>this.themeAPI.setTheme(t),get:()=>this.themeAPI.getCurrentTheme(),updateToken:t=>this.themeAPI.updateToken(t),reset:()=>this.themeAPI.resetTheme()}}get i18n(){return{setLocale:(t,s)=>this.i18nAPI.setLocale(t,s),getLocale:()=>this.i18nAPI.getCurrentLocale(),updateMessages:t=>this.i18nAPI.updateMessages(t),getMessages:()=>this.i18nAPI.getMessages(),getTranslation:t=>this.i18nAPI.getTranslation(t)}}get auth(){return{validateToken:()=>this.authAPI.validateToken(),refreshToken:t=>this.authAPI.refreshToken(t),getTokenInfo:()=>this.authAPI.getTokenInfo()}}get utils(){return{getConnectionStatus:()=>this.bridge.getConnectionStatus(),disconnect:()=>this.bridge.disconnect(),reconnect:async()=>{this.bridge.disconnect(),this.isInitialized=!1,await this.init()},isInitialized:()=>this.isInitialized}}setupEventHandlers(){this.bridge.on("canvas-change",t=>{this.emit(T.CHANGE,t)}),this.bridge.on("canvas-save",t=>{this.emit(T.SAVE,t)}),this.bridge.on("canvas-error",t=>{this.emit(T.ERROR,t)}),this.bridge.on("canvas-selection-changed",t=>{this.emit(T.SELECTION_CHANGED,t)}),this.bridge.on("connected",()=>{console.log("链接建立成功"),this.emit(T.CONNECTED)}),this.bridge.on("disconnected",()=>{console.log("链接断开"),this.emit(T.DISCONNECTED)})}validateConfig(t){if(!t.token)throw new Error("Token is required");if(t.abilities){const s=["text","image","barcode","multiLayout","shape","qrCode"];Object.keys(t.abilities).forEach(r=>{s.includes(r)||console.warn(`Unknown ability: ${r}`)})}}extractOrigin(t){try{return new URL(t).origin}catch{return"*"}}}function ft(e,n){return new ve(e,n)}m.CANVAS_EVENTS=T,m.NiimbotCanvasSDK=ve,m.createCanvas=ft,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
+
//# sourceMappingURL=niimbot-canvas-sdk.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"niimbot-canvas-sdk.umd.js","sources":["../node_modules/.pnpm/penpal@7.0.4/node_modules/penpal/dist/penpal.mjs","../node_modules/.pnpm/eventemitter3@5.0.1/node_modules/eventemitter3/index.js","../src/core/EventEmitter.ts","../src/core/MessageQueue.ts","../src/utils/logger.ts","../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../src/utils/id.ts","../src/core/PenpalBridge.ts","../src/api/CanvasAPI.ts","../src/api/AbilityAPI.ts","../src/api/ThemeAPI.ts","../src/api/I18nAPI.ts","../src/api/AuthAPI.ts","../src/constants/events.ts","../src/main.ts"],"sourcesContent":["// src/PenpalError.ts\nvar PenpalError = class extends Error {\n code;\n constructor(code, message) {\n super(message);\n this.name = \"PenpalError\";\n this.code = code;\n }\n};\nvar PenpalError_default = PenpalError;\n\n// src/errorSerialization.ts\nvar serializeError = (error) => ({\n name: error.name,\n message: error.message,\n stack: error.stack,\n penpalCode: error instanceof PenpalError_default ? error.code : void 0\n});\nvar deserializeError = ({\n name,\n message,\n stack,\n penpalCode\n}) => {\n const deserializedError = penpalCode ? new PenpalError_default(penpalCode, message) : new Error(message);\n deserializedError.name = name;\n deserializedError.stack = stack;\n return deserializedError;\n};\n\n// src/Reply.ts\nvar brand = Symbol(\"Reply\");\nvar Reply = class {\n value;\n transferables;\n // Allows TypeScript to distinguish between an actual instance of this\n // class versus an object that looks structurally similar.\n // eslint-disable-next-line no-unused-private-class-members\n #brand = brand;\n constructor(value, options) {\n this.value = value;\n this.transferables = options?.transferables;\n }\n};\nvar Reply_default = Reply;\n\n// src/namespace.ts\nvar namespace_default = \"penpal\";\n\n// src/guards.ts\nvar isObject = (value) => {\n return typeof value === \"object\" && value !== null;\n};\nvar isFunction = (value) => {\n return typeof value === \"function\";\n};\nvar isMessage = (data) => {\n return isObject(data) && data.namespace === namespace_default;\n};\nvar isSynMessage = (message) => {\n return message.type === \"SYN\";\n};\nvar isAck1Message = (message) => {\n return message.type === \"ACK1\";\n};\nvar isAck2Message = (message) => {\n return message.type === \"ACK2\";\n};\nvar isCallMessage = (message) => {\n return message.type === \"CALL\";\n};\nvar isReplyMessage = (message) => {\n return message.type === \"REPLY\";\n};\nvar isDestroyMessage = (message) => {\n return message.type === \"DESTROY\";\n};\n\n// src/methodSerialization.ts\nvar extractMethodPathsFromMethods = (methods, currentPath = []) => {\n const methodPaths = [];\n for (const key of Object.keys(methods)) {\n const value = methods[key];\n if (isFunction(value)) {\n methodPaths.push([...currentPath, key]);\n } else if (isObject(value)) {\n methodPaths.push(\n ...extractMethodPathsFromMethods(value, [...currentPath, key])\n );\n }\n }\n return methodPaths;\n};\nvar getMethodAtMethodPath = (methodPath, methods) => {\n const result = methodPath.reduce(\n (acc, pathSegment) => {\n return isObject(acc) ? acc[pathSegment] : void 0;\n },\n methods\n );\n return isFunction(result) ? result : void 0;\n};\nvar formatMethodPath = (methodPath) => {\n return methodPath.join(\".\");\n};\n\n// src/connectCallHandler.ts\nvar createErrorReplyMessage = (channel, callId, error) => ({\n namespace: namespace_default,\n channel,\n type: \"REPLY\",\n callId,\n isError: true,\n ...error instanceof Error ? { value: serializeError(error), isSerializedErrorInstance: true } : { value: error }\n});\nvar connectCallHandler = (messenger, methods, channel, log) => {\n let isDestroyed = false;\n const handleMessage = async (message) => {\n if (isDestroyed) {\n return;\n }\n if (!isCallMessage(message)) {\n return;\n }\n log?.(`Received ${formatMethodPath(message.methodPath)}() call`, message);\n const { methodPath, args, id: callId } = message;\n let replyMessage;\n let transferables;\n try {\n const method = getMethodAtMethodPath(methodPath, methods);\n if (!method) {\n throw new PenpalError_default(\n \"METHOD_NOT_FOUND\",\n `Method \\`${formatMethodPath(methodPath)}\\` is not found.`\n );\n }\n let value = await method(...args);\n if (value instanceof Reply_default) {\n transferables = value.transferables;\n value = await value.value;\n }\n replyMessage = {\n namespace: namespace_default,\n channel,\n type: \"REPLY\",\n callId,\n value\n };\n } catch (error) {\n replyMessage = createErrorReplyMessage(channel, callId, error);\n }\n if (isDestroyed) {\n return;\n }\n try {\n log?.(`Sending ${formatMethodPath(methodPath)}() reply`, replyMessage);\n messenger.sendMessage(replyMessage, transferables);\n } catch (error) {\n if (error.name === \"DataCloneError\") {\n replyMessage = createErrorReplyMessage(channel, callId, error);\n log?.(`Sending ${formatMethodPath(methodPath)}() reply`, replyMessage);\n messenger.sendMessage(replyMessage);\n }\n throw error;\n }\n };\n messenger.addMessageHandler(handleMessage);\n return () => {\n isDestroyed = true;\n messenger.removeMessageHandler(handleMessage);\n };\n};\nvar connectCallHandler_default = connectCallHandler;\n\n// src/generateId.ts\nvar generateId_default = crypto.randomUUID?.bind(crypto) ?? (() => new Array(4).fill(0).map(\n () => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)\n).join(\"-\"));\n\n// src/CallOptions.ts\nvar brand2 = Symbol(\"CallOptions\");\nvar CallOptions = class {\n transferables;\n timeout;\n // Allows TypeScript to distinguish between an actual instance of this\n // class versus an object that looks structurally similar.\n // eslint-disable-next-line no-unused-private-class-members\n #brand = brand2;\n constructor(options) {\n this.transferables = options?.transferables;\n this.timeout = options?.timeout;\n }\n};\nvar CallOptions_default = CallOptions;\n\n// src/connectRemoteProxy.ts\nvar methodsToTreatAsNative = /* @__PURE__ */ new Set([\"apply\", \"call\", \"bind\"]);\nvar createRemoteProxy = (callback, log, path = []) => {\n return new Proxy(\n path.length ? () => {\n } : /* @__PURE__ */ Object.create(null),\n {\n get(target, prop) {\n if (prop === \"then\") {\n return;\n }\n if (path.length && methodsToTreatAsNative.has(prop)) {\n return Reflect.get(target, prop);\n }\n return createRemoteProxy(callback, log, [...path, prop]);\n },\n apply(target, _thisArg, args) {\n return callback(path, args);\n }\n }\n );\n};\nvar getDestroyedConnectionMethodCallError = (methodPath) => {\n return new PenpalError_default(\n \"CONNECTION_DESTROYED\",\n `Method call ${formatMethodPath(\n methodPath\n )}() failed due to destroyed connection`\n );\n};\nvar connectRemoteProxy = (messenger, channel, log) => {\n let isDestroyed = false;\n const replyHandlers = /* @__PURE__ */ new Map();\n const handleMessage = (message) => {\n if (!isReplyMessage(message)) {\n return;\n }\n const { callId, value, isError, isSerializedErrorInstance } = message;\n const replyHandler = replyHandlers.get(callId);\n if (!replyHandler) {\n return;\n }\n replyHandlers.delete(callId);\n log?.(\n `Received ${formatMethodPath(replyHandler.methodPath)}() call`,\n message\n );\n if (isError) {\n replyHandler.reject(\n isSerializedErrorInstance ? deserializeError(value) : value\n );\n } else {\n replyHandler.resolve(value);\n }\n };\n messenger.addMessageHandler(handleMessage);\n const remoteProxy = createRemoteProxy((methodPath, args) => {\n if (isDestroyed) {\n throw getDestroyedConnectionMethodCallError(methodPath);\n }\n const callId = generateId_default();\n const lastArg = args[args.length - 1];\n const lastArgIsOptions = lastArg instanceof CallOptions_default;\n const { timeout, transferables } = lastArgIsOptions ? lastArg : {};\n const argsWithoutOptions = lastArgIsOptions ? args.slice(0, -1) : args;\n return new Promise((resolve, reject) => {\n const timeoutId = timeout !== void 0 ? window.setTimeout(() => {\n replyHandlers.delete(callId);\n reject(\n new PenpalError_default(\n \"METHOD_CALL_TIMEOUT\",\n `Method call ${formatMethodPath(\n methodPath\n )}() timed out after ${timeout}ms`\n )\n );\n }, timeout) : void 0;\n replyHandlers.set(callId, { methodPath, resolve, reject, timeoutId });\n try {\n const callMessage = {\n namespace: namespace_default,\n channel,\n type: \"CALL\",\n id: callId,\n methodPath,\n args: argsWithoutOptions\n };\n log?.(`Sending ${formatMethodPath(methodPath)}() call`, callMessage);\n messenger.sendMessage(callMessage, transferables);\n } catch (error) {\n reject(\n new PenpalError_default(\"TRANSMISSION_FAILED\", error.message)\n );\n }\n });\n }, log);\n const destroy = () => {\n isDestroyed = true;\n messenger.removeMessageHandler(handleMessage);\n for (const { methodPath, reject, timeoutId } of replyHandlers.values()) {\n clearTimeout(timeoutId);\n reject(getDestroyedConnectionMethodCallError(methodPath));\n }\n replyHandlers.clear();\n };\n return {\n remoteProxy,\n destroy\n };\n};\nvar connectRemoteProxy_default = connectRemoteProxy;\n\n// src/getPromiseWithResolvers.ts\nvar getPromiseWithResolvers = () => {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return {\n promise,\n resolve,\n reject\n };\n};\nvar getPromiseWithResolvers_default = getPromiseWithResolvers;\n\n// src/PenpalBugError.ts\nvar PenpalBugError = class extends Error {\n constructor(message) {\n super(\n `You've hit a bug in Penpal. Please file an issue with the following information: ${message}`\n );\n }\n};\nvar PenpalBugError_default = PenpalBugError;\n\n// src/backwardCompatibility.ts\nvar DEPRECATED_PENPAL_PARTICIPANT_ID = \"deprecated-penpal\";\nvar isDeprecatedMessage = (data) => {\n return isObject(data) && \"penpal\" in data;\n};\nvar upgradeMethodPath = (methodPath) => methodPath.split(\".\");\nvar downgradeMethodPath = (methodPath) => methodPath.join(\".\");\nvar getUnexpectedMessageError = (message) => {\n return new PenpalBugError_default(\n `Unexpected message to translate: ${JSON.stringify(message)}`\n );\n};\nvar upgradeMessage = (message) => {\n if (message.penpal === \"syn\" /* Syn */) {\n return {\n namespace: namespace_default,\n channel: void 0,\n type: \"SYN\",\n participantId: DEPRECATED_PENPAL_PARTICIPANT_ID\n };\n }\n if (message.penpal === \"ack\" /* Ack */) {\n return {\n namespace: namespace_default,\n channel: void 0,\n type: \"ACK2\"\n };\n }\n if (message.penpal === \"call\" /* Call */) {\n return {\n namespace: namespace_default,\n channel: void 0,\n type: \"CALL\",\n // Actually converting the ID to a string would break communication.\n id: message.id,\n methodPath: upgradeMethodPath(message.methodName),\n args: message.args\n };\n }\n if (message.penpal === \"reply\" /* Reply */) {\n if (message.resolution === \"fulfilled\" /* Fulfilled */) {\n return {\n namespace: namespace_default,\n channel: void 0,\n type: \"REPLY\",\n // Actually converting the ID to a string would break communication.\n callId: message.id,\n value: message.returnValue\n };\n } else {\n return {\n namespace: namespace_default,\n channel: void 0,\n type: \"REPLY\",\n // Actually converting the ID to a string would break communication.\n callId: message.id,\n isError: true,\n ...message.returnValueIsError ? {\n value: message.returnValue,\n isSerializedErrorInstance: true\n } : {\n value: message.returnValue\n }\n };\n }\n }\n throw getUnexpectedMessageError(message);\n};\nvar downgradeMessage = (message) => {\n if (isAck1Message(message)) {\n return {\n penpal: \"synAck\" /* SynAck */,\n methodNames: message.methodPaths.map(downgradeMethodPath)\n };\n }\n if (isCallMessage(message)) {\n return {\n penpal: \"call\" /* Call */,\n // Actually converting the ID to a number would break communication.\n id: message.id,\n methodName: downgradeMethodPath(message.methodPath),\n args: message.args\n };\n }\n if (isReplyMessage(message)) {\n if (message.isError) {\n return {\n penpal: \"reply\" /* Reply */,\n // Actually converting the ID to a number would break communication.\n id: message.callId,\n resolution: \"rejected\" /* Rejected */,\n ...message.isSerializedErrorInstance ? {\n returnValue: message.value,\n returnValueIsError: true\n } : { returnValue: message.value }\n };\n } else {\n return {\n penpal: \"reply\" /* Reply */,\n // Actually converting the ID to a number would break communication.\n id: message.callId,\n resolution: \"fulfilled\" /* Fulfilled */,\n returnValue: message.value\n };\n }\n }\n throw getUnexpectedMessageError(message);\n};\n\n// src/shakeHands.ts\nvar shakeHands = ({\n messenger,\n methods,\n timeout,\n channel,\n log\n}) => {\n const participantId = generateId_default();\n let remoteParticipantId;\n const destroyHandlers = [];\n let isComplete = false;\n const methodPaths = extractMethodPathsFromMethods(methods);\n const { promise, resolve, reject } = getPromiseWithResolvers_default();\n const timeoutId = timeout !== void 0 ? setTimeout(() => {\n reject(\n new PenpalError_default(\n \"CONNECTION_TIMEOUT\",\n `Connection timed out after ${timeout}ms`\n )\n );\n }, timeout) : void 0;\n const destroy = () => {\n for (const destroyHandler of destroyHandlers) {\n destroyHandler();\n }\n };\n const connectCallHandlerAndMethodProxies = () => {\n if (isComplete) {\n return;\n }\n destroyHandlers.push(connectCallHandler_default(messenger, methods, channel, log));\n const { remoteProxy, destroy: destroyMethodProxies } = connectRemoteProxy_default(messenger, channel, log);\n destroyHandlers.push(destroyMethodProxies);\n clearTimeout(timeoutId);\n isComplete = true;\n resolve({\n remoteProxy,\n destroy\n });\n };\n const sendSynMessage = () => {\n const synMessage = {\n namespace: namespace_default,\n type: \"SYN\",\n channel,\n participantId\n };\n log?.(`Sending handshake SYN`, synMessage);\n try {\n messenger.sendMessage(synMessage);\n } catch (error) {\n reject(new PenpalError_default(\"TRANSMISSION_FAILED\", error.message));\n }\n };\n const handleSynMessage = (message) => {\n log?.(`Received handshake SYN`, message);\n if (message.participantId === remoteParticipantId && // TODO: Used for backward-compatibility. Remove in next major version.\n remoteParticipantId !== DEPRECATED_PENPAL_PARTICIPANT_ID) {\n return;\n }\n remoteParticipantId = message.participantId;\n sendSynMessage();\n const isHandshakeLeader = participantId > remoteParticipantId || // TODO: Used for backward-compatibility. Remove in next major version.\n remoteParticipantId === DEPRECATED_PENPAL_PARTICIPANT_ID;\n if (!isHandshakeLeader) {\n return;\n }\n const ack1Message = {\n namespace: namespace_default,\n channel,\n type: \"ACK1\",\n methodPaths\n };\n log?.(`Sending handshake ACK1`, ack1Message);\n try {\n messenger.sendMessage(ack1Message);\n } catch (error) {\n reject(new PenpalError_default(\"TRANSMISSION_FAILED\", error.message));\n return;\n }\n };\n const handleAck1Message = (message) => {\n log?.(`Received handshake ACK1`, message);\n const ack2Message = {\n namespace: namespace_default,\n channel,\n type: \"ACK2\"\n };\n log?.(`Sending handshake ACK2`, ack2Message);\n try {\n messenger.sendMessage(ack2Message);\n } catch (error) {\n reject(new PenpalError_default(\"TRANSMISSION_FAILED\", error.message));\n return;\n }\n connectCallHandlerAndMethodProxies();\n };\n const handleAck2Message = (message) => {\n log?.(`Received handshake ACK2`, message);\n connectCallHandlerAndMethodProxies();\n };\n const handleMessage = (message) => {\n if (isSynMessage(message)) {\n handleSynMessage(message);\n }\n if (isAck1Message(message)) {\n handleAck1Message(message);\n }\n if (isAck2Message(message)) {\n handleAck2Message(message);\n }\n };\n messenger.addMessageHandler(handleMessage);\n destroyHandlers.push(() => messenger.removeMessageHandler(handleMessage));\n sendSynMessage();\n return promise;\n};\nvar shakeHands_default = shakeHands;\n\n// src/once.ts\nvar once = (fn) => {\n let isCalled = false;\n let result;\n return (...args) => {\n if (!isCalled) {\n isCalled = true;\n result = fn(...args);\n }\n return result;\n };\n};\nvar once_default = once;\n\n// src/connect.ts\nvar usedMessengers = /* @__PURE__ */ new WeakSet();\nvar connect = ({\n messenger,\n methods = {},\n timeout,\n channel,\n log\n}) => {\n if (!messenger) {\n throw new PenpalError_default(\"INVALID_ARGUMENT\", \"messenger must be defined\");\n }\n if (usedMessengers.has(messenger)) {\n throw new PenpalError_default(\n \"INVALID_ARGUMENT\",\n \"A messenger can only be used for a single connection\"\n );\n }\n usedMessengers.add(messenger);\n const connectionDestroyedHandlers = [messenger.destroy];\n const destroyConnection = once_default((notifyOtherParticipant) => {\n if (notifyOtherParticipant) {\n const destroyMessage = {\n namespace: namespace_default,\n channel,\n type: \"DESTROY\"\n };\n try {\n messenger.sendMessage(destroyMessage);\n } catch (_) {\n }\n }\n for (const connectionDestroyedHandler of connectionDestroyedHandlers) {\n connectionDestroyedHandler();\n }\n log?.(\"Connection destroyed\");\n });\n const validateReceivedMessage = (data) => {\n return isMessage(data) && data.channel === channel;\n };\n const promise = (async () => {\n try {\n messenger.initialize({ log, validateReceivedMessage });\n messenger.addMessageHandler((message) => {\n if (isDestroyMessage(message)) {\n destroyConnection(false);\n }\n });\n const { remoteProxy, destroy } = await shakeHands_default({\n messenger,\n methods,\n timeout,\n channel,\n log\n });\n connectionDestroyedHandlers.push(destroy);\n return remoteProxy;\n } catch (error) {\n destroyConnection(true);\n throw error;\n }\n })();\n return {\n promise,\n // Why we don't reject the connection promise when consumer calls destroy():\n // https://github.com/Aaronius/penpal/issues/51\n destroy: () => {\n destroyConnection(true);\n }\n };\n};\nvar connect_default = connect;\n\n// src/messengers/WindowMessenger.ts\nvar WindowMessenger = class {\n #remoteWindow;\n #allowedOrigins;\n #log;\n #validateReceivedMessage;\n #concreteRemoteOrigin;\n #messageCallbacks = /* @__PURE__ */ new Set();\n #port;\n // TODO: Used for backward-compatibility. Remove in next major version.\n #isChildUsingDeprecatedProtocol = false;\n constructor({ remoteWindow, allowedOrigins }) {\n if (!remoteWindow) {\n throw new PenpalError_default(\"INVALID_ARGUMENT\", \"remoteWindow must be defined\");\n }\n this.#remoteWindow = remoteWindow;\n this.#allowedOrigins = allowedOrigins?.length ? allowedOrigins : [window.origin];\n }\n initialize = ({\n log,\n validateReceivedMessage\n }) => {\n this.#log = log;\n this.#validateReceivedMessage = validateReceivedMessage;\n window.addEventListener(\"message\", this.#handleMessageFromRemoteWindow);\n };\n sendMessage = (message, transferables) => {\n if (isSynMessage(message)) {\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(message, {\n targetOrigin: originForSending,\n transfer: transferables\n });\n return;\n }\n if (isAck1Message(message) || // If the child is using a previous version of Penpal, we need to\n // downgrade the message and send it through the window rather than\n // the port because older versions of Penpal don't use MessagePorts.\n this.#isChildUsingDeprecatedProtocol) {\n const payload = this.#isChildUsingDeprecatedProtocol ? downgradeMessage(message) : message;\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(payload, {\n targetOrigin: originForSending,\n transfer: transferables\n });\n return;\n }\n if (isAck2Message(message)) {\n const { port1, port2 } = new MessageChannel();\n this.#port = port1;\n port1.addEventListener(\"message\", this.#handleMessageFromPort);\n port1.start();\n const transferablesToSend = [port2, ...transferables || []];\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(message, {\n targetOrigin: originForSending,\n transfer: transferablesToSend\n });\n return;\n }\n if (this.#port) {\n this.#port.postMessage(message, {\n transfer: transferables\n });\n return;\n }\n throw new PenpalBugError_default(\"Port is undefined\");\n };\n addMessageHandler = (callback) => {\n this.#messageCallbacks.add(callback);\n };\n removeMessageHandler = (callback) => {\n this.#messageCallbacks.delete(callback);\n };\n destroy = () => {\n window.removeEventListener(\"message\", this.#handleMessageFromRemoteWindow);\n this.#destroyPort();\n this.#messageCallbacks.clear();\n };\n #isAllowedOrigin = (origin) => {\n return this.#allowedOrigins.some(\n (allowedOrigin) => allowedOrigin instanceof RegExp ? allowedOrigin.test(origin) : allowedOrigin === origin || allowedOrigin === \"*\"\n );\n };\n #getOriginForSendingMessage = (message) => {\n if (isSynMessage(message)) {\n return \"*\";\n }\n if (!this.#concreteRemoteOrigin) {\n throw new PenpalBugError_default(\"Concrete remote origin not set\");\n }\n return this.#concreteRemoteOrigin === \"null\" && this.#allowedOrigins.includes(\"*\") ? \"*\" : this.#concreteRemoteOrigin;\n };\n #destroyPort = () => {\n this.#port?.removeEventListener(\"message\", this.#handleMessageFromPort);\n this.#port?.close();\n this.#port = void 0;\n };\n #handleMessageFromRemoteWindow = ({\n source,\n origin,\n ports,\n data\n }) => {\n if (source !== this.#remoteWindow) {\n return;\n }\n if (isDeprecatedMessage(data)) {\n this.#log?.(\n \"Please upgrade the child window to the latest version of Penpal.\"\n );\n this.#isChildUsingDeprecatedProtocol = true;\n data = upgradeMessage(data);\n }\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n if (!this.#isAllowedOrigin(origin)) {\n this.#log?.(\n `Received a message from origin \\`${origin}\\` which did not match allowed origins \\`[${this.#allowedOrigins.join(\", \")}]\\``\n );\n return;\n }\n if (isSynMessage(data)) {\n this.#destroyPort();\n this.#concreteRemoteOrigin = origin;\n }\n if (isAck2Message(data) && // Previous versions of Penpal don't use MessagePorts and do all\n // communication through the window.\n !this.#isChildUsingDeprecatedProtocol) {\n this.#port = ports[0];\n if (!this.#port) {\n throw new PenpalBugError_default(\"No port received on ACK2\");\n }\n this.#port.addEventListener(\"message\", this.#handleMessageFromPort);\n this.#port.start();\n }\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n #handleMessageFromPort = ({ data }) => {\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n};\nvar WindowMessenger_default = WindowMessenger;\n\n// src/messengers/WorkerMessenger.ts\nvar WorkerMessenger = class {\n #worker;\n #validateReceivedMessage;\n #messageCallbacks = /* @__PURE__ */ new Set();\n #port;\n constructor({ worker }) {\n if (!worker) {\n throw new PenpalError_default(\"INVALID_ARGUMENT\", \"worker must be defined\");\n }\n this.#worker = worker;\n }\n initialize = ({ validateReceivedMessage }) => {\n this.#validateReceivedMessage = validateReceivedMessage;\n this.#worker.addEventListener(\"message\", this.#handleMessage);\n };\n sendMessage = (message, transferables) => {\n if (isSynMessage(message) || isAck1Message(message)) {\n this.#worker.postMessage(message, { transfer: transferables });\n return;\n }\n if (isAck2Message(message)) {\n const { port1, port2 } = new MessageChannel();\n this.#port = port1;\n port1.addEventListener(\"message\", this.#handleMessage);\n port1.start();\n this.#worker.postMessage(message, {\n transfer: [port2, ...transferables || []]\n });\n return;\n }\n if (this.#port) {\n this.#port.postMessage(message, {\n transfer: transferables\n });\n return;\n }\n throw new PenpalBugError_default(\"Port is undefined\");\n };\n addMessageHandler = (callback) => {\n this.#messageCallbacks.add(callback);\n };\n removeMessageHandler = (callback) => {\n this.#messageCallbacks.delete(callback);\n };\n destroy = () => {\n this.#worker.removeEventListener(\"message\", this.#handleMessage);\n this.#destroyPort();\n this.#messageCallbacks.clear();\n };\n #destroyPort = () => {\n this.#port?.removeEventListener(\"message\", this.#handleMessage);\n this.#port?.close();\n this.#port = void 0;\n };\n #handleMessage = ({ ports, data }) => {\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n if (isSynMessage(data)) {\n this.#destroyPort();\n }\n if (isAck2Message(data)) {\n this.#port = ports[0];\n if (!this.#port) {\n throw new PenpalBugError_default(\"No port received on ACK2\");\n }\n this.#port.addEventListener(\"message\", this.#handleMessage);\n this.#port.start();\n }\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n};\nvar WorkerMessenger_default = WorkerMessenger;\n\n// src/messengers/PortMessenger.ts\nvar PortMessenger = class {\n #port;\n #validateReceivedMessage;\n #messageCallbacks = /* @__PURE__ */ new Set();\n constructor({ port }) {\n if (!port) {\n throw new PenpalError_default(\"INVALID_ARGUMENT\", \"port must be defined\");\n }\n this.#port = port;\n }\n initialize = ({ validateReceivedMessage }) => {\n this.#validateReceivedMessage = validateReceivedMessage;\n this.#port.addEventListener(\"message\", this.#handleMessage);\n this.#port.start();\n };\n sendMessage = (message, transferables) => {\n this.#port?.postMessage(message, {\n transfer: transferables\n });\n };\n addMessageHandler = (callback) => {\n this.#messageCallbacks.add(callback);\n };\n removeMessageHandler = (callback) => {\n this.#messageCallbacks.delete(callback);\n };\n destroy = () => {\n this.#port.removeEventListener(\"message\", this.#handleMessage);\n this.#port.close();\n this.#messageCallbacks.clear();\n };\n #handleMessage = ({ data }) => {\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n};\nvar PortMessenger_default = PortMessenger;\n\n// src/ErrorCodeObj.ts\nvar ErrorCodeObj = {\n ConnectionDestroyed: \"CONNECTION_DESTROYED\",\n ConnectionTimeout: \"CONNECTION_TIMEOUT\",\n InvalidArgument: \"INVALID_ARGUMENT\",\n MethodCallTimeout: \"METHOD_CALL_TIMEOUT\",\n MethodNotFound: \"METHOD_NOT_FOUND\",\n TransmissionFailed: \"TRANSMISSION_FAILED\"\n};\nvar ErrorCodeObj_default = ErrorCodeObj;\n\n// src/debug.ts\nvar debug = (prefix) => {\n return (...args) => {\n console.log(`\\u270D\\uFE0F %c${prefix}%c`, \"font-weight: bold;\", \"\", ...args);\n };\n};\nvar debug_default = debug;\n\nexport { CallOptions_default as CallOptions, ErrorCodeObj_default as ErrorCode, PenpalError_default as PenpalError, PortMessenger_default as PortMessenger, Reply_default as Reply, WindowMessenger_default as WindowMessenger, WorkerMessenger_default as WorkerMessenger, connect_default as connect, debug_default as debug };\n//# sourceMappingURL=penpal.mjs.map\n//# sourceMappingURL=penpal.mjs.map","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","// src/core/EventEmitter.ts\r\nimport EventEmitter3 from 'eventemitter3'\r\n\r\nexport class EventEmitter extends EventEmitter3 {\r\n on(event: string | symbol, fn: (...args: any[]) => void, context?: any): this {\r\n return super.on(event, fn, context)\r\n }\r\n \r\n once(event: string | symbol, fn: (...args: any[]) => void, context?: any): this {\r\n return super.once(event, fn, context)\r\n }\r\n \r\n off(event: string | symbol, fn?: (...args: any[]) => void, context?: any): this {\r\n return super.off(event, fn, context)\r\n }\r\n \r\n emit(event: string | symbol, ...args: any[]): boolean {\r\n return super.emit(event, ...args)\r\n }\r\n}","// src/core/MessageQueue.ts\r\nimport { Message } from '@/types'\r\n\r\ninterface QueuedMessage extends Message {\r\n retryCount: number\r\n maxRetries: number\r\n}\r\n\r\nexport class MessageQueue {\r\n private queue: QueuedMessage[] = []\r\n private maxSize: number = 100\r\n\r\n enqueue(message: Message, maxRetries: number = 3): string {\r\n if (this.queue.length >= this.maxSize) {\r\n this.queue.shift()\r\n }\r\n \r\n const queuedMessage: QueuedMessage = {\r\n ...message,\r\n retryCount: 0,\r\n maxRetries\r\n }\r\n \r\n this.queue.push(queuedMessage)\r\n return message.messageId\r\n }\r\n\r\n dequeue(): Message | undefined {\r\n return this.queue.shift()\r\n }\r\n\r\n hasMessages(): boolean {\r\n return this.queue.length > 0\r\n }\r\n\r\n getMessageById(messageId: string): Message | undefined {\r\n return this.queue.find(msg => msg.messageId === messageId)\r\n }\r\n\r\n removeMessageById(messageId: string): void {\r\n const index = this.queue.findIndex(msg => msg.messageId === messageId)\r\n if (index !== -1) {\r\n this.queue.splice(index, 1)\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.queue = []\r\n }\r\n}","// src/utils/logger.ts\r\nexport class Logger {\r\n constructor(private context: string, private debug: boolean = false) {}\r\n\r\n private formatMessage(level: string, ...args: any[]): string[] {\r\n const timestamp = new Date().toISOString()\r\n return [`[${timestamp}] [${this.context}] [${level}]`, ...args]\r\n }\r\n\r\n info(...args: any[]): void {\r\n console.info(...this.formatMessage('INFO', ...args))\r\n }\r\n\r\n debug(...args: any[]): void {\r\n if (this.debug) {\r\n console.debug(...this.formatMessage('DEBUG', ...args))\r\n }\r\n }\r\n\r\n warn(...args: any[]): void {\r\n console.warn(...this.formatMessage('WARN', ...args))\r\n }\r\n\r\n error(...args: any[]): void {\r\n console.error(...this.formatMessage('ERROR', ...args))\r\n }\r\n}","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","// src/utils/id.ts\r\nimport { customAlphabet } from 'nanoid'\r\n\r\nconst alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'\r\nexport const generateMessageId = customAlphabet(alphabet, 12)\r\n\r\n","// src/core/PenpalBridge.ts\r\nimport { WindowMessenger, connect, debug } from 'penpal';\r\nimport { EventEmitter } from './EventEmitter'\r\nimport { ConnectionOptions, Message, ResponseMessage } from '@/types'\r\nimport { MessageQueue } from './MessageQueue'\r\nimport { Logger } from '../utils/logger'\r\nimport { generateMessageId } from '../utils/id'\r\n\r\nexport class PenpalBridge extends EventEmitter {\r\n private connection: any = null\r\n private iframe: HTMLIFrameElement\r\n private options: ConnectionOptions\r\n private messageQueue: MessageQueue\r\n private logger: Logger\r\n private isConnected: boolean = false\r\n private reconnectAttempts: number = 0\r\n private maxReconnectAttempts: number = 3\r\n\r\n constructor(iframe: HTMLIFrameElement, options: ConnectionOptions = {}) {\r\n super()\r\n this.iframe = iframe\r\n this.options = {\r\n timeout: 30000,\r\n debug: false,\r\n retryCount: 3,\r\n retryDelay: 1000,\r\n childOrigin: '*',\r\n ...options\r\n }\r\n this.messageQueue = new MessageQueue()\r\n this.logger = new Logger('PenpalBridge', this.options.debug)\r\n }\r\n\r\n /**\r\n * 建立连接\r\n */\r\n async connect(methods: Record<string, Function> = {}): Promise<void> {\r\n try {\r\n this.logger.info('正在建立连接...')\r\n const messenger = new WindowMessenger({\r\n remoteWindow: this.iframe,\r\n // Defaults to the current origin.\r\n allowedOrigins: ['http://127.0.0.1:3000'],\r\n // Alternatively,\r\n // allowedOrigins: [new Url(iframe.src).origin]\r\n });\r\n\r\n this.connection = connect({\r\n messenger,\r\n // Methods the parent window is exposing to the iframe window.\r\n methods: {\r\n add(num1:any, num2:any) {\r\n return num1 + num2;\r\n },\r\n emitEvent: (event: string, data: any) => {\r\n this.emit(event, data)\r\n },\r\n // 接收来自画板的请求\r\n ...methods,\r\n \r\n },\r\n timeout: this.options.timeout,\r\n // childOrigin: this.options.childOrigin,\r\n log: debug('parent')\r\n });\r\n\r\n // 等待连接建立\r\n await this.connection.promise\r\n \r\n this.isConnected = true\r\n this.reconnectAttempts = 0\r\n \r\n // 处理队列中的消息\r\n await this.processQueuedMessages()\r\n \r\n this.logger.info('连接建立成功')\r\n this.emit('connected')\r\n \r\n } catch (error) {\r\n this.logger.error('连接失败:', error)\r\n await this.handleReconnect()\r\n throw error\r\n }\r\n }\r\n\r\n /**\r\n * 发送消息到画板\r\n */\r\n async send(action: string, params?: any): Promise<any> {\r\n const message: Message = {\r\n action,\r\n params,\r\n timestamp: Date.now(),\r\n messageId: generateMessageId()\r\n }\r\n\r\n // 如果未连接,加入队列\r\n if (!this.isConnected) {\r\n this.messageQueue.enqueue(message)\r\n throw new Error('Connection not ready, message queued')\r\n }\r\n\r\n try {\r\n this.logger.debug('发送消息:', message)\r\n \r\n if (!this.connection?.child) {\r\n throw new Error('连接未就绪')\r\n }\r\n\r\n const response = await this.connection.child.handleMessage(message)\r\n this.logger.debug('收到响应:', response)\r\n \r\n return this.validateResponse(response)\r\n \r\n } catch (error) {\r\n this.logger.error('发送消息失败:', error)\r\n // 加入队列等待重试\r\n this.messageQueue.enqueue(message)\r\n throw error\r\n }\r\n }\r\n\r\n /**\r\n * 处理队列中的消息\r\n */\r\n private async processQueuedMessages(): Promise<void> {\r\n while (this.messageQueue.hasMessages()) {\r\n const message = this.messageQueue.dequeue()\r\n if (message) {\r\n try {\r\n await this.send(message.action, message.params)\r\n } catch (error) {\r\n this.logger.warn('队列消息发送失败:', error)\r\n // 重新加入队列\r\n this.messageQueue.enqueue(message)\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 重连机制\r\n */\r\n private async handleReconnect(): Promise<void> {\r\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\r\n this.logger.error('重连次数达到上限')\r\n this.emit('connection-lost')\r\n return\r\n }\r\n\r\n this.reconnectAttempts++\r\n this.logger.info(`尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})`)\r\n \r\n await new Promise(resolve => \r\n setTimeout(resolve, this.options.retryDelay! * this.reconnectAttempts)\r\n )\r\n \r\n try {\r\n await this.connect()\r\n } catch (error) {\r\n await this.handleReconnect()\r\n }\r\n }\r\n\r\n /**\r\n * 验证响应格式\r\n */\r\n private validateResponse(response: ResponseMessage): any {\r\n if (!response || response.success === undefined) {\r\n throw new Error('Invalid response format')\r\n }\r\n \r\n if (!response.success) {\r\n const error = response.error || { code: 'UNKNOWN', message: 'Unknown error' }\r\n throw new Error(`${error.code}: ${error.message}`)\r\n }\r\n \r\n return response.data\r\n }\r\n\r\n /**\r\n * 断开连接\r\n */\r\n disconnect(): void {\r\n if (this.connection) {\r\n this.connection.destroy()\r\n this.isConnected = false\r\n this.emit('disconnected')\r\n this.logger.info('连接已断开')\r\n }\r\n }\r\n\r\n /**\r\n * 获取连接状态\r\n */\r\n getConnectionStatus(): boolean {\r\n return this.isConnected\r\n }\r\n}","// src/api/CanvasAPI.ts\r\nimport { PenpalBridge } from '@/core/PenpalBridge'\r\nimport { CanvasConfig, DesignData } from '@/types'\r\n\r\nexport class CanvasAPI {\r\n constructor(private bridge: PenpalBridge) {}\r\n\r\n async initialize(config: CanvasConfig): Promise<void> {\r\n return this.bridge.send('canvas.initialize', config)\r\n }\r\n\r\n async setData(data: DesignData): Promise<void> {\r\n return this.bridge.send('canvas.setData', data)\r\n }\r\n\r\n async getData(): Promise<DesignData> {\r\n return this.bridge.send('canvas.getData')\r\n }\r\n\r\n async clear(): Promise<void> {\r\n return this.bridge.send('canvas.clear')\r\n }\r\n\r\n async undo(): Promise<void> {\r\n return this.bridge.send('canvas.undo')\r\n }\r\n\r\n async redo(): Promise<void> {\r\n return this.bridge.send('canvas.redo')\r\n }\r\n\r\n async export(format: 'png' | 'jpg' | 'svg' | 'pdf'): Promise<string> {\r\n return this.bridge.send('canvas.export', { format })\r\n }\r\n\r\n async save(): Promise<DesignData> {\r\n return this.bridge.send('canvas.save')\r\n }\r\n\r\n async invoke(method: string, ...args: any[]): Promise<any> {\r\n return this.bridge.send('canvas.invoke', { method, args })\r\n }\r\n\r\n async setZoom(zoom: number): Promise<void> {\r\n return this.bridge.send('canvas.setZoom', { zoom })\r\n }\r\n\r\n async getSnapshot(): Promise<string> {\r\n return this.bridge.send('canvas.getSnapshot')\r\n }\r\n}\r\n\r\n\r\n","// src/api/AbilityAPI.ts\r\nimport { PenpalBridge } from '../core/PenpalBridge';\r\nimport { AbilityConfig } from '../types';\r\n\r\nexport class AbilityAPI {\r\n constructor(private bridge: PenpalBridge) {}\r\n\r\n async setAbilities(config: AbilityConfig): Promise<void> {\r\n return this.bridge.send('abilities.set', config);\r\n }\r\n\r\n async getAbilities(): Promise<AbilityConfig> {\r\n return this.bridge.send('abilities.get');\r\n }\r\n\r\n async enableAbility(name: string): Promise<void> {\r\n return this.bridge.send('abilities.enable', { name });\r\n }\r\n\r\n async disableAbility(name: string): Promise<void> {\r\n return this.bridge.send('abilities.disable', { name });\r\n }\r\n}","// src/api/ThemeAPI.ts\r\nimport { PenpalBridge } from '../core/PenpalBridge';\r\nimport { ThemeToken } from '../types';\r\n\r\nexport class ThemeAPI {\r\n constructor(private bridge: PenpalBridge) {}\r\n\r\n async setTheme(theme: string | ThemeToken): Promise<void> {\r\n return this.bridge.send('theme.set', { theme });\r\n }\r\n\r\n async getCurrentTheme(): Promise<string | ThemeToken> {\r\n return this.bridge.send('theme.get');\r\n }\r\n\r\n async updateToken(token: Partial<ThemeToken>): Promise<void> {\r\n return this.bridge.send('theme.updateToken', token);\r\n }\r\n}","// src/api/I18nAPI.ts\r\nimport { PenpalBridge } from '../core/PenpalBridge';\r\nimport { I18nMessages } from '../types';\r\n\r\nexport class I18nAPI {\r\n constructor(private bridge: PenpalBridge) {}\r\n\r\n async setLocale(locale: string, messages?: I18nMessages): Promise<void> {\r\n return this.bridge.send('i18n.setLocale', { locale, messages });\r\n }\r\n\r\n async getCurrentLocale(): Promise<string> {\r\n return this.bridge.send('i18n.getLocale');\r\n }\r\n\r\n async updateMessages(messages: I18nMessages): Promise<void> {\r\n return this.bridge.send('i18n.updateMessages', messages);\r\n }\r\n}","// src/api/AuthAPI.ts\r\nimport { PenpalBridge } from '../core/PenpalBridge';\r\n\r\nexport class AuthAPI {\r\n constructor(private bridge: PenpalBridge) {}\r\n\r\n async validateToken(): Promise<boolean> {\r\n return this.bridge.send('auth.validateToken');\r\n }\r\n}","// src/constants/events.ts\r\nexport const CANVAS_EVENTS = {\r\n READY: 'ready',\r\n CHANGE: 'change',\r\n SAVE: 'save',\r\n ERROR: 'error',\r\n SELECTION_CHANGED: 'selection-changed',\r\n CONNECTED: 'connected',\r\n DISCONNECTED: 'disconnected',\r\n // 画板生命周期事件\r\n LOADED: 'loaded',\r\n BEFORE_UNLOAD: 'before-unload',\r\n // 画板操作事件\r\n OBJECT_ADDED: 'object-added',\r\n OBJECT_MODIFIED: 'object-modified',\r\n OBJECT_REMOVED: 'object-removed',\r\n // 用户交互事件\r\n MOUSE_DOWN: 'mouse-down',\r\n MOUSE_UP: 'mouse-up',\r\n MOUSE_MOVE: 'mouse-move',\r\n KEY_DOWN: 'key-down',\r\n KEY_UP: 'key-up'\r\n} as const","// src/main.ts\r\nimport { PenpalBridge } from './core/PenpalBridge'\r\nimport { CanvasAPI } from './api/CanvasAPI'\r\nimport { AbilityAPI } from './api/AbilityAPI'\r\nimport { ThemeAPI } from './api/ThemeAPI'\r\nimport { I18nAPI } from './api/I18nAPI'\r\nimport { AuthAPI } from './api/AuthAPI'\r\nimport { CanvasConfig, DesignData, AbilityConfig, ThemeToken, I18nMessages } from './types'\r\nimport { EventEmitter } from './core/EventEmitter'\r\nimport { CANVAS_EVENTS } from './constants/events'\r\n\r\nexport class NiimbotCanvasSDK extends EventEmitter {\r\n private bridge: PenpalBridge\r\n private canvasAPI: CanvasAPI\r\n private abilityAPI: AbilityAPI\r\n private themeAPI: ThemeAPI\r\n private i18nAPI: I18nAPI\r\n private authAPI: AuthAPI\r\n \r\n private config: CanvasConfig\r\n private iframe: HTMLIFrameElement\r\n private isInitialized: boolean = false\r\n\r\n constructor(iframe: HTMLIFrameElement, config: CanvasConfig) {\r\n super()\r\n \r\n this.validateConfig(config)\r\n this.config = config\r\n this.iframe = iframe\r\n \r\n // 初始化桥接\r\n this.bridge = new PenpalBridge(iframe, {\r\n debug: config.debug || import.meta.env.DEV,\r\n timeout: 30000,\r\n childOrigin: this.extractOrigin(iframe.src)\r\n })\r\n \r\n // 初始化API模块\r\n this.canvasAPI = new CanvasAPI(this.bridge)\r\n this.abilityAPI = new AbilityAPI(this.bridge)\r\n this.themeAPI = new ThemeAPI(this.bridge)\r\n this.i18nAPI = new I18nAPI(this.bridge)\r\n this.authAPI = new AuthAPI(this.bridge)\r\n \r\n // 绑定事件\r\n this.setupEventHandlers()\r\n }\r\n\r\n /**\r\n * 初始化SDK\r\n */\r\n async init(): Promise<void> {\r\n if (this.isInitialized) {\r\n return\r\n }\r\n\r\n try {\r\n // 建立连接\r\n await this.bridge.connect({\r\n getConfig: () => this.config,\r\n log: (level: string, message: string) => {\r\n console.log(`[Canvas ${level.toUpperCase()}]`, message)\r\n }\r\n })\r\n\r\n // 初始化画板\r\n await this.canvasAPI.initialize(this.config)\r\n \r\n // 设置能力\r\n if (this.config.abilities) {\r\n await this.abilityAPI.setAbilities(this.config.abilities)\r\n }\r\n \r\n // 设置主题\r\n if (this.config.theme) {\r\n await this.themeAPI.setTheme(this.config.theme)\r\n }\r\n \r\n // 设置国际化\r\n if (this.config.locale) {\r\n await this.i18nAPI.setLocale(this.config.locale, this.config.messages)\r\n }\r\n \r\n this.isInitialized = true\r\n this.emit(CANVAS_EVENTS.READY)\r\n \r\n } catch (error) {\r\n this.emit(CANVAS_EVENTS.ERROR, error)\r\n throw error\r\n }\r\n }\r\n\r\n // Canvas 操作方法\r\n get canvas() {\r\n return {\r\n setData: (data: DesignData) => this.canvasAPI.setData(data),\r\n getData: () => this.canvasAPI.getData(),\r\n clear: () => this.canvasAPI.clear(),\r\n undo: () => this.canvasAPI.undo(),\r\n redo: () => this.canvasAPI.redo(),\r\n export: (format: 'png' | 'jpg' | 'svg' | 'pdf' = 'png') => \r\n this.canvasAPI.export(format),\r\n save: () => this.canvasAPI.save(),\r\n setZoom: (zoom: number) => this.canvasAPI.setZoom(zoom),\r\n getSnapshot: () => this.canvasAPI.getSnapshot(),\r\n invoke: (method: string, ...args: any[]) => this.canvasAPI.invoke(method, ...args)\r\n }\r\n }\r\n\r\n // 能力管理\r\n get abilities() {\r\n return {\r\n set: (config: AbilityConfig) => this.abilityAPI.setAbilities(config),\r\n get: () => this.abilityAPI.getAbilities(),\r\n enable: (name: string) => this.abilityAPI.enableAbility(name),\r\n disable: (name: string) => this.abilityAPI.disableAbility(name),\r\n updateConfig: (name: string, config: Record<string, any>) => \r\n this.abilityAPI.updateAbilityConfig(name, config)\r\n }\r\n }\r\n\r\n // 主题管理\r\n get theme() {\r\n return {\r\n set: (theme: string | ThemeToken) => this.themeAPI.setTheme(theme),\r\n get: () => this.themeAPI.getCurrentTheme(),\r\n updateToken: (token: Partial<ThemeToken>) => this.themeAPI.updateToken(token),\r\n reset: () => this.themeAPI.resetTheme()\r\n }\r\n }\r\n\r\n // 国际化管理\r\n get i18n() {\r\n return {\r\n setLocale: (locale: string, messages?: I18nMessages) => \r\n this.i18nAPI.setLocale(locale, messages),\r\n getLocale: () => this.i18nAPI.getCurrentLocale(),\r\n updateMessages: (messages: I18nMessages) => \r\n this.i18nAPI.updateMessages(messages),\r\n getMessages: () => this.i18nAPI.getMessages(),\r\n getTranslation: (key: string) => this.i18nAPI.getTranslation(key)\r\n }\r\n }\r\n\r\n // 鉴权管理\r\n get auth() {\r\n return {\r\n validateToken: () => this.authAPI.validateToken(),\r\n refreshToken: (token: string) => this.authAPI.refreshToken(token),\r\n getTokenInfo: () => this.authAPI.getTokenInfo()\r\n }\r\n }\r\n\r\n // 工具方法\r\n get utils() {\r\n return {\r\n getConnectionStatus: () => this.bridge.getConnectionStatus(),\r\n disconnect: () => this.bridge.disconnect(),\r\n reconnect: async () => {\r\n this.bridge.disconnect()\r\n this.isInitialized = false\r\n await this.init()\r\n },\r\n isInitialized: () => this.isInitialized\r\n }\r\n }\r\n\r\n private setupEventHandlers(): void {\r\n // 监听画板事件\r\n this.bridge.on('canvas-change', (data: DesignData) => {\r\n this.emit(CANVAS_EVENTS.CHANGE, data)\r\n })\r\n \r\n this.bridge.on('canvas-save', (data: DesignData) => {\r\n this.emit(CANVAS_EVENTS.SAVE, data)\r\n })\r\n \r\n this.bridge.on('canvas-error', (error: any) => {\r\n this.emit(CANVAS_EVENTS.ERROR, error)\r\n })\r\n \r\n this.bridge.on('canvas-selection-changed', (selection: any[]) => {\r\n this.emit(CANVAS_EVENTS.SELECTION_CHANGED, selection)\r\n })\r\n \r\n this.bridge.on('connected', () => {\r\n console.log(\"链接建立成功\")\r\n this.emit(CANVAS_EVENTS.CONNECTED)\r\n })\r\n \r\n this.bridge.on('disconnected', () => {\r\n console.log(\"链接断开\")\r\n this.emit(CANVAS_EVENTS.DISCONNECTED)\r\n })\r\n }\r\n\r\n private validateConfig(config: CanvasConfig): void {\r\n if (!config.token) {\r\n throw new Error('Token is required')\r\n }\r\n \r\n if (config.abilities) {\r\n const validAbilities = ['text', 'image', 'barcode', 'multiLayout', 'shape', 'qrCode']\r\n Object.keys(config.abilities).forEach(key => {\r\n if (!validAbilities.includes(key)) {\r\n console.warn(`Unknown ability: ${key}`)\r\n }\r\n })\r\n }\r\n }\r\n\r\n private extractOrigin(url: string): string {\r\n try {\r\n const urlObj = new URL(url)\r\n return urlObj.origin\r\n } catch {\r\n return '*'\r\n }\r\n }\r\n}\r\n\r\n// 便捷方法\r\nexport function createCanvas(iframe: HTMLIFrameElement, config: CanvasConfig): NiimbotCanvasSDK {\r\n return new NiimbotCanvasSDK(iframe, config)\r\n}\r\n\r\n// 常量导出\r\nexport { CANVAS_EVENTS } from './constants/events'\r\n\r\n// 类型导出\r\nexport type {\r\n CanvasConfig,\r\n DesignData,\r\n AbilityConfig,\r\n ThemeToken,\r\n I18nMessages,\r\n CanvasToken\r\n} from './types'"],"names":["PenpalError","code","message","__publicField","PenpalError_default","serializeError","error","deserializeError","name","stack","penpalCode","deserializedError","brand","Reply","_a","value","options","__privateAdd","_brand","Reply_default","namespace_default","isObject","isFunction","isMessage","data","isSynMessage","isAck1Message","isAck2Message","isCallMessage","isReplyMessage","isDestroyMessage","extractMethodPathsFromMethods","methods","currentPath","methodPaths","key","getMethodAtMethodPath","methodPath","result","acc","pathSegment","formatMethodPath","createErrorReplyMessage","channel","callId","connectCallHandler","messenger","log","isDestroyed","handleMessage","args","replyMessage","transferables","method","connectCallHandler_default","generateId_default","_b","brand2","CallOptions","_c","CallOptions_default","methodsToTreatAsNative","createRemoteProxy","callback","path","target","prop","_thisArg","getDestroyedConnectionMethodCallError","connectRemoteProxy","replyHandlers","isError","isSerializedErrorInstance","replyHandler","lastArg","lastArgIsOptions","timeout","argsWithoutOptions","resolve","reject","timeoutId","callMessage","connectRemoteProxy_default","getPromiseWithResolvers","res","rej","getPromiseWithResolvers_default","PenpalBugError","PenpalBugError_default","DEPRECATED_PENPAL_PARTICIPANT_ID","isDeprecatedMessage","upgradeMethodPath","downgradeMethodPath","getUnexpectedMessageError","upgradeMessage","downgradeMessage","shakeHands","participantId","remoteParticipantId","destroyHandlers","isComplete","promise","destroy","destroyHandler","connectCallHandlerAndMethodProxies","remoteProxy","destroyMethodProxies","sendSynMessage","synMessage","handleSynMessage","ack1Message","handleAck1Message","ack2Message","handleAck2Message","shakeHands_default","once","fn","isCalled","once_default","usedMessengers","connect","connectionDestroyedHandlers","destroyConnection","notifyOtherParticipant","destroyMessage","connectionDestroyedHandler","validateReceivedMessage","connect_default","WindowMessenger","_d","remoteWindow","allowedOrigins","_remoteWindow","_allowedOrigins","_log","_validateReceivedMessage","_concreteRemoteOrigin","_messageCallbacks","_port","_isChildUsingDeprecatedProtocol","__privateSet","__privateGet","_handleMessageFromRemoteWindow","originForSending","_getOriginForSendingMessage","payload","port1","port2","_handleMessageFromPort","transferablesToSend","_destroyPort","_isAllowedOrigin","origin","allowedOrigin","source","ports","WindowMessenger_default","debug","prefix","debug_default","has","Events","EE","context","addListener","emitter","event","listener","evt","clearEvent","EventEmitter","names","events","handlers","i","l","ee","listeners","a1","a2","a3","a4","a5","len","length","j","module","EventEmitter3","MessageQueue","maxRetries","queuedMessage","messageId","msg","index","Logger","level","random","bytes","customRandom","alphabet","defaultSize","getRandom","mask","step","size","id","generateMessageId","PenpalBridge","iframe","num1","num2","action","params","response","CanvasAPI","bridge","config","format","zoom","AbilityAPI","ThemeAPI","theme","token","I18nAPI","locale","messages","AuthAPI","CANVAS_EVENTS","NiimbotCanvasSDK","selection","validAbilities","url","createCanvas"],"mappings":"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","x_google_ignoreList":[0,1,5]}
|
package/package.json
CHANGED
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "niimbot-canvas-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Niimbot Canvas iframe communication SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/niimbot-canvas-sdk.umd.js",
|
|
7
|
-
"module": "dist/niimbot-canvas-sdk.es.js",
|
|
8
7
|
"types": "dist/index.d.ts",
|
|
9
8
|
"exports": {
|
|
10
9
|
".": {
|
|
11
|
-
"import": "./dist/niimbot-canvas-sdk.es.js",
|
|
12
10
|
"require": "./dist/niimbot-canvas-sdk.umd.js",
|
|
13
11
|
"types": "./dist/index.d.ts"
|
|
14
12
|
},
|
|
15
13
|
"./vue": {
|
|
16
|
-
"import": "./dist/vue.es.js",
|
|
17
14
|
"require": "./dist/vue.umd.js",
|
|
18
15
|
"types": "./dist/vue.d.ts"
|
|
19
16
|
}
|
|
@@ -37,6 +34,7 @@
|
|
|
37
34
|
"penpal": "^7.0.4"
|
|
38
35
|
},
|
|
39
36
|
"devDependencies": {
|
|
37
|
+
"@rollup/plugin-babel": "^6.1.0",
|
|
40
38
|
"@babel/core": "^7.28.5",
|
|
41
39
|
"@babel/preset-env": "^7.28.5",
|
|
42
40
|
"@types/node": "^20.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var be=Object.defineProperty;var Ae=(e,n,t)=>n in e?be(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t;var g=(e,n,t)=>(Ae(e,typeof n!="symbol"?n+"":n,t),t),X=(e,n,t)=>{if(!n.has(e))throw TypeError("Cannot "+t)};var h=(e,n,t)=>(X(e,n,"read from private field"),t?t.call(e):n.get(e)),A=(e,n,t)=>{if(n.has(e))throw TypeError("Cannot add the same private member more than once");n instanceof WeakSet?n.add(e):n.set(e,t)},_=(e,n,t,s)=>(X(e,n,"write to private field"),s?s.call(e,t):n.set(e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var Ee=class extends Error{constructor(n,t){super(t);g(this,"code");this.name="PenpalError",this.code=n}},P=Ee,we=e=>({name:e.name,message:e.message,stack:e.stack,penpalCode:e instanceof P?e.code:void 0}),Ie=({name:e,message:n,stack:t,penpalCode:s})=>{const r=s?new P(s,n):new Error(n);return r.name=e,r.stack=t,r},Me=Symbol("Reply"),G,re,Pe=(re=class{constructor(e,n){g(this,"value");g(this,"transferables");A(this,G,Me);this.value=e,this.transferables=n==null?void 0:n.transferables}},G=new WeakMap,re),Ce=Pe,M="penpal",W=e=>typeof e=="object"&&e!==null,ce=e=>typeof e=="function",_e=e=>W(e)&&e.namespace===M,z=e=>e.type==="SYN",Z=e=>e.type==="ACK1",B=e=>e.type==="ACK2",de=e=>e.type==="CALL",he=e=>e.type==="REPLY",Se=e=>e.type==="DESTROY",ue=(e,n=[])=>{const t=[];for(const s of Object.keys(e)){const r=e[s];ce(r)?t.push([...n,s]):W(r)&&t.push(...ue(r,[...n,s]))}return t},Oe=(e,n)=>{const t=e.reduce((s,r)=>W(s)?s[r]:void 0,n);return ce(t)?t:void 0},N=e=>e.join("."),ee=(e,n,t)=>({namespace:M,channel:e,type:"REPLY",callId:n,isError:!0,...t instanceof Error?{value:we(t),isSerializedErrorInstance:!0}:{value:t}}),Re=(e,n,t,s)=>{let r=!1;const p=async u=>{if(r||!de(u))return;s==null||s(`Received ${N(u.methodPath)}() call`,u);const{methodPath:l,args:c,id:a}=u;let i,o;try{const f=Oe(l,n);if(!f)throw new P("METHOD_NOT_FOUND",`Method \`${N(l)}\` is not found.`);let v=await f(...c);v instanceof Ce&&(o=v.transferables,v=await v.value),i={namespace:M,channel:t,type:"REPLY",callId:a,value:v}}catch(f){i=ee(t,a,f)}if(!r)try{s==null||s(`Sending ${N(l)}() reply`,i),e.sendMessage(i,o)}catch(f){throw f.name==="DataCloneError"&&(i=ee(t,a,f),s==null||s(`Sending ${N(l)}() reply`,i),e.sendMessage(i)),f}};return e.addMessageHandler(p),()=>{r=!0,e.removeMessageHandler(p)}},Ne=Re,ie,le=((ie=crypto.randomUUID)==null?void 0:ie.bind(crypto))??(()=>new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")),Te=Symbol("CallOptions"),J,ae,De=(ae=class{constructor(e){g(this,"transferables");g(this,"timeout");A(this,J,Te);this.transferables=e==null?void 0:e.transferables,this.timeout=e==null?void 0:e.timeout}},J=new WeakMap,ae),ke=De,Le=new Set(["apply","call","bind"]),fe=(e,n,t=[])=>new Proxy(t.length?()=>{}:Object.create(null),{get(s,r){if(r!=="then")return t.length&&Le.has(r)?Reflect.get(s,r):fe(e,n,[...t,r])},apply(s,r,p){return e(t,p)}}),te=e=>new P("CONNECTION_DESTROYED",`Method call ${N(e)}() failed due to destroyed connection`),xe=(e,n,t)=>{let s=!1;const r=new Map,p=c=>{if(!he(c))return;const{callId:a,value:i,isError:o,isSerializedErrorInstance:f}=c,v=r.get(a);v&&(r.delete(a),t==null||t(`Received ${N(v.methodPath)}() call`,c),o?v.reject(f?Ie(i):i):v.resolve(i))};return e.addMessageHandler(p),{remoteProxy:fe((c,a)=>{if(s)throw te(c);const i=le(),o=a[a.length-1],f=o instanceof ke,{timeout:v,transferables:b}=f?o:{},E=f?a.slice(0,-1):a;return new Promise((d,w)=>{const C=v!==void 0?window.setTimeout(()=>{r.delete(i),w(new P("METHOD_CALL_TIMEOUT",`Method call ${N(c)}() timed out after ${v}ms`))},v):void 0;r.set(i,{methodPath:c,resolve:d,reject:w,timeoutId:C});try{const y={namespace:M,channel:n,type:"CALL",id:i,methodPath:c,args:E};t==null||t(`Sending ${N(c)}() call`,y),e.sendMessage(y,b)}catch(y){w(new P("TRANSMISSION_FAILED",y.message))}})},t),destroy:()=>{s=!0,e.removeMessageHandler(p);for(const{methodPath:c,reject:a,timeoutId:i}of r.values())clearTimeout(i),a(te(c));r.clear()}}},He=xe,Ue=()=>{let e,n;return{promise:new Promise((s,r)=>{e=s,n=r}),resolve:e,reject:n}},$e=Ue,je=class extends Error{constructor(e){super(`You've hit a bug in Penpal. Please file an issue with the following information: ${e}`)}},Y=je,Q="deprecated-penpal",qe=e=>W(e)&&"penpal"in e,Fe=e=>e.split("."),ne=e=>e.join("."),ve=e=>new Y(`Unexpected message to translate: ${JSON.stringify(e)}`),Ve=e=>{if(e.penpal==="syn")return{namespace:M,channel:void 0,type:"SYN",participantId:Q};if(e.penpal==="ack")return{namespace:M,channel:void 0,type:"ACK2"};if(e.penpal==="call")return{namespace:M,channel:void 0,type:"CALL",id:e.id,methodPath:Fe(e.methodName),args:e.args};if(e.penpal==="reply")return e.resolution==="fulfilled"?{namespace:M,channel:void 0,type:"REPLY",callId:e.id,value:e.returnValue}:{namespace:M,channel:void 0,type:"REPLY",callId:e.id,isError:!0,...e.returnValueIsError?{value:e.returnValue,isSerializedErrorInstance:!0}:{value:e.returnValue}};throw ve(e)},ze=e=>{if(Z(e))return{penpal:"synAck",methodNames:e.methodPaths.map(ne)};if(de(e))return{penpal:"call",id:e.id,methodName:ne(e.methodPath),args:e.args};if(he(e))return e.isError?{penpal:"reply",id:e.callId,resolution:"rejected",...e.isSerializedErrorInstance?{returnValue:e.value,returnValueIsError:!0}:{returnValue:e.value}}:{penpal:"reply",id:e.callId,resolution:"fulfilled",returnValue:e.value};throw ve(e)},Ye=({messenger:e,methods:n,timeout:t,channel:s,log:r})=>{const p=le();let u;const l=[];let c=!1;const a=ue(n),{promise:i,resolve:o,reject:f}=$e(),v=t!==void 0?setTimeout(()=>{f(new P("CONNECTION_TIMEOUT",`Connection timed out after ${t}ms`))},t):void 0,b=()=>{for(const m of l)m()},E=()=>{if(c)return;l.push(Ne(e,n,s,r));const{remoteProxy:m,destroy:T}=He(e,s,r);l.push(T),clearTimeout(v),c=!0,o({remoteProxy:m,destroy:b})},d=()=>{const m={namespace:M,type:"SYN",channel:s,participantId:p};r==null||r("Sending handshake SYN",m);try{e.sendMessage(m)}catch(T){f(new P("TRANSMISSION_FAILED",T.message))}},w=m=>{if(r==null||r("Received handshake SYN",m),m.participantId===u&&u!==Q||(u=m.participantId,d(),!(p>u||u===Q)))return;const V={namespace:M,channel:s,type:"ACK1",methodPaths:a};r==null||r("Sending handshake ACK1",V);try{e.sendMessage(V)}catch(me){f(new P("TRANSMISSION_FAILED",me.message));return}},C=m=>{r==null||r("Received handshake ACK1",m);const T={namespace:M,channel:s,type:"ACK2"};r==null||r("Sending handshake ACK2",T);try{e.sendMessage(T)}catch(V){f(new P("TRANSMISSION_FAILED",V.message));return}E()},y=m=>{r==null||r("Received handshake ACK2",m),E()},F=m=>{z(m)&&w(m),Z(m)&&C(m),B(m)&&y(m)};return e.addMessageHandler(F),l.push(()=>e.removeMessageHandler(F)),d(),i},Ke=Ye,We=e=>{let n=!1,t;return(...s)=>(n||(n=!0,t=e(...s)),t)},Be=We,se=new WeakSet,Qe=({messenger:e,methods:n={},timeout:t,channel:s,log:r})=>{if(!e)throw new P("INVALID_ARGUMENT","messenger must be defined");if(se.has(e))throw new P("INVALID_ARGUMENT","A messenger can only be used for a single connection");se.add(e);const p=[e.destroy],u=Be(a=>{if(a){const i={namespace:M,channel:s,type:"DESTROY"};try{e.sendMessage(i)}catch{}}for(const i of p)i();r==null||r("Connection destroyed")}),l=a=>_e(a)&&a.channel===s;return{promise:(async()=>{try{e.initialize({log:r,validateReceivedMessage:l}),e.addMessageHandler(o=>{Se(o)&&u(!1)});const{remoteProxy:a,destroy:i}=await Ke({messenger:e,methods:n,timeout:t,channel:s,log:r});return p.push(i),a}catch(a){throw u(!0),a}})(),destroy:()=>{u(!0)}}},Ge=Qe,O,D,x,H,k,R,I,L,K,U,j,q,$,oe,Je=(oe=class{constructor({remoteWindow:e,allowedOrigins:n}){A(this,O,void 0);A(this,D,void 0);A(this,x,void 0);A(this,H,void 0);A(this,k,void 0);A(this,R,new Set);A(this,I,void 0);A(this,L,!1);g(this,"initialize",({log:e,validateReceivedMessage:n})=>{_(this,x,e),_(this,H,n),window.addEventListener("message",h(this,q))});g(this,"sendMessage",(e,n)=>{if(z(e)){const t=h(this,U).call(this,e);h(this,O).postMessage(e,{targetOrigin:t,transfer:n});return}if(Z(e)||h(this,L)){const t=h(this,L)?ze(e):e,s=h(this,U).call(this,e);h(this,O).postMessage(t,{targetOrigin:s,transfer:n});return}if(B(e)){const{port1:t,port2:s}=new MessageChannel;_(this,I,t),t.addEventListener("message",h(this,$)),t.start();const r=[s,...n||[]],p=h(this,U).call(this,e);h(this,O).postMessage(e,{targetOrigin:p,transfer:r});return}if(h(this,I)){h(this,I).postMessage(e,{transfer:n});return}throw new Y("Port is undefined")});g(this,"addMessageHandler",e=>{h(this,R).add(e)});g(this,"removeMessageHandler",e=>{h(this,R).delete(e)});g(this,"destroy",()=>{window.removeEventListener("message",h(this,q)),h(this,j).call(this),h(this,R).clear()});A(this,K,e=>h(this,D).some(n=>n instanceof RegExp?n.test(e):n===e||n==="*"));A(this,U,e=>{if(z(e))return"*";if(!h(this,k))throw new Y("Concrete remote origin not set");return h(this,k)==="null"&&h(this,D).includes("*")?"*":h(this,k)});A(this,j,()=>{var e,n;(e=h(this,I))==null||e.removeEventListener("message",h(this,$)),(n=h(this,I))==null||n.close(),_(this,I,void 0)});A(this,q,({source:e,origin:n,ports:t,data:s})=>{var r,p,u;if(e===h(this,O)&&(qe(s)&&((r=h(this,x))==null||r.call(this,"Please upgrade the child window to the latest version of Penpal."),_(this,L,!0),s=Ve(s)),!!((p=h(this,H))!=null&&p.call(this,s)))){if(!h(this,K).call(this,n)){(u=h(this,x))==null||u.call(this,`Received a message from origin \`${n}\` which did not match allowed origins \`[${h(this,D).join(", ")}]\``);return}if(z(s)&&(h(this,j).call(this),_(this,k,n)),B(s)&&!h(this,L)){if(_(this,I,t[0]),!h(this,I))throw new Y("No port received on ACK2");h(this,I).addEventListener("message",h(this,$)),h(this,I).start()}for(const l of h(this,R))l(s)}});A(this,$,({data:e})=>{var n;if((n=h(this,H))!=null&&n.call(this,e))for(const t of h(this,R))t(e)});if(!e)throw new P("INVALID_ARGUMENT","remoteWindow must be defined");_(this,O,e),_(this,D,n!=null&&n.length?n:[window.origin])}},O=new WeakMap,D=new WeakMap,x=new WeakMap,H=new WeakMap,k=new WeakMap,R=new WeakMap,I=new WeakMap,L=new WeakMap,K=new WeakMap,U=new WeakMap,j=new WeakMap,q=new WeakMap,$=new WeakMap,oe),Ze=Je,Xe=e=>(...n)=>{console.log(`✍️ %c${e}%c`,"font-weight: bold;","",...n)},et=Xe;function tt(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var pe={exports:{}};(function(e){var n=Object.prototype.hasOwnProperty,t="~";function s(){}Object.create&&(s.prototype=Object.create(null),new s().__proto__||(t=!1));function r(c,a,i){this.fn=c,this.context=a,this.once=i||!1}function p(c,a,i,o,f){if(typeof i!="function")throw new TypeError("The listener must be a function");var v=new r(i,o||c,f),b=t?t+a:a;return c._events[b]?c._events[b].fn?c._events[b]=[c._events[b],v]:c._events[b].push(v):(c._events[b]=v,c._eventsCount++),c}function u(c,a){--c._eventsCount===0?c._events=new s:delete c._events[a]}function l(){this._events=new s,this._eventsCount=0}l.prototype.eventNames=function(){var a=[],i,o;if(this._eventsCount===0)return a;for(o in i=this._events)n.call(i,o)&&a.push(t?o.slice(1):o);return Object.getOwnPropertySymbols?a.concat(Object.getOwnPropertySymbols(i)):a},l.prototype.listeners=function(a){var i=t?t+a:a,o=this._events[i];if(!o)return[];if(o.fn)return[o.fn];for(var f=0,v=o.length,b=new Array(v);f<v;f++)b[f]=o[f].fn;return b},l.prototype.listenerCount=function(a){var i=t?t+a:a,o=this._events[i];return o?o.fn?1:o.length:0},l.prototype.emit=function(a,i,o,f,v,b){var E=t?t+a:a;if(!this._events[E])return!1;var d=this._events[E],w=arguments.length,C,y;if(d.fn){switch(d.once&&this.removeListener(a,d.fn,void 0,!0),w){case 1:return d.fn.call(d.context),!0;case 2:return d.fn.call(d.context,i),!0;case 3:return d.fn.call(d.context,i,o),!0;case 4:return d.fn.call(d.context,i,o,f),!0;case 5:return d.fn.call(d.context,i,o,f,v),!0;case 6:return d.fn.call(d.context,i,o,f,v,b),!0}for(y=1,C=new Array(w-1);y<w;y++)C[y-1]=arguments[y];d.fn.apply(d.context,C)}else{var F=d.length,m;for(y=0;y<F;y++)switch(d[y].once&&this.removeListener(a,d[y].fn,void 0,!0),w){case 1:d[y].fn.call(d[y].context);break;case 2:d[y].fn.call(d[y].context,i);break;case 3:d[y].fn.call(d[y].context,i,o);break;case 4:d[y].fn.call(d[y].context,i,o,f);break;default:if(!C)for(m=1,C=new Array(w-1);m<w;m++)C[m-1]=arguments[m];d[y].fn.apply(d[y].context,C)}}return!0},l.prototype.on=function(a,i,o){return p(this,a,i,o,!1)},l.prototype.once=function(a,i,o){return p(this,a,i,o,!0)},l.prototype.removeListener=function(a,i,o,f){var v=t?t+a:a;if(!this._events[v])return this;if(!i)return u(this,v),this;var b=this._events[v];if(b.fn)b.fn===i&&(!f||b.once)&&(!o||b.context===o)&&u(this,v);else{for(var E=0,d=[],w=b.length;E<w;E++)(b[E].fn!==i||f&&!b[E].once||o&&b[E].context!==o)&&d.push(b[E]);d.length?this._events[v]=d.length===1?d[0]:d:u(this,v)}return this},l.prototype.removeAllListeners=function(a){var i;return a?(i=t?t+a:a,this._events[i]&&u(this,i)):(this._events=new s,this._eventsCount=0),this},l.prototype.off=l.prototype.removeListener,l.prototype.addListener=l.prototype.on,l.prefixed=t,l.EventEmitter=l,e.exports=l})(pe);var nt=pe.exports;const st=tt(nt);class ge extends st{on(n,t,s){return super.on(n,t,s)}once(n,t,s){return super.once(n,t,s)}off(n,t,s){return super.off(n,t,s)}emit(n,...t){return super.emit(n,...t)}}class rt{constructor(){g(this,"queue",[]);g(this,"maxSize",100)}enqueue(n,t=3){this.queue.length>=this.maxSize&&this.queue.shift();const s={...n,retryCount:0,maxRetries:t};return this.queue.push(s),n.messageId}dequeue(){return this.queue.shift()}hasMessages(){return this.queue.length>0}getMessageById(n){return this.queue.find(t=>t.messageId===n)}removeMessageById(n){const t=this.queue.findIndex(s=>s.messageId===n);t!==-1&&this.queue.splice(t,1)}clear(){this.queue=[]}}class it{constructor(n,t=!1){this.context=n,this.debug=t}formatMessage(n,...t){return[`[${new Date().toISOString()}] [${this.context}] [${n}]`,...t]}info(...n){console.info(...this.formatMessage("INFO",...n))}debug(...n){this.debug&&console.debug(...this.formatMessage("DEBUG",...n))}warn(...n){console.warn(...this.formatMessage("WARN",...n))}error(...n){console.error(...this.formatMessage("ERROR",...n))}}let at=e=>crypto.getRandomValues(new Uint8Array(e)),ot=(e,n,t)=>{let s=(2<<Math.log2(e.length-1))-1,r=-~(1.6*s*n/e.length);return(p=n)=>{let u="";for(;;){let l=t(r),c=r|0;for(;c--;)if(u+=e[l[c]&s]||"",u.length>=p)return u}}},ct=(e,n=21)=>ot(e,n|0,at);const dt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",ht=ct(dt,12);class ut extends ge{constructor(t,s={}){super();g(this,"connection",null);g(this,"iframe");g(this,"options");g(this,"messageQueue");g(this,"logger");g(this,"isConnected",!1);g(this,"reconnectAttempts",0);g(this,"maxReconnectAttempts",3);this.iframe=t,this.options={timeout:3e4,debug:!1,retryCount:3,retryDelay:1e3,childOrigin:"*",...s},this.messageQueue=new rt,this.logger=new it("PenpalBridge",this.options.debug)}async connect(t={}){try{this.logger.info("正在建立连接...");const s=new Ze({remoteWindow:this.iframe,allowedOrigins:["http://127.0.0.1:3000"]});this.connection=Ge({messenger:s,methods:{add(r,p){return r+p},emitEvent:(r,p)=>{this.emit(r,p)},...t},timeout:this.options.timeout,log:et("parent")}),await this.connection.promise,this.isConnected=!0,this.reconnectAttempts=0,await this.processQueuedMessages(),this.logger.info("连接建立成功"),this.emit("connected")}catch(s){throw this.logger.error("连接失败:",s),await this.handleReconnect(),s}}async send(t,s){var p;const r={action:t,params:s,timestamp:Date.now(),messageId:ht()};if(!this.isConnected)throw this.messageQueue.enqueue(r),new Error("Connection not ready, message queued");try{if(this.logger.debug("发送消息:",r),!((p=this.connection)!=null&&p.child))throw new Error("连接未就绪");const u=await this.connection.child.handleMessage(r);return this.logger.debug("收到响应:",u),this.validateResponse(u)}catch(u){throw this.logger.error("发送消息失败:",u),this.messageQueue.enqueue(r),u}}async processQueuedMessages(){for(;this.messageQueue.hasMessages();){const t=this.messageQueue.dequeue();if(t)try{await this.send(t.action,t.params)}catch(s){this.logger.warn("队列消息发送失败:",s),this.messageQueue.enqueue(t)}}}async handleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){this.logger.error("重连次数达到上限"),this.emit("connection-lost");return}this.reconnectAttempts++,this.logger.info(`尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})`),await new Promise(t=>setTimeout(t,this.options.retryDelay*this.reconnectAttempts));try{await this.connect()}catch{await this.handleReconnect()}}validateResponse(t){if(!t||t.success===void 0)throw new Error("Invalid response format");if(!t.success){const s=t.error||{code:"UNKNOWN",message:"Unknown error"};throw new Error(`${s.code}: ${s.message}`)}return t.data}disconnect(){this.connection&&(this.connection.destroy(),this.isConnected=!1,this.emit("disconnected"),this.logger.info("连接已断开"))}getConnectionStatus(){return this.isConnected}}class lt{constructor(n){this.bridge=n}async initialize(n){return this.bridge.send("canvas.initialize",n)}async setData(n){return this.bridge.send("canvas.setData",n)}async getData(){return this.bridge.send("canvas.getData")}async clear(){return this.bridge.send("canvas.clear")}async undo(){return this.bridge.send("canvas.undo")}async redo(){return this.bridge.send("canvas.redo")}async export(n){return this.bridge.send("canvas.export",{format:n})}async save(){return this.bridge.send("canvas.save")}async invoke(n,...t){return this.bridge.send("canvas.invoke",{method:n,args:t})}async setZoom(n){return this.bridge.send("canvas.setZoom",{zoom:n})}async getSnapshot(){return this.bridge.send("canvas.getSnapshot")}}class ft{constructor(n){this.bridge=n}async setAbilities(n){return this.bridge.send("abilities.set",n)}async getAbilities(){return this.bridge.send("abilities.get")}async enableAbility(n){return this.bridge.send("abilities.enable",{name:n})}async disableAbility(n){return this.bridge.send("abilities.disable",{name:n})}}class vt{constructor(n){this.bridge=n}async setTheme(n){return this.bridge.send("theme.set",{theme:n})}async getCurrentTheme(){return this.bridge.send("theme.get")}async updateToken(n){return this.bridge.send("theme.updateToken",n)}}class pt{constructor(n){this.bridge=n}async setLocale(n,t){return this.bridge.send("i18n.setLocale",{locale:n,messages:t})}async getCurrentLocale(){return this.bridge.send("i18n.getLocale")}async updateMessages(n){return this.bridge.send("i18n.updateMessages",n)}}class gt{constructor(n){this.bridge=n}async validateToken(){return this.bridge.send("auth.validateToken")}}const S={READY:"ready",CHANGE:"change",SAVE:"save",ERROR:"error",SELECTION_CHANGED:"selection-changed",CONNECTED:"connected",DISCONNECTED:"disconnected",LOADED:"loaded",BEFORE_UNLOAD:"before-unload",OBJECT_ADDED:"object-added",OBJECT_MODIFIED:"object-modified",OBJECT_REMOVED:"object-removed",MOUSE_DOWN:"mouse-down",MOUSE_UP:"mouse-up",MOUSE_MOVE:"mouse-move",KEY_DOWN:"key-down",KEY_UP:"key-up"};class ye extends ge{constructor(t,s){super();g(this,"bridge");g(this,"canvasAPI");g(this,"abilityAPI");g(this,"themeAPI");g(this,"i18nAPI");g(this,"authAPI");g(this,"config");g(this,"iframe");g(this,"isInitialized",!1);this.validateConfig(s),this.config=s,this.iframe=t,this.bridge=new ut(t,{debug:s.debug||!1,timeout:3e4,childOrigin:this.extractOrigin(t.src)}),this.canvasAPI=new lt(this.bridge),this.abilityAPI=new ft(this.bridge),this.themeAPI=new vt(this.bridge),this.i18nAPI=new pt(this.bridge),this.authAPI=new gt(this.bridge),this.setupEventHandlers()}async init(){if(!this.isInitialized)try{await this.bridge.connect({getConfig:()=>this.config,log:(t,s)=>{console.log(`[Canvas ${t.toUpperCase()}]`,s)}}),await this.canvasAPI.initialize(this.config),this.config.abilities&&await this.abilityAPI.setAbilities(this.config.abilities),this.config.theme&&await this.themeAPI.setTheme(this.config.theme),this.config.locale&&await this.i18nAPI.setLocale(this.config.locale,this.config.messages),this.isInitialized=!0,this.emit(S.READY)}catch(t){throw this.emit(S.ERROR,t),t}}get canvas(){return{setData:t=>this.canvasAPI.setData(t),getData:()=>this.canvasAPI.getData(),clear:()=>this.canvasAPI.clear(),undo:()=>this.canvasAPI.undo(),redo:()=>this.canvasAPI.redo(),export:(t="png")=>this.canvasAPI.export(t),save:()=>this.canvasAPI.save(),setZoom:t=>this.canvasAPI.setZoom(t),getSnapshot:()=>this.canvasAPI.getSnapshot(),invoke:(t,...s)=>this.canvasAPI.invoke(t,...s)}}get abilities(){return{set:t=>this.abilityAPI.setAbilities(t),get:()=>this.abilityAPI.getAbilities(),enable:t=>this.abilityAPI.enableAbility(t),disable:t=>this.abilityAPI.disableAbility(t),updateConfig:(t,s)=>this.abilityAPI.updateAbilityConfig(t,s)}}get theme(){return{set:t=>this.themeAPI.setTheme(t),get:()=>this.themeAPI.getCurrentTheme(),updateToken:t=>this.themeAPI.updateToken(t),reset:()=>this.themeAPI.resetTheme()}}get i18n(){return{setLocale:(t,s)=>this.i18nAPI.setLocale(t,s),getLocale:()=>this.i18nAPI.getCurrentLocale(),updateMessages:t=>this.i18nAPI.updateMessages(t),getMessages:()=>this.i18nAPI.getMessages(),getTranslation:t=>this.i18nAPI.getTranslation(t)}}get auth(){return{validateToken:()=>this.authAPI.validateToken(),refreshToken:t=>this.authAPI.refreshToken(t),getTokenInfo:()=>this.authAPI.getTokenInfo()}}get utils(){return{getConnectionStatus:()=>this.bridge.getConnectionStatus(),disconnect:()=>this.bridge.disconnect(),reconnect:async()=>{this.bridge.disconnect(),this.isInitialized=!1,await this.init()},isInitialized:()=>this.isInitialized}}setupEventHandlers(){this.bridge.on("canvas-change",t=>{this.emit(S.CHANGE,t)}),this.bridge.on("canvas-save",t=>{this.emit(S.SAVE,t)}),this.bridge.on("canvas-error",t=>{this.emit(S.ERROR,t)}),this.bridge.on("canvas-selection-changed",t=>{this.emit(S.SELECTION_CHANGED,t)}),this.bridge.on("connected",()=>{console.log("链接建立成功"),this.emit(S.CONNECTED)}),this.bridge.on("disconnected",()=>{console.log("链接断开"),this.emit(S.DISCONNECTED)})}validateConfig(t){if(!t.token)throw new Error("Token is required");if(t.abilities){const s=["text","image","barcode","multiLayout","shape","qrCode"];Object.keys(t.abilities).forEach(r=>{s.includes(r)||console.warn(`Unknown ability: ${r}`)})}}extractOrigin(t){try{return new URL(t).origin}catch{return"*"}}}function yt(e,n){return new ye(e,n)}exports.CANVAS_EVENTS=S;exports.NiimbotCanvasSDK=ye;exports.createCanvas=yt;
|