Add tests for the new code on this branch.
[sqlite.git] / ext / wasm / speedtest1-worker.js
blob5261c839327dd0516e07d4c5896fd9c0e4bf3e26
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(speedtestJs);
9   /**
10      If this build includes WASMFS, this function initializes it and
11      returns the name of the dir on which OPFS is mounted, else it
12      returns 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;
37   const mPost = function(msgType,payload){
38     postMessage({type: msgType, data: payload});
39   };
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   const realSahName = 'opfs-sahpool-speedtest1';
52   const runSpeedtest = async function(cliFlagsArray){
53     const scope = App.wasm.scopedAllocPush();
54     const dbFile = App.pDir+"/speedtest1.sqlite3";
55     try{
56       const argv = [
57         "speedtest1.wasm", ...cliFlagsArray, dbFile
58       ];
59       App.logBuffer.length = 0;
60       const ndxSahPool = argv.indexOf('opfs-sahpool');
61       if(ndxSahPool>0){
62         argv[ndxSahPool] = realSahName;
63         log("Updated argv for opfs-sahpool: --vfs",realSahName);
64       }
65       mPost('run-start', [...argv]);
66       if(App.sqlite3.installOpfsSAHPoolVfs
67          && !App.sqlite3.$SAHPoolUtil
68          && ndxSahPool>0){
69         log("Installing opfs-sahpool as",realSahName,"...");
70         await App.sqlite3.installOpfsSAHPoolVfs({
71           name: realSahName,
72           initialCapacity: 3,
73           clearOnInit: true,
74           verbosity: 2
75         }).then(PoolUtil=>{
76           log("opfs-sahpool successfully installed as",PoolUtil.vfsName);
77           App.sqlite3.$SAHPoolUtil = PoolUtil;
78           //console.log("sqlite3.oo1.OpfsSAHPoolDb =", App.sqlite3.oo1.OpfsSAHPoolDb);
79         });
80       }
81       App.wasm.xCall('wasm_main', argv.length,
82                      App.wasm.scopedAllocMainArgv(argv));
83     }catch(e){
84       mPost('error',e.message);
85     }finally{
86       App.wasm.scopedAllocPop(scope);
87       mPost('run-end', App.logBuffer.join('\n'));
88       App.logBuffer.length = 0;
89     }
90   };
92   self.onmessage = function(msg){
93     msg = msg.data;
94     switch(msg.type){
95         case 'run':
96           runSpeedtest(msg.data || [])
97             .catch(e=>mPost('error',e));
98           break;
99         default:
100           logErr("Unhandled worker message type:",msg.type);
101           break;
102     }
103   };
105   const EmscriptenModule = {
106     print: log,
107     printErr: logErr,
108     setStatus: (text)=>mPost('load-status',text)
109   };
110   log("Initializing speedtest1 module...");
111   self.sqlite3InitModule(EmscriptenModule).then(async (sqlite3)=>{
112     const S = globalThis.S = App.sqlite3 = sqlite3;
113     log("Loaded speedtest1 module. Setting up...");
114     App.pDir = wasmfsDir(S.wasm);
115     App.wasm = S.wasm;
116     //if(App.pDir) log("Persistent storage:",pDir);
117     //else log("Using transient storage.");
118     mPost('ready',true);
119     log("Registered VFSes:", ...S.capi.sqlite3_js_vfs_list());
120   }).catch(e=>{
121     logErr(e);
122   });
123 })();