{"version":3,"file":"zxing-ngx-scanner.mjs","sources":["../../../projects/zxing-scanner/src/lib/browser-multi-format-continuous-reader.ts","../../../projects/zxing-scanner/src/lib/zxing-scanner.component.ts","../../../projects/zxing-scanner/src/lib/zxing-scanner.component.html","../../../projects/zxing-scanner/src/lib/zxing-scanner.module.ts","../../../projects/zxing-scanner/src/public_api.ts","../../../projects/zxing-scanner/src/zxing-ngx-scanner.ts"],"sourcesContent":["import { ChecksumException, FormatException, NotFoundException } from '@zxing/library';\nimport { BrowserMultiFormatReader, IScannerControls } from '@zxing/browser';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { ResultAndError } from './ResultAndError';\n\n/**\n * Based on zxing-typescript BrowserCodeReader\n */\nexport class BrowserMultiFormatContinuousReader extends BrowserMultiFormatReader {\n\n  /**\n   * Allows to call scanner controls API while scanning.\n   * Will be undefined if no scanning is running.\n   */\n  protected scannerControls: IScannerControls;\n\n  /**\n   * Returns the code reader scanner controls.\n   */\n  public getScannerControls(): IScannerControls {\n    if (!this.scannerControls) {\n      throw new Error('No scanning is running at the time.');\n    }\n    return this.scannerControls;\n  }\n\n  /**\n   * Starts the decoding from the current or a new video element.\n   *\n   * @param deviceId The device's to be used Id\n   * @param previewEl A new video element\n   */\n  public async scanFromDeviceObservable(\n    deviceId?: string,\n    previewEl?: HTMLVideoElement\n  ): Promise<Observable<ResultAndError>> {\n\n    const scan$ = new BehaviorSubject<ResultAndError>({});\n    let ctrls;\n\n    try {\n      ctrls = await this.decodeFromVideoDevice(deviceId, previewEl, (result, error) => {\n\n        if (!error) {\n          scan$.next({ result });\n          return;\n        }\n\n        const errorName = error.name;\n\n        // stream cannot stop on fails.\n        if (\n          // scan Failure - found nothing, no error\n          errorName === NotFoundException.name ||\n          // scan Error - found the QR but got error on decoding\n          errorName === ChecksumException.name ||\n          errorName === FormatException.name ||\n          error.message.includes('No MultiFormat Readers were able to detect the code.')\n        ) {\n          scan$.next({ error });\n          return;\n        }\n\n        // probably fatal error\n        scan$.error(error);\n        this.scannerControls.stop();\n        this.scannerControls = undefined;\n        return;\n      });\n\n      this.scannerControls = {\n        ...ctrls,\n        stop() {\n          ctrls.stop();\n          scan$.complete();\n        },\n      };\n    } catch (e) {\n      scan$.error(e);\n      this.scannerControls?.stop();\n      this.scannerControls = undefined;\n    }\n\n    return scan$.asObservable();\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  ViewChild\n} from '@angular/core';\nimport { BrowserCodeReader } from '@zxing/browser';\nimport {\n  BarcodeFormat,\n  DecodeHintType,\n  Exception,\n  Result\n} from '@zxing/library';\nimport { Subscription } from 'rxjs';\nimport { BrowserMultiFormatContinuousReader } from './browser-multi-format-continuous-reader';\nimport { ResultAndError } from './ResultAndError';\n\n\n@Component({\n    selector: 'zxing-scanner',\n    templateUrl: './zxing-scanner.component.html',\n    styleUrls: ['./zxing-scanner.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    standalone: false\n})\nexport class ZXingScannerComponent implements OnInit, OnDestroy {\n\n  /**\n   * Supported Hints map.\n   */\n  private _hints: Map<DecodeHintType, any> | null;\n\n  /**\n   * The ZXing code reader.\n   */\n  private _codeReader: BrowserMultiFormatContinuousReader;\n\n  /**\n   * The device that should be used to scan things.\n   */\n  private _device: MediaDeviceInfo;\n\n  /**\n   * The device that should be used to scan things.\n   */\n  private _enabled: boolean;\n\n  /**\n   *\n   */\n  private _isAutostarting: boolean;\n\n  /**\n   * Has `navigator` access.\n   */\n  private hasNavigator: boolean;\n\n  /**\n   * Says if some native API is supported.\n   */\n  private isMediaDevicesSupported: boolean;\n\n  /**\n   * If the user-agent allowed the use of the camera or not.\n   */\n  private hasPermission: boolean | null;\n\n  /**\n   * Unsubscribe to stop scanning.\n   */\n  private _scanSubscription?: Subscription;\n\n  /**\n   * Reference to the preview element, should be the `video` tag.\n   */\n  @ViewChild('preview', { static: true })\n  previewElemRef: ElementRef<HTMLVideoElement>;\n\n  /**\n   * Enable or disable autofocus of the camera (might have an impact on performance)\n   */\n  @Input()\n  autofocusEnabled: boolean;\n\n  /**\n   * Delay between attempts to decode (default is 500ms)\n   */\n  @Input()\n  timeBetweenScans = 500;\n\n  /**\n   * Delay between successful decode (default is 500ms)\n   */\n  @Input()\n  delayBetweenScanSuccess = 500;\n\n  /**\n   * Emits when and if the scanner is autostarted.\n   */\n  @Output()\n  autostarted: EventEmitter<void>;\n\n  /**\n   * True during autostart and false after. It will be null if won't autostart at all.\n   */\n  @Output()\n  autostarting: EventEmitter<boolean>;\n\n  /**\n   * If the scanner should autostart with the first available device.\n   */\n  @Input()\n  autostart: boolean;\n\n  /**\n   * How the preview element should be fit inside the :host container.\n   */\n  @Input()\n  previewFitMode: 'fill' | 'contain' | 'cover' | 'scale-down' | 'none' = 'cover';\n\n  /**\n   * Url of the HTML video poster\n   */\n  @Input()\n  poster: string = '';\n\n  /**\n   * Emits events when the torch compatibility is changed.\n   */\n  @Output()\n  torchCompatible: EventEmitter<boolean>;\n\n  /**\n   * Emits events when a scan is successful performed, will inject the string value of the QR-code to the callback.\n   */\n  @Output()\n  scanSuccess: EventEmitter<string>;\n\n  /**\n   * Emits events when a scan fails without errors, useful to know how much scan tries where made.\n   */\n  @Output()\n  scanFailure: EventEmitter<Exception | undefined>;\n\n  /**\n   * Emits events when a scan throws some error, will inject the error to the callback.\n   */\n  @Output()\n  scanError: EventEmitter<Error>;\n\n  /**\n   * Emits events when a scan is performed, will inject the Result value of the QR-code scan (if available) to the callback.\n   */\n  @Output()\n  scanComplete: EventEmitter<Result>;\n\n  /**\n   * Emits events when no cameras are found, will inject an exception (if available) to the callback.\n   */\n  @Output()\n  camerasFound: EventEmitter<MediaDeviceInfo[]>;\n\n  /**\n   * Emits events when no cameras are found, will inject an exception (if available) to the callback.\n   */\n  @Output()\n  camerasNotFound: EventEmitter<any>;\n\n  /**\n   * Emits events when the users answers for permission.\n   */\n  @Output()\n  permissionResponse: EventEmitter<boolean>;\n\n  /**\n   * Emits events when has devices status is update.\n   */\n  @Output()\n  hasDevices: EventEmitter<boolean>;\n\n  private _ready = false;\n\n  private _devicePreStart: MediaDeviceInfo;\n\n  /**\n   * Exposes the current code reader, so the user can use it's APIs.\n   */\n  get codeReader(): BrowserMultiFormatContinuousReader {\n    return this._codeReader;\n  }\n\n  /**\n   * User device input\n   */\n  @Input()\n  set device(device: MediaDeviceInfo | undefined) {\n\n    if (!this._ready) {\n      this._devicePreStart = device;\n      // let's ignore silently, users don't like logs\n      return;\n    }\n\n    if (this.isAutostarting) {\n      // do not allow setting devices during auto-start, since it will set one and emit it.\n      console.warn('Avoid setting a device during auto-start.');\n      return;\n    }\n\n    if (this.isCurrentDevice(device)) {\n      console.warn('Setting the same device is not allowed.');\n      return;\n    }\n\n    if (!this.hasPermission) {\n      console.warn('Permissions not set yet, waiting for them to be set to apply device change.');\n      // this.permissionResponse\n      //   .pipe(\n      //     take(1),\n      //     tap(() => console.log(`Permissions set, applying device change${device ? ` (${device.deviceId})` : ''}.`))\n      //   )\n      //   .subscribe(() => this.device = device);\n      return;\n    }\n\n    this.setDevice(device);\n  }\n\n  /**\n   * Emits when the current device is changed.\n   */\n  @Output()\n  deviceChange: EventEmitter<MediaDeviceInfo>;\n\n  /**\n   * User device accessor.\n   */\n  get device() {\n    return this._device;\n  }\n\n  /**\n   * Returns all the registered formats.\n   */\n  get formats(): BarcodeFormat[] {\n    return this.hints.get(DecodeHintType.POSSIBLE_FORMATS);\n  }\n\n  /**\n   * Registers formats the scanner should support.\n   *\n   * @param input BarcodeFormat or case-insensitive string array.\n   */\n  @Input()\n  set formats(input: BarcodeFormat[]) {\n\n    if (typeof input === 'string') {\n      throw new Error('Invalid formats, make sure the [formats] input is a binding.');\n    }\n\n    // formats may be set from html template as BarcodeFormat or string array\n    const formats = input.map(f => this.getBarcodeFormatOrFail(f));\n\n    const hints = this.hints;\n\n    // updates the hints\n    hints.set(DecodeHintType.POSSIBLE_FORMATS, formats);\n\n    // handles updating the codeReader\n    this.hints = hints;\n  }\n\n  /**\n   * Returns all the registered hints.\n   */\n  get hints() {\n    return this._hints;\n  }\n\n  /**\n   * Does what it takes to set the hints.\n   */\n  set hints(hints: Map<DecodeHintType, any>) {\n    this._hints = hints;\n    // new instance with new hints.\n    this.codeReader?.setHints(this._hints);\n  }\n\n  /**\n   * Sets the desired constraints in all video tracks.\n   * @experimental\n   */\n  @Input()\n  set videoConstraints(constraints: MediaTrackConstraints) {\n    // new instance with new hints.\n    const controls = this.codeReader?.getScannerControls();\n\n    if (!controls) {\n      // fails silently\n      return;\n    }\n\n    controls?.streamVideoConstraintsApply(constraints);\n  }\n\n  /**\n   *\n   */\n  set isAutostarting(state: boolean) {\n    this._isAutostarting = state;\n    this.autostarting.next(state);\n  }\n\n  /**\n   *\n   */\n  get isAutostarting(): boolean {\n    return this._isAutostarting;\n  }\n\n  /**\n   * Can turn on/off the device flashlight.\n   *\n   * @experimental Torch/Flash APIs are not stable in all browsers, it may be buggy!\n   */\n  @Input()\n  set torch(onOff: boolean) {\n    try {\n      const controls = this.getCodeReader().getScannerControls();\n      controls.switchTorch(onOff);\n    } catch (error) {\n      // ignore error\n    }\n  }\n\n  /**\n   * Starts and Stops the scanning.\n   */\n  @Input()\n  set enable(enabled: boolean) {\n\n    if (this._enabled === Boolean(enabled)) {\n      return;\n    }\n\n    this._enabled = Boolean(enabled);\n\n    if (!this._enabled) {\n      this.reset();\n      BrowserMultiFormatContinuousReader.releaseAllStreams();\n    } else {\n      if (this.device) {\n        this.scanFromDevice(this.device.deviceId);\n      } else {\n        this.init();\n      }\n    }\n  }\n\n  /**\n   * Tells if the scanner is enabled or not.\n   */\n  get enabled(): boolean {\n    return this._enabled;\n  }\n\n  /**\n   * If is `tryHarder` enabled.\n   */\n  get tryHarder(): boolean {\n    return this.hints.get(DecodeHintType.TRY_HARDER);\n  }\n\n  /**\n   * Enable/disable tryHarder hint.\n   */\n  @Input()\n  set tryHarder(enable: boolean) {\n\n    const hints = this.hints;\n\n    if (enable) {\n      hints.set(DecodeHintType.TRY_HARDER, true);\n    } else {\n      hints.delete(DecodeHintType.TRY_HARDER);\n    }\n\n    this.hints = hints;\n  }\n\n  /**\n   * Constructor to build the object and do some DI.\n   */\n  constructor() {\n    // instance based emitters\n    this.autostarted = new EventEmitter();\n    this.autostarting = new EventEmitter();\n    this.torchCompatible = new EventEmitter(false);\n    this.scanSuccess = new EventEmitter();\n    this.scanFailure = new EventEmitter();\n    this.scanError = new EventEmitter();\n    this.scanComplete = new EventEmitter();\n    this.camerasFound = new EventEmitter();\n    this.camerasNotFound = new EventEmitter();\n    this.permissionResponse = new EventEmitter(true);\n    this.hasDevices = new EventEmitter();\n    this.deviceChange = new EventEmitter();\n\n    this._enabled = true;\n    this._hints = new Map<DecodeHintType, any>();\n    this.autofocusEnabled = true;\n    this.autostart = true;\n    this.formats = [BarcodeFormat.QR_CODE];\n\n    // computed data\n    this.hasNavigator = typeof navigator !== 'undefined';\n    this.isMediaDevicesSupported = this.hasNavigator && !!navigator.mediaDevices;\n  }\n\n  /**\n   * Gets and registers all cameras.\n   */\n  async askForPermission(): Promise<boolean> {\n\n    if (!this.hasNavigator) {\n      console.error('@zxing/ngx-scanner', 'Can\\'t ask permission, navigator is not present.');\n      this.setPermission(null);\n      return this.hasPermission;\n    }\n\n    if (!this.isMediaDevicesSupported) {\n      console.error('@zxing/ngx-scanner', 'Can\\'t get user media, this is not supported.');\n      this.setPermission(null);\n      return this.hasPermission;\n    }\n\n    let stream: MediaStream;\n    let permission: boolean;\n\n    try {\n      // Will try to ask for permission\n      stream = await this.getAnyVideoDevice();\n      permission = !!stream;\n    } catch (err) {\n      return this.handlePermissionException(err);\n    } finally {\n      this.terminateStream(stream);\n    }\n\n    this.setPermission(permission);\n\n    // Returns the permission\n    return permission;\n  }\n\n  /**\n   *\n   */\n  getAnyVideoDevice(): Promise<MediaStream> {\n    return navigator.mediaDevices.getUserMedia({ video: true });\n  }\n\n  /**\n   * Terminates a stream and it's tracks.\n   */\n  private terminateStream(stream: MediaStream) {\n\n    if (stream) {\n      stream.getTracks().forEach(t => t.stop());\n    }\n\n    stream = undefined;\n  }\n\n  private async init() {\n    if (!this.autostart) {\n      console.warn('Feature \\'autostart\\' disabled. Permissions and devices recovery has to be run manually.');\n\n      // does the necessary configuration without autostarting\n      this.initAutostartOff();\n\n      this._ready = true;\n\n      return;\n    }\n\n    // configures the component and starts the scanner\n    await this.initAutostartOn();\n\n    this._ready = true;\n  }\n\n  /**\n   * Initializes the component without starting the scanner.\n   */\n  private initAutostartOff(): void {\n\n    // do not ask for permission when autostart is off\n    this.isAutostarting = false;\n\n    // just update devices information\n    this.updateVideoInputDevices();\n\n    if (this._device && this._devicePreStart) {\n      this.setDevice(this._devicePreStart);\n    }\n  }\n\n  /**\n   * Initializes the component and starts the scanner.\n   * Permissions are asked to accomplish that.\n   */\n  private async initAutostartOn(): Promise<void> {\n\n    this.isAutostarting = true;\n\n    let hasPermission: boolean;\n\n    try {\n      // Asks for permission before enumerating devices so it can get all the device's info\n      hasPermission = await this.askForPermission();\n    } catch (e) {\n      console.error('Exception occurred while asking for permission:', e);\n      return;\n    }\n\n    // from this point, things gonna need permissions\n    if (hasPermission) {\n      const devices = await this.updateVideoInputDevices();\n      await this.autostartScanner([...devices]);\n    }\n\n    this.isAutostarting = false;\n    this.autostarted.next();\n  }\n\n  /**\n   * Checks if the given device is the current defined one.\n   */\n  isCurrentDevice(device?: MediaDeviceInfo) {\n    return device?.deviceId === this._device?.deviceId;\n  }\n\n  /**\n   * Executes some actions before destroy the component.\n   */\n  ngOnDestroy(): void {\n    this.reset();\n    BrowserCodeReader.cleanVideoSource(this.previewElemRef.nativeElement);\n    BrowserMultiFormatContinuousReader.releaseAllStreams();\n  }\n\n  /**\n   *\n   */\n  ngOnInit(): void {\n    this.init();\n  }\n\n  /**\n   * Stops the scanning, if any.\n   */\n  public scanStop() {\n    if (this._scanSubscription) {\n      this.codeReader?.getScannerControls().stop();\n      this._scanSubscription?.unsubscribe();\n      this._scanSubscription = undefined;\n    }\n  }\n\n  /**\n   * Stops the scanning, if any.\n   */\n  public scanStart() {\n\n    if (this._scanSubscription) {\n      throw new Error('There is already a scan process running.');\n    }\n\n    if (!this._device) {\n      throw new Error('No device defined, cannot start scan, please define a device.');\n    }\n\n    this.scanFromDevice(this._device.deviceId);\n  }\n\n  /**\n   * Stops old `codeReader` and starts scanning in a new one.\n   */\n  restart(): void {\n    // note only necessary for now because of the Torch\n    this._codeReader = undefined;\n\n    const prevDevice = this._reset();\n\n    if (!prevDevice) {\n      return;\n    }\n\n    this.device = prevDevice;\n  }\n\n  /**\n   * Discovers and updates known video input devices.\n   */\n  async updateVideoInputDevices(): Promise<MediaDeviceInfo[]> {\n\n    // permissions aren't needed to get devices, but to access them and their info\n    const devices = await BrowserCodeReader.listVideoInputDevices() || [];\n    const hasDevices = devices && devices.length > 0;\n\n    // stores discovered devices and updates information\n    this.hasDevices.next(hasDevices);\n    this.camerasFound.next([...devices]);\n\n    if (!hasDevices) {\n      this.camerasNotFound.next(null);\n    }\n\n    return devices;\n  }\n\n  /**\n   * Starts the scanner with the back camera otherwise take the last\n   * available device.\n   */\n  private async autostartScanner(devices: MediaDeviceInfo[]): Promise<void> {\n\n    const matcher = ({ label }) => /back|trás|rear|traseira|environment|ambiente/gi.test(label);\n\n    // select the rear camera by default, otherwise take the last camera.\n    const device = devices.find(matcher) || devices.pop();\n\n    if (!device) {\n      throw new Error('Impossible to autostart, no input devices available.');\n    }\n\n    await this.setDevice(device);\n\n    this.deviceChange.next(device);\n  }\n\n  /**\n   * Dispatches the scan success event.\n   *\n   * @param result the scan result.\n   */\n  private dispatchScanSuccess(result: Result): void {\n    this.scanSuccess.next(result.getText());\n  }\n\n  /**\n   * Dispatches the scan failure event.\n   */\n  private dispatchScanFailure(reason?: Exception): void {\n    this.scanFailure.next(reason);\n  }\n\n  /**\n   * Dispatches the scan error event.\n   *\n   * @param error the error thing.\n   */\n  private dispatchScanError(error: any): void {\n    if (!this.scanError.observed) {\n      console.error(`zxing scanner component: ${error.name}`, error);\n      console.warn('Use the `(scanError)` property to handle errors like this!');\n    }\n    this.scanError.next(error);\n  }\n\n  /**\n   * Dispatches the scan event.\n   *\n   * @param result the scan result.\n   */\n  private dispatchScanComplete(result: Result): void {\n    this.scanComplete.next(result);\n  }\n\n  /**\n   * Returns the filtered permission.\n   */\n  private handlePermissionException(err: DOMException): boolean {\n\n    // failed to grant permission to video input\n    console.error('@zxing/ngx-scanner', 'Error when asking for permission.', err);\n\n    let permission: boolean;\n\n    switch (err.name) {\n\n      // usually caused by not secure origins\n      case 'NotSupportedError':\n        console.warn('@zxing/ngx-scanner', err.message);\n        // could not claim\n        permission = null;\n        // can't check devices\n        this.hasDevices.next(null);\n        break;\n\n      // user denied permission\n      case 'NotAllowedError':\n        console.warn('@zxing/ngx-scanner', err.message);\n        // claimed and denied permission\n        permission = false;\n        // this means that input devices exists\n        this.hasDevices.next(true);\n        break;\n\n      // the device has no attached input devices\n      case 'NotFoundError':\n        console.warn('@zxing/ngx-scanner', err.message);\n        // no permissions claimed\n        permission = null;\n        // because there was no devices\n        this.hasDevices.next(false);\n        // tells the listener about the error\n        this.camerasNotFound.next(err);\n        break;\n\n      case 'NotReadableError':\n        console.warn('@zxing/ngx-scanner', 'Couldn\\'t read the device(s)\\'s stream, it\\'s probably in use by another app.');\n        // no permissions claimed\n        permission = null;\n        // there are devices, which I couldn't use\n        this.hasDevices.next(false);\n        // tells the listener about the error\n        this.camerasNotFound.next(err);\n        break;\n      case 'AbortError':\n        console.warn('@zxing/ngx-scanner', 'It seems that the required permissions have been granted, but something else failed', err);\n        // permissions claimed\n        permission = true;\n        // can't check devices\n        this.hasDevices.next(null);\n        // tells the listener about the error\n        this.camerasNotFound.next(err);\n        break;\n      default:\n        console.warn('@zxing/ngx-scanner', 'I was not able to define if I have permissions for camera or not.', err);\n        // unknown\n        permission = null;\n        // this.hasDevices.next(undefined;\n        break;\n\n    }\n\n    this.setPermission(permission);\n\n    // tells the listener about the error\n    this.permissionResponse.error(err);\n\n    return permission;\n  }\n\n  /**\n   * Returns a valid BarcodeFormat or fails.\n   */\n  private getBarcodeFormatOrFail(format: string | BarcodeFormat): BarcodeFormat {\n    return typeof format === 'string'\n      ? BarcodeFormat[format.trim().toUpperCase()]\n      : format;\n  }\n\n  /**\n   * Return a code reader, create one if non exist\n   */\n  private getCodeReader(): BrowserMultiFormatContinuousReader {\n\n    if (!this._codeReader) {\n      const options = {\n        delayBetweenScanAttempts: this.timeBetweenScans,\n        delayBetweenScanSuccess: this.delayBetweenScanSuccess\n      };\n      this._codeReader = new BrowserMultiFormatContinuousReader(this.hints, options);\n    }\n\n    return this._codeReader;\n  }\n\n  /**\n   * Starts the continuous scanning for the given device.\n   *\n   * @param deviceId The deviceId from the device.\n   */\n  private async scanFromDevice(deviceId: string): Promise<void> {\n\n    const videoElement = this.previewElemRef.nativeElement;\n\n    const codeReader = this.getCodeReader();\n\n    const scanStream = await codeReader.scanFromDeviceObservable(deviceId, videoElement);\n\n    if (!scanStream) {\n      throw new Error('Undefined decoding stream, aborting.');\n    }\n\n    const next = (x: ResultAndError) => this._onDecodeResult(x.result, x.error);\n    const error = (err: any) => this._onDecodeError(err);\n    const complete = () => {\n    };\n\n    this._scanSubscription = scanStream.subscribe(next, error, complete);\n\n    if (this._scanSubscription.closed) {\n      return;\n    }\n\n    const controls = codeReader.getScannerControls();\n    const hasTorchControl = typeof controls.switchTorch !== 'undefined';\n\n    this.torchCompatible.next(hasTorchControl);\n  }\n\n  /**\n   * Handles decode errors.\n   */\n  private _onDecodeError(err: any) {\n    this.dispatchScanError(err);\n    // this.reset();\n  }\n\n  /**\n   * Handles decode results.\n   */\n  private _onDecodeResult(result: Result, error: Exception): void {\n\n    if (result) {\n      this.dispatchScanSuccess(result);\n    } else {\n      this.dispatchScanFailure(error);\n    }\n\n    this.dispatchScanComplete(result);\n  }\n\n  /**\n   * Stops the code reader and returns the previous selected device.\n   */\n  private _reset(): MediaDeviceInfo {\n\n    if (!this._codeReader) {\n      return;\n    }\n\n    this.scanStop();\n    try {\n      const videoElement = this.previewElemRef.nativeElement;\n      BrowserCodeReader.cleanVideoSource(videoElement);\n    } catch (err) {\n    }\n\n    try {\n      BrowserCodeReader.releaseAllStreams();\n    } catch (err) {\n    }\n\n    // clearing codeReader first to prevent setOptions error appearing in several Chromium versions\n    this._codeReader = undefined;\n\n    const device = this._device;\n    // do not set this.device inside this method, it would create a recursive loop\n    this.device = undefined;\n\n\n    return device;\n  }\n\n  /**\n   * Resets the scanner and emits device change.\n   */\n  public reset(): void {\n    this._reset();\n    this.deviceChange.emit(null);\n  }\n\n  /**\n   * Sets the current device.\n   */\n  private async setDevice(device: MediaDeviceInfo): Promise<void> {\n\n    // instantly stops the scan before changing devices\n    this.scanStop();\n\n    // correctly sets the new (or none) device\n    this._device = device || undefined;\n\n    if (!this._device) {\n      // cleans the video because user removed the device\n      BrowserCodeReader.cleanVideoSource(this.previewElemRef.nativeElement);\n    }\n\n    // if enabled, starts scanning\n    if (this._enabled && device) {\n      await this.scanFromDevice(device.deviceId);\n    }\n  }\n\n  /**\n   * Sets the permission value and emits the event.\n   */\n  private setPermission(hasPermission: boolean | null): void {\n    this.hasPermission = hasPermission;\n    this.permissionResponse.next(hasPermission);\n  }\n\n}\n","<video #preview [style.object-fit]=\"previewFitMode\" [poster]=\"poster\">\n  <p>\n    Your browser does not support this feature, please try to upgrade it.\n  </p>\n  <p>\n    Seu navegador não suporta este recurso, por favor tente atualizá-lo.\n  </p>\n</video>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ZXingScannerComponent } from './zxing-scanner.component';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    FormsModule\n  ],\n  declarations: [ZXingScannerComponent],\n  exports: [ZXingScannerComponent],\n})\nexport class ZXingScannerModule { }\n","/*\n * Public API Surface of zxing-scanner\n */\n\nexport * from './lib/zxing-scanner.module';\nexport * from './lib/zxing-scanner.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}