{"version":3,"file":"encrypt-storage-noble.cjs","names":["#keys","#encryptation","#stateManagementUse","#doNotEncryptValues","#doNotParseValues","#notifyHandler","#prefix","#allowNull","#allowUndefined","#storageType","InvalidSecretKeyError","getSyncEncryptation","SyncEncryptCookie","#getKey","#notifier","IsNotBrowserEnvironmentError","nullValueErrorHandler","undefinedValueErrorHandler","#valueValidate","#multiple","hashSyncNobleSHA256","#getTTLRecord"],"sources":["../../src/classes/encrypt-storage-noble.ts"],"sourcesContent":["import { InvalidSecretKeyError, IsNotBrowserEnvironmentError } from '@/errors';\nimport {\n  hashSyncNobleSHA256,\n  SECRET_KEY_MIN_LENGTH,\n  nullValueErrorHandler,\n  getSyncEncryptation,\n  undefinedValueErrorHandler,\n} from '@/utils';\n\nimport { SyncEncryptCookie } from './sync-encrypt-cookie';\n\nimport type {\n  TTLMetadata,\n  NotifyHandler,\n  TTLStorageValue,\n  SyncEncryptation,\n  SetTTLItemParams,\n  RefreshTTLParams,\n  NotifyHandlerParams,\n  SyncCookieInterface,\n  GetFromPatternOptions,\n  RemoveFromPatternOptions,\n  SyncEncryptStorageTTLInterface,\n  EncryptStorageNobleApiInterface,\n  StorageType,\n  BaseEcnryptStorageOptions,\n} from '@/@types';\n\nconst secret = new globalThis.WeakMap();\n\nexport class EncryptStorageNoble\n  implements EncryptStorageNobleApiInterface, SyncEncryptStorageTTLInterface\n{\n  readonly #keys: Set<string> = new Set();\n\n  readonly #encryptation: SyncEncryptation;\n\n  readonly #stateManagementUse: boolean;\n\n  readonly #doNotEncryptValues: boolean;\n\n  readonly #doNotParseValues: boolean;\n\n  readonly #notifyHandler: NotifyHandler | undefined;\n\n  readonly #prefix: string;\n\n  readonly #allowNull: boolean;\n\n  readonly #allowUndefined: boolean;\n\n  readonly #storageType: StorageType;\n\n  #multiple = false;\n\n  public readonly api = 'noble' as const;\n\n  public cookie: SyncCookieInterface;\n\n  /**\n   * EncryptStorage provides a wrapper implementation of `localStorage` and `sessionStorage` for a better security solution in browser data store\n   *\n   * @param {string} secretKey - A secret to encrypt data must be contain min of 10 characters\n   * @param {SyncEncryptStorageOptions} [options] - Settings to set encryptData or select `sessionStorage` to browser storage\n   */\n  constructor(secretKey: string, options: BaseEcnryptStorageOptions = {}) {\n    if (secretKey.length < SECRET_KEY_MIN_LENGTH) {\n      throw new InvalidSecretKeyError();\n    }\n\n    const {\n      storageType = 'localStorage',\n      prefix = '',\n      stateManagementUse = false,\n      encAlgorithm = 'AES-GCM',\n      doNotEncryptValues = false,\n      notifyHandler,\n      doNotParseValues = false,\n      validation = {\n        strict: false,\n        allowNull: true,\n        allowUndefined: false,\n      },\n    } = options;\n\n    secret.set(this, secretKey);\n\n    this.#prefix = prefix;\n    this.#notifyHandler = notifyHandler;\n    this.#stateManagementUse = stateManagementUse;\n    this.#doNotEncryptValues = doNotEncryptValues;\n    this.#doNotParseValues = doNotParseValues;\n    this.#allowNull = validation?.strict\n      ? false\n      : (validation?.allowNull ?? true);\n    this.#allowUndefined = validation?.strict\n      ? false\n      : (validation?.allowUndefined ?? false);\n    this.#encryptation = getSyncEncryptation(encAlgorithm, secret.get(this));\n    this.#storageType = storageType;\n\n    this.cookie = new SyncEncryptCookie({\n      decryptValue: (value) => this.decryptValue(value),\n      encryptValue: (value) => this.encryptValue(value),\n      getKey: (key) => this.#getKey(key),\n      notifier: (params) => this.#notifier(params),\n      doNotEncryptValues: this.#doNotEncryptValues,\n      doNotParseValues: this.#doNotParseValues,\n    });\n  }\n\n  get storage(): Storage {\n    if (typeof window === 'undefined') {\n      throw new IsNotBrowserEnvironmentError();\n    }\n\n    return window[this.#storageType];\n  }\n\n  #getKey(key: string): string {\n    return this.#prefix ? `${this.#prefix}:${key}` : key;\n  }\n\n  #notifier(params: NotifyHandlerParams, callback?: VoidFunction) {\n    if (this.#notifyHandler) {\n      this.#notifyHandler(params);\n      callback?.();\n    }\n  }\n\n  #valueValidate<T = unknown>(value: T): T {\n    let validatedValue = value;\n\n    if (!this.#allowNull) {\n      validatedValue = nullValueErrorHandler<T>(value);\n    }\n\n    if (!this.#allowUndefined) {\n      validatedValue = undefinedValueErrorHandler<T>(value);\n    }\n\n    return validatedValue;\n  }\n\n  public get length() {\n    const value = this.storage.length || 0;\n\n    this.#notifier({\n      type: 'length',\n      value,\n    });\n\n    return value;\n  }\n\n  public setItem(key: string, value: any, doNotEncrypt = false): void {\n    const validatedValue = this.#valueValidate(value);\n    const encryptValues = this.#doNotEncryptValues || doNotEncrypt;\n    const storageKey = this.#getKey(key);\n    let valueToString =\n      typeof value === 'object'\n        ? JSON.stringify(validatedValue)\n        : String(validatedValue);\n\n    if (this.#doNotParseValues) {\n      valueToString = value;\n    }\n\n    const encryptedValue = encryptValues\n      ? valueToString\n      : this.#encryptation.encrypt(valueToString);\n\n    this.storage.setItem(storageKey, encryptedValue);\n\n    if (!this.#multiple) {\n      this.#notifier({\n        type: 'set',\n        key,\n        value: valueToString,\n      });\n    }\n\n    this.#keys.add(key);\n  }\n\n  public setMultipleItems(\n    param: [string, any][],\n    doNotEncrypt?: boolean,\n  ): void {\n    this.#multiple = true;\n    param.forEach(([key, value]) => {\n      this.setItem(key, value, doNotEncrypt);\n    });\n\n    const keys = param.map(([key]) => key);\n    const values = param.map(([_, value]) =>\n      typeof value === 'object' ? JSON.stringify(value) : String(value),\n    );\n\n    this.#notifier({\n      type: 'setMultiple',\n      key: keys,\n      value: values,\n    });\n\n    this.#multiple = false;\n  }\n\n  public getItem<DataType = any>(\n    key: string,\n    doNotDecrypt = false,\n  ): DataType | null {\n    const decryptValues = this.#doNotEncryptValues || doNotDecrypt;\n    const storageKey = this.#getKey(key);\n    const item = this.storage.getItem(storageKey);\n\n    if (item) {\n      const decryptedValue = decryptValues\n        ? item\n        : this.#encryptation.decrypt(item);\n\n      if (this.#stateManagementUse && !this.#multiple) {\n        this.#notifier({\n          type: 'get',\n          key,\n          value: decryptedValue,\n        });\n\n        return decryptedValue as unknown as DataType;\n      }\n\n      try {\n        const value = this.#doNotParseValues\n          ? decryptedValue\n          : JSON.parse(decryptedValue);\n\n        if (!this.#multiple) {\n          this.#notifier({\n            type: 'get',\n            key,\n            value,\n          });\n        }\n\n        return value as DataType;\n      } catch {\n        if (!this.#multiple) {\n          this.#notifier({\n            type: 'get',\n            key,\n            value: decryptedValue,\n          });\n        }\n        return decryptedValue as unknown as DataType;\n      }\n    }\n\n    if (!this.#multiple) {\n      this.#notifier({\n        type: 'get',\n        key,\n        value: null,\n      });\n    }\n\n    return null;\n  }\n\n  public getMultipleItems(\n    keys: string[],\n    doNotDecrypt?: boolean,\n  ): Record<string, any> {\n    this.#multiple = true;\n    const result = keys.reduce((accumulator: Record<string, any>, key) => {\n      accumulator[key] = this.getItem(key, doNotDecrypt);\n\n      return accumulator;\n    }, {});\n\n    this.#notifier({\n      type: 'getMultiple',\n      key: keys,\n      value: result,\n    });\n\n    this.#multiple = false;\n\n    return result;\n  }\n\n  public removeItem(key: string): void {\n    const storageKey = this.#getKey(key);\n    this.storage.removeItem(storageKey);\n\n    if (!this.#multiple) {\n      this.#notifier({\n        type: 'remove',\n        key,\n      });\n    }\n\n    this.#keys.delete(key);\n  }\n\n  public removeMultipleItems(keys: string[]): void {\n    this.#multiple = true;\n    keys.forEach((key) => {\n      this.removeItem(key);\n    });\n\n    this.#notifier({\n      type: 'removeMultiple',\n      key: keys,\n    });\n\n    this.#multiple = false;\n  }\n\n  public removeItemFromPattern(\n    pattern: string,\n    options: RemoveFromPatternOptions = {} as RemoveFromPatternOptions,\n  ): void {\n    const { exact = false } = options;\n    const storageKeys = Object.keys(this.storage);\n    const filteredKeys = storageKeys.filter((key) => {\n      if (exact) {\n        return key === this.#getKey(pattern);\n      }\n\n      if (this.#prefix) {\n        return key.includes(pattern) && key.includes(this.#prefix);\n      }\n\n      return key.includes(pattern);\n    });\n\n    const keys = filteredKeys.map((key) =>\n      this.#prefix ? key.split(`${this.#prefix}:`)[1] : key,\n    );\n    this.#notifier({\n      type: 'remove',\n      key: keys,\n    });\n\n    filteredKeys.forEach((key) => {\n      this.storage.removeItem(key);\n    });\n  }\n\n  public getItemFromPattern(\n    pattern: string,\n    options: GetFromPatternOptions = {} as GetFromPatternOptions,\n  ): Record<string, any> | null {\n    const { multiple = true, exact = false, doNotDecrypt = false } = options;\n    const decryptValues = this.#doNotEncryptValues || doNotDecrypt;\n    const keys = Object.keys(this.storage).filter((key) => {\n      if (exact) {\n        return key === this.#getKey(pattern);\n      }\n\n      if (this.#prefix) {\n        return key.includes(pattern) && key.includes(this.#prefix);\n      }\n\n      return key.includes(pattern);\n    });\n\n    if (!keys.length) {\n      return null;\n    }\n\n    if (!multiple) {\n      const [key] = keys;\n\n      const formattedKey = this.#prefix\n        ? key.replace(`${this.#prefix}:`, '')\n        : key;\n\n      this.#notifier({\n        type: 'remove',\n        key: formattedKey,\n      });\n\n      return this.getItem(formattedKey, decryptValues);\n    }\n\n    const value = keys.reduce((accumulator: Record<string, any>, key) => {\n      const formattedKey = this.#prefix\n        ? key.replace(`${this.#prefix}:`, '')\n        : key;\n\n      accumulator[formattedKey] = this.getItem(formattedKey);\n\n      return accumulator;\n    }, {});\n\n    this.#notifier({\n      type: 'get',\n      key: keys,\n      value,\n    });\n\n    return value;\n  }\n\n  public clear(): void {\n    this.storage.clear();\n\n    this.#notifier({\n      type: 'clear',\n    });\n  }\n\n  public key(index: number): string | null {\n    const value = this.storage.key(index) || null;\n\n    this.#notifier({\n      type: 'key',\n      index,\n      value,\n    });\n\n    return value;\n  }\n\n  public encryptValue(value: any): string {\n    const parsedValue = this.#doNotParseValues ? value : JSON.stringify(value);\n    const encryptedValue = this.#encryptation.encrypt(parsedValue);\n\n    return encryptedValue;\n  }\n\n  public decryptValue<DataType = any>(value: string): DataType | null {\n    const decryptedValue = this.#encryptation.decrypt(value);\n\n    try {\n      return (\n        this.#doNotParseValues ? decryptedValue : JSON.parse(decryptedValue)\n      ) as DataType;\n    } catch {\n      /* istanbul ignore next */\n      return null;\n    }\n  }\n\n  public hash(value: string): string {\n    return hashSyncNobleSHA256(value, secret.get(this));\n  }\n\n  /**\n   * TTL API\n   */\n\n  /**\n   * Returns a valid TTL record.\n   *\n   * If the key does not exist, is invalid or has expired,\n   * `undefined` is returned.\n   *\n   * Expired items are automatically removed from storage.\n   *\n   * @template T\n   * @param {string} key Storage key.\n   *\n   * @returns {TTLStorageValue<T> | undefined}\n   *\n   * @private\n   */\n  #getTTLRecord<T = unknown>(\n    key: string,\n    doNotDecrypt = false,\n  ): TTLStorageValue<T> | null {\n    const item = this.getItem<TTLStorageValue<T>>(key, doNotDecrypt);\n\n    if (!item) {\n      return null;\n    }\n\n    if (\n      item == null ||\n      typeof item !== 'object' ||\n      typeof item.expiresAt !== 'number'\n    ) {\n      return null;\n    }\n\n    if (Date.now() >= item.expiresAt) {\n      this.removeItem(key);\n\n      return null;\n    }\n\n    return item;\n  }\n\n  public setTTL<T>({\n    key,\n    value,\n    ttl,\n    doNotEncrypt = false,\n  }: SetTTLItemParams<T>): void {\n    const expiresAt =\n      ttl instanceof Date ? ttl.getTime() : Date.now() + ttl * 1000;\n\n    const item: TTLStorageValue<T> = {\n      value,\n      expiresAt,\n    };\n\n    this.setItem(key, item, doNotEncrypt);\n  }\n\n  public getTTL<T = unknown>(key: string, doNotDecrypt = false): T | null {\n    return this.#getTTLRecord<T>(key, doNotDecrypt)?.value ?? null;\n  }\n\n  public hasTTL(key: string): boolean {\n    return this.#getTTLRecord(key) !== null;\n  }\n\n  public getTTLMetadata(key: string): TTLMetadata | null {\n    const item = this.#getTTLRecord(key);\n\n    if (!item) {\n      return null;\n    }\n\n    return {\n      expiresAt: new Date(item.expiresAt),\n      remaining: (item.expiresAt - Date.now()) / 1000,\n      expired: Date.now() >= item.expiresAt,\n    };\n  }\n\n  public getRemainingTTL(key: string): number | null {\n    const item = this.#getTTLRecord(key);\n\n    if (!item) {\n      return null;\n    }\n\n    const remaining = (item.expiresAt - Date.now()) / 1000;\n\n    return remaining > 0 ? remaining : 0;\n  }\n\n  public refreshTTL({ key, ttl }: RefreshTTLParams): boolean {\n    const item = this.#getTTLRecord(key);\n\n    if (!item) {\n      return false;\n    }\n\n    const expiresAt =\n      ttl instanceof Date ? ttl.getTime() : Date.now() + ttl * 1000;\n\n    item.expiresAt = expiresAt;\n\n    this.setItem(key, item);\n\n    return true;\n  }\n\n  public removeTTL(key: string): boolean {\n    const item = this.#getTTLRecord(key);\n\n    if (!item) {\n      return false;\n    }\n\n    this.removeItem(key);\n    this.setItem(key, item.value);\n\n    return true;\n  }\n\n  public hasExpired(key: string): boolean {\n    return this.#getTTLRecord(key) === null;\n  }\n}\n\n/* v8 ignore start -- @preserve */\nif (typeof window !== 'undefined') {\n  (window as any).EncryptStorageNoble = EncryptStorageNoble;\n}\n\nif (typeof window !== 'undefined' && window?.globalThis) {\n  // oxlint-disable-next-line no-unsafe-optional-chaining\n  (window?.globalThis as any).EncryptStorageNoble = EncryptStorageNoble;\n}\n/* v8 ignore end -- @preserve */\n"],"mappings":"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"}