"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Html5Qrcode = void 0; var core_1 = require("./core"); var strings_1 = require("./strings"); var utils_1 = require("./utils"); var code_decoder_1 = require("./code-decoder"); var factories_1 = require("./camera/factories"); var retriever_1 = require("./camera/retriever"); var state_manager_1 = require("./state-manager"); var Constants = (function (_super) { __extends(Constants, _super); function Constants() { return _super !== null && _super.apply(this, arguments) || this; } Constants.DEFAULT_WIDTH = 300; Constants.DEFAULT_WIDTH_OFFSET = 2; Constants.FILE_SCAN_MIN_HEIGHT = 300; Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING = 100; Constants.MIN_QR_BOX_SIZE = 50; Constants.SHADED_LEFT = 1; Constants.SHADED_RIGHT = 2; Constants.SHADED_TOP = 3; Constants.SHADED_BOTTOM = 4; Constants.SHADED_REGION_ELEMENT_ID = "qr-shaded-region"; Constants.VERBOSE = false; Constants.BORDER_SHADER_DEFAULT_COLOR = "#ffffff"; Constants.BORDER_SHADER_MATCH_COLOR = "rgb(90, 193, 56)"; return Constants; }(core_1.Html5QrcodeConstants)); var InternalHtml5QrcodeConfig = (function () { function InternalHtml5QrcodeConfig(config, logger) { this.logger = logger; this.fps = Constants.SCAN_DEFAULT_FPS; if (!config) { this.disableFlip = Constants.DEFAULT_DISABLE_FLIP; } else { if (config.fps) { this.fps = config.fps; } this.disableFlip = config.disableFlip === true; this.qrbox = config.qrbox; this.aspectRatio = config.aspectRatio; this.videoConstraints = config.videoConstraints; } } InternalHtml5QrcodeConfig.prototype.isMediaStreamConstraintsValid = function () { if (!this.videoConstraints) { this.logger.logError("Empty videoConstraints", true); return false; } return utils_1.VideoConstraintsUtil.isMediaStreamConstraintsValid(this.videoConstraints, this.logger); }; InternalHtml5QrcodeConfig.prototype.isShadedBoxEnabled = function () { return !(0, core_1.isNullOrUndefined)(this.qrbox); }; InternalHtml5QrcodeConfig.create = function (config, logger) { return new InternalHtml5QrcodeConfig(config, logger); }; return InternalHtml5QrcodeConfig; }()); var Html5Qrcode = (function () { function Html5Qrcode(elementId, configOrVerbosityFlag) { this.element = null; this.canvasElement = null; this.scannerPausedUiElement = null; this.hasBorderShaders = null; this.borderShaders = null; this.qrMatch = null; this.renderedCamera = null; this.qrRegion = null; this.context = null; this.lastScanImageFile = null; this.isScanning = false; if (!document.getElementById(elementId)) { throw "HTML Element with id=".concat(elementId, " not found"); } this.elementId = elementId; this.verbose = false; var experimentalFeatureConfig; var configObject; if (typeof configOrVerbosityFlag == "boolean") { this.verbose = configOrVerbosityFlag === true; } else if (configOrVerbosityFlag) { configObject = configOrVerbosityFlag; this.verbose = configObject.verbose === true; experimentalFeatureConfig = configObject.experimentalFeatures; } this.logger = new core_1.BaseLoggger(this.verbose); this.qrcode = new code_decoder_1.Html5QrcodeShim(this.getSupportedFormats(configOrVerbosityFlag), this.getUseBarCodeDetectorIfSupported(configObject), this.verbose, this.logger); this.foreverScanTimeout; this.shouldScan = true; this.stateManagerProxy = state_manager_1.StateManagerFactory.create(); } Html5Qrcode.prototype.start = function (cameraIdOrConfig, configuration, qrCodeSuccessCallback, qrCodeErrorCallback) { var _this = this; if (!cameraIdOrConfig) { throw "cameraIdOrConfig is required"; } if (!qrCodeSuccessCallback || typeof qrCodeSuccessCallback != "function") { throw "qrCodeSuccessCallback is required and should be a function."; } var qrCodeErrorCallbackInternal; if (qrCodeErrorCallback) { qrCodeErrorCallbackInternal = qrCodeErrorCallback; } else { qrCodeErrorCallbackInternal = this.verbose ? this.logger.log : function () { }; } var internalConfig = InternalHtml5QrcodeConfig.create(configuration, this.logger); this.clearElement(); var videoConstraintsAvailableAndValid = false; if (internalConfig.videoConstraints) { if (!internalConfig.isMediaStreamConstraintsValid()) { this.logger.logError("'videoConstraints' is not valid 'MediaStreamConstraints, " + "it will be ignored.'", true); } else { videoConstraintsAvailableAndValid = true; } } var areVideoConstraintsEnabled = videoConstraintsAvailableAndValid; var element = document.getElementById(this.elementId); var rootElementWidth = element.clientWidth ? element.clientWidth : Constants.DEFAULT_WIDTH; element.style.position = "relative"; this.shouldScan = true; this.element = element; var $this = this; var toScanningStateChangeTransaction = this.stateManagerProxy.startTransition(state_manager_1.Html5QrcodeScannerState.SCANNING); return new Promise(function (resolve, reject) { var videoConstraints = areVideoConstraintsEnabled ? internalConfig.videoConstraints : $this.createVideoConstraints(cameraIdOrConfig); if (!videoConstraints) { toScanningStateChangeTransaction.cancel(); reject("videoConstraints should be defined"); return; } var cameraRenderingOptions = {}; if (!areVideoConstraintsEnabled || internalConfig.aspectRatio) { cameraRenderingOptions.aspectRatio = internalConfig.aspectRatio; } var renderingCallbacks = { onRenderSurfaceReady: function (viewfinderWidth, viewfinderHeight) { $this.setupUi(viewfinderWidth, viewfinderHeight, internalConfig); $this.isScanning = true; $this.foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallbackInternal); } }; factories_1.CameraFactory.failIfNotSupported().then(function (factory) { factory.create(videoConstraints).then(function (camera) { return camera.render(_this.element, cameraRenderingOptions, renderingCallbacks) .then(function (renderedCamera) { $this.renderedCamera = renderedCamera; toScanningStateChangeTransaction.execute(); resolve(null); }) .catch(function (error) { toScanningStateChangeTransaction.cancel(); reject(error); }); }).catch(function (error) { toScanningStateChangeTransaction.cancel(); reject(strings_1.Html5QrcodeStrings.errorGettingUserMedia(error)); }); }).catch(function (_) { toScanningStateChangeTransaction.cancel(); reject(strings_1.Html5QrcodeStrings.cameraStreamingNotSupported()); }); }); }; Html5Qrcode.prototype.pause = function (shouldPauseVideo) { if (!this.stateManagerProxy.isStrictlyScanning()) { throw "Cannot pause, scanner is not scanning."; } this.stateManagerProxy.directTransition(state_manager_1.Html5QrcodeScannerState.PAUSED); this.showPausedState(); if ((0, core_1.isNullOrUndefined)(shouldPauseVideo) || shouldPauseVideo !== true) { shouldPauseVideo = false; } if (shouldPauseVideo && this.renderedCamera) { this.renderedCamera.pause(); } }; Html5Qrcode.prototype.resume = function () { if (!this.stateManagerProxy.isPaused()) { throw "Cannot result, scanner is not paused."; } if (!this.renderedCamera) { throw "renderedCamera doesn't exist while trying resume()"; } var $this = this; var transitionToScanning = function () { $this.stateManagerProxy.directTransition(state_manager_1.Html5QrcodeScannerState.SCANNING); $this.hidePausedState(); }; if (!this.renderedCamera.isPaused()) { transitionToScanning(); return; } this.renderedCamera.resume(function () { transitionToScanning(); }); }; Html5Qrcode.prototype.getState = function () { return this.stateManagerProxy.getState(); }; Html5Qrcode.prototype.stop = function () { var _this = this; if (!this.stateManagerProxy.isScanning()) { throw "Cannot stop, scanner is not running or paused."; } var toStoppedStateTransaction = this.stateManagerProxy.startTransition(state_manager_1.Html5QrcodeScannerState.NOT_STARTED); this.shouldScan = false; if (this.foreverScanTimeout) { clearTimeout(this.foreverScanTimeout); } var removeQrRegion = function () { if (!_this.element) { return; } var childElement = document.getElementById(Constants.SHADED_REGION_ELEMENT_ID); if (childElement) { _this.element.removeChild(childElement); } }; var $this = this; return this.renderedCamera.close().then(function () { $this.renderedCamera = null; if ($this.element) { $this.element.removeChild($this.canvasElement); $this.canvasElement = null; } removeQrRegion(); if ($this.qrRegion) { $this.qrRegion = null; } if ($this.context) { $this.context = null; } toStoppedStateTransaction.execute(); $this.hidePausedState(); $this.isScanning = false; return Promise.resolve(); }); }; Html5Qrcode.prototype.scanFile = function (imageFile, showImage) { return this.scanFileV2(imageFile, showImage) .then(function (html5qrcodeResult) { return html5qrcodeResult.decodedText; }); }; Html5Qrcode.prototype.scanFileV2 = function (imageFile, showImage) { var _this = this; if (!imageFile || !(imageFile instanceof File)) { throw "imageFile argument is mandatory and should be instance " + "of File. Use 'event.target.files[0]'."; } if ((0, core_1.isNullOrUndefined)(showImage)) { showImage = true; } if (!this.stateManagerProxy.canScanFile()) { throw "Cannot start file scan - ongoing camera scan"; } return new Promise(function (resolve, reject) { _this.possiblyCloseLastScanImageFile(); _this.clearElement(); _this.lastScanImageFile = URL.createObjectURL(imageFile); var inputImage = new Image; inputImage.onload = function () { var imageWidth = inputImage.width; var imageHeight = inputImage.height; var element = document.getElementById(_this.elementId); var containerWidth = element.clientWidth ? element.clientWidth : Constants.DEFAULT_WIDTH; var containerHeight = Math.max(element.clientHeight ? element.clientHeight : imageHeight, Constants.FILE_SCAN_MIN_HEIGHT); var config = _this.computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight); if (showImage) { var visibleCanvas = _this.createCanvasElement(containerWidth, containerHeight, "qr-canvas-visible"); visibleCanvas.style.display = "inline-block"; element.appendChild(visibleCanvas); var context_1 = visibleCanvas.getContext("2d"); if (!context_1) { throw "Unable to get 2d context from canvas"; } context_1.canvas.width = containerWidth; context_1.canvas.height = containerHeight; context_1.drawImage(inputImage, 0, 0, imageWidth, imageHeight, config.x, config.y, config.width, config.height); } var padding = Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING; var hiddenImageWidth = Math.max(inputImage.width, config.width); var hiddenImageHeight = Math.max(inputImage.height, config.height); var hiddenCanvasWidth = hiddenImageWidth + 2 * padding; var hiddenCanvasHeight = hiddenImageHeight + 2 * padding; var hiddenCanvas = _this.createCanvasElement(hiddenCanvasWidth, hiddenCanvasHeight); element.appendChild(hiddenCanvas); var context = hiddenCanvas.getContext("2d"); if (!context) { throw "Unable to get 2d context from canvas"; } context.canvas.width = hiddenCanvasWidth; context.canvas.height = hiddenCanvasHeight; context.drawImage(inputImage, 0, 0, imageWidth, imageHeight, padding, padding, hiddenImageWidth, hiddenImageHeight); try { _this.qrcode.decodeRobustlyAsync(hiddenCanvas) .then(function (result) { resolve(core_1.Html5QrcodeResultFactory.createFromQrcodeResult(result)); }) .catch(reject); } catch (exception) { reject("QR code parse error, error = ".concat(exception)); } }; inputImage.onerror = reject; inputImage.onabort = reject; inputImage.onstalled = reject; inputImage.onsuspend = reject; inputImage.src = URL.createObjectURL(imageFile); }); }; Html5Qrcode.prototype.clear = function () { this.clearElement(); }; Html5Qrcode.getCameras = function () { return retriever_1.CameraRetriever.retrieve(); }; Html5Qrcode.prototype.getRunningTrackCapabilities = function () { return this.getRenderedCameraOrFail().getRunningTrackCapabilities(); }; Html5Qrcode.prototype.getRunningTrackSettings = function () { return this.getRenderedCameraOrFail().getRunningTrackSettings(); }; Html5Qrcode.prototype.getRunningTrackCameraCapabilities = function () { return this.getRenderedCameraOrFail().getCapabilities(); }; Html5Qrcode.prototype.applyVideoConstraints = function (videoConstaints) { if (!videoConstaints) { throw "videoConstaints is required argument."; } else if (!utils_1.VideoConstraintsUtil.isMediaStreamConstraintsValid(videoConstaints, this.logger)) { throw "invalid videoConstaints passed, check logs for more details"; } return this.getRenderedCameraOrFail().applyVideoConstraints(videoConstaints); }; Html5Qrcode.prototype.getRenderedCameraOrFail = function () { if (this.renderedCamera == null) { throw "Scanning is not in running state, call this API only when" + " QR code scanning using camera is in running state."; } return this.renderedCamera; }; Html5Qrcode.prototype.getSupportedFormats = function (configOrVerbosityFlag) { var allFormats = [ core_1.Html5QrcodeSupportedFormats.QR_CODE, core_1.Html5QrcodeSupportedFormats.AZTEC, core_1.Html5QrcodeSupportedFormats.CODABAR, core_1.Html5QrcodeSupportedFormats.CODE_39, core_1.Html5QrcodeSupportedFormats.CODE_93, core_1.Html5QrcodeSupportedFormats.CODE_128, core_1.Html5QrcodeSupportedFormats.DATA_MATRIX, core_1.Html5QrcodeSupportedFormats.MAXICODE, core_1.Html5QrcodeSupportedFormats.ITF, core_1.Html5QrcodeSupportedFormats.EAN_13, core_1.Html5QrcodeSupportedFormats.EAN_8, core_1.Html5QrcodeSupportedFormats.PDF_417, core_1.Html5QrcodeSupportedFormats.RSS_14, core_1.Html5QrcodeSupportedFormats.RSS_EXPANDED, core_1.Html5QrcodeSupportedFormats.UPC_A, core_1.Html5QrcodeSupportedFormats.UPC_E, core_1.Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, ]; if (!configOrVerbosityFlag || typeof configOrVerbosityFlag == "boolean") { return allFormats; } if (!configOrVerbosityFlag.formatsToSupport) { return allFormats; } if (!Array.isArray(configOrVerbosityFlag.formatsToSupport)) { throw "configOrVerbosityFlag.formatsToSupport should be undefined " + "or an array."; } if (configOrVerbosityFlag.formatsToSupport.length === 0) { throw "Atleast 1 formatsToSupport is needed."; } var supportedFormats = []; for (var _i = 0, _a = configOrVerbosityFlag.formatsToSupport; _i < _a.length; _i++) { var format = _a[_i]; if ((0, core_1.isValidHtml5QrcodeSupportedFormats)(format)) { supportedFormats.push(format); } else { this.logger.warn("Invalid format: ".concat(format, " passed in config, ignoring.")); } } if (supportedFormats.length === 0) { throw "None of formatsToSupport match supported values."; } return supportedFormats; }; Html5Qrcode.prototype.getUseBarCodeDetectorIfSupported = function (config) { if ((0, core_1.isNullOrUndefined)(config)) { return true; } if (!(0, core_1.isNullOrUndefined)(config.useBarCodeDetectorIfSupported)) { return config.useBarCodeDetectorIfSupported !== false; } if ((0, core_1.isNullOrUndefined)(config.experimentalFeatures)) { return true; } var experimentalFeatures = config.experimentalFeatures; if ((0, core_1.isNullOrUndefined)(experimentalFeatures.useBarCodeDetectorIfSupported)) { return true; } return experimentalFeatures.useBarCodeDetectorIfSupported !== false; }; Html5Qrcode.prototype.validateQrboxSize = function (viewfinderWidth, viewfinderHeight, internalConfig) { var _this = this; var qrboxSize = internalConfig.qrbox; this.validateQrboxConfig(qrboxSize); var qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); var validateMinSize = function (size) { if (size < Constants.MIN_QR_BOX_SIZE) { throw "minimum size of 'config.qrbox' dimension value is" + " ".concat(Constants.MIN_QR_BOX_SIZE, "px."); } }; var correctWidthBasedOnRootElementSize = function (configWidth) { if (configWidth > viewfinderWidth) { _this.logger.warn("`qrbox.width` or `qrbox` is larger than the" + " width of the root element. The width will be truncated" + " to the width of root element."); configWidth = viewfinderWidth; } return configWidth; }; validateMinSize(qrDimensions.width); validateMinSize(qrDimensions.height); qrDimensions.width = correctWidthBasedOnRootElementSize(qrDimensions.width); }; Html5Qrcode.prototype.validateQrboxConfig = function (qrboxSize) { if (typeof qrboxSize === "number") { return; } if (typeof qrboxSize === "function") { return; } if (qrboxSize.width === undefined || qrboxSize.height === undefined) { throw "Invalid instance of QrDimensions passed for " + "'config.qrbox'. Both 'width' and 'height' should be set."; } }; Html5Qrcode.prototype.toQrdimensions = function (viewfinderWidth, viewfinderHeight, qrboxSize) { if (typeof qrboxSize === "number") { return { width: qrboxSize, height: qrboxSize }; } else if (typeof qrboxSize === "function") { try { return qrboxSize(viewfinderWidth, viewfinderHeight); } catch (error) { throw new Error("qrbox config was passed as a function but it failed with " + "unknown error" + error); } } return qrboxSize; }; Html5Qrcode.prototype.setupUi = function (viewfinderWidth, viewfinderHeight, internalConfig) { if (internalConfig.isShadedBoxEnabled()) { this.validateQrboxSize(viewfinderWidth, viewfinderHeight, internalConfig); } var qrboxSize = (0, core_1.isNullOrUndefined)(internalConfig.qrbox) ? { width: viewfinderWidth, height: viewfinderHeight } : internalConfig.qrbox; this.validateQrboxConfig(qrboxSize); var qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); if (qrDimensions.height > viewfinderHeight) { this.logger.warn("[Html5Qrcode] config.qrbox has height that is" + "greater than the height of the video stream. Shading will be" + " ignored"); } var shouldShadingBeApplied = internalConfig.isShadedBoxEnabled() && qrDimensions.height <= viewfinderHeight; var defaultQrRegion = { x: 0, y: 0, width: viewfinderWidth, height: viewfinderHeight }; var qrRegion = shouldShadingBeApplied ? this.getShadedRegionBounds(viewfinderWidth, viewfinderHeight, qrDimensions) : defaultQrRegion; var canvasElement = this.createCanvasElement(qrRegion.width, qrRegion.height); var contextAttributes = { willReadFrequently: true }; var context = canvasElement.getContext("2d", contextAttributes); context.canvas.width = qrRegion.width; context.canvas.height = qrRegion.height; this.element.append(canvasElement); if (shouldShadingBeApplied) { this.possiblyInsertShadingElement(this.element, viewfinderWidth, viewfinderHeight, qrDimensions); } this.createScannerPausedUiElement(this.element); this.qrRegion = qrRegion; this.context = context; this.canvasElement = canvasElement; }; Html5Qrcode.prototype.createScannerPausedUiElement = function (rootElement) { var scannerPausedUiElement = document.createElement("div"); scannerPausedUiElement.innerText = strings_1.Html5QrcodeStrings.scannerPaused(); scannerPausedUiElement.style.display = "none"; scannerPausedUiElement.style.position = "absolute"; scannerPausedUiElement.style.top = "0px"; scannerPausedUiElement.style.zIndex = "1"; scannerPausedUiElement.style.background = "rgba(9, 9, 9, 0.46)"; scannerPausedUiElement.style.color = "#FFECEC"; scannerPausedUiElement.style.textAlign = "center"; scannerPausedUiElement.style.width = "100%"; rootElement.appendChild(scannerPausedUiElement); this.scannerPausedUiElement = scannerPausedUiElement; }; Html5Qrcode.prototype.scanContext = function (qrCodeSuccessCallback, qrCodeErrorCallback) { var _this = this; if (this.stateManagerProxy.isPaused()) { return Promise.resolve(false); } return this.qrcode.decodeAsync(this.canvasElement) .then(function (result) { qrCodeSuccessCallback(result.text, core_1.Html5QrcodeResultFactory.createFromQrcodeResult(result)); _this.possiblyUpdateShaders(true); return true; }).catch(function (error) { _this.possiblyUpdateShaders(false); var errorMessage = strings_1.Html5QrcodeStrings.codeParseError(error); qrCodeErrorCallback(errorMessage, core_1.Html5QrcodeErrorFactory.createFrom(errorMessage)); return false; }); }; Html5Qrcode.prototype.foreverScan = function (internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback) { var _this = this; if (!this.shouldScan) { return; } if (!this.renderedCamera) { return; } var videoElement = this.renderedCamera.getSurface(); var widthRatio = videoElement.videoWidth / videoElement.clientWidth; var heightRatio = videoElement.videoHeight / videoElement.clientHeight; if (!this.qrRegion) { throw "qrRegion undefined when localMediaStream is ready."; } var sWidthOffset = this.qrRegion.width * widthRatio; var sHeightOffset = this.qrRegion.height * heightRatio; var sxOffset = this.qrRegion.x * widthRatio; var syOffset = this.qrRegion.y * heightRatio; this.context.drawImage(videoElement, sxOffset, syOffset, sWidthOffset, sHeightOffset, 0, 0, this.qrRegion.width, this.qrRegion.height); var triggerNextScan = function () { _this.foreverScanTimeout = setTimeout(function () { _this.foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback); }, _this.getTimeoutFps(internalConfig.fps)); }; this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) .then(function (isSuccessfull) { if (!isSuccessfull && internalConfig.disableFlip !== true) { _this.context.translate(_this.context.canvas.width, 0); _this.context.scale(-1, 1); _this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) .finally(function () { triggerNextScan(); }); } else { triggerNextScan(); } }).catch(function (error) { _this.logger.logError("Error happend while scanning context", error); triggerNextScan(); }); }; Html5Qrcode.prototype.createVideoConstraints = function (cameraIdOrConfig) { if (typeof cameraIdOrConfig == "string") { return { deviceId: { exact: cameraIdOrConfig } }; } else if (typeof cameraIdOrConfig == "object") { var facingModeKey = "facingMode"; var deviceIdKey = "deviceId"; var allowedFacingModeValues_1 = { "user": true, "environment": true }; var exactKey = "exact"; var isValidFacingModeValue = function (value) { if (value in allowedFacingModeValues_1) { return true; } else { throw "config has invalid 'facingMode' value = " + "'".concat(value, "'"); } }; var keys = Object.keys(cameraIdOrConfig); if (keys.length !== 1) { throw "'cameraIdOrConfig' object should have exactly 1 key," + " if passed as an object, found ".concat(keys.length, " keys"); } var key = Object.keys(cameraIdOrConfig)[0]; if (key !== facingModeKey && key !== deviceIdKey) { throw "Only '".concat(facingModeKey, "' and '").concat(deviceIdKey, "' ") + " are supported for 'cameraIdOrConfig'"; } if (key === facingModeKey) { var facingMode = cameraIdOrConfig.facingMode; if (typeof facingMode == "string") { if (isValidFacingModeValue(facingMode)) { return { facingMode: facingMode }; } } else if (typeof facingMode == "object") { if (exactKey in facingMode) { if (isValidFacingModeValue(facingMode["".concat(exactKey)])) { return { facingMode: { exact: facingMode["".concat(exactKey)] } }; } } else { throw "'facingMode' should be string or object with" + " ".concat(exactKey, " as key."); } } else { var type_1 = (typeof facingMode); throw "Invalid type of 'facingMode' = ".concat(type_1); } } else { var deviceId = cameraIdOrConfig.deviceId; if (typeof deviceId == "string") { return { deviceId: deviceId }; } else if (typeof deviceId == "object") { if (exactKey in deviceId) { return { deviceId: { exact: deviceId["".concat(exactKey)] } }; } else { throw "'deviceId' should be string or object with" + " ".concat(exactKey, " as key."); } } else { var type_2 = (typeof deviceId); throw "Invalid type of 'deviceId' = ".concat(type_2); } } } var type = (typeof cameraIdOrConfig); throw "Invalid type of 'cameraIdOrConfig' = ".concat(type); }; Html5Qrcode.prototype.computeCanvasDrawConfig = function (imageWidth, imageHeight, containerWidth, containerHeight) { if (imageWidth <= containerWidth && imageHeight <= containerHeight) { var xoffset = (containerWidth - imageWidth) / 2; var yoffset = (containerHeight - imageHeight) / 2; return { x: xoffset, y: yoffset, width: imageWidth, height: imageHeight }; } else { var formerImageWidth = imageWidth; var formerImageHeight = imageHeight; if (imageWidth > containerWidth) { imageHeight = (containerWidth / imageWidth) * imageHeight; imageWidth = containerWidth; } if (imageHeight > containerHeight) { imageWidth = (containerHeight / imageHeight) * imageWidth; imageHeight = containerHeight; } this.logger.log("Image downsampled from " + "".concat(formerImageWidth, "X").concat(formerImageHeight) + " to ".concat(imageWidth, "X").concat(imageHeight, ".")); return this.computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight); } }; Html5Qrcode.prototype.clearElement = function () { if (this.stateManagerProxy.isScanning()) { throw "Cannot clear while scan is ongoing, close it first."; } var element = document.getElementById(this.elementId); if (element) { element.innerHTML = ""; } }; Html5Qrcode.prototype.possiblyUpdateShaders = function (qrMatch) { if (this.qrMatch === qrMatch) { return; } if (this.hasBorderShaders && this.borderShaders && this.borderShaders.length) { this.borderShaders.forEach(function (shader) { shader.style.backgroundColor = qrMatch ? Constants.BORDER_SHADER_MATCH_COLOR : Constants.BORDER_SHADER_DEFAULT_COLOR; }); } this.qrMatch = qrMatch; }; Html5Qrcode.prototype.possiblyCloseLastScanImageFile = function () { if (this.lastScanImageFile) { URL.revokeObjectURL(this.lastScanImageFile); this.lastScanImageFile = null; } }; Html5Qrcode.prototype.createCanvasElement = function (width, height, customId) { var canvasWidth = width; var canvasHeight = height; var canvasElement = document.createElement("canvas"); canvasElement.style.width = "".concat(canvasWidth, "px"); canvasElement.style.height = "".concat(canvasHeight, "px"); canvasElement.style.display = "none"; canvasElement.id = (0, core_1.isNullOrUndefined)(customId) ? "qr-canvas" : customId; return canvasElement; }; Html5Qrcode.prototype.getShadedRegionBounds = function (width, height, qrboxSize) { if (qrboxSize.width > width || qrboxSize.height > height) { throw "'config.qrbox' dimensions should not be greater than the " + "dimensions of the root HTML element."; } return { x: (width - qrboxSize.width) / 2, y: (height - qrboxSize.height) / 2, width: qrboxSize.width, height: qrboxSize.height }; }; Html5Qrcode.prototype.possiblyInsertShadingElement = function (element, width, height, qrboxSize) { if ((width - qrboxSize.width) < 1 || (height - qrboxSize.height) < 1) { return; } var shadingElement = document.createElement("div"); shadingElement.style.position = "absolute"; var rightLeftBorderSize = (width - qrboxSize.width) / 2; var topBottomBorderSize = (height - qrboxSize.height) / 2; shadingElement.style.borderLeft = "".concat(rightLeftBorderSize, "px solid rgba(0, 0, 0, 0.48)"); shadingElement.style.borderRight = "".concat(rightLeftBorderSize, "px solid rgba(0, 0, 0, 0.48)"); shadingElement.style.borderTop = "".concat(topBottomBorderSize, "px solid rgba(0, 0, 0, 0.48)"); shadingElement.style.borderBottom = "".concat(topBottomBorderSize, "px solid rgba(0, 0, 0, 0.48)"); shadingElement.style.boxSizing = "border-box"; shadingElement.style.top = "0px"; shadingElement.style.bottom = "0px"; shadingElement.style.left = "0px"; shadingElement.style.right = "0px"; shadingElement.id = "".concat(Constants.SHADED_REGION_ELEMENT_ID); if ((width - qrboxSize.width) < 11 || (height - qrboxSize.height) < 11) { this.hasBorderShaders = false; } else { var smallSize = 5; var largeSize = 40; this.insertShaderBorders(shadingElement, largeSize, smallSize, -smallSize, null, 0, true); this.insertShaderBorders(shadingElement, largeSize, smallSize, -smallSize, null, 0, false); this.insertShaderBorders(shadingElement, largeSize, smallSize, null, -smallSize, 0, true); this.insertShaderBorders(shadingElement, largeSize, smallSize, null, -smallSize, 0, false); this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, -smallSize, null, -smallSize, true); this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, null, -smallSize, -smallSize, true); this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, -smallSize, null, -smallSize, false); this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, null, -smallSize, -smallSize, false); this.hasBorderShaders = true; } element.append(shadingElement); }; Html5Qrcode.prototype.insertShaderBorders = function (shaderElem, width, height, top, bottom, side, isLeft) { var elem = document.createElement("div"); elem.style.position = "absolute"; elem.style.backgroundColor = Constants.BORDER_SHADER_DEFAULT_COLOR; elem.style.width = "".concat(width, "px"); elem.style.height = "".concat(height, "px"); if (top !== null) { elem.style.top = "".concat(top, "px"); } if (bottom !== null) { elem.style.bottom = "".concat(bottom, "px"); } if (isLeft) { elem.style.left = "".concat(side, "px"); } else { elem.style.right = "".concat(side, "px"); } if (!this.borderShaders) { this.borderShaders = []; } this.borderShaders.push(elem); shaderElem.appendChild(elem); }; Html5Qrcode.prototype.showPausedState = function () { if (!this.scannerPausedUiElement) { throw "[internal error] scanner paused UI element not found"; } this.scannerPausedUiElement.style.display = "block"; }; Html5Qrcode.prototype.hidePausedState = function () { if (!this.scannerPausedUiElement) { throw "[internal error] scanner paused UI element not found"; } this.scannerPausedUiElement.style.display = "none"; }; Html5Qrcode.prototype.getTimeoutFps = function (fps) { return 1000 / fps; }; return Html5Qrcode; }()); exports.Html5Qrcode = Html5Qrcode; //# sourceMappingURL=html5-qrcode.js.map