comlink-adapters
Version:
Implementation of comlink adapters for different application platforms
2 lines (1 loc) • 8.24 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("comlink"),h="__COMLINK_MESSAGE_CHANNEL__",g="__COMLINK_MESSAGE_PORT_MARKER__",d="message",E="Only message event is supported",u="__PROXY_MESSAGE_CHANNEL_MARKER__",_=e=>typeof e=="object"&&e!==null||typeof e=="function",N=()=>new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-"),A=(e,t)=>!t.length||!e?e:(e==null?void 0:e.value)===g?(e.value=t[0],e):typeof e=="object"?JSON.parse(JSON.stringify(e),(n,r)=>r&&r===g?t[0]:r):e,M=new Map,H=e=>({canHandle:n=>_(n)&&n[c.proxyMarker],serialize(n){if(e){const{port1:s,port2:o}=new e;return c.expose(n,x(s,e)),[g,[o]]}const{port1:r,port2:a}=new MessageChannel;return c.expose(n,r),[g,[a]]},deserialize(n){n.start();const r=n instanceof MessagePort?n:x(n,e);return c.wrap(r)}}),b=e=>({canHandle:n=>!!(n&&typeof n=="object"&&Reflect.get(n,"start")&&Reflect.get(n,"postMessage")),serialize(n){if(e){const{port1:r,port2:a}=new e;return I(n,r),[g,[a]]}return[g,[n]]},deserialize(n){return n.start(),n}}),P=e=>{M.has("proxy")||M.set("proxy",H(e)),M.has("messagePort")||M.set("messagePort",b(e)),c.transferHandlers.set("messagePort",M.get("messagePort")),c.transferHandlers.set("proxy",M.get("proxy"))},I=(e,t)=>{e.addEventListener("message",n=>{t.postMessage(n.data,[])}),e.addEventListener("close",()=>{t.close()}),t.addListener("message",n=>{e.postMessage(n.data,[])}),t.addListener("close",()=>{e.close()}),e.start(),t.start()};function x(e,t){P(t);const n=new WeakMap;return{start:()=>e.start(),postMessage:(r,a)=>{e.postMessage(r,a||[])},addEventListener:(r,a)=>{if(r!==d)throw new Error(E);const s=o=>{const i=A(o.data,o.ports);"handleEvent"in a?a.handleEvent({data:i,ports:o.ports}):a({data:i,ports:o.ports})};e.addListener(d,s),n.set(a,s)},removeEventListener:(r,a)=>{if(r!==d)throw new Error(E);const s=n.get(a);s&&(e.removeListener(d,s),n.delete(a))}}}function z(e){P();const t=new WeakMap,{ipcRenderer:n,channelName:r=h}=e;return{postMessage:(a,s)=>{n.postMessage(r,a,s)},addEventListener:(a,s)=>{if(a!==d)throw new Error(E);const o=(i,...l)=>{const{ports:p}=i,f=A(l[0],p);"handleEvent"in s?s.handleEvent({data:f,ports:p}):s({data:f,ports:p})};n.on(r,o),t.set(s,o)},removeEventListener:(a,s)=>{if(a!==d)throw new Error(E);const o=t.get(s);o&&(n.removeListener(r,o),t.delete(s))}}}function C(e){const{sender:t,ipcMain:n,messageChannelConstructor:r,channelName:a=h}=e;P(r);const s=new WeakMap;return{postMessage:(o,i)=>{t.postMessage(a,o,i)},addEventListener:(o,i)=>{if(o!==d)throw new Error(E);const l=(p,...f)=>{const{ports:L}=p,v=A(f[0],L);"handleEvent"in i?i.handleEvent({data:v,ports:L}):i({data:v,ports:L})};n.on(a,l),s.set(i,l)},removeEventListener:(o,i)=>{if(o!==d)throw new Error(E);const l=s.get(i);l&&(n.removeListener(a,l),s.delete(i))}}}const k={canHandle:e=>_(e)&&e[c.proxyMarker],serialize(){return[null,[]]},deserialize(){return function(){throw new Error("Operation not supported")}}};function G(e){c.transferHandlers.set("proxy",k);const t=new WeakMap;return{postMessage:(n,r)=>{globalThis.parent.postMessage({pluginMessage:n},{targetOrigin:(e==null?void 0:e.origin)||"*",transfer:r})},addEventListener:(n,r)=>{if(n!==d)throw new Error(E);const a=s=>{const{ports:o,data:i}=s;"handleEvent"in r?r.handleEvent({data:i.pluginMessage,ports:o}):r({data:i.pluginMessage,ports:o})};globalThis.addEventListener(d,a),t.set(r,a)},removeEventListener:(n,r)=>{if(n!==d)throw new Error(E);const a=t.get(r);a&&(globalThis.removeEventListener(d,a),t.delete(r))}}}function W(e){c.transferHandlers.set("proxy",k);const t=new WeakMap;return{postMessage:(n,r)=>{figma.ui.postMessage(n,{origin:(e==null?void 0:e.origin)||"*"})},addEventListener:(n,r)=>{if(n!==d)throw new Error(E);const a=async(s,o)=>{(!(e!=null&&e.checkProps)||await(e==null?void 0:e.checkProps(o)))&&("handleEvent"in r?r.handleEvent({data:s,ports:[]}):r({data:s,ports:[]}))};figma.ui.on(d,a),t.set(r,a)},removeEventListener:(n,r)=>{if(n!==d)throw new Error(E);const a=t.get(r);a&&(figma.ui.off(d,a),t.delete(r))}}}const O={canHandle:e=>_(e)&&e[c.proxyMarker],serialize(){return[null,[]]},deserialize(){return function(){throw new Error("Operation not supported")}}};function K(e){c.transferHandlers.set("proxy",O);const t=new WeakMap;return{start:()=>{},postMessage:(n,r)=>{e.postMessage(n)},addEventListener:(n,r)=>{if(n!==d)throw new Error(E);const a=(s,o)=>{"handleEvent"in r?r.handleEvent({data:s,ports:[]}):r({data:s,ports:[]})};e.onMessage.addListener(a),t.set(r,a)},removeEventListener:(n,r)=>{if(n!==d)throw new Error(E);t.get(r)&&t.delete(r)}}}function $(e){const{tabId:t=0,extensionId:n=""}=e||{};c.transferHandlers.set("proxy",O);const r=new Set,a=(s,o,i)=>{if(!(!s||!r.size))for(const l of r.values())"handleEvent"in l?l.handleEvent({data:s,ports:[]}):l({data:s,ports:[]})};return n?chrome.runtime.onMessageExternal.addListener(a):chrome.runtime.onMessage.addListener(a),{start:()=>{},postMessage:(s,o)=>{if(t){chrome.tabs.sendMessage(t,s);return}if(n){chrome.runtime.sendMessage(n,s);return}chrome.runtime.sendMessage(s)},addEventListener:(s,o)=>{if(s!==d)throw new Error(E);r.add(o)},removeEventListener:(s,o)=>{if(s!==d)throw new Error(E);r.has(o)&&r.delete(o)}}}const m=new Map,j=e=>({canHandle:n=>_(n)&&n[c.proxyMarker],serialize(n){const r=N();return c.expose(n,S({socket:e,messageChannel:r})),[{[u]:r},[]]},deserialize(n){return c.wrap(S({socket:e,messageChannel:Reflect.get(n,u)}))}}),V=e=>{m.has(e)||(m.set(e,j(e)),e.on("disconnect",()=>{m.has(e)&&m.delete(e)})),c.transferHandlers.set("proxy",m.get(e))};function S(e){const t=new WeakMap,{socket:n,messageChannel:r=h}=e;return V(n),{postMessage:(a,s)=>{n.emit(r,a)},addEventListener:(a,s)=>{if(a!==d)throw new Error(E);const o=i=>{"handleEvent"in s?s.handleEvent({data:i,ports:[]}):s({data:i,ports:[]})};n.on(r,o),t.set(s,o)},removeEventListener:(a,s)=>{if(a!==d)throw new Error(E);const o=t.get(s);o&&(n.off(r,o),t.delete(s))}}}const w=new Map,D=e=>({canHandle:n=>_(n)&&n[c.proxyMarker],serialize(n){const r=N();return c.expose(n,R({webSocket:e,messageChannel:r})),[{[u]:r},[]]},deserialize(n){return c.wrap(R({webSocket:e,messageChannel:Reflect.get(n,u)}))}}),J=e=>{if(!w.has(e)){w.set(e,D(e));const t=()=>{w.has(e)&&w.delete(e)};e.addEventListener("close",t)}c.transferHandlers.set("proxy",w.get(e))};function R(e){const{webSocket:t,messageChannel:n}=e,r=t,a=new WeakMap,s=n||h;return J(r),{postMessage:(o,i)=>{r.send(JSON.stringify({message:o,__channel__:s}))},addEventListener:(o,i)=>{const l=p=>{let f=null;try{f=JSON.parse(p.data)}catch{f=p.data}!f||!f.__channel__||!f.message||f.__channel__!==s||("handleEvent"in i?i.handleEvent({data:f.message}):i({data:f.message}))};r.addEventListener("message",l),a.set(i,l)},removeEventListener:(o,i)=>{const l=a.get(i);l&&(r.removeEventListener("message",l),a.delete(i))},start:()=>{}}}const y=new Map,U=e=>({canHandle:n=>_(n)&&n[c.proxyMarker],serialize(n){const r=N();return c.expose(n,T({nodeProcess:e,messageChannel:r})),[{[u]:r},[]]},deserialize(n){return c.wrap(T({nodeProcess:e,messageChannel:Reflect.get(n,u)}))}}),X=e=>{if(!y.has(e)){y.set(e,U(e));const t=()=>{y.has(e)&&y.delete(e)};process.on("exit",t),process.on("disconnect",t),process.on("SIGINT",t),process.on("uncaughtException",t)}c.transferHandlers.set("proxy",y.get(e))};function T(e){const{nodeProcess:t,messageChannel:n}=e,r=new WeakMap,a=n||h;return X(t),{postMessage:(s,o)=>{t.send&&t.send({message:s,__channel__:a})},addEventListener:(s,o)=>{const i=l=>{if(!l||!l.__channel__||!l.message||l.__channel__!==a)return;const{message:p}=l;"handleEvent"in o?o.handleEvent({data:p}):o({data:p})};t.on("message",i),r.set(o,i)},removeEventListener:(s,o)=>{const i=r.get(o);i&&(t.off("message",i),r.delete(o))},start:()=>{}}}exports.MESSAGE_CHANNEL_NAME=h;exports.MESSAGE_EVENT_ERROR=E;exports.MESSAGE_EVENT_NAME=d;exports.MESSAGE_PORT_MARKER=g;exports.PROXY_MESSAGE_CHANNEL_MARKER=u;exports.chromeRuntimeMessageEndpoint=$;exports.chromeRuntimePortEndpoint=K;exports.electronMainEndpoint=C;exports.electronMessagePortMainEndpoint=x;exports.electronRendererEndpoint=z;exports.figmaCoreEndpoint=W;exports.figmaUIEndpoint=G;exports.nodeProcessEndpoint=T;exports.socketIoEndpoint=S;exports.webSocketEndpoint=R;