UNPKG

@undecaf/barcode-detector-polyfill

Version:

A WebAssembly polyfill for the Barcode Detection API

27 lines (24 loc) 8.12 kB
/*! * @undecaf/barcode-detector-polyfill v0.9.23 * A WebAssembly polyfill for the Barcode Detection API * Built 2025-07-15T19:32:39.610Z * (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 i}from"https://cdn.jsdelivr.net/npm/@undecaf/zbar-wasm@0.9.16/dist/main.js"; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */function a(e,t,n,i){return new(n||(n=Promise))((function(a,r){function o(e){try{c(i.next(e))}catch(e){r(e)}}function s(e){try{c(i.throw(e))}catch(e){r(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(o,s)}c((i=i.apply(e,t||[])).next())}))}class r{constructor(e,n=t.ZBAR_CFG_ENABLE,i=1){this.symbolType=e,this.configType=n,this.number=i,this.configSteps=[this]}static register(e,t,n=t.symbolType){return r.formatsToConfigs[e]=t,r.typesToFormats[n]=r.typesToFormats[n]||e,t}static formats(){return Object.keys(r.formatsToConfigs)}static toFormat(e){return r.typesToFormats[e]}static configure(e,t){var n;null===(n=r.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 o;r.formatsToConfigs={},r.typesToFormats={},r.register("codabar",new r(e.ZBAR_CODABAR)),r.register("code_39",new r(e.ZBAR_CODE39)),r.register("code_93",new r(e.ZBAR_CODE93)),r.register("code_128",new r(e.ZBAR_CODE128)),r.register("databar",new r(e.ZBAR_DATABAR)),r.register("databar_exp",new r(e.ZBAR_DATABAR_EXP)),r.register("ean_2",new r(e.ZBAR_EAN2)),r.register("ean_5",new r(e.ZBAR_EAN5)),r.register("ean_8",new r(e.ZBAR_EAN8)),r.register("ean_13",new r(e.ZBAR_EAN13)),r.register("ean_13+2",new r(e.ZBAR_EAN13)).add(new r(e.ZBAR_EAN2)),r.register("ean_13+5",new r(e.ZBAR_EAN13)).add(new r(e.ZBAR_EAN5)),r.register("isbn_10",new r(e.ZBAR_ISBN10)).add(new r(e.ZBAR_EAN13)),r.register("isbn_13",new r(e.ZBAR_ISBN13)).add(new r(e.ZBAR_EAN13)),r.register("isbn_13+2",new r(e.ZBAR_ISBN13)).add(new r(e.ZBAR_EAN13)).add(new r(e.ZBAR_EAN2)),r.register("isbn_13+5",new r(e.ZBAR_ISBN13)).add(new r(e.ZBAR_EAN13)).add(new r(e.ZBAR_EAN5)),r.register("itf",new r(e.ZBAR_I25)),r.register("qr_code",new r(e.ZBAR_QRCODE)),r.register("sq_code",new r(e.ZBAR_SQCODE)),r.register("upc_a",new r(e.ZBAR_UPCA)).add(new r(e.ZBAR_EAN13)),r.register("upc_e",new r(e.ZBAR_UPCE)).add(new r(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"}(o||(o={}));class s{}const c=(()=>{try{return new OffscreenCanvas(1,1).getContext("2d")instanceof OffscreenCanvasRenderingContext2D}catch(e){return!1}})();class d{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=>!r.formats().includes(e)));if(t.length)throw new TypeError(`Unsupported barcode format(s): ${t.join(", ")}`)}this.formats=e.formats||r.formats(),this.zbarConfig=e.zbar||new s}static getSupportedFormats(){return Promise.resolve(r.formats())}detect(e){d.validate(e);const t=d.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],i=e[1];return void 0!==this.zbarConfig.enableCache&&i.enableCache(this.zbarConfig.enableCache),n(t.data,t.width,t.height,i)})).then((e=>e.map((e=>this.toBarcodeDetectorResult(e)))))}catch(e){return Promise.reject(e)}}getScanner(){return new Promise(((n,o)=>a(this,void 0,void 0,(function*(){if(!this.scanner){const n=yield i();this.formats.length>0&&(n.setConfig(e.ZBAR_NONE,t.ZBAR_CFG_ENABLE,0),this.formats.forEach((e=>r.configure(n,e)))),this.scanner=n}n(this.scanner)}))))}toImageData(e){const t=e=>{const t=d.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,i=n.getContext("2d");return i.drawImage(e,0,0),i.getImageData(0,0,n.width,n.height)};if(e instanceof ImageData)return Promise.resolve(e);if(e instanceof Blob){if("function"==typeof createImageBitmap)return createImageBitmap(e).then((e=>t(e)));{const n=document.createElement("img");return n.src=URL.createObjectURL(e),n.decode().then((()=>t(n))).finally((()=>URL.revokeObjectURL(n.src)))}}return d.isRenderingContext(e)?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:r.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 validate(e){if(!d.isPolyfillImageBitmapSource(e))throw new TypeError("BarcodeDetector.detect() argument is not an ImageBitmapSource");if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement&&!e.complete)throw new DOMException(`Invalid HTMLImageElement.complete state: ${e.complete}`,"InvalidStateError");if("undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement&&[HTMLMediaElement.HAVE_NOTHING,HTMLMediaElement.HAVE_METADATA].includes(e.readyState))throw new DOMException(`Invalid HTMLVideoElement.readyState: ${e.readyState}`,"InvalidStateError");return!0}static isRenderingContext(e){return"undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D}static isPolyfillImageBitmapSource(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof SVGImageElement&&e instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame||d.isRenderingContext(e)||e instanceof ImageData||e instanceof Blob||e&&(0==e.width||0==e.height)}static intrinsicDimensions(e){return d.isRenderingContext(e)&&(e=e.canvas),{width:Number(e.naturalWidth||e.videoWidth||e.codedWidth||e.clientWidth||e.width),height:Number(e.naturalHeight||e.videoHeight||e.codedHeight||e.clientHeight||e.height)}}}const m="@undecaf/zbar-wasm",f="0.9.16",h="https://cdn.jsdelivr.net/npm/@undecaf/zbar-wasm@0.9.16";export{d as BarcodeDetectorPolyfill,o as Orientation,m as ZBAR_WASM_PKG_NAME,h as ZBAR_WASM_REPOSITORY,f as ZBAR_WASM_VERSION,s as ZBarConfig}; //# sourceMappingURL=main.js.map