UNPKG

comlink-adapters

Version:

Implementation of comlink adapters for different application platforms

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