1'use strict'; 2(function(){ 3 let speedtestJs = 'speedtest1.js'; 4 const urlParams = new URL(self.location.href).searchParams; 5 if(urlParams.has('sqlite3.dir')){ 6 speedtestJs = urlParams.get('sqlite3.dir') + '/' + speedtestJs; 7 } 8 importScripts('common/whwasmutil.js', speedtestJs); 9 /** 10 If this environment contains OPFS, this function initializes it and 11 returns the name of the dir on which OPFS is mounted, else it returns 12 an empty string. 13 */ 14 const wasmfsDir = function f(wasmUtil){ 15 if(undefined !== f._) return f._; 16 const pdir = '/opfs'; 17 if( !self.FileSystemHandle 18 || !self.FileSystemDirectoryHandle 19 || !self.FileSystemFileHandle){ 20 return f._ = ""; 21 } 22 try{ 23 if(0===wasmUtil.xCallWrapped( 24 'sqlite3_wasm_init_wasmfs', 'i32', ['string'], pdir 25 )){ 26 return f._ = pdir; 27 }else{ 28 return f._ = ""; 29 } 30 }catch(e){ 31 // sqlite3_wasm_init_wasmfs() is not available 32 return f._ = ""; 33 } 34 }; 35 wasmfsDir._ = undefined; 36 37 const mPost = function(msgType,payload){ 38 postMessage({type: msgType, data: payload}); 39 }; 40 41 const App = Object.create(null); 42 App.logBuffer = []; 43 const logMsg = (type,msgArgs)=>{ 44 const msg = msgArgs.join(' '); 45 App.logBuffer.push(msg); 46 mPost(type,msg); 47 }; 48 const log = (...args)=>logMsg('stdout',args); 49 const logErr = (...args)=>logMsg('stderr',args); 50 51 const runSpeedtest = function(cliFlagsArray){ 52 const scope = App.wasm.scopedAllocPush(); 53 const dbFile = App.pDir+"/speedtest1.sqlite3"; 54 try{ 55 const argv = [ 56 "speedtest1.wasm", ...cliFlagsArray, dbFile 57 ]; 58 App.logBuffer.length = 0; 59 mPost('run-start', [...argv]); 60 App.wasm.xCall('wasm_main', argv.length, 61 App.wasm.scopedAllocMainArgv(argv)); 62 }catch(e){ 63 mPost('error',e.message); 64 }finally{ 65 App.wasm.scopedAllocPop(scope); 66 mPost('run-end', App.logBuffer.join('\n')); 67 App.logBuffer.length = 0; 68 } 69 }; 70 71 self.onmessage = function(msg){ 72 msg = msg.data; 73 switch(msg.type){ 74 case 'run': runSpeedtest(msg.data || []); break; 75 default: 76 logErr("Unhandled worker message type:",msg.type); 77 break; 78 } 79 }; 80 81 const EmscriptenModule = { 82 print: log, 83 printErr: logErr, 84 setStatus: (text)=>mPost('load-status',text) 85 }; 86 self.sqlite3InitModule(EmscriptenModule).then((sqlite3)=>{ 87 const S = sqlite3; 88 App.vfsUnlink = function(pDb, fname){ 89 const pVfs = S.wasm.sqlite3_wasm_db_vfs(pDb, 0); 90 if(pVfs) S.wasm.sqlite3_wasm_vfs_unlink(pVfs, fname||0); 91 }; 92 App.pDir = wasmfsDir(S.wasm); 93 App.wasm = S.wasm; 94 //if(App.pDir) log("Persistent storage:",pDir); 95 //else log("Using transient storage."); 96 mPost('ready',true); 97 log("Registered VFSes:", ...S.capi.sqlite3_js_vfs_list()); 98 }); 99})(); 100