@archilogic/extension-sdk 0.5.1 → 0.6.1

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @archilogic/extension-sdk
2
2
 
3
+ ## 0.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - d3f3417: fix(extension-sdk): ensure all extension methods are defined
8
+
9
+ ## 0.6.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 0cef0d7: feat(extension-sdk): change host.type from array to string
14
+ - a573d42: feat(extension-sdk): switch to proper event system for hostApi
15
+
16
+ ### Patch Changes
17
+
18
+ - bfe43a9: fix: node worker support fixes
19
+
3
20
  ## 0.5.1
4
21
 
5
22
  ### Patch Changes
@@ -1 +1 @@
1
- "use strict";var Re=Object.defineProperty;var se=e=>{throw TypeError(e)};var Ne=(e,t,r)=>t in e?Re(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var y=(e,t,r)=>Ne(e,typeof t!="symbol"?t+"":t,r),ae=(e,t,r)=>t.has(e)||se("Cannot "+r);var s=(e,t,r)=>(ae(e,t,"read from private field"),r?r.call(e):t.get(e)),d=(e,t,r)=>t.has(e)?se("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),M=(e,t,r,n)=>(ae(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var _e=class extends Error{constructor(t,r){super(r);y(this,"code");this.name="PenpalError",this.code=t}},w=_e,ke=e=>({name:e.name,message:e.message,stack:e.stack,penpalCode:e instanceof w?e.code:void 0}),Le=({name:e,message:t,stack:r,penpalCode:n})=>{const a=n?new w(n,t):new Error(t);return a.name=e,a.stack=r,a},Te=Symbol("Reply"),te,le,be=(le=class{constructor(e,t){y(this,"value");y(this,"transferables");d(this,te,Te);this.value=e,this.transferables=t==null?void 0:t.transferables}},te=new WeakMap,le),De=be,I="penpal",X=e=>typeof e=="object"&&e!==null,ve=e=>typeof e=="function",He=e=>X(e)&&e.namespace===I,H=e=>e.type==="SYN",q=e=>e.type==="ACK1",$=e=>e.type==="ACK2",ye=e=>e.type==="CALL",Me=e=>e.type==="REPLY",Oe=e=>e.type==="DESTROY",we=(e,t=[])=>{const r=[];for(const n of Object.keys(e)){const a=e[n];ve(a)?r.push([...t,n]):X(a)&&r.push(...we(a,[...t,n]))}return r},xe=(e,t)=>{const r=e.reduce((n,a)=>X(n)?n[a]:void 0,t);return ve(r)?r:void 0},N=e=>e.join("."),ie=(e,t,r)=>({namespace:I,channel:e,type:"REPLY",callId:t,isError:!0,...r instanceof Error?{value:ke(r),isSerializedErrorInstance:!0}:{value:r}}),ge=(e,t,r,n)=>{let a=!1;const h=async l=>{if(a||!ye(l))return;n==null||n(`Received ${N(l.methodPath)}() call`,l);const{methodPath:p,args:u,id:o}=l;let i,A;try{const f=xe(p,t);if(!f)throw new w("METHOD_NOT_FOUND",`Method \`${N(p)}\` is not found.`);let v=await f(...u);v instanceof De&&(A=v.transferables,v=await v.value),i={namespace:I,channel:r,type:"REPLY",callId:o,value:v}}catch(f){i=ie(r,o,f)}if(!a)try{n==null||n(`Sending ${N(p)}() reply`,i),e.sendMessage(i,A)}catch(f){throw f.name==="DataCloneError"&&(i=ie(r,o,f),n==null||n(`Sending ${N(p)}() reply`,i),e.sendMessage(i)),f}};return e.addMessageHandler(h),()=>{a=!0,e.removeMessageHandler(h)}},Fe=ge,he,Ee=((he=crypto.randomUUID)==null?void 0:he.bind(crypto))??(()=>new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")),We=Symbol("CallOptions"),re,ue,Ye=(ue=class{constructor(e){y(this,"transferables");y(this,"timeout");d(this,re,We);this.transferables=e==null?void 0:e.transferables,this.timeout=e==null?void 0:e.timeout}},re=new WeakMap,ue),$e=Ye,je=new Set(["apply","call","bind"]),Pe=(e,t,r=[])=>new Proxy(r.length?()=>{}:Object.create(null),{get(n,a){if(a!=="then")return r.length&&je.has(a)?Reflect.get(n,a):Pe(e,t,[...r,a])},apply(n,a,h){return e(r,h)}}),oe=e=>new w("CONNECTION_DESTROYED",`Method call ${N(e)}() failed due to destroyed connection`),Ue=(e,t,r)=>{let n=!1;const a=new Map,h=u=>{if(!Me(u))return;const{callId:o,value:i,isError:A,isSerializedErrorInstance:f}=u,v=a.get(o);v&&(a.delete(o),r==null||r(`Received ${N(v.methodPath)}() call`,u),A?v.reject(f?Le(i):i):v.resolve(i))};return e.addMessageHandler(h),{remoteProxy:Pe((u,o)=>{if(n)throw oe(u);const i=Ee(),A=o[o.length-1],f=A instanceof $e,{timeout:v,transferables:Q}=f?A:{},z=f?o.slice(0,-1):o;return new Promise((G,Y)=>{const Z=v!==void 0?window.setTimeout(()=>{a.delete(i),Y(new w("METHOD_CALL_TIMEOUT",`Method call ${N(u)}() timed out after ${v}ms`))},v):void 0;a.set(i,{methodPath:u,resolve:G,reject:Y,timeoutId:Z});try{const D={namespace:I,channel:t,type:"CALL",id:i,methodPath:u,args:z};r==null||r(`Sending ${N(u)}() call`,D),e.sendMessage(D,Q)}catch(D){Y(new w("TRANSMISSION_FAILED",D.message))}})},r),destroy:()=>{n=!0,e.removeMessageHandler(h);for(const{methodPath:u,reject:o,timeoutId:i}of a.values())clearTimeout(i),o(oe(u));a.clear()}}},Ve=Ue,Ke=()=>{let e,t;return{promise:new Promise((n,a)=>{e=n,t=a}),resolve:e,reject:t}},ze=Ke,Ge=class extends Error{constructor(e){super(`You've hit a bug in Penpal. Please file an issue with the following information: ${e}`)}},O=Ge,ee="deprecated-penpal",Be=e=>X(e)&&"penpal"in e,Je=e=>e.split("."),de=e=>e.join("."),Ie=e=>new O(`Unexpected message to translate: ${JSON.stringify(e)}`),Xe=e=>{if(e.penpal==="syn")return{namespace:I,channel:void 0,type:"SYN",participantId:ee};if(e.penpal==="ack")return{namespace:I,channel:void 0,type:"ACK2"};if(e.penpal==="call")return{namespace:I,channel:void 0,type:"CALL",id:e.id,methodPath:Je(e.methodName),args:e.args};if(e.penpal==="reply")return e.resolution==="fulfilled"?{namespace:I,channel:void 0,type:"REPLY",callId:e.id,value:e.returnValue}:{namespace:I,channel:void 0,type:"REPLY",callId:e.id,isError:!0,...e.returnValueIsError?{value:e.returnValue,isSerializedErrorInstance:!0}:{value:e.returnValue}};throw Ie(e)},qe=e=>{if(q(e))return{penpal:"synAck",methodNames:e.methodPaths.map(de)};if(ye(e))return{penpal:"call",id:e.id,methodName:de(e.methodPath),args:e.args};if(Me(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 Ie(e)},Qe=({messenger:e,methods:t,timeout:r,channel:n,log:a})=>{const h=Ee();let l;const p=[];let u=!1;const o=we(t),{promise:i,resolve:A,reject:f}=ze(),v=r!==void 0?setTimeout(()=>{f(new w("CONNECTION_TIMEOUT",`Connection timed out after ${r}ms`))},r):void 0,Q=()=>{for(const c of p)c()},z=()=>{if(u)return;p.push(Fe(e,t,n,a));const{remoteProxy:c,destroy:_}=Ve(e,n,a);p.push(_),clearTimeout(v),u=!0,A({remoteProxy:c,destroy:Q})},G=()=>{const c={namespace:I,type:"SYN",channel:n,participantId:h};a==null||a("Sending handshake SYN",c);try{e.sendMessage(c)}catch(_){f(new w("TRANSMISSION_FAILED",_.message))}},Y=c=>{if(a==null||a("Received handshake SYN",c),c.participantId===l&&l!==ee||(l=c.participantId,G(),!(h>l||l===ee)))return;const B={namespace:I,channel:n,type:"ACK1",methodPaths:o};a==null||a("Sending handshake ACK1",B);try{e.sendMessage(B)}catch(me){f(new w("TRANSMISSION_FAILED",me.message));return}},Z=c=>{a==null||a("Received handshake ACK1",c);const _={namespace:I,channel:n,type:"ACK2"};a==null||a("Sending handshake ACK2",_);try{e.sendMessage(_)}catch(B){f(new w("TRANSMISSION_FAILED",B.message));return}z()},D=c=>{a==null||a("Received handshake ACK2",c),z()},ne=c=>{H(c)&&Y(c),q(c)&&Z(c),$(c)&&D(c)};return e.addMessageHandler(ne),p.push(()=>e.removeMessageHandler(ne)),G(),i},Ze=Qe,et=e=>{let t=!1,r;return(...n)=>(t||(t=!0,r=e(...n)),r)},tt=et,ce=new WeakSet,rt=({messenger:e,methods:t={},timeout:r,channel:n,log:a})=>{if(!e)throw new w("INVALID_ARGUMENT","messenger must be defined");if(ce.has(e))throw new w("INVALID_ARGUMENT","A messenger can only be used for a single connection");ce.add(e);const h=[e.destroy],l=tt(o=>{if(o){const i={namespace:I,channel:n,type:"DESTROY"};try{e.sendMessage(i)}catch{}}for(const i of h)i();a==null||a("Connection destroyed")}),p=o=>He(o)&&o.channel===n;return{promise:(async()=>{try{e.initialize({log:a,validateReceivedMessage:p}),e.addMessageHandler(A=>{Oe(A)&&l(!1)});const{remoteProxy:o,destroy:i}=await Ze({messenger:e,methods:t,timeout:r,channel:n,log:a});return h.push(i),o}catch(o){throw l(!0),o}})(),destroy:()=>{l(!0)}}},Ae=rt,C,k,x,g,L,S,E,T,J,F,j,U,W,fe,nt=(fe=class{constructor({remoteWindow:e,allowedOrigins:t}){d(this,C);d(this,k);d(this,x);d(this,g);d(this,L);d(this,S,new Set);d(this,E);d(this,T,!1);y(this,"initialize",({log:e,validateReceivedMessage:t})=>{M(this,x,e),M(this,g,t),window.addEventListener("message",s(this,U))});y(this,"sendMessage",(e,t)=>{if(H(e)){const r=s(this,F).call(this,e);s(this,C).postMessage(e,{targetOrigin:r,transfer:t});return}if(q(e)||s(this,T)){const r=s(this,T)?qe(e):e,n=s(this,F).call(this,e);s(this,C).postMessage(r,{targetOrigin:n,transfer:t});return}if($(e)){const{port1:r,port2:n}=new MessageChannel;M(this,E,r),r.addEventListener("message",s(this,W)),r.start();const a=[n,...t||[]],h=s(this,F).call(this,e);s(this,C).postMessage(e,{targetOrigin:h,transfer:a});return}if(s(this,E)){s(this,E).postMessage(e,{transfer:t});return}throw new O("Port is undefined")});y(this,"addMessageHandler",e=>{s(this,S).add(e)});y(this,"removeMessageHandler",e=>{s(this,S).delete(e)});y(this,"destroy",()=>{window.removeEventListener("message",s(this,U)),s(this,j).call(this),s(this,S).clear()});d(this,J,e=>s(this,k).some(t=>t instanceof RegExp?t.test(e):t===e||t==="*"));d(this,F,e=>{if(H(e))return"*";if(!s(this,L))throw new O("Concrete remote origin not set");return s(this,L)==="null"&&s(this,k).includes("*")?"*":s(this,L)});d(this,j,()=>{var e,t;(e=s(this,E))==null||e.removeEventListener("message",s(this,W)),(t=s(this,E))==null||t.close(),M(this,E,void 0)});d(this,U,({source:e,origin:t,ports:r,data:n})=>{var a,h,l;if(e===s(this,C)&&(Be(n)&&((a=s(this,x))==null||a.call(this,"Please upgrade the child window to the latest version of Penpal."),M(this,T,!0),n=Xe(n)),!!((h=s(this,g))!=null&&h.call(this,n)))){if(!s(this,J).call(this,t)){(l=s(this,x))==null||l.call(this,`Received a message from origin \`${t}\` which did not match allowed origins \`[${s(this,k).join(", ")}]\``);return}if(H(n)&&(s(this,j).call(this),M(this,L,t)),$(n)&&!s(this,T)){if(M(this,E,r[0]),!s(this,E))throw new O("No port received on ACK2");s(this,E).addEventListener("message",s(this,W)),s(this,E).start()}for(const p of s(this,S))p(n)}});d(this,W,({data:e})=>{var t;if((t=s(this,g))!=null&&t.call(this,e))for(const r of s(this,S))r(e)});if(!e)throw new w("INVALID_ARGUMENT","remoteWindow must be defined");M(this,C,e),M(this,k,t!=null&&t.length?t:[window.origin])}},C=new WeakMap,k=new WeakMap,x=new WeakMap,g=new WeakMap,L=new WeakMap,S=new WeakMap,E=new WeakMap,T=new WeakMap,J=new WeakMap,F=new WeakMap,j=new WeakMap,U=new WeakMap,W=new WeakMap,fe),Ce=nt,m,V,b,P,K,R,pe,st=(pe=class{constructor({worker:e}){d(this,m);d(this,V);d(this,b,new Set);d(this,P);y(this,"initialize",({validateReceivedMessage:e})=>{M(this,V,e),s(this,m).addEventListener("message",s(this,R))});y(this,"sendMessage",(e,t)=>{if(H(e)||q(e)){s(this,m).postMessage(e,{transfer:t});return}if($(e)){const{port1:r,port2:n}=new MessageChannel;M(this,P,r),r.addEventListener("message",s(this,R)),r.start(),s(this,m).postMessage(e,{transfer:[n,...t||[]]});return}if(s(this,P)){s(this,P).postMessage(e,{transfer:t});return}throw new O("Port is undefined")});y(this,"addMessageHandler",e=>{s(this,b).add(e)});y(this,"removeMessageHandler",e=>{s(this,b).delete(e)});y(this,"destroy",()=>{s(this,m).removeEventListener("message",s(this,R)),s(this,K).call(this),s(this,b).clear()});d(this,K,()=>{var e,t;(e=s(this,P))==null||e.removeEventListener("message",s(this,R)),(t=s(this,P))==null||t.close(),M(this,P,void 0)});d(this,R,({ports:e,data:t})=>{var r;if((r=s(this,V))!=null&&r.call(this,t)){if(H(t)&&s(this,K).call(this),$(t)){if(M(this,P,e[0]),!s(this,P))throw new O("No port received on ACK2");s(this,P).addEventListener("message",s(this,R)),s(this,P).start()}for(const n of s(this,b))n(t)}});if(!e)throw new w("INVALID_ARGUMENT","worker must be defined");M(this,m,e)}},m=new WeakMap,V=new WeakMap,b=new WeakMap,P=new WeakMap,K=new WeakMap,R=new WeakMap,pe),Se=st;const at=(e,{iframe:t,worker:r})=>{let n;if(t)n=new Ce({remoteWindow:t.contentWindow,allowedOrigins:[/^http:\/\/localhost(:\d+)/,"https://extensions.archilogic.io","https://testing-extensions.archilogic.io"]});else if(r)n=new Se({worker:r});else throw Error("No iframe or worker to connect to");return Ae({messenger:n,methods:e})},it={onConnect:()=>{},onDestroy:()=>{},onLayoutChange:()=>{},onSelectionChange:()=>{},onGraphicDrag:()=>{},onCanvasClick:()=>{}},ot=(e={},t)=>{let r;t!=null&&t.useWorker?r=new Se({worker:self}):r=new Ce({remoteWindow:window.parent,allowedOrigins:[/^http:\/\/localhost(:\d+)/,/^https:\/\/(.*)app.archilogic.com/,/^https:\/\/(.*).archilogic-frontend.com/]});const n=Ae({messenger:r,methods:{...it,...e}});return new Proxy({},{get(h,l){return async(...p)=>(await n.promise)[l](...p)}})};exports.createExtensionConnection=at;exports.createHostConnection=ot;
1
+ "use strict";var We=Object.defineProperty;var fe=e=>{throw TypeError(e)};var Fe=(e,t,r)=>t in e?We(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var h=(e,t,r)=>Fe(e,typeof t!="symbol"?t+"":t,r),ve=(e,t,r)=>t.has(e)||fe("Cannot "+r);var n=(e,t,r)=>(ve(e,t,"read from private field"),r?r.call(e):t.get(e)),o=(e,t,r)=>t.has(e)?fe("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),p=(e,t,r,s)=>(ve(e,t,"write to private field"),s?s.call(e,r):t.set(e,r),r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var Ue=class extends Error{constructor(t,r){super(r);h(this,"code");this.name="PenpalError",this.code=t}},w=Ue,Ve=e=>({name:e.name,message:e.message,stack:e.stack,penpalCode:e instanceof w?e.code:void 0}),Ye=({name:e,message:t,stack:r,penpalCode:s})=>{const a=s?new w(s,t):new Error(t);return a.name=e,a.stack=r,a},$e=Symbol("Reply"),le,me,je=(me=class{constructor(e,t){h(this,"value");h(this,"transferables");o(this,le,$e);this.value=e,this.transferables=t==null?void 0:t.transferables}},le=new WeakMap,me),ze=je,P="penpal",ae=e=>typeof e=="object"&&e!==null,Ne=e=>typeof e=="function",Ke=e=>ae(e)&&e.namespace===P,W=e=>e.type==="SYN",ie=e=>e.type==="ACK1",z=e=>e.type==="ACK2",Re=e=>e.type==="CALL",_e=e=>e.type==="REPLY",Ge=e=>e.type==="DESTROY",ke=(e,t=[])=>{const r=[];for(const s of Object.keys(e)){const a=e[s];Ne(a)?r.push([...t,s]):ae(a)&&r.push(...ke(a,[...t,s]))}return r},qe=(e,t)=>{const r=e.reduce((s,a)=>ae(s)?s[a]:void 0,t);return Ne(r)?r:void 0},R=e=>e.join("."),pe=(e,t,r)=>({namespace:P,channel:e,type:"REPLY",callId:t,isError:!0,...r instanceof Error?{value:Ve(r),isSerializedErrorInstance:!0}:{value:r}}),Be=(e,t,r,s)=>{let a=!1;const i=async u=>{if(a||!Re(u))return;s==null||s(`Received ${R(u.methodPath)}() call`,u);const{methodPath:d,args:f,id:c}=u;let l,A;try{const M=qe(d,t);if(!M)throw new w("METHOD_NOT_FOUND",`Method \`${R(d)}\` is not found.`);let y=await M(...f);y instanceof ze&&(A=y.transferables,y=await y.value),l={namespace:P,channel:r,type:"REPLY",callId:c,value:y}}catch(M){l=pe(r,c,M)}if(!a)try{s==null||s(`Sending ${R(d)}() reply`,l),e.sendMessage(l,A)}catch(M){throw M.name==="DataCloneError"&&(l=pe(r,c,M),s==null||s(`Sending ${R(d)}() reply`,l),e.sendMessage(l)),M}};return e.addMessageHandler(i),()=>{a=!0,e.removeMessageHandler(i)}},Je=Be,Pe,Le=((Pe=crypto.randomUUID)==null?void 0:Pe.bind(crypto))??(()=>new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")),Xe=Symbol("CallOptions"),he,Ae,Qe=(Ae=class{constructor(e){h(this,"transferables");h(this,"timeout");o(this,he,Xe);this.transferables=e==null?void 0:e.transferables,this.timeout=e==null?void 0:e.timeout}},he=new WeakMap,Ae),Ze=Qe,et=new Set(["apply","call","bind"]),Te=(e,t,r=[])=>new Proxy(r.length?()=>{}:Object.create(null),{get(s,a){if(a!=="then")return r.length&&et.has(a)?Reflect.get(s,a):Te(e,t,[...r,a])},apply(s,a,i){return e(r,i)}}),Me=e=>new w("CONNECTION_DESTROYED",`Method call ${R(e)}() failed due to destroyed connection`),tt=(e,t,r)=>{let s=!1;const a=new Map,i=f=>{if(!_e(f))return;const{callId:c,value:l,isError:A,isSerializedErrorInstance:M}=f,y=a.get(c);y&&(a.delete(c),r==null||r(`Received ${R(y.methodPath)}() call`,f),A?y.reject(M?Ye(l):l):y.resolve(l))};return e.addMessageHandler(i),{remoteProxy:Te((f,c)=>{if(s)throw Me(f);const l=Le(),A=c[c.length-1],M=A instanceof Ze,{timeout:y,transferables:oe}=M?A:{},ee=M?c.slice(0,-1):c;return new Promise((te,j)=>{const de=y!==void 0?window.setTimeout(()=>{a.delete(l),j(new w("METHOD_CALL_TIMEOUT",`Method call ${R(f)}() timed out after ${y}ms`))},y):void 0;a.set(l,{methodPath:f,resolve:te,reject:j,timeoutId:de});try{const O={namespace:P,channel:t,type:"CALL",id:l,methodPath:f,args:ee};r==null||r(`Sending ${R(f)}() call`,O),e.sendMessage(O,oe)}catch(O){j(new w("TRANSMISSION_FAILED",O.message))}})},r),destroy:()=>{s=!0,e.removeMessageHandler(i);for(const{methodPath:f,reject:c,timeoutId:l}of a.values())clearTimeout(l),c(Me(f));a.clear()}}},rt=tt,nt=()=>{let e,t;return{promise:new Promise((s,a)=>{e=s,t=a}),resolve:e,reject:t}},st=nt,at=class extends Error{constructor(e){super(`You've hit a bug in Penpal. Please file an issue with the following information: ${e}`)}},F=at,ce="deprecated-penpal",it=e=>ae(e)&&"penpal"in e,ot=e=>e.split("."),ye=e=>e.join("."),be=e=>new F(`Unexpected message to translate: ${JSON.stringify(e)}`),dt=e=>{if(e.penpal==="syn")return{namespace:P,channel:void 0,type:"SYN",participantId:ce};if(e.penpal==="ack")return{namespace:P,channel:void 0,type:"ACK2"};if(e.penpal==="call")return{namespace:P,channel:void 0,type:"CALL",id:e.id,methodPath:ot(e.methodName),args:e.args};if(e.penpal==="reply")return e.resolution==="fulfilled"?{namespace:P,channel:void 0,type:"REPLY",callId:e.id,value:e.returnValue}:{namespace:P,channel:void 0,type:"REPLY",callId:e.id,isError:!0,...e.returnValueIsError?{value:e.returnValue,isSerializedErrorInstance:!0}:{value:e.returnValue}};throw be(e)},ct=e=>{if(ie(e))return{penpal:"synAck",methodNames:e.methodPaths.map(ye)};if(Re(e))return{penpal:"call",id:e.id,methodName:ye(e.methodPath),args:e.args};if(_e(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 be(e)},lt=({messenger:e,methods:t,timeout:r,channel:s,log:a})=>{const i=Le();let u;const d=[];let f=!1;const c=ke(t),{promise:l,resolve:A,reject:M}=st(),y=r!==void 0?setTimeout(()=>{M(new w("CONNECTION_TIMEOUT",`Connection timed out after ${r}ms`))},r):void 0,oe=()=>{for(const v of d)v()},ee=()=>{if(f)return;d.push(Je(e,t,s,a));const{remoteProxy:v,destroy:_}=rt(e,s,a);d.push(_),clearTimeout(y),f=!0,A({remoteProxy:v,destroy:oe})},te=()=>{const v={namespace:P,type:"SYN",channel:s,participantId:i};a==null||a("Sending handshake SYN",v);try{e.sendMessage(v)}catch(_){M(new w("TRANSMISSION_FAILED",_.message))}},j=v=>{if(a==null||a("Received handshake SYN",v),v.participantId===u&&u!==ce||(u=v.participantId,te(),!(i>u||u===ce)))return;const re={namespace:P,channel:s,type:"ACK1",methodPaths:c};a==null||a("Sending handshake ACK1",re);try{e.sendMessage(re)}catch(Oe){M(new w("TRANSMISSION_FAILED",Oe.message));return}},de=v=>{a==null||a("Received handshake ACK1",v);const _={namespace:P,channel:s,type:"ACK2"};a==null||a("Sending handshake ACK2",_);try{e.sendMessage(_)}catch(re){M(new w("TRANSMISSION_FAILED",re.message));return}ee()},O=v=>{a==null||a("Received handshake ACK2",v),ee()},ue=v=>{W(v)&&j(v),ie(v)&&de(v),z(v)&&O(v)};return e.addMessageHandler(ue),d.push(()=>e.removeMessageHandler(ue)),te(),l},ht=lt,ut=e=>{let t=!1,r;return(...s)=>(t||(t=!0,r=e(...s)),r)},ft=ut,we=new WeakSet,vt=({messenger:e,methods:t={},timeout:r,channel:s,log:a})=>{if(!e)throw new w("INVALID_ARGUMENT","messenger must be defined");if(we.has(e))throw new w("INVALID_ARGUMENT","A messenger can only be used for a single connection");we.add(e);const i=[e.destroy],u=ft(c=>{if(c){const l={namespace:P,channel:s,type:"DESTROY"};try{e.sendMessage(l)}catch{}}for(const l of i)l();a==null||a("Connection destroyed")}),d=c=>Ke(c)&&c.channel===s;return{promise:(async()=>{try{e.initialize({log:a,validateReceivedMessage:d}),e.addMessageHandler(A=>{Ge(A)&&u(!1)});const{remoteProxy:c,destroy:l}=await ht({messenger:e,methods:t,timeout:r,channel:s,log:a});return i.push(l),c}catch(c){throw u(!0),c}})(),destroy:()=>{u(!0)}}},De=vt,g,k,U,V,L,C,E,T,se,Y,K,G,$,Ie,pt=(Ie=class{constructor({remoteWindow:e,allowedOrigins:t}){o(this,g);o(this,k);o(this,U);o(this,V);o(this,L);o(this,C,new Set);o(this,E);o(this,T,!1);h(this,"initialize",({log:e,validateReceivedMessage:t})=>{p(this,U,e),p(this,V,t),window.addEventListener("message",n(this,G))});h(this,"sendMessage",(e,t)=>{if(W(e)){const r=n(this,Y).call(this,e);n(this,g).postMessage(e,{targetOrigin:r,transfer:t});return}if(ie(e)||n(this,T)){const r=n(this,T)?ct(e):e,s=n(this,Y).call(this,e);n(this,g).postMessage(r,{targetOrigin:s,transfer:t});return}if(z(e)){const{port1:r,port2:s}=new MessageChannel;p(this,E,r),r.addEventListener("message",n(this,$)),r.start();const a=[s,...t||[]],i=n(this,Y).call(this,e);n(this,g).postMessage(e,{targetOrigin:i,transfer:a});return}if(n(this,E)){n(this,E).postMessage(e,{transfer:t});return}throw new F("Port is undefined")});h(this,"addMessageHandler",e=>{n(this,C).add(e)});h(this,"removeMessageHandler",e=>{n(this,C).delete(e)});h(this,"destroy",()=>{window.removeEventListener("message",n(this,G)),n(this,K).call(this),n(this,C).clear()});o(this,se,e=>n(this,k).some(t=>t instanceof RegExp?t.test(e):t===e||t==="*"));o(this,Y,e=>{if(W(e))return"*";if(!n(this,L))throw new F("Concrete remote origin not set");return n(this,L)==="null"&&n(this,k).includes("*")?"*":n(this,L)});o(this,K,()=>{var e,t;(e=n(this,E))==null||e.removeEventListener("message",n(this,$)),(t=n(this,E))==null||t.close(),p(this,E,void 0)});o(this,G,({source:e,origin:t,ports:r,data:s})=>{var a,i,u;if(e===n(this,g)&&(it(s)&&((a=n(this,U))==null||a.call(this,"Please upgrade the child window to the latest version of Penpal."),p(this,T,!0),s=dt(s)),!!((i=n(this,V))!=null&&i.call(this,s)))){if(!n(this,se).call(this,t)){(u=n(this,U))==null||u.call(this,`Received a message from origin \`${t}\` which did not match allowed origins \`[${n(this,k).join(", ")}]\``);return}if(W(s)&&(n(this,K).call(this),p(this,L,t)),z(s)&&!n(this,T)){if(p(this,E,r[0]),!n(this,E))throw new F("No port received on ACK2");n(this,E).addEventListener("message",n(this,$)),n(this,E).start()}for(const d of n(this,C))d(s)}});o(this,$,({data:e})=>{var t;if((t=n(this,V))!=null&&t.call(this,e))for(const r of n(this,C))r(e)});if(!e)throw new w("INVALID_ARGUMENT","remoteWindow must be defined");p(this,g,e),p(this,k,t!=null&&t.length?t:[window.origin])}},g=new WeakMap,k=new WeakMap,U=new WeakMap,V=new WeakMap,L=new WeakMap,C=new WeakMap,E=new WeakMap,T=new WeakMap,se=new WeakMap,Y=new WeakMap,K=new WeakMap,G=new WeakMap,$=new WeakMap,Ie),He=pt,S,q,b,m,B,N,ge,Mt=(ge=class{constructor({worker:e}){o(this,S);o(this,q);o(this,b,new Set);o(this,m);h(this,"initialize",({validateReceivedMessage:e})=>{p(this,q,e),n(this,S).addEventListener("message",n(this,N))});h(this,"sendMessage",(e,t)=>{if(W(e)||ie(e)){n(this,S).postMessage(e,{transfer:t});return}if(z(e)){const{port1:r,port2:s}=new MessageChannel;p(this,m,r),r.addEventListener("message",n(this,N)),r.start(),n(this,S).postMessage(e,{transfer:[s,...t||[]]});return}if(n(this,m)){n(this,m).postMessage(e,{transfer:t});return}throw new F("Port is undefined")});h(this,"addMessageHandler",e=>{n(this,b).add(e)});h(this,"removeMessageHandler",e=>{n(this,b).delete(e)});h(this,"destroy",()=>{n(this,S).removeEventListener("message",n(this,N)),n(this,B).call(this),n(this,b).clear()});o(this,B,()=>{var e,t;(e=n(this,m))==null||e.removeEventListener("message",n(this,N)),(t=n(this,m))==null||t.close(),p(this,m,void 0)});o(this,N,({ports:e,data:t})=>{var r;if((r=n(this,q))!=null&&r.call(this,t)){if(W(t)&&n(this,B).call(this),z(t)){if(p(this,m,e[0]),!n(this,m))throw new F("No port received on ACK2");n(this,m).addEventListener("message",n(this,N)),n(this,m).start()}for(const s of n(this,b))s(t)}});if(!e)throw new w("INVALID_ARGUMENT","worker must be defined");p(this,S,e)}},S=new WeakMap,q=new WeakMap,b=new WeakMap,m=new WeakMap,B=new WeakMap,N=new WeakMap,ge),xe=Mt,D,J,H,X,Ce,yt=(Ce=class{constructor({worker:e}){o(this,D);o(this,J);o(this,H,new Set);h(this,"initialize",({validateReceivedMessage:e})=>{p(this,J,e),n(this,D).addListener("message",n(this,X))});h(this,"sendMessage",(e,t)=>{n(this,D).postMessage(e,t)});h(this,"addMessageHandler",e=>{n(this,H).add(e)});h(this,"removeMessageHandler",e=>{n(this,H).delete(e)});h(this,"destroy",()=>{n(this,D).removeListener("message",n(this,X)),n(this,H).clear()});o(this,X,e=>{var t;if((t=n(this,J))!=null&&t.call(this,e))for(const r of n(this,H))r(e)});if(!e)throw new w("INVALID_ARGUMENT","worker must be defined");p(this,D,e)}},D=new WeakMap,J=new WeakMap,H=new WeakMap,X=new WeakMap,Ce),wt=yt,I,Q,x,Z,Se,Et=(Se=class{constructor({port:e}){o(this,I);o(this,Q);o(this,x,new Set);h(this,"initialize",({validateReceivedMessage:e})=>{p(this,Q,e),n(this,I).addEventListener("message",n(this,Z)),n(this,I).start()});h(this,"sendMessage",(e,t)=>{var r;(r=n(this,I))==null||r.postMessage(e,{transfer:t})});h(this,"addMessageHandler",e=>{n(this,x).add(e)});h(this,"removeMessageHandler",e=>{n(this,x).delete(e)});h(this,"destroy",()=>{n(this,I).removeEventListener("message",n(this,Z)),n(this,I).close(),n(this,x).clear()});o(this,Z,({data:e})=>{var t;if((t=n(this,Q))!=null&&t.call(this,e))for(const r of n(this,x))r(e)});if(!e)throw new w("INVALID_ARGUMENT","port must be defined");p(this,I,e)}},I=new WeakMap,Q=new WeakMap,x=new WeakMap,Z=new WeakMap,Se),mt=Et;const Pt=(e,{iframe:t,worker:r,webWorker:s})=>{let a;if(t)a=new He({remoteWindow:t.contentWindow,allowedOrigins:[/^http:\/\/localhost(:\d+)/,"https://extensions.archilogic.io","https://testing-extensions.archilogic.io"]});else if(r)a=new wt({worker:r});else if(s)a=new xe({worker:s});else throw new Error("No iframe or worker to connect to");return De({messenger:a,methods:e})};var ne={exports:{}},Ee;function At(){if(Ee)return ne.exports;Ee=1;function e(){}return e.prototype={on:function(t,r,s){var a=this.e||(this.e={});return(a[t]||(a[t]=[])).push({fn:r,ctx:s}),this},once:function(t,r,s){var a=this;function i(){a.off(t,i),r.apply(s,arguments)}return i._=r,this.on(t,i,s)},emit:function(t){var r=[].slice.call(arguments,1),s=((this.e||(this.e={}))[t]||[]).slice(),a=0,i=s.length;for(a;a<i;a++)s[a].fn.apply(s[a].ctx,r);return this},off:function(t,r){var s=this.e||(this.e={}),a=s[t],i=[];if(a&&r)for(var u=0,d=a.length;u<d;u++)a[u].fn!==r&&a[u].fn._!==r&&i.push(a[u]);return i.length?s[t]=i:delete s[t],this}},ne.exports=e,ne.exports.TinyEmitter=e,ne.exports}var It=At();const gt=(e={},t)=>{let r;const s=new It.TinyEmitter;if((t==null?void 0:t.useWorker)==="node"){const d=require("node:worker_threads").parentPort;if(!d)throw new Error("No parent port found for worker thread");r=new mt({port:d})}else(t==null?void 0:t.useWorker)==="web"?r=new xe({worker:self}):r=new He({remoteWindow:window.parent,allowedOrigins:[/^http:\/\/localhost(:\d+)/,/^https:\/\/(.*)app.archilogic.com/,/^https:\/\/(.*).archilogic-frontend.com/]});const a={onConnect:()=>{},onDestroy:()=>{},...e,onLayoutChange:d=>{s.emit("layout-change",d)},onSelectionChange:d=>{s.emit("selection-change",d)},onGraphicDrag:d=>{s.emit("graphic-crag",d)},onCanvasClick:d=>{s.emit("canvas-click",d)}},i=De({messenger:r,methods:a});return new Proxy({},{get(d,f){return f==="on"?s.on.bind(s):f==="once"?s.once.bind(s):f==="off"?s.off.bind(s):async(...c)=>(await i.promise)[f](...c)}})};exports.createExtensionConnection=Pt;exports.createHostConnection=gt;