modern-barcode-scanner 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/assets/scanner.worker-CGMv7Aye.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +235 -218
- package/dist/index.js.map +1 -1
- package/package.json +9 -4
package/README.md
CHANGED
|
@@ -95,6 +95,21 @@ function App() {
|
|
|
95
95
|
}
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
+
### WebAssembly (WASM) Configuration
|
|
99
|
+
|
|
100
|
+
Under the hood, this library uses `@undecaf/zbar-wasm` which relies on WebAssembly. Depending on your bundler, you may need to explicitly exclude it from dependency optimization or configure it to serve `.wasm` files correctly.
|
|
101
|
+
|
|
102
|
+
**Vite Example (`vite.config.ts`):**
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
export default defineConfig({
|
|
106
|
+
// ... other config
|
|
107
|
+
optimizeDeps: {
|
|
108
|
+
exclude: ['@undecaf/zbar-wasm']
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
98
113
|
---
|
|
99
114
|
|
|
100
115
|
## 📖 API Reference
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.worker-CGMv7Aye.js","sources":["../node_modules/@undecaf/zbar-wasm/dist/index.mjs","../src/utils/barcodeHelpers.ts","../src/workers/scanner.worker.ts"],"sourcesContent":["function t(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{c(r.next(t))}catch(t){o(t)}}function a(t){try{c(r.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}c((r=r.apply(t,e||[])).next())}))}\"function\"==typeof SuppressedError&&SuppressedError;var e,n=(e=import.meta.url,async function(t={}){var n,r,i=t;i.ready=new Promise(((t,e)=>{n=t,r=e}));var o,s,a,c=Object.assign({},i),_=\"object\"==typeof window,u=\"function\"==typeof importScripts,A=\"object\"==typeof process&&\"object\"==typeof process.versions&&\"string\"==typeof process.versions.node,f=\"\";if(A){const{createRequire:t}=await Promise.resolve().then((()=>g));var h=t(import.meta.url),l=h(\"fs\"),R=h(\"path\");f=u?R.dirname(f)+\"/\":h(\"url\").fileURLToPath(new URL(\"./\",import.meta.url)),o=(t,e)=>(t=U(t)?new URL(t):R.normalize(t),l.readFileSync(t,e?void 0:\"utf8\")),a=t=>{var e=o(t,!0);return e.buffer||(e=new Uint8Array(e)),e},s=(t,e,n,r=!0)=>{t=U(t)?new URL(t):R.normalize(t),l.readFile(t,r?void 0:\"utf8\",((t,i)=>{t?n(t):e(r?i.buffer:i)}))},!i.thisProgram&&process.argv.length>1&&process.argv[1].replace(/\\\\/g,\"/\"),process.argv.slice(2),i.inspect=()=>\"[Emscripten Module object]\"}else(_||u)&&(u?f=self.location.href:\"undefined\"!=typeof document&&document.currentScript&&(f=document.currentScript.src),e&&(f=e),f=0!==f.indexOf(\"blob:\")?f.substr(0,f.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):\"\",o=t=>{var e=new XMLHttpRequest;return e.open(\"GET\",t,!1),e.send(null),e.responseText},u&&(a=t=>{var e=new XMLHttpRequest;return e.open(\"GET\",t,!1),e.responseType=\"arraybuffer\",e.send(null),new Uint8Array(e.response)}),s=(t,e,n)=>{var r=new XMLHttpRequest;r.open(\"GET\",t,!0),r.responseType=\"arraybuffer\",r.onload=()=>{200==r.status||0==r.status&&r.response?e(r.response):n()},r.onerror=n,r.send(null)});var d,m,p,y=i.print||console.log.bind(console),B=i.printErr||console.error.bind(console);Object.assign(i,c),c=null,i.arguments&&i.arguments,i.thisProgram&&i.thisProgram,i.quit&&i.quit,i.wasmBinary&&(d=i.wasmBinary),i.noExitRuntime,\"object\"!=typeof WebAssembly&&P(\"no native wasm support detected\");var E,I,Z=!1;function v(){var t=m.buffer;i.HEAP8=new Int8Array(t),i.HEAP16=new Int16Array(t),i.HEAP32=new Int32Array(t),i.HEAPU8=E=new Uint8Array(t),i.HEAPU16=new Uint16Array(t),i.HEAPU32=I=new Uint32Array(t),i.HEAPF32=new Float32Array(t),i.HEAPF64=new Float64Array(t)}var b=[],C=[],N=[],S=0,w=null;function P(t){i.onAbort&&i.onAbort(t),B(t=\"Aborted(\"+t+\")\"),Z=!0,t+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(t);throw r(e),e}var T,O,D=\"data:application/octet-stream;base64,\";function F(t){return t.startsWith(D)}function U(t){return t.startsWith(\"file://\")}function H(t){if(t==T&&d)return new Uint8Array(d);if(a)return a(t);throw\"both async and sync fetching of the wasm failed\"}function G(t,e,n){return function(t){if(!d&&(_||u)){if(\"function\"==typeof fetch&&!U(t))return fetch(t,{credentials:\"same-origin\"}).then((e=>{if(!e.ok)throw\"failed to load wasm binary file at '\"+t+\"'\";return e.arrayBuffer()})).catch((()=>H(t)));if(s)return new Promise(((e,n)=>{s(t,(t=>e(new Uint8Array(t))),n)}))}return Promise.resolve().then((()=>H(t)))}(t).then((t=>WebAssembly.instantiate(t,e))).then((t=>t)).then(n,(t=>{B(\"failed to asynchronously prepare wasm: \"+t),P(t)}))}i.locateFile?F(T=\"zbar.wasm\")||(O=T,T=i.locateFile?i.locateFile(O,f):f+O):T=new URL(\"zbar.wasm\",import.meta.url).href;var L,M=t=>{for(;t.length>0;)t.shift()(i)},x=t=>{var e=t-m.buffer.byteLength+65535>>>16;try{return m.grow(e),v(),1}catch(t){}},W=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,k=[null,[],[]],Y=(t,e)=>{var n=k[t];0===e||10===e?((1===t?y:B)(((t,e,n)=>{for(var r=e+n,i=e;t[i]&&!(i>=r);)++i;if(i-e>16&&t.buffer&&W)return W.decode(t.subarray(e,i));for(var o=\"\";e<i;){var s=t[e++];if(128&s){var a=63&t[e++];if(192!=(224&s)){var c=63&t[e++];if((s=224==(240&s)?(15&s)<<12|a<<6|c:(7&s)<<18|a<<12|c<<6|63&t[e++])<65536)o+=String.fromCharCode(s);else{var _=s-65536;o+=String.fromCharCode(55296|_>>10,56320|1023&_)}}else o+=String.fromCharCode((31&s)<<6|a)}else o+=String.fromCharCode(s)}return o})(n,0)),n.length=0):n.push(e)},j={d:()=>!0,e:function(){return Date.now()},c:t=>{var e=E.length,n=2147483648;if((t>>>=0)>n)return!1;for(var r,i,o=1;o<=4;o*=2){var s=e*(1+.2/o);s=Math.min(s,t+100663296);var a=Math.min(n,(r=Math.max(t,s))+((i=65536)-r%i)%i);if(x(a))return!0}return!1},f:t=>52,b:function(t,e,n,r,i){return 70},a:(t,e,n,r)=>{for(var i=0,o=0;o<n;o++){var s=I[e>>2],a=I[e+4>>2];e+=8;for(var c=0;c<a;c++)Y(t,E[s+c]);i+=a}return I[r>>2]=i,0}};function q(){function t(){L||(L=!0,i.calledRun=!0,Z||(M(C),n(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),function(){if(i.postRun)for(\"function\"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;)t=i.postRun.shift(),N.unshift(t);var t;M(N)}()))}S>0||(function(){if(i.preRun)for(\"function\"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)t=i.preRun.shift(),b.unshift(t);var t;M(b)}(),S>0||(i.setStatus?(i.setStatus(\"Running...\"),setTimeout((function(){setTimeout((function(){i.setStatus(\"\")}),1),t()}),1)):t()))}if(function(){var t,e,n,o,s={a:j};function a(t,e){var n,r=t.exports;return m=(p=r).g,v(),p.s,n=p.h,C.unshift(n),function(t){if(S--,i.monitorRunDependencies&&i.monitorRunDependencies(S),0==S&&w){var e=w;w=null,e()}}(),r}if(S++,i.monitorRunDependencies&&i.monitorRunDependencies(S),i.instantiateWasm)try{return i.instantiateWasm(s,a)}catch(t){B(\"Module.instantiateWasm callback failed with error: \"+t),r(t)}(t=d,e=T,n=s,o=function(t){a(t.instance)},t||\"function\"!=typeof WebAssembly.instantiateStreaming||F(e)||U(e)||A||\"function\"!=typeof fetch?G(e,n,o):fetch(e,{credentials:\"same-origin\"}).then((t=>WebAssembly.instantiateStreaming(t,n).then(o,(function(t){return B(\"wasm streaming compile failed: \"+t),B(\"falling back to ArrayBuffer instantiation\"),G(e,n,o)}))))).catch(r)}(),i._ImageScanner_create=()=>(i._ImageScanner_create=p.i)(),i._ImageScanner_destory=t=>(i._ImageScanner_destory=p.j)(t),i._ImageScanner_set_config=(t,e,n,r)=>(i._ImageScanner_set_config=p.k)(t,e,n,r),i._ImageScanner_enable_cache=(t,e)=>(i._ImageScanner_enable_cache=p.l)(t,e),i._ImageScanner_recycle_image=(t,e)=>(i._ImageScanner_recycle_image=p.m)(t,e),i._ImageScanner_get_results=t=>(i._ImageScanner_get_results=p.n)(t),i._ImageScanner_scan=(t,e)=>(i._ImageScanner_scan=p.o)(t,e),i._Image_create=(t,e,n,r,o,s)=>(i._Image_create=p.p)(t,e,n,r,o,s),i._Image_destory=t=>(i._Image_destory=p.q)(t),i._Image_get_symbols=t=>(i._Image_get_symbols=p.r)(t),i._free=t=>(i._free=p.t)(t),i._malloc=t=>(i._malloc=p.u)(t),w=function t(){L||q(),L||(w=t)},i.preInit)for(\"function\"==typeof i.preInit&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return q(),t.ready});let r;function i(e={}){r=function(){return t(this,void 0,void 0,(function*(){const t=yield n(e);if(t)return t;throw Error(\"WASM was not loaded\")}))}()}function o(){return t(this,void 0,void 0,(function*(){return r||i(),yield r}))}var s,a,c;!function(t){t[t.ZBAR_NONE=0]=\"ZBAR_NONE\",t[t.ZBAR_PARTIAL=1]=\"ZBAR_PARTIAL\",t[t.ZBAR_EAN2=2]=\"ZBAR_EAN2\",t[t.ZBAR_EAN5=5]=\"ZBAR_EAN5\",t[t.ZBAR_EAN8=8]=\"ZBAR_EAN8\",t[t.ZBAR_UPCE=9]=\"ZBAR_UPCE\",t[t.ZBAR_ISBN10=10]=\"ZBAR_ISBN10\",t[t.ZBAR_UPCA=12]=\"ZBAR_UPCA\",t[t.ZBAR_EAN13=13]=\"ZBAR_EAN13\",t[t.ZBAR_ISBN13=14]=\"ZBAR_ISBN13\",t[t.ZBAR_COMPOSITE=15]=\"ZBAR_COMPOSITE\",t[t.ZBAR_I25=25]=\"ZBAR_I25\",t[t.ZBAR_DATABAR=34]=\"ZBAR_DATABAR\",t[t.ZBAR_DATABAR_EXP=35]=\"ZBAR_DATABAR_EXP\",t[t.ZBAR_CODABAR=38]=\"ZBAR_CODABAR\",t[t.ZBAR_CODE39=39]=\"ZBAR_CODE39\",t[t.ZBAR_PDF417=57]=\"ZBAR_PDF417\",t[t.ZBAR_QRCODE=64]=\"ZBAR_QRCODE\",t[t.ZBAR_SQCODE=80]=\"ZBAR_SQCODE\",t[t.ZBAR_CODE93=93]=\"ZBAR_CODE93\",t[t.ZBAR_CODE128=128]=\"ZBAR_CODE128\",t[t.ZBAR_SYMBOL=255]=\"ZBAR_SYMBOL\",t[t.ZBAR_ADDON2=512]=\"ZBAR_ADDON2\",t[t.ZBAR_ADDON5=1280]=\"ZBAR_ADDON5\",t[t.ZBAR_ADDON=1792]=\"ZBAR_ADDON\"}(s||(s={})),function(t){t[t.ZBAR_CFG_ENABLE=0]=\"ZBAR_CFG_ENABLE\",t[t.ZBAR_CFG_ADD_CHECK=1]=\"ZBAR_CFG_ADD_CHECK\",t[t.ZBAR_CFG_EMIT_CHECK=2]=\"ZBAR_CFG_EMIT_CHECK\",t[t.ZBAR_CFG_ASCII=3]=\"ZBAR_CFG_ASCII\",t[t.ZBAR_CFG_BINARY=4]=\"ZBAR_CFG_BINARY\",t[t.ZBAR_CFG_NUM=5]=\"ZBAR_CFG_NUM\",t[t.ZBAR_CFG_MIN_LEN=32]=\"ZBAR_CFG_MIN_LEN\",t[t.ZBAR_CFG_MAX_LEN=33]=\"ZBAR_CFG_MAX_LEN\",t[t.ZBAR_CFG_UNCERTAINTY=64]=\"ZBAR_CFG_UNCERTAINTY\",t[t.ZBAR_CFG_POSITION=128]=\"ZBAR_CFG_POSITION\",t[t.ZBAR_CFG_TEST_INVERTED=129]=\"ZBAR_CFG_TEST_INVERTED\",t[t.ZBAR_CFG_X_DENSITY=256]=\"ZBAR_CFG_X_DENSITY\",t[t.ZBAR_CFG_Y_DENSITY=257]=\"ZBAR_CFG_Y_DENSITY\"}(a||(a={})),function(t){t[t.ZBAR_ORIENT_UNKNOWN=-1]=\"ZBAR_ORIENT_UNKNOWN\",t[t.ZBAR_ORIENT_UP=0]=\"ZBAR_ORIENT_UP\",t[t.ZBAR_ORIENT_RIGHT=1]=\"ZBAR_ORIENT_RIGHT\",t[t.ZBAR_ORIENT_DOWN=2]=\"ZBAR_ORIENT_DOWN\",t[t.ZBAR_ORIENT_LEFT=3]=\"ZBAR_ORIENT_LEFT\"}(c||(c={}));class _{constructor(t,e){this.ptr=t,this.inst=e}checkAlive(){if(!this.ptr)throw Error(\"Call after destroyed\")}getPointer(){return this.checkAlive(),this.ptr}}class u{constructor(t,e){this.ptr=t,this.ptr32=t>>2,this.buf=e,this.HEAP8=new Int8Array(e),this.HEAPU32=new Uint32Array(e),this.HEAP32=new Int32Array(e)}}class A extends u{get type(){return this.HEAPU32[this.ptr32]}get data(){const t=this.HEAPU32[this.ptr32+4],e=this.HEAPU32[this.ptr32+5];return Int8Array.from(this.HEAP8.subarray(e,e+t))}get points(){const t=this.HEAPU32[this.ptr32+7],e=this.HEAPU32[this.ptr32+8]>>2,n=[];for(let r=0;r<t;++r){const t=this.HEAP32[e+2*r],i=this.HEAP32[e+2*r+1];n.push({x:t,y:i})}return n}get orientation(){return this.HEAP32[this.ptr32+9]}get next(){const t=this.HEAPU32[this.ptr32+11];return t?new A(t,this.buf):null}get time(){return this.HEAPU32[this.ptr32+13]}get cacheCount(){return this.HEAP32[this.ptr32+14]}get quality(){return this.HEAP32[this.ptr32+15]}}class f extends u{get head(){const t=this.HEAPU32[this.ptr32+2];return t?new A(t,this.buf):null}}class h{constructor(t){this.type=t.type,this.typeName=s[this.type],this.data=t.data,this.points=t.points,this.orientation=t.orientation,this.time=t.time,this.cacheCount=t.cacheCount,this.quality=t.quality}static createSymbolsFromPtr(t,e){if(0==t)return[];let n=new f(t,e).head;const r=[];for(;null!==n;)r.push(new h(n)),n=n.next;return r}decode(t){return new TextDecoder(t).decode(this.data)}}class l extends _{static createFromGrayBuffer(e,n,r,i=0){return t(this,void 0,void 0,(function*(){const t=yield o(),s=new Uint8Array(r),a=e*n;if(a!==s.byteLength)throw Error(`data length (${s.byteLength} bytes) does not match width and height (${a} bytes)`);const c=t._malloc(a);t.HEAPU8.set(s,c);return new this(t._Image_create(e,n,808466521,c,a,i),t)}))}static createFromRGBABuffer(e,n,r,i=0){return t(this,void 0,void 0,(function*(){const t=yield o(),s=new Uint8Array(r),a=e*n;if(4*a!==s.byteLength)throw Error(`data length (${s.byteLength} bytes) does not match width and height (${4*a} bytes)`);const c=t._malloc(a),_=c+a,u=t.HEAPU8;for(let t=c,e=0;t<_;t++,e+=4)u[t]=19595*s[e]+38469*s[e+1]+7472*s[e+2]>>16;return new this(t._Image_create(e,n,808466521,c,a,i),t)}))}destroy(){this.checkAlive(),this.inst._Image_destory(this.ptr),this.ptr=0}getSymbols(){this.checkAlive();const t=this.inst._Image_get_symbols(this.ptr);return h.createSymbolsFromPtr(t,this.inst.HEAPU8.buffer)}}class R extends _{static create(){return t(this,void 0,void 0,(function*(){const t=yield o();return new this(t._ImageScanner_create(),t)}))}destroy(){this.checkAlive(),this.inst._ImageScanner_destory(this.ptr),this.ptr=0}setConfig(t,e,n){return this.checkAlive(),this.inst._ImageScanner_set_config(this.ptr,t,e,n)}enableCache(t=!0){this.checkAlive(),this.inst._ImageScanner_enable_cache(this.ptr,t)}recycleImage(t){this.checkAlive(),this.inst._ImageScanner_recycle_image(this.ptr,t.getPointer())}getResults(){this.checkAlive();const t=this.inst._ImageScanner_get_results(this.ptr);return h.createSymbolsFromPtr(t,this.inst.HEAPU8.buffer)}scan(t){return this.checkAlive(),this.inst._ImageScanner_scan(this.ptr,t.getPointer())}}const d=()=>t(void 0,void 0,void 0,(function*(){const t=yield R.create();return t.setConfig(s.ZBAR_NONE,a.ZBAR_CFG_BINARY,1),t}));let m;const p=(e,n)=>t(void 0,void 0,void 0,(function*(){void 0===n&&(n=m||(yield d()),m=n);const t=n.scan(e);if(t<0)throw Error(\"Scan Failed\");return 0===t?[]:e.getSymbols()})),y=(e,n,r,i)=>t(void 0,void 0,void 0,(function*(){const t=yield l.createFromGrayBuffer(n,r,e),o=yield p(t,i);return t.destroy(),o})),B=(e,n,r,i)=>t(void 0,void 0,void 0,(function*(){const t=yield l.createFromRGBABuffer(n,r,e),o=yield p(t,i);return t.destroy(),o})),E=(e,n)=>t(void 0,void 0,void 0,(function*(){return yield B(e.data.buffer,e.width,e.height,n)})),g=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:\"Module\"}));export{a as ZBarConfigType,l as ZBarImage,c as ZBarOrientation,R as ZBarScanner,h as ZBarSymbol,s as ZBarSymbolType,d as getDefaultScanner,o as getInstance,y as scanGrayBuffer,E as scanImageData,B as scanRGBABuffer,i as setModuleArgs};\n//# sourceMappingURL=index.mjs.map\n","/**\n * Utility functions for barcode scanning and camera management\n * @module barcodeHelpers\n */\n\nimport {\n CAMERA_DEFAULTS,\n DESKTOP_CAMERA_SETTINGS,\n FACING_MODE,\n type FacingMode,\n MOBILE_CAMERA_SETTINGS,\n STORAGE_KEY_CAMERA_ID,\n ZOOM_LEVELS,\n} from \"../constants/camera\";\n\n/**\n * Detect if the current device is a mobile phone or tablet\n * @returns True if device is a phone/tablet\n */\nexport const isPhone = (): boolean => /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);\n\n/**\n * Convert color image data to grayscale using luminosity method\n * Optimized for performance using bitwise operations\n * @param imageData - Canvas ImageData object to convert\n * @returns Modified ImageData with grayscale values\n */\nexport const convertToGrayscale = (imageData: ImageData): ImageData => {\n const data = imageData.data;\n const len = data.length;\n\n // Optimized grayscale conversion using luminosity method\n // More accurate than simple average and uses bitwise operations for speed\n for (let i = 0; i < len; i += 4) {\n // Luminosity method: 0.299*R + 0.587*G + 0.114*B\n // Using bit shifts for faster multiplication approximation\n const gray = (data[i] * 77 + data[i + 1] * 150 + data[i + 2] * 29) >> 8;\n data[i] = gray;\n data[i + 1] = gray;\n data[i + 2] = gray;\n // Alpha channel (data[i + 3]) remains unchanged\n }\n return imageData;\n};\n\n/**\n * Determine the best rear camera for scanning based on various criteria\n * Prioritizes: main/wide camera > torch support > highest resolution\n * Works across Android and iOS devices with multiple cameras\n * @returns Device ID of the best rear camera or null\n */\nexport const getBestRearCamera = async (): Promise<string | null> => {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n\n if (videoDevices.length === 0) return null;\n\n let bestCamera: string | null = null;\n let bestScore = -1;\n\n for (const device of videoDevices) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { deviceId: { exact: device.deviceId } },\n });\n\n const videoTrack = stream.getVideoTracks()[0];\n const capabilities = videoTrack.getCapabilities() as MediaTrackCapabilities & {\n torch?: boolean;\n };\n const settings = videoTrack.getSettings();\n\n // Stop the stream immediately\n for (const track of stream.getTracks()) {\n track.stop();\n }\n\n // Skip front-facing cameras\n if (settings.facingMode === \"user\") continue;\n\n let score = 0;\n const label = device.label.toLowerCase();\n\n // Priority 1: Identify main/wide camera by label (highest priority)\n // iOS: \"back camera\" or \"wide\" or \"camera 0\"\n // Android: \"camera 0\" or \"back camera\" or \"main camera\"\n if (\n label.includes(\"back camera\") &&\n !label.includes(\"ultra\") &&\n !label.includes(\"telephoto\")\n ) {\n score += 100;\n } else if (label.includes(\"wide\") && !label.includes(\"ultra\")) {\n score += 100;\n } else if (label.match(/camera\\s*0|main/i)) {\n score += 100;\n }\n\n // Priority 2: Torch/flash capability (strong indicator of main camera)\n if (capabilities.torch) {\n score += 50;\n }\n\n // Priority 3: Resolution (higher is better for scanning)\n if (capabilities.width?.max) {\n score += Math.min(capabilities.width.max / 100, 30); // Cap at 30 points\n }\n\n // Priority 4: Prefer environment facing mode\n if (settings.facingMode === \"environment\") {\n score += 20;\n }\n\n // Penalty: Avoid ultra-wide and telephoto cameras\n if (label.includes(\"ultra\") || label.includes(\"telephoto\") || label.includes(\"tele\")) {\n score -= 50;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCamera = device.deviceId;\n }\n } catch {\n // Camera not accessible, skip it\n console.warn(`Could not access camera: ${device.label}`);\n }\n }\n\n return bestCamera;\n};\n\n/**\n * Get best rear camera ID from localStorage or detect it\n * Caches the result in localStorage for future use\n * @returns Cached or newly detected camera ID\n */\nexport const getAndSetCameraIdWithFlash = async (): Promise<string | null> => {\n let cameraId = localStorage.getItem(STORAGE_KEY_CAMERA_ID);\n if (!cameraId) {\n cameraId = await getBestRearCamera();\n if (cameraId) {\n localStorage.setItem(STORAGE_KEY_CAMERA_ID, cameraId);\n }\n }\n return cameraId;\n};\n\n/**\n * Get optimized media constraints for camera access\n * Automatically adjusts settings based on device type and facing mode\n * @param facingMode - Camera facing mode ('user' or 'environment')\n * @returns Media constraints object\n */\nexport const getMediaConstraints = async (\n facingMode: FacingMode,\n): Promise<MediaStreamConstraints> => {\n const baseSettings = isPhone() ? MOBILE_CAMERA_SETTINGS : DESKTOP_CAMERA_SETTINGS;\n\n const customConstraints: MediaStreamConstraints = {\n audio: false,\n video: {\n ...baseSettings,\n ...CAMERA_DEFAULTS,\n facingMode,\n zoom: facingMode === FACING_MODE.USER ? ZOOM_LEVELS.FRONT : ZOOM_LEVELS.BACK,\n } as MediaTrackConstraints,\n };\n\n // For back camera on mobile, try to use camera with flash\n if (facingMode === FACING_MODE.ENVIRONMENT && isPhone()) {\n const cameraId = await getAndSetCameraIdWithFlash();\n if (cameraId && customConstraints.video && typeof customConstraints.video === \"object\") {\n (customConstraints.video as MediaTrackConstraints).deviceId = cameraId;\n }\n }\n\n return customConstraints;\n};\n\n/**\n * Stop all media tracks in a stream\n * @param stream - MediaStream to stop\n */\nexport const stopAllTracks = (stream: MediaStream | null): void => {\n for (const track of stream?.getTracks() ?? []) track.stop();\n};\n","import { scanImageData } from \"@undecaf/zbar-wasm\";\nimport { convertToGrayscale } from \"../utils/barcodeHelpers\";\n\nexport interface ScanResult {\n typeName: string;\n scanData: string;\n}\n\nexport interface WorkerMessage {\n imageData: ImageData;\n type: \"scan\";\n sessionId: number;\n}\n\nexport interface WorkerResponse {\n found: boolean;\n sessionId: number;\n data?: ScanResult;\n error?: string;\n}\n\nself.onmessage = async ({ data: { imageData, type, sessionId } }: MessageEvent<WorkerMessage>) => {\n if (type !== \"scan\") return;\n\n try {\n const results = await scanImageData(convertToGrayscale(imageData));\n if (results.length > 0) {\n const result = results[0];\n self.postMessage({\n found: true,\n sessionId,\n data: {\n typeName: result.typeName?.replace(\"ZBAR_\", \"\") ?? \"\",\n scanData: result.decode() ?? \"\",\n },\n } as WorkerResponse);\n } else {\n self.postMessage({ found: false, sessionId } as WorkerResponse);\n }\n } catch (error) {\n self.postMessage({\n found: false,\n sessionId,\n error: error instanceof Error ? error.message : \"Unknown error\",\n } as WorkerResponse);\n }\n};\n"],"names":["t","e","n","r","i","o","s","c","a","_","u","A","f","g","h","l","R","U","d","m","p","y","B","P","E","I","Z","v","b","C","N","S","w","T","O","D","F","H","G","L","M","x","W","k","Y","j","q","convertToGrayscale","imageData","data","len","gray","type","sessionId","results","scanImageData","result","error"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"scanner.worker-CGMv7Aye.js","sources":["../node_modules/@undecaf/zbar-wasm/dist/index.mjs","../src/utils/barcodeHelpers.ts","../src/workers/scanner.worker.ts"],"sourcesContent":["function t(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{c(r.next(t))}catch(t){o(t)}}function a(t){try{c(r.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}c((r=r.apply(t,e||[])).next())}))}\"function\"==typeof SuppressedError&&SuppressedError;var e,n=(e=import.meta.url,async function(t={}){var n,r,i=t;i.ready=new Promise(((t,e)=>{n=t,r=e}));var o,s,a,c=Object.assign({},i),_=\"object\"==typeof window,u=\"function\"==typeof importScripts,A=\"object\"==typeof process&&\"object\"==typeof process.versions&&\"string\"==typeof process.versions.node,f=\"\";if(A){const{createRequire:t}=await Promise.resolve().then((()=>g));var h=t(import.meta.url),l=h(\"fs\"),R=h(\"path\");f=u?R.dirname(f)+\"/\":h(\"url\").fileURLToPath(new URL(\"./\",import.meta.url)),o=(t,e)=>(t=U(t)?new URL(t):R.normalize(t),l.readFileSync(t,e?void 0:\"utf8\")),a=t=>{var e=o(t,!0);return e.buffer||(e=new Uint8Array(e)),e},s=(t,e,n,r=!0)=>{t=U(t)?new URL(t):R.normalize(t),l.readFile(t,r?void 0:\"utf8\",((t,i)=>{t?n(t):e(r?i.buffer:i)}))},!i.thisProgram&&process.argv.length>1&&process.argv[1].replace(/\\\\/g,\"/\"),process.argv.slice(2),i.inspect=()=>\"[Emscripten Module object]\"}else(_||u)&&(u?f=self.location.href:\"undefined\"!=typeof document&&document.currentScript&&(f=document.currentScript.src),e&&(f=e),f=0!==f.indexOf(\"blob:\")?f.substr(0,f.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):\"\",o=t=>{var e=new XMLHttpRequest;return e.open(\"GET\",t,!1),e.send(null),e.responseText},u&&(a=t=>{var e=new XMLHttpRequest;return e.open(\"GET\",t,!1),e.responseType=\"arraybuffer\",e.send(null),new Uint8Array(e.response)}),s=(t,e,n)=>{var r=new XMLHttpRequest;r.open(\"GET\",t,!0),r.responseType=\"arraybuffer\",r.onload=()=>{200==r.status||0==r.status&&r.response?e(r.response):n()},r.onerror=n,r.send(null)});var d,m,p,y=i.print||console.log.bind(console),B=i.printErr||console.error.bind(console);Object.assign(i,c),c=null,i.arguments&&i.arguments,i.thisProgram&&i.thisProgram,i.quit&&i.quit,i.wasmBinary&&(d=i.wasmBinary),i.noExitRuntime,\"object\"!=typeof WebAssembly&&P(\"no native wasm support detected\");var E,I,Z=!1;function v(){var t=m.buffer;i.HEAP8=new Int8Array(t),i.HEAP16=new Int16Array(t),i.HEAP32=new Int32Array(t),i.HEAPU8=E=new Uint8Array(t),i.HEAPU16=new Uint16Array(t),i.HEAPU32=I=new Uint32Array(t),i.HEAPF32=new Float32Array(t),i.HEAPF64=new Float64Array(t)}var b=[],C=[],N=[],S=0,w=null;function P(t){i.onAbort&&i.onAbort(t),B(t=\"Aborted(\"+t+\")\"),Z=!0,t+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(t);throw r(e),e}var T,O,D=\"data:application/octet-stream;base64,\";function F(t){return t.startsWith(D)}function U(t){return t.startsWith(\"file://\")}function H(t){if(t==T&&d)return new Uint8Array(d);if(a)return a(t);throw\"both async and sync fetching of the wasm failed\"}function G(t,e,n){return function(t){if(!d&&(_||u)){if(\"function\"==typeof fetch&&!U(t))return fetch(t,{credentials:\"same-origin\"}).then((e=>{if(!e.ok)throw\"failed to load wasm binary file at '\"+t+\"'\";return e.arrayBuffer()})).catch((()=>H(t)));if(s)return new Promise(((e,n)=>{s(t,(t=>e(new Uint8Array(t))),n)}))}return Promise.resolve().then((()=>H(t)))}(t).then((t=>WebAssembly.instantiate(t,e))).then((t=>t)).then(n,(t=>{B(\"failed to asynchronously prepare wasm: \"+t),P(t)}))}i.locateFile?F(T=\"zbar.wasm\")||(O=T,T=i.locateFile?i.locateFile(O,f):f+O):T=new URL(\"zbar.wasm\",import.meta.url).href;var L,M=t=>{for(;t.length>0;)t.shift()(i)},x=t=>{var e=t-m.buffer.byteLength+65535>>>16;try{return m.grow(e),v(),1}catch(t){}},W=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,k=[null,[],[]],Y=(t,e)=>{var n=k[t];0===e||10===e?((1===t?y:B)(((t,e,n)=>{for(var r=e+n,i=e;t[i]&&!(i>=r);)++i;if(i-e>16&&t.buffer&&W)return W.decode(t.subarray(e,i));for(var o=\"\";e<i;){var s=t[e++];if(128&s){var a=63&t[e++];if(192!=(224&s)){var c=63&t[e++];if((s=224==(240&s)?(15&s)<<12|a<<6|c:(7&s)<<18|a<<12|c<<6|63&t[e++])<65536)o+=String.fromCharCode(s);else{var _=s-65536;o+=String.fromCharCode(55296|_>>10,56320|1023&_)}}else o+=String.fromCharCode((31&s)<<6|a)}else o+=String.fromCharCode(s)}return o})(n,0)),n.length=0):n.push(e)},j={d:()=>!0,e:function(){return Date.now()},c:t=>{var e=E.length,n=2147483648;if((t>>>=0)>n)return!1;for(var r,i,o=1;o<=4;o*=2){var s=e*(1+.2/o);s=Math.min(s,t+100663296);var a=Math.min(n,(r=Math.max(t,s))+((i=65536)-r%i)%i);if(x(a))return!0}return!1},f:t=>52,b:function(t,e,n,r,i){return 70},a:(t,e,n,r)=>{for(var i=0,o=0;o<n;o++){var s=I[e>>2],a=I[e+4>>2];e+=8;for(var c=0;c<a;c++)Y(t,E[s+c]);i+=a}return I[r>>2]=i,0}};function q(){function t(){L||(L=!0,i.calledRun=!0,Z||(M(C),n(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),function(){if(i.postRun)for(\"function\"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;)t=i.postRun.shift(),N.unshift(t);var t;M(N)}()))}S>0||(function(){if(i.preRun)for(\"function\"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)t=i.preRun.shift(),b.unshift(t);var t;M(b)}(),S>0||(i.setStatus?(i.setStatus(\"Running...\"),setTimeout((function(){setTimeout((function(){i.setStatus(\"\")}),1),t()}),1)):t()))}if(function(){var t,e,n,o,s={a:j};function a(t,e){var n,r=t.exports;return m=(p=r).g,v(),p.s,n=p.h,C.unshift(n),function(t){if(S--,i.monitorRunDependencies&&i.monitorRunDependencies(S),0==S&&w){var e=w;w=null,e()}}(),r}if(S++,i.monitorRunDependencies&&i.monitorRunDependencies(S),i.instantiateWasm)try{return i.instantiateWasm(s,a)}catch(t){B(\"Module.instantiateWasm callback failed with error: \"+t),r(t)}(t=d,e=T,n=s,o=function(t){a(t.instance)},t||\"function\"!=typeof WebAssembly.instantiateStreaming||F(e)||U(e)||A||\"function\"!=typeof fetch?G(e,n,o):fetch(e,{credentials:\"same-origin\"}).then((t=>WebAssembly.instantiateStreaming(t,n).then(o,(function(t){return B(\"wasm streaming compile failed: \"+t),B(\"falling back to ArrayBuffer instantiation\"),G(e,n,o)}))))).catch(r)}(),i._ImageScanner_create=()=>(i._ImageScanner_create=p.i)(),i._ImageScanner_destory=t=>(i._ImageScanner_destory=p.j)(t),i._ImageScanner_set_config=(t,e,n,r)=>(i._ImageScanner_set_config=p.k)(t,e,n,r),i._ImageScanner_enable_cache=(t,e)=>(i._ImageScanner_enable_cache=p.l)(t,e),i._ImageScanner_recycle_image=(t,e)=>(i._ImageScanner_recycle_image=p.m)(t,e),i._ImageScanner_get_results=t=>(i._ImageScanner_get_results=p.n)(t),i._ImageScanner_scan=(t,e)=>(i._ImageScanner_scan=p.o)(t,e),i._Image_create=(t,e,n,r,o,s)=>(i._Image_create=p.p)(t,e,n,r,o,s),i._Image_destory=t=>(i._Image_destory=p.q)(t),i._Image_get_symbols=t=>(i._Image_get_symbols=p.r)(t),i._free=t=>(i._free=p.t)(t),i._malloc=t=>(i._malloc=p.u)(t),w=function t(){L||q(),L||(w=t)},i.preInit)for(\"function\"==typeof i.preInit&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return q(),t.ready});let r;function i(e={}){r=function(){return t(this,void 0,void 0,(function*(){const t=yield n(e);if(t)return t;throw Error(\"WASM was not loaded\")}))}()}function o(){return t(this,void 0,void 0,(function*(){return r||i(),yield r}))}var s,a,c;!function(t){t[t.ZBAR_NONE=0]=\"ZBAR_NONE\",t[t.ZBAR_PARTIAL=1]=\"ZBAR_PARTIAL\",t[t.ZBAR_EAN2=2]=\"ZBAR_EAN2\",t[t.ZBAR_EAN5=5]=\"ZBAR_EAN5\",t[t.ZBAR_EAN8=8]=\"ZBAR_EAN8\",t[t.ZBAR_UPCE=9]=\"ZBAR_UPCE\",t[t.ZBAR_ISBN10=10]=\"ZBAR_ISBN10\",t[t.ZBAR_UPCA=12]=\"ZBAR_UPCA\",t[t.ZBAR_EAN13=13]=\"ZBAR_EAN13\",t[t.ZBAR_ISBN13=14]=\"ZBAR_ISBN13\",t[t.ZBAR_COMPOSITE=15]=\"ZBAR_COMPOSITE\",t[t.ZBAR_I25=25]=\"ZBAR_I25\",t[t.ZBAR_DATABAR=34]=\"ZBAR_DATABAR\",t[t.ZBAR_DATABAR_EXP=35]=\"ZBAR_DATABAR_EXP\",t[t.ZBAR_CODABAR=38]=\"ZBAR_CODABAR\",t[t.ZBAR_CODE39=39]=\"ZBAR_CODE39\",t[t.ZBAR_PDF417=57]=\"ZBAR_PDF417\",t[t.ZBAR_QRCODE=64]=\"ZBAR_QRCODE\",t[t.ZBAR_SQCODE=80]=\"ZBAR_SQCODE\",t[t.ZBAR_CODE93=93]=\"ZBAR_CODE93\",t[t.ZBAR_CODE128=128]=\"ZBAR_CODE128\",t[t.ZBAR_SYMBOL=255]=\"ZBAR_SYMBOL\",t[t.ZBAR_ADDON2=512]=\"ZBAR_ADDON2\",t[t.ZBAR_ADDON5=1280]=\"ZBAR_ADDON5\",t[t.ZBAR_ADDON=1792]=\"ZBAR_ADDON\"}(s||(s={})),function(t){t[t.ZBAR_CFG_ENABLE=0]=\"ZBAR_CFG_ENABLE\",t[t.ZBAR_CFG_ADD_CHECK=1]=\"ZBAR_CFG_ADD_CHECK\",t[t.ZBAR_CFG_EMIT_CHECK=2]=\"ZBAR_CFG_EMIT_CHECK\",t[t.ZBAR_CFG_ASCII=3]=\"ZBAR_CFG_ASCII\",t[t.ZBAR_CFG_BINARY=4]=\"ZBAR_CFG_BINARY\",t[t.ZBAR_CFG_NUM=5]=\"ZBAR_CFG_NUM\",t[t.ZBAR_CFG_MIN_LEN=32]=\"ZBAR_CFG_MIN_LEN\",t[t.ZBAR_CFG_MAX_LEN=33]=\"ZBAR_CFG_MAX_LEN\",t[t.ZBAR_CFG_UNCERTAINTY=64]=\"ZBAR_CFG_UNCERTAINTY\",t[t.ZBAR_CFG_POSITION=128]=\"ZBAR_CFG_POSITION\",t[t.ZBAR_CFG_TEST_INVERTED=129]=\"ZBAR_CFG_TEST_INVERTED\",t[t.ZBAR_CFG_X_DENSITY=256]=\"ZBAR_CFG_X_DENSITY\",t[t.ZBAR_CFG_Y_DENSITY=257]=\"ZBAR_CFG_Y_DENSITY\"}(a||(a={})),function(t){t[t.ZBAR_ORIENT_UNKNOWN=-1]=\"ZBAR_ORIENT_UNKNOWN\",t[t.ZBAR_ORIENT_UP=0]=\"ZBAR_ORIENT_UP\",t[t.ZBAR_ORIENT_RIGHT=1]=\"ZBAR_ORIENT_RIGHT\",t[t.ZBAR_ORIENT_DOWN=2]=\"ZBAR_ORIENT_DOWN\",t[t.ZBAR_ORIENT_LEFT=3]=\"ZBAR_ORIENT_LEFT\"}(c||(c={}));class _{constructor(t,e){this.ptr=t,this.inst=e}checkAlive(){if(!this.ptr)throw Error(\"Call after destroyed\")}getPointer(){return this.checkAlive(),this.ptr}}class u{constructor(t,e){this.ptr=t,this.ptr32=t>>2,this.buf=e,this.HEAP8=new Int8Array(e),this.HEAPU32=new Uint32Array(e),this.HEAP32=new Int32Array(e)}}class A extends u{get type(){return this.HEAPU32[this.ptr32]}get data(){const t=this.HEAPU32[this.ptr32+4],e=this.HEAPU32[this.ptr32+5];return Int8Array.from(this.HEAP8.subarray(e,e+t))}get points(){const t=this.HEAPU32[this.ptr32+7],e=this.HEAPU32[this.ptr32+8]>>2,n=[];for(let r=0;r<t;++r){const t=this.HEAP32[e+2*r],i=this.HEAP32[e+2*r+1];n.push({x:t,y:i})}return n}get orientation(){return this.HEAP32[this.ptr32+9]}get next(){const t=this.HEAPU32[this.ptr32+11];return t?new A(t,this.buf):null}get time(){return this.HEAPU32[this.ptr32+13]}get cacheCount(){return this.HEAP32[this.ptr32+14]}get quality(){return this.HEAP32[this.ptr32+15]}}class f extends u{get head(){const t=this.HEAPU32[this.ptr32+2];return t?new A(t,this.buf):null}}class h{constructor(t){this.type=t.type,this.typeName=s[this.type],this.data=t.data,this.points=t.points,this.orientation=t.orientation,this.time=t.time,this.cacheCount=t.cacheCount,this.quality=t.quality}static createSymbolsFromPtr(t,e){if(0==t)return[];let n=new f(t,e).head;const r=[];for(;null!==n;)r.push(new h(n)),n=n.next;return r}decode(t){return new TextDecoder(t).decode(this.data)}}class l extends _{static createFromGrayBuffer(e,n,r,i=0){return t(this,void 0,void 0,(function*(){const t=yield o(),s=new Uint8Array(r),a=e*n;if(a!==s.byteLength)throw Error(`data length (${s.byteLength} bytes) does not match width and height (${a} bytes)`);const c=t._malloc(a);t.HEAPU8.set(s,c);return new this(t._Image_create(e,n,808466521,c,a,i),t)}))}static createFromRGBABuffer(e,n,r,i=0){return t(this,void 0,void 0,(function*(){const t=yield o(),s=new Uint8Array(r),a=e*n;if(4*a!==s.byteLength)throw Error(`data length (${s.byteLength} bytes) does not match width and height (${4*a} bytes)`);const c=t._malloc(a),_=c+a,u=t.HEAPU8;for(let t=c,e=0;t<_;t++,e+=4)u[t]=19595*s[e]+38469*s[e+1]+7472*s[e+2]>>16;return new this(t._Image_create(e,n,808466521,c,a,i),t)}))}destroy(){this.checkAlive(),this.inst._Image_destory(this.ptr),this.ptr=0}getSymbols(){this.checkAlive();const t=this.inst._Image_get_symbols(this.ptr);return h.createSymbolsFromPtr(t,this.inst.HEAPU8.buffer)}}class R extends _{static create(){return t(this,void 0,void 0,(function*(){const t=yield o();return new this(t._ImageScanner_create(),t)}))}destroy(){this.checkAlive(),this.inst._ImageScanner_destory(this.ptr),this.ptr=0}setConfig(t,e,n){return this.checkAlive(),this.inst._ImageScanner_set_config(this.ptr,t,e,n)}enableCache(t=!0){this.checkAlive(),this.inst._ImageScanner_enable_cache(this.ptr,t)}recycleImage(t){this.checkAlive(),this.inst._ImageScanner_recycle_image(this.ptr,t.getPointer())}getResults(){this.checkAlive();const t=this.inst._ImageScanner_get_results(this.ptr);return h.createSymbolsFromPtr(t,this.inst.HEAPU8.buffer)}scan(t){return this.checkAlive(),this.inst._ImageScanner_scan(this.ptr,t.getPointer())}}const d=()=>t(void 0,void 0,void 0,(function*(){const t=yield R.create();return t.setConfig(s.ZBAR_NONE,a.ZBAR_CFG_BINARY,1),t}));let m;const p=(e,n)=>t(void 0,void 0,void 0,(function*(){void 0===n&&(n=m||(yield d()),m=n);const t=n.scan(e);if(t<0)throw Error(\"Scan Failed\");return 0===t?[]:e.getSymbols()})),y=(e,n,r,i)=>t(void 0,void 0,void 0,(function*(){const t=yield l.createFromGrayBuffer(n,r,e),o=yield p(t,i);return t.destroy(),o})),B=(e,n,r,i)=>t(void 0,void 0,void 0,(function*(){const t=yield l.createFromRGBABuffer(n,r,e),o=yield p(t,i);return t.destroy(),o})),E=(e,n)=>t(void 0,void 0,void 0,(function*(){return yield B(e.data.buffer,e.width,e.height,n)})),g=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:\"Module\"}));export{a as ZBarConfigType,l as ZBarImage,c as ZBarOrientation,R as ZBarScanner,h as ZBarSymbol,s as ZBarSymbolType,d as getDefaultScanner,o as getInstance,y as scanGrayBuffer,E as scanImageData,B as scanRGBABuffer,i as setModuleArgs};\n//# sourceMappingURL=index.mjs.map\n","/**\n * Utility functions for barcode scanning and camera management\n * @module barcodeHelpers\n */\n\nimport {\n CAMERA_DEFAULTS,\n DESKTOP_CAMERA_SETTINGS,\n FACING_MODE,\n type FacingMode,\n MOBILE_CAMERA_SETTINGS,\n STORAGE_KEY_CAMERA_ID,\n ZOOM_LEVELS,\n} from \"../constants/camera\";\n\n/**\n * Detect if the current device is a mobile phone or tablet\n * @returns True if device is a phone/tablet\n */\nexport const isPhone = (): boolean => /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);\n\n/**\n * Convert color image data to grayscale using luminosity method\n * Optimized for performance using bitwise operations\n * @param imageData - Canvas ImageData object to convert\n * @returns Modified ImageData with grayscale values\n */\nexport const convertToGrayscale = (imageData: ImageData): ImageData => {\n const data = imageData.data;\n const len = data.length;\n\n // Optimized grayscale conversion using luminosity method\n // More accurate than simple average and uses bitwise operations for speed\n for (let i = 0; i < len; i += 4) {\n // Luminosity method: 0.299*R + 0.587*G + 0.114*B\n // Using bit shifts for faster multiplication approximation\n const gray = (data[i] * 77 + data[i + 1] * 150 + data[i + 2] * 29) >> 8;\n data[i] = gray;\n data[i + 1] = gray;\n data[i + 2] = gray;\n // Alpha channel (data[i + 3]) remains unchanged\n }\n return imageData;\n};\n\n/**\n * Determine the best rear camera for scanning based on various criteria\n * Prioritizes: main/wide camera > torch support > highest resolution\n * Works across Android and iOS devices with multiple cameras\n * @returns Device ID of the best rear camera or null\n */\nexport const getBestRearCamera = async (): Promise<string | null> => {\n // Request global permissions first so device labels are populated\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n for (const track of stream.getTracks()) {\n track.stop();\n }\n } catch (err) {\n console.warn(\"Camera permission denied or not available\", err);\n return null;\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n\n if (videoDevices.length === 0) return null;\n\n let bestCamera: string | null = null;\n let bestScore = -1;\n\n for (const device of videoDevices) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { deviceId: { exact: device.deviceId } },\n });\n\n const videoTrack = stream.getVideoTracks()[0];\n const capabilities = videoTrack.getCapabilities() as MediaTrackCapabilities & {\n torch?: boolean;\n };\n const settings = videoTrack.getSettings();\n\n // Stop the stream immediately\n for (const track of stream.getTracks()) {\n track.stop();\n }\n\n // Skip front-facing cameras\n if (settings.facingMode === \"user\") continue;\n\n let score = 0;\n const label = device.label.toLowerCase();\n\n // Priority 1: Identify main/wide camera by label (highest priority)\n // iOS: \"back camera\" or \"wide\" or \"camera 0\"\n // Android: \"camera 0\" or \"back camera\" or \"main camera\"\n if (\n label.includes(\"back camera\") &&\n !label.includes(\"ultra\") &&\n !label.includes(\"telephoto\")\n ) {\n score += 100;\n } else if (label.includes(\"wide\") && !label.includes(\"ultra\")) {\n score += 100;\n } else if (label.match(/camera\\s*0|main/i)) {\n score += 100;\n }\n\n // Priority 2: Torch/flash capability (strong indicator of main camera)\n if (capabilities.torch) {\n score += 50;\n }\n\n // Priority 3: Resolution (higher is better for scanning)\n if (capabilities.width?.max) {\n score += Math.min(capabilities.width.max / 100, 30); // Cap at 30 points\n }\n\n // Priority 4: Prefer environment facing mode\n if (settings.facingMode === \"environment\") {\n score += 20;\n }\n\n // Penalty: Avoid ultra-wide and telephoto cameras\n if (label.includes(\"ultra\") || label.includes(\"telephoto\") || label.includes(\"tele\")) {\n score -= 50;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCamera = device.deviceId;\n }\n } catch {\n // Camera not accessible, skip it\n console.warn(`Could not access camera: ${device.label}`);\n }\n }\n\n return bestCamera;\n};\n\n/**\n * Get best rear camera ID from localStorage or detect it\n * Caches the result in localStorage for future use\n * @returns Cached or newly detected camera ID\n */\nexport const getAndSetCameraIdWithFlash = async (): Promise<string | null> => {\n let cameraId = localStorage.getItem(STORAGE_KEY_CAMERA_ID);\n if (!cameraId) {\n cameraId = await getBestRearCamera();\n if (cameraId) {\n localStorage.setItem(STORAGE_KEY_CAMERA_ID, cameraId);\n }\n }\n return cameraId;\n};\n\n/**\n * Get optimized media constraints for camera access\n * Automatically adjusts settings based on device type and facing mode\n * @param facingMode - Camera facing mode ('user' or 'environment')\n * @returns Media constraints object\n */\nexport const getMediaConstraints = async (\n facingMode: FacingMode,\n): Promise<MediaStreamConstraints> => {\n const baseSettings = isPhone() ? MOBILE_CAMERA_SETTINGS : DESKTOP_CAMERA_SETTINGS;\n\n const customConstraints: MediaStreamConstraints = {\n audio: false,\n video: {\n ...baseSettings,\n ...CAMERA_DEFAULTS,\n facingMode,\n zoom: facingMode === FACING_MODE.USER ? ZOOM_LEVELS.FRONT : ZOOM_LEVELS.BACK,\n } as MediaTrackConstraints,\n };\n\n // For back camera on mobile, try to use camera with flash\n if (facingMode === FACING_MODE.ENVIRONMENT && isPhone()) {\n const cameraId = await getAndSetCameraIdWithFlash();\n if (cameraId && customConstraints.video && typeof customConstraints.video === \"object\") {\n (customConstraints.video as MediaTrackConstraints).deviceId = cameraId;\n }\n }\n\n return customConstraints;\n};\n\n/**\n * Stop all media tracks in a stream\n * @param stream - MediaStream to stop\n */\nexport const stopAllTracks = (stream: MediaStream | null): void => {\n for (const track of stream?.getTracks() ?? []) track.stop();\n};\n","import { scanImageData } from \"@undecaf/zbar-wasm\";\nimport { convertToGrayscale } from \"../utils/barcodeHelpers\";\n\nexport interface ScanResult {\n typeName: string;\n scanData: string;\n}\n\nexport interface WorkerMessage {\n imageData: ImageData;\n type: \"scan\";\n sessionId: number;\n}\n\nexport interface WorkerResponse {\n found: boolean;\n sessionId: number;\n data?: ScanResult;\n error?: string;\n}\n\nself.onmessage = async ({ data: { imageData, type, sessionId } }: MessageEvent<WorkerMessage>) => {\n if (type !== \"scan\") return;\n\n try {\n const results = await scanImageData(convertToGrayscale(imageData));\n if (results.length > 0) {\n const result = results[0];\n self.postMessage({\n found: true,\n sessionId,\n data: {\n typeName: result.typeName?.replace(\"ZBAR_\", \"\") ?? \"\",\n scanData: result.decode() ?? \"\",\n },\n } as WorkerResponse);\n } else {\n self.postMessage({ found: false, sessionId } as WorkerResponse);\n }\n } catch (error) {\n self.postMessage({\n found: false,\n sessionId,\n error: error instanceof Error ? error.message : \"Unknown error\",\n } as WorkerResponse);\n }\n};\n"],"names":["t","e","n","r","i","o","s","c","a","_","u","A","f","g","h","l","R","U","d","m","p","y","B","P","E","I","Z","v","b","C","N","S","w","T","O","D","F","H","G","L","M","x","W","k","Y","j","q","convertToGrayscale","imageData","data","len","gray","type","sessionId","results","scanImageData","result","error"],"mappings":"AAAA,SAASA,EAAEA,GAAEC,GAAEC,GAAEC,GAAE;AAAC,SAAO,KAAID,MAAIA,IAAE,WAAW,SAASE,GAAEC,GAAE;AAAC,aAASC,EAAEN,GAAE;AAAC,UAAG;AAAC,QAAAO,EAAEJ,EAAE,KAAKH,CAAC,CAAC;AAAA,MAAC,SAAOA,GAAE;AAAC,QAAAK,EAAEL,CAAC;AAAA,MAAC;AAAA,IAAC;AAAC,aAASQ,EAAER,GAAE;AAAC,UAAG;AAAC,QAAAO,EAAEJ,EAAE,MAAMH,CAAC,CAAC;AAAA,MAAC,SAAOA,GAAE;AAAC,QAAAK,EAAEL,CAAC;AAAA,MAAC;AAAA,IAAC;AAAC,aAASO,EAAEP,GAAE;AAAC,UAAIC;AAAE,MAAAD,EAAE,OAAKI,EAAEJ,EAAE,KAAK,KAAGC,IAAED,EAAE,OAAMC,aAAaC,IAAED,IAAE,IAAIC,GAAG,SAASF,GAAE;AAAC,QAAAA,EAAEC,CAAC;AAAA,MAAC,EAAC,GAAI,KAAKK,GAAEE,CAAC;AAAA,IAAC;AAAC,IAAAD,GAAGJ,IAAEA,EAAE,MAAMH,GAAK,CAAA,CAAE,GAAG,KAAI,CAAE;AAAA,EAAC;AAAG;AAAqD,IAAIC,GAAEC,MAAGD,IAAE,YAAY,KAAI,eAAeD,IAAE,CAAA,GAAG;AAAC,MAAIE,GAAEC,GAAEC,IAAEJ;AAAE,EAAAI,EAAE,QAAM,IAAI,SAAS,CAACJ,GAAEC,MAAI;AAAC,IAAAC,IAAEF,GAAEG,IAAEF;AAAA,EAAC,EAAC;AAAG,MAAII,GAAEC,GAAEE,GAAED,IAAE,OAAO,OAAO,CAAA,GAAGH,CAAC,GAAEK,IAAY,OAAO,UAAjB,UAAwBC,IAAc,OAAO,iBAAnB,YAAiCC,IAAY,OAAO,WAAjB,YAAoC,OAAO,QAAQ,YAAzB,YAA6C,OAAO,QAAQ,SAAS,QAAlC,UAAuCC,IAAE;AAAG,MAAGD,GAAE;AAAC,UAAK,EAAC,eAAcX,EAAC,IAAE,MAAM,QAAQ,QAAO,EAAG,MAAM,MAAIa,GAAC;AAAG,QAAIC,IAAEd,EAAE,YAAY,GAAG,GAAEe,IAAED,EAAE,IAAI,GAAEE,IAAEF,EAAE,MAAM;AAAE,IAAAF,IAAEF,IAAEM,EAAE,QAAQJ,CAAC,IAAE,MAAIE,EAAE,KAAK,EAAE,cAAc,45hBAA6B,GAAET,IAAE,CAACL,GAAEC,OAAKD,IAAEiB,EAAEjB,CAAC,IAAE,IAAI,IAAIA,CAAC,IAAEgB,EAAE,UAAUhB,CAAC,GAAEe,EAAE,aAAaf,GAAEC,IAAE,SAAO,MAAM,IAAGO,IAAE,CAAAR,MAAG;AAAC,UAAIC,IAAEI,EAAEL,GAAE,EAAE;AAAE,aAAOC,EAAE,WAASA,IAAE,IAAI,WAAWA,CAAC,IAAGA;AAAA,IAAC,GAAEK,IAAE,CAACN,GAAEC,GAAEC,GAAEC,IAAE,OAAK;AAAC,MAAAH,IAAEiB,EAAEjB,CAAC,IAAE,IAAI,IAAIA,CAAC,IAAEgB,EAAE,UAAUhB,CAAC,GAAEe,EAAE,SAASf,GAAEG,IAAE,SAAO,SAAQ,CAACH,GAAEI,MAAI;AAAC,QAAAJ,IAAEE,EAAEF,CAAC,IAAEC,EAAEE,IAAEC,EAAE,SAAOA,CAAC;AAAA,MAAC,EAAC;AAAA,IAAE,GAAE,CAACA,EAAE,eAAa,QAAQ,KAAK,SAAO,KAAG,QAAQ,KAAK,CAAC,EAAE,QAAQ,OAAM,GAAG,GAAE,QAAQ,KAAK,MAAM,CAAC,GAAEA,EAAE,UAAQ,MAAI;AAAA,EAA4B,MAAK,EAACK,KAAGC,OAAKA,IAAEE,IAAE,KAAK,SAAS,OAAkB,OAAO,WAApB,OAA8B,SAAS,kBAAgBA,IAAE,SAAS,cAAc,MAAKX,MAAIW,IAAEX,IAAGW,IAAMA,EAAE,QAAQ,OAAO,MAArB,IAAuBA,EAAE,OAAO,GAAEA,EAAE,QAAQ,UAAS,EAAE,EAAE,YAAY,GAAG,IAAE,CAAC,IAAE,IAAGP,IAAE,CAAAL,MAAG;AAAC,QAAIC,IAAE,IAAI;AAAe,WAAOA,EAAE,KAAK,OAAMD,GAAE,EAAE,GAAEC,EAAE,KAAK,IAAI,GAAEA,EAAE;AAAA,EAAY,GAAES,MAAIF,IAAE,CAAAR,MAAG;AAAC,QAAIC,IAAE,IAAI;AAAe,WAAOA,EAAE,KAAK,OAAMD,GAAE,EAAE,GAAEC,EAAE,eAAa,eAAcA,EAAE,KAAK,IAAI,GAAE,IAAI,WAAWA,EAAE,QAAQ;AAAA,EAAC,IAAGK,IAAE,CAACN,GAAEC,GAAEC,MAAI;AAAC,QAAIC,IAAE,IAAI;AAAe,IAAAA,EAAE,KAAK,OAAMH,GAAE,EAAE,GAAEG,EAAE,eAAa,eAAcA,EAAE,SAAO,MAAI;AAAC,MAAKA,EAAE,UAAP,OAAkBA,EAAE,UAAL,KAAaA,EAAE,WAASF,EAAEE,EAAE,QAAQ,IAAED,EAAC;AAAA,IAAE,GAAEC,EAAE,UAAQD,GAAEC,EAAE,KAAK,IAAI;AAAA,EAAC;AAAG,MAAIe,GAAEC,GAAEC,GAAEC,KAAEjB,EAAE,SAAO,QAAQ,IAAI,KAAK,OAAO,GAAEkB,IAAElB,EAAE,YAAU,QAAQ,MAAM,KAAK,OAAO;AAAE,SAAO,OAAOA,GAAEG,CAAC,GAAEA,IAAE,MAAKH,EAAE,aAAWA,EAAE,WAAUA,EAAE,eAAaA,EAAE,aAAYA,EAAE,QAAMA,EAAE,MAAKA,EAAE,eAAac,IAAEd,EAAE,aAAYA,EAAE,eAAwB,OAAO,eAAjB,YAA8BmB,EAAE,iCAAiC;AAAE,MAAIC,GAAEC,GAAEC,IAAE;AAAG,WAASC,IAAG;AAAC,QAAI3B,IAAEmB,EAAE;AAAO,IAAAf,EAAE,QAAM,IAAI,UAAUJ,CAAC,GAAEI,EAAE,SAAO,IAAI,WAAWJ,CAAC,GAAEI,EAAE,SAAO,IAAI,WAAWJ,CAAC,GAAEI,EAAE,SAAOoB,IAAE,IAAI,WAAWxB,CAAC,GAAEI,EAAE,UAAQ,IAAI,YAAYJ,CAAC,GAAEI,EAAE,UAAQqB,IAAE,IAAI,YAAYzB,CAAC,GAAEI,EAAE,UAAQ,IAAI,aAAaJ,CAAC,GAAEI,EAAE,UAAQ,IAAI,aAAaJ,CAAC;AAAA,EAAC;AAAC,MAAI4B,IAAE,CAAA,GAAGC,IAAE,CAAA,GAAGC,IAAE,IAAGC,IAAE,GAAEC,IAAE;AAAK,WAAST,EAAEvB,GAAE;AAAC,IAAAI,EAAE,WAASA,EAAE,QAAQJ,CAAC,GAAEsB,EAAEtB,IAAE,aAAWA,IAAE,GAAG,GAAE0B,IAAE,IAAG1B,KAAG;AAA2C,QAAIC,IAAE,IAAI,YAAY,aAAaD,CAAC;AAAE,UAAMG,EAAEF,CAAC,GAAEA;AAAA,EAAC;AAAC,MAAIgC,GAAEC,GAAEC,KAAE;AAAwC,WAASC,GAAEpC,GAAE;AAAC,WAAOA,EAAE,WAAWmC,EAAC;AAAA,EAAC;AAAC,WAASlB,EAAEjB,GAAE;AAAC,WAAOA,EAAE,WAAW,SAAS;AAAA,EAAC;AAAC,WAASqC,GAAErC,GAAE;AAAC,QAAGA,KAAGiC,KAAGf,EAAE,QAAO,IAAI,WAAWA,CAAC;AAAE,QAAGV,EAAE,QAAOA,EAAER,CAAC;AAAE,UAAK;AAAA,EAAiD;AAAC,WAASsC,GAAEtC,GAAEC,GAAEC,GAAE;AAAC,YAAO,SAASF,GAAE;AAAC,UAAG,CAACkB,MAAIT,KAAGC,IAAG;AAAC,YAAe,OAAO,SAAnB,cAA0B,CAACO,EAAEjB,CAAC,EAAE,QAAO,MAAMA,GAAE,EAAC,aAAY,cAAa,CAAC,EAAE,MAAM,CAAAC,MAAG;AAAC,cAAG,CAACA,EAAE,GAAG,OAAK,yCAAuCD,IAAE;AAAI,iBAAOC,EAAE,YAAW;AAAA,QAAE,EAAC,EAAG,OAAO,MAAIoC,GAAErC,CAAC,EAAC;AAAG,YAAGM,EAAE,QAAO,IAAI,SAAS,CAACL,GAAEC,MAAI;AAAC,UAAAI,EAAEN,IAAG,CAAAA,MAAGC,EAAE,IAAI,WAAWD,CAAC,CAAC,IAAGE,CAAC;AAAA,QAAC,EAAC;AAAA,MAAE;AAAC,aAAO,QAAQ,UAAU,MAAM,MAAImC,GAAErC,CAAC;IAAG,GAAEA,CAAC,EAAE,MAAM,CAAAA,MAAG,YAAY,YAAYA,GAAEC,CAAC,EAAC,EAAG,MAAM,CAAAD,MAAGA,EAAC,EAAG,KAAKE,IAAG,CAAAF,MAAG;AAAC,MAAAsB,EAAE,4CAA0CtB,CAAC,GAAEuB,EAAEvB,CAAC;AAAA,IAAC,EAAC;AAAA,EAAE;AAAC,EAAAI,EAAE,aAAWgC,GAAEH,IAAE,WAAW,MAAIC,IAAED,GAAEA,IAAE7B,EAAE,aAAWA,EAAE,WAAW8B,GAAEtB,CAAC,IAAEA,IAAEsB,KAAGD,IAAE,IAAA,IAAA,6xtTAAA,YAAA,GAAA,EAAqC;AAAK,MAAIM,GAAEC,IAAE,CAAAxC,MAAG;AAAC,WAAKA,EAAE,SAAO,IAAG,CAAAA,EAAE,QAAQI,CAAC;AAAA,EAAC,GAAEqC,KAAE,CAAAzC,MAAG;AAAC,QAAIC,IAAED,IAAEmB,EAAE,OAAO,aAAW,UAAQ;AAAG,QAAG;AAAC,aAAOA,EAAE,KAAKlB,CAAC,GAAE0B,EAAC,GAAG;AAAA,IAAC,QAAS;AAAA,IAAC;AAAA,EAAC,GAAEe,KAAe,OAAO,cAApB,MAAgC,IAAI,YAAY,MAAM,IAAE,QAAOC,KAAE,CAAC,MAAK,CAAA,GAAG,EAAE,GAAEC,KAAE,CAAC5C,GAAEC,MAAI;AAAC,QAAIC,IAAEyC,GAAE3C,CAAC;AAAE,IAAIC,MAAJ,KAAYA,MAAL,OAAaD,MAAJ,IAAMqB,KAAEC,IAAI,CAACtB,GAAEC,GAAEC,MAAI;AAAC,eAAQC,IAAEF,IAAEC,GAAEE,IAAEH,GAAED,EAAEI,CAAC,KAAG,EAAEA,KAAGD,KAAI,GAAEC;AAAE,UAAGA,IAAEH,IAAE,MAAID,EAAE,UAAQ0C,GAAE,QAAOA,GAAE,OAAO1C,EAAE,SAASC,GAAEG,CAAC,CAAC;AAAE,eAAQC,IAAE,IAAGJ,IAAEG,KAAG;AAAC,YAAIE,IAAEN,EAAEC,GAAG;AAAE,YAAG,MAAIK,GAAE;AAAC,cAAIE,IAAE,KAAGR,EAAEC,GAAG;AAAE,eAAS,MAAIK,MAAV,KAAa;AAAC,gBAAIC,IAAE,KAAGP,EAAEC,GAAG;AAAE,iBAAIK,KAAQ,MAAIA,MAAV,OAAc,KAAGA,MAAI,KAAGE,KAAG,IAAED,KAAG,IAAED,MAAI,KAAGE,KAAG,KAAGD,KAAG,IAAE,KAAGP,EAAEC,GAAG,KAAG,MAAM,CAAAI,KAAG,OAAO,aAAaC,CAAC;AAAA,iBAAM;AAAC,kBAAIG,KAAEH,IAAE;AAAM,cAAAD,KAAG,OAAO,aAAa,QAAMI,MAAG,IAAG,QAAM,OAAKA,EAAC;AAAA,YAAC;AAAA,UAAC,MAAM,CAAAJ,KAAG,OAAO,cAAc,KAAGC,MAAI,IAAEE,CAAC;AAAA,QAAC,MAAM,CAAAH,KAAG,OAAO,aAAaC,CAAC;AAAA,MAAC;AAAC,aAAOD;AAAA,IAAC,GAAGH,GAAE,CAAC,CAAC,GAAEA,EAAE,SAAO,KAAGA,EAAE,KAAKD,CAAC;AAAA,EAAC,GAAE4C,KAAE,EAAC,GAAE,MAAI,IAAG,GAAE,WAAU;AAAC,WAAO,KAAK,IAAG;AAAA,EAAE,GAAE,GAAE,CAAA7C,MAAG;AAAC,QAAIC,IAAEuB,EAAE,QAAOtB,IAAE;AAAW,SAAIF,OAAK,KAAGE,EAAE,QAAM;AAAG,aAAQC,GAAEC,GAAEC,IAAE,GAAEA,KAAG,GAAEA,KAAG,GAAE;AAAC,UAAIC,IAAEL,KAAG,IAAE,MAAGI;AAAG,MAAAC,IAAE,KAAK,IAAIA,GAAEN,IAAE,SAAS;AAAE,UAAIQ,IAAE,KAAK,IAAIN,IAAGC,IAAE,KAAK,IAAIH,GAAEM,CAAC,OAAKF,IAAE,SAAOD,IAAEC,KAAGA,CAAC;AAAE,UAAGqC,GAAEjC,CAAC,EAAE,QAAM;AAAA,IAAE;AAAC,WAAM;AAAA,EAAE,GAAE,GAAE,CAAAR,MAAG,IAAG,GAAE,SAASA,GAAEC,GAAEC,GAAEC,GAAEC,GAAE;AAAC,WAAO;AAAA,EAAE,GAAE,GAAE,CAACJ,GAAEC,GAAEC,GAAEC,MAAI;AAAC,aAAQC,IAAE,GAAEC,IAAE,GAAEA,IAAEH,GAAEG,KAAI;AAAC,UAAIC,IAAEmB,EAAExB,KAAG,CAAC,GAAEO,IAAEiB,EAAExB,IAAE,KAAG,CAAC;AAAE,MAAAA,KAAG;AAAE,eAAQM,IAAE,GAAEA,IAAEC,GAAED,IAAI,CAAAqC,GAAE5C,GAAEwB,EAAElB,IAAEC,CAAC,CAAC;AAAE,MAAAH,KAAGI;AAAA,IAAC;AAAC,WAAOiB,EAAEtB,KAAG,CAAC,IAAEC,GAAE;AAAA,EAAC,EAAC;AAAE,WAAS0C,KAAG;AAAC,aAAS9C,IAAG;AAAC,MAAAuC,MAAIA,IAAE,IAAGnC,EAAE,YAAU,IAAGsB,MAAIc,EAAEX,CAAC,GAAE3B,EAAEE,CAAC,GAAEA,EAAE,wBAAsBA,EAAE,qBAAoB,IAAG,WAAU;AAAC,YAAGA,EAAE,QAAQ,MAAgB,OAAOA,EAAE,WAArB,eAA+BA,EAAE,UAAQ,CAACA,EAAE,OAAO,IAAGA,EAAE,QAAQ,SAAQ,CAAAJ,IAAEI,EAAE,QAAQ,MAAK,GAAG0B,EAAE,QAAQ9B,CAAC;AAAE,YAAIA;AAAE,QAAAwC,EAAEV,CAAC;AAAA,MAAC;IAAK;AAAC,IAAAC,IAAE,OAAI,WAAU;AAAC,UAAG3B,EAAE,OAAO,MAAgB,OAAOA,EAAE,UAArB,eAA8BA,EAAE,SAAO,CAACA,EAAE,MAAM,IAAGA,EAAE,OAAO,SAAQ,CAAAJ,IAAEI,EAAE,OAAO,MAAK,GAAGwB,EAAE,QAAQ5B,CAAC;AAAE,UAAIA;AAAE,MAAAwC,EAAEZ,CAAC;AAAA,IAAC,GAAC,GAAGG,IAAE,MAAI3B,EAAE,aAAWA,EAAE,UAAU,YAAY,GAAE,YAAY,WAAU;AAAC,kBAAY,WAAU;AAAC,QAAAA,EAAE,UAAU,EAAE;AAAA,MAAC,IAAG,CAAC,GAAEJ,EAAC;AAAA,IAAE,IAAG,CAAC,KAAGA,EAAC;AAAA,EAAI;AAAC,OAAG,WAAU;AAAC,QAAIA,GAAEC,GAAEC,GAAEG,GAAEC,IAAE,EAAC,GAAEuC,GAAC;AAAE,aAASrC,EAAER,GAAEC,GAAE;AAAC,UAAIC,GAAEC,IAAEH,EAAE;AAAQ,aAAOmB,KAAGC,IAAEjB,GAAG,GAAEwB,EAAC,GAAGP,EAAE,GAAElB,IAAEkB,EAAE,GAAES,EAAE,QAAQ3B,CAAC,IAAE,SAASF,GAAE;AAAC,YAAG+B,KAAI3B,EAAE,0BAAwBA,EAAE,uBAAuB2B,CAAC,GAAKA,KAAH,KAAMC,GAAE;AAAC,cAAI/B,IAAE+B;AAAE,UAAAA,IAAE,MAAK/B;QAAG;AAAA,MAAC,GAAC,GAAGE;AAAA,IAAC;AAAC,QAAG4B,KAAI3B,EAAE,0BAAwBA,EAAE,uBAAuB2B,CAAC,GAAE3B,EAAE,gBAAgB,KAAG;AAAC,aAAOA,EAAE,gBAAgBE,GAAEE,CAAC;AAAA,IAAC,SAAOR,GAAE;AAAC,MAAAsB,EAAE,wDAAsDtB,CAAC,GAAEG,EAAEH,CAAC;AAAA,IAAC;AAAC,KAACA,IAAEkB,GAAEjB,IAAEgC,GAAE/B,IAAEI,GAAED,IAAE,SAASL,GAAE;AAAC,MAAAQ,EAAER,EAAE,QAAQ;AAAA,IAAC,GAAEA,KAAe,OAAO,YAAY,wBAA/B,cAAqDoC,GAAEnC,CAAC,KAAGgB,EAAEhB,CAAC,KAAGU,KAAe,OAAO,SAAnB,aAAyB2B,GAAErC,GAAEC,GAAEG,CAAC,IAAE,MAAMJ,GAAE,EAAC,aAAY,cAAa,CAAC,EAAE,MAAM,CAAAD,MAAG,YAAY,qBAAqBA,GAAEE,CAAC,EAAE,KAAKG,IAAG,SAASL,GAAE;AAAC,aAAOsB,EAAE,oCAAkCtB,CAAC,GAAEsB,EAAE,2CAA2C,GAAEgB,GAAErC,GAAEC,GAAEG,CAAC;AAAA,IAAC,IAAG,GAAI,MAAMF,CAAC;AAAA,EAAC,GAAC,GAAGC,EAAE,uBAAqB,OAAKA,EAAE,uBAAqBgB,EAAE,MAAKhB,EAAE,wBAAsB,CAAAJ,OAAII,EAAE,wBAAsBgB,EAAE,GAAGpB,CAAC,GAAEI,EAAE,2BAAyB,CAACJ,GAAEC,GAAEC,GAAEC,OAAKC,EAAE,2BAAyBgB,EAAE,GAAGpB,GAAEC,GAAEC,GAAEC,CAAC,GAAEC,EAAE,6BAA2B,CAACJ,GAAEC,OAAKG,EAAE,6BAA2BgB,EAAE,GAAGpB,GAAEC,CAAC,GAAEG,EAAE,8BAA4B,CAACJ,GAAEC,OAAKG,EAAE,8BAA4BgB,EAAE,GAAGpB,GAAEC,CAAC,GAAEG,EAAE,4BAA0B,CAAAJ,OAAII,EAAE,4BAA0BgB,EAAE,GAAGpB,CAAC,GAAEI,EAAE,qBAAmB,CAACJ,GAAEC,OAAKG,EAAE,qBAAmBgB,EAAE,GAAGpB,GAAEC,CAAC,GAAEG,EAAE,gBAAc,CAACJ,GAAEC,GAAEC,GAAEC,GAAEE,GAAEC,OAAKF,EAAE,gBAAcgB,EAAE,GAAGpB,GAAEC,GAAEC,GAAEC,GAAEE,GAAEC,CAAC,GAAEF,EAAE,iBAAe,CAAAJ,OAAII,EAAE,iBAAegB,EAAE,GAAGpB,CAAC,GAAEI,EAAE,qBAAmB,CAAAJ,OAAII,EAAE,qBAAmBgB,EAAE,GAAGpB,CAAC,GAAEI,EAAE,QAAM,CAAAJ,OAAII,EAAE,QAAMgB,EAAE,GAAGpB,CAAC,GAAEI,EAAE,UAAQ,CAAAJ,OAAII,EAAE,UAAQgB,EAAE,GAAGpB,CAAC,GAAEgC,IAAE,SAAShC,IAAG;AAAC,IAAAuC,KAAGO,MAAIP,MAAIP,IAAEhC;AAAA,EAAE,GAAEI,EAAE,QAAQ,MAAgB,OAAOA,EAAE,WAArB,eAA+BA,EAAE,UAAQ,CAACA,EAAE,OAAO,IAAGA,EAAE,QAAQ,SAAO,IAAG,CAAAA,EAAE,QAAQ,IAAG;AAAK,SAAO0C,GAAC,GAAG9C,EAAE;AAAK;AAAG,IAAIG;AAAE,SAASC,GAAEH,IAAE,CAAA,GAAG;AAAC,EAAAE,KAAE,WAAU;AAAC,WAAOH,EAAE,MAAK,QAAO,SAAQ,aAAW;AAAC,YAAMA,IAAE,MAAME,GAAED,CAAC;AAAE,UAAGD,EAAE,QAAOA;AAAE,YAAM,MAAM,qBAAqB;AAAA,IAAC,EAAC;AAAA,EAAE,GAAC;AAAE;AAAC,SAASK,IAAG;AAAC,SAAOL,EAAE,MAAK,QAAO,SAAQ,aAAW;AAAC,WAAOG,KAAGC,GAAC,GAAG,MAAMD;AAAA,EAAC,EAAC;AAAE;AAAC,IAAIG,GAAEE,GAAED;AAAA,CAAG,SAASP,GAAE;AAAC,EAAAA,EAAEA,EAAE,YAAU,CAAC,IAAE,aAAYA,EAAEA,EAAE,eAAa,CAAC,IAAE,gBAAeA,EAAEA,EAAE,YAAU,CAAC,IAAE,aAAYA,EAAEA,EAAE,YAAU,CAAC,IAAE,aAAYA,EAAEA,EAAE,YAAU,CAAC,IAAE,aAAYA,EAAEA,EAAE,YAAU,CAAC,IAAE,aAAYA,EAAEA,EAAE,cAAY,EAAE,IAAE,eAAcA,EAAEA,EAAE,YAAU,EAAE,IAAE,aAAYA,EAAEA,EAAE,aAAW,EAAE,IAAE,cAAaA,EAAEA,EAAE,cAAY,EAAE,IAAE,eAAcA,EAAEA,EAAE,iBAAe,EAAE,IAAE,kBAAiBA,EAAEA,EAAE,WAAS,EAAE,IAAE,YAAWA,EAAEA,EAAE,eAAa,EAAE,IAAE,gBAAeA,EAAEA,EAAE,mBAAiB,EAAE,IAAE,oBAAmBA,EAAEA,EAAE,eAAa,EAAE,IAAE,gBAAeA,EAAEA,EAAE,cAAY,EAAE,IAAE,eAAcA,EAAEA,EAAE,cAAY,EAAE,IAAE,eAAcA,EAAEA,EAAE,cAAY,EAAE,IAAE,eAAcA,EAAEA,EAAE,cAAY,EAAE,IAAE,eAAcA,EAAEA,EAAE,cAAY,EAAE,IAAE,eAAcA,EAAEA,EAAE,eAAa,GAAG,IAAE,gBAAeA,EAAEA,EAAE,cAAY,GAAG,IAAE,eAAcA,EAAEA,EAAE,cAAY,GAAG,IAAE,eAAcA,EAAEA,EAAE,cAAY,IAAI,IAAE,eAAcA,EAAEA,EAAE,aAAW,IAAI,IAAE;AAAY,GAAEM,MAAIA,IAAE,CAAA,EAAG,IAAE,SAASN,GAAE;AAAC,EAAAA,EAAEA,EAAE,kBAAgB,CAAC,IAAE,mBAAkBA,EAAEA,EAAE,qBAAmB,CAAC,IAAE,sBAAqBA,EAAEA,EAAE,sBAAoB,CAAC,IAAE,uBAAsBA,EAAEA,EAAE,iBAAe,CAAC,IAAE,kBAAiBA,EAAEA,EAAE,kBAAgB,CAAC,IAAE,mBAAkBA,EAAEA,EAAE,eAAa,CAAC,IAAE,gBAAeA,EAAEA,EAAE,mBAAiB,EAAE,IAAE,oBAAmBA,EAAEA,EAAE,mBAAiB,EAAE,IAAE,oBAAmBA,EAAEA,EAAE,uBAAqB,EAAE,IAAE,wBAAuBA,EAAEA,EAAE,oBAAkB,GAAG,IAAE,qBAAoBA,EAAEA,EAAE,yBAAuB,GAAG,IAAE,0BAAyBA,EAAEA,EAAE,qBAAmB,GAAG,IAAE,sBAAqBA,EAAEA,EAAE,qBAAmB,GAAG,IAAE;AAAoB,GAAEQ,MAAIA,IAAE,CAAA,EAAG,IAAE,SAASR,GAAE;AAAC,EAAAA,EAAEA,EAAE,sBAAoB,EAAE,IAAE,uBAAsBA,EAAEA,EAAE,iBAAe,CAAC,IAAE,kBAAiBA,EAAEA,EAAE,oBAAkB,CAAC,IAAE,qBAAoBA,EAAEA,EAAE,mBAAiB,CAAC,IAAE,oBAAmBA,EAAEA,EAAE,mBAAiB,CAAC,IAAE;AAAkB,GAAEO,OAAIA,KAAE,CAAA,EAAG;AAAE,MAAME,GAAC;AAAA,EAAC,YAAYT,GAAEC,GAAE;AAAC,SAAK,MAAID,GAAE,KAAK,OAAKC;AAAA,EAAC;AAAA,EAAC,aAAY;AAAC,QAAG,CAAC,KAAK,IAAI,OAAM,MAAM,sBAAsB;AAAA,EAAC;AAAA,EAAC,aAAY;AAAC,WAAO,KAAK,WAAU,GAAG,KAAK;AAAA,EAAG;AAAC;AAAC,MAAMS,GAAC;AAAA,EAAC,YAAYV,GAAEC,GAAE;AAAC,SAAK,MAAID,GAAE,KAAK,QAAMA,KAAG,GAAE,KAAK,MAAIC,GAAE,KAAK,QAAM,IAAI,UAAUA,CAAC,GAAE,KAAK,UAAQ,IAAI,YAAYA,CAAC,GAAE,KAAK,SAAO,IAAI,WAAWA,CAAC;AAAA,EAAC;AAAC;AAAC,MAAMU,UAAUD,GAAC;AAAA,EAAC,IAAI,OAAM;AAAC,WAAO,KAAK,QAAQ,KAAK,KAAK;AAAA,EAAC;AAAA,EAAC,IAAI,OAAM;AAAC,UAAMV,IAAE,KAAK,QAAQ,KAAK,QAAM,CAAC,GAAEC,IAAE,KAAK,QAAQ,KAAK,QAAM,CAAC;AAAE,WAAO,UAAU,KAAK,KAAK,MAAM,SAASA,GAAEA,IAAED,CAAC,CAAC;AAAA,EAAC;AAAA,EAAC,IAAI,SAAQ;AAAC,UAAMA,IAAE,KAAK,QAAQ,KAAK,QAAM,CAAC,GAAEC,IAAE,KAAK,QAAQ,KAAK,QAAM,CAAC,KAAG,GAAEC,IAAE,CAAA;AAAG,aAAQC,IAAE,GAAEA,IAAEH,GAAE,EAAEG,GAAE;AAAC,YAAMH,IAAE,KAAK,OAAOC,IAAE,IAAEE,CAAC,GAAEC,IAAE,KAAK,OAAOH,IAAE,IAAEE,IAAE,CAAC;AAAE,MAAAD,EAAE,KAAK,EAAC,GAAEF,GAAE,GAAEI,EAAC,CAAC;AAAA,IAAC;AAAC,WAAOF;AAAA,EAAC;AAAA,EAAC,IAAI,cAAa;AAAC,WAAO,KAAK,OAAO,KAAK,QAAM,CAAC;AAAA,EAAC;AAAA,EAAC,IAAI,OAAM;AAAC,UAAMF,IAAE,KAAK,QAAQ,KAAK,QAAM,EAAE;AAAE,WAAOA,IAAE,IAAIW,EAAEX,GAAE,KAAK,GAAG,IAAE;AAAA,EAAI;AAAA,EAAC,IAAI,OAAM;AAAC,WAAO,KAAK,QAAQ,KAAK,QAAM,EAAE;AAAA,EAAC;AAAA,EAAC,IAAI,aAAY;AAAC,WAAO,KAAK,OAAO,KAAK,QAAM,EAAE;AAAA,EAAC;AAAA,EAAC,IAAI,UAAS;AAAC,WAAO,KAAK,OAAO,KAAK,QAAM,EAAE;AAAA,EAAC;AAAC;AAAC,MAAMY,WAAUF,GAAC;AAAA,EAAC,IAAI,OAAM;AAAC,UAAMV,IAAE,KAAK,QAAQ,KAAK,QAAM,CAAC;AAAE,WAAOA,IAAE,IAAIW,EAAEX,GAAE,KAAK,GAAG,IAAE;AAAA,EAAI;AAAC;AAAC,MAAMc,EAAC;AAAA,EAAC,YAAYd,GAAE;AAAC,SAAK,OAAKA,EAAE,MAAK,KAAK,WAASM,EAAE,KAAK,IAAI,GAAE,KAAK,OAAKN,EAAE,MAAK,KAAK,SAAOA,EAAE,QAAO,KAAK,cAAYA,EAAE,aAAY,KAAK,OAAKA,EAAE,MAAK,KAAK,aAAWA,EAAE,YAAW,KAAK,UAAQA,EAAE;AAAA,EAAO;AAAA,EAAC,OAAO,qBAAqBA,GAAEC,GAAE;AAAC,QAAMD,KAAH,EAAK,QAAM,CAAA;AAAG,QAAIE,IAAE,IAAIU,GAAEZ,GAAEC,CAAC,EAAE;AAAK,UAAME,IAAE,CAAA;AAAG,WAAYD,MAAP,OAAU,CAAAC,EAAE,KAAK,IAAIW,EAAEZ,CAAC,CAAC,GAAEA,IAAEA,EAAE;AAAK,WAAOC;AAAA,EAAC;AAAA,EAAC,OAAOH,GAAE;AAAC,WAAO,IAAI,YAAYA,CAAC,EAAE,OAAO,KAAK,IAAI;AAAA,EAAC;AAAC;AAAC,MAAMe,WAAUN,GAAC;AAAA,EAAC,OAAO,qBAAqBR,GAAEC,GAAEC,GAAEC,IAAE,GAAE;AAAC,WAAOJ,EAAE,MAAK,QAAO,SAAQ,aAAW;AAAC,YAAMA,IAAE,MAAMK,EAAC,GAAGC,IAAE,IAAI,WAAWH,CAAC,GAAEK,IAAEP,IAAEC;AAAE,UAAGM,MAAIF,EAAE,WAAW,OAAM,MAAM,gBAAgBA,EAAE,UAAU,4CAA4CE,CAAC,SAAS;AAAE,YAAMD,IAAEP,EAAE,QAAQQ,CAAC;AAAE,aAAAR,EAAE,OAAO,IAAIM,GAAEC,CAAC,GAAS,IAAI,KAAKP,EAAE,cAAcC,GAAEC,GAAE,WAAUK,GAAEC,GAAEJ,CAAC,GAAEJ,CAAC;AAAA,IAAC,EAAC;AAAA,EAAE;AAAA,EAAC,OAAO,qBAAqBC,GAAEC,GAAEC,GAAEC,IAAE,GAAE;AAAC,WAAOJ,EAAE,MAAK,QAAO,SAAQ,aAAW;AAAC,YAAMA,IAAE,MAAMK,EAAC,GAAGC,IAAE,IAAI,WAAWH,CAAC,GAAEK,IAAEP,IAAEC;AAAE,UAAG,IAAEM,MAAIF,EAAE,WAAW,OAAM,MAAM,gBAAgBA,EAAE,UAAU,4CAA4C,IAAEE,CAAC,SAAS;AAAE,YAAMD,IAAEP,EAAE,QAAQQ,CAAC,GAAEC,IAAEF,IAAEC,GAAEE,IAAEV,EAAE;AAAO,eAAQA,IAAEO,GAAEN,IAAE,GAAED,IAAES,GAAET,KAAIC,KAAG,EAAE,CAAAS,EAAEV,CAAC,IAAE,QAAMM,EAAEL,CAAC,IAAE,QAAMK,EAAEL,IAAE,CAAC,IAAE,OAAKK,EAAEL,IAAE,CAAC,KAAG;AAAG,aAAO,IAAI,KAAKD,EAAE,cAAcC,GAAEC,GAAE,WAAUK,GAAEC,GAAEJ,CAAC,GAAEJ,CAAC;AAAA,IAAC;EAAG;AAAA,EAAC,UAAS;AAAC,SAAK,WAAU,GAAG,KAAK,KAAK,eAAe,KAAK,GAAG,GAAE,KAAK,MAAI;AAAA,EAAC;AAAA,EAAC,aAAY;AAAC,SAAK,WAAU;AAAG,UAAMA,IAAE,KAAK,KAAK,mBAAmB,KAAK,GAAG;AAAE,WAAOc,EAAE,qBAAqBd,GAAE,KAAK,KAAK,OAAO,MAAM;AAAA,EAAC;AAAC;AAAC,MAAMgB,WAAUP,GAAC;AAAA,EAAC,OAAO,SAAQ;AAAC,WAAOT,EAAE,MAAK,QAAO,SAAQ,aAAW;AAAC,YAAMA,IAAE,MAAMK,EAAC;AAAG,aAAO,IAAI,KAAKL,EAAE,qBAAoB,GAAGA,CAAC;AAAA,IAAC,EAAC;AAAA,EAAE;AAAA,EAAC,UAAS;AAAC,SAAK,WAAU,GAAG,KAAK,KAAK,sBAAsB,KAAK,GAAG,GAAE,KAAK,MAAI;AAAA,EAAC;AAAA,EAAC,UAAUA,GAAEC,GAAEC,GAAE;AAAC,WAAO,KAAK,WAAU,GAAG,KAAK,KAAK,yBAAyB,KAAK,KAAIF,GAAEC,GAAEC,CAAC;AAAA,EAAC;AAAA,EAAC,YAAYF,IAAE,IAAG;AAAC,SAAK,cAAa,KAAK,KAAK,2BAA2B,KAAK,KAAIA,CAAC;AAAA,EAAC;AAAA,EAAC,aAAaA,GAAE;AAAC,SAAK,WAAU,GAAG,KAAK,KAAK,4BAA4B,KAAK,KAAIA,EAAE,YAAY;AAAA,EAAC;AAAA,EAAC,aAAY;AAAC,SAAK,WAAU;AAAG,UAAMA,IAAE,KAAK,KAAK,0BAA0B,KAAK,GAAG;AAAE,WAAOc,EAAE,qBAAqBd,GAAE,KAAK,KAAK,OAAO,MAAM;AAAA,EAAC;AAAA,EAAC,KAAKA,GAAE;AAAC,WAAO,KAAK,WAAU,GAAG,KAAK,KAAK,mBAAmB,KAAK,KAAIA,EAAE,WAAU,CAAE;AAAA,EAAC;AAAC;AAAC,MAAMkB,KAAE,MAAIlB,EAAE,QAAO,QAAO,SAAQ,aAAW;AAAC,QAAMA,IAAE,MAAMgB,GAAE,OAAM;AAAG,SAAOhB,EAAE,UAAUM,EAAE,WAAUE,EAAE,iBAAgB,CAAC,GAAER;AAAC,EAAC;AAAG,IAAImB;AAAO,MAACC,KAAE,CAACnB,GAAEC,MAAIF,EAAE,QAAO,QAAO,SAAQ,aAAW;AAAC,EAASE,MAAT,WAAaA,IAAEiB,OAAI,MAAMD,GAAC,IAAIC,KAAEjB;AAAG,QAAMF,IAAEE,EAAE,KAAKD,CAAC;AAAE,MAAGD,IAAE,EAAE,OAAM,MAAM,aAAa;AAAE,SAAWA,MAAJ,IAAM,CAAA,IAAGC,EAAE;AAAY,EAAC,GAAuIqB,KAAE,CAACrB,GAAEC,GAAEC,GAAEC,MAAIJ,EAAE,QAAO,QAAO,SAAQ,aAAW;AAAC,QAAMA,IAAE,MAAMe,GAAE,qBAAqBb,GAAEC,GAAEF,CAAC,GAAEI,IAAE,MAAMe,GAAEpB,GAAEI,CAAC;AAAE,SAAOJ,EAAE,QAAO,GAAGK;AAAC,EAAC,GAAGmB,KAAE,CAACvB,GAAEC,MAAIF,EAAE,QAAO,QAAO,SAAQ,aAAW;AAAC,SAAO,MAAMsB,GAAErB,EAAE,KAAK,QAAOA,EAAE,OAAMA,EAAE,QAAOC,CAAC;AAAC,EAAC,GAAGW,KAAE,OAAO,OAAO,OAAO,eAAe,EAAC,WAAU,KAAI,GAAE,OAAO,aAAY,EAAC,OAAM,SAAQ,CAAC,CAAC,GC2B52YkC,KAAqB,CAACC,MAAoC;AACrE,QAAMC,IAAOD,EAAU,MACjBE,IAAMD,EAAK;AAIjB,WAAS7C,IAAI,GAAGA,IAAI8C,GAAK9C,KAAK,GAAG;AAG/B,UAAM+C,IAAQF,EAAK7C,CAAC,IAAI,KAAK6C,EAAK7C,IAAI,CAAC,IAAI,MAAM6C,EAAK7C,IAAI,CAAC,IAAI,MAAO;AACtE,IAAA6C,EAAK7C,CAAC,IAAI+C,GACVF,EAAK7C,IAAI,CAAC,IAAI+C,GACdF,EAAK7C,IAAI,CAAC,IAAI+C;AAAA,EAEhB;AACA,SAAOH;AACT;ACtBA,KAAK,YAAY,OAAO,EAAE,MAAM,EAAE,WAAAA,GAAW,MAAAI,GAAM,WAAAC,EAAA,QAA+C;AAChG,MAAID,MAAS;AAEb,QAAI;AACF,YAAME,IAAU,MAAMC,GAAcR,GAAmBC,CAAS,CAAC;AACjE,UAAIM,EAAQ,SAAS,GAAG;AACtB,cAAME,IAASF,EAAQ,CAAC;AACxB,aAAK,YAAY;AAAA,UACf,OAAO;AAAA,UACP,WAAAD;AAAA,UACA,MAAM;AAAA,YACJ,UAAUG,EAAO,UAAU,QAAQ,SAAS,EAAE,KAAK;AAAA,YACnD,UAAUA,EAAO,YAAY;AAAA,UAAA;AAAA,QAC/B,CACiB;AAAA,MACrB;AACE,aAAK,YAAY,EAAE,OAAO,IAAO,WAAAH,GAA6B;AAAA,IAElE,SAASI,GAAO;AACd,WAAK,YAAY;AAAA,QACf,OAAO;AAAA,QACP,WAAAJ;AAAA,QACA,OAAOI,aAAiB,QAAQA,EAAM,UAAU;AAAA,MAAA,CAC/B;AAAA,IACrB;AACF;","x_google_ignoreList":[0]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),c=require("react");var F=typeof document<"u"?document.currentScript:null;const K=100,$=200,ce={willReadFrequently:!0,alpha:!1,desynchronized:!0},W=1280,B={ENVIRONMENT:"environment",USER:"user"},ae={height:{ideal:1080},width:{ideal:1920}},se={height:{ideal:720},width:{ideal:1280}},ie={aspectRatio:void 0,resizeMode:"none",focusMode:"continuous",focusDistance:0,frameRate:{ideal:15,max:30}},G={FRONT:1,BACK:2},z="modernBarcodeScannerCameraId",L=()=>/Android|iPhone|iPad|iPod/i.test(navigator.userAgent),X=async()=>{const r=(await navigator.mediaDevices.enumerateDevices()).filter(h=>h.kind==="videoinput");if(r.length===0)return null;let a=null,i=-1;for(const h of r)try{const S=await navigator.mediaDevices.getUserMedia({video:{deviceId:{exact:h.deviceId}}}),A=S.getVideoTracks()[0],T=A.getCapabilities(),o=A.getSettings();for(const p of S.getTracks())p.stop();if(o.facingMode==="user")continue;let l=0;const t=h.label.toLowerCase();(t.includes("back camera")&&!t.includes("ultra")&&!t.includes("telephoto")||t.includes("wide")&&!t.includes("ultra")||t.match(/camera\s*0|main/i))&&(l+=100),T.torch&&(l+=50),T.width?.max&&(l+=Math.min(T.width.max/100,30)),o.facingMode==="environment"&&(l+=20),(t.includes("ultra")||t.includes("telephoto")||t.includes("tele"))&&(l-=50),l>i&&(i=l,a=h.deviceId)}catch{console.warn(`Could not access camera: ${h.label}`)}return a},oe=async()=>{let e=localStorage.getItem(z);return e||(e=await X(),e&&localStorage.setItem(z,e)),e},V=async e=>{const a={audio:!1,video:{...L()?ae:se,...ie,facingMode:e,zoom:e===B.USER?G.FRONT:G.BACK}};if(e===B.ENVIRONMENT&&L()){const i=await oe();i&&a.video&&typeof a.video=="object"&&(a.video.deviceId=i)}return a},x=e=>{for(const r of e?.getTracks()??[])r.stop()},le=()=>{try{const e=window.AudioContext||window.webkitAudioContext;if(!e)return;const r=new e,a=r.createOscillator(),i=r.createGain();a.type="sine",a.frequency.setValueAtTime(880,r.currentTime),i.gain.setValueAtTime(0,r.currentTime),i.gain.linearRampToValueAtTime(.1,r.currentTime+.05),i.gain.exponentialRampToValueAtTime(.001,r.currentTime+.3),a.connect(i),i.connect(r.destination),a.start(),a.stop(r.currentTime+.3)}catch(e){console.error("Failed to play scan sound:",e)}},Y=({onScan:e,onError:r,onStateChange:a,scanInterval:i=K,enableVibration:h=!0,vibrationDuration:S=$,enableSound:A=!1,initialFacingMode:T="environment"})=>{const[o,l]=c.useState({isScanning:!1,facingMode:T,isTorchOn:!1}),t=c.useRef(null),p=c.useRef(null),N=c.useRef(null),v=c.useRef(null),C=c.useRef(null),R=c.useRef(0),m=c.useRef(0),w=c.useRef(!1);c.useEffect(()=>{a?.(o)},[o,a]);const f=c.useCallback(()=>{m.current+=1,v.current&&(cancelAnimationFrame(v.current),v.current=null),t.current&&(t.current.pause(),x(t.current.srcObject),t.current.srcObject=null),l(s=>({...s,isScanning:!1,isTorchOn:!1}))},[]),b=c.useRef(null);b.current=s=>{f(),h&&window?.navigator?.vibrate?.(S),A&&le(),e(s)},c.useEffect(()=>(C.current=new Worker(new URL("/assets/scanner.worker-CGMv7Aye.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:F&&F.tagName.toUpperCase()==="SCRIPT"&&F.src||new URL("index.cjs",document.baseURI).href),{type:"module"}),C.current.onmessage=s=>{const{found:u,data:d,sessionId:g}=s.data;w.current=!1,g===m.current&&u&&d&&b.current?.(d)},C.current.onerror=s=>{w.current=!1,r?.(new Error(s.message))},()=>{C.current&&(C.current.terminate(),C.current=null)}),[r]);const j=c.useCallback(async()=>{m.current+=1;const s=m.current;w.current=!1,R.current=0,l(u=>({...u,isScanning:!0}));try{const u=await V(o.facingMode),d=await navigator.mediaDevices.getUserMedia(u);if(s!==m.current){x(d);return}if(!t.current){x(d);return}if(t.current.srcObject=d,await t.current.play(),s!==m.current){f();return}const g=p.current;if(!g)return;N.current||(N.current=g.getContext("2d",ce));const M=N.current,E=t.current.videoWidth,P=t.current.videoHeight,U=Math.min(W/E,W/P,1),_=Math.floor(E*U),D=Math.floor(P*U);g.width=_,g.height=D;const y=()=>{if(s!==m.current)return;const q=Date.now();if(q-R.current<i||w.current){v.current=requestAnimationFrame(y);return}R.current=q;try{if(!t.current||!M||!C.current){v.current=requestAnimationFrame(y);return}M.drawImage(t.current,0,0,_,D);const H=M.getImageData(0,0,_,D);w.current=!0,C.current.postMessage({imageData:H,type:"scan",sessionId:s},[H.data.buffer]),v.current=requestAnimationFrame(y)}catch{w.current=!1,v.current=requestAnimationFrame(y)}};v.current=requestAnimationFrame(y)}catch(u){f(),r?.(u instanceof Error?u:new Error("Failed to start scanner"))}},[o.facingMode,f,i,r]),O=c.useCallback(async()=>{if(!t.current||!o.isScanning)return;const s=o.facingMode==="user"?"environment":"user",u=m.current;try{t.current.srcObject&&x(t.current.srcObject);const d=await V(s);if(u!==m.current)return;const g=await navigator.mediaDevices.getUserMedia(d);if(u!==m.current){x(g);return}if(!t.current){x(g);return}if(t.current.srcObject=g,await t.current.play(),u!==m.current){f();return}const M=p.current;M&&(M.width=t.current.videoWidth,M.height=t.current.videoHeight),l(E=>({...E,facingMode:s,isTorchOn:!1}))}catch(d){f(),r?.(d instanceof Error?d:new Error("Failed to switch camera"))}},[o.facingMode,o.isScanning,f,r]),I=c.useCallback(async()=>{const s=t.current?.srcObject?.getVideoTracks()?.[0];if(!s?.getCapabilities()?.torch)return;const d=!o.isTorchOn;try{await s.applyConstraints({advanced:[{torch:d}]}),l(g=>({...g,isTorchOn:d}))}catch{}},[o.isTorchOn]),k=c.useRef(f);return k.current=f,c.useEffect(()=>()=>k.current(),[]),{scannerState:o,videoRef:t,canvasRef:p,handleScan:j,handleStopScan:f,handleSwitchCamera:O,handleToggleTorch:I}},ue={primary:"#4db8a8"},Z=e=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",...e,children:[n.jsx("title",{children:"Rotate Camera"}),n.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"})]}),J=e=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",...e,children:[n.jsx("title",{children:"Torch On"}),n.jsx("path",{fillRule:"evenodd",d:"M14.615 1.595a.75.75 0 01.359.852L12.982 9.75h7.268a.75.75 0 01.548 1.262l-10.5 11.25a.75.75 0 01-1.272-.71l1.992-7.302H3.75a.75.75 0 01-.548-1.262l10.5-11.25a.75.75 0 01.913-.143z",clipRule:"evenodd"})]}),Q=e=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",...e,children:[n.jsx("title",{children:"Torch Off"}),n.jsx("path",{d:"M3.27 3L2 4.27l5 5V13h3v9l3.58-6.14L17.73 20 19 18.73 3.27 3zM17 10h-4l4-8H7v2.18l8.46 8.46L17 10z"})]}),ee=e=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",...e,children:[n.jsx("title",{children:"Camera Off"}),n.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M3 3L6.00007 6.00007M21 21L19.8455 19.8221M9.74194 4.06811C9.83646 4.04279 9.93334 4.02428 10.0319 4.01299C10.1453 4 10.2683 4 10.5141 4H13.5327C13.7786 4 13.9015 4 14.015 4.01299C14.6068 4.08078 15.1375 4.40882 15.4628 4.90782C15.5252 5.00345 15.5802 5.11345 15.6901 5.33333C15.7451 5.44329 15.7726 5.49827 15.8037 5.54609C15.9664 5.79559 16.2318 5.95961 16.5277 5.9935C16.5844 6 16.6459 6 16.7688 6H17.8234C18.9435 6 19.5036 6 19.9314 6.21799C20.3077 6.40973 20.6137 6.71569 20.8055 7.09202C21.0234 7.51984 21.0234 8.0799 21.0234 9.2V15.3496M19.8455 19.8221C19.4278 20 18.8702 20 17.8234 20H6.22344C5.10333 20 4.54328 20 4.11546 19.782C3.73913 19.5903 3.43317 19.2843 3.24142 18.908C3.02344 18.4802 3.02344 17.9201 3.02344 16.8V9.2C3.02344 8.0799 3.02344 7.51984 3.24142 7.09202C3.43317 6.71569 3.73913 6.40973 4.11546 6.21799C4.51385 6.015 5.0269 6.00103 6.00007 6.00007M19.8455 19.8221L14.5619 14.5619M14.5619 14.5619C14.0349 15.4243 13.0847 16 12 16C10.3431 16 9 14.6569 9 13C9 11.9153 9.57566 10.9651 10.4381 10.4381M14.5619 14.5619L10.4381 10.4381M10.4381 10.4381L6.00007 6.00007"})]}),te=({visible:e})=>e?n.jsxs("div",{className:"mbs-scan-line-container",children:[n.jsx("div",{className:"mbs-scan-line-trail-down"}),n.jsx("div",{className:"mbs-scan-line"}),n.jsx("div",{className:"mbs-scan-line-trail-up"})]}):null,de=({isScanning:e,isTorchOn:r,shouldShowRotateButton:a,shouldShowTorchButton:i,onSwitchCamera:h,onToggleTorch:S})=>!e||!a&&!i?null:n.jsxs("div",{className:"mbs-controls",children:[a&&n.jsx("button",{type:"button",className:"mbs-control-btn",onClick:h,"aria-label":"Switch camera",children:n.jsx(Z,{className:"mbs-icon"})}),i&&n.jsx("button",{type:"button",className:"mbs-control-btn",onClick:S,"aria-label":r?"Turn off torch":"Turn on torch",children:r?n.jsx(Q,{className:"mbs-icon"}):n.jsx(J,{className:"mbs-icon"})})]}),ne=c.memo(de),re=c.forwardRef(({onScan:e,onError:r,onStateChange:a,scanInterval:i,enableVibration:h=!0,vibrationDuration:S,enableSound:A=!1,initialFacingMode:T="environment",className:o="",showScanLine:l=!0,showCameraSwitch:t=!0,showTorchButton:p=!0,style:N,themeColor:v=ue.primary},C)=>{const{scannerState:R,videoRef:m,canvasRef:w,handleScan:f,handleStopScan:b,handleSwitchCamera:j,handleToggleTorch:O}=Y({onScan:e,onError:r,onStateChange:a,scanInterval:i,enableVibration:h,vibrationDuration:S,enableSound:A,initialFacingMode:T}),{isScanning:I,facingMode:k,isTorchOn:s}=R,u=L();c.useImperativeHandle(C,()=>({start:f,stop:b,switchCamera:j,toggleTorch:O,getState:()=>R}),[f,b,j,O,R]),c.useEffect(()=>()=>{b()},[b]);const d={...N,"--mbs-primary":v};return n.jsxs("div",{className:`mbs-container ${o}`,style:d,children:[n.jsxs("div",{className:"mbs-video-container",children:[n.jsx(ee,{className:"mbs-placeholder-icon"}),n.jsx("video",{title:"Barcode Scanner",ref:m,autoPlay:!0,muted:!0,playsInline:!0,className:"mbs-video"})]}),n.jsx("canvas",{ref:w,hidden:!0}),n.jsx(te,{visible:I&&l}),n.jsx(ne,{isScanning:I,isTorchOn:s,shouldShowRotateButton:t&&I&&u,shouldShowTorchButton:p&&I&&u&&k==="environment",onSwitchCamera:j,onToggleTorch:O})]})});re.displayName="BarcodeScanner";exports.BarcodeScanner=re;exports.FACING_MODE=B;exports.IconCameraPlaceholder=ee;exports.IconRotateCamera=Z;exports.IconTorchOff=Q;exports.IconTorchOn=J;exports.SCAN_INTERVAL_MS=K;exports.ScanLine=te;exports.ScannerControls=ne;exports.VIBRATION_DURATION_MS=$;exports.getBestRearCamera=X;exports.getMediaConstraints=V;exports.isPhone=L;exports.stopAllTracks=x;exports.useScanner=Y;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),a=require("react");var U=typeof document<"u"?document.currentScript:null;const Y=100,Z=200,oe={willReadFrequently:!0,alpha:!1,desynchronized:!0},K=1280,P={ENVIRONMENT:"environment",USER:"user"},ie={height:{ideal:1080},width:{ideal:1920}},le={height:{ideal:720},width:{ideal:1280}},ue={aspectRatio:void 0,resizeMode:"none",focusMode:"continuous",focusDistance:0,frameRate:{ideal:15,max:30}},$={FRONT:1,BACK:2},X="modernBarcodeScannerCameraId",F=()=>/Android|iPhone|iPad|iPod/i.test(navigator.userAgent),J=async()=>{try{const u=await navigator.mediaDevices.getUserMedia({video:!0});for(const C of u.getTracks())C.stop()}catch(u){return console.warn("Camera permission denied or not available",u),null}const r=(await navigator.mediaDevices.enumerateDevices()).filter(u=>u.kind==="videoinput");if(r.length===0)return null;let c=null,s=-1;for(const u of r)try{const C=await navigator.mediaDevices.getUserMedia({video:{deviceId:{exact:u.deviceId}}}),A=C.getVideoTracks()[0],p=A.getCapabilities(),d=A.getSettings();for(const b of C.getTracks())b.stop();if(d.facingMode==="user")continue;let m=0;const t=u.label.toLowerCase();(t.includes("back camera")&&!t.includes("ultra")&&!t.includes("telephoto")||t.includes("wide")&&!t.includes("ultra")||t.match(/camera\s*0|main/i))&&(m+=100),p.torch&&(m+=50),p.width?.max&&(m+=Math.min(p.width.max/100,30)),d.facingMode==="environment"&&(m+=20),(t.includes("ultra")||t.includes("telephoto")||t.includes("tele"))&&(m-=50),m>s&&(s=m,c=u.deviceId)}catch{console.warn(`Could not access camera: ${u.label}`)}return c},de=async()=>{let e=localStorage.getItem(X);return e||(e=await J(),e&&localStorage.setItem(X,e)),e},W=async e=>{const c={audio:!1,video:{...F()?ie:le,...ue,facingMode:e,zoom:e===P.USER?$.FRONT:$.BACK}};if(e===P.ENVIRONMENT&&F()){const s=await de();s&&c.video&&typeof c.video=="object"&&(c.video.deviceId=s)}return c},x=e=>{for(const r of e?.getTracks()??[])r.stop()},me=()=>{try{const e=window.AudioContext||window.webkitAudioContext;if(!e)return;const r=new e,c=r.createOscillator(),s=r.createGain();c.type="sine",c.frequency.setValueAtTime(880,r.currentTime),s.gain.setValueAtTime(0,r.currentTime),s.gain.linearRampToValueAtTime(.1,r.currentTime+.05),s.gain.exponentialRampToValueAtTime(.001,r.currentTime+.3),c.connect(s),s.connect(r.destination),c.start(),c.stop(r.currentTime+.3)}catch(e){console.error("Failed to play scan sound:",e)}};let j=null,_=0,D=null;const fe=()=>(D&&(clearTimeout(D),D=null),j||(j=new Worker(new URL("/assets/scanner.worker-CGMv7Aye.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:U&&U.tagName.toUpperCase()==="SCRIPT"&&U.src||new URL("index.cjs",document.baseURI).href),{type:"module"})),_++,j),he=()=>{_--,_<=0&&(D=setTimeout(()=>{_<=0&&j&&(j.terminate(),j=null)},100))},Q=({onScan:e,onError:r,onStateChange:c,scanInterval:s=Y,enableVibration:u=!0,vibrationDuration:C=Z,enableSound:A=!1,initialFacingMode:p="environment"})=>{const[d,m]=a.useState({isScanning:!1,facingMode:p,isTorchOn:!1}),t=a.useRef(null),b=a.useRef(null),y=a.useRef(null),S=a.useRef(null),v=a.useRef(null),R=a.useRef(0),f=a.useRef(0),T=a.useRef(!1);a.useEffect(()=>{c?.(d)},[d,c]);const h=a.useCallback(()=>{f.current+=1,S.current&&(cancelAnimationFrame(S.current),S.current=null),t.current&&(t.current.pause(),x(t.current.srcObject),t.current.srcObject=null),m(o=>({...o,isScanning:!1,isTorchOn:!1}))},[]),M=a.useRef(null);M.current=o=>{h(),u&&window?.navigator?.vibrate?.(C),A&&me(),e(o)},a.useEffect(()=>{v.current=fe();const o=l=>{const{found:g,data:w,sessionId:N}=l.data;T.current=!1,N===f.current&&g&&w&&M.current?.(w)},i=l=>{T.current=!1,r?.(new Error(l.message))};return v.current.addEventListener("message",o),v.current.addEventListener("error",i),()=>{v.current&&(v.current.removeEventListener("message",o),v.current.removeEventListener("error",i),v.current=null),he()}},[r]);const O=a.useCallback(async()=>{f.current+=1;const o=f.current;T.current=!1,R.current=0,m(i=>({...i,isScanning:!0}));try{const i=await W(d.facingMode),l=await navigator.mediaDevices.getUserMedia(i);if(o!==f.current){x(l);return}if(!t.current){x(l);return}if(t.current.srcObject=l,await t.current.play(),o!==f.current){h();return}const g=b.current;if(!g)return;y.current||(y.current=g.getContext("2d",oe));const w=y.current,N=t.current.videoWidth,q=t.current.videoHeight,H=Math.min(K/N,K/q,1),B=Math.floor(N*H),V=Math.floor(q*H);g.width=B,g.height=V;const E=()=>{if(o!==f.current)return;const G=Date.now();if(G-R.current<s||T.current){S.current=requestAnimationFrame(E);return}R.current=G;try{if(!t.current||!w||!v.current){S.current=requestAnimationFrame(E);return}w.drawImage(t.current,0,0,B,V);const z=w.getImageData(0,0,B,V);T.current=!0,v.current.postMessage({imageData:z,type:"scan",sessionId:o},[z.data.buffer]),S.current=requestAnimationFrame(E)}catch{T.current=!1,S.current=requestAnimationFrame(E)}};S.current=requestAnimationFrame(E)}catch(i){h(),r?.(i instanceof Error?i:new Error("Failed to start scanner"))}},[d.facingMode,h,s,r]),k=a.useCallback(async()=>{if(!t.current||!d.isScanning)return;const o=d.facingMode==="user"?"environment":"user",i=f.current;try{t.current.srcObject&&x(t.current.srcObject);const l=await W(o);if(i!==f.current)return;const g=await navigator.mediaDevices.getUserMedia(l);if(i!==f.current){x(g);return}if(!t.current){x(g);return}if(t.current.srcObject=g,await t.current.play(),i!==f.current){h();return}const w=b.current;w&&(w.width=t.current.videoWidth,w.height=t.current.videoHeight),m(N=>({...N,facingMode:o,isTorchOn:!1}))}catch(l){h(),r?.(l instanceof Error?l:new Error("Failed to switch camera"))}},[d.facingMode,d.isScanning,h,r]),I=a.useCallback(async()=>{const o=t.current?.srcObject?.getVideoTracks()?.[0];if(!o?.getCapabilities()?.torch)return;const l=!d.isTorchOn;try{await o.applyConstraints({advanced:[{torch:l}]}),m(g=>({...g,isTorchOn:l}))}catch{}},[d.isTorchOn]),L=a.useRef(h);return L.current=h,a.useEffect(()=>()=>L.current(),[]),{scannerState:d,videoRef:t,canvasRef:b,handleScan:O,handleStopScan:h,handleSwitchCamera:k,handleToggleTorch:I}},ge={primary:"#4db8a8"},ee=e=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",...e,children:[n.jsx("title",{children:"Rotate Camera"}),n.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"})]}),te=e=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",...e,children:[n.jsx("title",{children:"Torch On"}),n.jsx("path",{fillRule:"evenodd",d:"M14.615 1.595a.75.75 0 01.359.852L12.982 9.75h7.268a.75.75 0 01.548 1.262l-10.5 11.25a.75.75 0 01-1.272-.71l1.992-7.302H3.75a.75.75 0 01-.548-1.262l10.5-11.25a.75.75 0 01.913-.143z",clipRule:"evenodd"})]}),ne=e=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",...e,children:[n.jsx("title",{children:"Torch Off"}),n.jsx("path",{d:"M3.27 3L2 4.27l5 5V13h3v9l3.58-6.14L17.73 20 19 18.73 3.27 3zM17 10h-4l4-8H7v2.18l8.46 8.46L17 10z"})]}),re=e=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",...e,children:[n.jsx("title",{children:"Camera Off"}),n.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M3 3L6.00007 6.00007M21 21L19.8455 19.8221M9.74194 4.06811C9.83646 4.04279 9.93334 4.02428 10.0319 4.01299C10.1453 4 10.2683 4 10.5141 4H13.5327C13.7786 4 13.9015 4 14.015 4.01299C14.6068 4.08078 15.1375 4.40882 15.4628 4.90782C15.5252 5.00345 15.5802 5.11345 15.6901 5.33333C15.7451 5.44329 15.7726 5.49827 15.8037 5.54609C15.9664 5.79559 16.2318 5.95961 16.5277 5.9935C16.5844 6 16.6459 6 16.7688 6H17.8234C18.9435 6 19.5036 6 19.9314 6.21799C20.3077 6.40973 20.6137 6.71569 20.8055 7.09202C21.0234 7.51984 21.0234 8.0799 21.0234 9.2V15.3496M19.8455 19.8221C19.4278 20 18.8702 20 17.8234 20H6.22344C5.10333 20 4.54328 20 4.11546 19.782C3.73913 19.5903 3.43317 19.2843 3.24142 18.908C3.02344 18.4802 3.02344 17.9201 3.02344 16.8V9.2C3.02344 8.0799 3.02344 7.51984 3.24142 7.09202C3.43317 6.71569 3.73913 6.40973 4.11546 6.21799C4.51385 6.015 5.0269 6.00103 6.00007 6.00007M19.8455 19.8221L14.5619 14.5619M14.5619 14.5619C14.0349 15.4243 13.0847 16 12 16C10.3431 16 9 14.6569 9 13C9 11.9153 9.57566 10.9651 10.4381 10.4381M14.5619 14.5619L10.4381 10.4381M10.4381 10.4381L6.00007 6.00007"})]}),ae=({visible:e})=>e?n.jsxs("div",{className:"mbs-scan-line-container",children:[n.jsx("div",{className:"mbs-scan-line-trail-down"}),n.jsx("div",{className:"mbs-scan-line"}),n.jsx("div",{className:"mbs-scan-line-trail-up"})]}):null,ve=({isScanning:e,isTorchOn:r,shouldShowRotateButton:c,shouldShowTorchButton:s,onSwitchCamera:u,onToggleTorch:C})=>!e||!c&&!s?null:n.jsxs("div",{className:"mbs-controls",children:[c&&n.jsx("button",{type:"button",className:"mbs-control-btn",onClick:u,"aria-label":"Switch camera",children:n.jsx(ee,{className:"mbs-icon"})}),s&&n.jsx("button",{type:"button",className:"mbs-control-btn",onClick:C,"aria-label":r?"Turn off torch":"Turn on torch",children:r?n.jsx(ne,{className:"mbs-icon"}):n.jsx(te,{className:"mbs-icon"})})]}),ce=a.memo(ve),se=a.forwardRef(({onScan:e,onError:r,onStateChange:c,scanInterval:s,enableVibration:u=!0,vibrationDuration:C,enableSound:A=!1,initialFacingMode:p="environment",className:d="",showScanLine:m=!0,showCameraSwitch:t=!0,showTorchButton:b=!0,style:y,themeColor:S=ge.primary},v)=>{const{scannerState:R,videoRef:f,canvasRef:T,handleScan:h,handleStopScan:M,handleSwitchCamera:O,handleToggleTorch:k}=Q({onScan:e,onError:r,onStateChange:c,scanInterval:s,enableVibration:u,vibrationDuration:C,enableSound:A,initialFacingMode:p}),{isScanning:I,facingMode:L,isTorchOn:o}=R,i=F();a.useImperativeHandle(v,()=>({start:h,stop:M,switchCamera:O,toggleTorch:k,getState:()=>R}),[h,M,O,k,R]),a.useEffect(()=>()=>{M()},[M]);const l={...y,"--mbs-primary":S};return n.jsxs("div",{className:`mbs-container ${d}`,style:l,children:[n.jsxs("section",{className:"mbs-video-container","aria-label":"Barcode scanner viewfinder",children:[n.jsx(re,{className:"mbs-placeholder-icon"}),n.jsx("video",{title:"Barcode Scanner",ref:f,autoPlay:!0,muted:!0,playsInline:!0,className:"mbs-video"})]}),n.jsx("canvas",{ref:T,hidden:!0}),n.jsx(ae,{visible:I&&m}),n.jsx(ce,{isScanning:I,isTorchOn:o,shouldShowRotateButton:t&&I&&i,shouldShowTorchButton:b&&I&&i&&L==="environment",onSwitchCamera:O,onToggleTorch:k})]})});se.displayName="BarcodeScanner";exports.BarcodeScanner=se;exports.FACING_MODE=P;exports.IconCameraPlaceholder=re;exports.IconRotateCamera=ee;exports.IconTorchOff=ne;exports.IconTorchOn=te;exports.SCAN_INTERVAL_MS=Y;exports.ScanLine=ae;exports.ScannerControls=ce;exports.VIBRATION_DURATION_MS=Z;exports.getBestRearCamera=J;exports.getMediaConstraints=W;exports.isPhone=F;exports.stopAllTracks=x;exports.useScanner=Q;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/constants/scanner.ts","../src/constants/camera.ts","../src/utils/barcodeHelpers.ts","../src/utils/sound.ts","../src/hooks/useScanner.ts","../src/constants/theme.ts","../src/components/Icons.tsx","../src/components/ScanLine.tsx","../src/components/ScannerControls.tsx","../src/components/BarcodeScanner.tsx"],"sourcesContent":["/**\n * Scanner configuration constants\n * Centralized configuration for barcode scanner behavior\n */\n\n/**\n * Time interval between scan attempts in milliseconds\n * Lower = faster detection but more CPU usage\n * 100ms = 10 scans/sec (good balance)\n */\nexport const SCAN_INTERVAL_MS = 100;\n\n/**\n * Duration of haptic feedback vibration in milliseconds\n */\nexport const VIBRATION_DURATION_MS = 200;\n\n/**\n * Canvas 2D context options optimized for frequent reading\n * - willReadFrequently: Optimizes for getImageData calls\n * - alpha: false reduces memory and improves performance\n * - desynchronized: Allows canvas to bypass event loop for faster rendering\n */\nexport const CANVAS_CONTEXT_OPTIONS: CanvasRenderingContext2DSettings = {\n willReadFrequently: true,\n alpha: false,\n desynchronized: true,\n};\n\n/**\n * Maximum dimension for scan processing\n * Downscaling improves performance without significantly affecting detection\n */\nexport const MAX_SCAN_DIMENSION = 1280;\n","/**\n * Camera configuration constants\n * Device-specific camera settings for optimal scanning\n */\n\n/**\n * Camera facing modes\n */\nexport const FACING_MODE = {\n ENVIRONMENT: \"environment\",\n USER: \"user\",\n} as const;\n\nexport type FacingMode = (typeof FACING_MODE)[keyof typeof FACING_MODE];\n\n/**\n * Camera resolution settings for mobile devices\n */\nexport const MOBILE_CAMERA_SETTINGS: MediaTrackConstraints = {\n height: { ideal: 1080 },\n width: { ideal: 1920 },\n};\n\n/**\n * Camera resolution settings for desktop devices\n */\nexport const DESKTOP_CAMERA_SETTINGS: MediaTrackConstraints = {\n height: { ideal: 720 },\n width: { ideal: 1280 },\n};\n\n/**\n * Camera constraint defaults\n */\nexport const CAMERA_DEFAULTS: MediaTrackConstraints = {\n aspectRatio: undefined,\n resizeMode: \"none\",\n focusMode: \"continuous\",\n focusDistance: 0,\n frameRate: { ideal: 15, max: 30 },\n} as MediaTrackConstraints;\n\n/**\n * Zoom levels for different camera modes\n */\nexport const ZOOM_LEVELS = {\n FRONT: 1,\n BACK: 2,\n} as const;\n\n/**\n * Local storage key for camera ID with flash capability\n */\nexport const STORAGE_KEY_CAMERA_ID = \"modernBarcodeScannerCameraId\";\n","/**\n * Utility functions for barcode scanning and camera management\n * @module barcodeHelpers\n */\n\nimport {\n CAMERA_DEFAULTS,\n DESKTOP_CAMERA_SETTINGS,\n FACING_MODE,\n type FacingMode,\n MOBILE_CAMERA_SETTINGS,\n STORAGE_KEY_CAMERA_ID,\n ZOOM_LEVELS,\n} from \"../constants/camera\";\n\n/**\n * Detect if the current device is a mobile phone or tablet\n * @returns True if device is a phone/tablet\n */\nexport const isPhone = (): boolean => /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);\n\n/**\n * Convert color image data to grayscale using luminosity method\n * Optimized for performance using bitwise operations\n * @param imageData - Canvas ImageData object to convert\n * @returns Modified ImageData with grayscale values\n */\nexport const convertToGrayscale = (imageData: ImageData): ImageData => {\n const data = imageData.data;\n const len = data.length;\n\n // Optimized grayscale conversion using luminosity method\n // More accurate than simple average and uses bitwise operations for speed\n for (let i = 0; i < len; i += 4) {\n // Luminosity method: 0.299*R + 0.587*G + 0.114*B\n // Using bit shifts for faster multiplication approximation\n const gray = (data[i] * 77 + data[i + 1] * 150 + data[i + 2] * 29) >> 8;\n data[i] = gray;\n data[i + 1] = gray;\n data[i + 2] = gray;\n // Alpha channel (data[i + 3]) remains unchanged\n }\n return imageData;\n};\n\n/**\n * Determine the best rear camera for scanning based on various criteria\n * Prioritizes: main/wide camera > torch support > highest resolution\n * Works across Android and iOS devices with multiple cameras\n * @returns Device ID of the best rear camera or null\n */\nexport const getBestRearCamera = async (): Promise<string | null> => {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n\n if (videoDevices.length === 0) return null;\n\n let bestCamera: string | null = null;\n let bestScore = -1;\n\n for (const device of videoDevices) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { deviceId: { exact: device.deviceId } },\n });\n\n const videoTrack = stream.getVideoTracks()[0];\n const capabilities = videoTrack.getCapabilities() as MediaTrackCapabilities & {\n torch?: boolean;\n };\n const settings = videoTrack.getSettings();\n\n // Stop the stream immediately\n for (const track of stream.getTracks()) {\n track.stop();\n }\n\n // Skip front-facing cameras\n if (settings.facingMode === \"user\") continue;\n\n let score = 0;\n const label = device.label.toLowerCase();\n\n // Priority 1: Identify main/wide camera by label (highest priority)\n // iOS: \"back camera\" or \"wide\" or \"camera 0\"\n // Android: \"camera 0\" or \"back camera\" or \"main camera\"\n if (\n label.includes(\"back camera\") &&\n !label.includes(\"ultra\") &&\n !label.includes(\"telephoto\")\n ) {\n score += 100;\n } else if (label.includes(\"wide\") && !label.includes(\"ultra\")) {\n score += 100;\n } else if (label.match(/camera\\s*0|main/i)) {\n score += 100;\n }\n\n // Priority 2: Torch/flash capability (strong indicator of main camera)\n if (capabilities.torch) {\n score += 50;\n }\n\n // Priority 3: Resolution (higher is better for scanning)\n if (capabilities.width?.max) {\n score += Math.min(capabilities.width.max / 100, 30); // Cap at 30 points\n }\n\n // Priority 4: Prefer environment facing mode\n if (settings.facingMode === \"environment\") {\n score += 20;\n }\n\n // Penalty: Avoid ultra-wide and telephoto cameras\n if (label.includes(\"ultra\") || label.includes(\"telephoto\") || label.includes(\"tele\")) {\n score -= 50;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCamera = device.deviceId;\n }\n } catch {\n // Camera not accessible, skip it\n console.warn(`Could not access camera: ${device.label}`);\n }\n }\n\n return bestCamera;\n};\n\n/**\n * Get best rear camera ID from localStorage or detect it\n * Caches the result in localStorage for future use\n * @returns Cached or newly detected camera ID\n */\nexport const getAndSetCameraIdWithFlash = async (): Promise<string | null> => {\n let cameraId = localStorage.getItem(STORAGE_KEY_CAMERA_ID);\n if (!cameraId) {\n cameraId = await getBestRearCamera();\n if (cameraId) {\n localStorage.setItem(STORAGE_KEY_CAMERA_ID, cameraId);\n }\n }\n return cameraId;\n};\n\n/**\n * Get optimized media constraints for camera access\n * Automatically adjusts settings based on device type and facing mode\n * @param facingMode - Camera facing mode ('user' or 'environment')\n * @returns Media constraints object\n */\nexport const getMediaConstraints = async (\n facingMode: FacingMode,\n): Promise<MediaStreamConstraints> => {\n const baseSettings = isPhone() ? MOBILE_CAMERA_SETTINGS : DESKTOP_CAMERA_SETTINGS;\n\n const customConstraints: MediaStreamConstraints = {\n audio: false,\n video: {\n ...baseSettings,\n ...CAMERA_DEFAULTS,\n facingMode,\n zoom: facingMode === FACING_MODE.USER ? ZOOM_LEVELS.FRONT : ZOOM_LEVELS.BACK,\n } as MediaTrackConstraints,\n };\n\n // For back camera on mobile, try to use camera with flash\n if (facingMode === FACING_MODE.ENVIRONMENT && isPhone()) {\n const cameraId = await getAndSetCameraIdWithFlash();\n if (cameraId && customConstraints.video && typeof customConstraints.video === \"object\") {\n (customConstraints.video as MediaTrackConstraints).deviceId = cameraId;\n }\n }\n\n return customConstraints;\n};\n\n/**\n * Stop all media tracks in a stream\n * @param stream - MediaStream to stop\n */\nexport const stopAllTracks = (stream: MediaStream | null): void => {\n for (const track of stream?.getTracks() ?? []) track.stop();\n};\n","/**\n * Plays a soft and pleasing beep sound using Web Audio API\n * Used to notify user of successful scan\n */\nexport const playScanSound = () => {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: window.webkitAudioContext is not standard\n const AudioContext = window.AudioContext || (window as any).webkitAudioContext;\n if (!AudioContext) return;\n\n const ctx = new AudioContext();\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.type = \"sine\";\n oscillator.frequency.setValueAtTime(880, ctx.currentTime); // A5\n\n // Soft envelope for pleasing sound\n gainNode.gain.setValueAtTime(0, ctx.currentTime);\n gainNode.gain.linearRampToValueAtTime(0.1, ctx.currentTime + 0.05); // Attack\n gainNode.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.3); // Decay\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n oscillator.start();\n oscillator.stop(ctx.currentTime + 0.3);\n } catch (error) {\n console.error(\"Failed to play scan sound:\", error);\n }\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { FacingMode } from \"../constants/camera\";\nimport {\n CANVAS_CONTEXT_OPTIONS,\n MAX_SCAN_DIMENSION,\n SCAN_INTERVAL_MS,\n VIBRATION_DURATION_MS,\n} from \"../constants/scanner\";\nimport type { ScannerConfig, ScannerState, ScanResult } from \"../types\";\nimport { getMediaConstraints, playScanSound, stopAllTracks } from \"../utils\";\nimport type { WorkerResponse } from \"../workers/scanner.worker\";\n\ninterface UseScannerOptions extends ScannerConfig {\n onScan: (result: ScanResult) => void;\n onError?: (error: Error) => void;\n onStateChange?: (state: ScannerState) => void;\n}\n\n/**\n * Custom hook for barcode scanning logic and camera state management\n * Handles video stream, barcode detection, and camera controls\n */\nexport const useScanner = ({\n onScan,\n onError,\n onStateChange,\n scanInterval = SCAN_INTERVAL_MS,\n enableVibration = true,\n vibrationDuration = VIBRATION_DURATION_MS,\n enableSound = false,\n initialFacingMode = \"environment\",\n}: UseScannerOptions) => {\n const [scannerState, setScannerState] = useState<ScannerState>({\n isScanning: false,\n facingMode: initialFacingMode,\n isTorchOn: false,\n });\n\n // Refs for DOM elements\n const videoRef = useRef<HTMLVideoElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const contextRef = useRef<CanvasRenderingContext2D | null>(null);\n\n // Refs for scanning control\n const animationFrameId = useRef<number | null>(null);\n const workerRef = useRef<Worker | null>(null);\n const lastScanTimeRef = useRef<number>(0);\n\n // Session-based tracking\n const scanSessionRef = useRef<number>(0);\n const isWorkerBusy = useRef<boolean>(false);\n\n // Notify state changes\n useEffect(() => {\n onStateChange?.(scannerState);\n }, [scannerState, onStateChange]);\n\n /**\n * Stop scanning and cleanup resources\n */\n const handleStopScan = useCallback(() => {\n scanSessionRef.current += 1;\n\n if (animationFrameId.current) {\n cancelAnimationFrame(animationFrameId.current);\n animationFrameId.current = null;\n }\n\n if (videoRef.current) {\n videoRef.current.pause();\n stopAllTracks(videoRef.current.srcObject as MediaStream);\n videoRef.current.srcObject = null;\n }\n\n setScannerState((prev) => ({ ...prev, isScanning: false, isTorchOn: false }));\n }, []);\n\n const handleDetectionRef = useRef<((data: ScanResult) => void) | null>(null);\n handleDetectionRef.current = (data: ScanResult) => {\n handleStopScan();\n\n if (enableVibration) {\n window?.navigator?.vibrate?.(vibrationDuration);\n }\n\n if (enableSound) {\n playScanSound();\n }\n\n onScan(data);\n };\n\n // Initialize Web Worker - only once on mount\n useEffect(() => {\n workerRef.current = new Worker(new URL(\"../workers/scanner.worker.ts\", import.meta.url), {\n type: \"module\",\n });\n\n workerRef.current.onmessage = (e: MessageEvent<WorkerResponse>) => {\n const { found, data, sessionId } = e.data;\n isWorkerBusy.current = false;\n\n // Only process if this result belongs to current session\n if (sessionId === scanSessionRef.current && found && data) {\n handleDetectionRef.current?.(data);\n }\n };\n\n workerRef.current.onerror = (error) => {\n isWorkerBusy.current = false;\n onError?.(new Error(error.message));\n };\n\n return () => {\n if (workerRef.current) {\n workerRef.current.terminate();\n workerRef.current = null;\n }\n };\n }, [onError]);\n\n /**\n * Initialize and start the barcode scanning process\n */\n const handleScan = useCallback(async () => {\n scanSessionRef.current += 1;\n const currentSession = scanSessionRef.current;\n isWorkerBusy.current = false;\n lastScanTimeRef.current = 0;\n\n setScannerState((prev) => ({ ...prev, isScanning: true }));\n\n try {\n const mediaConstraints = await getMediaConstraints(scannerState.facingMode);\n const stream = await navigator.mediaDevices.getUserMedia(mediaConstraints);\n\n // Check if session is still valid\n if (currentSession !== scanSessionRef.current) {\n stopAllTracks(stream);\n return;\n }\n\n if (!videoRef.current) {\n stopAllTracks(stream);\n return;\n }\n\n videoRef.current.srcObject = stream;\n await videoRef.current.play();\n\n // Double-check session is still valid after video starts\n if (currentSession !== scanSessionRef.current) {\n handleStopScan();\n return;\n }\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n // Reuse context for better performance\n if (!contextRef.current) {\n contextRef.current = canvas.getContext(\"2d\", CANVAS_CONTEXT_OPTIONS);\n }\n const context = contextRef.current;\n\n const width = videoRef.current.videoWidth;\n const height = videoRef.current.videoHeight;\n\n // Downscale for performance\n const scale = Math.min(MAX_SCAN_DIMENSION / width, MAX_SCAN_DIMENSION / height, 1);\n const scanWidth = Math.floor(width * scale);\n const scanHeight = Math.floor(height * scale);\n\n canvas.width = scanWidth;\n canvas.height = scanHeight;\n\n /**\n * Animation loop for continuous barcode scanning\n */\n const scanTick = () => {\n // Stop if session changed\n if (currentSession !== scanSessionRef.current) {\n return;\n }\n\n const now = Date.now();\n const timeSinceLastScan = now - lastScanTimeRef.current;\n\n // Throttle scan rate\n if (timeSinceLastScan < scanInterval || isWorkerBusy.current) {\n animationFrameId.current = requestAnimationFrame(scanTick);\n return;\n }\n\n lastScanTimeRef.current = now;\n\n try {\n if (!videoRef.current || !context || !workerRef.current) {\n animationFrameId.current = requestAnimationFrame(scanTick);\n return;\n }\n\n // Draw video frame to canvas with scaling\n context.drawImage(videoRef.current, 0, 0, scanWidth, scanHeight);\n const imageData = context.getImageData(0, 0, scanWidth, scanHeight);\n\n // Mark worker as busy before sending\n isWorkerBusy.current = true;\n\n // Send to worker with session ID for tracking\n workerRef.current.postMessage({ imageData, type: \"scan\", sessionId: currentSession }, [\n imageData.data.buffer,\n ]);\n\n animationFrameId.current = requestAnimationFrame(scanTick);\n } catch {\n isWorkerBusy.current = false;\n animationFrameId.current = requestAnimationFrame(scanTick);\n }\n };\n\n animationFrameId.current = requestAnimationFrame(scanTick);\n } catch (error) {\n handleStopScan();\n onError?.(error instanceof Error ? error : new Error(\"Failed to start scanner\"));\n }\n }, [scannerState.facingMode, handleStopScan, scanInterval, onError]);\n\n /**\n * Switch between front and back cameras\n */\n const handleSwitchCamera = useCallback(async () => {\n if (!videoRef.current || !scannerState.isScanning) return;\n\n const newFacingMode: FacingMode = scannerState.facingMode === \"user\" ? \"environment\" : \"user\";\n const currentSession = scanSessionRef.current;\n\n try {\n if (videoRef.current.srcObject) {\n stopAllTracks(videoRef.current.srcObject as MediaStream);\n }\n\n const mediaConstraints = await getMediaConstraints(newFacingMode);\n\n // Check if session is still valid after async operation\n if (currentSession !== scanSessionRef.current) {\n return;\n }\n\n const stream = await navigator.mediaDevices.getUserMedia(mediaConstraints);\n\n // Check again after getting stream\n if (currentSession !== scanSessionRef.current) {\n stopAllTracks(stream);\n return;\n }\n\n if (!videoRef.current) {\n stopAllTracks(stream);\n return;\n }\n\n videoRef.current.srcObject = stream;\n await videoRef.current.play();\n\n // Final check after video starts\n if (currentSession !== scanSessionRef.current) {\n handleStopScan();\n return;\n }\n\n const canvas = canvasRef.current;\n if (canvas) {\n canvas.width = videoRef.current.videoWidth;\n canvas.height = videoRef.current.videoHeight;\n }\n\n setScannerState((prev) => ({\n ...prev,\n facingMode: newFacingMode,\n isTorchOn: false,\n }));\n } catch (error) {\n handleStopScan();\n onError?.(error instanceof Error ? error : new Error(\"Failed to switch camera\"));\n }\n }, [scannerState.facingMode, scannerState.isScanning, handleStopScan, onError]);\n\n /**\n * Toggle the torch/flash\n */\n const handleToggleTorch = useCallback(async () => {\n const track = (videoRef.current?.srcObject as MediaStream)?.getVideoTracks()?.[0];\n const capabilities = track?.getCapabilities() as MediaTrackCapabilities & { torch?: boolean };\n if (!capabilities?.torch) return;\n\n const newTorchState = !scannerState.isTorchOn;\n try {\n // Using type assertion for torch constraint which is not in standard TypeScript definitions\n // but is supported by Chrome and other browsers\n await track.applyConstraints({\n advanced: [{ torch: newTorchState } as unknown as MediaTrackConstraintSet],\n });\n setScannerState((prev) => ({ ...prev, isTorchOn: newTorchState }));\n } catch {\n // Torch toggle failed silently\n }\n }, [scannerState.isTorchOn]);\n\n // Cleanup on unmount\n const handleStopScanRef = useRef(handleStopScan);\n handleStopScanRef.current = handleStopScan;\n\n useEffect(() => () => handleStopScanRef.current(), []);\n\n return {\n scannerState,\n videoRef,\n canvasRef,\n handleScan,\n handleStopScan,\n handleSwitchCamera,\n handleToggleTorch,\n };\n};\n","export const SCANNER_THEME = {\n primary: \"#4db8a8\",\n primaryDark: \"#3d9d8f\",\n stop: \"#ef4444\",\n stopDark: \"#dc2626\",\n} as const;\n","import type { SVGProps } from \"react\";\n\nexport const IconRotateCamera = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n {...props}\n >\n <title>Rotate Camera</title>\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n);\n\nexport const IconTorchOn = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" {...props}>\n <title>Torch On</title>\n <path\n fillRule=\"evenodd\"\n d=\"M14.615 1.595a.75.75 0 01.359.852L12.982 9.75h7.268a.75.75 0 01.548 1.262l-10.5 11.25a.75.75 0 01-1.272-.71l1.992-7.302H3.75a.75.75 0 01-.548-1.262l10.5-11.25a.75.75 0 01.913-.143z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const IconTorchOff = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" {...props}>\n <title>Torch Off</title>\n <path d=\"M3.27 3L2 4.27l5 5V13h3v9l3.58-6.14L17.73 20 19 18.73 3.27 3zM17 10h-4l4-8H7v2.18l8.46 8.46L17 10z\" />\n </svg>\n);\n\nexport const IconCameraPlaceholder = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n {...props}\n >\n <title>Camera Off</title>\n {/* Camera body with slash through it */}\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 3L6.00007 6.00007M21 21L19.8455 19.8221M9.74194 4.06811C9.83646 4.04279 9.93334 4.02428 10.0319 4.01299C10.1453 4 10.2683 4 10.5141 4H13.5327C13.7786 4 13.9015 4 14.015 4.01299C14.6068 4.08078 15.1375 4.40882 15.4628 4.90782C15.5252 5.00345 15.5802 5.11345 15.6901 5.33333C15.7451 5.44329 15.7726 5.49827 15.8037 5.54609C15.9664 5.79559 16.2318 5.95961 16.5277 5.9935C16.5844 6 16.6459 6 16.7688 6H17.8234C18.9435 6 19.5036 6 19.9314 6.21799C20.3077 6.40973 20.6137 6.71569 20.8055 7.09202C21.0234 7.51984 21.0234 8.0799 21.0234 9.2V15.3496M19.8455 19.8221C19.4278 20 18.8702 20 17.8234 20H6.22344C5.10333 20 4.54328 20 4.11546 19.782C3.73913 19.5903 3.43317 19.2843 3.24142 18.908C3.02344 18.4802 3.02344 17.9201 3.02344 16.8V9.2C3.02344 8.0799 3.02344 7.51984 3.24142 7.09202C3.43317 6.71569 3.73913 6.40973 4.11546 6.21799C4.51385 6.015 5.0269 6.00103 6.00007 6.00007M19.8455 19.8221L14.5619 14.5619M14.5619 14.5619C14.0349 15.4243 13.0847 16 12 16C10.3431 16 9 14.6569 9 13C9 11.9153 9.57566 10.9651 10.4381 10.4381M14.5619 14.5619L10.4381 10.4381M10.4381 10.4381L6.00007 6.00007\"\n />\n </svg>\n);\n","interface ScanLineProps {\n visible: boolean;\n}\n\n/**\n * Animated scanning line indicator\n */\nconst ScanLine = ({ visible }: ScanLineProps) => {\n if (!visible) return null;\n\n return (\n <div className=\"mbs-scan-line-container\">\n <div className=\"mbs-scan-line-trail-down\" />\n <div className=\"mbs-scan-line\" />\n <div className=\"mbs-scan-line-trail-up\" />\n </div>\n );\n};\n\nexport default ScanLine;\n","import { memo } from \"react\";\nimport { IconRotateCamera, IconTorchOff, IconTorchOn } from \"./Icons\";\n\ninterface ScannerControlsProps {\n isScanning: boolean;\n isTorchOn: boolean;\n shouldShowRotateButton: boolean;\n shouldShowTorchButton: boolean;\n onSwitchCamera: () => void;\n onToggleTorch: () => void;\n}\n\n/**\n * Scanner control buttons component (camera rotate and torch)\n */\nconst ScannerControls = ({\n isScanning,\n isTorchOn,\n shouldShowRotateButton,\n shouldShowTorchButton,\n onSwitchCamera,\n onToggleTorch,\n}: ScannerControlsProps) => {\n if (!isScanning) return null;\n if (!shouldShowRotateButton && !shouldShowTorchButton) return null;\n\n return (\n <div className=\"mbs-controls\">\n {/* Rotate Camera Button */}\n {shouldShowRotateButton && (\n <button\n type=\"button\"\n className=\"mbs-control-btn\"\n onClick={onSwitchCamera}\n aria-label=\"Switch camera\"\n >\n <IconRotateCamera className=\"mbs-icon\" />\n </button>\n )}\n\n {/* Torch Button */}\n {shouldShowTorchButton && (\n <button\n type=\"button\"\n className=\"mbs-control-btn\"\n onClick={onToggleTorch}\n aria-label={isTorchOn ? \"Turn off torch\" : \"Turn on torch\"}\n >\n {isTorchOn ? <IconTorchOff className=\"mbs-icon\" /> : <IconTorchOn className=\"mbs-icon\" />}\n </button>\n )}\n </div>\n );\n};\n\nexport default memo(ScannerControls);\n","import { forwardRef, useEffect, useImperativeHandle } from \"react\";\nimport { useScanner } from \"../hooks/useScanner\";\nimport { SCANNER_THEME } from \"../constants/theme\";\nimport type { BarcodeScannerProps, BarcodeScannerRef, ScannerState } from \"../types\";\nimport { isPhone } from \"../utils/barcodeHelpers\";\nimport { IconCameraPlaceholder } from \"./Icons\";\nimport ScanLine from \"./ScanLine\";\nimport ScannerControls from \"./ScannerControls\";\n\n/**\n * BarcodeScanner Component\n *\n * A high-performance barcode scanner React component with optimized detection.\n * Supports camera switching, torch control, and automatic phone detection.\n *\n * @example\n * ```tsx\n * import { BarcodeScanner, BarcodeScannerRef } from 'modern-barcode-scanner';\n * import 'modern-barcode-scanner/styles.css';\n *\n * const App = () => {\n * const scannerRef = useRef<BarcodeScannerRef>(null);\n *\n * const handleScan = (result) => {\n * console.log('Scanned:', result.scanData);\n * };\n *\n * useEffect(() => {\n * // Start scanning when component mounts\n * scannerRef.current?.start();\n * }, []);\n *\n * return (\n * <BarcodeScanner\n * ref={scannerRef}\n * onScan={handleScan}\n * />\n * );\n * };\n * ```\n */\nconst BarcodeScanner = forwardRef<BarcodeScannerRef, BarcodeScannerProps>(\n (\n {\n onScan,\n onError,\n onStateChange,\n scanInterval,\n enableVibration = true,\n vibrationDuration,\n enableSound = false,\n initialFacingMode = \"environment\",\n className = \"\",\n showScanLine = true,\n showCameraSwitch = true,\n showTorchButton = true,\n style,\n themeColor = SCANNER_THEME.primary,\n },\n ref,\n ) => {\n const {\n scannerState,\n videoRef,\n canvasRef,\n handleScan,\n handleStopScan,\n handleSwitchCamera,\n handleToggleTorch,\n } = useScanner({\n onScan,\n onError,\n onStateChange,\n scanInterval,\n enableVibration,\n vibrationDuration,\n enableSound,\n initialFacingMode,\n });\n\n const { isScanning, facingMode, isTorchOn } = scannerState;\n const isPhoneDevice = isPhone();\n\n // Expose imperative methods via ref\n useImperativeHandle(\n ref,\n () => ({\n start: handleScan,\n stop: handleStopScan,\n switchCamera: handleSwitchCamera,\n toggleTorch: handleToggleTorch,\n getState: (): ScannerState => scannerState,\n }),\n [handleScan, handleStopScan, handleSwitchCamera, handleToggleTorch, scannerState],\n );\n\n // Auto-cleanup on unmount\n useEffect(() => {\n return () => {\n handleStopScan();\n };\n }, [handleStopScan]);\n\n // Combine user styles with the custom theme color CSS variable\n const containerStyle = {\n ...style,\n \"--mbs-primary\": themeColor,\n } as React.CSSProperties;\n\n return (\n <div className={`mbs-container ${className}`} style={containerStyle}>\n {/* Camera Feed */}\n <div className=\"mbs-video-container\">\n <IconCameraPlaceholder className=\"mbs-placeholder-icon\" />\n <video\n title=\"Barcode Scanner\"\n ref={videoRef}\n autoPlay\n muted\n playsInline\n className=\"mbs-video\"\n />\n </div>\n\n {/* Hidden canvas for image processing */}\n <canvas ref={canvasRef} hidden />\n\n {/* Scanning Animation Line */}\n <ScanLine visible={isScanning && showScanLine} />\n\n {/* Camera Controls */}\n <ScannerControls\n isScanning={isScanning}\n isTorchOn={isTorchOn}\n shouldShowRotateButton={showCameraSwitch && isScanning && isPhoneDevice}\n shouldShowTorchButton={\n showTorchButton && isScanning && isPhoneDevice && facingMode === \"environment\"\n }\n onSwitchCamera={handleSwitchCamera}\n onToggleTorch={handleToggleTorch}\n />\n </div>\n );\n },\n);\n\nBarcodeScanner.displayName = \"BarcodeScanner\";\n\nexport default BarcodeScanner;\n"],"names":["SCAN_INTERVAL_MS","VIBRATION_DURATION_MS","CANVAS_CONTEXT_OPTIONS","MAX_SCAN_DIMENSION","FACING_MODE","MOBILE_CAMERA_SETTINGS","DESKTOP_CAMERA_SETTINGS","CAMERA_DEFAULTS","ZOOM_LEVELS","STORAGE_KEY_CAMERA_ID","isPhone","getBestRearCamera","videoDevices","device","bestCamera","bestScore","stream","videoTrack","capabilities","settings","track","score","label","getAndSetCameraIdWithFlash","cameraId","getMediaConstraints","facingMode","customConstraints","stopAllTracks","playScanSound","AudioContext","ctx","oscillator","gainNode","error","useScanner","onScan","onError","onStateChange","scanInterval","enableVibration","vibrationDuration","enableSound","initialFacingMode","scannerState","setScannerState","useState","videoRef","useRef","canvasRef","contextRef","animationFrameId","workerRef","lastScanTimeRef","scanSessionRef","isWorkerBusy","useEffect","handleStopScan","useCallback","prev","handleDetectionRef","data","_documentCurrentScript","e","found","sessionId","handleScan","currentSession","mediaConstraints","canvas","context","width","height","scale","scanWidth","scanHeight","scanTick","now","imageData","handleSwitchCamera","newFacingMode","handleToggleTorch","newTorchState","handleStopScanRef","SCANNER_THEME","IconRotateCamera","props","jsxs","jsx","IconTorchOn","IconTorchOff","IconCameraPlaceholder","ScanLine","visible","ScannerControls","isScanning","isTorchOn","shouldShowRotateButton","shouldShowTorchButton","onSwitchCamera","onToggleTorch","memo","BarcodeScanner","forwardRef","className","showScanLine","showCameraSwitch","showTorchButton","style","themeColor","ref","isPhoneDevice","useImperativeHandle","containerStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/constants/scanner.ts","../src/constants/camera.ts","../src/utils/barcodeHelpers.ts","../src/utils/sound.ts","../src/hooks/useScanner.ts","../src/constants/theme.ts","../src/components/Icons.tsx","../src/components/ScanLine.tsx","../src/components/ScannerControls.tsx","../src/components/BarcodeScanner.tsx"],"sourcesContent":["/**\n * Scanner configuration constants\n * Centralized configuration for barcode scanner behavior\n */\n\n/**\n * Time interval between scan attempts in milliseconds\n * Lower = faster detection but more CPU usage\n * 100ms = 10 scans/sec (good balance)\n */\nexport const SCAN_INTERVAL_MS = 100;\n\n/**\n * Duration of haptic feedback vibration in milliseconds\n */\nexport const VIBRATION_DURATION_MS = 200;\n\n/**\n * Canvas 2D context options optimized for frequent reading\n * - willReadFrequently: Optimizes for getImageData calls\n * - alpha: false reduces memory and improves performance\n * - desynchronized: Allows canvas to bypass event loop for faster rendering\n */\nexport const CANVAS_CONTEXT_OPTIONS: CanvasRenderingContext2DSettings = {\n willReadFrequently: true,\n alpha: false,\n desynchronized: true,\n};\n\n/**\n * Maximum dimension for scan processing\n * Downscaling improves performance without significantly affecting detection\n */\nexport const MAX_SCAN_DIMENSION = 1280;\n","/**\n * Camera configuration constants\n * Device-specific camera settings for optimal scanning\n */\n\n/**\n * Camera facing modes\n */\nexport const FACING_MODE = {\n ENVIRONMENT: \"environment\",\n USER: \"user\",\n} as const;\n\nexport type FacingMode = (typeof FACING_MODE)[keyof typeof FACING_MODE];\n\n/**\n * Camera resolution settings for mobile devices\n */\nexport const MOBILE_CAMERA_SETTINGS: MediaTrackConstraints = {\n height: { ideal: 1080 },\n width: { ideal: 1920 },\n};\n\n/**\n * Camera resolution settings for desktop devices\n */\nexport const DESKTOP_CAMERA_SETTINGS: MediaTrackConstraints = {\n height: { ideal: 720 },\n width: { ideal: 1280 },\n};\n\n/**\n * Camera constraint defaults\n */\nexport const CAMERA_DEFAULTS: MediaTrackConstraints = {\n aspectRatio: undefined,\n resizeMode: \"none\",\n focusMode: \"continuous\",\n focusDistance: 0,\n frameRate: { ideal: 15, max: 30 },\n} as MediaTrackConstraints;\n\n/**\n * Zoom levels for different camera modes\n */\nexport const ZOOM_LEVELS = {\n FRONT: 1,\n BACK: 2,\n} as const;\n\n/**\n * Local storage key for camera ID with flash capability\n */\nexport const STORAGE_KEY_CAMERA_ID = \"modernBarcodeScannerCameraId\";\n","/**\n * Utility functions for barcode scanning and camera management\n * @module barcodeHelpers\n */\n\nimport {\n CAMERA_DEFAULTS,\n DESKTOP_CAMERA_SETTINGS,\n FACING_MODE,\n type FacingMode,\n MOBILE_CAMERA_SETTINGS,\n STORAGE_KEY_CAMERA_ID,\n ZOOM_LEVELS,\n} from \"../constants/camera\";\n\n/**\n * Detect if the current device is a mobile phone or tablet\n * @returns True if device is a phone/tablet\n */\nexport const isPhone = (): boolean => /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);\n\n/**\n * Convert color image data to grayscale using luminosity method\n * Optimized for performance using bitwise operations\n * @param imageData - Canvas ImageData object to convert\n * @returns Modified ImageData with grayscale values\n */\nexport const convertToGrayscale = (imageData: ImageData): ImageData => {\n const data = imageData.data;\n const len = data.length;\n\n // Optimized grayscale conversion using luminosity method\n // More accurate than simple average and uses bitwise operations for speed\n for (let i = 0; i < len; i += 4) {\n // Luminosity method: 0.299*R + 0.587*G + 0.114*B\n // Using bit shifts for faster multiplication approximation\n const gray = (data[i] * 77 + data[i + 1] * 150 + data[i + 2] * 29) >> 8;\n data[i] = gray;\n data[i + 1] = gray;\n data[i + 2] = gray;\n // Alpha channel (data[i + 3]) remains unchanged\n }\n return imageData;\n};\n\n/**\n * Determine the best rear camera for scanning based on various criteria\n * Prioritizes: main/wide camera > torch support > highest resolution\n * Works across Android and iOS devices with multiple cameras\n * @returns Device ID of the best rear camera or null\n */\nexport const getBestRearCamera = async (): Promise<string | null> => {\n // Request global permissions first so device labels are populated\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n for (const track of stream.getTracks()) {\n track.stop();\n }\n } catch (err) {\n console.warn(\"Camera permission denied or not available\", err);\n return null;\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n\n if (videoDevices.length === 0) return null;\n\n let bestCamera: string | null = null;\n let bestScore = -1;\n\n for (const device of videoDevices) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { deviceId: { exact: device.deviceId } },\n });\n\n const videoTrack = stream.getVideoTracks()[0];\n const capabilities = videoTrack.getCapabilities() as MediaTrackCapabilities & {\n torch?: boolean;\n };\n const settings = videoTrack.getSettings();\n\n // Stop the stream immediately\n for (const track of stream.getTracks()) {\n track.stop();\n }\n\n // Skip front-facing cameras\n if (settings.facingMode === \"user\") continue;\n\n let score = 0;\n const label = device.label.toLowerCase();\n\n // Priority 1: Identify main/wide camera by label (highest priority)\n // iOS: \"back camera\" or \"wide\" or \"camera 0\"\n // Android: \"camera 0\" or \"back camera\" or \"main camera\"\n if (\n label.includes(\"back camera\") &&\n !label.includes(\"ultra\") &&\n !label.includes(\"telephoto\")\n ) {\n score += 100;\n } else if (label.includes(\"wide\") && !label.includes(\"ultra\")) {\n score += 100;\n } else if (label.match(/camera\\s*0|main/i)) {\n score += 100;\n }\n\n // Priority 2: Torch/flash capability (strong indicator of main camera)\n if (capabilities.torch) {\n score += 50;\n }\n\n // Priority 3: Resolution (higher is better for scanning)\n if (capabilities.width?.max) {\n score += Math.min(capabilities.width.max / 100, 30); // Cap at 30 points\n }\n\n // Priority 4: Prefer environment facing mode\n if (settings.facingMode === \"environment\") {\n score += 20;\n }\n\n // Penalty: Avoid ultra-wide and telephoto cameras\n if (label.includes(\"ultra\") || label.includes(\"telephoto\") || label.includes(\"tele\")) {\n score -= 50;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCamera = device.deviceId;\n }\n } catch {\n // Camera not accessible, skip it\n console.warn(`Could not access camera: ${device.label}`);\n }\n }\n\n return bestCamera;\n};\n\n/**\n * Get best rear camera ID from localStorage or detect it\n * Caches the result in localStorage for future use\n * @returns Cached or newly detected camera ID\n */\nexport const getAndSetCameraIdWithFlash = async (): Promise<string | null> => {\n let cameraId = localStorage.getItem(STORAGE_KEY_CAMERA_ID);\n if (!cameraId) {\n cameraId = await getBestRearCamera();\n if (cameraId) {\n localStorage.setItem(STORAGE_KEY_CAMERA_ID, cameraId);\n }\n }\n return cameraId;\n};\n\n/**\n * Get optimized media constraints for camera access\n * Automatically adjusts settings based on device type and facing mode\n * @param facingMode - Camera facing mode ('user' or 'environment')\n * @returns Media constraints object\n */\nexport const getMediaConstraints = async (\n facingMode: FacingMode,\n): Promise<MediaStreamConstraints> => {\n const baseSettings = isPhone() ? MOBILE_CAMERA_SETTINGS : DESKTOP_CAMERA_SETTINGS;\n\n const customConstraints: MediaStreamConstraints = {\n audio: false,\n video: {\n ...baseSettings,\n ...CAMERA_DEFAULTS,\n facingMode,\n zoom: facingMode === FACING_MODE.USER ? ZOOM_LEVELS.FRONT : ZOOM_LEVELS.BACK,\n } as MediaTrackConstraints,\n };\n\n // For back camera on mobile, try to use camera with flash\n if (facingMode === FACING_MODE.ENVIRONMENT && isPhone()) {\n const cameraId = await getAndSetCameraIdWithFlash();\n if (cameraId && customConstraints.video && typeof customConstraints.video === \"object\") {\n (customConstraints.video as MediaTrackConstraints).deviceId = cameraId;\n }\n }\n\n return customConstraints;\n};\n\n/**\n * Stop all media tracks in a stream\n * @param stream - MediaStream to stop\n */\nexport const stopAllTracks = (stream: MediaStream | null): void => {\n for (const track of stream?.getTracks() ?? []) track.stop();\n};\n","/**\n * Plays a soft and pleasing beep sound using Web Audio API\n * Used to notify user of successful scan\n */\nexport const playScanSound = () => {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: window.webkitAudioContext is not standard\n const AudioContext = window.AudioContext || (window as any).webkitAudioContext;\n if (!AudioContext) return;\n\n const ctx = new AudioContext();\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.type = \"sine\";\n oscillator.frequency.setValueAtTime(880, ctx.currentTime); // A5\n\n // Soft envelope for pleasing sound\n gainNode.gain.setValueAtTime(0, ctx.currentTime);\n gainNode.gain.linearRampToValueAtTime(0.1, ctx.currentTime + 0.05); // Attack\n gainNode.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.3); // Decay\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n oscillator.start();\n oscillator.stop(ctx.currentTime + 0.3);\n } catch (error) {\n console.error(\"Failed to play scan sound:\", error);\n }\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { FacingMode } from \"../constants/camera\";\nimport {\n CANVAS_CONTEXT_OPTIONS,\n MAX_SCAN_DIMENSION,\n SCAN_INTERVAL_MS,\n VIBRATION_DURATION_MS,\n} from \"../constants/scanner\";\nimport type { ScannerConfig, ScannerState, ScanResult } from \"../types\";\nimport { getMediaConstraints, playScanSound, stopAllTracks } from \"../utils\";\nimport type { WorkerResponse } from \"../workers/scanner.worker\";\n\ninterface UseScannerOptions extends ScannerConfig {\n onScan: (result: ScanResult) => void;\n onError?: (error: Error) => void;\n onStateChange?: (state: ScannerState) => void;\n}\n\n// Module-level Web Worker caching for React 18 Strict Mode compatibility\nlet sharedWorker: Worker | null = null;\nlet workerRefCount = 0;\nlet terminateTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\nconst getSharedWorker = (): Worker => {\n if (terminateTimeoutId) {\n clearTimeout(terminateTimeoutId);\n terminateTimeoutId = null;\n }\n if (!sharedWorker) {\n sharedWorker = new Worker(new URL(\"../workers/scanner.worker.ts\", import.meta.url), {\n type: \"module\",\n });\n }\n workerRefCount++;\n return sharedWorker;\n};\n\nconst releaseSharedWorker = (): void => {\n workerRefCount--;\n if (workerRefCount <= 0) {\n // Delay termination to handle React 18 Strict Mode double-invocations\n terminateTimeoutId = setTimeout(() => {\n if (workerRefCount <= 0 && sharedWorker) {\n sharedWorker.terminate();\n sharedWorker = null;\n }\n }, 100);\n }\n};\n\n/**\n * Custom hook for barcode scanning logic and camera state management\n * Handles video stream, barcode detection, and camera controls\n */\nexport const useScanner = ({\n onScan,\n onError,\n onStateChange,\n scanInterval = SCAN_INTERVAL_MS,\n enableVibration = true,\n vibrationDuration = VIBRATION_DURATION_MS,\n enableSound = false,\n initialFacingMode = \"environment\",\n}: UseScannerOptions) => {\n const [scannerState, setScannerState] = useState<ScannerState>({\n isScanning: false,\n facingMode: initialFacingMode,\n isTorchOn: false,\n });\n\n // Refs for DOM elements\n const videoRef = useRef<HTMLVideoElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const contextRef = useRef<CanvasRenderingContext2D | null>(null);\n\n // Refs for scanning control\n const animationFrameId = useRef<number | null>(null);\n const workerRef = useRef<Worker | null>(null);\n const lastScanTimeRef = useRef<number>(0);\n\n // Session-based tracking\n const scanSessionRef = useRef<number>(0);\n const isWorkerBusy = useRef<boolean>(false);\n\n // Notify state changes\n useEffect(() => {\n onStateChange?.(scannerState);\n }, [scannerState, onStateChange]);\n\n /**\n * Stop scanning and cleanup resources\n */\n const handleStopScan = useCallback(() => {\n scanSessionRef.current += 1;\n\n if (animationFrameId.current) {\n cancelAnimationFrame(animationFrameId.current);\n animationFrameId.current = null;\n }\n\n if (videoRef.current) {\n videoRef.current.pause();\n stopAllTracks(videoRef.current.srcObject as MediaStream);\n videoRef.current.srcObject = null;\n }\n\n setScannerState((prev) => ({ ...prev, isScanning: false, isTorchOn: false }));\n }, []);\n\n const handleDetectionRef = useRef<((data: ScanResult) => void) | null>(null);\n handleDetectionRef.current = (data: ScanResult) => {\n handleStopScan();\n\n if (enableVibration) {\n window?.navigator?.vibrate?.(vibrationDuration);\n }\n\n if (enableSound) {\n playScanSound();\n }\n\n onScan(data);\n };\n\n // Initialize Web Worker - uses shared worker with delayed cleanup\n useEffect(() => {\n workerRef.current = getSharedWorker();\n\n const handleMessage = (e: MessageEvent<WorkerResponse>) => {\n const { found, data, sessionId } = e.data;\n isWorkerBusy.current = false;\n\n // Only process if this result belongs to current session\n if (sessionId === scanSessionRef.current && found && data) {\n handleDetectionRef.current?.(data);\n }\n };\n\n const handleError = (error: ErrorEvent) => {\n isWorkerBusy.current = false;\n onError?.(new Error(error.message));\n };\n\n workerRef.current.addEventListener(\"message\", handleMessage);\n workerRef.current.addEventListener(\"error\", handleError);\n\n return () => {\n if (workerRef.current) {\n workerRef.current.removeEventListener(\"message\", handleMessage);\n workerRef.current.removeEventListener(\"error\", handleError);\n workerRef.current = null;\n }\n releaseSharedWorker();\n };\n }, [onError]);\n\n /**\n * Initialize and start the barcode scanning process\n */\n const handleScan = useCallback(async () => {\n scanSessionRef.current += 1;\n const currentSession = scanSessionRef.current;\n isWorkerBusy.current = false;\n lastScanTimeRef.current = 0;\n\n setScannerState((prev) => ({ ...prev, isScanning: true }));\n\n try {\n const mediaConstraints = await getMediaConstraints(scannerState.facingMode);\n const stream = await navigator.mediaDevices.getUserMedia(mediaConstraints);\n\n // Check if session is still valid\n if (currentSession !== scanSessionRef.current) {\n stopAllTracks(stream);\n return;\n }\n\n if (!videoRef.current) {\n stopAllTracks(stream);\n return;\n }\n\n videoRef.current.srcObject = stream;\n await videoRef.current.play();\n\n // Double-check session is still valid after video starts\n if (currentSession !== scanSessionRef.current) {\n handleStopScan();\n return;\n }\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n // Reuse context for better performance\n if (!contextRef.current) {\n contextRef.current = canvas.getContext(\"2d\", CANVAS_CONTEXT_OPTIONS);\n }\n const context = contextRef.current;\n\n const width = videoRef.current.videoWidth;\n const height = videoRef.current.videoHeight;\n\n // Downscale for performance\n const scale = Math.min(MAX_SCAN_DIMENSION / width, MAX_SCAN_DIMENSION / height, 1);\n const scanWidth = Math.floor(width * scale);\n const scanHeight = Math.floor(height * scale);\n\n canvas.width = scanWidth;\n canvas.height = scanHeight;\n\n /**\n * Animation loop for continuous barcode scanning\n */\n const scanTick = () => {\n // Stop if session changed\n if (currentSession !== scanSessionRef.current) {\n return;\n }\n\n const now = Date.now();\n const timeSinceLastScan = now - lastScanTimeRef.current;\n\n // Throttle scan rate\n if (timeSinceLastScan < scanInterval || isWorkerBusy.current) {\n animationFrameId.current = requestAnimationFrame(scanTick);\n return;\n }\n\n lastScanTimeRef.current = now;\n\n try {\n if (!videoRef.current || !context || !workerRef.current) {\n animationFrameId.current = requestAnimationFrame(scanTick);\n return;\n }\n\n // Draw video frame to canvas with scaling\n context.drawImage(videoRef.current, 0, 0, scanWidth, scanHeight);\n const imageData = context.getImageData(0, 0, scanWidth, scanHeight);\n\n // Mark worker as busy before sending\n isWorkerBusy.current = true;\n\n // Send to worker with session ID for tracking\n workerRef.current.postMessage({ imageData, type: \"scan\", sessionId: currentSession }, [\n imageData.data.buffer,\n ]);\n\n animationFrameId.current = requestAnimationFrame(scanTick);\n } catch {\n isWorkerBusy.current = false;\n animationFrameId.current = requestAnimationFrame(scanTick);\n }\n };\n\n animationFrameId.current = requestAnimationFrame(scanTick);\n } catch (error) {\n handleStopScan();\n onError?.(error instanceof Error ? error : new Error(\"Failed to start scanner\"));\n }\n }, [scannerState.facingMode, handleStopScan, scanInterval, onError]);\n\n /**\n * Switch between front and back cameras\n */\n const handleSwitchCamera = useCallback(async () => {\n if (!videoRef.current || !scannerState.isScanning) return;\n\n const newFacingMode: FacingMode = scannerState.facingMode === \"user\" ? \"environment\" : \"user\";\n const currentSession = scanSessionRef.current;\n\n try {\n if (videoRef.current.srcObject) {\n stopAllTracks(videoRef.current.srcObject as MediaStream);\n }\n\n const mediaConstraints = await getMediaConstraints(newFacingMode);\n\n // Check if session is still valid after async operation\n if (currentSession !== scanSessionRef.current) {\n return;\n }\n\n const stream = await navigator.mediaDevices.getUserMedia(mediaConstraints);\n\n // Check again after getting stream\n if (currentSession !== scanSessionRef.current) {\n stopAllTracks(stream);\n return;\n }\n\n if (!videoRef.current) {\n stopAllTracks(stream);\n return;\n }\n\n videoRef.current.srcObject = stream;\n await videoRef.current.play();\n\n // Final check after video starts\n if (currentSession !== scanSessionRef.current) {\n handleStopScan();\n return;\n }\n\n const canvas = canvasRef.current;\n if (canvas) {\n canvas.width = videoRef.current.videoWidth;\n canvas.height = videoRef.current.videoHeight;\n }\n\n setScannerState((prev) => ({\n ...prev,\n facingMode: newFacingMode,\n isTorchOn: false,\n }));\n } catch (error) {\n handleStopScan();\n onError?.(error instanceof Error ? error : new Error(\"Failed to switch camera\"));\n }\n }, [scannerState.facingMode, scannerState.isScanning, handleStopScan, onError]);\n\n /**\n * Toggle the torch/flash\n */\n const handleToggleTorch = useCallback(async () => {\n const track = (videoRef.current?.srcObject as MediaStream)?.getVideoTracks()?.[0];\n const capabilities = track?.getCapabilities() as MediaTrackCapabilities & { torch?: boolean };\n if (!capabilities?.torch) return;\n\n const newTorchState = !scannerState.isTorchOn;\n try {\n // Using type assertion for torch constraint which is not in standard TypeScript definitions\n // but is supported by Chrome and other browsers\n await track.applyConstraints({\n advanced: [{ torch: newTorchState } as unknown as MediaTrackConstraintSet],\n });\n setScannerState((prev) => ({ ...prev, isTorchOn: newTorchState }));\n } catch {\n // Torch toggle failed silently\n }\n }, [scannerState.isTorchOn]);\n\n // Cleanup on unmount\n const handleStopScanRef = useRef(handleStopScan);\n handleStopScanRef.current = handleStopScan;\n\n useEffect(() => () => handleStopScanRef.current(), []);\n\n return {\n scannerState,\n videoRef,\n canvasRef,\n handleScan,\n handleStopScan,\n handleSwitchCamera,\n handleToggleTorch,\n };\n};\n","export const SCANNER_THEME = {\n primary: \"#4db8a8\",\n primaryDark: \"#3d9d8f\",\n stop: \"#ef4444\",\n stopDark: \"#dc2626\",\n} as const;\n","import type { SVGProps } from \"react\";\n\nexport const IconRotateCamera = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n {...props}\n >\n <title>Rotate Camera</title>\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n);\n\nexport const IconTorchOn = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" {...props}>\n <title>Torch On</title>\n <path\n fillRule=\"evenodd\"\n d=\"M14.615 1.595a.75.75 0 01.359.852L12.982 9.75h7.268a.75.75 0 01.548 1.262l-10.5 11.25a.75.75 0 01-1.272-.71l1.992-7.302H3.75a.75.75 0 01-.548-1.262l10.5-11.25a.75.75 0 01.913-.143z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const IconTorchOff = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" {...props}>\n <title>Torch Off</title>\n <path d=\"M3.27 3L2 4.27l5 5V13h3v9l3.58-6.14L17.73 20 19 18.73 3.27 3zM17 10h-4l4-8H7v2.18l8.46 8.46L17 10z\" />\n </svg>\n);\n\nexport const IconCameraPlaceholder = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n {...props}\n >\n <title>Camera Off</title>\n {/* Camera body with slash through it */}\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 3L6.00007 6.00007M21 21L19.8455 19.8221M9.74194 4.06811C9.83646 4.04279 9.93334 4.02428 10.0319 4.01299C10.1453 4 10.2683 4 10.5141 4H13.5327C13.7786 4 13.9015 4 14.015 4.01299C14.6068 4.08078 15.1375 4.40882 15.4628 4.90782C15.5252 5.00345 15.5802 5.11345 15.6901 5.33333C15.7451 5.44329 15.7726 5.49827 15.8037 5.54609C15.9664 5.79559 16.2318 5.95961 16.5277 5.9935C16.5844 6 16.6459 6 16.7688 6H17.8234C18.9435 6 19.5036 6 19.9314 6.21799C20.3077 6.40973 20.6137 6.71569 20.8055 7.09202C21.0234 7.51984 21.0234 8.0799 21.0234 9.2V15.3496M19.8455 19.8221C19.4278 20 18.8702 20 17.8234 20H6.22344C5.10333 20 4.54328 20 4.11546 19.782C3.73913 19.5903 3.43317 19.2843 3.24142 18.908C3.02344 18.4802 3.02344 17.9201 3.02344 16.8V9.2C3.02344 8.0799 3.02344 7.51984 3.24142 7.09202C3.43317 6.71569 3.73913 6.40973 4.11546 6.21799C4.51385 6.015 5.0269 6.00103 6.00007 6.00007M19.8455 19.8221L14.5619 14.5619M14.5619 14.5619C14.0349 15.4243 13.0847 16 12 16C10.3431 16 9 14.6569 9 13C9 11.9153 9.57566 10.9651 10.4381 10.4381M14.5619 14.5619L10.4381 10.4381M10.4381 10.4381L6.00007 6.00007\"\n />\n </svg>\n);\n","interface ScanLineProps {\n visible: boolean;\n}\n\n/**\n * Animated scanning line indicator\n */\nconst ScanLine = ({ visible }: ScanLineProps) => {\n if (!visible) return null;\n\n return (\n <div className=\"mbs-scan-line-container\">\n <div className=\"mbs-scan-line-trail-down\" />\n <div className=\"mbs-scan-line\" />\n <div className=\"mbs-scan-line-trail-up\" />\n </div>\n );\n};\n\nexport default ScanLine;\n","import { memo } from \"react\";\nimport { IconRotateCamera, IconTorchOff, IconTorchOn } from \"./Icons\";\n\ninterface ScannerControlsProps {\n isScanning: boolean;\n isTorchOn: boolean;\n shouldShowRotateButton: boolean;\n shouldShowTorchButton: boolean;\n onSwitchCamera: () => void;\n onToggleTorch: () => void;\n}\n\n/**\n * Scanner control buttons component (camera rotate and torch)\n */\nconst ScannerControls = ({\n isScanning,\n isTorchOn,\n shouldShowRotateButton,\n shouldShowTorchButton,\n onSwitchCamera,\n onToggleTorch,\n}: ScannerControlsProps) => {\n if (!isScanning) return null;\n if (!shouldShowRotateButton && !shouldShowTorchButton) return null;\n\n return (\n <div className=\"mbs-controls\">\n {/* Rotate Camera Button */}\n {shouldShowRotateButton && (\n <button\n type=\"button\"\n className=\"mbs-control-btn\"\n onClick={onSwitchCamera}\n aria-label=\"Switch camera\"\n >\n <IconRotateCamera className=\"mbs-icon\" />\n </button>\n )}\n\n {/* Torch Button */}\n {shouldShowTorchButton && (\n <button\n type=\"button\"\n className=\"mbs-control-btn\"\n onClick={onToggleTorch}\n aria-label={isTorchOn ? \"Turn off torch\" : \"Turn on torch\"}\n >\n {isTorchOn ? <IconTorchOff className=\"mbs-icon\" /> : <IconTorchOn className=\"mbs-icon\" />}\n </button>\n )}\n </div>\n );\n};\n\nexport default memo(ScannerControls);\n","import { forwardRef, useEffect, useImperativeHandle } from \"react\";\nimport { useScanner } from \"../hooks/useScanner\";\nimport { SCANNER_THEME } from \"../constants/theme\";\nimport type { BarcodeScannerProps, BarcodeScannerRef, ScannerState } from \"../types\";\nimport { isPhone } from \"../utils/barcodeHelpers\";\nimport { IconCameraPlaceholder } from \"./Icons\";\nimport ScanLine from \"./ScanLine\";\nimport ScannerControls from \"./ScannerControls\";\n\n/**\n * BarcodeScanner Component\n *\n * A high-performance barcode scanner React component with optimized detection.\n * Supports camera switching, torch control, and automatic phone detection.\n *\n * @example\n * ```tsx\n * import { BarcodeScanner, BarcodeScannerRef } from 'modern-barcode-scanner';\n * import 'modern-barcode-scanner/styles.css';\n *\n * const App = () => {\n * const scannerRef = useRef<BarcodeScannerRef>(null);\n *\n * const handleScan = (result) => {\n * console.log('Scanned:', result.scanData);\n * };\n *\n * useEffect(() => {\n * // Start scanning when component mounts\n * scannerRef.current?.start();\n * }, []);\n *\n * return (\n * <BarcodeScanner\n * ref={scannerRef}\n * onScan={handleScan}\n * />\n * );\n * };\n * ```\n */\nconst BarcodeScanner = forwardRef<BarcodeScannerRef, BarcodeScannerProps>(\n (\n {\n onScan,\n onError,\n onStateChange,\n scanInterval,\n enableVibration = true,\n vibrationDuration,\n enableSound = false,\n initialFacingMode = \"environment\",\n className = \"\",\n showScanLine = true,\n showCameraSwitch = true,\n showTorchButton = true,\n style,\n themeColor = SCANNER_THEME.primary,\n },\n ref,\n ) => {\n const {\n scannerState,\n videoRef,\n canvasRef,\n handleScan,\n handleStopScan,\n handleSwitchCamera,\n handleToggleTorch,\n } = useScanner({\n onScan,\n onError,\n onStateChange,\n scanInterval,\n enableVibration,\n vibrationDuration,\n enableSound,\n initialFacingMode,\n });\n\n const { isScanning, facingMode, isTorchOn } = scannerState;\n const isPhoneDevice = isPhone();\n\n // Expose imperative methods via ref\n useImperativeHandle(\n ref,\n () => ({\n start: handleScan,\n stop: handleStopScan,\n switchCamera: handleSwitchCamera,\n toggleTorch: handleToggleTorch,\n getState: (): ScannerState => scannerState,\n }),\n [handleScan, handleStopScan, handleSwitchCamera, handleToggleTorch, scannerState],\n );\n\n // Auto-cleanup on unmount\n useEffect(() => {\n return () => {\n handleStopScan();\n };\n }, [handleStopScan]);\n\n // Combine user styles with the custom theme color CSS variable\n const containerStyle = {\n ...style,\n \"--mbs-primary\": themeColor,\n } as React.CSSProperties;\n\n return (\n <div className={`mbs-container ${className}`} style={containerStyle}>\n {/* Camera Feed */}\n <section className=\"mbs-video-container\" aria-label=\"Barcode scanner viewfinder\">\n <IconCameraPlaceholder className=\"mbs-placeholder-icon\" />\n <video\n title=\"Barcode Scanner\"\n ref={videoRef}\n autoPlay\n muted\n playsInline\n className=\"mbs-video\"\n />\n </section>\n\n {/* Hidden canvas for image processing */}\n <canvas ref={canvasRef} hidden />\n\n {/* Scanning Animation Line */}\n <ScanLine visible={isScanning && showScanLine} />\n\n {/* Camera Controls */}\n <ScannerControls\n isScanning={isScanning}\n isTorchOn={isTorchOn}\n shouldShowRotateButton={showCameraSwitch && isScanning && isPhoneDevice}\n shouldShowTorchButton={\n showTorchButton && isScanning && isPhoneDevice && facingMode === \"environment\"\n }\n onSwitchCamera={handleSwitchCamera}\n onToggleTorch={handleToggleTorch}\n />\n </div>\n );\n },\n);\n\nBarcodeScanner.displayName = \"BarcodeScanner\";\n\nexport default BarcodeScanner;\n"],"names":["SCAN_INTERVAL_MS","VIBRATION_DURATION_MS","CANVAS_CONTEXT_OPTIONS","MAX_SCAN_DIMENSION","FACING_MODE","MOBILE_CAMERA_SETTINGS","DESKTOP_CAMERA_SETTINGS","CAMERA_DEFAULTS","ZOOM_LEVELS","STORAGE_KEY_CAMERA_ID","isPhone","getBestRearCamera","stream","track","err","videoDevices","device","bestCamera","bestScore","videoTrack","capabilities","settings","score","label","getAndSetCameraIdWithFlash","cameraId","getMediaConstraints","facingMode","customConstraints","stopAllTracks","playScanSound","AudioContext","ctx","oscillator","gainNode","error","sharedWorker","workerRefCount","terminateTimeoutId","getSharedWorker","_documentCurrentScript","releaseSharedWorker","useScanner","onScan","onError","onStateChange","scanInterval","enableVibration","vibrationDuration","enableSound","initialFacingMode","scannerState","setScannerState","useState","videoRef","useRef","canvasRef","contextRef","animationFrameId","workerRef","lastScanTimeRef","scanSessionRef","isWorkerBusy","useEffect","handleStopScan","useCallback","prev","handleDetectionRef","data","handleMessage","e","found","sessionId","handleError","handleScan","currentSession","mediaConstraints","canvas","context","width","height","scale","scanWidth","scanHeight","scanTick","now","imageData","handleSwitchCamera","newFacingMode","handleToggleTorch","newTorchState","handleStopScanRef","SCANNER_THEME","IconRotateCamera","props","jsxs","jsx","IconTorchOn","IconTorchOff","IconCameraPlaceholder","ScanLine","visible","ScannerControls","isScanning","isTorchOn","shouldShowRotateButton","shouldShowTorchButton","onSwitchCamera","onToggleTorch","memo","BarcodeScanner","forwardRef","className","showScanLine","showCameraSwitch","showTorchButton","style","themeColor","ref","isPhoneDevice","useImperativeHandle","containerStyle"],"mappings":"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"}
|