export declare const symlinkThread = "\n/* eslint-disable */\n\nconst LagunaThread = (() => {\n const threadPointer = Symbol(\"LagunaThread.pointer\");\n const createEndpoint = Symbol(\"LagunaThread.endpoint\");\n const releasePointer = Symbol(\"LagunaThread.releasePointer\");\n const throwPointer = Symbol(\"LagunaThread.thrownPointer\");\n const isObject = (val) =>\n (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n\n const pointerTransferHandler = {\n canHandle: (val) => isObject(val) && val[threadPointer],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n bindPointer(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return Connect(port);\n },\n };\n\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwPointer in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n } else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(\n new Error(serialized.value.message),\n serialized.value\n );\n }\n throw serialized.value;\n },\n };\n\n const transferHandlers = new Map([\n [\"pointer\", pointerTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n\n // eslint-disable-next-line no-restricted-globals\n const bindPointer = (obj, ep = self) => {\n ep.addEventListener(\"message\", (ev) => {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\":\n returnValue = rawValue;\n break;\n case \"SET\":\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n break;\n case \"APPLY\":\n returnValue = rawValue?.apply(parent, argumentList);\n break;\n case \"CONSTRUCT\":\n const value = new rawValue(...argumentList);\n returnValue = pointer(value);\n break;\n case \"ENDPOINT\":\n const { port1, port2 } = new MessageChannel();\n bindPointer(obj, port2);\n returnValue = transfer(port1, [port1]);\n break;\n case \"RELEASE\":\n returnValue = undefined;\n break;\n default:\n return;\n }\n } catch (value) {\n returnValue = { value, [throwPointer]: 0 };\n }\n\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwPointer]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(\n Object.assign(Object.assign({}, wireValue), { id }),\n transferables\n );\n if (type === \"RELEASE\") {\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n }\n })\n .catch((error) => {\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwPointer]: 0,\n });\n ep.postMessage({ ...wireValue, id }, transferables);\n });\n });\n\n if (ep.start) {\n ep.start();\n }\n };\n\n const isMessagePort = (endpoint) => {\n return endpoint.constructor.name === \"MessagePort\";\n };\n\n const closeEndPoint = (endpoint) => {\n if (isMessagePort(endpoint)) endpoint.close();\n };\n\n const Connect = (ep, target) => {\n return createPointer(ep, [], target);\n };\n\n const throwIfPointerReleased = (isReleased) => {\n if (isReleased) {\n throw new Error(\"Pointer has been released and is not useable\");\n }\n };\n\n const createPointer = (ep, path = [], target = function () {}) => {\n let isPointerReleased = false;\n\n // Create a es 6 proxy to keep track of webworker message events and return a promise.\n const pointerProxy = new Proxy(target, {\n get(_target, prop) {\n throwIfPointerReleased(isPointerReleased);\n if (prop === releasePointer) {\n return () => {\n return requestResponseMessage(ep, {\n type: \"RELEASE\",\n path: path.map((p) => p.toString()),\n }).then(() => {\n closeEndPoint(ep);\n isPointerReleased = true;\n });\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => pointerProxy };\n }\n const r = requestResponseMessage(ep, {\n type: \"GET\",\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createPointer(ep, [...path, prop]);\n },\n async set(_target, prop, rawValue) {\n throwIfPointerReleased(isPointerReleased);\n const [value, transferables] = toWireValue(rawValue);\n const value_2 = await requestResponseMessage(\n ep,\n {\n type: \"SET\",\n path: [...path, prop].map((p) => p.toString()),\n value,\n },\n transferables\n );\n return fromWireValue(value_2);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfPointerReleased(isPointerReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, {\n type: \"ENDPOINT\",\n }).then(fromWireValue);\n }\n if (last === \"bind\") {\n return createPointer(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: \"APPLY\",\n path: path.map((p) => p.toString()),\n argumentList,\n },\n transferables\n ).then(fromWireValue);\n },\n async construct(_target, rawArgumentList) {\n throwIfPointerReleased(isPointerReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n const value = await requestResponseMessage(\n ep,\n {\n type: \"CONSTRUCT\",\n path: path.map((p) => p.toString()),\n argumentList,\n },\n transferables\n );\n return fromWireValue(value);\n },\n });\n return pointerProxy;\n };\n\n const myFlat = (arr) => {\n return Array.prototype.concat.apply([], arr);\n };\n\n const processArguments = (argumentList) => {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n };\n\n const transferCache = new WeakMap();\n\n const transfer = (obj, transfers) => {\n transferCache.set(obj, transfers);\n return obj;\n };\n\n const pointer = (obj) => {\n return Object.assign(obj, { [threadPointer]: true });\n };\n\n // Allow communication across tabs and iframes\n // eslint-disable-next-line no-restricted-globals\n const windowEndpoint = (w, context = self, targetOrigin = \"*\") => {\n return {\n postMessage: (msg, transferables) =>\n w.postMessage(msg, targetOrigin, transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context),\n };\n };\n\n const toWireValue = (value) => {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\",\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\",\n value,\n },\n transferCache.get(value) || [],\n ];\n };\n\n const fromWireValue = (value) => {\n switch (value.type) {\n case \"HANDLER\":\n return transferHandlers.get(value.name).deserialize(value.value);\n default:\n return value.value;\n }\n };\n\n const requestResponseMessage = (ep, msg, transfers) => {\n return new Promise((resolve) => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l);\n resolve(ev.data);\n });\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n };\n\n // Quick Id for cross channel messenging\n const generateUUID = () => {\n return new Array(4)\n .fill(0)\n .map(() =>\n Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)\n )\n .join(\"-\");\n };\n\n return {\n createEndpoint: createEndpoint,\n bindPointer: bindPointer,\n pointer: pointer,\n threadPointer: threadPointer,\n releasePointer: releasePointer,\n transfer: transfer,\n transferHandlers: transferHandlers,\n windowEndpoint: windowEndpoint,\n Connect: Connect,\n };\n})();\n\n// DO NOT CHANGE THIS \n// This is used for rpc events to and from threads.\nconst triggerPublicEvent = (event, payload) => {\n postMessage({\n event,\n payload\n })\n};\n\n";