console.log("hello from emblemscanner worker"); // Load qrtool module first, then set WASM path // The wasmFilePath will be passed from the main thread when the worker is created let qrtool = require('./qrtool.wx.js'); if (typeof worker !== "undefined" && worker.wasmFilePath) { qrtool['setWasmPath'](worker.wasmFilePath); } var qrtool_ready = false; qrtool.onRuntimeInitialized = () => { console.log("emblemscanner qrtool ready"); qrtool_ready = true; worker.postMessage({ type: "ready", }); } var submit_message = null; function handle_frame(data, width, height, camera_sensitivity) { const begin = Date.now(); console.log(`handling frame ${width}x${height}, data is ${data.byteLength} bytes`); var uca = new Uint8ClampedArray(data); console.log(`first 4 bytes of uca: ${uca[0]}, ${uca[1]}, ${uca[2]}, ${uca[3]}`); var buf = qrtool._malloc(uca.length * uca.BYTES_PER_ELEMENT); qrtool.HEAPU8.set(uca, buf); var r = qrtool.ccall('qrtool_angle', 'string', ['number', 'number', 'number', 'number', 'number'], [buf, width, height, 0, camera_sensitivity]); qrtool._free(buf); console.log(`image ${width}x${height} processed in ${Date.now() - begin}ms, result: ${r}`); var res = JSON.parse(r); worker.postMessage({ type: "result", res, processing_time: Date.now() - begin, }); if (res.ok) { // Send raw image data back to main thread for data URL conversion // since we have no access to offscreen canvas in WASM worker submit_message = { type: "submit", res, image_data: { data, width, height }, }; } } worker.onMessage((msg) => { console.log("emblemscanner worker got message", msg.type); if (!qrtool_ready) { console.log("qrtool not ready"); worker.postMessage({ type: "result", res: { ok: false, err: "qrtool not ready", }, processing_time: 0, }); return; } switch (msg.type) { case "frame": try { const data = worker.getCameraFrameData(); if (data) { handle_frame(data, msg.width, msg.height, msg.camera_sensitivity); } else { worker.postMessage({ type: "result", res: { ok: false, err: "no frame data", }, }); } } catch (e) { worker.postMessage({ type: "result", res: { ok: false, err: `failed to handle frame: ${e.message}`, }, }); console.log(e); } break; case "ready_to_submit": worker.postMessage(submit_message); break; default: console.log("Unknown message type:", msg.type); } });