1/* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16importScripts("trace_streamer_builtin.js", "TempSql.js"); 17self.onerror = function (error: any) { 18} 19let Module: any = null; 20let enc = new TextEncoder(); 21let dec = new TextDecoder(); 22let arr: Uint8Array; 23let start: number; 24const REQ_BUF_SIZE = 4 * 1024 * 1024; 25let reqBufferAddr:number = -1; 26let bufferSlice:Array<any> = [] 27let json:string; 28 29let headUnitArray:Uint8Array; 30let thirdWasmMap = new Map(); 31let thirdJsonResult = new Map(); 32 33function initWASM() { 34 return new Promise((resolve, reject) => { 35 // @ts-ignore 36 let wasm = trace_streamer_builtin_wasm 37 Module = wasm({ 38 locateFile: (s: any) => { 39 return s 40 }, 41 print: (line: any) => { 42 }, 43 printErr: (line: any) => { 44 }, 45 onRuntimeInitialized: () => { 46 resolve("ok"); 47 }, 48 onAbort: () => { 49 reject("on abort"); 50 } 51 }); 52 }) 53} 54 55function initThirdWASM(wasmFunctionName:string) { 56 function callModelFun(functionName: string) { 57 let func = eval(functionName); 58 return new func({ 59 locateFile: (s: any) => { 60 return s 61 }, 62 print: (line: any) => { 63 }, 64 printErr: (line: any) => { 65 }, 66 onRuntimeInitialized: () => { 67 }, 68 onAbort: () => { 69 } 70 }); 71 } 72 return callModelFun(wasmFunctionName) 73} 74 75let merged = ()=>{ 76 let length = 0; 77 bufferSlice.forEach(item => { 78 length += item.length; 79 }); 80 let mergedArray = new Uint8Array(length); 81 let offset = 0; 82 bufferSlice.forEach(item => { 83 mergedArray.set(item, offset); 84 offset += item.length; 85 }); 86 return mergedArray; 87} 88let convertJSON = ()=>{ 89 let str = dec.decode(arr); 90 let jsonArray = []; 91 str = str.substring(str.indexOf("\n") + 1); 92 if (!str) { 93 }else{ 94 let parse = JSON.parse(str); 95 let columns = parse.columns; 96 let values = parse.values; 97 for (let i = 0; i < values.length; i++) { 98 let obj: any = {} 99 for (let j = 0; j < columns.length; j++) { 100 obj[columns[j]] = values[i][j] 101 } 102 jsonArray.push(obj) 103 } 104 } 105 return jsonArray; 106} 107self.onmessage = async (e: MessageEvent) => { 108 if (e.data.action === "open") { 109 await initWASM(); 110 // @ts-ignore 111 self.postMessage({id: e.data.id, action: e.data.action, ready: true, index: 0}); 112 let uint8Array = new Uint8Array(e.data.buffer); 113 let callback = (heapPtr: number, size: number, isEnd: number) => { 114 let out:Uint8Array = Module.HEAPU8.slice(heapPtr, heapPtr + size); 115 bufferSlice.push(out); 116 if(isEnd == 1){ 117 arr = merged(); 118 bufferSlice.length = 0; 119 } 120 } 121 let fn = Module.addFunction(callback, "viii"); 122 reqBufferAddr = Module._Initialize(fn, REQ_BUF_SIZE); 123 let wasmConfigStr = e.data.wasmConfig 124 if (wasmConfigStr != "") { 125 let wasmConfig = JSON.parse(wasmConfigStr); 126 let wasmConfigs = wasmConfig.WasmFiles 127 let itemArray = wasmConfigs.map((item:any) => {return item.componentId + ";" + item.pluginName}) 128 let thirdWasmStr: string = itemArray.join(";") 129 let configUintArray = enc.encode(thirdWasmStr + ";"); 130 Module.HEAPU8.set(configUintArray, reqBufferAddr); 131 Module._TraceStreamer_Init_ThirdParty_Config(configUintArray.length); 132 let first = true; 133 let sendDataCallback = (heapPtr: number, size: number, componentID: number) => { 134 if (componentID == 100) { 135 if (first) { 136 first = false; 137 headUnitArray = Module.HEAPU8.slice(heapPtr, heapPtr + size); 138 } 139 return; 140 } 141 let configs = wasmConfigs.filter((wasmConfig: any) => { 142 return wasmConfig.componentId == componentID; 143 }) 144 if (configs.length > 0) { 145 let config = configs[0]; 146 let model = thirdWasmMap.get(componentID) 147 if (model == null && config.componentId == componentID) { 148 importScripts(config.wasmJsName) 149 let thirdMode = initThirdWASM(config.wasmName) 150 let thirdQueryDataCallBack = (heapPtr: number, size: number, isEnd: number, isConfig: number) => { 151 if (isConfig == 1) { 152 let out: Uint8Array = thirdMode.HEAPU8.slice(heapPtr, heapPtr + size); 153 thirdJsonResult.set(componentID, dec.decode(out)) 154 } else { 155 let out: Uint8Array = thirdMode.HEAPU8.slice(heapPtr, heapPtr + size); 156 bufferSlice.push(out); 157 if (isEnd == 1) { 158 arr = merged(); 159 bufferSlice.length = 0; 160 } 161 } 162 } 163 let fn = thirdMode.addFunction(thirdQueryDataCallBack, "viiii"); 164 let thirdreqBufferAddr = thirdMode._Init(fn, REQ_BUF_SIZE) 165 let updateTraceTimeCallBack = (heapPtr: number, size: number) => { 166 let out: Uint8Array = thirdMode.HEAPU8.slice(heapPtr, heapPtr + size); 167 Module.HEAPU8.set(out, reqBufferAddr); 168 Module._UpdateTraceTime(out.length); 169 } 170 let traceRangeFn = thirdMode.addFunction(updateTraceTimeCallBack, "vii"); 171 let mm = thirdMode._InitTraceRange(traceRangeFn, 1024) 172 thirdMode._TraceStreamer_In_JsonConfig(); 173 thirdMode.HEAPU8.set(headUnitArray, thirdreqBufferAddr); 174 thirdMode._ParserData(headUnitArray.length, 100); 175 let out: Uint8Array = Module.HEAPU8.slice(heapPtr, heapPtr + size); 176 thirdMode.HEAPU8.set(out, thirdreqBufferAddr); 177 thirdMode._ParserData(out.length, componentID); 178 thirdWasmMap.set(componentID, {"model": thirdMode, "bufferAddr":thirdreqBufferAddr}) 179 } else { 180 let mm = model.model 181 let out: Uint8Array = Module.HEAPU8.slice(heapPtr, heapPtr + size); 182 mm.HEAPU8.set(out, model.bufferAddr); 183 mm._ParserData(out.length, componentID); 184 } 185 } 186 } 187 let fn1 = Module.addFunction(sendDataCallback, "viii"); 188 let reqBufferAddr1 = Module._TraceStreamer_Set_ThirdParty_DataDealer(fn1, REQ_BUF_SIZE); 189 } 190 let wrSize = 0; 191 let r2 = -1; 192 while (wrSize < uint8Array.length) { 193 const sliceLen = Math.min(uint8Array.length - wrSize, REQ_BUF_SIZE); 194 const dataSlice = uint8Array.subarray(wrSize, wrSize + sliceLen); 195 Module.HEAPU8.set(dataSlice, reqBufferAddr); 196 wrSize += sliceLen; 197 r2 = Module._TraceStreamerParseDataEx(sliceLen); 198 if (r2 == -1) { 199 break; 200 } 201 } 202 Module._TraceStreamerParseDataOver(); 203 for (let value of thirdWasmMap.values()) { 204 value.model._TraceStreamer_In_ParseDataOver(); 205 } 206 if (r2 == -1) { 207 // @ts-ignore 208 self.postMessage({id: e.data.id, action: e.data.action, init: false, msg: "parse data error"}); 209 return; 210 } 211 // @ts-ignore 212 temp_init_sql_list.forEach((item, index) => { 213 let r = createView(item); 214 // @ts-ignore 215 self.postMessage({id: e.data.id, ready: true, index: index + 1}); 216 }); 217 // @ts-ignore 218 self.postMessage({id: e.data.id, action: e.data.action, init: true, msg: "ok", configSqlMap:thirdJsonResult, buffer: e.data.buffer}, [e.data.buffer]); 219 } else if (e.data.action === "exec") { 220 query(e.data.name, e.data.sql, e.data.params); 221 let jsonArray = convertJSON(); 222 // @ts-ignore 223 self.postMessage({id: e.data.id, action: e.data.action, results: jsonArray}); 224 } else if (e.data.action == "exec-buf") { 225 query(e.data.name, e.data.sql, e.data.params); 226 // @ts-ignore 227 self.postMessage({id: e.data.id, action: e.data.action, results: arr.buffer}, [arr.buffer]); 228 } else if (e.data.action.startsWith("exec-sdk")) { 229 querySdk(e.data.name, e.data.sql, e.data.params, e.data.action); 230 let jsonArray = convertJSON(); 231 // @ts-ignore 232 self.postMessage({id: e.data.id, action: e.data.action, results: jsonArray}); 233 } 234} 235 236function createView(sql: string) { 237 let enc = new TextEncoder(); 238 let sqlPtr = Module._malloc(sql.length); 239 Module.HEAPU8.set(enc.encode(sql), sqlPtr); 240 let res = Module._TraceStreamerSqlOperate(sqlPtr, sql.length); 241 return res; 242} 243 244function queryJSON(name: string, sql: string, params: any) { 245 query(name,sql,params); 246 return convertJSON(); 247} 248 249function query(name: string, sql: string, params: any) { 250 if (params) { 251 Reflect.ownKeys(params).forEach((key: any) => { 252 if (typeof params[key] === "string") { 253 sql = sql.replace(new RegExp(`\\${key}`, "g"), `'${params[key]}'`); 254 } else { 255 sql = sql.replace(new RegExp(`\\${key}`, "g"), params[key]); 256 } 257 }); 258 } 259 start = new Date().getTime(); 260 let sqlUintArray = enc.encode(sql); 261 Module.HEAPU8.set(sqlUintArray, reqBufferAddr); 262 Module._TraceStreamerSqlQueryEx(sqlUintArray.length); 263} 264 265function querySdk(name: string, sql: string, params: any, action: string) { 266 if (params) { 267 Reflect.ownKeys(params).forEach((key: any) => { 268 if (typeof params[key] === "string") { 269 sql = sql.replace(new RegExp(`\\${key}`, "g"), `'${params[key]}'`); 270 } else { 271 sql = sql.replace(new RegExp(`\\${key}`, "g"), params[key]); 272 } 273 }); 274 } 275 let sqlUintArray = enc.encode(sql); 276 let commentId = action.substring(action.lastIndexOf("-") + 1) 277 let key = Number(commentId) 278 let wasm = thirdWasmMap.get(key); 279 let wasmModel = wasm.model 280 wasmModel.HEAPU8.set(sqlUintArray, wasm.bufferAddr); 281 wasmModel._TraceStreamerSqlQueryEx(sqlUintArray.length); 282}