• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}