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