/**
 * Minified by jsDelivr using Terser v5.48.0.
 * Original file: /npm/@emnapi/wasi-threads@2.0.0/dist/wasi-threads.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
const _WebAssembly="undefined"!=typeof WebAssembly?WebAssembly:"undefined"!=typeof WXWebAssembly?WXWebAssembly:void 0,ENVIRONMENT_IS_NODE="object"==typeof process&&null!==process&&"object"==typeof process.versions&&null!==process.versions&&"string"==typeof process.versions.node;function getPostMessage(e){return"function"==typeof e?.postMessage?e.postMessage:"function"==typeof postMessage?postMessage:void 0}function serizeErrorToBuffer(e,t,r){const s=new Int32Array(e);if(Atomics.store(s,0,t),t>1&&r){const t=r.name,o=r.message,n=r.stack,a=(new TextEncoder).encode(t),i=(new TextEncoder).encode(o),h=(new TextEncoder).encode(n);Atomics.store(s,1,a.length),Atomics.store(s,2,i.length),Atomics.store(s,3,h.length);const d=new Uint8Array(e);d.set(a,16),d.set(i,16+a.length),d.set(h,16+a.length+i.length)}}function deserizeErrorFromBuffer(e){const t=new Int32Array(e);if(Atomics.load(t,0)<=1)return null;const r=Atomics.load(t,1),s=Atomics.load(t,2),o=Atomics.load(t,3),n=new Uint8Array(e),a=n.slice(16,16+r),i=n.slice(16+r,16+r+s),h=n.slice(16+r+s,16+r+s+o),d=(new TextDecoder).decode(a),c=(new TextDecoder).decode(i),l=(new TextDecoder).decode(h),u=new(globalThis[d]??("RuntimeError"===d?_WebAssembly.RuntimeError??Error:Error))(c);return Object.defineProperty(u,"stack",{value:l,writable:!0,enumerable:!1,configurable:!0}),u}function isSharedArrayBuffer(e){return"function"==typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||"[object SharedArrayBuffer]"===Object.prototype.toString.call(e)}function isTrapError(e){try{return e instanceof _WebAssembly.RuntimeError}catch(e){return!1}}function createMessage(e,t){return{__emnapi__:{type:e,payload:t}}}const WASI_THREADS_MAX_TID=536870911;function checkSharedWasmMemory(e){if(e){if(!isSharedArrayBuffer(e.buffer))throw new Error("Multithread features require shared wasm memory. Try to compile with `-matomics -mbulk-memory` and use `--import-memory --shared-memory` during linking, then create WebAssembly.Memory with `shared: true` option")}else if("undefined"==typeof SharedArrayBuffer)throw new Error("Current environment does not support SharedArrayBuffer, threads are not available!")}function getReuseWorker(e){if("boolean"==typeof e)return!!e&&{size:0,strict:!1};if("number"==typeof e){if(!(e>=0))throw new RangeError("reuseWorker: size must be a non-negative integer");return{size:e,strict:!1}}if(!e)return!1;const t=Number(e.size)||0,r=Boolean(e.strict);if(!(t>0)&&r)throw new RangeError("reuseWorker: size must be set to positive integer if strict is set to true");return{size:t,strict:r}}let nextWorkerID=0;class ThreadManager{get nextWorkerID(){return nextWorkerID}constructor(e){if(this.unusedWorkers=[],this.pthreads=Object.create(null),this.wasmModule=null,this.wasmMemory=null,this.messageEvents=new WeakMap,!e)throw new TypeError("ThreadManager(): options is not provided");this._childThread="childThread"in e&&Boolean(e.childThread),this._childThread?(this._onCreateWorker=void 0,this._reuseWorker=!1,this._beforeLoad=void 0):(this._onCreateWorker=e.onCreateWorker,this._reuseWorker=getReuseWorker(e.reuseWorker),this._beforeLoad=e.beforeLoad),this.printErr=e.printErr??console.error.bind(console),this.threadSpawn=e.threadSpawn}init(){this._childThread||this.initMainThread()}initMainThread(){this.preparePool()}preparePool(){if(this._reuseWorker&&this._reuseWorker.size){let e=this._reuseWorker.size;for(;e--;){const e=this.allocateUnusedWorker();ENVIRONMENT_IS_NODE&&(e.once("message",()=>{}),e.unref())}}}shouldPreloadWorkers(){return!this._childThread&&this._reuseWorker&&this._reuseWorker.size>0}loadWasmModuleToAllWorkers(){const e=Array(this.unusedWorkers.length);for(let t=0;t<this.unusedWorkers.length;++t){const r=this.unusedWorkers[t];ENVIRONMENT_IS_NODE&&r.ref(),e[t]=this.loadWasmModuleToWorker(r).then(e=>(ENVIRONMENT_IS_NODE&&r.unref(),e),e=>{throw ENVIRONMENT_IS_NODE&&r.unref(),e})}return Promise.all(e).catch(e=>{throw this.terminateAllThreads(),e})}preloadWorkers(){return this.shouldPreloadWorkers()?this.loadWasmModuleToAllWorkers():Promise.resolve([])}setup(e,t){this.wasmModule=e,this.wasmMemory=t}markId(e){if(e.__emnapi_tid)return e.__emnapi_tid;const t=nextWorkerID+43;return nextWorkerID=(nextWorkerID+1)%536870869,this.pthreads[t]=e,e.__emnapi_tid=t,t}returnWorkerToPool(e){var t=e.__emnapi_tid;void 0!==t&&delete this.pthreads[t],this.unusedWorkers.push(e),delete e.__emnapi_tid,ENVIRONMENT_IS_NODE&&e.unref()}loadWasmModuleToWorker(e,t){if(e.whenLoaded)return e.whenLoaded;const r=this.printErr,s=this._beforeLoad,o=this;return e.whenLoaded=new Promise((n,a)=>{const i=t=>{if(t.__emnapi__){const r=t.__emnapi__.type,s=t.__emnapi__.payload;"loaded"===r?(e.loaded=!0,ENVIRONMENT_IS_NODE&&!e.__emnapi_tid&&e.unref(),n(e)):"cleanup-thread"===r?s.tid in this.pthreads&&this.cleanThread(e,s.tid):"spawn-thread"===r?this.threadSpawn(s.startArg,s.errorOrTid):"terminate-all-threads"===r&&this.terminateAllThreads()}};e.onmessage=t=>{i(t.data),this.fireMessageEvent(e,t)},e.onerror=function(t){let s="worker sent an error!";if(void 0!==e.__emnapi_tid&&(s="worker (tid = "+e.__emnapi_tid+") sent an error!"),"message"in t){if(r(s+" "+t.message),-1!==t.message.indexOf("RuntimeError")||-1!==t.message.indexOf("unreachable"))try{o.terminateAllThreads()}catch(e){}}else r(s);throw a(t),t},ENVIRONMENT_IS_NODE&&(e.on("message",function(t){e.onmessage?.({data:t})}),e.on("error",function(t){e.onerror?.(t)}),e.on("detachedExit",function(){})),"function"==typeof s&&s(e);try{e.postMessage(createMessage("load",{wasmModule:this.wasmModule,wasmMemory:this.wasmMemory,sab:t}))}catch(e){throw checkSharedWasmMemory(this.wasmMemory),e}}),e.whenLoaded}allocateUnusedWorker(){const e=this._onCreateWorker;if("function"!=typeof e)throw new TypeError("`options.onCreateWorker` is not provided");const t=e({type:"thread",name:"emnapi-pthread"});return this.unusedWorkers.push(t),t}getNewWorker(e){if(this._reuseWorker){if(0===this.unusedWorkers.length){if(this._reuseWorker.strict&&!ENVIRONMENT_IS_NODE){return void(0,this.printErr)("Tried to spawn a new thread, but the thread pool is exhausted.\nThis might result in a deadlock unless some threads eventually exit or the code explicitly breaks out to the event loop.")}const t=this.allocateUnusedWorker();this.loadWasmModuleToWorker(t,e)}return this.unusedWorkers.pop()}const t=this.allocateUnusedWorker();return this.loadWasmModuleToWorker(t,e),this.unusedWorkers.pop()}cleanThread(e,t,r){!r&&this._reuseWorker?this.returnWorkerToPool(e):(delete this.pthreads[t],this.terminateWorker(e),delete e.__emnapi_tid)}terminateWorker(e){const t=e.__emnapi_tid;e.terminate(),this.messageEvents.get(e)?.clear(),this.messageEvents.delete(e),e.onmessage=e=>{if(e.data.__emnapi__){(0,this.printErr)('received "'+e.data.__emnapi__.type+'" command from terminated worker: '+t)}}}terminateAllThreads(){const e=Object.values(this.pthreads);for(let t=0;t<e.length;++t)this.terminateWorker(e[t]);for(let e=0;e<this.unusedWorkers.length;++e)this.terminateWorker(this.unusedWorkers[e]);this.unusedWorkers=[],this.pthreads=Object.create(null),this.preparePool()}addMessageEventListener(e,t){let r=this.messageEvents.get(e);return r||(r=new Set,this.messageEvents.set(e,r)),r.add(t),()=>{r?.delete(t)}}fireMessageEvent(e,t){const r=this.messageEvents.get(e);if(!r)return;const s=this.printErr;r.forEach(e=>{try{e(t)}catch(e){s(e.stack)}})}}const kIsProxy=Symbol("kIsProxy");function createInstanceProxy(e,t){if(e[kIsProxy])return e;const r=e.exports,s=function(e){const t=["apply","construct","defineProperty","deleteProperty","get","getOwnPropertyDescriptor","getPrototypeOf","has","isExtensible","ownKeys","preventExtensions","set","setPrototypeOf"],r={};for(let s=0;s<t.length;s++){const o=t[s];r[o]=function(){const t=Array.prototype.slice.call(arguments,1);return t.unshift(e),Reflect[o].apply(Reflect,t)}}return r}(r),o=()=>{},n=()=>0;s.get=function(e,s,a){return"memory"===s?("function"==typeof t?t():t)??Reflect.get(r,s,a):"_initialize"===s?s in r?o:void 0:"_start"===s?s in r?n:void 0:Reflect.get(r,s,a)},s.has=function(e,t){return"memory"===t||Reflect.has(r,t)};const a=new Proxy(Object.create(null),s);return new Proxy(e,{get:(e,t,r)=>"exports"===t?a:t===kIsProxy||Reflect.get(e,t,r)})}const patchedWasiInstances=new WeakMap;class WASIThreads{constructor(e){if(!e)throw new TypeError("WASIThreads(): options is not provided");if(!e.wasi)throw new TypeError("WASIThreads(): options.wasi is not provided");patchedWasiInstances.set(this,new WeakSet);const t=e.wasi;patchWasiInstance(this,t),this.wasi=t,this.childThread="childThread"in e&&Boolean(e.childThread),this.PThread=void 0,"threadManager"in e?"function"==typeof e.threadManager?this.PThread=e.threadManager():this.PThread=e.threadManager:this.childThread||(this.PThread=new ThreadManager(e),this.PThread.init());let r=!1;"waitThreadStart"in e&&(r="number"==typeof e.waitThreadStart?e.waitThreadStart:Boolean(e.waitThreadStart));const s=getPostMessage(e);if(this.childThread&&"function"!=typeof s)throw new TypeError("options.postMessage is not a function");this.postMessage=s;const o=Boolean(e.wasm64),n=(e,t)=>{const n=void 0!==t;try{checkSharedWasmMemory(this.wasmMemory)}catch(e){if(this.PThread?.printErr(e.stack),n){const e=new Int32Array(this.wasmMemory.buffer,t,2);return Atomics.store(e,0,1),Atomics.store(e,1,6),Atomics.notify(e,1),1}return-6}if(!n){const e=this.wasmInstance.exports.malloc;if(!(t=o?Number(e(BigInt(8))):e(8)>>>0))return-48}const a=this.wasmInstance.exports.free,i=o?e=>{a(BigInt(e))}:a,h=new Int32Array(this.wasmMemory.buffer,t,2);if(Atomics.store(h,0,0),Atomics.store(h,1,0),this.childThread){s(createMessage("spawn-thread",{startArg:e,errorOrTid:t})),Atomics.wait(h,1,0);const r=Atomics.load(h,0),o=Atomics.load(h,1);return n?r:(i(t),r?-o:o)}const d=r||0===r;let c,l,u;d&&(c=new Int32Array(new SharedArrayBuffer(8208)),Atomics.store(c,0,0));const f=this.PThread;try{if(l=f.getNewWorker(c),!l)throw new Error("failed to get new worker");if(u=f.markId(l),ENVIRONMENT_IS_NODE&&l.unref(),l.postMessage(createMessage("start",{tid:u,arg:e,sab:c})),d){if("number"==typeof r){if("timed-out"===Atomics.wait(c,0,0,r))throw new Error("Spawning thread timed out. Please check if the worker is created successfully and if message is handled properly in the worker.")}else Atomics.wait(c,0,0);if(Atomics.load(c,0)>1)throw deserizeErrorFromBuffer(c.buffer)}}catch(e){if(void 0!==l&&void 0!==u)try{f.cleanThread(l,u,!0)}catch(e){}return Atomics.store(h,0,1),Atomics.store(h,1,6),Atomics.notify(h,1),f?.printErr(e.stack),n?1:(i(t),-6)}return Atomics.store(h,0,0),Atomics.store(h,1,u),Atomics.notify(h,1),d||l.whenLoaded.catch(e=>{throw delete l.whenLoaded,f.cleanThread(l,u,!0),e}),n?0:(i(t),u)};this.threadSpawn=n,this.PThread&&(this.PThread.threadSpawn=n)}getImportObject(){return{wasi:{"thread-spawn":this.threadSpawn}}}setup(e,t,r){r??=e.exports.memory,this.wasmInstance=e,this.wasmMemory=r,this.PThread&&this.PThread.setup(t,r)}preloadWorkers(){return this.PThread?this.PThread.preloadWorkers():Promise.resolve([])}initialize(e,t,r){const s=e.exports;r??=s.memory,this.childThread&&(e=createInstanceProxy(e,r)),this.setup(e,t,r);const o=this.wasi;if("_start"in s&&"function"==typeof s._start)if(this.childThread){o.start(e);try{o[getWasiSymbol(o,"kStarted")]=!1}catch(e){}}else setupInstance(o,e);else o.initialize(e);return e}start(e,t,r){const s=e.exports;r??=s.memory,this.childThread&&(e=createInstanceProxy(e,r)),this.setup(e,t,r);return{exitCode:this.wasi.start(e),instance:e}}terminateAllThreads(){this.childThread?this.postMessage(createMessage("terminate-all-threads",{})):this.PThread?.terminateAllThreads()}}function patchWasiInstance(e,t){const r=patchedWasiInstances.get(e);if(r.has(t))return;const s=e,o=t.wasiImport;if(o){const e=o.proc_exit;o.proc_exit=function(t){return s.terminateAllThreads(),e.call(this,t)}}if(!s.childThread){const e=t.start;"function"==typeof e&&(t.start=function(t){try{return e.call(this,t)}catch(e){throw isTrapError(e)&&s.terminateAllThreads(),e}})}r.add(t)}function getWasiSymbol(e,t){const r=Object.getOwnPropertySymbols(e),s=e=>t=>t.description?t.description===e:t.toString()===`Symbol(${e})`;return Array.isArray(t)?t.map(e=>r.filter(s(e))[0]):r.filter(s(t))[0]}function setupInstance(e,t){const[r,s]=getWasiSymbol(e,["kInstance","kSetMemory"]);e[r]=t,e[s](t.exports.memory)}class ThreadMessageHandler{constructor(e){const t=getPostMessage(e);if("function"!=typeof t)throw new TypeError("options.postMessage is not a function");this.postMessage=t,this.onLoad=e?.onLoad,this.onError="function"==typeof e?.onError?e.onError:(e,t)=>{throw t},this.instance=void 0,this.messagesBeforeLoad=[]}instantiate(e){if("function"==typeof this.onLoad)return this.onLoad(e);throw new Error("ThreadMessageHandler.prototype.instantiate is not implemented")}handle(e){if(e?.data?.__emnapi__){const t=e.data.__emnapi__.type,r=e.data.__emnapi__.payload;try{"load"===t?this._load(r):"start"===t&&this.handleAfterLoad(e,()=>{this._start(r)})}catch(e){this.onError(e,t)}}}_load(e){if(void 0!==this.instance)return;let t;try{t=this.instantiate(e)}catch(t){return void this._loaded(t,null,e)}const r=t&&"then"in t?t.then:void 0;"function"==typeof r?r.call(t,t=>{this._loaded(null,t,e)},t=>{this._loaded(t,null,e)}):this._loaded(null,t,e)}_start(e){const t=this.instance.exports.wasi_thread_start;if("function"!=typeof t){const t=new TypeError("wasi_thread_start is not exported");throw notifyPthreadCreateResult(e.sab,2,t),t}const r=this.postMessage,s=e.tid,o=e.arg;notifyPthreadCreateResult(e.sab,1);try{t(s,o)}catch(e){if("unwind"!==e)throw e;return}r(createMessage("cleanup-thread",{tid:s}))}_loaded(e,t,r){if(e)throw notifyPthreadCreateResult(r.sab,2,e),e;if(null==t){const e=new TypeError("onLoad should return an object");throw notifyPthreadCreateResult(r.sab,2,e),e}const s=t.instance;if(!s){const e=new TypeError('onLoad should return an object which includes "instance"');throw notifyPthreadCreateResult(r.sab,2,e),e}this.instance=s;(0,this.postMessage)(createMessage("loaded",{}));const o=this.messagesBeforeLoad;this.messagesBeforeLoad=[];for(let e=0;e<o.length;e++){const t=o[e];this.handle({data:t})}}handleAfterLoad(e,t){void 0!==this.instance?t.call(this,e):this.messagesBeforeLoad.push(e.data)}}function notifyPthreadCreateResult(e,t,r){e&&(serizeErrorToBuffer(e.buffer,t,r),Atomics.notify(e,0))}export{ThreadManager,ThreadMessageHandler,WASIThreads,createInstanceProxy,isSharedArrayBuffer,isTrapError};
//# sourceMappingURL=/sm/137b41b7f431d0b548bdb6b06ae1293d0162d2a61e96d567cd5f96334dc54178.map