From da6602ef66a05f299957e367a374e816254ea5d3 Mon Sep 17 00:00:00 2001 From: samtiz Date: Tue, 8 Jul 2025 11:58:26 +0900 Subject: [PATCH] implementing aec --- aec | 1 + package.json | 5 +- src/assets/aec.js | 20 ++++++++ src/assets/aec.wasm | Bin 0 -> 113342 bytes src/features/listen/renderer/listenCapture.js | 46 ++++++++++++++++++ 5 files changed, 69 insertions(+), 3 deletions(-) create mode 160000 aec create mode 100644 src/assets/aec.js create mode 100755 src/assets/aec.wasm diff --git a/aec b/aec new file mode 160000 index 0000000..66c447b --- /dev/null +++ b/aec @@ -0,0 +1 @@ +Subproject commit 66c447ba544dfe8e3bb4091fda2961a11066910b diff --git a/package.json b/package.json index 52d6fab..e69f01e 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "package": "npm run build:renderer && electron-forge package", "make": "npm run build:renderer && electron-forge make", "build": "npm run build:all && electron-builder --config electron-builder.yml --publish never", - "build:win": "npm run build:all && electron-builder --win --x64 --publish never", + "build:win": "npm run build:all && electron-builder --win --x64 --publish never", "publish": "npm run build:all && electron-builder --config electron-builder.yml --publish always", "lint": "eslint --ext .ts,.tsx,.js .", "postinstall": "electron-builder install-app-deps", @@ -39,7 +39,6 @@ "better-sqlite3": "^9.4.3", "cors": "^2.8.5", "dotenv": "^17.0.0", - "electron-squirrel-startup": "^1.0.1", "electron-store": "^8.2.0", "electron-updater": "^6.6.2", @@ -74,4 +73,4 @@ "optionalDependencies": { "electron-liquid-glass": "^1.0.1" } -} \ No newline at end of file +} diff --git a/src/assets/aec.js b/src/assets/aec.js new file mode 100644 index 0000000..332ffea --- /dev/null +++ b/src/assets/aec.js @@ -0,0 +1,20 @@ +var createAecModule = (() => { + var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; + return ( +async function(moduleArg = {}) { + var moduleRtn; + +var Module=moduleArg;var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&process.versions?.node&&process.type!="renderer";var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var wasmMemory;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["v"]();FS.ignorePermissions=false}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("aec.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["u"];updateMemoryViews();wasmTable=wasmExports["H"];assignWasmExports(wasmExports);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var exceptionLast=0;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var setTempRet0=val=>__emscripten_tempret_set(val);var findMatchingCatch=args=>{var thrown=exceptionLast;if(!thrown){setTempRet0(0);return 0}var info=new ExceptionInfo(thrown);info.set_adjusted_ptr(thrown);var thrownType=info.get_type();if(!thrownType){setTempRet0(0);return thrown}for(var caughtType of args){if(caughtType===0||caughtType===thrownType){break}var adjusted_ptr_addr=info.ptr+16;if(___cxa_can_catch(caughtType,thrownType,adjusted_ptr_addr)){setTempRet0(caughtType);return thrown}}setTempRet0(thrownType);return thrown};var ___cxa_find_matching_catch_2=()=>findMatchingCatch([]);var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var ___resumeException=ptr=>{if(!exceptionLast){exceptionLast=ptr}throw exceptionLast};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(sizeabort("");var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.language||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>view=>crypto.getRandomValues(view);var randomFill=view=>{(randomFill=initRandomFill())(view)};var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var preloadPlugins=[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url).then(processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,readFiles:{},ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);setattr(arg,attr)},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}if(Module["logReadFiles"]&&!(flags&1)){if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){data=new Uint8Array(intArrayFromString(data,true))}if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAP32[buf+4>>2]=stats.bsize;HEAP32[buf+40>>2]=stats.bsize;HEAP32[buf+8>>2]=stats.blocks;HEAP32[buf+12>>2]=stats.bfree;HEAP32[buf+16>>2]=stats.bavail;HEAP32[buf+20>>2]=stats.files;HEAP32[buf+24>>2]=stats.ffree;HEAP32[buf+28>>2]=stats.fsid;HEAP32[buf+44>>2]=stats.flags;HEAP32[buf+36>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack="";{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["preloadPlugins"])preloadPlugins=Module["preloadPlugins"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"]}Module["ccall"]=ccall;Module["cwrap"]=cwrap;var _AecNew,_AecCancelEcho,_AecDestroy,_malloc,_free,_setThrew,__emscripten_tempret_set,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,___cxa_can_catch;function assignWasmExports(wasmExports){Module["_AecNew"]=_AecNew=wasmExports["w"];Module["_AecCancelEcho"]=_AecCancelEcho=wasmExports["x"];Module["_AecDestroy"]=_AecDestroy=wasmExports["y"];Module["_malloc"]=_malloc=wasmExports["z"];Module["_free"]=_free=wasmExports["A"];_setThrew=wasmExports["B"];__emscripten_tempret_set=wasmExports["C"];__emscripten_stack_restore=wasmExports["D"];__emscripten_stack_alloc=wasmExports["E"];_emscripten_stack_get_current=wasmExports["F"];___cxa_can_catch=wasmExports["G"]}var wasmImports={a:___cxa_find_matching_catch_2,q:___cxa_throw,b:___resumeException,p:___syscall_getcwd,r:__abort_js,t:_emscripten_resize_heap,n:_environ_get,o:_environ_sizes_get,k:_exit,s:_fd_close,l:_fd_seek,g:_fd_write,i:invoke_ii,f:invoke_iiii,m:invoke_iiiiii,c:invoke_vi,d:invoke_vii,e:invoke_viii,j:invoke_viiii,h:invoke_viiiii};var wasmExports=await createWasm();function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}function preInit(){if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}preInit();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} + + + return moduleRtn; +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') { + module.exports = createAecModule; + // This default export looks redundant, but it allows TS to import this + // commonjs style module. + module.exports.default = createAecModule; +} else if (typeof define === 'function' && define['amd']) + define([], () => createAecModule); diff --git a/src/assets/aec.wasm b/src/assets/aec.wasm new file mode 100755 index 0000000000000000000000000000000000000000..9d5924ada9ef44f43f2dff9c1fbaedc03fabe345 GIT binary patch literal 113342 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 DCKAgt literal 0 HcmV?d00001 diff --git a/src/features/listen/renderer/listenCapture.js b/src/features/listen/renderer/listenCapture.js index 1c27f75..f8e1722 100644 --- a/src/features/listen/renderer/listenCapture.js +++ b/src/features/listen/renderer/listenCapture.js @@ -1,5 +1,33 @@ const { ipcRenderer } = require('electron'); +const createAecModule = require('../../../assets/aec.js'); // aec.js 위치 + +let aecWasm; // 전역 캐시 + +export async function initAec () { + if (aecWasm) return aecWasm; // 이미 초기화됐으면 그대로 + + // ⬇️ locateFile: aec.js 가 wasm 로드를 시도할 때 호출 + aecWasm = await createAecModule({ + locateFile (filename) { + // aec.js 는 ‘aec.wasm’ 한 개만 요청하므로, 주소를 직접 반환 + return '../../../assets/' + filename; // ← **브라우저 기준 URL** + // (Electron renderer 에서 file://…/dist/renderer/… 에서 접근) + } + }); + + // C → JS 래퍼 + aecWasm.newPtr = aecWasm.cwrap('AecNew', 'number', + ['number','number','number','number']); + aecWasm.cancel = aecWasm.cwrap('AecCancelEcho', null, + ['number','number','number','number','number']); + aecWasm.destroy = aecWasm.cwrap('AecDestroy', null, ['number']); + + return aecWasm; +} + +// 바로 로드-실패 로그를 보기 위해 +initAec().catch(console.error); // --------------------------- // Constants & Globals // --------------------------- @@ -80,6 +108,24 @@ function arrayBufferToBase64(buffer) { return btoa(binary); } +function int16PtrFromFloat32(mod, f32) { + const len = f32.length; + const bytes = len * 2; + const ptr = mod._malloc(bytes); + const i16 = new Int16Array(mod.HEAP16.buffer, ptr, len); + for (let i = 0; i < len; ++i) { + const s = Math.max(-1, Math.min(1, f32[i])); + i16[i] = s < 0 ? s * 0x8000 : s * 0x7fff; + } + return { ptr, view: i16 }; +} + +function float32FromInt16View(i16) { + const out = new Float32Array(i16.length); + for (let i = 0; i < i16.length; ++i) out[i] = i16[i] / 32768; + return out; +} + // --------------------------- // Complete SimpleAEC implementation (exact from renderer.js) // ---------------------------