@preflower/barcode-detector-polyfill
Version:
A WebAssembly polyfill for the Barcode Detection API
13 lines (12 loc) • 6.29 kB
JavaScript
/*!
* @preflower/barcode-detector-polyfill v0.9.21
* A WebAssembly polyfill for the Barcode Detection API
* Built 2024-11-29T04:04:31.263Z
* (c) 2021-present Ferdinand Kasper <fkasper@modus-operandi.at>
* Released under the MIT license.
*
* This work uses https://github.com/undecaf/zbar-wasm.git as per
* LGPL-2.1 section 6 (https://opensource.org/licenses/LGPL-2.1).
*/
import{ZBarSymbolType as e,ZBarConfigType as t,scanRGBABuffer as n,getDefaultScanner as r}from"@undecaf/zbar-wasm";function a(e,t,n,r){return new(n||(n=Promise))((function(a,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function o(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,o)}c((r=r.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;class i{constructor(e,n=t.ZBAR_CFG_ENABLE,r=1){this.symbolType=e,this.configType=n,this.number=r,this.configSteps=[this]}static register(e,t,n=t.symbolType){return i.formatsToConfigs[e]=t,i.typesToFormats[n]=i.typesToFormats[n]||e,t}static formats(){return Object.keys(i.formatsToConfigs)}static toFormat(e){return i.typesToFormats[e]}static configure(e,t){var n;null===(n=i.formatsToConfigs[t])||void 0===n||n.configSteps.forEach((t=>e.setConfig(t.symbolType,t.configType,t.number)))}add(e){return this.configSteps.push(e),this}}var s;i.formatsToConfigs={},i.typesToFormats={},i.register("codabar",new i(e.ZBAR_CODABAR)),i.register("code_39",new i(e.ZBAR_CODE39)),i.register("code_93",new i(e.ZBAR_CODE93)),i.register("code_128",new i(e.ZBAR_CODE128)),i.register("databar",new i(e.ZBAR_DATABAR)),i.register("databar_exp",new i(e.ZBAR_DATABAR_EXP)),i.register("ean_2",new i(e.ZBAR_EAN2)),i.register("ean_5",new i(e.ZBAR_EAN5)),i.register("ean_8",new i(e.ZBAR_EAN8)),i.register("ean_13",new i(e.ZBAR_EAN13)),i.register("ean_13+2",new i(e.ZBAR_EAN13)).add(new i(e.ZBAR_EAN2)),i.register("ean_13+5",new i(e.ZBAR_EAN13)).add(new i(e.ZBAR_EAN5)),i.register("isbn_10",new i(e.ZBAR_ISBN10)).add(new i(e.ZBAR_EAN13)),i.register("isbn_13",new i(e.ZBAR_ISBN13)).add(new i(e.ZBAR_EAN13)),i.register("isbn_13+2",new i(e.ZBAR_ISBN13)).add(new i(e.ZBAR_EAN13)).add(new i(e.ZBAR_EAN2)),i.register("isbn_13+5",new i(e.ZBAR_ISBN13)).add(new i(e.ZBAR_EAN13)).add(new i(e.ZBAR_EAN5)),i.register("itf",new i(e.ZBAR_I25)),i.register("qr_code",new i(e.ZBAR_QRCODE)),i.register("sq_code",new i(e.ZBAR_SQCODE)),i.register("upc_a",new i(e.ZBAR_UPCA)).add(new i(e.ZBAR_EAN13)),i.register("upc_e",new i(e.ZBAR_UPCE)).add(new i(e.ZBAR_EAN13)),function(e){e[e.UNKNOWN=-1]="UNKNOWN",e[e.UPRIGHT=0]="UPRIGHT",e[e.ROTATED_RIGHT=1]="ROTATED_RIGHT",e[e.UPSIDE_DOWN=2]="UPSIDE_DOWN",e[e.ROTATED_LEFT=3]="ROTATED_LEFT"}(s||(s={}));class o{}const c=(()=>{try{return new OffscreenCanvas(1,1).getContext("2d")instanceof OffscreenCanvasRenderingContext2D}catch(e){return!1}})();class m{constructor(e={}){if(void 0!==e.formats){if(!Array.isArray(e.formats)||!e.formats.length)throw new TypeError(`Barcode formats should be a non-empty array of strings but are: ${JSON.stringify(e)}`);const t=e.formats.filter((e=>!i.formats().includes(e)));if(t.length)throw new TypeError(`Unsupported barcode format(s): ${t.join(", ")}`)}this.formats=e.formats||i.formats(),this.zbarConfig=e.zbar||new o}static getSupportedFormats(){return Promise.resolve(i.formats())}detect(e){if(!m.isImageBitmapSource(e))throw new TypeError("BarcodeDetector.detect() argument is not an ImageBitmapSource");const t=m.intrinsicDimensions(e);if(0===t.width||0===t.height)return Promise.resolve([]);try{return Promise.all([this.toImageData(e),this.getScanner()]).then((e=>{const t=e[0],r=e[1];return void 0!==this.zbarConfig.enableCache&&r.enableCache(this.zbarConfig.enableCache),n(t.data,t.width,t.height,r)})).then((e=>e.map((e=>this.toBarcodeDetectorResult(e)))))}catch(e){return Promise.reject(e)}}getScanner(){return new Promise(((n,s)=>a(this,void 0,void 0,(function*(){if(!this.scanner){const n=yield r();this.formats.length>0&&(n.setConfig(e.ZBAR_NONE,t.ZBAR_CFG_ENABLE,0),this.formats.forEach((e=>i.configure(n,e)))),this.scanner=n}n(this.scanner)}))))}toImageData(e){const t=e=>{const t=m.intrinsicDimensions(e);this.canvas&&this.canvas.width===t.width&&this.canvas.height===t.height||(this.canvas=function(e,t){if(c)return new OffscreenCanvas(e,t);{const n=document.createElement("canvas");return n.width=e,n.height=t,n}}(t.width,t.height));const n=this.canvas,r=n.getContext("2d");return r.drawImage(e,0,0),r.getImageData(0,0,n.width,n.height)};if(e instanceof ImageData)return Promise.resolve(e);if(e instanceof Blob){const n=document.createElement("img");return n.src=URL.createObjectURL(e),n.decode().then((()=>t(n))).finally((()=>URL.revokeObjectURL(n.src)))}return e instanceof CanvasRenderingContext2D?Promise.resolve(e.getImageData(0,0,e.canvas.width,e.canvas.height)):Promise.resolve(t(e))}toBarcodeDetectorResult(e){const t={minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0};e.points.forEach((e=>{t.minX=Math.min(t.minX,e.x),t.maxX=Math.max(t.maxX,e.x),t.minY=Math.min(t.minY,e.y),t.maxY=Math.max(t.maxY,e.y)}));return{format:i.toFormat(e.type),rawValue:e.decode(this.zbarConfig.encoding),orientation:e.orientation,quality:e.quality,boundingBox:DOMRectReadOnly.fromRect({x:t.minX,y:t.minY,width:t.maxX-t.minX,height:t.maxY-t.minY}),cornerPoints:[{x:t.minX,y:t.minY},{x:t.maxX,y:t.minY},{x:t.maxX,y:t.maxY},{x:t.minX,y:t.maxY}]}}static isImageBitmapSource(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof ImageData||e instanceof Blob||e&&0==e.width||e&&0==e.height}static intrinsicDimensions(e){return{width:Number(e.naturalWidth||e.videoWidth||e.width),height:Number(e.naturalHeight||e.videoHeight||e.height)}}}const d="@undecaf/zbar-wasm",f="0.9.15",h="https://cdn.jsdelivr.net/npm/@undecaf/zbar-wasm@0.9.15";export{m as BarcodeDetectorPolyfill,s as Orientation,d as ZBAR_WASM_PKG_NAME,h as ZBAR_WASM_REPOSITORY,f as ZBAR_WASM_VERSION,o as ZBarConfig};
//# sourceMappingURL=main.js.map