UNPKG

@webcontainer/api

Version:
290 lines (287 loc) 8.28 kB
var __defProp = Object.defineProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; // dist/vendor/comlink.js var comlink_exports = {}; __export(comlink_exports, { createEndpoint: () => createEndpoint, expose: () => expose, proxy: () => proxy, proxyMarker: () => proxyMarker, releaseProxy: () => releaseProxy, transfer: () => transfer, transferHandlers: () => transferHandlers, windowEndpoint: () => windowEndpoint, wrap: () => wrap }); // ../../node_modules/comlink/dist/esm/comlink.mjs var proxyMarker = Symbol("Comlink.proxy"); var createEndpoint = Symbol("Comlink.endpoint"); var releaseProxy = Symbol("Comlink.releaseProxy"); var throwMarker = Symbol("Comlink.thrown"); var isObject = (val) => typeof val === "object" && val !== null || typeof val === "function"; var proxyTransferHandler = { canHandle: (val) => isObject(val) && val[proxyMarker], serialize(obj) { const { port1, port2 } = new MessageChannel(); expose(obj, port1); return [port2, [port2]]; }, deserialize(port) { port.start(); return wrap(port); } }; var throwTransferHandler = { canHandle: (value) => isObject(value) && throwMarker in value, serialize({ value }) { let serialized; if (value instanceof Error) { serialized = { isError: true, value: { message: value.message, name: value.name, stack: value.stack } }; } else { serialized = { isError: false, value }; } return [serialized, []]; }, deserialize(serialized) { if (serialized.isError) { throw Object.assign(new Error(serialized.value.message), serialized.value); } throw serialized.value; } }; var transferHandlers = /* @__PURE__ */ new Map([ ["proxy", proxyTransferHandler], ["throw", throwTransferHandler] ]); function expose(obj, ep = self) { ep.addEventListener("message", function callback(ev) { if (!ev || !ev.data) { return; } const { id, type, path } = Object.assign({ path: [] }, ev.data); const argumentList = (ev.data.argumentList || []).map(fromWireValue); let returnValue; try { const parent = path.slice(0, -1).reduce((obj2, prop) => obj2[prop], obj); const rawValue = path.reduce((obj2, prop) => obj2[prop], obj); switch (type) { case 0: { returnValue = rawValue; } break; case 1: { parent[path.slice(-1)[0]] = fromWireValue(ev.data.value); returnValue = true; } break; case 2: { returnValue = rawValue.apply(parent, argumentList); } break; case 3: { const value = new rawValue(...argumentList); returnValue = proxy(value); } break; case 4: { const { port1, port2 } = new MessageChannel(); expose(obj, port2); returnValue = transfer(port1, [port1]); } break; case 5: { returnValue = void 0; } break; } } catch (value) { returnValue = { value, [throwMarker]: 0 }; } Promise.resolve(returnValue).catch((value) => { return { value, [throwMarker]: 0 }; }).then((returnValue2) => { const [wireValue, transferables] = toWireValue(returnValue2); ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables); if (type === 5) { ep.removeEventListener("message", callback); closeEndPoint(ep); } }); }); if (ep.start) { ep.start(); } } function isMessagePort(endpoint) { return endpoint.constructor.name === "MessagePort"; } function closeEndPoint(endpoint) { if (isMessagePort(endpoint)) endpoint.close(); } function wrap(ep, target) { return createProxy(ep, [], target); } function throwIfProxyReleased(isReleased) { if (isReleased) { throw new Error("Proxy has been released and is not useable"); } } function createProxy(ep, path = [], target = function() { }) { let isProxyReleased = false; const proxy2 = new Proxy(target, { get(_target, prop) { throwIfProxyReleased(isProxyReleased); if (prop === releaseProxy) { return () => { return requestResponseMessage(ep, { type: 5, path: path.map((p) => p.toString()) }).then(() => { closeEndPoint(ep); isProxyReleased = true; }); }; } if (prop === "then") { if (path.length === 0) { return { then: () => proxy2 }; } const r = requestResponseMessage(ep, { type: 0, path: path.map((p) => p.toString()) }).then(fromWireValue); return r.then.bind(r); } return createProxy(ep, [...path, prop]); }, set(_target, prop, rawValue) { throwIfProxyReleased(isProxyReleased); const [value, transferables] = toWireValue(rawValue); return requestResponseMessage(ep, { type: 1, path: [...path, prop].map((p) => p.toString()), value }, transferables).then(fromWireValue); }, apply(_target, _thisArg, rawArgumentList) { throwIfProxyReleased(isProxyReleased); const last = path[path.length - 1]; if (last === createEndpoint) { return requestResponseMessage(ep, { type: 4 }).then(fromWireValue); } if (last === "bind") { return createProxy(ep, path.slice(0, -1)); } const [argumentList, transferables] = processArguments(rawArgumentList); return requestResponseMessage(ep, { type: 2, path: path.map((p) => p.toString()), argumentList }, transferables).then(fromWireValue); }, construct(_target, rawArgumentList) { throwIfProxyReleased(isProxyReleased); const [argumentList, transferables] = processArguments(rawArgumentList); return requestResponseMessage(ep, { type: 3, path: path.map((p) => p.toString()), argumentList }, transferables).then(fromWireValue); } }); return proxy2; } function myFlat(arr) { return Array.prototype.concat.apply([], arr); } function processArguments(argumentList) { const processed = argumentList.map(toWireValue); return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))]; } var transferCache = /* @__PURE__ */ new WeakMap(); function transfer(obj, transfers) { transferCache.set(obj, transfers); return obj; } function proxy(obj) { return Object.assign(obj, { [proxyMarker]: true }); } function windowEndpoint(w, context = self, targetOrigin = "*") { return { postMessage: (msg, transferables) => w.postMessage(msg, targetOrigin, transferables), addEventListener: context.addEventListener.bind(context), removeEventListener: context.removeEventListener.bind(context) }; } function toWireValue(value) { for (const [name, handler] of transferHandlers) { if (handler.canHandle(value)) { const [serializedValue, transferables] = handler.serialize(value); return [ { type: 3, name, value: serializedValue }, transferables ]; } } return [ { type: 0, value }, transferCache.get(value) || [] ]; } function fromWireValue(value) { switch (value.type) { case 3: return transferHandlers.get(value.name).deserialize(value.value); case 0: return value.value; } } function requestResponseMessage(ep, msg, transfers) { return new Promise((resolve) => { const id = generateUUID(); ep.addEventListener("message", function l(ev) { if (!ev.data || !ev.data.id || ev.data.id !== id) { return; } ep.removeEventListener("message", l); resolve(ev.data); }); if (ep.start) { ep.start(); } ep.postMessage(Object.assign({ id }, msg), transfers); }); } function generateUUID() { return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join("-"); } export { comlink_exports as Comlink };