{"version":3,"file":"ion-media-cache.mjs","sources":["../../../src/lib/ion-media-cache.directive.ts","../../../src/lib/ion-media-cache.module.ts","../../../src/public-api.ts","../../../src/ion-media-cache.ts"],"sourcesContent":["import { Directive, OnInit, ElementRef, Input, Output, EventEmitter, Renderer2 } from '@angular/core';\nimport { File, FileEntry } from '@awesome-cordova-plugins/file/ngx';\nimport { fromEvent, Subject } from 'rxjs';\nimport { filter, first, take } from 'rxjs/operators';\nimport { Platform } from '@ionic/angular';\nimport { WebView } from '@awesome-cordova-plugins/ionic-webview/ngx';\nexport class CurrentBlob {\n  url: string;\n  blob: Blob;\n  objectUrl: string;\n  constructor(o: any = {}) {\n      this.url = o.url;\n      this.blob = o.blob;\n      this.objectUrl = o.objectUrl;\n  }\n}\n\nexport class CustomCache {\n  debugMode: boolean;\n  enabled: boolean;\n  corsFromHeroku: string;\n  fallbackUrl: string;\n  isFallback: boolean;\n  concurrency: number;\n  maxCacheSize: number;\n  maxCacheAge: number;\n  httpHeaders: any;\n  fileNameCachedWithExtension: boolean;\n  fallbackFileNameCachedExtension: string;\n  cacheDirectoryType: 'cache' | 'data' | 'external' = 'external';\n  imageReturnType: 'base64' | 'uri' = 'uri';\n  cacheDirectoryName: string;\n  isLoad: boolean;\n  cache_expire: any;\n  cache = true;\n  src: string;\n  render: string;\n  spinner: any;\n  spinnerStyle: string;\n  fallbackReload: any;\n  fallbackStyle: string;\n  /** dynamic variable */\n  currentBlob: CurrentBlob;\n\n  constructor(o: any = {}) {\n      /** display console debug */\n      this.debugMode = !!o.debugMode;\n      /** enable cache */\n      this.enabled = o.enabled || true;\n      /** concat http://cors-anywhere.herokuapp.com/ to currentUrl */\n      this.corsFromHeroku = o.corsFromHeroku;\n      /** Url if fail */\n      this.fallbackUrl = o.fallbackUrl;\n      /** Number of concurrent requests allowed */\n      this.concurrency = o.concurrency || 5;\n      /** Max chache size on MB */\n      this.maxCacheSize = o.maxCacheSize || -1;\n      this.maxCacheAge = o.maxCacheAge || -1;\n      /** usage fetch view  */\n      this.httpHeaders = o.httpHeaders || {};\n      /** Must be default 'true' for the new WebView to show images */\n      this.fileNameCachedWithExtension = o.fileNameCachedWithExtension || true;\n      this.fallbackFileNameCachedExtension = o.fallbackFileNameCachedExtension || '.jpg';\n      this.cacheDirectoryType = o.cacheDirectoryType || 'external';\n      this.imageReturnType = o.imageReturnType || 'uri';\n      /** Name directory cache */\n      this.cacheDirectoryName = o.cacheDirectoryName || 'ion-media-cache';\n      /** Indicates if the image is still loading */\n      this.isLoad = o.isLoad || true;\n      this.cache_expire = o.cache_expire;\n      this.src = o.src;\n      this.render = o.render || 'src';\n      const divStyle = `display: none;position: absolute;width: 100%;height: 100%;text-align: center;z-index: 999;justify-content: center;align-items: center;align-content: center;background: #dcdcdc4f;right: auto;top: 0px;left: 0px;`;\n      const centerStyle = 'margin: 0;position: absolute;top: 50%;left: 50%;transform: translateX(-50%) translateY(-50%);';\n      this.spinner = typeof o.spinner === 'boolean' && !o.spinner ? false : `<ion-spinner name=\"crescent\" color=\"colorbase\" style=\"${centerStyle}\"></ion-spinner>`;\n      this.spinnerStyle = o.styleSpinner || `${divStyle}`;\n      this.fallbackReload = typeof o.fallbackReload === 'boolean' && !o.fallbackReload ? false : `<ion-icon name=\"cloud-offline\" color=\"colorbase\" style=\"${centerStyle}font-size: 2.7em;\"></ion-icon>`;\n      this.fallbackStyle = o.fallbackStyle || `${divStyle}`;\n  }\n}\ndeclare let window: any; // <--- Declare it like this\ninterface IndexItem {\n  name: string;\n  modificationTime: Date;\n  size: number;\n}\n\ninterface QueueItem {\n  imageUrl: string;\n  // tslint:disable-next-line:ban-types\n  resolve: Function;\n  // tslint:disable-next-line:ban-types\n  reject: Function;\n}\n\ndeclare const Ionic: any;\n\nconst EXTENSIONS = ['.jpg', '.png', '.jpeg', '.gif', '.svg', '.tiff', '.mp4', '.m4a', '.wav', '.wma', '.3gp'];\n\n@Directive({\n  // tslint:disable-next-line:directive-selector\n  selector: '[customCache]'\n})\nexport class IonMediaCacheDirective implements OnInit {\n\n  config: CustomCache = new CustomCache();\n  private src: string;\n  /**\n   * Indicates if the cache service is ready.\n   * When the cache service isn't ready, images are loaded via browser instead.\n   */\n  private isCacheReady = false;\n\n  // tslint:disable-next-line:ban-types\n  private initPromiseResolve: Function;\n  private initPromise = new Promise<void>(resolve => this.initPromiseResolve = resolve);\n  private lockSubject = new Subject<boolean>();\n  private lock$ = this.lockSubject.asObservable();\n  /**\n   * Number of concurrent requests allowed\n   */\n  private concurrency = 5;\n  /**\n   * Queue items\n   */\n  private queue: QueueItem[] = [];\n  private processing = 0;\n  /**\n   * Fast accessible Object for currently processing items\n   */\n  // private currentlyProcessing: { [index: string]: Promise<any> } = {};\n  private cacheIndex: IndexItem[] = [];\n  private currentCacheSize = 0;\n  private indexed = false;\n  // tslint:disable-next-line:ban-types\n  private lockedCallsQueue: Function[] = [];\n\n  tag: ElementRef;\n  spinnerDiv: HTMLElement;\n  fallbackDiv: HTMLElement;\n\n  /**\n   * Use <img> tag\n   */\n  @Input() customCache: any;\n\n  @Input() className: string;\n  @Input() fixStyle: any;\n  @Input() fallbackStyle: string;\n  @Input() spinnerStyle: string;\n\n  /**\n   * The URL of the image to load.\n   */\n  @Input() set url(imageUrl: string) {\n    if (!(window as any).currentlyProcessing) {\n      (window as any).currentlyProcessing = {};\n    }\n    this.config = new CustomCache(typeof this.customCache === 'object' ? this.customCache : {});\n    setTimeout(() => {\n      this.config = new CustomCache(typeof this.customCache === 'object' ? this.customCache : {});\n      this.src = imageUrl;\n      this.config.src = this.processImageUrl(this.src);\n      this.updateImage(this.config.src);\n    }, 10);\n  }\n\n  @Input() typeBlob: any[] = ['text/html', 'application/octet-stream'];\n\n  // tslint:disable-next-line:no-output-on-prefix\n  @Output() onExpireCache: EventEmitter<any> = new EventEmitter<any>();\n\n  // tslint:disable-next-line:no-output-on-prefix\n  @Output() ionImgDidLoad: EventEmitter<any> = new EventEmitter<any>(true);\n\n  @Output() ionError: EventEmitter<any> = new EventEmitter<any>(false);\n\n  constructor(\n    private el: ElementRef,\n    private file: File,\n    private renderer: Renderer2,\n    private platform: Platform,\n    private webview: WebView) {\n    this.tag = this.el;\n    if (!window['IonMediaCache']) {\n      window['IonMediaCache'] = {};\n    }\n    if (this.isMobile) {\n      fromEvent(document, 'deviceready').pipe(first()).subscribe(res => {\n        this.initCache();\n      });\n    } else {\n      this.initCache();\n    }\n  }\n\n  get fs(): any {\n    return window.fsWeb;\n  }\n\n  get isMobile(): boolean {\n    return this.platform.is('capacitor') && ((this.platform.is('android') || this.platform.is('ios')));\n  }\n\n  renderSpinner() {\n    if (typeof this.config.spinner === 'boolean' && !this.config.spinner) {\n      if (this.spinnerDiv) {\n        this.spinnerDiv.remove();\n      }\n      return;\n    }\n    if (!this.spinnerDiv) {\n      this.spinnerDiv = this.renderer.createElement('div');\n      this.spinnerDiv.className = `${this.className ? this.className + '-' : ''}spinner-div`;\n      this.spinnerDiv.innerHTML = this.config.spinner;\n      this.renderer.setAttribute(this.spinnerDiv, 'style', this.spinnerStyle || this.config.spinnerStyle);\n      this.tag.nativeElement.parentElement.appendChild(this.spinnerDiv);\n      this._fixStyle(this.spinnerDiv);\n    }\n    if (this.config.spinner && !!this.spinnerDiv) {\n      this.spinnerDiv.style.display = !!this.config.src ? 'flex' : 'none';\n    }\n  }\n\n  renderFallbackDiv() {\n    if (typeof this.config.fallbackReload === 'boolean' && !this.config.fallbackReload) {\n      if (this.fallbackDiv) {\n        this.fallbackDiv.remove();\n      }\n      return;\n    }\n    if (!this.fallbackDiv) {\n      this.fallbackDiv = this.renderer.createElement('div');\n      this.fallbackDiv.className = `${this.className ? this.className + '-' : ''}fallback-div`;\n      this.fallbackDiv.innerHTML = this.config.fallbackReload;\n      this.fallbackDiv.onclick = (event) => {\n        this.fallbackDiv.style.display = 'none';\n        this.updateImage(this.src);\n        event.stopImmediatePropagation();\n        event.stopPropagation();\n      };\n      this.renderer.setAttribute(this.fallbackDiv, 'style', this.fallbackStyle || this.config.fallbackStyle);\n      this.tag.nativeElement.parentElement.appendChild(this.fallbackDiv);\n      this._fixStyle(this.fallbackDiv);\n    }\n  }\n\n  _fixStyle(div, style = this.fixStyle) {\n    if (!!div && typeof style === 'object') {\n      Object.keys(style).forEach((key) => {\n        div.style[key] = style[key];\n      });\n    }\n  }\n\n  get nativeAvailable(): boolean {\n    return File.installed();\n  }\n\n  private get isWKWebView(): boolean {\n    return (\n      this.platform.is('ios') &&\n      (window as any).webkit &&\n      (window as any).webkit.messageHandlers\n    );\n  }\n\n  private get isIonicWKWebView(): boolean {\n    return (\n      //  Important: isWKWebview && isIonicWKWebview must be mutually excluse.\n      //  Otherwise the logic for copying to tmp under IOS will fail.\n      (this.platform.is('android') && this.webview) ||\n      (this.platform.is('android')) && (location.host == 'localhost:8080') ||\n      (window as any).LiveReload);\n  }\n\n  private get isCacheSpaceExceeded(): boolean {\n    return (\n      this.config.maxCacheSize > -1 &&\n      this.currentCacheSize > this.config.maxCacheSize\n    );\n  }\n\n  /**\n   * Check if we can process more items in the queue\n   */\n  private get canProcess(): boolean {\n    return this.queue.length > 0 && this.processing < this.concurrency;\n  }\n\n  ngOnInit(): void {\n    if (!this.config.src) {\n      // image url was not passed\n      // this can happen when [src] is set to a variable that turned out to be undefined\n      // one example could be a list of users with their profile pictures\n      // in this case, it would be useful to use the fallback image instead\n      // if fallbackUrl was used as placeholder we do not need to set it again\n      if (!!this.config.fallbackUrl) {\n        // we're not going to cache the fallback image since it should be locally saved\n        this.setImage(this.config.fallbackUrl);\n      }\n    }\n  }\n\n  /**\n   * Gets the image URL to be loaded and disables caching if necessary\n   */\n  private processImageUrl(imageUrl: string = ''): string {\n    if (!!this.config.cache_expire && !!this.config.cache_expire.time) {\n      const timer = (this.config.cache_expire.time || 0) - new Date().getTime();\n      const enc = timer < 0 ? 0 : Math.trunc(timer / 1000);\n      if (enc === 0) {\n        this.config.cache_expire.el = this;\n        this.onExpireCache.emit(this.config.cache_expire);\n      }\n    }\n    if (this.config.cache == false) {\n      // need to disable caching\n      if (!imageUrl) {\n        return;\n      }\n      if (imageUrl.indexOf('?') < 0) {\n        // add ? if doesn't exists\n        imageUrl += `?cache_buster=${Date.now()}`;\n      } else {\n        imageUrl += `&cache_buster=${Date.now()}`;\n      }\n    }\n    return imageUrl;\n  }\n\n  private updateImage(imageUrl: string) {\n    this.renderSpinner();\n    this.renderFallbackDiv();\n    this.getImagePath(imageUrl).then((url: string) => {\n      this.setImage(url);\n    }).catch(() => {\n      this.tag.nativeElement[this.config.render] = this.config.fallbackUrl;\n      this.ionImgDidLoad.emit(true);\n    });\n  }\n\n  /**\n   * Gets the filesystem path of an image.\n   * This will return the remote path if anything goes wrong or if the cache service isn't ready yet.\n   * @param imageUrl The remote URL of the image\n   * @returns {Promise<string>} that will always resolve with an image URL\n   */\n  async getImagePath(imageUrl: string): Promise<string> {\n    if (typeof imageUrl !== 'string' || imageUrl.length <= 0) {\n      throw new Error('The image url provided was empty or invalid.');\n    }\n\n    await this.ready();\n\n    if (!this.isCacheReady) {\n      this.throwWarning('The cache system is not running. Images will be loaded by your browser instead.');\n      this.isCacheReady = this.config.enabled;\n    }\n\n    if (!this.config.enabled) {\n      return imageUrl;\n    }\n\n    if (this.isImageUrlRelative(imageUrl)) {\n      return imageUrl;\n    }\n\n    try {\n      return await this.getCachedImagePath(imageUrl);\n    } catch (err) {\n      return this.addItemToQueue(imageUrl);\n    }\n  }\n\n  ready(): Promise<void> {\n    return this.initPromise;\n  }\n\n  /**\n   * Returns if an imageUrl is an relative path\n   * @param imageUrl\n   */\n  private isImageUrlRelative(imageUrl: string) {\n    return !/^(https?|file):\\/\\/\\/?/i.test(imageUrl);\n  }\n\n  /**\n   * Set the image to be displayed\n   * @param imageUrl image src\n   * @param stopLoading set to true to mark the image as loaded\n   */\n  private setImage(imageUrl: string): void {\n    this.ionImgDidLoad.emit(false);\n    this.config.isFallback = false;\n    const src = imageUrl || this.config.fallbackUrl;\n    if (this.config.render !== 'src') {\n      if (this.config.render === 'background') {\n        var bgImg = new Image();\n        bgImg.onload = () => {\n          this.renderer.setStyle(this.tag.nativeElement, this.config.render, `url(${bgImg.src})`);\n          this.renderer.setStyle(this.tag.nativeElement, 'background-repeat', ` no-repeat`);\n          this.renderer.setStyle(this.tag.nativeElement, 'background-position', `center`);\n          this.renderer.setStyle(this.tag.nativeElement, 'background-size', `cover`);\n          this.stopSpinner();\n        };\n        bgImg.onerror = () => {\n          this.setImageFallback();\n        };\n        bgImg.src = src;\n      } else {\n        this.renderer.setStyle(this.tag.nativeElement, this.config.render, `url(${src})`);\n        this.stopSpinner();\n      }\n    } else if (this.tag.nativeElement[this.config.render] != src) {\n      this.tag.nativeElement[this.config.render] = src;\n      if (this.tag.nativeElement.nodeName === 'ION-IMG') {\n        this.tag.nativeElement.addEventListener('ionImgWillLoad', () => this.stopSpinner());\n        this.tag.nativeElement.addEventListener('ionError', () => this.setImageFallback());\n      } else {\n        this.tag.nativeElement.onload = () => this.stopSpinner();\n        this.tag.nativeElement.onerror = () => this.setImageFallback();\n      }\n    }\n  }\n\n  setImageFallback() {\n    if (!!this.config.fallbackUrl && this.config.fallbackUrl.length > 10 && !this.config.isFallback) {\n      this.tag.nativeElement[this.config.render] = this.config.fallbackUrl;\n      this.config.isFallback = true;\n    }\n    this.tag.nativeElement.parentElement.style.padding = 'unset';\n    this.stopSpinner(true);\n  }\n\n  stopSpinner(fallback = false) {\n    if (this.spinnerDiv) {\n      this.spinnerDiv.style.display = 'none';\n      this.ionImgDidLoad.emit(true);\n      if (fallback) {\n        this.fallbackDiv.style.display = 'flex';\n      }\n    }\n  }\n\n  getFileCacheDirectory() {\n    if (!this.isMobile) {\n      return '';\n    }\n    if (this.config.cacheDirectoryType == 'data') {\n      return this.file.dataDirectory;\n    } else if (this.config.cacheDirectoryType == 'external') {\n      return this.platform.is('android') ? this.file.externalDataDirectory : this.file.documentsDirectory;\n    }\n    return this.file.cacheDirectory;\n  }\n\n  /**\n   * Add an item to the queue\n   * @param imageUrl\n   * @param resolve\n   * @param reject\n   */\n  private addItemToQueue(imageUrl: string, resolve?, reject?): void | Promise<any> {\n    let p: void | Promise<any>;\n\n    if (!resolve && !reject) {\n      p = new Promise<any>((res, rej) => {\n        resolve = res;\n        reject = rej;\n      });\n    } else {\n      resolve = resolve || (() => {\n      });\n      reject = reject || (() => {\n      });\n    }\n\n    this.queue.push({\n      imageUrl,\n      resolve,\n      reject,\n    });\n\n    this.processQueue();\n\n    return p;\n  }\n\n  /**\n   * Processes one item from the queue\n   */\n  private async processQueue() {\n    // make sure we can process items first\n    if (!this.canProcess) {\n      return;\n    }\n\n    // increase the processing number\n    this.processing++;\n\n    // take the first item from queue\n    const currentItem: QueueItem = this.queue.splice(0, 1)[0];\n\n    // function to call when done processing this item\n    // this will reduce the processing number\n    // then will execute this function again to process any remaining items\n    const done = () => {\n      this.processing--;\n      this.processQueue();\n\n      // only delete if it's the last/unique occurrence in the queue\n      if ((window as any).currentlyProcessing[currentItem.imageUrl] !== undefined && !this.currentlyInQueue(currentItem.imageUrl)) {\n        delete (window as any).currentlyProcessing[currentItem.imageUrl];\n      }\n    };\n\n    const error = (e) => {\n      currentItem.reject();\n      this.throwError(e);\n      done();\n    };\n\n    if ((window as any).currentlyProcessing[currentItem.imageUrl] !== undefined) {\n      try {\n        // Prevented same Image from loading at the same time\n        await (window as any).currentlyProcessing[currentItem.imageUrl];\n        const localUrl = await this.getCachedImagePath(currentItem.imageUrl);\n        currentItem.resolve(localUrl);\n        done();\n      } catch (err) {\n        error(err);\n      }\n      return;\n    }\n\n    (window as any).currentlyProcessing[currentItem.imageUrl] = (async () => {\n      // process more items concurrently if we can\n      if (this.canProcess) {\n        this.processQueue();\n      }\n\n      const localDir = this.dirPath + '/';\n      const fileName = this.createFileName(currentItem.imageUrl);\n      // error cors https://stackoverflow.com/a/21136980/7638125\n      // https://github.com/eligrey/FileSaver.js/blob/master/src/FileSaver.js\n      await fetch(`${this.config.corsFromHeroku ? this.config.corsFromHeroku : ''}${currentItem.imageUrl}`, this.config.httpHeaders).then((response: any) => {\n        if (response.status === 403) {\n          throw (response);\n        }\n        return response.blob();\n      }).then(async (blob: Blob) => {\n        if (this.isMobile) {\n          const file = await this.file.writeFile(localDir, fileName, blob, { replace: true }) as FileEntry;\n          if (this.isCacheSpaceExceeded) {\n            this.maintainCacheSize();\n          }\n          await this.addFileToIndex(file);\n        } else {\n          await this.fs.writeFile(this.getPath(fileName), blob);\n          await this.addFileToIndex({ name: fileName });\n        }\n        const localUrl = await this.getCachedImagePath(currentItem.imageUrl);\n        currentItem.resolve(localUrl);\n        done();\n      }).catch((err) => {\n        this.setImage(currentItem.imageUrl);\n        done();\n        if (err && err.status === 403) {\n          console.warn(err, 'AccessDenied', this.config.debugMode);\n        } else {\n          console.warn('https://ionicframework.com/docs/troubleshooting/cors');\n        }\n      });\n      this.maintainCacheSize();\n\n    })();\n\n  }\n\n  /**\n   * Search if the url is currently in the queue\n   * @param imageUrl Image url to search\n   */\n  private currentlyInQueue(imageUrl: string) {\n    return this.queue.some(item => item.imageUrl == imageUrl);\n  }\n\n  /**\n   * Initialize the cache service\n   * @param [replace] Whether to replace the cache directory if it already exists\n   */\n  private async initCache(replace?: boolean) {\n    this.concurrency = this.config.concurrency;\n    // create cache directories if they do not exist\n    if (this.isMobile && this.nativeAvailable) {\n      try {\n        await this.createCacheDirectory(replace);\n        await this.indexCache();\n        this.isCacheReady = true;\n      } catch (err) {\n        this.throwError(err);\n      }\n    }\n    this.initPromiseResolve();\n  }\n\n  getMetadata(fileName): Promise<any> {\n    return new Promise((resolve, reject) => {\n      this.fs.readString(this.getPath(fileName)).then((_blob: Blob) => {\n        const metadata = { size: !!_blob && _blob instanceof Blob ? _blob.size : 0, modificationTime: (new Date()).getTime() };\n        resolve(metadata);\n        return metadata;\n      });\n    });\n  }\n\n  /**\n   * Adds a file to index.\n   * Also deletes any files if they are older than the set maximum cache age.\n   * @param file FileEntry to index\n   */\n  private async addFileToIndex(file: FileEntry | any): Promise<any> {\n    let metadata;\n    if (this.isMobile) {\n      metadata = await new Promise<any>((resolve, reject) => file.getMetadata(resolve, reject));\n    } else {\n      metadata = await this.getMetadata(file.name);\n    }\n    if (\n      this.config.maxCacheAge > -1 &&\n      Date.now() - metadata.modificationTime.getTime() >\n      this.config.maxCacheAge\n    ) {\n      // file age exceeds maximum cache age\n      return this.isMobile ? this.removeFile(file.name) : this.fs.removeFile(this.dirPath + '/' + file.name);\n    } else {\n      // file age doesn't exceed maximum cache age, or maximum cache age isn't set\n      this.currentCacheSize += metadata.size;\n      // add item to index\n      this.cacheIndex.push({\n        name: file.name,\n        modificationTime: metadata.modificationTime,\n        size: metadata.size,\n      });\n    }\n  }\n\n  /**\n   * Indexes the cache if necessary\n   */\n  private async indexCache(): Promise<void> {\n    this.cacheIndex = [];\n\n    try {\n      const files = await this.file.listDir(this.getFileCacheDirectory(), this.config.cacheDirectoryName);\n      await Promise.all(files.map(this.addFileToIndex.bind(this)));\n      // Sort items by date. Most recent to oldest.\n      this.cacheIndex = this.cacheIndex.sort(\n        (a: IndexItem, b: IndexItem): number => (a > b ? -1 : a < b ? 1 : 0),\n      );\n      this.indexed = true;\n    } catch (err) {\n      this.throwError(err);\n    }\n  }\n\n  /**\n   * This method runs every time a new file is added.\n   * It checks the cache size and ensures that it doesn't exceed the maximum cache size set in the config.\n   * If the limit is reached, it will delete old images to create free space.\n   */\n  private async maintainCacheSize() {\n    if (this.config.maxCacheSize > -1 && this.indexed) {\n      const maintain = async () => {\n        if (this.currentCacheSize > this.config.maxCacheSize) {\n          // grab the first item in index since it's the oldest one\n          const file: IndexItem = this.cacheIndex.splice(0, 1)[0];\n\n          if (typeof file == 'undefined') {\n            return maintain();\n          }\n\n          // delete the file then process next file if necessary\n          try {\n            await this.removeFile(file.name);\n          } catch (err) {\n            // ignore errors, nothing we can do about it\n          }\n\n          this.currentCacheSize -= file.size;\n          return maintain();\n        }\n      };\n\n      return maintain();\n    }\n  }\n\n  /**\n   * Remove a file\n   * @param file The name of the file to remove\n   */\n  private async removeFile(file: string): Promise<any> {\n    await this.file.removeFile(this.getFileCacheDirectory() + this.config.cacheDirectoryName, file);\n\n    if (this.isWKWebView && !this.isIonicWKWebView) {\n      try {\n        return this.file.removeFile(this.file.tempDirectory + this.config.cacheDirectoryName, file);\n      } catch (err) {\n        // Noop catch. Removing the files from tempDirectory might fail, as it is not persistent.\n      }\n    }\n  }\n\n  get dirPath(): string {\n    return this.getFileCacheDirectory() + this.config.cacheDirectoryName;\n  }\n\n  getPath(fileName) {\n    return this.dirPath + '/' + fileName;\n  }\n\n  /**\n   * Get the local path of a previously cached image if exists\n   * @param url The remote URL of the image\n   * @returns {Promise<any>} that resolves with the local path if exists, or rejects if doesn't exist\n   */\n  private async getCachedImagePath(url: string): Promise<string> {\n    await this.ready();\n\n    if (!this.isCacheReady) {\n      throw new Error('Cache is not ready');\n    }\n\n    const fileName = this.createFileName(url);\n    const tempDirPath = `${this.isMobile ? this.file.tempDirectory : ''}${this.config.cacheDirectoryName}`;\n\n    try {\n\n      if (this.isMobile) {\n        // check if exists\n        const fileEntry = await this.file.resolveLocalFilesystemUrl(this.getPath(fileName)) as FileEntry;\n\n        // file exists in cache\n        if (this.config.imageReturnType == 'base64') {\n          // read the file as data url and return the base64 string.\n          // should always be successful as the existence of the file\n          // is already ensured\n          const base64: string = await this.file.readAsDataURL(this.dirPath, fileName);\n          return base64.replace('data:null', 'data:*/*');\n        } else if (this.config.imageReturnType !== 'uri') {\n          return;\n        }\n\n        // now check if iOS device & using WKWebView Engine.\n        // in this case only the tempDirectory is accessible,\n        // therefore the file needs to be copied into that directory first!\n        if (this.isIonicWKWebView) {\n          return this.normalizeUrl(fileEntry);\n        }\n\n        if (!this.isWKWebView) {\n          // return native path\n          return fileEntry.nativeURL;\n        }\n\n        // check if file already exists in temp directory\n        try {\n          const tempFileEntry = await this.file.resolveLocalFilesystemUrl(tempDirPath + '/' + fileName) as FileEntry;\n          // file exists in temp directory\n          // return native path\n          return this.normalizeUrl(tempFileEntry);\n        } catch (err) {\n          // file does not yet exist in the temp directory.\n          // copy it!\n          const tempFileEntry = await this.file\n            .copyFile(this.dirPath, fileName, tempDirPath, fileName) as FileEntry;\n\n          // now the file exists in the temp directory\n          // return native path\n          return this.normalizeUrl(tempFileEntry);\n        }\n      } else {\n        let currentBlob: CurrentBlob = (window as any).IonMediaCache[url];\n        if (!currentBlob) {\n          currentBlob = new CurrentBlob();\n        }\n        return await this.fs.readString(this.getPath(fileName)).then(async (blob: Blob) => {\n          if (!!blob) {\n            if (this.typeBlob.indexOf(blob.type) > -1) {\n              console.warn(`This blob is type ${blob.type} is not valid, use property [typeBlob]=\"['text/html', 'application/octet-stream']\" to customize type.`);\n              await this.fs.removeFile(this.getPath(fileName));\n            } else {\n              if (currentBlob.url != url) {\n                (window as any).IonMediaCache[url] = new CurrentBlob({ url, blob, objectUrl: window.URL.createObjectURL(blob), path: this.getPath(fileName) });\n                currentBlob = (window as any).IonMediaCache[url];\n              }\n              return currentBlob.objectUrl;\n            }\n          }\n        }).catch((err) => {\n          throw (err);\n        });\n      }\n    } catch (err) {\n      throw new Error('File does not exist');\n    }\n  }\n\n  /**\n   * Normalizes the image uri to a version that can be loaded in the webview\n   * @see https://stackoverflow.com/a/52141086/7638125\n   * @see https://beta.ionicframework.com/docs/native/ionic-webview/\n   * @param fileEntry the FileEntry of the image file\n   * @returns {string} the normalized Url\n   */\n  private normalizeUrl(fileEntry: FileEntry): string {\n    // Use Ionic normalizeUrl to generate the right URL for Ionic WKWebView\n    /*if (Ionic && typeof Ionic.normalizeURL == 'function') {\n      return Ionic.normalizeURL(fileEntry.nativeURL);\n    }*/\n    // use new webview function to do the trick\n    if (this.webview) {\n      return this.webview.convertFileSrc(fileEntry.nativeURL);\n    }\n    return fileEntry.nativeURL;\n  }\n\n  /**\n   * Throws a console error if debug mode is enabled\n   * @param args Error message\n   */\n  private throwError(...args: any[]) {\n    if (this.config.debugMode) {\n      args.unshift(`${this.config.cacheDirectoryName} Error:`);\n      console.error.apply(console, args);\n    }\n  }\n\n  /**\n   * Throws a console warning if debug mode is enabled\n   * @param args Error message\n   */\n  private throwWarning(...args: any[]) {\n    if (this.config.debugMode) {\n      args.unshift(`${this.config.cacheDirectoryName} Warning: `);\n      console.warn.apply(console, args);\n    }\n  }\n\n  /**\n   * Check if the cache directory exists\n   * @param directory The directory to check. Either this.file.tempDirectory or this.getFileCacheDirectory()\n   * @returns {Promise<boolean>} that resolves if exists, and rejects if it doesn't\n   */\n  private cacheDirectoryExists(directory: string): Promise<boolean> {\n    return this.file.checkDir(directory, this.config.cacheDirectoryName);\n  }\n\n  /**\n   * Create the cache directories\n   * @param replace override directory if exists\n   * @returns {Promise<boolean>} that resolves if the directories were created, and rejects on error\n   */\n  private createCacheDirectory(replace: boolean = false): Promise<any> {\n    let cacheDirectoryPromise: Promise<any>, tempDirectoryPromise: Promise<any>;\n\n    if (replace) {\n      // create or replace the cache directory\n      cacheDirectoryPromise = this.file.createDir(this.getFileCacheDirectory(), this.config.cacheDirectoryName, replace);\n    } else {\n      // check if the cache directory exists.\n      // if it does not exist create it!\n      cacheDirectoryPromise = this.cacheDirectoryExists(this.getFileCacheDirectory())\n        .catch(() => this.file.createDir(this.getFileCacheDirectory(), this.config.cacheDirectoryName, false));\n    }\n\n    if (this.isWKWebView && !this.isIonicWKWebView) {\n      if (replace) {\n        // create or replace the temp directory\n        tempDirectoryPromise = this.file.createDir(\n          this.file.tempDirectory,\n          this.config.cacheDirectoryName,\n          replace,\n        );\n      } else {\n        // check if the temp directory exists.\n        // if it does not exist create it!\n        tempDirectoryPromise = this.cacheDirectoryExists(\n          this.file.tempDirectory,\n        ).catch(() =>\n          this.file.createDir(\n            this.file.tempDirectory,\n            this.config.cacheDirectoryName,\n            false,\n          ),\n        );\n      }\n    } else {\n      tempDirectoryPromise = Promise.resolve();\n    }\n\n    return Promise.all([cacheDirectoryPromise, tempDirectoryPromise]);\n  }\n\n  /**\n   * Creates a unique file name out of the URL\n   * @param url URL of the file\n   * @returns {string} Unique file name\n   */\n  private createFileName(url: string): string {\n    // hash the url to get a unique file name\n    return (\n      this.hashString(url).toString() +\n      (this.config.fileNameCachedWithExtension\n        ? this.getExtensionFromUrl(url)\n        : '')\n    );\n  }\n\n  /**\n   * Converts a string to a unique 32-bit int\n   * @param string string to hash\n   * @returns 32-bit int\n   */\n  private hashString(string: string): number {\n    let hash = 0,\n      char;\n    if (string.length == 0) {\n      return hash;\n    }\n    for (let i = 0; i < string.length; i++) {\n      char = string.charCodeAt(i);\n      // tslint:disable-next-line\n      hash = (hash << 5) - hash + char;\n      // tslint:disable-next-line\n      hash = hash & hash;\n    }\n    return hash;\n  }\n\n  /**\n   * Extract extension from filename or url\n   *\n   * @param url\n   * @returns {string}\n   *\n   * Not always will url's contain a valid image extention. We'll check if any valid extention is supplied.\n   * If not, we will use the default.\n   */\n  private getExtensionFromUrl(url: string): string {\n    const urlWitoutParams = url.split(/\\#|\\?/)[0];\n    // tslint:disable-next-line:no-bitwise\n    const ext: string = (urlWitoutParams.substr((~-urlWitoutParams.lastIndexOf('.') >>> 0) + 1) || '').toLowerCase();\n\n    return (\n      EXTENSIONS.indexOf(ext) >= 0 ? ext : this.config.fallbackFileNameCachedExtension\n    );\n  }\n\n  /**\n   * Clears cache of a single image\n   * @param imageUrl Image URL\n   */\n  async clearImageCache(imageUrl: string = this.config.src) {\n    if (!this.isMobile && this.isImageUrlRelative(imageUrl)) {\n      const fileName = this.createFileName(imageUrl);\n      await this.fs.removeFile(this.getPath(fileName));\n      return;\n    }\n\n    await this.ready();\n\n    this.runLocked(async () => {\n      const fileName = this.createFileName(imageUrl);\n      const route = this.getFileCacheDirectory() + this.config.cacheDirectoryName;\n      // pause any operations\n      try {\n        await this.file.removeFile(route, fileName);\n\n        if (this.isWKWebView && !this.isIonicWKWebView) {\n          await this.file.removeFile(this.file.tempDirectory + this.config.cacheDirectoryName, fileName);\n        }\n      } catch (err) {\n        this.throwError(err);\n      }\n\n      return this.initCache(true);\n    });\n  }\n\n  /**\n   * Clears the cache\n   */\n  async clearCache() {\n    if (!this.platform.is('capacitor')) {\n      return;\n    }\n\n    await this.ready();\n\n    this.runLocked(async () => {\n      try {\n        await this.file.removeRecursively(this.getFileCacheDirectory(), this.config.cacheDirectoryName);\n\n        if (this.isWKWebView && !this.isIonicWKWebView) {\n          // also clear the temp files\n          try {\n            this.file.removeRecursively(this.file.tempDirectory, this.config.cacheDirectoryName);\n          } catch (err) {\n            // Noop catch. Removing the tempDirectory might fail,\n            // as it is not persistent.\n          }\n        }\n      } catch (err) {\n        this.throwError(err);\n      }\n\n      return this.initCache(true);\n    });\n  }\n\n  private getLockedState(): Promise<boolean> {\n    return this.lock$\n      .pipe(take(1))\n      .toPromise();\n  }\n\n  private awaitUnlocked(): Promise<boolean> {\n    return this.lock$\n      .pipe(\n        filter(locked => !!locked),\n        take(1),\n      )\n      .toPromise();\n  }\n\n  private async setLockedState(locked: boolean) {\n    this.lockSubject.next(locked);\n  }\n\n  // tslint:disable-next-line:ban-types\n  private runLocked(fn: Function) {\n    this.lockedCallsQueue.push(fn);\n    this.processLockedQueue();\n  }\n\n  private async processLockedQueue() {\n    if (await this.getLockedState()) {\n      return;\n    }\n\n    if (this.lockedCallsQueue.length > 0) {\n      await this.setLockedState(true);\n\n      try {\n        await this.lockedCallsQueue.slice(0, 1)[0]();\n      } catch (err) {\n        // console.log('Error running locked function: ', err);\n      }\n\n      await this.setLockedState(false);\n      return this.processLockedQueue();\n    }\n  }\n\n}\n","import { NgModule } from '@angular/core';\n\nimport { File } from '@awesome-cordova-plugins/file/ngx';\nimport { WebView } from '@awesome-cordova-plugins/ionic-webview/ngx';\n\nimport { IonMediaCacheDirective } from './ion-media-cache.directive';\n\n@NgModule({\n  declarations: [IonMediaCacheDirective],\n  exports: [IonMediaCacheDirective],\n  imports: [\n  ],\n  providers: [\n    File,\n    WebView\n  ]\n})\nexport class IonMediaCacheModule { }\n","/*\n * Public API Surface of ion-media-cache\n */\n\nexport * from './lib/ion-media-cache.directive';\nexport * from './lib/ion-media-cache.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}