web-push-notifications 3.50.1 → 3.50.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/npm.js +1 -1
- package/npm.js.map +1 -1
- package/package.json +1 -1
- package/service-worker.js +1 -1
- package/service-worker.js.map +1 -1
- package/pushwoosh-web-notifications.d.ts +0 -1
- package/pushwoosh-widget-inbox.d.ts +0 -1
- package/pushwoosh-widget-subscribe-popup.d.ts +0 -1
- package/pushwoosh-widget-subscription-button.d.ts +0 -1
- package/pushwoosh-widget-subscription-prompt.d.ts +0 -1
package/npm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm.js","mappings":"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","sources":["webpack://web-push-notifications/webpack/universalModuleDefinition","webpack://web-push-notifications/webpack/bootstrap","webpack://web-push-notifications/webpack/runtime/define property getters","webpack://web-push-notifications/webpack/runtime/hasOwnProperty shorthand","webpack://web-push-notifications/webpack/runtime/make namespace object","webpack://web-push-notifications/./src/core/constants.ts","webpack://web-push-notifications/./src/core/defaultInitParams.ts","webpack://web-push-notifications/./src/core/functions.ts","webpack://web-push-notifications/./src/core/legacyEventsMap.ts","webpack://web-push-notifications/./src/modules/storage/migrations/constants.ts","webpack://web-push-notifications/./src/modules/storage/migrations/helpers.ts","webpack://web-push-notifications/./src/modules/storage/migrations/26-11-2018.ts","webpack://web-push-notifications/./src/modules/storage/migrations/initial.ts","webpack://web-push-notifications/./src/modules/DateModule.ts","webpack://web-push-notifications/./src/modules/storage/migrations/Migrations.ts","webpack://web-push-notifications/./src/modules/storage/migrations/MigrationExecutor.ts","webpack://web-push-notifications/./src/core/storage.ts","webpack://web-push-notifications/./src/modules/storage/version.ts","webpack://web-push-notifications/./src/core/logger.ts","webpack://web-push-notifications/./src/core/modules/EventBus/EventBus.ts","webpack://web-push-notifications/./src/modules/InboxMessagesPublic.ts","webpack://web-push-notifications/./src/modules/storage/Store.ts","webpack://web-push-notifications/./src/modules/storage/Storage.ts","webpack://web-push-notifications/./src/models/InboxMessages.ts","webpack://web-push-notifications/./src/modules/Data/Data.ts","webpack://web-push-notifications/./src/modules/ApiClient/ApiClient.ts","webpack://web-push-notifications/./src/modules/Api/Api.ts","webpack://web-push-notifications/./src/modules/PlatformChecker/PlatformChecker.ts","webpack://web-push-notifications/./src/services/PushService/drivers/PushServiceDefault/PushServiceDefault.ts","webpack://web-push-notifications/./src/services/PushService/drivers/PushServiceSafari/PushServiceSafari.ts","webpack://web-push-notifications/./src/core/Pushwoosh.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export const DEFAULT_SERVICE_WORKER_URL = '/pushwoosh-service-worker.js';\nexport const DEFAULT_API_URL = 'https://cp.pushwoosh.com/json/1.3/';\n\nexport const PERIOD_SEND_APP_OPEN = 3600000;\nexport const PERIOD_GOAL_EVENT = 86400000;\n\nexport const DEFAULT_NOTIFICATION_TITLE = 'Pushwoosh notification';\nexport const DEFAULT_NOTIFICATION_IMAGE = 'https://cp.pushwoosh.com/img/logo-medium.png';\n\n// Keys\nexport const KEY_SHOW_SUBSCRIBE_WIDGET = 'WIDGET_SHOWED';\nexport const KEY_CLICK_SUBSCRIBE_WIDGET = 'WIDGET_CLICKED';\n\n// Local storage keys\nexport const KEY_DEVICE_REGISTRATION_STATUS: string = 'deviceRegistrationStatus';\nexport const KEY_SAFARI_PREVIOUS_PERMISSION = 'safariPreviousPermission';\nexport const MANUAL_SET_LOGGER_LEVEL = 'PW_SET_LOGGER_LEVEL';\n\n// Device registration status\nexport const DEVICE_REGISTRATION_STATUS_REGISTERED: string = 'registered';\nexport const DEVICE_REGISTRATION_STATUS_UNREGISTERED: string = 'unregistered';\n\n// Permissions\nexport const PERMISSION_DENIED = 'denied';\nexport const PERMISSION_GRANTED = 'granted';\nexport const PERMISSION_PROMPT = 'default';\n\n// Events\nexport const LEGACY_EVENT_ON_LOAD = 'onLoad';\nexport const LEGACY_EVENT_ON_READY = 'onReady';\nexport const LEGACY_EVENT_ON_SUBSCRIBE = 'onSubscribe';\nexport const LEGACY_EVENT_ON_UNSUBSCRIBE = 'onUnsubscribe';\nexport const LEGACY_EVENT_ON_REGISTER = 'onRegister';\nexport const LEGACY_EVENT_ON_PERMISSION_PROMPT = 'onPermissionPrompt';\nexport const LEGACY_EVENT_ON_PERMISSION_DENIED = 'onPermissionDenied';\nexport const LEGACY_EVENT_ON_PERMISSION_GRANTED = 'onPermissionGranted';\nexport const LEGACY_EVENT_ON_SW_INIT_ERROR = 'onSWInitError';\nexport const LEGACY_EVENT_ON_PUSH_DELIVERY = 'onPushDelivery';\nexport const LEGACY_EVENT_ON_NOTIFICATION_CLICK = 'onNotificationClick';\nexport const LEGACY_EVENT_ON_NOTIFICATION_CLOSE = 'onNotificationClose';\nexport const LEGACY_EVENT_ON_CHANGE_COMMUNICATION_ENABLED = 'onChangeCommunicationEnabled';\nexport const LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE = 'onPutNewMessageToInboxStore';\nexport const LEGACY_EVENT_ON_UPDATE_INBOX_MESSAGES = 'onUpdateInboxMessages';\nexport const LEGACY_EVENT_ON_SHOW_NOTIFICATION_PERMISSION_DIALOG = 'onShowNotificationPermissionDialog';\nexport const LEGACY_EVENT_ON_HIDE_NOTIFICATION_PERMISSION_DIALOG = 'onHideNotificationPermissionDialog';\n\nexport const LEGACY_EVENT_ON_SHOW_SUBSCRIPTION_WIDGET = 'onShowSubscriptionWidget';\nexport const LEGACY_EVENT_ON_HIDE_SUBSCRIPTION_WIDGET = 'onHideSubscriptionWidget';\n\n// Post Events\nexport const EVENT_SHOW_SUBSCRIBE_BUTTON = 'showSubscribeButton';\nexport const EVENT_CLICK_SUBSCRIBE_BUTTON = 'clickSubscribeButton';\nexport const EVENT_GDPR_CONSENT = 'GDPRConsent';\nexport const EVENT_GDPR_DELETE = 'GDPRDelete';\nexport const EVENT_PW_SITE_OPENED = 'PW_SiteOpened'; // for default events\n\n// Page visited\nexport const PAGE_VISITED_URL = 'PAGE_VISITED_URL';\n","import { DEFAULT_SERVICE_WORKER_URL } from './constants';\n\nexport const defaultInitParams = {\n autoSubscribe: true,\n serviceWorkerUrl: DEFAULT_SERVICE_WORKER_URL,\n} as const;\n","export function getGlobal() {\n return globalThis;\n}\n\ndeclare const __VERSION__: string;\nexport function getVersion() {\n return __VERSION__;\n}\n\n// API bad behavior with demo app notification payload fix\nexport function parseSerializedNotificationParams(param: any, defaultValue?: any) {\n if (typeof param === 'string') {\n try {\n return JSON.parse(param);\n } catch (e) {\n console.log(e);\n }\n }\n return param === undefined && defaultValue !== undefined ? defaultValue : param;\n}\n\n// Generates a UUID v4 string.\n// This function first tries to use crypto.randomUUID, which is supported in browsers since 2022.\n// If unavailable, it falls back to a manual UUID generation method.\n// In 2027, consider simplifying this function by removing the fallback.\nexport function v4() {\n return crypto.randomUUID?.() || 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport const isFunction = (value: any): value is ((...args: any[]) => any) => typeof value === 'function';\n","import * as CONSTANTS from './constants';\nimport type { EventName } from './events.types';\n\nexport const legacyEventsMap: Record<string, { name: EventName; prop?: string }> = {\n [CONSTANTS.LEGACY_EVENT_ON_REGISTER]: {\n name: 'register',\n },\n [CONSTANTS.LEGACY_EVENT_ON_SUBSCRIBE]: {\n name: 'subscribe',\n },\n [CONSTANTS.LEGACY_EVENT_ON_UNSUBSCRIBE]: {\n name: 'unsubscribe',\n },\n [CONSTANTS.LEGACY_EVENT_ON_SW_INIT_ERROR]: {\n name: 'initialize-service-worker-error',\n prop: 'error',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PUSH_DELIVERY]: {\n name: 'receive-push',\n prop: 'notification',\n },\n [CONSTANTS.LEGACY_EVENT_ON_NOTIFICATION_CLICK]: {\n name: 'open-notification',\n prop: 'notification',\n },\n [CONSTANTS.LEGACY_EVENT_ON_NOTIFICATION_CLOSE]: {\n name: 'hide-notification',\n prop: 'notification',\n },\n [CONSTANTS.LEGACY_EVENT_ON_CHANGE_COMMUNICATION_ENABLED]: {\n name: 'change-enabled-communication',\n prop: 'isEnabled',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE]: {\n name: 'receive-inbox-message',\n prop: 'message',\n },\n [CONSTANTS.LEGACY_EVENT_ON_UPDATE_INBOX_MESSAGES]: {\n name: 'update-inbox-messages',\n prop: 'messages',\n },\n [CONSTANTS.LEGACY_EVENT_ON_SHOW_NOTIFICATION_PERMISSION_DIALOG]: {\n name: 'show-notification-permission-dialog',\n },\n [CONSTANTS.LEGACY_EVENT_ON_HIDE_NOTIFICATION_PERMISSION_DIALOG]: {\n name: 'hide-notification-permission-dialog',\n prop: 'permission',\n },\n [CONSTANTS.LEGACY_EVENT_ON_SHOW_SUBSCRIPTION_WIDGET]: {\n name: 'show-subscription-widget',\n },\n [CONSTANTS.LEGACY_EVENT_ON_HIDE_SUBSCRIPTION_WIDGET]: {\n name: 'hide-subscription-widget',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PERMISSION_DENIED]: {\n name: 'permission-denied',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PERMISSION_PROMPT]: {\n name: 'permission-default',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PERMISSION_GRANTED]: {\n name: 'permission-granted',\n },\n};\n","import { type TInboxMessagesStoreName, type TKeyValueStoreName, type TMainLogStoreName, type TMessageLogStoreName } from '../Storage.types';\n\nexport const STORE_NAME_KEY_VALUE: TKeyValueStoreName = 'keyValue';\nexport const STORE_NAME_MESSAGE_LOG: TMessageLogStoreName = 'messages';\nexport const STORE_NAME_MAIN_LOG: TMainLogStoreName = 'log';\nexport const STORE_NAME_INBOX_MESSAGES: TInboxMessagesStoreName = 'inboxMessages';\n\nexport const KEY_PATH_BASE_INCREMENT = 'id';\n","import { type TMigrationType, type TSdkStoreName } from '../Storage.types';\n\n/**\n * Check existed store, before create\n * @param name\n * @param storeCreator\n */\nexport function storeCreatorDecorator(name: TSdkStoreName, storeCreator: TMigrationType): TMigrationType {\n return function (database: IDBDatabase) {\n if (database.objectStoreNames.contains(name)) {\n return;\n }\n\n storeCreator(database);\n };\n}\n","import {\n STORE_NAME_INBOX_MESSAGES,\n} from './constants';\nimport { storeCreatorDecorator } from './helpers';\nimport {\n type TInboxMessagesIDBKeyPath,\n type TInboxMessagesIDBRemovalTimeIndex,\n type TInboxMessagesIDBStatusIndex,\n} from '../../../models/InboxMessages.types';\n\nfunction createInboxMessagesStore(database: IDBDatabase) {\n const keyPath: TInboxMessagesIDBKeyPath = 'inbox_id';\n const statusIndex: TInboxMessagesIDBStatusIndex = 'status';\n const removalTimeIndex: TInboxMessagesIDBRemovalTimeIndex = 'rt';\n\n const store = database.createObjectStore(STORE_NAME_INBOX_MESSAGES,\n { keyPath, autoIncrement: false },\n );\n store.createIndex(statusIndex, statusIndex, { unique: false, multiEntry: true });\n store.createIndex(removalTimeIndex, removalTimeIndex, { unique: false, multiEntry: true });\n}\n\nexport default [\n storeCreatorDecorator(STORE_NAME_INBOX_MESSAGES, createInboxMessagesStore),\n];\n","import {\n STORE_NAME_KEY_VALUE,\n STORE_NAME_MAIN_LOG,\n STORE_NAME_MESSAGE_LOG,\n KEY_PATH_BASE_INCREMENT,\n} from './constants';\nimport { storeCreatorDecorator } from './helpers';\n\n/**\n * Create keyValue store migration\n * @param database\n */\nfunction createKeyValueStore(database: IDBDatabase) {\n database.createObjectStore(STORE_NAME_KEY_VALUE, { keyPath: 'key' });\n}\n\n/**\n * Create log store migration\n * @param database\n */\nfunction createLogStore(database: IDBDatabase) {\n const logStore = database.createObjectStore(\n STORE_NAME_MAIN_LOG,\n { keyPath: KEY_PATH_BASE_INCREMENT, autoIncrement: true },\n );\n logStore.createIndex('environment', 'environment', { unique: false });\n logStore.createIndex('date', 'date', { unique: false });\n logStore.createIndex('type', 'type', { unique: false });\n}\n\n/**\n * Create message log store migration\n * @param database\n */\nfunction createMessageLogStore(database: IDBDatabase) {\n const messagesStore = database.createObjectStore(\n STORE_NAME_MESSAGE_LOG,\n { keyPath: KEY_PATH_BASE_INCREMENT, autoIncrement: true },\n );\n messagesStore.createIndex('date', 'date', { unique: false });\n}\n\nexport default [\n storeCreatorDecorator(STORE_NAME_KEY_VALUE, createKeyValueStore),\n storeCreatorDecorator(STORE_NAME_MAIN_LOG, createLogStore),\n storeCreatorDecorator(STORE_NAME_MESSAGE_LOG, createMessageLogStore),\n];\n","export default class DateModule {\n private _date: Date;\n\n constructor(date: Date = new Date()) {\n this._date = date;\n }\n\n set date(date: Date) {\n this._date = date;\n }\n\n get date() {\n return this._date;\n }\n\n /**\n * Timestamp in UTC without milliseconds\n */\n getUtcTimestamp() {\n return Math.floor((this.date.getTime() + this.date.getTimezoneOffset() * 60 * 1000) / 1000);\n }\n\n /**\n * Current date timestamp without milliseconds\n */\n getTimestamp() {\n return Math.round(this.date.getTime() / 1000);\n }\n\n /**\n * Set date to local timezone\n */\n setLocal() {\n const newDateTimestamp = this._date.getTime() - this.date.getTimezoneOffset() * 60 * 1000;\n this._date = new Date(newDateTimestamp);\n }\n\n /**\n * Add days to current date\n * @param days\n */\n addDays(days: number) {\n const newDateTimestamp = this._date.getTime() + days * 24 * 60 * 60 * 1000;\n this._date = new Date(newDateTimestamp);\n }\n\n /**\n * Get inbox fake order\n */\n getInboxFakeOrder(): string {\n return (this._date.getTime() * 100 + 25 * 60 * 60 * 1000 * 100).toString();\n }\n}\n","import { default as migrations26_11_2018 } from './26-11-2018';\nimport { default as migrationsInitial } from './initial';\nimport DateModule from '../../DateModule';\nimport { type TMigrationsObjectType, type TMigrationType } from '../Storage.types';\n\nexport default class Migrations {\n migrations: TMigrationsObjectType;\n dateModule: DateModule;\n\n constructor(dateModule: DateModule = new DateModule()) {\n this.migrations = {\n // initial migrations\n initial: migrationsInitial,\n\n // migrations for 2018-11-26\n '2018/11/26': migrations26_11_2018,\n };\n this.dateModule = dateModule;\n }\n\n /**\n * Initial migration pack\n */\n get initial(): Array<TMigrationType> {\n return this.migrations.initial;\n }\n\n /**\n * Return array of migrations packs sorted by date\n */\n get dateSorted(): Array<Array<TMigrationType>> {\n return Object.keys(this.migrations)\n .filter((key) => key !== 'initial') // remove initial migrations\n .sort((a, b) => { // sort migrations by date YYYY/MM/DD\n const dateA = new DateModule(new Date(a));\n const dateB = new DateModule(new Date(b));\n return dateA.getTimestamp() - dateB.getTimestamp();\n })\n .map((key) => this.migrations[key]); // Array of migrations packs, sorted by date\n }\n}\n","import Migrations from './Migrations';\nimport { type TMigrationType } from '../Storage.types';\n\nexport default class MigrationExecutor {\n db: IDBDatabase;\n migrationsBuilder: Migrations;\n\n constructor(\n db: IDBDatabase,\n migrationsBuilder: Migrations = new Migrations(),\n ) {\n this.db = db;\n this.migrationsBuilder = migrationsBuilder;\n }\n\n applyMigrations() {\n // apply initial migrations\n this.applyMigrationsPack(this.migrationsBuilder.initial);\n\n // apply migrations, sorted by date\n this.migrationsBuilder.dateSorted.forEach((migrationsPack) => {\n this.applyMigrationsPack(migrationsPack);\n });\n }\n\n applyMigrationsPack(migrationsPack: Array<TMigrationType>) {\n migrationsPack.forEach((migration) => {\n migration(this.db);\n });\n }\n}\n","import {\n STORE_NAME_KEY_VALUE,\n STORE_NAME_MAIN_LOG,\n STORE_NAME_MESSAGE_LOG,\n} from '../modules/storage/migrations/constants';\nimport MigrationExecutor from '../modules/storage/migrations/MigrationExecutor';\nimport { type IIDBOpenEventTargetWithResult } from '../modules/storage/Storage.types';\nimport version from '../modules/storage/version';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nfunction onversionchange(database: IDBDatabase, event: Event) {\n console.info('onversionchange', event);\n database.close();\n}\n\nlet databasePromise: Promise<IDBDatabase>;\nexport function getInstance(): Promise<IDBDatabase> {\n if (!databasePromise) {\n databasePromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request: IDBOpenDBRequest = indexedDB.open('PUSHWOOSH_SDK_STORE', version);\n request.onsuccess = (event) => {\n const database: IDBDatabase = (event.target as IIDBOpenEventTargetWithResult).result;\n database.onversionchange = onversionchange.bind(null, database, reject);\n resolve(database);\n };\n\n request.onerror = () => reject(request.error);\n\n request.onupgradeneeded = (event) => {\n const database: IDBDatabase = (event.target as IIDBOpenEventTargetWithResult).result;\n database.onversionchange = onversionchange.bind(null, database, reject);\n\n const migrationExecutor = new MigrationExecutor(database);\n migrationExecutor.applyMigrations();\n };\n });\n }\n return databasePromise;\n}\n\nfunction getInstanceWithPromise(executor: any): any {\n return getInstance().then((database) => (\n new Promise((resolve, reject) => executor(database, resolve, reject))\n ));\n}\n\nfunction createKeyValue(name: string) {\n return {\n get<K extends string, D>(key: K, defaultValue?: D) {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const request = database.transaction(name).objectStore(name).get(key);\n\n /** @TODO\n * we cant invoke \"resolve\" or \"reject\" in onsuccess or onerror because\n * it leads to bugs in Safari when we try to get permissions for notifications\n *\n * Checking status of request in setTimeout fixes this bug\n */\n let isComplete = false;\n let isError = false;\n let timeout: any;\n\n const check = () => {\n clearTimeout(timeout);\n if (isComplete) {\n resolve(request.result?.value || defaultValue);\n } else if (isError) {\n reject(request.error);\n } else {\n timeout = setTimeout(check, 0);\n }\n };\n\n request.onsuccess = () => isComplete = true;\n request.onerror = () => isError = true;\n check();\n });\n },\n\n getAll() {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const result: { [key: string]: any } = {};\n const cursor = database.transaction(name).objectStore(name).openCursor();\n let isComplete = false;\n let isError = false;\n let timeout: any;\n\n /** @TODO\n * we cant invoke \"resolve\" or \"reject\" in onsuccess or onerror because\n * it leads to bugs in Safari when we try to get permissions for notifications\n *\n * Checking status of request in setTimeout fixes this bug\n */\n const check = () => {\n clearTimeout(timeout);\n if (isComplete) {\n resolve(result);\n } else if (isError) {\n reject(cursor.error);\n } else {\n timeout = setTimeout(check, 0);\n }\n };\n\n cursor.onsuccess = (event) => {\n const cursorResult = (event.target as any).result;\n if (cursorResult) {\n result[cursorResult.key] = cursorResult.value.value;\n cursorResult.continue();\n } else {\n isComplete = true;\n }\n };\n cursor.onerror = () => isError = true;\n check();\n });\n },\n\n async extend(key: string, value: any) {\n const oldValues = await this.get(key);\n const { ...newValues } = value;\n await this.set(key, { ...oldValues, ...newValues });\n },\n\n set<K, D>(key: K, value: D) {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const request = database.transaction([name], 'readwrite').objectStore(name).put({ key, value });\n let isComplete = false;\n let isError = false;\n let timeout: any;\n\n /** @TODO\n * we cant invoke \"resolve\" or \"reject\" in onsuccess or onerror because\n * it leads to bugs in Safari when we try to get permissions for notifications\n *\n * Checking status of request in setTimeout fixes this bug\n */\n const check = () => {\n clearTimeout(timeout);\n if (isComplete) {\n resolve(key);\n } else if (isError) {\n reject(request.error);\n } else {\n timeout = setTimeout(check, 0);\n }\n };\n\n request.onsuccess = () => isComplete = true;\n request.onerror = () => isError = true;\n check();\n });\n },\n };\n}\n\nexport abstract class LogBase {\n protected abstract name: string;\n protected abstract maxItems: number;\n _add(obj: any) {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const request = database.transaction([this.name], 'readwrite').objectStore(this.name).add(obj);\n request.onsuccess = () => {\n resolve(obj);\n };\n request.onerror = () => {\n reject(request.error);\n };\n }).then((obj: any) => {\n return this.getAll().then((items: { id: number }[]) => {\n if (Array.isArray(items)) {\n const ids = items.map((i) => i.id).sort((a, b) => {\n if (a == b) return 0;\n return a < b ? 1 : -1;\n });\n if (ids.length > this.maxItems) {\n return Promise.all(ids.slice(this.maxItems).map((id) => this.delete(id))).then(() => obj);\n }\n }\n return obj;\n });\n });\n }\n\n delete(key: any) {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const request = database.transaction([this.name], 'readwrite').objectStore(this.name).delete(key);\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n getAll() {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const result: any[] = [];\n const cursor = database.transaction(this.name).objectStore(this.name).openCursor();\n cursor.onsuccess = (ev) => {\n const cursorResult = (ev.target as any).result;\n if (cursorResult) {\n if (cursorResult.value) {\n result.push(cursorResult.value);\n }\n cursorResult.continue();\n } else {\n resolve(result);\n }\n };\n cursor.onerror = () => {\n reject(cursor.error);\n };\n });\n }\n}\n\nexport class LogLog extends LogBase {\n protected name = STORE_NAME_MAIN_LOG;\n protected maxItems = 100;\n protected environment = (typeof self !== 'undefined' && self.registration) ? 'worker' : 'browser';\n add(type: string, message: any, additional?: any) {\n const obj: any = {\n type,\n environment: this.environment,\n message: `${message}`,\n date: new Date(),\n };\n if (message instanceof Error) {\n obj.stack = message.stack;\n }\n if (additional) {\n obj.additional = additional;\n }\n return this._add(obj);\n }\n}\n\nexport class LogMessage extends LogBase {\n protected name = STORE_NAME_MESSAGE_LOG;\n protected maxItems = 25;\n add(log: any) {\n return this._add({\n ...log,\n date: new Date(),\n });\n }\n}\n\nexport const keyValue = createKeyValue(STORE_NAME_KEY_VALUE);\nexport const log = new LogLog();\nexport const message = new LogMessage();\n","// indexed DB version\nexport default 7;\n","import { log as logStorage } from './storage';\n\nconst levels: { [key: string]: number } = {\n error: 1,\n info: 2,\n debug: 3,\n};\n\nlet limitLevel = 3;\n\ntype TWriteType = 'error' | 'apirequest' | 'info';\n\ninterface ILogger {\n setLevel(level: string): void;\n error(...args: any[]): void;\n info(...args: any[]): void;\n debug(...args: any[]): void;\n write(type: TWriteType, message: any, additional?: any): Promise<void>;\n isManualLevel(): boolean;\n [key: string]: any;\n}\n\nconst Logger: ILogger = {\n setLevel(level) {\n if (!levels[level]) {\n level = 'error';\n }\n limitLevel = levels[level];\n },\n write(type: TWriteType, message: any, additional?: any) {\n if (type === 'error') {\n this.error(message);\n } else {\n this.info(message);\n }\n return logStorage.add(type, message, additional);\n },\n} as ILogger;\n\nObject.keys(levels).forEach((levelName: string) => {\n const levelNumber = levels[levelName];\n Logger[levelName] = (...args: any[]) => {\n if (levelNumber <= limitLevel) {\n console.groupCollapsed(levelName);\n console.info('', ...args);\n console.trace('trace');\n console.groupEnd();\n }\n };\n});\n\nexport function logAndThrowError(error: string) {\n const logText = new Error(error);\n Logger.write('error', logText, 'logAndThrowError');\n throw logText;\n}\n\nexport function logAndRejectError(error: string, reject: (e: any) => void) {\n const logText = new Error(error);\n Logger.write('error', logText, 'logAndRejectError');\n reject(logText);\n}\n\nexport { Logger };\n","import { type EventHandlerMap, type EventName } from '../../events.types';\nimport { isFunction, v4 } from '../../functions';\n\ntype SavedEventHandlersMap = {\n // TODO: fix me: https://github.com/microsoft/TypeScript/issues/36390\n // [K in keyof EventHandlerMap]?: Array<EventHandlerMap[K]>\n [K in keyof EventHandlerMap]?: Array<unknown>\n};\n\nexport class EventBus {\n private readonly handlers: SavedEventHandlersMap;\n\n constructor() {\n this.handlers = {};\n }\n\n public addEventHandler = <Name extends EventName = EventName>(\n name: Name,\n handler: EventHandlerMap[Name],\n ): void => {\n let savedEventHandlers = this.handlers[name];\n if (!savedEventHandlers) {\n savedEventHandlers = [];\n }\n\n savedEventHandlers.push(handler);\n this.handlers[name] = savedEventHandlers;\n };\n\n public removeEventHandler = <Name extends EventName = EventName>(\n name: Name,\n handler: EventHandlerMap[Name],\n ): void => {\n const savedEventHandlers = this.handlers[name];\n if (!savedEventHandlers) {\n return;\n }\n\n this.handlers[name] = savedEventHandlers.filter((savedEventHandler) => (\n savedEventHandler !== handler\n ));\n };\n\n public dispatchEvent = <Name extends EventName = EventName>(\n name: Name,\n payload: Omit<Parameters<EventHandlerMap[Name]>[0], 'eventId'> & { eventId?: string },\n ): string => {\n const eventId = payload.eventId || v4();\n const savedEventHandlers = this.handlers[name];\n if (!savedEventHandlers) {\n return eventId;\n }\n\n savedEventHandlers.forEach((handler) => {\n if (!isFunction(handler)) {\n return;\n }\n\n setTimeout(() => {\n handler({ ...payload, eventId });\n }, 0);\n });\n\n return eventId;\n };\n}\n","import { type Api } from './Api/Api';\nimport { type Data } from './Data/Data';\nimport DateModule from './DateModule';\nimport { type default as InboxMessagesModel } from '../models/InboxMessages';\nimport {\n type IInboxMessage,\n type IInboxMessageActionParams,\n type IInboxMessagePublic,\n type IInboxMessages,\n type TInboxActionType,\n type TInboxMessageStatus,\n type TInboxMessageStatusDeleted,\n type TInboxMessageStatusOpen,\n type TInboxMessageStatusRead,\n type TInboxMessageType,\n type TInboxMessageTypeDeeplink,\n type TInboxMessageTypePlain,\n type TInboxMessageTypeRichmedia,\n type TInboxMessageTypeURL,\n} from '../models/InboxMessages.types';\n\nexport default class InboxMessages implements IInboxMessages {\n private readonly data: Data;\n private readonly api: Api;\n private readonly inboxModel: InboxMessagesModel;\n private dateModule: DateModule;\n\n constructor(\n data: Data,\n api: Api,\n inboxModel: InboxMessagesModel,\n dateModule: DateModule = new DateModule(),\n ) {\n this.data = data;\n this.api = api;\n this.inboxModel = inboxModel;\n this.dateModule = dateModule;\n\n this.publicMessageBuilder = this.publicMessageBuilder.bind(this);\n }\n\n /**\n * Get message type by IInboxMessageActionParams\n * @param actionParams\n */\n private messageTypeFactory(action_type: TInboxActionType, actionParams: IInboxMessageActionParams): TInboxMessageType {\n let messageType: TInboxMessageTypePlain = 0;\n if (action_type === 2) { // 2 is Richmedia Action Type for server loaded messages. See TInboxActionType typings comment.\n (<TInboxMessageTypeRichmedia>messageType) = 1;\n } else if ('l' in actionParams && actionParams.l != null) { // 'l' - URL and deeplink parameter\n if (actionParams.l.startsWith('http')) { // Deeplink parameter - relative URL; URL parameter - full URL\n (<TInboxMessageTypeURL>messageType) = 2;\n } else {\n (<TInboxMessageTypeDeeplink>messageType) = 3;\n }\n }\n\n return messageType;\n }\n\n /**\n * Update messages status using codes from arguments\n * @param codes\n * @param messages\n * @param status\n */\n private async updateMessagesStatusWithCodes(\n codes: Array<string>,\n messages: Array<IInboxMessage>,\n status: TInboxMessageStatus,\n ): Promise<void> {\n const updatedMessages: Array<IInboxMessage> = [];\n const inboxStatusQueries: Array<Promise<void>> = [];\n\n messages.forEach(async (msg) => {\n if (codes.indexOf(msg.inbox_id) === -1) {\n return;\n }\n\n msg.status = status;\n updatedMessages.push(msg);\n\n // Set inbox status to server\n inboxStatusQueries.push(this.api.inboxStatus(msg.order, msg.status));\n });\n\n await this.inboxModel.putBulkMessages(updatedMessages);\n await Promise.all(inboxStatusQueries);\n }\n\n /**\n * Build TInboxMessagePublic by TInboxMessage\n * @param message\n */\n async publicMessageBuilder({\n action_type,\n action_params,\n image,\n title,\n send_date,\n inbox_id,\n text,\n status,\n }: IInboxMessage): Promise<IInboxMessagePublic> {\n const imageUrl = image || await this.data.getDefaultNotificationImage();\n const inboxTitle = title || await this.data.getDefaultNotificationTitle();\n const actionParams = JSON.parse(action_params);\n\n this.dateModule.date = new Date(parseInt(send_date) * 1000);\n this.dateModule.setLocal();\n\n return {\n title: inboxTitle,\n imageUrl,\n code: inbox_id,\n message: text,\n sendDate: this.dateModule.date.toISOString(),\n type: this.messageTypeFactory(action_type, actionParams),\n link: actionParams?.l || '/',\n isRead: <TInboxMessageStatusRead> status === 2 || <TInboxMessageStatusOpen> status === 3,\n isActionPerformed: <TInboxMessageStatusOpen> status === 3,\n };\n }\n\n /**\n * Count of messages with no action performed\n */\n messagesWithNoActionPerformedCount(): Promise<number> {\n return this.inboxModel.getDeliveredReadMessagesCount();\n }\n\n /**\n * All unread messages\n */\n unreadMessagesCount() {\n return this.inboxModel.getDeliveredMessagesCount();\n }\n\n /**\n * All messages count\n */\n messagesCount(): Promise<number> {\n return this.inboxModel.messagesCount();\n }\n\n /**\n * Get all active messages\n */\n async loadMessages(): Promise<Array<IInboxMessagePublic>> {\n const readMessages = await this.inboxModel.getReadOpenMessages();\n const unreadMessages = await this.inboxModel.getDeliveredMessages();\n const buildMessagePromises = [...readMessages, ...unreadMessages]\n .sort((msgA: IInboxMessage, msgB: IInboxMessage) => { // sort by send date\n return parseInt(msgB.send_date, 10) - parseInt(msgA.send_date, 10);\n })\n .sort((msgA: IInboxMessage, msgB: IInboxMessage) => { // sort by order\n return parseInt(msgB.order || '0', 10) - parseInt(msgA.order || '0', 10);\n })\n .map(this.publicMessageBuilder);\n return Promise.all(buildMessagePromises);\n }\n\n /**\n * Mark messages as read\n * @param codes\n */\n async readMessagesWithCodes(codes: Array<string>): Promise<void> {\n const unreadMessages = await this.inboxModel.getDeliveredMessages();\n\n const statusRead: TInboxMessageStatusRead = 2;\n await this.updateMessagesStatusWithCodes(\n codes,\n unreadMessages,\n statusRead,\n );\n }\n\n /**\n * Execute message action. Type \"richmedia\" and \"plain\" does not support\n * @param code\n */\n async performActionForMessageWithCode(code: string): Promise<void> {\n const message = await this.inboxModel.getMessage(code);\n const actionParams = JSON.parse(message.action_params);\n const messageType = this.messageTypeFactory(message.action_type, actionParams);\n\n if (<TInboxMessageTypeURL>messageType === 2 && actionParams.l != null) {\n document.location.href = actionParams.l;\n } else if (<TInboxMessageTypeDeeplink>messageType === 3 && actionParams.l != null) {\n window.history.go(actionParams.l);\n }\n\n (<TInboxMessageStatusOpen>message.status) = 3;\n await this.inboxModel.putMessage(message);\n\n // Set inbox status to server\n await this.api.inboxStatus(message.order, message.status);\n }\n\n /**\n * Delete messages by codes\n * @param codes\n */\n async deleteMessagesWithCodes(codes: Array<string>): Promise<void> {\n const readMessages = await this.inboxModel.getReadOpenMessages();\n const unreadMessages = await this.inboxModel.getDeliveredMessages();\n\n const statusDeleted: TInboxMessageStatusDeleted = 4;\n await this.updateMessagesStatusWithCodes(\n codes,\n [...readMessages, ...unreadMessages],\n statusDeleted,\n );\n }\n\n /**\n * Sync inbox messages with server\n */\n async syncMessages() {\n await this.inboxModel.updateMessages();\n }\n}\n","import { type IIDBGetTransactionEventTargetWithResult, type TIDBKeyType, type TIDBQueryValue, type TSdkStoreName } from './Storage.types';\n\nexport default class Store {\n private readonly name: TSdkStoreName;\n private store: IDBObjectStore;\n private _index: IDBIndex;\n\n constructor(\n db: IDBDatabase,\n name: TSdkStoreName,\n ) {\n this.name = name;\n this.store = db.transaction(this.name, 'readwrite').objectStore(this.name);\n }\n\n set index(index: string) {\n const indexNames = this.store.indexNames;\n if (indexNames.contains(index)) {\n this._index = this.store.index(index);\n } else {\n console.warn(`Index \"${index}\" in `);\n }\n }\n\n private writeRequestPromise<T>(request: IDBRequest, result?: T): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => {\n // @ts-ignore\n resolve(result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n private readRequestPromise<Response, D>(request: IDBRequest, defaultValue?: D): Promise<Response | D> {\n return new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n const target: IIDBGetTransactionEventTargetWithResult = <IIDBGetTransactionEventTargetWithResult>event.target;\n // @ts-ignore\n resolve(<Response>target.result || defaultValue);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n put(data: any, key?: TIDBKeyType): Promise<TIDBKeyType> {\n const request = this.store.put(data, key);\n return this.writeRequestPromise<TIDBKeyType>(request, key);\n }\n\n /**\n * Fallback for old interface\n * @param data\n * @param key\n */\n add(data: any, key?: string): Promise<TIDBKeyType> {\n return this.put(data, key);\n }\n\n delete(key: TIDBKeyType): Promise<void> {\n const request = this.store.delete(key);\n return this.writeRequestPromise(request);\n }\n\n get<Response, D>(key: TIDBKeyType, defaultValue?: D) {\n const request = this.store.get(key);\n return this.readRequestPromise<Response, D>(request, defaultValue);\n }\n\n getAll<Response>(): Promise<Array<Response>> {\n const cursor = this.store.openCursor();\n const result: Array<Response> = [];\n\n return new Promise((resolve, reject) => {\n cursor.onsuccess = (event) => {\n const target: IIDBGetTransactionEventTargetWithResult = <IIDBGetTransactionEventTargetWithResult>event.target;\n const cursorResult = target.result;\n if (cursorResult) {\n result.push(cursorResult.value);\n cursorResult.continue();\n } else {\n resolve(result);\n }\n };\n cursor.onerror = () => {\n reject(cursor.error);\n };\n });\n }\n\n count(query?: IDBKeyRange): Promise<number> {\n const request = this.store.count(query);\n return this.readRequestPromise<number, number>(request, 0);\n }\n\n countByIndex(key?: TIDBQueryValue) {\n const request = this._index.count(key);\n return this.readRequestPromise<number, number>(request, 0);\n }\n}\n","import MigrationExecutor from './migrations/MigrationExecutor';\nimport { type IIDBOpenEventTargetWithResult, type TIDBKeyType, type TIDBQueryValue, type TSdkStoreName } from './Storage.types';\nimport Store from './Store';\nimport dbVersion from './version';\n\nexport default class Storage {\n db: Promise<IDBDatabase>;\n\n /**\n * Change database version handler\n * @param db\n * @param event\n */\n private dbVersionChangeHandler(db: IDBDatabase, event: IDBVersionChangeEvent) {\n console.info('onversionchange', event);\n db.close();\n }\n\n /**\n * Success database request handler\n * @param resolve\n * @param event\n */\n private dbRequestSuccessHandler(resolve: (db: IDBDatabase) => void, event: Event) {\n const target: IIDBOpenEventTargetWithResult = <IIDBOpenEventTargetWithResult>event.target;\n const database: IDBDatabase = target.result;\n\n // close db and resolve new db instance on version change\n database.onversionchange = (event: IDBVersionChangeEvent) => {\n this.dbVersionChangeHandler(database, event);\n };\n\n resolve(database);\n }\n\n /**\n * Need upgrade database version handler\n * @param event\n */\n private dbRequestUpgradeNeededHandler(event: Event) {\n const target: IIDBOpenEventTargetWithResult = <IIDBOpenEventTargetWithResult>event.target;\n const database: IDBDatabase = target.result;\n\n // close db and resolve new db instance on version change\n database.onversionchange = (event: IDBVersionChangeEvent) => {\n this.dbVersionChangeHandler(database, event);\n };\n\n // apply migrations\n const migrationExecutor = new MigrationExecutor(database);\n migrationExecutor.applyMigrations();\n }\n\n /**\n * Open db\n */\n getDB(): Promise<IDBDatabase> {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request: IDBOpenDBRequest = indexedDB.open('PUSHWOOSH_SDK_STORE', dbVersion);\n\n request.onsuccess = (event: Event) => {\n this.dbRequestSuccessHandler(resolve, event); // Existing db without updates\n };\n request.onupgradeneeded = (event: Event) => {\n this.dbRequestUpgradeNeededHandler(event); // Upgrade DB\n };\n request.onerror = () => reject(request.error); // Handle errors\n });\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/put\n * @param storeName\n * @param data\n * @param key\n */\n async put(storeName: TSdkStoreName, data: any, key?: string) {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.put(data, key);\n db.close();\n return result;\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/delete\n * @param storeName\n * @param key\n */\n async delete(storeName: TSdkStoreName, key: string | number) {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.delete(key);\n db.close();\n return result;\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/get\n * @param storeName\n * @param key\n * @param defaultValue\n */\n async get<Response, D>(\n storeName: TSdkStoreName,\n key: TIDBKeyType,\n defaultValue?: D,\n ): Promise<Response | D> {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.get<Response, D>(key, defaultValue);\n db.close();\n return result;\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/getAll\n * @param storeName\n */\n async getAll<Response>(\n storeName: TSdkStoreName,\n ): Promise<Array<Response>> {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.getAll<Response>();\n db.close();\n return result || [];\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/count\n * @param storeName\n * @param query\n */\n async count(\n storeName: TSdkStoreName,\n query?: IDBKeyRange,\n ): Promise<number> {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.count(query);\n db.close();\n return result;\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBIndex/count\n * @param storeName\n * @param indexName\n * @param key\n */\n async countByIndex(\n storeName: TSdkStoreName,\n indexName: string,\n key?: TIDBQueryValue,\n ): Promise<number> {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n store.index = indexName;\n const result = await store.countByIndex(key);\n db.close();\n return result;\n }\n}\n","import {\n type IGetInboxMessagesResponse, type IInboxMessage, type TInboxMessagesIDBStatusIndex,\n type TInboxMessageStatusDelivered, type TInboxMessageStatusOpen,\n type TInboxMessageStatusRead, type TReadInboxMessagesStatusRange,\n} from './InboxMessages.types';\nimport { type EventBus } from '../core/modules/EventBus';\nimport { type Api } from '../modules/Api/Api';\nimport { type Data } from '../modules/Data/Data';\nimport DateModule from '../modules/DateModule';\nimport InboxMessagesPublic from '../modules/InboxMessagesPublic';\nimport Storage from '../modules/storage/Storage';\nimport { type TInboxMessagesStoreName } from '../modules/storage/Storage.types';\n\nexport default class InboxMessages {\n eventBus: EventBus;\n data: Data;\n api: Api;\n storage: Storage;\n storeName: TInboxMessagesStoreName;\n dateModule: DateModule;\n\n constructor(\n eventBus: EventBus,\n data: Data,\n api: Api,\n storage: Storage = new Storage(),\n dateModule: DateModule = new DateModule(),\n ) {\n this.eventBus = eventBus;\n this.data = data;\n this.api = api;\n\n this.storage = storage;\n this.storeName = 'inboxMessages';\n this.dateModule = dateModule;\n }\n\n /**\n * Get inbox messages by api\n */\n private async getInboxMessages(): Promise<IGetInboxMessagesResponse> {\n // get inbox messages\n const response: IGetInboxMessagesResponse = await this.api.getInboxMessages();\n await this.storeGetInboxMessagesRequestParams(response.next, response.new_inbox);\n\n return response;\n }\n\n /**\n * Store parameters for next getInboxMessages request\n * @param next\n * @param newMessagesCount\n */\n private async storeGetInboxMessagesRequestParams(next: string, newMessagesCount: number): Promise<void> {\n this.dateModule.date = new Date();\n await this.data.setInboxLastRequestTime(this.dateModule.getUtcTimestamp());\n\n await this.data.setInboxLastRequestCode(next);\n await this.data.setInboxNewMessagesCount(newMessagesCount);\n }\n\n /**\n * Put loaded messages. Add delete status to loaded messages if this status set locally.\n * @param messages\n */\n private async putServerMessages(messages: Array<IInboxMessage>): Promise<Array<string>> {\n const putTransactions = messages.map(async (message: IInboxMessage) => {\n const localMessage = await this.storage.get<IInboxMessage, object>(this.storeName, message.inbox_id, {});\n if ('status' in localMessage) {\n message.status = localMessage.status;\n }\n return this.putMessage(message);\n });\n\n return Promise.all(putTransactions);\n }\n\n /**\n * Create or update inbox message\n */\n putMessage(message: IInboxMessage): Promise<string> {\n return <Promise<string>> this.storage.put(this.storeName, message);\n }\n\n /**\n * Create or update messages pack\n * @param messages\n */\n putBulkMessages(messages: Array<IInboxMessage>): Promise<Array<string>> {\n const putTransactions = messages.map((message) => this.putMessage(message));\n return Promise.all(putTransactions);\n }\n\n /**\n * Delete messages by codes\n * @param codes\n */\n deleteMessages(codes: Array<string>): Promise<Array<void>> {\n const deleteTransactions = codes.map((code) => this.storage.delete(this.storeName, code));\n return Promise.all(deleteTransactions);\n }\n\n /**\n * Delete expired by removal time messages\n */\n async deleteExpiredMessages(): Promise<Array<void>> {\n this.dateModule.date = new Date();\n const upperBound = this.dateModule.getTimestamp().toString();\n const allMessages = await this.storage\n .getAll<IInboxMessage>(this.storeName);\n const codesToDelete = allMessages\n .filter((msg: IInboxMessage) => msg.rt < upperBound)\n .map((msg) => msg.inbox_id);\n return this.deleteMessages(codesToDelete);\n }\n\n /**\n * Get message by code\n * @param code - inbox_id\n */\n getMessage(code: string): Promise<IInboxMessage> {\n return this.storage.get<IInboxMessage, IInboxMessage>(this.storeName, code);\n }\n\n /**\n * Get all read messages\n */\n async getReadOpenMessages(): Promise<Array<IInboxMessage>> {\n const allMessages = await this.storage\n .getAll<IInboxMessage>(this.storeName);\n return allMessages\n .filter((msg: IInboxMessage) => <TInboxMessageStatusRead>msg.status === 2 || <TInboxMessageStatusOpen>msg.status === 3);\n }\n\n /**\n * Get all unread messages\n */\n async getDeliveredMessages(): Promise<Array<IInboxMessage>> {\n const allMessages = await this.storage\n .getAll<IInboxMessage>(this.storeName);\n return allMessages\n .filter((msg: IInboxMessage) => <TInboxMessageStatusDelivered>msg.status === 1);\n }\n\n /**\n * All messages count\n */\n async messagesCount(): Promise<number> {\n return this.storage.count(this.storeName);\n }\n\n /**\n * Get count of messages with status \"Delivered\"\n */\n async getDeliveredMessagesCount(): Promise<number> {\n const deliveredStatus: TInboxMessageStatusDelivered = 1;\n const statusIndexName: TInboxMessagesIDBStatusIndex = 'status';\n return this.storage\n .countByIndex(this.storeName, statusIndexName, deliveredStatus);\n }\n\n /**\n * Get count of messages with status \"Read\"\n */\n async getReadMessagesCount(): Promise<number> {\n const readStatus: TInboxMessageStatusRead = 2;\n const statusIndexName: TInboxMessagesIDBStatusIndex = 'status';\n return this.storage\n .countByIndex(this.storeName, statusIndexName, readStatus);\n }\n\n /**\n * Get count of messages with status \"Delivered\" and \"Read\"\n */\n async getDeliveredReadMessagesCount(): Promise<number> {\n const [readStatus, openStatus]: TReadInboxMessagesStatusRange = [2, 3];\n const keyRange = IDBKeyRange.bound(readStatus, openStatus);\n const statusIndexName: TInboxMessagesIDBStatusIndex = 'status';\n\n return this.storage.countByIndex(this.storeName, statusIndexName, keyRange);\n }\n\n /**\n * Load messages and sync with locally\n */\n async updateMessages(): Promise<void> {\n const response = await this.getInboxMessages();\n await this.deleteExpiredMessages();\n if (response.deleted) {\n await this.deleteMessages(response.deleted); // deleted from cp\n }\n await this.putServerMessages(response.messages);\n\n this.eventBus.dispatchEvent('update-inbox-messages', {\n messages: new InboxMessagesPublic(\n this.data,\n this.api,\n this,\n ),\n });\n }\n}\n","import * as CONSTANTS from '../../core/constants';\nimport { keyValue } from '../../core/storage';\n\nconst getKey = (key: string): string => `params.${key}`;\n\nexport class Data {\n private readonly store: typeof keyValue;\n\n constructor(store: typeof keyValue = keyValue) {\n this.store = store;\n }\n\n public async clearAll(): Promise<void> {\n const keys = [\n 'applicationCode',\n 'apiToken',\n 'hwid',\n 'deviceType',\n 'deviceModel',\n 'language',\n 'apiEntrypoint',\n 'tokens',\n 'applicationServerKey',\n 'isVapidChanged',\n 'webSitePushId',\n 'defaultNotificationImage',\n 'defaultNotificationTitle',\n 'userId',\n 'userIdWasChanged',\n 'email',\n 'emailWasChanged',\n 'isLastPermissionStatus',\n 'isManualUnsubscribed',\n 'isCommunicationDisabled',\n 'communicationEnabled',\n 'isDropAllData',\n 'sdkVersion',\n 'serviceWorkerVersion',\n 'serviceWorkerUrl',\n 'serviceWorkerScope',\n 'lastOpenMessage',\n 'lastOpenApplicationTime',\n 'features',\n 'init',\n 'inbox.lastRequestCode',\n 'inbox.lastRequestTime',\n 'inbox.newMessagesCount',\n 'delayedEvent',\n 'promptDisplayCount',\n 'promptLastSeenTime',\n ];\n\n for (const key of keys) {\n await this.store.set(getKey(key), undefined);\n }\n }\n\n public async setApplicationCode(application: string): Promise<void> {\n await this.store.set(getKey('applicationCode'), application);\n }\n\n public async getApplicationCode(): Promise<string> {\n return this.store.get(getKey('applicationCode'));\n }\n\n public async setApiToken(token: string): Promise<string> {\n return await this.store.set(getKey('apiToken'), token);\n }\n\n public async getApiToken(): Promise<string> {\n return this.store.get(getKey('apiToken'));\n }\n\n public async setHwid(hwid: string): Promise<void> {\n await this.store.set(getKey('hwid'), hwid);\n }\n\n public async getHwid(): Promise<string> {\n return this.store.get(getKey('hwid'));\n }\n\n public async setDeviceType(type: number): Promise<void> {\n await this.store.set(getKey('deviceType'), type);\n }\n\n public async getDeviceType(): Promise<number> {\n return this.store.get(getKey('deviceType'));\n }\n\n public async setDeviceModel(model: string): Promise<void> {\n await this.store.set(getKey('deviceModel'), model);\n }\n\n public async getDeviceModel(): Promise<string> {\n return this.store.get(getKey('deviceModel'));\n }\n\n public async setLanguage(language: string): Promise<void> {\n await this.store.set(getKey('language'), language);\n }\n\n public async getLanguage(): Promise<string> {\n return this.store.get(getKey('language'), 'en');\n }\n\n public async setApiEntrypoint(url: string): Promise<void> {\n await this.store.set(getKey('apiEntrypoint'), url);\n }\n\n public async getApiEntrypoint(): Promise<string> {\n return this.store.get(getKey('apiEntrypoint'), CONSTANTS.DEFAULT_API_URL);\n }\n\n public async setTokens(tokens: any): Promise<void> {\n await this.store.set(getKey('tokens'), tokens);\n }\n\n public getTokens(): Promise<any> {\n return this.store.get(getKey('tokens'));\n }\n\n public async setApplicationServerKey(key: string): Promise<void> {\n await this.store.set(getKey('applicationServerKey'), key);\n }\n\n public async getApplicationServerKey(): Promise<string | undefined> {\n return this.store.get(getKey('applicationServerKey'));\n }\n\n public async setIsVapidChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('isVapidChanged'), status);\n }\n\n public async getIsVapidChanged(): Promise<boolean> {\n return this.store.get(getKey('isVapidChanged'), false);\n }\n\n public async setWebSitePushId(senderId: string): Promise<void> {\n await this.store.set(getKey('webSitePushId'), senderId);\n }\n\n public async getWebSitePushId(): Promise<string> {\n return this.store.get(getKey('webSitePushId'));\n }\n\n public async setDefaultNotificationImage(url?: string): Promise<void> {\n await this.store.set(getKey('defaultNotificationImage'), url);\n }\n\n public async getDefaultNotificationImage(): Promise<string> {\n return this.store.get(getKey('defaultNotificationImage'), CONSTANTS.DEFAULT_NOTIFICATION_IMAGE);\n }\n\n public async setDefaultNotificationTitle(text?: string): Promise<void> {\n await this.store.set(getKey('defaultNotificationTitle'), text);\n }\n\n public async getDefaultNotificationTitle(): Promise<string> {\n return this.store.get(getKey('defaultNotificationTitle'), CONSTANTS.DEFAULT_NOTIFICATION_TITLE);\n }\n\n public async setUserId(userId?: string | number | undefined): Promise<void> {\n await this.store.set(getKey('userId'), userId ? `${userId}` : undefined);\n }\n\n public async getUserId(): Promise<string | undefined> {\n return this.store.get(getKey('userId'));\n }\n\n public async setStatusUserIdWasChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('userIdWasChanged'), status);\n }\n\n public async getStatusUserIdWasChanged(): Promise<boolean> {\n return this.store.get(getKey('userIdWasChanged'), false);\n }\n\n public async setEmail(email?: string): Promise<void> {\n await this.store.set(getKey('email'), email ? `${email}` : undefined);\n }\n\n public async getEmail(): Promise<string | undefined> {\n return this.store.get(getKey('email'));\n }\n\n public async setStatusEmailWasChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('emailWasChanged'), status);\n }\n\n public async getStatusEmailWasChanged(): Promise<boolean> {\n return this.store.get(getKey('emailWasChanged'), false);\n }\n\n public async setSmsNumber(number?: string): Promise<void> {\n await this.store.set(getKey('smsNumber'), number ? `${number}` : undefined);\n }\n\n public async getSmsNumber(): Promise<string | undefined> {\n return this.store.get(getKey('smsNumber'));\n }\n\n public async setStatusSmsNumberWasChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('smsNumberWasChanged'), status);\n }\n\n public async getStatusSmsNumberWasChanged(): Promise<boolean> {\n return this.store.get(getKey('smsNumberWasChanged'), false);\n }\n\n public async setWhatsAppNumber(number?: string): Promise<void> {\n await this.store.set(getKey('whatsAppNumber'), number ? `${number}` : undefined);\n }\n\n public async getWhatsAppNumber(): Promise<string | undefined> {\n return this.store.get(getKey('whatsAppNumber'));\n }\n\n public async setStatusWhatsAppNumberWasChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('whatsAppNumberWasChanged'), status);\n }\n\n public async getStatusWhatsAppNumberWasChanged(): Promise<boolean> {\n return this.store.get(getKey('whatsAppNumberWasChanged'), false);\n }\n\n public async setLastPermissionStatus(status: NotificationPermission): Promise<void> {\n await this.store.set(getKey('isLastPermissionStatus'), status);\n }\n\n public async getLastPermissionStatus(): Promise<NotificationPermission | undefined> {\n return this.store.get(getKey('isLastPermissionStatus'));\n }\n\n public async setStatusManualUnsubscribed(status: boolean): Promise<void> {\n await this.store.set(getKey('isManualUnsubscribed'), status);\n }\n\n public getStatusManualUnsubscribed(): Promise<boolean> {\n return this.store.get(getKey('isManualUnsubscribed'), false);\n }\n\n public async setStatusCommunicationDisabled(status: boolean): Promise<void> {\n await this.store.set(getKey('isCommunicationDisabled'), status);\n }\n\n public getStatusCommunicationDisabled(): Promise<boolean> {\n return this.store.get(getKey('isCommunicationDisabled'), false);\n }\n\n public async setCommunicationEnabled(status?: boolean): Promise<void> {\n await this.store.set(getKey('communicationEnabled'), status);\n }\n\n public getCommunicationEnabled(): Promise<boolean | undefined> {\n return this.store.get(getKey('communicationEnabled'));\n }\n\n public async setStatusDropAllData(status: boolean): Promise<void> {\n await this.store.set(getKey('isDropAllData'), status);\n }\n\n public getStatusDropAllData(): Promise<boolean> {\n return this.store.get(getKey('isDropAllData'), false);\n }\n\n public async setSdkVersion(version: string): Promise<void> {\n await this.store.set(getKey('sdkVersion'), version);\n }\n\n public async getSdkVersion(): Promise<string> {\n return this.store.get(getKey('sdkVersion'));\n }\n\n public async setServiceWorkerVersion(version: string): Promise<void> {\n await this.store.set(getKey('serviceWorkerVersion'), version);\n }\n\n public getServiceWorkerVersion(): Promise<string> {\n return this.store.get(getKey('serviceWorkerVersion'));\n }\n\n public async setServiceWorkerUrl(url?: string | null): Promise<void> {\n if (!url) {\n return;\n }\n\n await this.store.set(getKey('serviceWorkerUrl'), url);\n }\n\n public async getServiceWorkerUrl(): Promise<string> {\n return this.store.get(getKey('serviceWorkerUrl'), CONSTANTS.DEFAULT_SERVICE_WORKER_URL);\n }\n\n public async setServiceWorkerScope(scope?: string): Promise<void> {\n if (!scope) {\n return;\n }\n\n await this.store.set(getKey('serviceWorkerScope'), scope);\n }\n\n public async getServiceWorkerScope(): Promise<string> {\n return this.store.get(getKey('serviceWorkerScope'));\n }\n\n public async setLastOpenMessage(message: any): Promise<void> {\n await this.store.set(getKey('lastOpenMessage'), message);\n }\n\n public getLastOpenMessage(): Promise<any> {\n return this.store.get(getKey('lastOpenMessage'));\n }\n\n public async setLastOpenApplicationTime(time: number): Promise<void> {\n await this.store.set(getKey('lastOpenApplicationTime'), time);\n }\n\n public async getLastOpenApplicationTime(): Promise<number> {\n return this.store.get(getKey('lastOpenApplicationTime'));\n }\n\n public async setFeatures(features: any): Promise<void> {\n await this.store.set(getKey('features'), features);\n }\n\n public async getFeatures(): Promise<any> {\n return this.store.get(getKey('features'));\n }\n\n public async setInitParams(params: any): Promise<any> {\n await this.store.set(getKey('init'), params);\n }\n\n public async getInitParams(): Promise<any> {\n return this.store.get(getKey('init'));\n }\n\n public async setInboxLastRequestCode(lastCode: string): Promise<void> {\n await this.store.set(getKey('inbox.lastRequestCode'), lastCode);\n }\n\n public async getInboxLastRequestCode(): Promise<string> {\n return this.store.get(getKey('inbox.lastRequestCode'), '');\n }\n\n public async setInboxLastRequestTime(lastRequestTime: number): Promise<void> {\n await this.store.set(getKey('inbox.lastRequestTime'), lastRequestTime);\n }\n\n public async getInboxLastRequestTime(): Promise<number> {\n return this.store.get(getKey('inbox.lastRequestTime'), 0);\n }\n\n public async setInboxNewMessagesCount(count: number): Promise<void> {\n await this.store.set(getKey('inbox.newMessagesCount'), count);\n }\n\n public async getInboxNewMessagesCount(): Promise<number> {\n return this.store.get(getKey('inbox.newMessagesCount'), 0);\n }\n\n public async setDelayedEvent(event: any): Promise<void> {\n await this.store.set(getKey('delayedEvent'), event);\n }\n\n public getDelayedEvent(): Promise<any> {\n return this.store.get(getKey('delayedEvent'));\n }\n\n public async setPromptDisplayCount(count: number): Promise<void> {\n await this.store.set(getKey('promptDisplayCount'), count);\n }\n\n public async getPromptDisplayCount(): Promise<number> {\n return this.store.get(getKey('promptDisplayCount'), 0);\n }\n\n public async setPromptLastSeenTime(time: number): Promise<void> {\n await this.store.set(getKey('promptLastSeenTime'), time);\n }\n\n public async getPromptLastSeenTime(): Promise<number> {\n return this.store.get(getKey('promptLastSeenTime'), 0);\n }\n}\n","import { type TMethod, type IMapRequest, type IMapResponse } from './ApiClient.types';\nimport { getGlobal } from '../../core/functions';\nimport { Logger } from '../../core/logger';\nimport { Data } from '../Data/Data';\n\nexport class ApiClient {\n private readonly data: Data;\n private readonly logger: typeof Logger;\n\n constructor(\n data: Data = new Data(),\n logger: typeof Logger = Logger,\n ) {\n this.data = data;\n this.logger = logger;\n }\n\n public checkDevice(options: IMapRequest['checkDevice']): Promise<IMapResponse['checkDevice']> {\n return this.createRequest('checkDevice', options);\n }\n\n public getConfig(options: IMapRequest['getConfig']): Promise<IMapResponse['getConfig']> {\n return this.createRequest('getConfig', options);\n }\n\n public applicationOpen(options: IMapRequest['applicationOpen']): Promise<IMapResponse['applicationOpen']> {\n return this.createRequest('applicationOpen', options);\n }\n\n public registerDevice(options: IMapRequest['registerDevice']): Promise<IMapResponse['registerDevice']> {\n return this.createRequest('registerDevice', options);\n }\n\n public unregisterDevice(options: IMapRequest['unregisterDevice']): Promise<IMapResponse['unregisterDevice']> {\n return this.createRequest('unregisterDevice', options);\n }\n\n public deleteDevice(options: IMapRequest['deleteDevice']): Promise<IMapResponse['deleteDevice']> {\n return this.createRequest('deleteDevice', options);\n }\n\n public messageDeliveryEvent(options: IMapRequest['messageDeliveryEvent']): Promise<IMapResponse['messageDeliveryEvent']> {\n return this.createRequest('messageDeliveryEvent', options);\n }\n\n public pushStat(options: IMapRequest['pushStat']): Promise<IMapResponse['pushStat']> {\n return this.createRequest('pushStat', options);\n }\n\n public setTags(options: IMapRequest['setTags']): Promise<IMapResponse['setTags']> {\n return this.createRequest('setTags', options);\n }\n\n public getTags(options: IMapRequest['getTags']): Promise<IMapResponse['getTags']> {\n return this.createRequest('getTags', options);\n }\n\n public registerUser(options: IMapRequest['registerUser']): Promise<IMapResponse['registerUser']> {\n return this.createRequest('registerUser', options);\n }\n\n public registerEmail(options: IMapRequest['registerEmail']): Promise<IMapResponse['registerEmail']> {\n return this.createRequest('registerEmail', options);\n }\n\n public registerEmailUser(options: IMapRequest['registerEmailUser']): Promise<IMapResponse['registerEmailUser']> {\n return this.createRequest('registerEmailUser', options);\n }\n\n public setEmailTags(options: IMapRequest['setEmailTags']): Promise<IMapResponse['setEmailTags']> {\n return this.createRequest('setEmailTags', options);\n }\n\n public postEvent(options: IMapRequest['postEvent']): Promise<IMapResponse['postEvent']> {\n return this.createRequest('postEvent', options);\n }\n\n public getInboxMessages(options: IMapRequest['getInboxMessages']): Promise<IMapResponse['getInboxMessages']> {\n return this.createRequest('getInboxMessages', options);\n }\n\n public inboxStatus(options: IMapRequest['inboxStatus']): Promise<IMapResponse['inboxStatus']> {\n return this.createRequest('inboxStatus', options);\n }\n\n public pageVisit(options: IMapRequest['pageVisit'], url: string): Promise<IMapResponse['pageVisit']> {\n return this.createRequest('pageVisit', options, url);\n }\n\n public setPurchase(options: IMapRequest['setPurchase']): Promise<IMapResponse['setPurchase']> {\n return this.createRequest('setPurchase', options);\n }\n\n public multiRegisterDevice(options: IMapRequest['multiRegisterDevice']): Promise<IMapResponse['multiRegisterDevice']> {\n return this.createRequest('multiRegisterDevice', options);\n }\n\n private async createRequest<T extends TMethod>(\n methodName: T,\n request: IMapRequest[T],\n customUrl?: string,\n ): Promise<IMapResponse[T]> {\n const entrypoint = await this.data.getApiEntrypoint();\n const apiToken = await this.data.getApiToken();\n const url = customUrl || entrypoint + methodName;\n\n const authRequestOptions = apiToken ? {\n headers: {\n Authorization: `Token ${apiToken}`,\n 'Content-Type': 'text/plain;charset=UTF-8',\n Origin: getGlobal().location.origin,\n },\n credentials: 'include' as RequestCredentials,\n } : {};\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'text/plain;charset=UTF-8',\n },\n body: JSON.stringify({\n request,\n }),\n ...authRequestOptions,\n });\n\n const result = await this.checkResponse(response);\n\n // reset api entrypoint if need\n if (result.base_url) {\n await this.data.setApiEntrypoint(result.base_url);\n }\n\n await this.logger.write(\n 'apirequest',\n `${methodName} call with arguments: ${JSON.stringify(request)} to Pushwoosh has been successful. Result: ${JSON.stringify(result.response)}`,\n );\n\n return result.response as IMapResponse[T];\n }\n\n private async checkResponse(response: Response): Promise<any> {\n if (response.status !== 200) {\n let errorMessage = `status: ${response.status}. statusText: ${response.statusText}.`;\n try {\n const json = await response.json();\n if (json && json.status_message) {\n errorMessage += ` status_code: ${json.status_code}. status_message: ${json.status_message}.`;\n }\n } catch (_e) { /* empty */ }\n throw new Error(errorMessage);\n }\n\n const data = await response.json();\n\n if (data.status_code !== 200) {\n throw new Error(`Error code: ${data.status_code}. Error text: ${data.status_message}`);\n }\n\n return data;\n }\n}\n","import {\n type SetPurchaseAttributes,\n type MultiRegisterDeviceRequest,\n type PushDevice,\n type WebPushPlatformData,\n} from './Api.types';\nimport * as CONSTANTS from '../../core/constants';\nimport { type EventBus } from '../../core/modules/EventBus';\nimport { ApiClient } from '../ApiClient/ApiClient';\nimport {\n type IMapResponse,\n type IRequest,\n} from '../ApiClient/ApiClient.types';\nimport { Data } from '../Data/Data';\nimport { type TPlatform } from '../PlatformChecker/PlatformChecker.types';\n\nexport class Api {\n private readonly data: Data;\n private readonly apiClient: ApiClient;\n private readonly eventBus: EventBus;\n private readonly getIsCommunicationDisabled: () => boolean | undefined;\n\n constructor(\n eventBus: EventBus,\n data: Data = new Data(),\n apiClient: ApiClient = new ApiClient(),\n getIsCommunicationDisabled: () => boolean | undefined = () => false,\n ) {\n this.eventBus = eventBus;\n this.data = data;\n this.apiClient = apiClient;\n this.getIsCommunicationDisabled = getIsCommunicationDisabled;\n }\n\n public async checkDevice(): Promise<IMapResponse['checkDevice']> {\n const params = await this.getRequestParams();\n\n return await this.apiClient.checkDevice(params);\n }\n\n public async checkDeviceSubscribeForPushNotifications(useCache: boolean = true): Promise<boolean> {\n // get current subscription status from local storage\n let status = localStorage.getItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS);\n\n // check need force update\n if (typeof status === 'undefined' || !useCache) {\n const { exist, push_token_exist } = await this.checkDevice();\n localStorage.setItem(\n CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS,\n (exist && push_token_exist)\n ? CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED\n : CONSTANTS.DEVICE_REGISTRATION_STATUS_UNREGISTERED,\n );\n\n status = localStorage.getItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS);\n }\n\n return status === CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED;\n }\n\n public async getConfig(features: string[]): Promise<IMapResponse['getConfig']> {\n const params = await this.getRequestParams();\n\n return this.apiClient.getConfig({\n ...params,\n features,\n });\n }\n\n public async applicationOpen(): Promise<IMapResponse['applicationOpen']> {\n const params = await this.getRequestParams();\n\n // set do database latest sending time\n await this.data.setLastOpenApplicationTime(Date.now());\n\n return this.apiClient.applicationOpen(params);\n }\n\n public async registerDevice(): Promise<IMapResponse['registerDevice']> {\n // check communication disabled\n const isCommunicationDisabled = await this.data.getStatusCommunicationDisabled();\n\n // if communication disabled -> can't register device\n if (isCommunicationDisabled) {\n throw new Error(`Can't register device: Communication is disabled!`);\n }\n\n const params = await this.getRequestParams();\n const tokens = await this.data.getTokens();\n\n // if there is no pushToken -> user did not grant permission to send push notifications\n if (!tokens.pushToken) {\n throw new Error(`Can't register device: pushToken is not exist!`);\n }\n\n // register device into Pushwoosh\n const response = await this.apiClient.registerDevice({\n ...params,\n push_token: tokens.pushToken,\n auth_token: tokens.authToken,\n public_key: tokens.publicKey,\n });\n\n // set info to database, that the device IS NOT manual unsubscribed\n await this.data.setStatusManualUnsubscribed(false);\n\n // set info to local storage, that device is subscribed\n localStorage.setItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS, CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED);\n\n // emit event\n this.eventBus.dispatchEvent('register', {});\n\n return response;\n }\n\n public async unregisterDevice(): Promise<IMapResponse['unregisterDevice']> {\n const params = await this.getRequestParams();\n const response = await this.apiClient.unregisterDevice(params);\n\n // set info to local storage, that device is unsubscribed\n localStorage.setItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS, CONSTANTS.DEVICE_REGISTRATION_STATUS_UNREGISTERED);\n\n // emit event\n this.eventBus.dispatchEvent('unsubscribe', {});\n\n return response;\n }\n\n public async deleteDevice(): Promise<IMapResponse['deleteDevice']> {\n const params = await this.getRequestParams();\n\n const response = await this.apiClient.deleteDevice(params);\n\n // set info to database, that the device IS manual unsubscribed\n await this.data.setStatusManualUnsubscribed(true);\n\n // set info to local storage, that device is unsubscribed\n localStorage.setItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS, CONSTANTS.DEVICE_REGISTRATION_STATUS_UNREGISTERED);\n\n // emit event\n this.eventBus.dispatchEvent('unsubscribe', {});\n\n return response;\n }\n\n public async messageDeliveryEvent(hash: string, isTrackingLogOnFailure?: boolean, metaData: { [key: string]: any } = {}): Promise<IMapResponse['messageDeliveryEvent']> {\n const params = await this.getRequestParams();\n\n return await this.apiClient.messageDeliveryEvent({\n ...params,\n hash,\n metaData,\n });\n }\n\n public async pushStat(hash: string, isTrackingLogOnFailure?: boolean, metaData: { [key: string]: any } = {}): Promise<IMapResponse['pushStat']> {\n const params = await this.getRequestParams();\n\n return await this.apiClient.pushStat({\n ...params,\n hash,\n metaData,\n });\n }\n\n public async setTags(tags: { [key: string]: any }): Promise<IMapResponse['setTags']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n const { hwid, device_type, ...params } = await this.getRequestParams();\n const email = await this.data.getEmail();\n\n // set email tags in pushwoosh\n if (email) {\n await this.apiClient.setEmailTags({\n ...params,\n email,\n tags,\n });\n }\n\n return this.apiClient.setTags({\n ...params,\n hwid,\n device_type,\n tags,\n });\n }\n\n public async getTags(): Promise<IMapResponse['getTags']> {\n const params = await this.getRequestParams();\n\n return this.apiClient.getTags(params);\n }\n\n public async registerUser(userId: string | number, isManual = true): Promise<IMapResponse['registerUser']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n const {\n hwid,\n device_type: _device_type,\n ...params\n } = await this.getRequestParams();\n const deviceType = await this.data.getDeviceType();\n\n const id = `${userId}`;\n\n // register user in pushwoosh\n const response = await this.apiClient.registerUser({\n ...params,\n hwid,\n userId: id,\n ts_offset: -(new Date()).getTimezoneOffset() * 60,\n device_type: deviceType,\n });\n\n // set user id to database\n await this.data.setUserId(id);\n\n // set info to database that user id was change\n if (isManual) {\n await this.data.setStatusUserIdWasChanged(true);\n }\n\n return response;\n }\n\n public async registerEmail(email: string, isManual = true): Promise<IMapResponse['registerEmail']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n if (!/^\\S+@\\S+\\.\\S+$/.test(email)) {\n return Promise.reject(new Error('Invalid Email format'));\n }\n const {\n hwid: _hwid,\n device_type: _device_type,\n ...requestParams\n } = await this.getRequestParams();\n\n // register user email in pushwoosh\n const response = await this.apiClient.registerEmail({\n ...requestParams,\n email,\n ts_offset: -(new Date()).getTimezoneOffset() * 60,\n });\n\n // set user email to database\n await this.data.setEmail(email);\n\n // set info to database that user email was change\n if (isManual) {\n await this.data.setStatusEmailWasChanged(true);\n }\n\n return response;\n }\n\n public async registerSmsNumber(number: string, isManual = true): Promise<IMapResponse['registerSmsNumber']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n if (!/^\\+?[0-9]+$/.test(number)) {\n return Promise.reject(new Error('Invalid Phone number format: +1234567890'));\n }\n const { application, userId } = await this.getRequestParams();\n\n const response = await this.apiClient.registerDevice({\n application,\n userId,\n hwid: number,\n device_type: 18,\n });\n\n await this.data.setSmsNumber(number);\n\n if (isManual) {\n await this.data.setStatusSmsNumberWasChanged(true);\n }\n\n return response;\n }\n\n public async registerWhatsappNumber(number: string, isManual = true): Promise<IMapResponse['registerWhatsappNumber']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n if (!/^whatsapp:\\+?[0-9]+$/.test(number)) {\n return Promise.reject(new Error('Invalid WhatsApp number format: whatsapp:+1234567890'));\n }\n const { application, userId } = await this.getRequestParams();\n\n const response = await this.apiClient.registerDevice({\n application,\n userId,\n hwid: number,\n device_type: 21,\n });\n\n await this.data.setWhatsAppNumber(number);\n\n if (isManual) {\n await this.data.setStatusWhatsAppNumberWasChanged(true);\n }\n\n return response;\n }\n\n public async postEvent(event: string, attributes: { [key: string]: any }): Promise<IMapResponse['postEvent']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n const params = await this.getRequestParams();\n\n const date = new Date();\n const time = date.getTime();\n const timestampUTC = Math.floor(time / 1000);\n const timestampCurrent = timestampUTC - (date.getTimezoneOffset() / 60 * 3600);\n\n // if post event send after notification open:\n // need add message hash to event\n const lastOpenMessage = await this.data.getLastOpenMessage();\n\n if (lastOpenMessage && lastOpenMessage.expiry > Date.now()) {\n if (attributes['msgHash']) {\n return Promise.reject(new Error('attribute msgHash already defined'));\n }\n\n attributes = {\n ...attributes,\n msgHash: lastOpenMessage.messageHash,\n };\n }\n\n // remove last open message\n await this.data.setLastOpenMessage(undefined);\n\n const response = await this.apiClient.postEvent({\n ...params,\n event,\n timestampUTC,\n timestampCurrent,\n attributes,\n });\n\n if (response && response.code) {\n this.eventBus.dispatchEvent('receive-in-app-code', {\n code: response.code,\n });\n }\n\n return response;\n }\n\n public async getInboxMessages(count: number = 0): Promise<IMapResponse['getInboxMessages']> {\n const params = await this.getRequestParams();\n\n const lastCode = await this.data.getInboxLastRequestCode();\n const lastRequestTime = await this.data.getInboxLastRequestTime();\n\n return this.apiClient.getInboxMessages({\n ...params,\n count,\n last_code: lastCode,\n last_request_time: lastRequestTime,\n });\n }\n\n public async inboxStatus(order: string, status: number): Promise<IMapResponse['inboxStatus']> {\n const params = await this.getRequestParams();\n\n return this.apiClient.inboxStatus({\n ...params,\n inbox_code: order,\n status,\n time: (new Date()).getTime(),\n });\n }\n\n public async pageVisit(config: { title: string; url_path: string; url: string }): Promise<IMapResponse['pageVisit']> {\n const params = await this.getRequestParams();\n const features = await this.data.getFeatures();\n\n const url = features && features.page_visit && features.page_visit.entrypoint;\n\n if (!url) {\n return;\n }\n\n return this.apiClient.pageVisit({\n ...params,\n ...config,\n }, url);\n }\n\n public async setPurchase(attributes: SetPurchaseAttributes): Promise<IMapResponse['setPurchase']> {\n const params = await this.getRequestParams();\n\n return this.apiClient.setPurchase({\n ...params,\n ...attributes,\n });\n }\n\n public async multiRegisterDevice(request: Partial<MultiRegisterDeviceRequest>): Promise<IMapResponse['multiRegisterDevice']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n\n const applicationCode = await this.data.getApplicationCode();\n const deviceModel = await this.data.getDeviceModel();\n const deviceType = await this.data.getDeviceType();\n const language = await this.data.getLanguage();\n const version = await this.data.getSdkVersion();\n const tokens = await this.data.getTokens();\n const hwid = await this.data.getHwid();\n\n const fullRequest: MultiRegisterDeviceRequest = {\n application: applicationCode,\n ...request,\n };\n\n if (request.user_id) {\n fullRequest.user_id = String(request.user_id);\n const currentUserId = await this.data.getUserId();\n if (currentUserId !== fullRequest.user_id) {\n await this.data.setUserId(fullRequest.user_id);\n await this.data.setStatusUserIdWasChanged(true);\n }\n }\n\n if (request.email) {\n if (!/^\\S+@\\S+\\.\\S+$/.test(request.email)) {\n return Promise.reject(new Error('Invalid Email format'));\n }\n const currentEmail = await this.data.getEmail();\n if (currentEmail !== request.email) {\n await this.data.setEmail(request.email);\n await this.data.setStatusEmailWasChanged(true);\n }\n }\n\n if (request.sms_phone_number) {\n if (!/^\\+?[0-9]+$/.test(request.sms_phone_number)) {\n return Promise.reject(new Error('Invalid Phone number format: +1234567890'));\n }\n const currentSmsNumber = await this.data.getSmsNumber();\n if (currentSmsNumber !== request.sms_phone_number) {\n await this.data.setSmsNumber(request.sms_phone_number);\n await this.data.setStatusSmsNumberWasChanged(true);\n }\n }\n\n if (request.whatsapp_phone_number) {\n if (!/^whatsapp:\\+?[0-9]+$/.test(request.whatsapp_phone_number)) {\n return Promise.reject(new Error('Invalid WhatsApp number format: whatsapp:+1234567890'));\n }\n const currentWhatsAppNumber = await this.data.getWhatsAppNumber();\n if (currentWhatsAppNumber !== request.whatsapp_phone_number) {\n await this.data.setWhatsAppNumber(request.whatsapp_phone_number);\n await this.data.setStatusWhatsAppNumberWasChanged(true);\n }\n }\n\n if (fullRequest.language) {\n await this.data.setLanguage(fullRequest.language);\n } else {\n fullRequest.language = language;\n }\n\n if (!fullRequest.timezone) {\n const timezone = -(new Date()).getTimezoneOffset() * 60;\n fullRequest.timezone = String(timezone);\n }\n\n if (!fullRequest.push_devices && tokens.pushToken) {\n const pushDevice: PushDevice = {\n hwid: hwid,\n platform: deviceType as TPlatform,\n push_token: tokens.pushToken,\n sdk_version: version,\n };\n\n if (tokens.publicKey || tokens.authToken || deviceModel) {\n const webPushData: WebPushPlatformData = {};\n if (tokens.publicKey) webPushData.public_key = tokens.publicKey;\n if (tokens.authToken) webPushData.auth_token = tokens.authToken;\n if (deviceModel) webPushData.browser = deviceModel;\n pushDevice.platformData = webPushData;\n }\n\n fullRequest.push_devices = [pushDevice];\n }\n\n const response = await this.apiClient.multiRegisterDevice(fullRequest);\n\n if (fullRequest.push_devices?.length) {\n await this.data.setStatusManualUnsubscribed(false);\n localStorage.setItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS, CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED);\n this.eventBus.dispatchEvent('register', {});\n }\n\n return response;\n }\n\n public async getParams() {\n const applicationCode = await this.data.getApplicationCode();\n const hwid = await this.data.getHwid();\n const apiParams = await this.data.getTokens();\n const initParams = await this.data.getInitParams();\n\n return {\n applicationCode,\n hwid,\n ...apiParams,\n ...initParams,\n };\n }\n\n private async getRequestParams(): Promise<IRequest> {\n const applicationCode = await this.data.getApplicationCode();\n const hwid = await this.data.getHwid();\n const userId = await this.data.getUserId();\n const deviceType = await this.data.getDeviceType();\n const deviceModel = await this.data.getDeviceModel();\n const language = await this.data.getLanguage();\n const version = await this.data.getSdkVersion();\n\n const timezone = -(new Date()).getTimezoneOffset() * 60;\n\n return {\n application: applicationCode,\n hwid: hwid,\n\n userId: userId || hwid,\n device_type: deviceType,\n device_model: deviceModel,\n timezone: timezone,\n language: language,\n v: version,\n };\n };\n}\n","import { type TPlatform, type TPlatformChrome, type TPlatformEdge, type TPlatformFirefox, type TPlatformSafari } from './PlatformChecker.types';\n\nexport class PlatformChecker {\n private readonly global: typeof globalThis;\n\n private readonly _isSafari: boolean;\n private readonly _isOpera: boolean;\n private readonly _isEdge: boolean;\n private readonly _isFirefox: boolean;\n private readonly _isChrome: boolean;\n\n private readonly _isMacOS: boolean;\n\n private readonly _isAvailableServiceWorker: boolean;\n private readonly _isAvailableNotifications: boolean;\n\n /**\n * Browser name + version\n * Example: \"Chrome 70\"\n */\n private readonly _browserVersion: string;\n private readonly _platform: TPlatform;\n\n constructor(global: typeof globalThis) {\n this.global = global;\n\n this._isSafari = this.isSafariBrowser();\n this._isOpera = this.isOperaBrowser();\n this._isEdge = this.isEdgeBrowser();\n this._isFirefox = this.isFirefoxBrowser();\n this._isChrome = this.isChromeBrowser();\n\n this._isMacOS = this.isMacOS();\n\n this._isAvailableServiceWorker = this.canUseServiceWorkers();\n this._isAvailableNotifications = this.canReceiveNotifications();\n\n this._platform = this.getPlatformType();\n this._browserVersion = this.getBrowserVersion();\n }\n\n // Platform flags\n get isEdge() {\n return this._isEdge;\n }\n\n get isSafari() {\n return this._isSafari;\n }\n\n get isOpera() {\n return this._isOpera;\n }\n\n get isAvailableServiceWorker() {\n return this._isAvailableServiceWorker;\n }\n\n get isAvailableNotifications() {\n return this._isAvailableNotifications;\n }\n\n // Platform values\n\n get platform() {\n return this._platform;\n }\n\n get browserVersion() {\n return this._browserVersion;\n }\n\n isSafariBrowser(): boolean {\n return 'safari' in this.global && navigator.userAgent.indexOf('Safari') > -1;\n }\n\n isOperaBrowser(): boolean {\n return navigator.userAgent.indexOf('Opera') !== -1 || navigator.userAgent.indexOf('OPR') !== -1;\n }\n\n isEdgeBrowser(): boolean {\n return navigator.userAgent.indexOf('Edge') > -1;\n }\n\n isFirefoxBrowser(): boolean {\n return navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n }\n\n isChromeBrowser(): boolean {\n return /Chrome/.test(navigator.userAgent)\n && /Google Inc/.test(navigator.vendor)\n && !this._isOpera\n && !this._isEdge;\n }\n\n isMacOS(): boolean {\n return 'platform' in navigator && navigator.platform.toLowerCase().indexOf('mac') !== -1;\n }\n\n canUseServiceWorkers(): boolean {\n return !!navigator.serviceWorker && 'PushManager' in this.global && 'Notification' in this.global;\n }\n\n /**\n * Check availability ServiceWorker or safari browser on macos\n */\n canReceiveNotifications(): boolean {\n return (this._isSafari && this._isMacOS) || (this._isAvailableServiceWorker && !this._isEdge);\n }\n\n /**\n * Get Pushwoosh system platform code\n */\n getPlatformType(): TPlatform {\n let platform: TPlatformChrome = 11;\n\n switch (true) {\n case this._isSafari:\n (<TPlatformSafari>platform) = 10;\n break;\n\n case this._isOpera || this._isChrome:\n (<TPlatformChrome>platform) = 11;\n break;\n\n case this._isFirefox:\n (<TPlatformFirefox>platform) = 12;\n break;\n\n case this._isEdge:\n (<TPlatformEdge>platform) = 150;\n break;\n }\n\n return platform;\n }\n\n /**\n * Get browser name + version from userAgent\n */\n getBrowserVersion(): string {\n const { userAgent } = navigator;\n const matchOperaVersion = userAgent.match(/\\bOPR\\/(\\d+)/);\n if (matchOperaVersion !== null) {\n return `Opera ${matchOperaVersion[1]}`;\n }\n\n const matchEdgeVersion = userAgent.match(/\\bEdge\\/(\\d+)/);\n if (matchEdgeVersion !== null) {\n return `Edge ${matchEdgeVersion[1]}`;\n }\n\n // edge on chromium\n const matchEdgVersion = userAgent.match(/\\bEdg\\/(\\d+)/);\n if (matchEdgVersion !== null) {\n return `Edge ${matchEdgVersion[1]}`;\n }\n\n let match = userAgent.match(/(opera|chrome|safari|firefox(?=\\/))\\/?\\s*(\\d+)/i) || [];\n const [, browser = ''] = match;\n\n match = match[2] ? [browser, match[2]] : [navigator.appName, navigator.appVersion, '-?'];\n const version = userAgent.match(/version\\/([.\\d]+)/i);\n if (version !== null) {\n match.splice(1, 1, version[1]);\n }\n\n return match.join(' ');\n }\n}\n","import {\n type IPushServiceDefaultConfig,\n} from './PushServiceDefault.types';\nimport * as CONSTANTS from '../../../../core/constants';\nimport { v4 } from '../../../../core/functions';\nimport { Logger } from '../../../../core/logger';\nimport { type Api } from '../../../../modules/Api/Api';\nimport { type Data } from '../../../../modules/Data/Data';\nimport {\n type IPushService,\n type IPushServiceSubscriptionKeys,\n} from '../../PushService.types';\n\nexport class PushServiceDefault implements IPushService {\n private readonly api: Api;\n private readonly data: Data;\n private readonly config: IPushServiceDefaultConfig;\n private registration?: ServiceWorkerRegistration;\n\n constructor(api: Api, data: Data, config: IPushServiceDefaultConfig) {\n this.api = api;\n this.data = data;\n this.config = config;\n }\n\n public getPermission(): NotificationPermission {\n return Notification.permission;\n }\n\n public checkIsPermissionGranted(): boolean {\n return this.getPermission() === CONSTANTS.PERMISSION_GRANTED;\n }\n\n public checkIsPermissionDefault(): boolean {\n return this.getPermission() === CONSTANTS.PERMISSION_PROMPT;\n }\n\n public async checkIsManualUnsubscribed(): Promise<boolean> {\n return this.data.getStatusManualUnsubscribed();\n }\n\n public async askPermission(): Promise<void> {\n await Notification.requestPermission();\n }\n\n public async getTokens(): Promise<IPushServiceSubscriptionKeys> {\n return this.data.getTokens();\n }\n\n public async subscribe(subscription?: PushSubscription): Promise<void> {\n const currentSubscription = subscription || await this.trySubscribe();\n const isPermissionGranted = this.checkIsPermissionGranted();\n\n if (!isPermissionGranted) {\n Logger.error('You must have permission granted before subscribe!');\n\n return;\n }\n\n const pushToken = this.getPushToken(currentSubscription);\n const _p256dn = currentSubscription.getKey('p256dh');\n const _auth = currentSubscription.getKey('auth');\n\n if (!_p256dn || !_auth) {\n throw new Error('Can\\'t get subscription keys!');\n }\n\n const p256dh = btoa(String.fromCharCode.apply(String, new Uint8Array(_p256dn))); // eslint-disable-line prefer-spread\n const auth = btoa(String.fromCharCode.apply(String, new Uint8Array(_auth))); // eslint-disable-line prefer-spread\n\n await this.data.setTokens({\n publicKey: p256dh,\n pushToken: pushToken,\n authToken: auth,\n endpoint: currentSubscription.endpoint,\n });\n\n // register device into pushwoosh\n await this.api.registerDevice();\n }\n\n public async unsubscribe(): Promise<void> {\n // get service worker registration\n const registration = await this.getServiceWorkerRegistration();\n\n // get current subscription\n const subscription = await registration.pushManager.getSubscription();\n\n // remove tokens\n await this.data.setTokens({});\n\n // set info to database, that the device IS manual unsubscribed\n await this.data.setStatusManualUnsubscribed(true);\n\n // unregister device in pushwoosh\n await this.api.unregisterDevice();\n\n if (!subscription) {\n return;\n }\n\n // remove subscription\n await subscription.unsubscribe();\n }\n\n public async checkIsRegister(): Promise<boolean> {\n return this.api.checkDeviceSubscribeForPushNotifications();\n }\n\n public async checkIsNeedResubscribe(): Promise<boolean> {\n // check change permission status\n const lastPermission = await this.data.getLastPermissionStatus();\n const permission = this.getPermission();\n\n if (lastPermission !== permission) {\n await this.data.setLastPermissionStatus(permission);\n\n return true;\n }\n\n // check if pushTokens not equal from pushSubscription and store\n const credentials = await this.getCredentials();\n const pushTokenFromSubscription = this.getPushToken(credentials);\n\n const subscriptionTokensFromStore = await this.data.getTokens();\n const pushTokenFromStore = subscriptionTokensFromStore && subscriptionTokensFromStore.pushToken || '';\n\n const isEqualPushTokens = pushTokenFromSubscription === pushTokenFromStore;\n\n const isVapidChanged = await this.data.getIsVapidChanged();\n\n return !isEqualPushTokens || isVapidChanged;\n }\n\n private async getServiceWorkerRegistration(): Promise<ServiceWorkerRegistration> {\n if (!this.registration) {\n await this.registerServiceWorker();\n\n const url = await this.data.getServiceWorkerUrl();\n this.registration = await navigator.serviceWorker.getRegistration(url);\n\n await (this.registration as ServiceWorkerRegistration).update();\n }\n\n if (!this.registration) {\n throw new Error(`Internal Error: Can't register service worker!`);\n }\n\n return this.registration;\n }\n\n private async registerServiceWorker(): Promise<void> {\n const url = await this.data.getServiceWorkerUrl();\n const scope = await this.data.getServiceWorkerScope();\n const sdkVersion = await this.data.getSdkVersion();\n const serviceWorkerVersion = await this.data.getServiceWorkerVersion();\n\n // add clean cache get parameter only if\n // sdk version and service worker version is not equals\n let cleanCache = '';\n\n if (sdkVersion !== serviceWorkerVersion) {\n cleanCache = `?cache_clean=${v4()}`;\n }\n\n await navigator\n .serviceWorker\n .register(`${url}${cleanCache}`, {\n scope,\n });\n }\n\n private async trySubscribe(): Promise<PushSubscription> {\n try {\n return await this.subscribePushManager();\n } catch (error) {\n console.error(error);\n // if get subscription filed\n // try unsubscribe and resubscribe again\n // it may be if changed vapid or sender id\n await this.unsubscribe();\n return this.subscribePushManager();\n }\n }\n\n private async subscribePushManager(): Promise<PushSubscription> {\n // get service worker registration\n const registration = await this.getServiceWorkerRegistration();\n const applicationServerKey = await this.getApplicationServerKey();\n\n return registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: applicationServerKey ? this.urlBase64ToUint8Array(applicationServerKey) as BufferSource : null,\n });\n }\n\n private async getCredentials(): Promise<PushSubscription | null> {\n const registration = await this.getServiceWorkerRegistration();\n return await registration.pushManager.getSubscription();\n }\n\n private getPushToken(subscription: PushSubscription | null): string {\n if (!subscription) {\n return '';\n }\n\n return subscription.endpoint;\n }\n\n private async getApplicationServerKey(): Promise<string | undefined> {\n return await this.data.getApplicationServerKey();\n }\n\n private urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n }\n}\n","import { type IPushServiceSafariConfig } from './PushServiceSafari.types';\nimport * as CONSTANTS from '../../../../core/constants';\nimport { Logger } from '../../../../core/logger';\nimport { type Api } from '../../../../modules/Api/Api';\nimport { type Data } from '../../../../modules/Data/Data';\nimport {\n type IPushService,\n type IPushServiceSubscriptionKeys,\n} from '../../PushService.types';\n\nexport class PushServiceSafari implements IPushService {\n private readonly api: Api;\n private readonly data: Data;\n private readonly config: IPushServiceSafariConfig;\n\n constructor(\n api: Api,\n data: Data,\n config: IPushServiceSafariConfig,\n ) {\n this.api = api;\n this.config = config;\n this.data = data;\n }\n\n public getPermission(): NotificationPermission {\n const { permission } = this.getPermissionInfo();\n\n return permission;\n }\n\n public checkIsPermissionGranted(): boolean {\n return this.getPermission() === CONSTANTS.PERMISSION_GRANTED;\n }\n\n public checkIsPermissionDefault(): boolean {\n return this.getPermission() === CONSTANTS.PERMISSION_PROMPT;\n }\n\n public async checkIsManualUnsubscribed(): Promise<boolean> {\n return await this.data.getStatusManualUnsubscribed();\n }\n\n public async askPermission(): Promise<void> {\n const application = await this.data.getApplicationCode();\n const hwid = await this.data.getHwid();\n const payload = {\n application,\n hwid,\n };\n\n return new Promise((resolve) => {\n // safari send payload by apns to entrypoint 'https://cp.pushwoosh.com/json/1.3/safari'\n // and then take push token to browser\n safari.pushNotification.requestPermission(\n this.config.entrypoint || 'https://cp.pushwoosh.com/json/1.3/safari',\n this.config.webSitePushId,\n payload,\n () => resolve(),\n );\n });\n }\n\n public getTokens(): Promise<IPushServiceSubscriptionKeys> {\n return this.data.getTokens();\n }\n\n public async subscribe(): Promise<void> {\n const isPermissionGranted = this.checkIsPermissionGranted();\n\n if (!isPermissionGranted) {\n Logger.error('You must have permission granted before subscribe!');\n\n return;\n }\n\n const { deviceToken } = this.getPermissionInfo();\n\n await this.data.setTokens({\n pushToken: deviceToken,\n });\n\n await this.api.registerDevice();\n }\n\n public async unsubscribe(): Promise<void> {\n // remove tokens\n await this.data.setTokens({});\n\n // set info to database, that the device IS manual unsubscribed\n await this.data.setStatusManualUnsubscribed(true);\n\n // unregister device in pushwoosh\n await this.api.unregisterDevice();\n }\n\n public async checkIsRegister(): Promise<boolean> {\n return this.api.checkDeviceSubscribeForPushNotifications();\n }\n\n public async checkIsNeedResubscribe(): Promise<boolean> {\n // check web site id\n const savedWebSitePushId = await this.data.getWebSitePushId();\n const isExistSavedWebSitePushId = typeof savedWebSitePushId !== 'undefined';\n const isChangeWebSitePushId = isExistSavedWebSitePushId && this.config.webSitePushId !== savedWebSitePushId;\n\n await this.data.setWebSitePushId(this.config.webSitePushId);\n\n // check change permission status\n const lastPermission = await this.data.getLastPermissionStatus();\n const permission = this.getPermission();\n\n if (lastPermission !== permission) {\n await this.data.setLastPermissionStatus(permission);\n\n return true;\n }\n\n return isChangeWebSitePushId;\n }\n\n private getPermissionInfo(): IPushServiceSafariInfo {\n return safari.pushNotification.permission(this.config.webSitePushId);\n }\n}\n","import * as CONSTANTS from './constants';\nimport { defaultInitParams } from './defaultInitParams';\nimport { type EventHandlerMap, type EventName } from './events.types';\nimport { getGlobal, getVersion, isFunction, v4 } from './functions';\nimport { legacyEventsMap } from './legacyEventsMap';\nimport { Logger } from './logger';\nimport { EventBus } from './modules/EventBus';\nimport { type IInitParams, type PWInput } from './Pushwoosh.types';\nimport { keyValue, log as logStorage, message as messageStorage } from './storage';\nimport InboxMessagesModel from '../models/InboxMessages';\nimport { Api } from '../modules/Api/Api';\nimport { ApiClient } from '../modules/ApiClient/ApiClient';\nimport { Data } from '../modules/Data/Data';\nimport InboxMessagesPublic from '../modules/InboxMessagesPublic';\nimport { PlatformChecker } from '../modules/PlatformChecker';\nimport { PushServiceDefault, PushServiceSafari } from '../services/PushService/PushService';\nimport { type IPushService } from '../services/PushService/PushService.types';\n\nexport class Pushwoosh {\n public ready: boolean = false;\n\n public initParams: IInitParams;\n\n private readonly eventBus: EventBus;\n\n public readonly data: Data;\n private readonly apiClient: ApiClient;\n private isCommunicationDisabled?: boolean;\n public readonly api: Api;\n public driver: IPushService;\n public platformChecker: PlatformChecker;\n\n // Inbox messages public interface\n public pwinbox: InboxMessagesPublic;\n private inboxModel: InboxMessagesModel;\n\n public moduleRegistry: Record<string, any> = {};\n\n constructor() {\n this.eventBus = new EventBus();\n\n this.data = new Data();\n this.apiClient = new ApiClient(this.data);\n\n this.api = new Api(this.eventBus, this.data, this.apiClient, () => this.isCommunicationDisabled);\n\n this.platformChecker = new PlatformChecker(getGlobal());\n this.inboxModel = new InboxMessagesModel(this.eventBus, this.data, this.api);\n this.pwinbox = new InboxMessagesPublic(this.data, this.api, this.inboxModel);\n }\n\n /**\n * Add Web SDK Event Handler.\n * Alias to addEventHandler method of EventBus module.\n *\n * @public\n * @readonly\n *\n * @param {string} name - name of Web SDK event.\n * @param {function} handler - handler of Web SDK event.\n *\n * @returns {void}\n */\n public addEventHandler = <Name extends EventName>(\n name: Name,\n handler: EventHandlerMap[Name],\n ): void => this.eventBus.addEventHandler(name, handler);\n\n /**\n * Remove Web SDK Event Handler.\n * Alias to removeEventHandler method of EventBus module.\n *\n * @public\n * @readonly\n *\n * @param {string} name - name of Web SDK event.\n * @param {function} handler - handler of Web SDK event.\n *\n * @returns {void}\n */\n public removeEventHandler = <Name extends EventName>(\n name: Name,\n handler: EventHandlerMap[Name],\n ): void => this.eventBus.removeEventHandler(name, handler);\n\n /**\n * Dispatch Web SDK Event.\n * Alias to dispatchEvent method of EventBus module.\n *\n * @public\n * @readonly\n *\n * @param {string} name - name of Web SDK event.\n * @param {object} payload - event payload.\n *\n * @returns {string} - event id.\n */\n public dispatchEvent = <Name extends EventName>(\n name: Name,\n payload: Omit<Parameters<EventHandlerMap[Name]>[0], 'eventId'> & { eventId?: string },\n ): string => this.eventBus.dispatchEvent(name, payload);\n\n /**\n * Method that puts the stored error/info messages to browser console.\n * @type {{showLog: (() => Promise<any>); showKeyValues: (() => Promise<any>); showMessages: (() => Promise<any>)}}\n */\n public debug = {\n async showLog() {\n const items = await logStorage.getAll();\n console.log(items);\n },\n async showKeyValues() {\n const items = await keyValue.getAll();\n console.log(items);\n },\n async showMessages() {\n const items = await messageStorage.getAll();\n items.forEach((i: any) => console.log(i));\n },\n };\n\n /**\n * Polymorph PW method.\n * Can get array in format [string, params | callback] or function.\n *\n * // with callback:\n * Pushwoosh.push(['onNotificationClick', function(api, payload) {\n * // click on the notificationn\n * }]);\n *\n * // with function:\n * Pushwoosh.push(function(api) {\n * // this is a bit easier way to subscribe to onReady\n * });\n *\n * // with params:\n * // initiates Pushwoosh service and notification subscription\n * Pushwoosh.push(['init', {\n * applicationCode: 'XXXXX-XXXXX',\n * // see more about params in documentation\n * // https://docs.pushwoosh.com/docs/web-push-sdk-30#section-integration\n * }]);\n *\n * @param command\n */\n public push(command: PWInput) {\n if (isFunction(command)) {\n this.subscribeToLegacyEvents(CONSTANTS.LEGACY_EVENT_ON_READY, command);\n return;\n }\n\n if (!Array.isArray(command)) {\n throw new Error('Invalid command!');\n }\n\n if (command[0] === 'init') {\n this.initialize(command[1]).catch((err) => {\n console.error('Pushwoosh: Error during initialization', err);\n });\n } else if (!this.subscribeToLegacyEvents(command[0], command[1])) {\n console.log('Pushwoosh: Unknown command', command);\n throw new Error('Unknown command!');\n }\n }\n\n /**\n * Method initializes the permission dialog on the device\n * and registers through the API in case the device hasn't been registered before.\n * @returns {Promise<void>}\n */\n public async subscribe(isForceSubscribe = true): Promise<void> {\n if (this.isCommunicationDisabled) {\n throw new Error('Communication is disabled!');\n }\n\n const isPermissionDefault = this.driver.checkIsPermissionDefault();\n\n // if permission granted need ask permission for send notifications\n if (isPermissionDefault) {\n // emit event when permission dialog show\n this.eventBus.dispatchEvent('show-notification-permission-dialog', {});\n // all action before this MUST be a synchrony because\n // in new release in ff 72 we must call this event by user\n // ask permission\n // ask permissions only show prompt window, not register device for send push notifications\n await this.driver.askPermission();\n\n const permission = this.driver.getPermission();\n\n // emit event when permission dialog hide with permission state\n this.eventBus.dispatchEvent('hide-notification-permission-dialog', { permission });\n }\n\n const permission = this.driver.getPermission();\n const isManualUnsubscribed = await this.data.getStatusManualUnsubscribed();\n const isDeviceRegister = await this.api.checkDeviceSubscribeForPushNotifications(false);\n\n // if permission granted emit event and register device into pushwoosh\n if (permission === CONSTANTS.PERMISSION_GRANTED) {\n this.eventBus.dispatchEvent('permission-granted', {});\n const needSubscribe = !isDeviceRegister && !isManualUnsubscribed;\n\n if (needSubscribe || isForceSubscribe) {\n await this.driver.subscribe();\n }\n\n this.eventBus.dispatchEvent('subscribe', {});\n\n return;\n }\n\n // if permission denied emit event\n if (permission === CONSTANTS.PERMISSION_DENIED) {\n this.eventBus.dispatchEvent('permission-denied', {});\n\n if (isDeviceRegister) {\n await this.driver.unsubscribe();\n }\n\n return;\n }\n }\n\n /**\n * Unsubscribe device.\n * @returns {Promise<void>}\n */\n public async unsubscribe(): Promise<void> {\n try {\n await this.driver.unsubscribe();\n } catch (error) {\n Logger.error(error, 'Error occurred during the unsubscribe');\n throw error;\n }\n }\n\n /**\n * force subscribe if there was a manual unsubscribe\n * @returns {Promise<void>}\n */\n public async forceSubscribe(): Promise<void> {\n await this.subscribe(true);\n }\n\n /**\n * Check device's registration status\n * @returns {boolean}\n */\n public isDeviceRegistered(): boolean {\n return localStorage.getItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS) === CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED;\n }\n\n public isDeviceUnregistered(): boolean {\n return localStorage.getItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS) === CONSTANTS.DEVICE_REGISTRATION_STATUS_UNREGISTERED;\n }\n\n /**\n * Check device's subscription status\n * @returns {Promise<boolean>}\n */\n public async isSubscribed(): Promise<boolean> {\n return this.api.checkDeviceSubscribeForPushNotifications();\n }\n\n /**\n * Check current communication state\n * @returns {Promise<boolean>}\n */\n public async isCommunicationEnabled(): Promise<boolean> {\n const isCommunicationDisabled = await this.data.getStatusCommunicationDisabled();\n\n return !isCommunicationDisabled;\n }\n\n /**\n * Send \"GDPRConsent\" postEvent and depends on param \"isEnabled\"\n * device will be registered/unregistered from all communication channels.\n * @param {boolean} isEnabled\n * @returns {Promise<void>}\n */\n public async setCommunicationEnabled(isEnabled: boolean = true): Promise<void> {\n await this.data.setCommunicationEnabled(isEnabled);\n\n if (isEnabled) {\n this.isCommunicationDisabled = false;\n await this.data.setStatusDropAllData(false);\n await this.finishInit();\n const isPermissionGranted = this.driver.checkIsPermissionGranted();\n if (isPermissionGranted) {\n await this.api.registerDevice();\n await this.sendData();\n }\n } else {\n await this.api.unregisterDevice();\n }\n\n this.eventBus.dispatchEvent('change-enabled-communication', { isEnabled });\n\n const deviceType = await this.data.getDeviceType();\n await this.api.postEvent(CONSTANTS.EVENT_GDPR_CONSENT, {\n channel: isEnabled,\n device_type: deviceType,\n });\n }\n\n /**\n * Send \"GDPRDelete\" postEvent and remove all device device data from Pushwoosh.\n * @returns {Promise<void>}\n */\n public async removeAllDeviceData(): Promise<void> {\n const deviceType = await this.data.getDeviceType();\n\n await this.api.postEvent(CONSTANTS.EVENT_GDPR_DELETE, {\n status: true,\n device_type: deviceType,\n });\n\n await this.api.deleteDevice();\n await this.data.clearAll();\n\n await this.data.setStatusDropAllData(true);\n }\n\n /**\n * Method returns hardware id.\n * @returns {Promise<string>}\n */\n public async getHWID(): Promise<string> {\n return await this.data.getHwid();\n }\n\n /**\n * Method returns push token.\n * @returns {Promise<string>}\n */\n public async getPushToken(): Promise<string | undefined> {\n const { pushToken } = await this.data.getTokens();\n\n return pushToken;\n }\n\n /**\n * Method returns userId\n * @returns {Promise<string | null>}\n */\n public async getUserId(): Promise<string | undefined> {\n return await this.data.getUserId();\n }\n\n /**\n * Method returns an object with all params.\n */\n public async getParams(): Promise<IInitParams> {\n return await this.api.getParams();\n }\n\n /**\n * Method returns true if notifications available.\n * @returns {boolean}\n */\n public isAvailableNotifications(): boolean {\n return this.platformChecker.isAvailableNotifications;\n }\n\n public async sendStatisticsVisitedPage() {\n const {\n document: { title },\n location: { origin, pathname, href },\n } = window;\n\n await this.api.pageVisit({\n title,\n url_path: `${origin}${pathname}`,\n url: href,\n });\n }\n\n private async initialize(params: IInitParams) {\n this.initParams = {\n ...defaultInitParams,\n ...params,\n };\n // base logger configuration\n const manualDebug = localStorage.getItem(CONSTANTS.MANUAL_SET_LOGGER_LEVEL);\n Logger.setLevel(manualDebug || params.logLevel || 'error');\n\n // if not available push notifications -> exit\n if (!this.isAvailableNotifications()) {\n return;\n }\n\n if (!params.applicationCode) {\n throw new Error('Can\\'t find application code!');\n }\n\n // check communication disabled\n const initDisabled = params.communicationEnabled === false;\n const storedCommunicationEnabled = await this.data.getCommunicationEnabled();\n const storedOldCommunicationDisabled = await this.data.getStatusCommunicationDisabled();\n\n if (\n (initDisabled && storedCommunicationEnabled !== true)\n || storedCommunicationEnabled === false\n || storedOldCommunicationDisabled\n ) {\n this.isCommunicationDisabled = true;\n }\n\n // get current application code\n const currentApplicationCode = await this.data.getApplicationCode();\n const isUserIdChanged = await this.isUserIdChanged();\n const isApplicationCodeChanged = !currentApplicationCode || currentApplicationCode !== params.applicationCode;\n\n // if there is no previous application code or the application code has changed or user is has changed => remove all info about init params and subscription\n if (isApplicationCodeChanged || isUserIdChanged) {\n await this.data.setHwid('');\n await this.data.setUserId();\n await this.data.setEmail();\n }\n\n await this.data.setApplicationCode(params.applicationCode);\n\n // add info about platform\n await this.data.setDeviceType(this.platformChecker.getPlatformType());\n await this.data.setDeviceModel(this.platformChecker.getBrowserVersion());\n await this.data.setLanguage(params.tags?.Language || navigator.language);\n\n // set configuration info\n await this.data.setApiEntrypoint(params.pushwooshUrl || '');\n await this.data.setApiToken(params.apiToken || '');\n await this.data.setSdkVersion(getVersion());\n\n if (!this.isCommunicationDisabled) {\n await this.finishInit();\n\n // init submodules (inbox)\n try {\n await this.inboxModel.updateMessages();\n } catch (error) {\n Logger.write('error', error);\n }\n\n const delayedEvent = await this.data.getDelayedEvent();\n\n if (delayedEvent) {\n const { type, payload } = delayedEvent;\n this.emitLegacyEventsFromServiceWorker(type, payload);\n await this.data.setDelayedEvent(null);\n }\n\n // send push stat only in safari, because safari hasn't service worker\n // in other browsers stat will be sent in service worker\n if (this.platformChecker.isSafari) {\n const hashReg = /#P(.*)/;\n const hash = decodeURIComponent(document.location.hash);\n\n if (hashReg.test(hash)) {\n this.api\n .pushStat(hashReg.exec(hash)![1])\n .then(() => history.pushState(null, '', '#'));\n }\n }\n } else {\n this.eventBus.dispatchEvent('communication-disabled', {});\n }\n }\n\n private async finishInit(): Promise<void> {\n await this.ensureHwid();\n\n await this.loadConfig();\n\n await this.open();\n\n await this.sendData();\n\n // init push notification\n const applicationServerKey = await this.data.getApplicationServerKey();\n if (applicationServerKey) {\n await this.initPushNotifications(this.initParams);\n } else {\n Logger.error('Pushwoosh: No vapid key found! Please, check your application settings in Pushwoosh dashboard.');\n }\n\n // ready\n this.ready = true;\n this.eventBus.dispatchEvent('ready', {});\n\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.onmessage = (event: MessageEvent) => this.onServiceWorkerMessage(event);\n }\n\n localStorage.setItem('pushwoosh-websdk-status', 'init');\n\n // Dispatch 'pushwoosh.initialized' event\n document.dispatchEvent(new CustomEvent('pushwoosh.initialized', {\n detail: {\n pw: this,\n },\n }));\n }\n\n private async ensureHwid(reinit: boolean = false): Promise<void> {\n const hwid = await this.data.getHwid();\n if (!hwid || reinit) {\n await this.data.setHwid(this.initParams.applicationCode + '_' + v4());\n }\n }\n\n private async isUserIdChanged(): Promise<boolean> {\n const { userId } = this.initParams;\n const storedUserId = await this.data.getUserId();\n const userIdWasChanged = await this.data.getStatusUserIdWasChanged();\n\n return !!userId && userId !== 'user_id' && userId !== storedUserId && !userIdWasChanged;\n }\n\n /**\n * Default process during PW initialization.\n * Init API. Subscription to notifications.\n * Emit delayed events.\n */\n private async defaultProcess(): Promise<void> {\n const permission = this.driver.getPermission();\n\n if (permission === 'granted') {\n await this.data.setLastPermissionStatus(permission);\n }\n\n const isCommunicationDisabled = await this.data.getStatusCommunicationDisabled();\n const isDropAllData = await this.data.getStatusDropAllData();\n const isNeedResubscribe = await this.driver.checkIsNeedResubscribe();\n\n if (isCommunicationDisabled || isDropAllData) {\n await this.unsubscribe();\n\n return;\n }\n\n if (isNeedResubscribe) {\n await this.unsubscribe();\n await this.data.setStatusManualUnsubscribed(false);\n await this.data.setIsVapidChanged(false);\n }\n\n const isManualUnsubscribed = await this.data.getStatusManualUnsubscribed();\n\n // update status is register\n const isRegister = await this.api.checkDeviceSubscribeForPushNotifications(false);\n\n // Actions depending of the permissions\n switch (permission) {\n case CONSTANTS.PERMISSION_PROMPT:\n {\n // emit event permission default\n this.eventBus.dispatchEvent('permission-default', {});\n\n // device can't be register if permission default\n if (isRegister) {\n await this.unsubscribe();\n }\n\n break;\n }\n\n case CONSTANTS.PERMISSION_DENIED:\n // emit event permission denied\n this.eventBus.dispatchEvent('permission-denied', {});\n\n // device can't be register if permission default\n if (isRegister) {\n await this.unsubscribe();\n }\n\n break;\n case CONSTANTS.PERMISSION_GRANTED:\n // emit event permission granted\n this.eventBus.dispatchEvent('permission-granted', {});\n\n // device can't be register if manual unsubscribed\n if (isManualUnsubscribed && isRegister) {\n await this.unsubscribe();\n }\n\n // device must be register if not manual unsubscribed\n // or if change configuration -> resubscribe device for get new push token\n if (!isRegister && !isManualUnsubscribed || isNeedResubscribe) {\n await this.subscribe(true);\n }\n\n break;\n }\n }\n\n /**\n *\n * @param {MessageEvent} event\n */\n private onServiceWorkerMessage(event: MessageEvent) {\n const { data = {} } = event || {};\n const { type = '', payload = {} } = data || {};\n this.emitLegacyEventsFromServiceWorker(type, payload);\n }\n\n /**\n * Check device's session and call the appOpen method,\n * no more than once an hour.\n * Force need to Safari await subscribe status\n * @param {boolean} isForce\n * @returns {Promise<void>}\n */\n private async open(isForce?: boolean): Promise<void> {\n let lastApplicationOpenTime = await this.data.getLastOpenApplicationTime();\n const currentTime = Date.now();\n\n if (!lastApplicationOpenTime) {\n lastApplicationOpenTime = 0;\n }\n\n const isSendingPeriodExceeded = currentTime - lastApplicationOpenTime < CONSTANTS.PERIOD_SEND_APP_OPEN;\n const needSendOpenStatistics = isForce || !isSendingPeriodExceeded;\n\n if (!needSendOpenStatistics) {\n return;\n }\n\n await this.data.setLastOpenApplicationTime(currentTime);\n await this.api.applicationOpen();\n }\n\n private async sendData() {\n const params = this.initParams;\n\n // check user id\n const storedUserId = await this.data.getUserId();\n\n if (params.userId && params.userId !== 'user_id' && params.userId !== storedUserId) {\n await this.api.registerUser(params.userId, false);\n }\n\n const tasks: { test: () => Promise<boolean>; task: () => Promise<void> }[] = [\n {\n test: async () => {\n if (await this.data.getStatusEmailWasChanged()) {\n return false;\n }\n const storedEmail = await this.data.getEmail();\n return !!params.email && params.email !== storedEmail;\n },\n task: async () => {\n await this.api.registerEmail(params.email!, false);\n },\n },\n {\n test: async () => {\n if (await this.data.getStatusSmsNumberWasChanged()) {\n return false;\n }\n const storedSmsNumber = await this.data.getSmsNumber();\n return !!params.smsNumber && params.smsNumber !== storedSmsNumber;\n },\n task: async () => {\n await this.api.registerSmsNumber(params.smsNumber!, false);\n },\n },\n {\n test: async () => {\n if (await this.data.getStatusWhatsAppNumberWasChanged()) {\n return false;\n }\n const storedWhatsAppNumber = await this.data.getWhatsAppNumber();\n return !!params.whatsAppNumber && params.whatsAppNumber !== storedWhatsAppNumber;\n },\n task: async () => {\n await this.api.registerWhatsappNumber(params.whatsAppNumber!, false);\n },\n },\n {\n test: async () => {\n return !!params.tags;\n },\n task: async () => {\n await this.api.setTags(params.tags!);\n },\n },\n ];\n await Promise.all(tasks.map(async (worker) => {\n try {\n if (await worker.test()) {\n await worker.task();\n }\n } catch (err) {\n console.error('Pushwoosh: Error during data registration', err);\n }\n }));\n }\n\n private async loadConfig() {\n const config = await this.api.getConfig([\n 'page_visit',\n 'vapid_key',\n 'web_in_apps',\n 'events',\n 'subscription_prompt',\n ]);\n const features = config && config.features;\n await this.data.setFeatures(features);\n\n if (features) {\n // page visited feature\n if (features.page_visit && features.page_visit.enabled) {\n await keyValue.set(CONSTANTS.PAGE_VISITED_URL, features.page_visit.entrypoint);\n this.sendStatisticsVisitedPage();\n }\n\n // send default event, page visited\n if (features.events && features.events.length) {\n const isPageVisitedEvent = features.events.some(\n (event: string): boolean => event === CONSTANTS.EVENT_PW_SITE_OPENED,\n );\n if (isPageVisitedEvent) {\n this.sendPostEventVisitedPage();\n }\n }\n\n // vapid key\n if (features.vapid_key) {\n const previousServerKey = await this.data.getApplicationServerKey();\n\n await this.data.setApplicationServerKey(features.vapid_key);\n if (previousServerKey !== features.vapid_key) {\n await this.data.setIsVapidChanged(true);\n }\n }\n }\n }\n\n private async initPushNotifications(params: IInitParams): Promise<void> {\n await this.data.setDefaultNotificationImage(params.defaultNotificationImage);\n await this.data.setDefaultNotificationTitle(params.defaultNotificationTitle);\n await this.data.setServiceWorkerUrl(params.serviceWorkerUrl);\n await this.data.setServiceWorkerScope(params.scope);\n\n await this.data.setInitParams(params);\n\n await this.initDriver();\n\n // Default actions on init\n try {\n await this.defaultProcess();\n } catch (error) {\n Logger.error(error, 'Internal error: defaultProcess fail');\n }\n }\n\n private async initDriver(): Promise<void> {\n if (this.platformChecker.isSafari) {\n const { safariWebsitePushID: webSitePushId } = await this.data.getInitParams();\n\n if (!webSitePushId) {\n Logger.info('For work with Safari Push Notification add safariWebsitePushID to initParams!');\n return;\n }\n\n this.driver = new PushServiceSafari(this.api, this.data, { webSitePushId });\n\n return;\n }\n\n Logger.info({\n isAvailableServiceWorker: this.platformChecker.isAvailableServiceWorker,\n });\n\n if (this.platformChecker.isAvailableServiceWorker) {\n this.driver = new PushServiceDefault(this.api, this.data, {});\n }\n }\n\n public sendPostEventVisitedPage() {\n const {\n document: { title },\n location: { href },\n } = window;\n\n this.api.postEvent(CONSTANTS.EVENT_PW_SITE_OPENED, {\n url: href,\n title: title,\n device_type: this.platformChecker.platform,\n });\n }\n\n /**\n * @private\n *\n * @param {string} type - legacy event type\n * @param {function} handler - legacy handler\n */\n private subscribeToLegacyEvents(type: string, handler: (api?: Api, payload?: any) => void): boolean {\n let isHandled = true;\n\n switch (true) {\n case type === CONSTANTS.LEGACY_EVENT_ON_LOAD:\n handler();\n break;\n\n case type === CONSTANTS.LEGACY_EVENT_ON_READY:\n if (this.ready) {\n handler(this.api);\n break;\n }\n\n this.eventBus.addEventHandler(\n 'ready',\n () => handler(this.api),\n );\n break;\n\n case type in legacyEventsMap:\n this.eventBus.addEventHandler(\n legacyEventsMap[type].name as keyof EventHandlerMap,\n (payload: any) => {\n const { prop } = legacyEventsMap[type];\n handler(this.api, prop ? payload[prop] : undefined);\n },\n );\n break;\n\n default:\n isHandled = false;\n }\n\n return isHandled;\n }\n\n private emitLegacyEventsFromServiceWorker(type: string, payload?: any): void {\n switch (type) {\n case CONSTANTS.LEGACY_EVENT_ON_PUSH_DELIVERY:\n this.eventBus.dispatchEvent('receive-push', { notification: payload });\n break;\n\n case CONSTANTS.LEGACY_EVENT_ON_NOTIFICATION_CLICK:\n this.eventBus.dispatchEvent('open-notification', { notification: payload });\n break;\n\n case CONSTANTS.LEGACY_EVENT_ON_NOTIFICATION_CLOSE:\n this.eventBus.dispatchEvent('hide-notification', { notification: payload });\n break;\n\n case CONSTANTS.LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE:\n this.eventBus.dispatchEvent('receive-inbox-message', { message: payload });\n break;\n }\n }\n}\n"],"names":["root","factory","exports","module","define","amd","a","i","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","DEFAULT_SERVICE_WORKER_URL","KEY_DEVICE_REGISTRATION_STATUS","DEVICE_REGISTRATION_STATUS_REGISTERED","DEVICE_REGISTRATION_STATUS_UNREGISTERED","PERMISSION_DENIED","PERMISSION_GRANTED","PERMISSION_PROMPT","LEGACY_EVENT_ON_READY","LEGACY_EVENT_ON_SUBSCRIBE","LEGACY_EVENT_ON_UNSUBSCRIBE","LEGACY_EVENT_ON_REGISTER","LEGACY_EVENT_ON_PERMISSION_PROMPT","LEGACY_EVENT_ON_PERMISSION_DENIED","LEGACY_EVENT_ON_PERMISSION_GRANTED","LEGACY_EVENT_ON_SW_INIT_ERROR","LEGACY_EVENT_ON_PUSH_DELIVERY","LEGACY_EVENT_ON_NOTIFICATION_CLICK","LEGACY_EVENT_ON_NOTIFICATION_CLOSE","LEGACY_EVENT_ON_CHANGE_COMMUNICATION_ENABLED","LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE","LEGACY_EVENT_ON_UPDATE_INBOX_MESSAGES","LEGACY_EVENT_ON_SHOW_NOTIFICATION_PERMISSION_DIALOG","LEGACY_EVENT_ON_HIDE_NOTIFICATION_PERMISSION_DIALOG","LEGACY_EVENT_ON_SHOW_SUBSCRIPTION_WIDGET","LEGACY_EVENT_ON_HIDE_SUBSCRIPTION_WIDGET","EVENT_PW_SITE_OPENED","defaultInitParams","autoSubscribe","serviceWorkerUrl","getGlobal","globalThis","v4","crypto","randomUUID","replace","c","r","Math","random","toString","isFunction","legacyEventsMap","name","STORE_NAME_KEY_VALUE","STORE_NAME_MESSAGE_LOG","STORE_NAME_MAIN_LOG","STORE_NAME_INBOX_MESSAGES","storeCreatorDecorator","storeCreator","database","objectStoreNames","contains","statusIndex","store","createObjectStore","keyPath","autoIncrement","createIndex","unique","multiEntry","logStore","DateModule","constructor","date","Date","_date","getUtcTimestamp","floor","getTime","getTimezoneOffset","getTimestamp","round","setLocal","newDateTimestamp","addDays","days","getInboxFakeOrder","Migrations","dateModule","migrations","initial","dateSorted","keys","filter","sort","b","dateA","dateB","map","MigrationExecutor","db","migrationsBuilder","applyMigrations","applyMigrationsPack","forEach","migrationsPack","migration","onversionchange","event","console","info","close","databasePromise","getInstanceWithPromise","executor","Promise","resolve","reject","request","indexedDB","open","onsuccess","target","result","bind","onerror","error","onupgradeneeded","then","LogBase","_add","transaction","objectStore","add","getAll","items","Array","isArray","ids","id","length","maxItems","all","slice","delete","cursor","openCursor","ev","cursorResult","push","continue","keyValue","defaultValue","timeout","isComplete","isError","check","clearTimeout","setTimeout","extend","oldValues","newValues","set","put","log","environment","self","registration","type","message","additional","Error","stack","levels","debug","limitLevel","Logger","setLevel","level","write","levelName","levelNumber","args","groupCollapsed","trace","groupEnd","EventBus","addEventHandler","handler","savedEventHandlers","handlers","removeEventHandler","savedEventHandler","dispatchEvent","payload","eventId","data","api","inboxModel","publicMessageBuilder","messageTypeFactory","action_type","actionParams","messageType","l","startsWith","updateMessagesStatusWithCodes","codes","messages","status","updatedMessages","inboxStatusQueries","async","msg","indexOf","inbox_id","inboxStatus","order","putBulkMessages","action_params","image","title","send_date","text","imageUrl","getDefaultNotificationImage","inboxTitle","getDefaultNotificationTitle","JSON","parse","parseInt","code","sendDate","toISOString","link","isRead","isActionPerformed","messagesWithNoActionPerformedCount","getDeliveredReadMessagesCount","unreadMessagesCount","getDeliveredMessagesCount","messagesCount","loadMessages","buildMessagePromises","getReadOpenMessages","getDeliveredMessages","msgA","msgB","readMessagesWithCodes","unreadMessages","performActionForMessageWithCode","getMessage","document","location","href","window","history","go","putMessage","deleteMessagesWithCodes","readMessages","syncMessages","updateMessages","Store","index","indexNames","_index","warn","writeRequestPromise","readRequestPromise","count","query","countByIndex","Storage","dbVersionChangeHandler","dbRequestSuccessHandler","dbRequestUpgradeNeededHandler","getDB","storeName","indexName","InboxMessages","eventBus","storage","getInboxMessages","response","storeGetInboxMessagesRequestParams","next","new_inbox","newMessagesCount","setInboxLastRequestTime","setInboxLastRequestCode","setInboxNewMessagesCount","putServerMessages","putTransactions","localMessage","deleteMessages","deleteTransactions","deleteExpiredMessages","upperBound","codesToDelete","rt","getReadMessagesCount","readStatus","openStatus","keyRange","IDBKeyRange","bound","deleted","getKey","Data","clearAll","undefined","setApplicationCode","application","getApplicationCode","setApiToken","token","getApiToken","setHwid","hwid","getHwid","setDeviceType","getDeviceType","setDeviceModel","model","getDeviceModel","setLanguage","language","getLanguage","setApiEntrypoint","url","getApiEntrypoint","setTokens","tokens","getTokens","setApplicationServerKey","getApplicationServerKey","setIsVapidChanged","getIsVapidChanged","setWebSitePushId","senderId","getWebSitePushId","setDefaultNotificationImage","setDefaultNotificationTitle","setUserId","userId","getUserId","setStatusUserIdWasChanged","getStatusUserIdWasChanged","setEmail","email","getEmail","setStatusEmailWasChanged","getStatusEmailWasChanged","setSmsNumber","number","getSmsNumber","setStatusSmsNumberWasChanged","getStatusSmsNumberWasChanged","setWhatsAppNumber","getWhatsAppNumber","setStatusWhatsAppNumberWasChanged","getStatusWhatsAppNumberWasChanged","setLastPermissionStatus","getLastPermissionStatus","setStatusManualUnsubscribed","getStatusManualUnsubscribed","setStatusCommunicationDisabled","getStatusCommunicationDisabled","setCommunicationEnabled","getCommunicationEnabled","setStatusDropAllData","getStatusDropAllData","setSdkVersion","version","getSdkVersion","setServiceWorkerVersion","getServiceWorkerVersion","setServiceWorkerUrl","getServiceWorkerUrl","setServiceWorkerScope","scope","getServiceWorkerScope","setLastOpenMessage","getLastOpenMessage","setLastOpenApplicationTime","time","getLastOpenApplicationTime","setFeatures","features","getFeatures","setInitParams","params","getInitParams","lastCode","getInboxLastRequestCode","lastRequestTime","getInboxLastRequestTime","getInboxNewMessagesCount","setDelayedEvent","getDelayedEvent","setPromptDisplayCount","getPromptDisplayCount","setPromptLastSeenTime","getPromptLastSeenTime","ApiClient","logger","checkDevice","options","createRequest","getConfig","applicationOpen","registerDevice","unregisterDevice","deleteDevice","messageDeliveryEvent","pushStat","setTags","getTags","registerUser","registerEmail","registerEmailUser","setEmailTags","postEvent","pageVisit","setPurchase","multiRegisterDevice","methodName","customUrl","entrypoint","apiToken","authRequestOptions","headers","Authorization","Origin","origin","credentials","fetch","method","body","stringify","checkResponse","base_url","errorMessage","statusText","json","status_message","status_code","_e","Api","apiClient","getIsCommunicationDisabled","getRequestParams","checkDeviceSubscribeForPushNotifications","useCache","localStorage","getItem","exist","push_token_exist","setItem","now","pushToken","push_token","auth_token","authToken","public_key","publicKey","hash","isTrackingLogOnFailure","metaData","tags","device_type","isManual","_device_type","deviceType","ts_offset","test","_hwid","requestParams","registerSmsNumber","registerWhatsappNumber","attributes","timestampUTC","timestampCurrent","lastOpenMessage","expiry","msgHash","messageHash","last_code","last_request_time","inbox_code","config","page_visit","applicationCode","deviceModel","fullRequest","user_id","String","sms_phone_number","whatsapp_phone_number","timezone","push_devices","pushDevice","platform","sdk_version","webPushData","browser","platformData","getParams","device_model","v","PlatformChecker","global","_isSafari","isSafariBrowser","_isOpera","isOperaBrowser","_isEdge","isEdgeBrowser","_isFirefox","isFirefoxBrowser","_isChrome","isChromeBrowser","_isMacOS","isMacOS","_isAvailableServiceWorker","canUseServiceWorkers","_isAvailableNotifications","canReceiveNotifications","_platform","getPlatformType","_browserVersion","getBrowserVersion","isEdge","isSafari","isOpera","isAvailableServiceWorker","isAvailableNotifications","browserVersion","navigator","userAgent","toLowerCase","vendor","serviceWorker","matchOperaVersion","match","matchEdgeVersion","matchEdgVersion","appName","appVersion","splice","join","PushServiceDefault","getPermission","Notification","permission","checkIsPermissionGranted","checkIsPermissionDefault","checkIsManualUnsubscribed","askPermission","requestPermission","subscribe","subscription","currentSubscription","trySubscribe","getPushToken","_p256dn","_auth","p256dh","btoa","fromCharCode","apply","Uint8Array","auth","endpoint","unsubscribe","getServiceWorkerRegistration","pushManager","getSubscription","checkIsRegister","checkIsNeedResubscribe","lastPermission","getCredentials","pushTokenFromSubscription","subscriptionTokensFromStore","isEqualPushTokens","isVapidChanged","registerServiceWorker","getRegistration","update","cleanCache","register","subscribePushManager","applicationServerKey","userVisibleOnly","urlBase64ToUint8Array","base64String","base64","repeat","rawData","atob","outputArray","charCodeAt","PushServiceSafari","getPermissionInfo","safari","pushNotification","webSitePushId","deviceToken","savedWebSitePushId","isChangeWebSitePushId","Pushwoosh","ready","moduleRegistry","showLog","showKeyValues","showMessages","isCommunicationDisabled","platformChecker","pwinbox","command","subscribeToLegacyEvents","initialize","catch","err","isForceSubscribe","driver","isManualUnsubscribed","isDeviceRegister","forceSubscribe","isDeviceRegistered","isDeviceUnregistered","isSubscribed","isCommunicationEnabled","isEnabled","finishInit","sendData","channel","removeAllDeviceData","getHWID","sendStatisticsVisitedPage","pathname","url_path","initParams","manualDebug","logLevel","initDisabled","communicationEnabled","storedCommunicationEnabled","storedOldCommunicationDisabled","currentApplicationCode","isUserIdChanged","Language","pushwooshUrl","delayedEvent","emitLegacyEventsFromServiceWorker","hashReg","decodeURIComponent","exec","pushState","ensureHwid","loadConfig","initPushNotifications","onmessage","onServiceWorkerMessage","CustomEvent","detail","pw","reinit","storedUserId","userIdWasChanged","defaultProcess","isDropAllData","isNeedResubscribe","isRegister","isForce","lastApplicationOpenTime","currentTime","tasks","storedEmail","task","storedSmsNumber","smsNumber","storedWhatsAppNumber","whatsAppNumber","worker","enabled","events","some","sendPostEventVisitedPage","vapid_key","previousServerKey","defaultNotificationImage","defaultNotificationTitle","initDriver","safariWebsitePushID","isHandled","notification"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"npm.js","mappings":"CAAA,SAA2CA,EAAMC,GAChD,GAAsB,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,SACb,GAAqB,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,OACP,CACJ,IAAIK,EAAIL,IACR,IAAI,IAAIM,KAAKD,GAAuB,iBAAZJ,QAAuBA,QAAUF,GAAMO,GAAKD,EAAEC,EACvE,CACA,CATD,CASGC,KAAM,I,mBCRT,IAAIC,EAAsB,CCA1BA,EAAwB,CAACP,EAASQ,KACjC,IAAI,IAAIC,KAAOD,EACXD,EAAoBG,EAAEF,EAAYC,KAASF,EAAoBG,EAAEV,EAASS,IAC5EE,OAAOC,eAAeZ,EAASS,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3EF,EAAwB,CAACQ,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFT,EAAyBP,IACH,oBAAXoB,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeZ,EAASoB,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeZ,EAAS,aAAc,CAAEsB,OAAO,M,sCCLhD,MAAMC,EAA6B,+BAc7BC,EAAyC,2BAKzCC,EAAgD,aAChDC,EAAkD,eAGlDC,EAAoB,SACpBC,EAAqB,UACrBC,EAAoB,UAIpBC,EAAwB,UACxBC,EAA4B,cAC5BC,EAA8B,gBAC9BC,EAA2B,aAC3BC,EAAoC,qBACpCC,EAAoC,qBACpCC,EAAqC,sBACrCC,EAAgC,gBAChCC,EAAgC,iBAChCC,EAAqC,sBACrCC,EAAqC,sBACrCC,EAA+C,+BAC/CC,EAAiD,8BACjDC,EAAwC,wBACxCC,EAAsD,qCACtDC,EAAsD,qCAEtDC,EAA2C,2BAC3CC,EAA2C,2BAO3CC,EAAuB,gBCpDvBC,EAAoB,CAC/BC,eAAe,EACfC,iBAAkB5B,GCJb,SAAS6B,IACd,OAAOC,UACT,CAuBO,SAASC,IACd,OAAOC,OAAOC,gBAAkB,uCAAuCC,QAAQ,QAAUC,IACvF,MAAMC,EAAqB,GAAhBC,KAAKC,SAAiB,EACjC,OAAc,MAANH,EAAYC,EAAS,EAAJA,EAAW,GAAKG,SAAS,KAEtD,CAEO,MAAMC,EAAczC,GAAoE,mBAAVA,EC7BxE0C,EAAsE,CACjF,CAAC,GAAqC,CACpCC,KAAM,YAER,CAAC,GAAsC,CACrCA,KAAM,aAER,CAAC,GAAwC,CACvCA,KAAM,eAER,CAAC,GAA0C,CACzCA,KAAM,kCACNjD,KAAM,SAER,CAAC,GAA0C,CACzCiD,KAAM,eACNjD,KAAM,gBAER,CAAC,GAA+C,CAC9CiD,KAAM,oBACNjD,KAAM,gBAER,CAAC,GAA+C,CAC9CiD,KAAM,oBACNjD,KAAM,gBAER,CAAC,GAAyD,CACxDiD,KAAM,+BACNjD,KAAM,aAER,CAAC,GAA2D,CAC1DiD,KAAM,wBACNjD,KAAM,WAER,CAAC,GAAkD,CACjDiD,KAAM,wBACNjD,KAAM,YAER,CAAC,GAAgE,CAC/DiD,KAAM,uCAER,CAAC,GAAgE,CAC/DA,KAAM,sCACNjD,KAAM,cAER,CAAC,GAAqD,CACpDiD,KAAM,4BAER,CAAC,GAAqD,CACpDA,KAAM,4BAER,CAAC,GAA8C,CAC7CA,KAAM,qBAER,CAAC,GAA8C,CAC7CA,KAAM,sBAER,CAAC,GAA+C,CAC9CA,KAAM,uBC3DGC,EAA2C,WAC3CC,EAA+C,WAC/CC,EAAyC,MACzCC,EAAqD,gBCE3D,SAASC,EAAsBL,EAAqBM,GACzD,OAAO,SAAUC,GACXA,EAASC,iBAAiBC,SAAST,IAIvCM,EAAaC,EACf,CACF,CCOA,SACEF,EAAsBD,EAbxB,SAAkCG,GAChC,MACMG,EAA4C,SAG5CC,EAAQJ,EAASK,kBAAkBR,EACvC,CAAES,QALsC,WAK7BC,eAAe,IAE5BH,EAAMI,YAAYL,EAAaA,EAAa,CAAEM,QAAQ,EAAOC,YAAY,IACzEN,EAAMI,YANsD,UAMN,CAAEC,QAAQ,EAAOC,YAAY,GACrF,ICsBA,SACEZ,EAAsBJ,EA/BxB,SAA6BM,GAC3BA,EAASK,kBAAkBX,EAAsB,CAAEY,QAAS,OAC9D,GA8BER,EAAsBF,EAxBxB,SAAwBI,GACtB,MAAMW,EAAWX,EAASK,kBACxBT,EACA,CAAEU,QHhBiC,KGgBCC,eAAe,IAErDI,EAASH,YAAY,cAAe,cAAe,CAAEC,QAAQ,IAC7DE,EAASH,YAAY,OAAQ,OAAQ,CAAEC,QAAQ,IAC/CE,EAASH,YAAY,OAAQ,OAAQ,CAAEC,QAAQ,GACjD,GAiBEX,EAAsBH,EAXxB,SAA+BK,GACPA,EAASK,kBAC7BV,EACA,CAAEW,QH9BiC,KG8BCC,eAAe,IAEvCC,YAAY,OAAQ,OAAQ,CAAEC,QAAQ,GACtD,ICxCe,MAAMG,EAGnB,WAAAC,CAAYC,EAAa,IAAIC,MAC3BjF,KAAKkF,MAAQF,CACf,CAEA,QAAIA,CAAKA,GACPhF,KAAKkF,MAAQF,CACf,CAEA,QAAIA,GACF,OAAOhF,KAAKkF,KACd,CAKA,eAAAC,GACE,OAAO7B,KAAK8B,OAAOpF,KAAKgF,KAAKK,UAA4C,GAAhCrF,KAAKgF,KAAKM,oBAA2B,KAAQ,IACxF,CAKA,YAAAC,GACE,OAAOjC,KAAKkC,MAAMxF,KAAKgF,KAAKK,UAAY,IAC1C,CAKA,QAAAI,GACE,MAAMC,EAAmB1F,KAAKkF,MAAMG,UAA4C,GAAhCrF,KAAKgF,KAAKM,oBAA2B,IACrFtF,KAAKkF,MAAQ,IAAID,KAAKS,EACxB,CAMA,OAAAC,CAAQC,GACN,MAAMF,EAAmB1F,KAAKkF,MAAMG,UAAmB,GAAPO,EAAY,GAAK,GAAK,IACtE5F,KAAKkF,MAAQ,IAAID,KAAKS,EACxB,CAKA,iBAAAG,GACE,OAA+B,IAAvB7F,KAAKkF,MAAMG,UAAkB,KAA2B7B,UAClE,EC9Ca,MAAMsC,EAInB,WAAAf,CAAYgB,EAAyB,IAAIjB,GACvC9E,KAAKgG,WAAa,CAEhBC,QAAS,EAGT,aAAc,GAEhBjG,KAAK+F,WAAaA,CACpB,CAKA,WAAIE,GACF,OAAOjG,KAAKgG,WAAWC,OACzB,CAKA,cAAIC,GACF,OAAO7F,OAAO8F,KAAKnG,KAAKgG,YACrBI,OAAQjG,GAAgB,YAARA,GAChBkG,KAAK,CAACvG,EAAGwG,KACR,MAAMC,EAAQ,IAAIzB,EAAW,IAAIG,KAAKnF,IAChC0G,EAAQ,IAAI1B,EAAW,IAAIG,KAAKqB,IACtC,OAAOC,EAAMhB,eAAiBiB,EAAMjB,iBAErCkB,IAAKtG,GAAQH,KAAKgG,WAAW7F,GAClC,ECpCa,MAAMuG,EAInB,WAAA3B,CACE4B,EACAC,EAAgC,IAAId,GAEpC9F,KAAK2G,GAAKA,EACV3G,KAAK4G,kBAAoBA,CAC3B,CAEA,eAAAC,GAEE7G,KAAK8G,oBAAoB9G,KAAK4G,kBAAkBX,SAGhDjG,KAAK4G,kBAAkBV,WAAWa,QAASC,IACzChH,KAAK8G,oBAAoBE,IAE7B,CAEA,mBAAAF,CAAoBE,GAClBA,EAAeD,QAASE,IACtBA,EAAUjH,KAAK2G,KAEnB,EClBF,SAASO,EAAgBhD,EAAuBiD,GAC9CC,QAAQC,KAAK,kBAAmBF,GAChCjD,EAASoD,OACX,CAEA,IAAIC,EAyBJ,SAASC,EAAuBC,GAC9B,OAxBKF,IACHA,EAAkB,IAAIG,QAAqB,CAACC,EAASC,KACnD,MAAMC,EAA4BC,UAAUC,KAAK,sBCnBvD,GDoBMF,EAAQG,UAAab,IACnB,MAAMjD,EAAyBiD,EAAMc,OAAyCC,OAC9EhE,EAASgD,gBAAkBA,EAAgBiB,KAAK,KAAMjE,EAAU0D,GAChED,EAAQzD,IAGV2D,EAAQO,QAAU,IAAMR,EAAOC,EAAQQ,OAEvCR,EAAQS,gBAAmBnB,IACzB,MAAMjD,EAAyBiD,EAAMc,OAAyCC,OAC9EhE,EAASgD,gBAAkBA,EAAgBiB,KAAK,KAAMjE,EAAU0D,GAEtC,IAAIlB,EAAkBxC,GAC9B2C,sBAIjBU,GAIcgB,KAAMrE,GAAa,IAClCwD,QAAQ,CAACC,EAASC,IAAWH,EAASvD,EAAUyD,EAASC,IAEjE,CAgHO,MAAeY,EAGpB,IAAAC,CAAKhI,GACH,OAAO+G,EAAuB,CAACtD,EAAuByD,EAAcC,KAClE,MAAMC,EAAU3D,EAASwE,YAAY,CAAC1I,KAAK2D,MAAO,aAAagF,YAAY3I,KAAK2D,MAAMiF,IAAInI,GAC1FoH,EAAQG,UAAY,KAClBL,EAAQlH,IAEVoH,EAAQO,QAAU,KAChBR,EAAOC,EAAQQ,UAEhBE,KAAM9H,GACAT,KAAK6I,SAASN,KAAMO,IACzB,GAAIC,MAAMC,QAAQF,GAAQ,CACxB,MAAMG,EAAMH,EAAMrC,IAAK1G,GAAMA,EAAEmJ,IAAI7C,KAAK,CAACvG,EAAGwG,IACtCxG,GAAKwG,EAAU,EACZxG,EAAIwG,EAAI,GAAK,GAEtB,GAAI2C,EAAIE,OAASnJ,KAAKoJ,SACpB,OAAO1B,QAAQ2B,IAAIJ,EAAIK,MAAMtJ,KAAKoJ,UAAU3C,IAAKyC,GAAOlJ,KAAKuJ,OAAOL,KAAMX,KAAK,IAAM9H,EAEzF,CACA,OAAOA,IAGb,CAEA,OAAON,GACL,OAAOqH,EAAuB,CAACtD,EAAuByD,EAAcC,KAClE,MAAMC,EAAU3D,EAASwE,YAAY,CAAC1I,KAAK2D,MAAO,aAAagF,YAAY3I,KAAK2D,MAAM4F,OAAOpJ,GAC7F0H,EAAQG,UAAY,KAClBL,EAAQE,EAAQK,SAElBL,EAAQO,QAAU,KAChBR,EAAOC,EAAQQ,SAGrB,CAEA,MAAAQ,GACE,OAAOrB,EAAuB,CAACtD,EAAuByD,EAAcC,KAClE,MAAMM,EAAgB,GAChBsB,EAAStF,EAASwE,YAAY1I,KAAK2D,MAAMgF,YAAY3I,KAAK2D,MAAM8F,aACtED,EAAOxB,UAAa0B,IAClB,MAAMC,EAAgBD,EAAGzB,OAAeC,OACpCyB,GACEA,EAAa3I,OACfkH,EAAO0B,KAAKD,EAAa3I,OAE3B2I,EAAaE,YAEblC,EAAQO,IAGZsB,EAAOpB,QAAU,KACfR,EAAO4B,EAAOnB,SAGpB,EAmCK,MAAMyB,GA5MWnG,EA4MeC,EA3M9B,CACLpD,IAAG,CAAsBL,EAAQ4J,IACxBvC,EAAuB,CAACtD,EAAuByD,EAAcC,KAClE,MAAMC,EAAU3D,EAASwE,YAAY/E,GAAMgF,YAAYhF,GAAMnD,IAAIL,GAQjE,IAEI6J,EAFAC,GAAa,EACbC,GAAU,EAGd,MAAMC,EAAQ,KACZC,aAAaJ,GACTC,EACFtC,EAAQE,EAAQK,QAAQlH,OAAS+I,GACxBG,EACTtC,EAAOC,EAAQQ,OAEf2B,EAAUK,WAAWF,EAAO,IAIhCtC,EAAQG,UAAY,IAAMiC,GAAa,EACvCpC,EAAQO,QAAU,IAAM8B,GAAU,EAClCC,MAIJtB,OAAM,IACGrB,EAAuB,CAACtD,EAAuByD,EAAcC,KAClE,MAAMM,EAAiC,CAAC,EAClCsB,EAAStF,EAASwE,YAAY/E,GAAMgF,YAAYhF,GAAM8F,aAC5D,IAEIO,EAFAC,GAAa,EACbC,GAAU,EASd,MAAMC,EAAQ,KACZC,aAAaJ,GACTC,EACFtC,EAAQO,GACCgC,EACTtC,EAAO4B,EAAOnB,OAEd2B,EAAUK,WAAWF,EAAO,IAIhCX,EAAOxB,UAAab,IAClB,MAAMwC,EAAgBxC,EAAMc,OAAeC,OACvCyB,GACFzB,EAAOyB,EAAaxJ,KAAOwJ,EAAa3I,MAAMA,MAC9C2I,EAAaE,YAEbI,GAAa,GAGjBT,EAAOpB,QAAU,IAAM8B,GAAU,EACjCC,MAIJ,YAAMG,CAAOnK,EAAaa,GACxB,MAAMuJ,QAAkBvK,KAAKQ,IAAIL,OACtBqK,GAAcxJ,QACnBhB,KAAKyK,IAAItK,EAAK,IAAKoK,KAAcC,GACzC,EAEAC,IAAG,CAAOtK,EAAQa,IACTwG,EAAuB,CAACtD,EAAuByD,EAAcC,KAClE,MAAMC,EAAU3D,EAASwE,YAAY,CAAC/E,GAAO,aAAagF,YAAYhF,GAAM+G,IAAI,CAAEvK,MAAKa,UACvF,IAEIgJ,EAFAC,GAAa,EACbC,GAAU,EASd,MAAMC,EAAQ,KACZC,aAAaJ,GACTC,EACFtC,EAAQxH,GACC+J,EACTtC,EAAOC,EAAQQ,OAEf2B,EAAUK,WAAWF,EAAO,IAIhCtC,EAAQG,UAAY,IAAMiC,GAAa,EACvCpC,EAAQO,QAAU,IAAM8B,GAAU,EAClCC,QAxGR,IAAwBxG,EA6MjB,MAAMgH,EAAM,IAjCZ,cAAqBnC,EAA5B,c,oBACY,KAAA7E,KAAOG,EACP,KAAAsF,SAAW,IACX,KAAAwB,YAA+B,oBAATC,MAAwBA,KAAKC,aAAgB,SAAW,SAgB1F,CAfE,GAAAlC,CAAImC,EAAcC,EAAcC,GAC9B,MAAMxK,EAAW,CACfsK,OACAH,YAAa5K,KAAK4K,YAClBI,QAAS,GAAGA,IACZhG,KAAM,IAAIC,MAQZ,OANI+F,aAAmBE,QACrBzK,EAAI0K,MAAQH,EAAQG,OAElBF,IACFxK,EAAIwK,WAAaA,GAEZjL,KAAKyI,KAAKhI,EACnB,GAgBWuK,EAAU,IAbhB,cAAyBxC,EAAhC,c,oBACY,KAAA7E,KAAOE,EACP,KAAAuF,SAAW,EAOvB,CANE,GAAAR,CAAI+B,GACF,OAAO3K,KAAKyI,KAAK,IACZkC,EACH3F,KAAM,IAAIC,MAEd,GEtPImG,EAAoC,CACxC/C,MAAO,EACPhB,KAAM,EACNgE,MAAO,GAGT,IAAIC,EAAa,EAcjB,MAAMC,EAAkB,CACtB,QAAAC,CAASC,GACFL,EAAOK,KACVA,EAAQ,SAEVH,EAAaF,EAAOK,EACtB,EACA,KAAAC,CAAMX,EAAkBC,EAAcC,GAMpC,MALa,UAATF,EACF/K,KAAKqI,MAAM2C,GAEXhL,KAAKqH,KAAK2D,GAELL,EAAW/B,IAAImC,EAAMC,EAASC,EACvC,GAGF5K,OAAO8F,KAAKiF,GAAQrE,QAAS4E,IAC3B,MAAMC,EAAcR,EAAOO,GAC3BJ,EAAOI,GAAa,IAAIE,KAClBD,GAAeN,IACjBlE,QAAQ0E,eAAeH,GACvBvE,QAAQC,KAAK,MAAOwE,GACpBzE,QAAQ2E,MAAM,SACd3E,QAAQ4E,eCrCP,MAAMC,GAGX,WAAAlH,GAIO,KAAAmH,gBAAkB,CACvBvI,EACAwI,KAEA,IAAIC,EAAqBpM,KAAKqM,SAAS1I,GAClCyI,IACHA,EAAqB,IAGvBA,EAAmBxC,KAAKuC,GACxBnM,KAAKqM,SAAS1I,GAAQyI,GAGjB,KAAAE,mBAAqB,CAC1B3I,EACAwI,KAEA,MAAMC,EAAqBpM,KAAKqM,SAAS1I,GACpCyI,IAILpM,KAAKqM,SAAS1I,GAAQyI,EAAmBhG,OAAQmG,GAC/CA,IAAsBJ,KAInB,KAAAK,cAAgB,CACrB7I,EACA8I,KAEA,MAAMC,EAAUD,EAAQC,SAAW1J,IAC7BoJ,EAAqBpM,KAAKqM,SAAS1I,GACzC,OAAKyI,GAILA,EAAmBrF,QAASoF,IACrB1I,EAAW0I,IAIhB9B,WAAW,KACT8B,EAAQ,IAAKM,EAASC,aACrB,KAGEA,GAbEA,GArCT1M,KAAKqM,SAAW,CAAC,CACnB,ECOa,MAAM,GAMnB,WAAAtH,CACE4H,EACAC,EACAC,EACA9G,EAAyB,IAAIjB,GAE7B9E,KAAK2M,KAAOA,EACZ3M,KAAK4M,IAAMA,EACX5M,KAAK6M,WAAaA,EAClB7M,KAAK+F,WAAaA,EAElB/F,KAAK8M,qBAAuB9M,KAAK8M,qBAAqB3E,KAAKnI,KAC7D,CAMQ,kBAAA+M,CAAmBC,EAA+BC,GACxD,IAAIC,EAAsC,EAW1C,OAVoB,IAAhBF,EAC2BE,EAAe,EACnC,MAAOD,GAAkC,MAAlBA,EAAaE,IAEpBD,EADrBD,EAAaE,EAAEC,WAAW,QACU,EAEK,GAIxCF,CACT,CAQQ,mCAAMG,CACZC,EACAC,EACAC,GAEA,MAAMC,EAAwC,GACxCC,EAA2C,GAEjDH,EAASxG,QAAQ4G,MAAOC,KACe,IAAjCN,EAAMO,QAAQD,EAAIE,YAItBF,EAAIJ,OAASA,EACbC,EAAgB7D,KAAKgE,GAGrBF,EAAmB9D,KAAK5J,KAAK4M,IAAImB,YAAYH,EAAII,MAAOJ,EAAIJ,kBAGxDxN,KAAK6M,WAAWoB,gBAAgBR,SAChC/F,QAAQ2B,IAAIqE,EACpB,CAMA,0BAAMZ,EAAqB,YACzBE,EAAW,cACXkB,EAAa,MACbC,EAAK,MACLC,EAAK,UACLC,EAAS,SACTP,EAAQ,KACRQ,EAAI,OACJd,IAEA,MAAMe,EAAWJ,SAAenO,KAAK2M,KAAK6B,8BACpCC,EAAaL,SAAepO,KAAK2M,KAAK+B,8BACtCzB,EAAe0B,KAAKC,MAAMV,GAKhC,OAHAlO,KAAK+F,WAAWf,KAAO,IAAIC,KAA2B,IAAtB4J,SAASR,IACzCrO,KAAK+F,WAAWN,WAET,CACL2I,MAAOK,EACPF,WACAO,KAAMhB,EACN9C,QAASsD,EACTS,SAAU/O,KAAK+F,WAAWf,KAAKgK,cAC/BjE,KAAM/K,KAAK+M,mBAAmBC,EAAaC,GAC3CgC,KAAMhC,GAAcE,GAAK,IACzB+B,OAA6C,IAAX1B,GAAqD,IAAXA,EAC5E2B,kBAAwD,IAAX3B,EAEjD,CAKA,kCAAA4B,GACE,OAAOpP,KAAK6M,WAAWwC,+BACzB,CAKA,mBAAAC,GACE,OAAOtP,KAAK6M,WAAW0C,2BACzB,CAKA,aAAAC,GACE,OAAOxP,KAAK6M,WAAW2C,eACzB,CAKA,kBAAMC,GACJ,MAEMC,EAAuB,UAFF1P,KAAK6M,WAAW8C,+BACd3P,KAAK6M,WAAW+C,wBAE1CvJ,KAAK,CAACwJ,EAAqBC,IACnBjB,SAASiB,EAAKzB,UAAW,IAAMQ,SAASgB,EAAKxB,UAAW,KAEhEhI,KAAK,CAACwJ,EAAqBC,IACnBjB,SAASiB,EAAK9B,OAAS,IAAK,IAAMa,SAASgB,EAAK7B,OAAS,IAAK,KAEtEvH,IAAIzG,KAAK8M,sBACZ,OAAOpF,QAAQ2B,IAAIqG,EACrB,CAMA,2BAAMK,CAAsBzC,GAC1B,MAAM0C,QAAuBhQ,KAAK6M,WAAW+C,6BAGvC5P,KAAKqN,8BACTC,EACA0C,EAH0C,EAM9C,CAMA,qCAAMC,CAAgCnB,GACpC,MAAM9D,QAAgBhL,KAAK6M,WAAWqD,WAAWpB,GAC3C7B,EAAe0B,KAAKC,MAAM5D,EAAQkD,eAClChB,EAAclN,KAAK+M,mBAAmB/B,EAAQgC,YAAaC,GAEvB,IAAhBC,GAAuC,MAAlBD,EAAaE,EAC1DgD,SAASC,SAASC,KAAOpD,EAAaE,EACc,IAAhBD,GAAuC,MAAlBD,EAAaE,GACtEmD,OAAOC,QAAQC,GAAGvD,EAAaE,GAGPnC,EAAQwC,OAAU,QACtCxN,KAAK6M,WAAW4D,WAAWzF,SAG3BhL,KAAK4M,IAAImB,YAAY/C,EAAQgD,MAAOhD,EAAQwC,OACpD,CAMA,6BAAMkD,CAAwBpD,GAC5B,MAAMqD,QAAqB3Q,KAAK6M,WAAW8C,sBACrCK,QAAuBhQ,KAAK6M,WAAW+C,6BAGvC5P,KAAKqN,8BACTC,EACA,IAAIqD,KAAiBX,GAH2B,EAMpD,CAKA,kBAAMY,SACE5Q,KAAK6M,WAAWgE,gBACxB,EC1Na,MAAMC,GAKnB,WAAA/L,CACE4B,EACAhD,GAEA3D,KAAK2D,KAAOA,EACZ3D,KAAKsE,MAAQqC,EAAG+B,YAAY1I,KAAK2D,KAAM,aAAagF,YAAY3I,KAAK2D,KACvE,CAEA,SAAIoN,CAAMA,GACW/Q,KAAKsE,MAAM0M,WACf5M,SAAS2M,GACtB/Q,KAAKiR,OAASjR,KAAKsE,MAAMyM,MAAMA,GAE/B3J,QAAQ8J,KAAK,UAAUH,SAE3B,CAEQ,mBAAAI,CAAuBtJ,EAAqBK,GAClD,OAAO,IAAIR,QAAQ,CAACC,EAASC,KAC3BC,EAAQG,UAAY,KAElBL,EAAQO,IAEVL,EAAQO,QAAU,KAChBR,EAAOC,EAAQQ,SAGrB,CAEQ,kBAAA+I,CAAgCvJ,EAAqBkC,GAC3D,OAAO,IAAIrC,QAAQ,CAACC,EAASC,KAC3BC,EAAQG,UAAab,IACnB,MAAMc,EAA2Fd,EAAMc,OAEvGN,EAAkBM,EAAOC,QAAU6B,IAErClC,EAAQO,QAAU,KAChBR,EAAOC,EAAQQ,SAGrB,CAEA,GAAAqC,CAAIiC,EAAWxM,GACb,MAAM0H,EAAU7H,KAAKsE,MAAMoG,IAAIiC,EAAMxM,GACrC,OAAOH,KAAKmR,oBAAiCtJ,EAAS1H,EACxD,CAOA,GAAAyI,CAAI+D,EAAWxM,GACb,OAAOH,KAAK0K,IAAIiC,EAAMxM,EACxB,CAEA,OAAOA,GACL,MAAM0H,EAAU7H,KAAKsE,MAAMiF,OAAOpJ,GAClC,OAAOH,KAAKmR,oBAAoBtJ,EAClC,CAEA,GAAArH,CAAiBL,EAAkB4J,GACjC,MAAMlC,EAAU7H,KAAKsE,MAAM9D,IAAIL,GAC/B,OAAOH,KAAKoR,mBAAgCvJ,EAASkC,EACvD,CAEA,MAAAlB,GACE,MAAMW,EAASxJ,KAAKsE,MAAMmF,aACpBvB,EAA0B,GAEhC,OAAO,IAAIR,QAAQ,CAACC,EAASC,KAC3B4B,EAAOxB,UAAab,IAClB,MACMwC,EAD2FxC,EAAMc,OAC3EC,OACxByB,GACFzB,EAAO0B,KAAKD,EAAa3I,OACzB2I,EAAaE,YAEblC,EAAQO,IAGZsB,EAAOpB,QAAU,KACfR,EAAO4B,EAAOnB,SAGpB,CAEA,KAAAgJ,CAAMC,GACJ,MAAMzJ,EAAU7H,KAAKsE,MAAM+M,MAAMC,GACjC,OAAOtR,KAAKoR,mBAAmCvJ,EAAS,EAC1D,CAEA,YAAA0J,CAAapR,GACX,MAAM0H,EAAU7H,KAAKiR,OAAOI,MAAMlR,GAClC,OAAOH,KAAKoR,mBAAmCvJ,EAAS,EAC1D,ECjGa,MAAM2J,GAQX,sBAAAC,CAAuB9K,EAAiBQ,GAC9CC,QAAQC,KAAK,kBAAmBF,GAChCR,EAAGW,OACL,CAOQ,uBAAAoK,CAAwB/J,EAAoCR,GAClE,MACMjD,EADuEiD,EAAMc,OAC9CC,OAGrChE,EAASgD,gBAAmBC,IAC1BnH,KAAKyR,uBAAuBvN,EAAUiD,IAGxCQ,EAAQzD,EACV,CAMQ,6BAAAyN,CAA8BxK,GACpC,MACMjD,EADuEiD,EAAMc,OAC9CC,OAGrChE,EAASgD,gBAAmBC,IAC1BnH,KAAKyR,uBAAuBvN,EAAUiD,IAId,IAAIT,EAAkBxC,GAC9B2C,iBACpB,CAKA,KAAA+K,GACE,OAAO,IAAIlK,QAAqB,CAACC,EAASC,KACxC,MAAMC,EAA4BC,UAAUC,KAAK,sBLzDvD,GK2DMF,EAAQG,UAAab,IACnBnH,KAAK0R,wBAAwB/J,EAASR,IAExCU,EAAQS,gBAAmBnB,IACzBnH,KAAK2R,8BAA8BxK,IAErCU,EAAQO,QAAU,IAAMR,EAAOC,EAAQQ,QAE3C,CAQA,SAAMqC,CAAImH,EAA0BlF,EAAWxM,GAC7C,MAAMwG,QAAW3G,KAAK4R,QAChBtN,EAAQ,IAAIwM,GAAMnK,EAAIkL,GACtB3J,QAAe5D,EAAMoG,IAAIiC,EAAMxM,GAErC,OADAwG,EAAGW,QACIY,CACT,CAOA,YAAM,CAAO2J,EAA0B1R,GACrC,MAAMwG,QAAW3G,KAAK4R,QAChBtN,EAAQ,IAAIwM,GAAMnK,EAAIkL,GACtB3J,QAAe5D,EAAMiF,OAAOpJ,GAElC,OADAwG,EAAGW,QACIY,CACT,CAQA,SAAM1H,CACJqR,EACA1R,EACA4J,GAEA,MAAMpD,QAAW3G,KAAK4R,QAChBtN,EAAQ,IAAIwM,GAAMnK,EAAIkL,GACtB3J,QAAe5D,EAAM9D,IAAiBL,EAAK4J,GAEjD,OADApD,EAAGW,QACIY,CACT,CAMA,YAAMW,CACJgJ,GAEA,MAAMlL,QAAW3G,KAAK4R,QAChBtN,EAAQ,IAAIwM,GAAMnK,EAAIkL,GACtB3J,QAAe5D,EAAMuE,SAE3B,OADAlC,EAAGW,QACIY,GAAU,EACnB,CAOA,WAAMmJ,CACJQ,EACAP,GAEA,MAAM3K,QAAW3G,KAAK4R,QAChBtN,EAAQ,IAAIwM,GAAMnK,EAAIkL,GACtB3J,QAAe5D,EAAM+M,MAAMC,GAEjC,OADA3K,EAAGW,QACIY,CACT,CAQA,kBAAMqJ,CACJM,EACAC,EACA3R,GAEA,MAAMwG,QAAW3G,KAAK4R,QAChBtN,EAAQ,IAAIwM,GAAMnK,EAAIkL,GAC5BvN,EAAMyM,MAAQe,EACd,MAAM5J,QAAe5D,EAAMiN,aAAapR,GAExC,OADAwG,EAAGW,QACIY,CACT,ECrJa,MAAM6J,GAQnB,WAAAhN,CACEiN,EACArF,EACAC,EACAqF,EAAmB,IAAIT,GACvBzL,EAAyB,IAAIjB,GAE7B9E,KAAKgS,SAAWA,EAChBhS,KAAK2M,KAAOA,EACZ3M,KAAK4M,IAAMA,EAEX5M,KAAKiS,QAAUA,EACfjS,KAAK6R,UAAY,gBACjB7R,KAAK+F,WAAaA,CACpB,CAKQ,sBAAMmM,GAEZ,MAAMC,QAA4CnS,KAAK4M,IAAIsF,mBAG3D,aAFMlS,KAAKoS,mCAAmCD,EAASE,KAAMF,EAASG,WAE/DH,CACT,CAOQ,wCAAMC,CAAmCC,EAAcE,GAC7DvS,KAAK+F,WAAWf,KAAO,IAAIC,WACrBjF,KAAK2M,KAAK6F,wBAAwBxS,KAAK+F,WAAWZ,yBAElDnF,KAAK2M,KAAK8F,wBAAwBJ,SAClCrS,KAAK2M,KAAK+F,yBAAyBH,EAC3C,CAMQ,uBAAMI,CAAkBpF,GAC9B,MAAMqF,EAAkBrF,EAAS9G,IAAIkH,MAAO3C,IAC1C,MAAM6H,QAAqB7S,KAAKiS,QAAQzR,IAA2BR,KAAK6R,UAAW7G,EAAQ8C,SAAU,CAAC,GAItG,MAHI,WAAY+E,IACd7H,EAAQwC,OAASqF,EAAarF,QAEzBxN,KAAKyQ,WAAWzF,KAGzB,OAAOtD,QAAQ2B,IAAIuJ,EACrB,CAKA,UAAAnC,CAAWzF,GACT,OAAyBhL,KAAKiS,QAAQvH,IAAI1K,KAAK6R,UAAW7G,EAC5D,CAMA,eAAAiD,CAAgBV,GACd,MAAMqF,EAAkBrF,EAAS9G,IAAKuE,GAAYhL,KAAKyQ,WAAWzF,IAClE,OAAOtD,QAAQ2B,IAAIuJ,EACrB,CAMA,cAAAE,CAAexF,GACb,MAAMyF,EAAqBzF,EAAM7G,IAAKqI,GAAS9O,KAAKiS,QAAQ1I,OAAOvJ,KAAK6R,UAAW/C,IACnF,OAAOpH,QAAQ2B,IAAI0J,EACrB,CAKA,2BAAMC,GACJhT,KAAK+F,WAAWf,KAAO,IAAIC,KAC3B,MAAMgO,EAAajT,KAAK+F,WAAWR,eAAe/B,WAG5C0P,SAFoBlT,KAAKiS,QAC5BpJ,OAAsB7I,KAAK6R,YAE3BzL,OAAQwH,GAAuBA,EAAIuF,GAAKF,GACxCxM,IAAKmH,GAAQA,EAAIE,UACpB,OAAO9N,KAAK8S,eAAeI,EAC7B,CAMA,UAAAhD,CAAWpB,GACT,OAAO9O,KAAKiS,QAAQzR,IAAkCR,KAAK6R,UAAW/C,EACxE,CAKA,yBAAMa,GAGJ,aAF0B3P,KAAKiS,QAC5BpJ,OAAsB7I,KAAK6R,YAE3BzL,OAAQwH,GAA+D,IAAfA,EAAIJ,QAAwD,IAAfI,EAAIJ,OAC9G,CAKA,0BAAMoC,GAGJ,aAF0B5P,KAAKiS,QAC5BpJ,OAAsB7I,KAAK6R,YAE3BzL,OAAQwH,GAAoE,IAAfA,EAAIJ,OACtE,CAKA,mBAAMgC,GACJ,OAAOxP,KAAKiS,QAAQZ,MAAMrR,KAAK6R,UACjC,CAKA,+BAAMtC,GAGJ,OAAOvP,KAAKiS,QACTV,aAAavR,KAAK6R,UAFiC,SADA,EAIxD,CAKA,0BAAMuB,GAGJ,OAAOpT,KAAKiS,QACTV,aAAavR,KAAK6R,UAFiC,SADV,EAI9C,CAKA,mCAAMxC,GACJ,MAAOgE,EAAYC,GAA6C,CAAC,EAAG,GAC9DC,EAAWC,YAAYC,MAAMJ,EAAYC,GAG/C,OAAOtT,KAAKiS,QAAQV,aAAavR,KAAK6R,UAFgB,SAEY0B,EACpE,CAKA,oBAAM1C,GACJ,MAAMsB,QAAiBnS,KAAKkS,yBACtBlS,KAAKgT,wBACPb,EAASuB,eACL1T,KAAK8S,eAAeX,EAASuB,eAE/B1T,KAAK2S,kBAAkBR,EAAS5E,UAEtCvN,KAAKgS,SAASxF,cAAc,wBAAyB,CACnDe,SAAU,IAAI,GACZvN,KAAK2M,KACL3M,KAAK4M,IACL5M,OAGN,ECrMF,MAAM2T,GAAUxT,GAAwB,UAAUA,IAE3C,MAAMyT,GAGX,WAAA7O,CAAYT,EAAyBwF,GACnC9J,KAAKsE,MAAQA,CACf,CAEO,cAAMuP,GACX,MAAM1N,EAAO,CACX,kBACA,WACA,OACA,aACA,cACA,WACA,gBACA,SACA,uBACA,iBACA,gBACA,2BACA,2BACA,SACA,mBACA,QACA,kBACA,yBACA,uBACA,0BACA,uBACA,gBACA,aACA,uBACA,mBACA,qBACA,kBACA,0BACA,WACA,OACA,wBACA,wBACA,yBACA,eACA,qBACA,sBAGF,IAAK,MAAMhG,KAAOgG,QACVnG,KAAKsE,MAAMmG,IAAIkJ,GAAOxT,QAAM2T,EAEtC,CAEO,wBAAMC,CAAmBC,SACxBhU,KAAKsE,MAAMmG,IAAIkJ,GAAO,mBAAoBK,EAClD,CAEO,wBAAMC,GACX,OAAOjU,KAAKsE,MAAM9D,IAAImT,GAAO,mBAC/B,CAEO,iBAAMO,CAAYC,GACvB,aAAanU,KAAKsE,MAAMmG,IAAIkJ,GAAO,YAAaQ,EAClD,CAEO,iBAAMC,GACX,OAAOpU,KAAKsE,MAAM9D,IAAImT,GAAO,YAC/B,CAEO,aAAMU,CAAQC,SACbtU,KAAKsE,MAAMmG,IAAIkJ,GAAO,QAASW,EACvC,CAEO,aAAMC,GACX,OAAOvU,KAAKsE,MAAM9D,IAAImT,GAAO,QAC/B,CAEO,mBAAMa,CAAczJ,SACnB/K,KAAKsE,MAAMmG,IAAIkJ,GAAO,cAAe5I,EAC7C,CAEO,mBAAM0J,GACX,OAAOzU,KAAKsE,MAAM9D,IAAImT,GAAO,cAC/B,CAEO,oBAAMe,CAAeC,SACpB3U,KAAKsE,MAAMmG,IAAIkJ,GAAO,eAAgBgB,EAC9C,CAEO,oBAAMC,GACX,OAAO5U,KAAKsE,MAAM9D,IAAImT,GAAO,eAC/B,CAEO,iBAAMkB,CAAYC,SACjB9U,KAAKsE,MAAMmG,IAAIkJ,GAAO,YAAamB,EAC3C,CAEO,iBAAMC,GACX,OAAO/U,KAAKsE,MAAM9D,IAAImT,GAAO,YAAa,KAC5C,CAEO,sBAAMqB,CAAiBC,SACtBjV,KAAKsE,MAAMmG,IAAIkJ,GAAO,iBAAkBsB,EAChD,CAEO,sBAAMC,GACX,OAAOlV,KAAKsE,MAAM9D,IAAImT,GAAO,iBnB7GF,qCmB8G7B,CAEO,eAAMwB,CAAUC,SACfpV,KAAKsE,MAAMmG,IAAIkJ,GAAO,UAAWyB,EACzC,CAEO,SAAAC,GACL,OAAOrV,KAAKsE,MAAM9D,IAAImT,GAAO,UAC/B,CAEO,6BAAM2B,CAAwBnV,SAC7BH,KAAKsE,MAAMmG,IAAIkJ,GAAO,wBAAyBxT,EACvD,CAEO,6BAAMoV,GACX,OAAOvV,KAAKsE,MAAM9D,IAAImT,GAAO,wBAC/B,CAEO,uBAAM6B,CAAkBhI,SACvBxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,kBAAmBnG,EACjD,CAEO,uBAAMiI,GACX,OAAOzV,KAAKsE,MAAM9D,IAAImT,GAAO,mBAAmB,EAClD,CAEO,sBAAM+B,CAAiBC,SACtB3V,KAAKsE,MAAMmG,IAAIkJ,GAAO,iBAAkBgC,EAChD,CAEO,sBAAMC,GACX,OAAO5V,KAAKsE,MAAM9D,IAAImT,GAAO,iBAC/B,CAEO,iCAAMkC,CAA4BZ,SACjCjV,KAAKsE,MAAMmG,IAAIkJ,GAAO,4BAA6BsB,EAC3D,CAEO,iCAAMzG,GACX,OAAOxO,KAAKsE,MAAM9D,IAAImT,GAAO,4BnB/IS,+CmBgJxC,CAEO,iCAAMmC,CAA4BxH,SACjCtO,KAAKsE,MAAMmG,IAAIkJ,GAAO,4BAA6BrF,EAC3D,CAEO,iCAAMI,GACX,OAAO1O,KAAKsE,MAAM9D,IAAImT,GAAO,4BnBxJS,yBmByJxC,CAEO,eAAMoC,CAAUC,SACfhW,KAAKsE,MAAMmG,IAAIkJ,GAAO,UAAWqC,EAAS,GAAGA,SAAWlC,EAChE,CAEO,eAAMmC,GACX,OAAOjW,KAAKsE,MAAM9D,IAAImT,GAAO,UAC/B,CAEO,+BAAMuC,CAA0B1I,SAC/BxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,oBAAqBnG,EACnD,CAEO,+BAAM2I,GACX,OAAOnW,KAAKsE,MAAM9D,IAAImT,GAAO,qBAAqB,EACpD,CAEO,cAAMyC,CAASC,SACdrW,KAAKsE,MAAMmG,IAAIkJ,GAAO,SAAU0C,EAAQ,GAAGA,SAAUvC,EAC7D,CAEO,cAAMwC,GACX,OAAOtW,KAAKsE,MAAM9D,IAAImT,GAAO,SAC/B,CAEO,8BAAM4C,CAAyB/I,SAC9BxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,mBAAoBnG,EAClD,CAEO,8BAAMgJ,GACX,OAAOxW,KAAKsE,MAAM9D,IAAImT,GAAO,oBAAoB,EACnD,CAEO,kBAAM8C,CAAaC,SAClB1W,KAAKsE,MAAMmG,IAAIkJ,GAAO,aAAc+C,EAAS,GAAGA,SAAW5C,EACnE,CAEO,kBAAM6C,GACX,OAAO3W,KAAKsE,MAAM9D,IAAImT,GAAO,aAC/B,CAEO,kCAAMiD,CAA6BpJ,SAClCxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,uBAAwBnG,EACtD,CAEO,kCAAMqJ,GACX,OAAO7W,KAAKsE,MAAM9D,IAAImT,GAAO,wBAAwB,EACvD,CAEO,uBAAMmD,CAAkBJ,SACvB1W,KAAKsE,MAAMmG,IAAIkJ,GAAO,kBAAmB+C,EAAS,GAAGA,SAAW5C,EACxE,CAEO,uBAAMiD,GACX,OAAO/W,KAAKsE,MAAM9D,IAAImT,GAAO,kBAC/B,CAEO,uCAAMqD,CAAkCxJ,SACvCxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,4BAA6BnG,EAC3D,CAEO,uCAAMyJ,GACX,OAAOjX,KAAKsE,MAAM9D,IAAImT,GAAO,6BAA6B,EAC5D,CAEO,6BAAMuD,CAAwB1J,SAC7BxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,0BAA2BnG,EACzD,CAEO,6BAAM2J,GACX,OAAOnX,KAAKsE,MAAM9D,IAAImT,GAAO,0BAC/B,CAEO,iCAAMyD,CAA4B5J,SACjCxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,wBAAyBnG,EACvD,CAEO,2BAAA6J,GACL,OAAOrX,KAAKsE,MAAM9D,IAAImT,GAAO,yBAAyB,EACxD,CAEO,oCAAM2D,CAA+B9J,SACpCxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,2BAA4BnG,EAC1D,CAEO,8BAAA+J,GACL,OAAOvX,KAAKsE,MAAM9D,IAAImT,GAAO,4BAA4B,EAC3D,CAEO,6BAAM6D,CAAwBhK,SAC7BxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,wBAAyBnG,EACvD,CAEO,uBAAAiK,GACL,OAAOzX,KAAKsE,MAAM9D,IAAImT,GAAO,wBAC/B,CAEO,0BAAM+D,CAAqBlK,SAC1BxN,KAAKsE,MAAMmG,IAAIkJ,GAAO,iBAAkBnG,EAChD,CAEO,oBAAAmK,GACL,OAAO3X,KAAKsE,MAAM9D,IAAImT,GAAO,kBAAkB,EACjD,CAEO,mBAAMiE,CAAcC,SACnB7X,KAAKsE,MAAMmG,IAAIkJ,GAAO,cAAekE,EAC7C,CAEO,mBAAMC,GACX,OAAO9X,KAAKsE,MAAM9D,IAAImT,GAAO,cAC/B,CAEO,6BAAMoE,CAAwBF,SAC7B7X,KAAKsE,MAAMmG,IAAIkJ,GAAO,wBAAyBkE,EACvD,CAEO,uBAAAG,GACL,OAAOhY,KAAKsE,MAAM9D,IAAImT,GAAO,wBAC/B,CAEO,yBAAMsE,CAAoBhD,GAC1BA,SAICjV,KAAKsE,MAAMmG,IAAIkJ,GAAO,oBAAqBsB,EACnD,CAEO,yBAAMiD,GACX,OAAOlY,KAAKsE,MAAM9D,IAAImT,GAAO,oBAAqB,EACpD,CAEO,2BAAMwE,CAAsBC,GAC5BA,SAICpY,KAAKsE,MAAMmG,IAAIkJ,GAAO,sBAAuByE,EACrD,CAEO,2BAAMC,GACX,OAAOrY,KAAKsE,MAAM9D,IAAImT,GAAO,sBAC/B,CAEO,wBAAM2E,CAAmBtN,SACxBhL,KAAKsE,MAAMmG,IAAIkJ,GAAO,mBAAoB3I,EAClD,CAEO,kBAAAuN,GACL,OAAOvY,KAAKsE,MAAM9D,IAAImT,GAAO,mBAC/B,CAEO,gCAAM6E,CAA2BC,SAChCzY,KAAKsE,MAAMmG,IAAIkJ,GAAO,2BAA4B8E,EAC1D,CAEO,gCAAMC,GACX,OAAO1Y,KAAKsE,MAAM9D,IAAImT,GAAO,2BAC/B,CAEO,iBAAMgF,CAAYC,SACjB5Y,KAAKsE,MAAMmG,IAAIkJ,GAAO,YAAaiF,EAC3C,CAEO,iBAAMC,GACX,OAAO7Y,KAAKsE,MAAM9D,IAAImT,GAAO,YAC/B,CAEO,mBAAMmF,CAAcC,SACnB/Y,KAAKsE,MAAMmG,IAAIkJ,GAAO,QAASoF,EACvC,CAEO,mBAAMC,GACX,OAAOhZ,KAAKsE,MAAM9D,IAAImT,GAAO,QAC/B,CAEO,6BAAMlB,CAAwBwG,SAC7BjZ,KAAKsE,MAAMmG,IAAIkJ,GAAO,yBAA0BsF,EACxD,CAEO,6BAAMC,GACX,OAAOlZ,KAAKsE,MAAM9D,IAAImT,GAAO,yBAA0B,GACzD,CAEO,6BAAMnB,CAAwB2G,SAC7BnZ,KAAKsE,MAAMmG,IAAIkJ,GAAO,yBAA0BwF,EACxD,CAEO,6BAAMC,GACX,OAAOpZ,KAAKsE,MAAM9D,IAAImT,GAAO,yBAA0B,EACzD,CAEO,8BAAMjB,CAAyBrB,SAC9BrR,KAAKsE,MAAMmG,IAAIkJ,GAAO,0BAA2BtC,EACzD,CAEO,8BAAMgI,GACX,OAAOrZ,KAAKsE,MAAM9D,IAAImT,GAAO,0BAA2B,EAC1D,CAEO,qBAAM2F,CAAgBnS,SACrBnH,KAAKsE,MAAMmG,IAAIkJ,GAAO,gBAAiBxM,EAC/C,CAEO,eAAAoS,GACL,OAAOvZ,KAAKsE,MAAM9D,IAAImT,GAAO,gBAC/B,CAEO,2BAAM6F,CAAsBnI,SAC3BrR,KAAKsE,MAAMmG,IAAIkJ,GAAO,sBAAuBtC,EACrD,CAEO,2BAAMoI,GACX,OAAOzZ,KAAKsE,MAAM9D,IAAImT,GAAO,sBAAuB,EACtD,CAEO,2BAAM+F,CAAsBjB,SAC3BzY,KAAKsE,MAAMmG,IAAIkJ,GAAO,sBAAuB8E,EACrD,CAEO,2BAAMkB,GACX,OAAO3Z,KAAKsE,MAAM9D,IAAImT,GAAO,sBAAuB,EACtD,EC1XK,MAAMiG,GAIX,WAAA7U,CACE4H,EAAa,IAAIiH,GACjBiG,EAAwBtO,GAExBvL,KAAK2M,KAAOA,EACZ3M,KAAK6Z,OAASA,CAChB,CAEO,WAAAC,CAAYC,GACjB,OAAO/Z,KAAKga,cAAc,cAAeD,EAC3C,CAEO,SAAAE,CAAUF,GACf,OAAO/Z,KAAKga,cAAc,YAAaD,EACzC,CAEO,eAAAG,CAAgBH,GACrB,OAAO/Z,KAAKga,cAAc,kBAAmBD,EAC/C,CAEO,cAAAI,CAAeJ,GACpB,OAAO/Z,KAAKga,cAAc,iBAAkBD,EAC9C,CAEO,gBAAAK,CAAiBL,GACtB,OAAO/Z,KAAKga,cAAc,mBAAoBD,EAChD,CAEO,YAAAM,CAAaN,GAClB,OAAO/Z,KAAKga,cAAc,eAAgBD,EAC5C,CAEO,oBAAAO,CAAqBP,GAC1B,OAAO/Z,KAAKga,cAAc,uBAAwBD,EACpD,CAEO,QAAAQ,CAASR,GACd,OAAO/Z,KAAKga,cAAc,WAAYD,EACxC,CAEO,OAAAS,CAAQT,GACb,OAAO/Z,KAAKga,cAAc,UAAWD,EACvC,CAEO,OAAAU,CAAQV,GACb,OAAO/Z,KAAKga,cAAc,UAAWD,EACvC,CAEO,YAAAW,CAAaX,GAClB,OAAO/Z,KAAKga,cAAc,eAAgBD,EAC5C,CAEO,aAAAY,CAAcZ,GACnB,OAAO/Z,KAAKga,cAAc,gBAAiBD,EAC7C,CAEO,iBAAAa,CAAkBb,GACvB,OAAO/Z,KAAKga,cAAc,oBAAqBD,EACjD,CAEO,YAAAc,CAAad,GAClB,OAAO/Z,KAAKga,cAAc,eAAgBD,EAC5C,CAEO,SAAAe,CAAUf,GACf,OAAO/Z,KAAKga,cAAc,YAAaD,EACzC,CAEO,gBAAA7H,CAAiB6H,GACtB,OAAO/Z,KAAKga,cAAc,mBAAoBD,EAChD,CAEO,WAAAhM,CAAYgM,GACjB,OAAO/Z,KAAKga,cAAc,cAAeD,EAC3C,CAEO,SAAAgB,CAAUhB,EAAmC9E,GAClD,OAAOjV,KAAKga,cAAc,YAAaD,EAAS9E,EAClD,CAEO,WAAA+F,CAAYjB,GACjB,OAAO/Z,KAAKga,cAAc,cAAeD,EAC3C,CAEO,mBAAAkB,CAAoBlB,GACzB,OAAO/Z,KAAKga,cAAc,sBAAuBD,EACnD,CAEQ,mBAAMC,CACZkB,EACArT,EACAsT,GAEA,MAAMC,QAAmBpb,KAAK2M,KAAKuI,mBAC7BmG,QAAiBrb,KAAK2M,KAAKyH,cAC3Ba,EAAMkG,GAAaC,EAAaF,EAEhCI,EAAqBD,EAAW,CACpCE,QAAS,CACPC,cAAe,SAASH,IACxB,eAAgB,2BAChBI,OAAQ3Y,IAAYsN,SAASsL,QAE/BC,YAAa,WACX,CAAC,EAECxJ,QAAiByJ,MAAM3G,EAAK,CAChC4G,OAAQ,OACRN,QAAS,CACP,eAAgB,4BAElBO,KAAMnN,KAAKoN,UAAU,CACnBlU,eAECyT,IAGCpT,QAAelI,KAAKgc,cAAc7J,GAYxC,OATIjK,EAAO+T,gBACHjc,KAAK2M,KAAKqI,iBAAiB9M,EAAO+T,gBAGpCjc,KAAK6Z,OAAOnO,MAChB,aACA,GAAGwP,0BAAmCvM,KAAKoN,UAAUlU,gDAAsD8G,KAAKoN,UAAU7T,EAAOiK,aAG5HjK,EAAOiK,QAChB,CAEQ,mBAAM6J,CAAc7J,GAC1B,GAAwB,MAApBA,EAAS3E,OAAgB,CAC3B,IAAI0O,EAAe,WAAW/J,EAAS3E,uBAAuB2E,EAASgK,cACvE,IACE,MAAMC,QAAajK,EAASiK,OACxBA,GAAQA,EAAKC,iBACfH,GAAgB,iBAAiBE,EAAKE,gCAAgCF,EAAKC,kBAE/E,CAAE,MAAOE,GAAkB,CAC3B,MAAM,IAAIrR,MAAMgR,EAClB,CAEA,MAAMvP,QAAawF,EAASiK,OAE5B,GAAyB,MAArBzP,EAAK2P,YACP,MAAM,IAAIpR,MAAM,eAAeyB,EAAK2P,4BAA4B3P,EAAK0P,kBAGvE,OAAO1P,CACT,EChJK,MAAM6P,GAMX,WAAAzX,CACEiN,EACArF,EAAa,IAAIiH,GACjB6I,EAAuB,IAAI7C,GAC3B8C,EAAwD,KAAM,GAE9D1c,KAAKgS,SAAWA,EAChBhS,KAAK2M,KAAOA,EACZ3M,KAAKyc,UAAYA,EACjBzc,KAAK0c,2BAA6BA,CACpC,CAEO,iBAAM5C,GACX,MAAMf,QAAe/Y,KAAK2c,mBAE1B,aAAa3c,KAAKyc,UAAU3C,YAAYf,EAC1C,CAEO,8CAAM6D,CAAyCC,GAAoB,GAExE,IAAIrP,EAASsP,aAAaC,QAAQ,GAGlC,QAAsB,IAAXvP,IAA2BqP,EAAU,CAC9C,MAAM,MAAEG,EAAK,iBAAEC,SAA2Bjd,KAAK8Z,cAC/CgD,aAAaI,QACX,EACCF,GAASC,EACN,EACA,GAGNzP,EAASsP,aAAaC,QAAQ,EAChC,CAEA,OAAOvP,IAAW,CACpB,CAEO,eAAMyM,CAAUrB,GACrB,MAAMG,QAAe/Y,KAAK2c,mBAE1B,OAAO3c,KAAKyc,UAAUxC,UAAU,IAC3BlB,EACHH,YAEJ,CAEO,qBAAMsB,GACX,MAAMnB,QAAe/Y,KAAK2c,mBAK1B,aAFM3c,KAAK2M,KAAK6L,2BAA2BvT,KAAKkY,OAEzCnd,KAAKyc,UAAUvC,gBAAgBnB,EACxC,CAEO,oBAAMoB,GAKX,SAHsCna,KAAK2M,KAAK4K,iCAI9C,MAAM,IAAIrM,MAAM,qDAGlB,MAAM6N,QAAe/Y,KAAK2c,mBACpBvH,QAAepV,KAAK2M,KAAK0I,YAG/B,IAAKD,EAAOgI,UACV,MAAM,IAAIlS,MAAM,kDAIlB,MAAMiH,QAAiBnS,KAAKyc,UAAUtC,eAAe,IAChDpB,EACHsE,WAAYjI,EAAOgI,UACnBE,WAAYlI,EAAOmI,UACnBC,WAAYpI,EAAOqI,YAYrB,aARMzd,KAAK2M,KAAKyK,6BAA4B,GAG5C0F,aAAaI,QAAQ,EAA0C,GAG/Dld,KAAKgS,SAASxF,cAAc,WAAY,CAAC,GAElC2F,CACT,CAEO,sBAAMiI,GACX,MAAMrB,QAAe/Y,KAAK2c,mBACpBxK,QAAiBnS,KAAKyc,UAAUrC,iBAAiBrB,GAQvD,OALA+D,aAAaI,QAAQ,EAA0C,GAG/Dld,KAAKgS,SAASxF,cAAc,cAAe,CAAC,GAErC2F,CACT,CAEO,kBAAMkI,GACX,MAAMtB,QAAe/Y,KAAK2c,mBAEpBxK,QAAiBnS,KAAKyc,UAAUpC,aAAatB,GAWnD,aARM/Y,KAAK2M,KAAKyK,6BAA4B,GAG5C0F,aAAaI,QAAQ,EAA0C,GAG/Dld,KAAKgS,SAASxF,cAAc,cAAe,CAAC,GAErC2F,CACT,CAEO,0BAAMmI,CAAqBoD,EAAcC,EAAkCC,EAAmC,CAAC,GACpH,MAAM7E,QAAe/Y,KAAK2c,mBAE1B,aAAa3c,KAAKyc,UAAUnC,qBAAqB,IAC5CvB,EACH2E,OACAE,YAEJ,CAEO,cAAMrD,CAASmD,EAAcC,EAAkCC,EAAmC,CAAC,GACxG,MAAM7E,QAAe/Y,KAAK2c,mBAE1B,aAAa3c,KAAKyc,UAAUlC,SAAS,IAChCxB,EACH2E,OACAE,YAEJ,CAEO,aAAMpD,CAAQqD,GACnB,GAAI7d,KAAK0c,6BACP,OAAOhV,QAAQE,OAAO,IAAIsD,MAAM,8BAElC,MAAM,KAAEoJ,EAAI,YAAEwJ,KAAgB/E,SAAiB/Y,KAAK2c,mBAC9CtG,QAAcrW,KAAK2M,KAAK2J,WAW9B,OARID,SACIrW,KAAKyc,UAAU5B,aAAa,IAC7B9B,EACH1C,QACAwH,SAIG7d,KAAKyc,UAAUjC,QAAQ,IACzBzB,EACHzE,OACAwJ,cACAD,QAEJ,CAEO,aAAMpD,GACX,MAAM1B,QAAe/Y,KAAK2c,mBAE1B,OAAO3c,KAAKyc,UAAUhC,QAAQ1B,EAChC,CAEO,kBAAM2B,CAAa1E,EAAyB+H,GAAW,GAC5D,GAAI/d,KAAK0c,6BACP,OAAOhV,QAAQE,OAAO,IAAIsD,MAAM,8BAElC,MAAM,KACJoJ,EACAwJ,YAAaE,KACVjF,SACK/Y,KAAK2c,mBACTsB,QAAmBje,KAAK2M,KAAK8H,gBAE7BvL,EAAK,GAAG8M,IAGR7D,QAAiBnS,KAAKyc,UAAU/B,aAAa,IAC9C3B,EACHzE,OACA0B,OAAQ9M,EACRgV,UAA+C,KAAnC,IAAKjZ,MAAQK,oBACzBwY,YAAaG,IAWf,aAPMje,KAAK2M,KAAKoJ,UAAU7M,GAGtB6U,SACI/d,KAAK2M,KAAKuJ,2BAA0B,GAGrC/D,CACT,CAEO,mBAAMwI,CAActE,EAAe0H,GAAW,GACnD,GAAI/d,KAAK0c,6BACP,OAAOhV,QAAQE,OAAO,IAAIsD,MAAM,8BAElC,IAAK,iBAAiBiT,KAAK9H,GACzB,OAAO3O,QAAQE,OAAO,IAAIsD,MAAM,yBAElC,MACEoJ,KAAM8J,EACNN,YAAaE,KACVK,SACKre,KAAK2c,mBAGTxK,QAAiBnS,KAAKyc,UAAU9B,cAAc,IAC/C0D,EACHhI,QACA6H,UAA+C,KAAnC,IAAKjZ,MAAQK,sBAW3B,aAPMtF,KAAK2M,KAAKyJ,SAASC,GAGrB0H,SACI/d,KAAK2M,KAAK4J,0BAAyB,GAGpCpE,CACT,CAEO,uBAAMmM,CAAkB5H,EAAgBqH,GAAW,GACxD,GAAI/d,KAAK0c,6BACP,OAAOhV,QAAQE,OAAO,IAAIsD,MAAM,8BAElC,IAAK,cAAciT,KAAKzH,GACtB,OAAOhP,QAAQE,OAAO,IAAIsD,MAAM,6CAElC,MAAM,YAAE8I,EAAW,OAAEgC,SAAiBhW,KAAK2c,mBAErCxK,QAAiBnS,KAAKyc,UAAUtC,eAAe,CACnDnG,cACAgC,SACA1B,KAAMoC,EACNoH,YAAa,KASf,aANM9d,KAAK2M,KAAK8J,aAAaC,GAEzBqH,SACI/d,KAAK2M,KAAKiK,8BAA6B,GAGxCzE,CACT,CAEO,4BAAMoM,CAAuB7H,EAAgBqH,GAAW,GAC7D,GAAI/d,KAAK0c,6BACP,OAAOhV,QAAQE,OAAO,IAAIsD,MAAM,8BAElC,IAAK,0BAA0BiT,KAAKzH,GAClC,OAAOhP,QAAQE,OAAO,IAAIsD,MAAM,gDAElC,MAAM,YAAE8I,EAAW,OAAEgC,SAAiBhW,KAAK2c,mBAErCxK,QAAiBnS,KAAKyc,UAAUtC,eAAe,CACnDnG,cACAgC,SACA1B,KAAMoC,EACNoH,YAAa,KASf,aANM9d,KAAK2M,KAAKmK,kBAAkBJ,GAE9BqH,SACI/d,KAAK2M,KAAKqK,mCAAkC,GAG7C7E,CACT,CAEO,eAAM2I,CAAU3T,EAAeqX,GACpC,GAAIxe,KAAK0c,6BACP,OAAOhV,QAAQE,OAAO,IAAIsD,MAAM,8BAElC,MAAM6N,QAAe/Y,KAAK2c,mBAEpB3X,EAAO,IAAIC,KACXwT,EAAOzT,EAAKK,UACZoZ,EAAenb,KAAK8B,MAAMqT,EAAO,KACjCiG,EAAmBD,EAAgBzZ,EAAKM,oBAAsB,GAAK,KAInEqZ,QAAwB3e,KAAK2M,KAAK4L,qBAExC,GAAIoG,GAAmBA,EAAgBC,OAAS3Z,KAAKkY,MAAO,CAC1D,GAAIqB,EAAoB,QACtB,OAAO9W,QAAQE,OAAO,IAAIsD,MAAM,sCAGlCsT,EAAa,IACRA,EACHK,QAASF,EAAgBG,YAE7B,OAGM9e,KAAK2M,KAAK2L,wBAAmBxE,GAEnC,MAAM3B,QAAiBnS,KAAKyc,UAAU3B,UAAU,IAC3C/B,EACH5R,QACAsX,eACAC,mBACAF,eASF,OANIrM,GAAYA,EAASrD,MACvB9O,KAAKgS,SAASxF,cAAc,sBAAuB,CACjDsC,KAAMqD,EAASrD,OAIZqD,CACT,CAEO,sBAAMD,CAAiBb,EAAgB,GAC5C,MAAM0H,QAAe/Y,KAAK2c,mBAEpB1D,QAAiBjZ,KAAK2M,KAAKuM,0BAC3BC,QAAwBnZ,KAAK2M,KAAKyM,0BAExC,OAAOpZ,KAAKyc,UAAUvK,iBAAiB,IAClC6G,EACH1H,QACA0N,UAAW9F,EACX+F,kBAAmB7F,GAEvB,CAEO,iBAAMpL,CAAYC,EAAeR,GACtC,MAAMuL,QAAe/Y,KAAK2c,mBAE1B,OAAO3c,KAAKyc,UAAU1O,YAAY,IAC7BgL,EACHkG,WAAYjR,EACZR,SACAiL,MAAM,IAAKxT,MAAQI,WAEvB,CAEO,eAAM0V,CAAUmE,GACrB,MAAMnG,QAAe/Y,KAAK2c,mBACpB/D,QAAiB5Y,KAAK2M,KAAKkM,cAE3B5D,EAAM2D,GAAYA,EAASuG,YAAcvG,EAASuG,WAAW/D,WAEnE,GAAKnG,EAIL,OAAOjV,KAAKyc,UAAU1B,UAAU,IAC3BhC,KACAmG,GACFjK,EACL,CAEO,iBAAM+F,CAAYwD,GACvB,MAAMzF,QAAe/Y,KAAK2c,mBAE1B,OAAO3c,KAAKyc,UAAUzB,YAAY,IAC7BjC,KACAyF,GAEP,CAEO,yBAAMvD,CAAoBpT,GAC/B,GAAI7H,KAAK0c,6BACP,OAAOhV,QAAQE,OAAO,IAAIsD,MAAM,8BAGlC,MAAMkU,QAAwBpf,KAAK2M,KAAKsH,qBAClCoL,QAAoBrf,KAAK2M,KAAKiI,iBAC9BqJ,QAAmBje,KAAK2M,KAAK8H,gBAC7BK,QAAiB9U,KAAK2M,KAAKoI,cAC3B8C,QAAgB7X,KAAK2M,KAAKmL,gBAC1B1C,QAAepV,KAAK2M,KAAK0I,YACzBf,QAAatU,KAAK2M,KAAK4H,UAEvB+K,EAA0C,CAC9CtL,YAAaoL,KACVvX,GAGL,GAAIA,EAAQ0X,QAAS,CACnBD,EAAYC,QAAUC,OAAO3X,EAAQ0X,eACTvf,KAAK2M,KAAKsJ,cAChBqJ,EAAYC,gBAC1Bvf,KAAK2M,KAAKoJ,UAAUuJ,EAAYC,eAChCvf,KAAK2M,KAAKuJ,2BAA0B,GAE9C,CAEA,GAAIrO,EAAQwO,MAAO,CACjB,IAAK,iBAAiB8H,KAAKtW,EAAQwO,OACjC,OAAO3O,QAAQE,OAAO,IAAIsD,MAAM,+BAEPlL,KAAK2M,KAAK2J,aAChBzO,EAAQwO,cACrBrW,KAAK2M,KAAKyJ,SAASvO,EAAQwO,aAC3BrW,KAAK2M,KAAK4J,0BAAyB,GAE7C,CAEA,GAAI1O,EAAQ4X,iBAAkB,CAC5B,IAAK,cAActB,KAAKtW,EAAQ4X,kBAC9B,OAAO/X,QAAQE,OAAO,IAAIsD,MAAM,mDAEHlL,KAAK2M,KAAKgK,iBAChB9O,EAAQ4X,yBACzBzf,KAAK2M,KAAK8J,aAAa5O,EAAQ4X,wBAC/Bzf,KAAK2M,KAAKiK,8BAA6B,GAEjD,CAEA,GAAI/O,EAAQ6X,sBAAuB,CACjC,IAAK,0BAA0BvB,KAAKtW,EAAQ6X,uBAC1C,OAAOhY,QAAQE,OAAO,IAAIsD,MAAM,sDAEElL,KAAK2M,KAAKoK,sBAChBlP,EAAQ6X,8BAC9B1f,KAAK2M,KAAKmK,kBAAkBjP,EAAQ6X,6BACpC1f,KAAK2M,KAAKqK,mCAAkC,GAEtD,CAQA,GANIsI,EAAYxK,eACR9U,KAAK2M,KAAKkI,YAAYyK,EAAYxK,UAExCwK,EAAYxK,SAAWA,GAGpBwK,EAAYK,SAAU,CACzB,MAAMA,EAA+C,KAAnC,IAAK1a,MAAQK,oBAC/Bga,EAAYK,SAAWH,OAAOG,EAChC,CAEA,IAAKL,EAAYM,cAAgBxK,EAAOgI,UAAW,CACjD,MAAMyC,EAAyB,CAC7BvL,KAAMA,EACNwL,SAAU7B,EACVZ,WAAYjI,EAAOgI,UACnB2C,YAAalI,GAGf,GAAIzC,EAAOqI,WAAarI,EAAOmI,WAAa8B,EAAa,CACvD,MAAMW,EAAmC,CAAC,EACtC5K,EAAOqI,YAAWuC,EAAYxC,WAAapI,EAAOqI,WAClDrI,EAAOmI,YAAWyC,EAAY1C,WAAalI,EAAOmI,WAClD8B,IAAaW,EAAYC,QAAUZ,GACvCQ,EAAWK,aAAeF,CAC5B,CAEAV,EAAYM,aAAe,CAACC,EAC9B,CAEA,MAAM1N,QAAiBnS,KAAKyc,UAAUxB,oBAAoBqE,GAQ1D,OANIA,EAAYM,cAAczW,eACtBnJ,KAAK2M,KAAKyK,6BAA4B,GAC5C0F,aAAaI,QAAQ,EAA0C,GAC/Dld,KAAKgS,SAASxF,cAAc,WAAY,CAAC,IAGpC2F,CACT,CAEO,eAAMgO,GAMX,MAAO,CACLf,sBAN4Bpf,KAAK2M,KAAKsH,qBAOtCK,WANiBtU,KAAK2M,KAAK4H,mBACLvU,KAAK2M,KAAK0I,qBACTrV,KAAK2M,KAAKqM,gBAQrC,CAEQ,sBAAM2D,GACZ,MAAMyC,QAAwBpf,KAAK2M,KAAKsH,qBAClCK,QAAatU,KAAK2M,KAAK4H,UACvByB,QAAehW,KAAK2M,KAAKsJ,YACzBgI,QAAmBje,KAAK2M,KAAK8H,gBAC7B4K,QAAoBrf,KAAK2M,KAAKiI,iBAC9BE,QAAiB9U,KAAK2M,KAAKoI,cAC3B8C,QAAgB7X,KAAK2M,KAAKmL,gBAIhC,MAAO,CACL9D,YAAaoL,EACb9K,KAAMA,EAEN0B,OAAQA,GAAU1B,EAClBwJ,YAAaG,EACbmC,aAAcf,EACdM,SATmD,KAAnC,IAAK1a,MAAQK,oBAU7BwP,SAAUA,EACVuL,EAAGxI,EAEP,EC5hBK,MAAMyI,GAqBX,WAAAvb,CAAYwb,GACVvgB,KAAKugB,OAASA,EAEdvgB,KAAKwgB,UAAYxgB,KAAKygB,kBACtBzgB,KAAK0gB,SAAW1gB,KAAK2gB,iBACrB3gB,KAAK4gB,QAAU5gB,KAAK6gB,gBACpB7gB,KAAK8gB,WAAa9gB,KAAK+gB,mBACvB/gB,KAAKghB,UAAYhhB,KAAKihB,kBAEtBjhB,KAAKkhB,SAAWlhB,KAAKmhB,UAErBnhB,KAAKohB,0BAA4BphB,KAAKqhB,uBACtCrhB,KAAKshB,0BAA4BthB,KAAKuhB,0BAEtCvhB,KAAKwhB,UAAYxhB,KAAKyhB,kBACtBzhB,KAAK0hB,gBAAkB1hB,KAAK2hB,mBAC9B,CAGA,UAAIC,GACF,OAAO5hB,KAAK4gB,OACd,CAEA,YAAIiB,GACF,OAAO7hB,KAAKwgB,SACd,CAEA,WAAIsB,GACF,OAAO9hB,KAAK0gB,QACd,CAEA,4BAAIqB,GACF,OAAO/hB,KAAKohB,yBACd,CAEA,4BAAIY,GACF,OAAOhiB,KAAKshB,yBACd,CAIA,YAAIxB,GACF,OAAO9f,KAAKwhB,SACd,CAEA,kBAAIS,GACF,OAAOjiB,KAAK0hB,eACd,CAEA,eAAAjB,GACE,MAAO,WAAYzgB,KAAKugB,QAAU2B,UAAUC,UAAUtU,QAAQ,WAAa,CAC7E,CAEA,cAAA8S,GACE,OAAiD,IAA1CuB,UAAUC,UAAUtU,QAAQ,WAA2D,IAAxCqU,UAAUC,UAAUtU,QAAQ,MACpF,CAEA,aAAAgT,GACE,OAAOqB,UAAUC,UAAUtU,QAAQ,SAAW,CAChD,CAEA,gBAAAkT,GACE,OAAiE,IAA1DmB,UAAUC,UAAUC,cAAcvU,QAAQ,UACnD,CAEA,eAAAoT,GACE,MAAO,SAAS9C,KAAK+D,UAAUC,YAC1B,aAAahE,KAAK+D,UAAUG,UAC3BriB,KAAK0gB,WACL1gB,KAAK4gB,OACb,CAEA,OAAAO,GACE,MAAO,aAAce,YAAkE,IAArDA,UAAUpC,SAASsC,cAAcvU,QAAQ,MAC7E,CAEA,oBAAAwT,GACE,QAASa,UAAUI,eAAiB,gBAAiBtiB,KAAKugB,QAAU,iBAAkBvgB,KAAKugB,MAC7F,CAKA,uBAAAgB,GACE,OAAQvhB,KAAKwgB,WAAaxgB,KAAKkhB,UAAclhB,KAAKohB,4BAA8BphB,KAAK4gB,OACvF,CAKA,eAAAa,GACE,IAAI3B,EAA4B,GAEhC,QAAQ,GACN,KAAK9f,KAAKwgB,UACUV,EAAY,GAC9B,MAEF,KAAK9f,KAAK0gB,UAAY1gB,KAAKghB,UACPlB,EAAY,GAC9B,MAEF,KAAK9f,KAAK8gB,WACWhB,EAAY,GAC/B,MAEF,KAAK9f,KAAK4gB,QACQd,EAAY,IAIhC,OAAOA,CACT,CAKA,iBAAA6B,GACE,MAAM,UAAEQ,GAAcD,UAChBK,EAAoBJ,EAAUK,MAAM,gBAC1C,GAA0B,OAAtBD,EACF,MAAO,SAASA,EAAkB,KAGpC,MAAME,EAAmBN,EAAUK,MAAM,iBACzC,GAAyB,OAArBC,EACF,MAAO,QAAQA,EAAiB,KAIlC,MAAMC,EAAkBP,EAAUK,MAAM,gBACxC,GAAwB,OAApBE,EACF,MAAO,QAAQA,EAAgB,KAGjC,IAAIF,EAAQL,EAAUK,MAAM,oDAAsD,GAClF,MAAO,CAAEvC,EAAU,IAAMuC,EAEzBA,EAAQA,EAAM,GAAK,CAACvC,EAASuC,EAAM,IAAM,CAACN,UAAUS,QAAST,UAAUU,WAAY,MACnF,MAAM/K,EAAUsK,EAAUK,MAAM,sBAKhC,OAJgB,OAAZ3K,GACF2K,EAAMK,OAAO,EAAG,EAAGhL,EAAQ,IAGtB2K,EAAMM,KAAK,IACpB,EC3JK,MAAMC,GAMX,WAAAhe,CAAY6H,EAAUD,EAAYuS,GAChClf,KAAK4M,IAAMA,EACX5M,KAAK2M,KAAOA,EACZ3M,KAAKkf,OAASA,CAChB,CAEO,aAAA8D,GACL,OAAOC,aAAaC,UACtB,CAEO,wBAAAC,GACL,OAAOnjB,KAAKgjB,kBAAoB,CAClC,CAEO,wBAAAI,GACL,OAAOpjB,KAAKgjB,kBAAoB,CAClC,CAEO,+BAAMK,GACX,OAAOrjB,KAAK2M,KAAK0K,6BACnB,CAEO,mBAAMiM,SACLL,aAAaM,mBACrB,CAEO,eAAMlO,GACX,OAAOrV,KAAK2M,KAAK0I,WACnB,CAEO,eAAMmO,CAAUC,GACrB,MAAMC,EAAsBD,SAAsBzjB,KAAK2jB,eAGvD,IAF4B3jB,KAAKmjB,2BAK/B,YAFA5X,EAAOlD,MAAM,sDAKf,MAAM+U,EAAYpd,KAAK4jB,aAAaF,GAC9BG,EAAUH,EAAoB/P,OAAO,UACrCmQ,EAAQJ,EAAoB/P,OAAO,QAEzC,IAAKkQ,IAAYC,EACf,MAAM,IAAI5Y,MAAM,gCAGlB,MAAM6Y,EAASC,KAAKxE,OAAOyE,aAAaC,MAAM1E,OAAQ,IAAI2E,WAAWN,KAC/DO,EAAOJ,KAAKxE,OAAOyE,aAAaC,MAAM1E,OAAQ,IAAI2E,WAAWL,WAE7D9jB,KAAK2M,KAAKwI,UAAU,CACxBsI,UAAWsG,EACX3G,UAAWA,EACXG,UAAW6G,EACXC,SAAUX,EAAoBW,iBAI1BrkB,KAAK4M,IAAIuN,gBACjB,CAEO,iBAAMmK,GAEX,MAAMxZ,QAAqB9K,KAAKukB,+BAG1Bd,QAAqB3Y,EAAa0Z,YAAYC,wBAG9CzkB,KAAK2M,KAAKwI,UAAU,CAAC,SAGrBnV,KAAK2M,KAAKyK,6BAA4B,SAGtCpX,KAAK4M,IAAIwN,mBAEVqJ,SAKCA,EAAaa,aACrB,CAEO,qBAAMI,GACX,OAAO1kB,KAAK4M,IAAIgQ,0CAClB,CAEO,4BAAM+H,GAEX,MAAMC,QAAuB5kB,KAAK2M,KAAKwK,0BACjC+L,EAAaljB,KAAKgjB,gBAExB,GAAI4B,IAAmB1B,EAGrB,aAFMljB,KAAK2M,KAAKuK,wBAAwBgM,IAEjC,EAIT,MAAMvH,QAAoB3b,KAAK6kB,iBACzBC,EAA4B9kB,KAAK4jB,aAAajI,GAE9CoJ,QAAoC/kB,KAAK2M,KAAK0I,YAG9C2P,EAAoBF,KAFCC,GAA+BA,EAA4B3H,WAAa,IAI7F6H,QAAuBjlB,KAAK2M,KAAK8I,oBAEvC,OAAQuP,GAAqBC,CAC/B,CAEQ,kCAAMV,GACZ,IAAKvkB,KAAK8K,aAAc,OAChB9K,KAAKklB,wBAEX,MAAMjQ,QAAYjV,KAAK2M,KAAKuL,sBAC5BlY,KAAK8K,mBAAqBoX,UAAUI,cAAc6C,gBAAgBlQ,SAE3DjV,KAAK8K,aAA2Csa,QACzD,CAEA,IAAKplB,KAAK8K,aACR,MAAM,IAAII,MAAM,kDAGlB,OAAOlL,KAAK8K,YACd,CAEQ,2BAAMoa,GACZ,MAAMjQ,QAAYjV,KAAK2M,KAAKuL,sBACtBE,QAAcpY,KAAK2M,KAAK0L,wBAM9B,IAAIgN,EAAa,SALQrlB,KAAK2M,KAAKmL,wBACA9X,KAAK2M,KAAKqL,4BAO3CqN,EAAa,gBAAgBriB,aAGzBkf,UACHI,cACAgD,SAAS,GAAGrQ,IAAMoQ,IAAc,CAC/BjN,SAEN,CAEQ,kBAAMuL,GACZ,IACE,aAAa3jB,KAAKulB,sBACpB,CAAE,MAAOld,GAMP,OALAjB,QAAQiB,MAAMA,SAIRrI,KAAKskB,cACJtkB,KAAKulB,sBACd,CACF,CAEQ,0BAAMA,GAEZ,MAAMza,QAAqB9K,KAAKukB,+BAC1BiB,QAA6BxlB,KAAKuV,0BAExC,OAAOzK,EAAa0Z,YAAYhB,UAAU,CACxCiC,iBAAiB,EACjBD,qBAAsBA,EAAuBxlB,KAAK0lB,sBAAsBF,GAAwC,MAEpH,CAEQ,oBAAMX,GACZ,MAAM/Z,QAAqB9K,KAAKukB,+BAChC,aAAazZ,EAAa0Z,YAAYC,iBACxC,CAEQ,YAAAb,CAAaH,GACnB,OAAKA,EAIEA,EAAaY,SAHX,EAIX,CAEQ,6BAAM9O,GACZ,aAAavV,KAAK2M,KAAK4I,yBACzB,CAEQ,qBAAAmQ,CAAsBC,GAC5B,MACMC,GAAUD,EADA,IAAIE,QAAQ,EAAIF,EAAaxc,OAAS,GAAK,IAExDhG,QAAQ,KAAM,KACdA,QAAQ,KAAM,KAEX2iB,EAAUC,KAAKH,GACfI,EAAc,IAAI7B,WAAW2B,EAAQ3c,QAE3C,IAAK,IAAIpJ,EAAI,EAAGA,EAAI+lB,EAAQ3c,SAAUpJ,EACpCimB,EAAYjmB,GAAK+lB,EAAQG,WAAWlmB,GAEtC,OAAOimB,CACT,ECxNK,MAAME,GAKX,WAAAnhB,CACE6H,EACAD,EACAuS,GAEAlf,KAAK4M,IAAMA,EACX5M,KAAKkf,OAASA,EACdlf,KAAK2M,KAAOA,CACd,CAEO,aAAAqW,GACL,MAAM,WAAEE,GAAeljB,KAAKmmB,oBAE5B,OAAOjD,CACT,CAEO,wBAAAC,GACL,OAAOnjB,KAAKgjB,kBAAoB,CAClC,CAEO,wBAAAI,GACL,OAAOpjB,KAAKgjB,kBAAoB,CAClC,CAEO,+BAAMK,GACX,aAAarjB,KAAK2M,KAAK0K,6BACzB,CAEO,mBAAMiM,GACX,MAEM7W,EAAU,CACduH,kBAHwBhU,KAAK2M,KAAKsH,qBAIlCK,WAHiBtU,KAAK2M,KAAK4H,WAM7B,OAAO,IAAI7M,QAASC,IAGlBye,OAAOC,iBAAiB9C,kBACtBvjB,KAAKkf,OAAO9D,YAAc,2CAC1Bpb,KAAKkf,OAAOoH,cACZ7Z,EACA,IAAM9E,MAGZ,CAEO,SAAA0N,GACL,OAAOrV,KAAK2M,KAAK0I,WACnB,CAEO,eAAMmO,GAGX,IAF4BxjB,KAAKmjB,2BAK/B,YAFA5X,EAAOlD,MAAM,sDAKf,MAAM,YAAEke,GAAgBvmB,KAAKmmB,0BAEvBnmB,KAAK2M,KAAKwI,UAAU,CACxBiI,UAAWmJ,UAGPvmB,KAAK4M,IAAIuN,gBACjB,CAEO,iBAAMmK,SAELtkB,KAAK2M,KAAKwI,UAAU,CAAC,SAGrBnV,KAAK2M,KAAKyK,6BAA4B,SAGtCpX,KAAK4M,IAAIwN,kBACjB,CAEO,qBAAMsK,GACX,OAAO1kB,KAAK4M,IAAIgQ,0CAClB,CAEO,4BAAM+H,GAEX,MAAM6B,QAA2BxmB,KAAK2M,KAAKiJ,mBAErC6Q,OAD0D,IAAvBD,GACkBxmB,KAAKkf,OAAOoH,gBAAkBE,QAEnFxmB,KAAK2M,KAAK+I,iBAAiB1V,KAAKkf,OAAOoH,eAG7C,MAAM1B,QAAuB5kB,KAAK2M,KAAKwK,0BACjC+L,EAAaljB,KAAKgjB,gBAExB,OAAI4B,IAAmB1B,SACfljB,KAAK2M,KAAKuK,wBAAwBgM,IAEjC,GAGFuD,CACT,CAEQ,iBAAAN,GACN,OAAOC,OAAOC,iBAAiBnD,WAAWljB,KAAKkf,OAAOoH,cACxD,ECzGK,MAAMI,GAoBX,WAAA3hB,GAnBO,KAAA4hB,OAAiB,EAiBjB,KAAAC,eAAsC,CAAC,EA2BvC,KAAA1a,gBAAkB,CACvBvI,EACAwI,IACSnM,KAAKgS,SAAS9F,gBAAgBvI,EAAMwI,GAcxC,KAAAG,mBAAqB,CAC1B3I,EACAwI,IACSnM,KAAKgS,SAAS1F,mBAAmB3I,EAAMwI,GAc3C,KAAAK,cAAgB,CACrB7I,EACA8I,IACWzM,KAAKgS,SAASxF,cAAc7I,EAAM8I,GAMxC,KAAApB,MAAQ,CACb,aAAMwb,GACJ,MAAM/d,QAAc6B,EAAW9B,SAC/BzB,QAAQuD,IAAI7B,EACd,EACA,mBAAMge,GACJ,MAAMhe,QAAcgB,EAASjB,SAC7BzB,QAAQuD,IAAI7B,EACd,EACA,kBAAMie,UACgB/b,EAAenC,UAC7B9B,QAAShH,GAAWqH,QAAQuD,IAAI5K,GACxC,GA/EAC,KAAKgS,SAAW,IAAI/F,GAEpBjM,KAAK2M,KAAO,IAAIiH,GAChB5T,KAAKyc,UAAY,IAAI7C,GAAU5Z,KAAK2M,MAEpC3M,KAAK4M,IAAM,IAAI4P,GAAIxc,KAAKgS,SAAUhS,KAAK2M,KAAM3M,KAAKyc,UAAW,IAAMzc,KAAKgnB,yBAExEhnB,KAAKinB,gBAAkB,IAAI3G,GAAgBxd,KAC3C9C,KAAK6M,WAAa,IAAIkF,GAAmB/R,KAAKgS,SAAUhS,KAAK2M,KAAM3M,KAAK4M,KACxE5M,KAAKknB,QAAU,IAAI,GAAoBlnB,KAAK2M,KAAM3M,KAAK4M,IAAK5M,KAAK6M,WACnE,CAgGO,IAAAjD,CAAKud,GACV,GAAI1jB,EAAW0jB,GACbnnB,KAAKonB,wBAAwB,EAAiCD,OADhE,CAKA,IAAKpe,MAAMC,QAAQme,GACjB,MAAM,IAAIjc,MAAM,oBAGlB,GAAmB,SAAfic,EAAQ,GACVnnB,KAAKqnB,WAAWF,EAAQ,IAAIG,MAAOC,IACjCngB,QAAQiB,MAAM,yCAA0Ckf,UAErD,IAAKvnB,KAAKonB,wBAAwBD,EAAQ,GAAIA,EAAQ,IAE3D,MADA/f,QAAQuD,IAAI,6BAA8Bwc,GACpC,IAAIjc,MAAM,mBAZlB,CAcF,CAOO,eAAMsY,CAAUgE,GAAmB,GACxC,GAAIxnB,KAAKgnB,wBACP,MAAM,IAAI9b,MAAM,8BAMlB,GAH4BlL,KAAKynB,OAAOrE,2BAGf,CAEvBpjB,KAAKgS,SAASxF,cAAc,sCAAuC,CAAC,SAK9DxM,KAAKynB,OAAOnE,gBAElB,MAAMJ,EAAaljB,KAAKynB,OAAOzE,gBAG/BhjB,KAAKgS,SAASxF,cAAc,sCAAuC,CAAE0W,cACvE,CAEA,MAAMA,EAAaljB,KAAKynB,OAAOzE,gBACzB0E,QAA6B1nB,KAAK2M,KAAK0K,8BACvCsQ,QAAyB3nB,KAAK4M,IAAIgQ,0CAAyC,GAGjF,GAAIsG,IAAe,EAA8B,CAC/CljB,KAAKgS,SAASxF,cAAc,qBAAsB,CAAC,GASnD,QARuBmb,IAAqBD,GAEvBF,UACbxnB,KAAKynB,OAAOjE,iBAGpBxjB,KAAKgS,SAASxF,cAAc,YAAa,CAAC,EAG5C,CAGA,GAAI0W,IAAe,EAOjB,OANAljB,KAAKgS,SAASxF,cAAc,oBAAqB,CAAC,QAE9Cmb,SACI3nB,KAAKynB,OAAOnD,cAKxB,CAMO,iBAAMA,GACX,UACQtkB,KAAKynB,OAAOnD,aACpB,CAAE,MAAOjc,GAEP,MADAkD,EAAOlD,MAAMA,EAAO,yCACdA,CACR,CACF,CAMO,oBAAMuf,SACL5nB,KAAKwjB,WAAU,EACvB,CAMO,kBAAAqE,GACL,OAAO/K,aAAaC,QAAQ,KAA8C,CAC5E,CAEO,oBAAA+K,GACL,OAAOhL,aAAaC,QAAQ,KAA8C,CAC5E,CAMO,kBAAMgL,GACX,OAAO/nB,KAAK4M,IAAIgQ,0CAClB,CAMO,4BAAMoL,GAGX,aAFsChoB,KAAK2M,KAAK4K,gCAGlD,CAQO,6BAAMC,CAAwByQ,GAAqB,GAGxD,SAFMjoB,KAAK2M,KAAK6K,wBAAwByQ,GAEpCA,EAAW,CACbjoB,KAAKgnB,yBAA0B,QACzBhnB,KAAK2M,KAAK+K,sBAAqB,SAC/B1X,KAAKkoB,aACiBloB,KAAKynB,OAAOtE,mCAEhCnjB,KAAK4M,IAAIuN,uBACTna,KAAKmoB,WAEf,YACQnoB,KAAK4M,IAAIwN,mBAGjBpa,KAAKgS,SAASxF,cAAc,+BAAgC,CAAEyb,cAE9D,MAAMhK,QAAmBje,KAAK2M,KAAK8H,sBAC7BzU,KAAK4M,IAAIkO,UzBvPe,cyBuPyB,CACrDsN,QAASH,EACTnK,YAAaG,GAEjB,CAMO,yBAAMoK,GACX,MAAMpK,QAAmBje,KAAK2M,KAAK8H,sBAE7BzU,KAAK4M,IAAIkO,UzBnQc,ayBmQyB,CACpDtN,QAAQ,EACRsQ,YAAaG,UAGTje,KAAK4M,IAAIyN,qBACTra,KAAK2M,KAAKkH,iBAEV7T,KAAK2M,KAAK+K,sBAAqB,EACvC,CAMO,aAAM4Q,GACX,aAAatoB,KAAK2M,KAAK4H,SACzB,CAMO,kBAAMqP,GACX,MAAM,UAAExG,SAAoBpd,KAAK2M,KAAK0I,YAEtC,OAAO+H,CACT,CAMO,eAAMnH,GACX,aAAajW,KAAK2M,KAAKsJ,WACzB,CAKO,eAAMkK,GACX,aAAangB,KAAK4M,IAAIuT,WACxB,CAMO,wBAAA6B,GACL,OAAOhiB,KAAKinB,gBAAgBjF,wBAC9B,CAEO,+BAAMuG,GACX,MACEpY,UAAU,MAAE/B,GACZgC,UAAU,OAAEsL,EAAM,SAAE8M,EAAQ,KAAEnY,IAC5BC,aAEEtQ,KAAK4M,IAAImO,UAAU,CACvB3M,QACAqa,SAAU,GAAG/M,IAAS8M,IACtBvT,IAAK5E,GAET,CAEQ,gBAAMgX,CAAWtO,GACvB/Y,KAAK0oB,WAAa,IACb/lB,KACAoW,GAGL,MAAM4P,EAAc7L,aAAaC,QzB/WE,uByBmXnC,GAHAxR,EAAOC,SAASmd,GAAe5P,EAAO6P,UAAY,UAG7C5oB,KAAKgiB,2BACR,OAGF,IAAKjJ,EAAOqG,gBACV,MAAM,IAAIlU,MAAM,gCAIlB,MAAM2d,GAA+C,IAAhC9P,EAAO+P,qBACtBC,QAAmC/oB,KAAK2M,KAAK8K,0BAC7CuR,QAAuChpB,KAAK2M,KAAK4K,kCAGpDsR,IAA+C,IAA/BE,IACiB,IAA/BA,GACAC,KAEHhpB,KAAKgnB,yBAA0B,GAIjC,MAAMiC,QAA+BjpB,KAAK2M,KAAKsH,qBACzCiV,QAAwBlpB,KAAKkpB,kBAsBnC,KArBkCD,GAA0BA,IAA2BlQ,EAAOqG,iBAG9D8J,WACxBlpB,KAAK2M,KAAK0H,QAAQ,UAClBrU,KAAK2M,KAAKoJ,kBACV/V,KAAK2M,KAAKyJ,kBAGZpW,KAAK2M,KAAKoH,mBAAmBgF,EAAOqG,uBAGpCpf,KAAK2M,KAAK6H,cAAcxU,KAAKinB,gBAAgBxF,yBAC7CzhB,KAAK2M,KAAK+H,eAAe1U,KAAKinB,gBAAgBtF,2BAC9C3hB,KAAK2M,KAAKkI,YAAYkE,EAAO8E,MAAMsL,UAAYjH,UAAUpN,gBAGzD9U,KAAK2M,KAAKqI,iBAAiB+D,EAAOqQ,cAAgB,UAClDppB,KAAK2M,KAAKuH,YAAY6E,EAAOsC,UAAY,UACzCrb,KAAK2M,KAAKiL,cvBxaX,UuB0aA5X,KAAKgnB,wBA+BRhnB,KAAKgS,SAASxF,cAAc,yBAA0B,CAAC,OA/BtB,OAC3BxM,KAAKkoB,aAGX,UACQloB,KAAK6M,WAAWgE,gBACxB,CAAE,MAAOxI,GACPkD,EAAOG,MAAM,QAASrD,EACxB,CAEA,MAAMghB,QAAqBrpB,KAAK2M,KAAK4M,kBAErC,GAAI8P,EAAc,CAChB,MAAM,KAAEte,EAAI,QAAE0B,GAAY4c,EAC1BrpB,KAAKspB,kCAAkCve,EAAM0B,SACvCzM,KAAK2M,KAAK2M,gBAAgB,KAClC,CAIA,GAAItZ,KAAKinB,gBAAgBpF,SAAU,CACjC,MAAM0H,EAAU,SACV7L,EAAO8L,mBAAmBrZ,SAASC,SAASsN,MAE9C6L,EAAQpL,KAAKT,IACf1d,KAAK4M,IACF2N,SAASgP,EAAQE,KAAK/L,GAAO,IAC7BnV,KAAK,IAAMgI,QAAQmZ,UAAU,KAAM,GAAI,KAE9C,CACF,CAGF,CAEQ,gBAAMxB,SACNloB,KAAK2pB,mBAEL3pB,KAAK4pB,mBAEL5pB,KAAK+H,aAEL/H,KAAKmoB,iBAGwBnoB,KAAK2M,KAAK4I,gCAErCvV,KAAK6pB,sBAAsB7pB,KAAK0oB,YAEtCnd,EAAOlD,MAAM,kGAIfrI,KAAK2mB,OAAQ,EACb3mB,KAAKgS,SAASxF,cAAc,QAAS,CAAC,GAElC,kBAAmB0V,YACrBA,UAAUI,cAAcwH,UAAa3iB,GAAwBnH,KAAK+pB,uBAAuB5iB,IAG3F2V,aAAaI,QAAQ,0BAA2B,QAGhD/M,SAAS3D,cAAc,IAAIwd,YAAY,wBAAyB,CAC9DC,OAAQ,CACNC,GAAIlqB,QAGV,CAEQ,gBAAM2pB,CAAWQ,GAAkB,SACtBnqB,KAAK2M,KAAK4H,YAChB4V,SACLnqB,KAAK2M,KAAK0H,QAAQrU,KAAK0oB,WAAWtJ,gBAAkB,IAAMpc,IAEpE,CAEQ,qBAAMkmB,GACZ,MAAM,OAAElT,GAAWhW,KAAK0oB,WAClB0B,QAAqBpqB,KAAK2M,KAAKsJ,YAC/BoU,QAAyBrqB,KAAK2M,KAAKwJ,4BAEzC,QAASH,GAAqB,YAAXA,GAAwBA,IAAWoU,IAAiBC,CACzE,CAOQ,oBAAMC,GACZ,MAAMpH,EAAaljB,KAAKynB,OAAOzE,gBAEZ,YAAfE,SACIljB,KAAK2M,KAAKuK,wBAAwBgM,GAG1C,MAAM8D,QAAgChnB,KAAK2M,KAAK4K,iCAC1CgT,QAAsBvqB,KAAK2M,KAAKgL,uBAChC6S,QAA0BxqB,KAAKynB,OAAO9C,yBAE5C,GAAIqC,GAA2BuD,EAG7B,kBAFMvqB,KAAKskB,cAKTkG,UACIxqB,KAAKskB,oBACLtkB,KAAK2M,KAAKyK,6BAA4B,SACtCpX,KAAK2M,KAAK6I,mBAAkB,IAGpC,MAAMkS,QAA6B1nB,KAAK2M,KAAK0K,8BAGvCoT,QAAmBzqB,KAAK4M,IAAIgQ,0CAAyC,GAG3E,OAAQsG,GACN,KAAK,EAGHljB,KAAKgS,SAASxF,cAAc,qBAAsB,CAAC,GAG/Cie,SACIzqB,KAAKskB,cAGb,MAGF,KAAK,EAEHtkB,KAAKgS,SAASxF,cAAc,oBAAqB,CAAC,GAG9Cie,SACIzqB,KAAKskB,cAGb,MACF,KAAK,EAEHtkB,KAAKgS,SAASxF,cAAc,qBAAsB,CAAC,GAG/Ckb,GAAwB+C,SACpBzqB,KAAKskB,gBAKRmG,IAAe/C,GAAwB8C,UACpCxqB,KAAKwjB,WAAU,GAK7B,CAMQ,sBAAAuG,CAAuB5iB,GAC7B,MAAM,KAAEwF,EAAO,CAAC,GAAMxF,GAAS,CAAC,GAC1B,KAAE4D,EAAO,GAAE,QAAE0B,EAAU,CAAC,GAAME,GAAQ,CAAC,EAC7C3M,KAAKspB,kCAAkCve,EAAM0B,EAC/C,CASQ,UAAM1E,CAAK2iB,GACjB,IAAIC,QAAgC3qB,KAAK2M,KAAK+L,6BAC9C,MAAMkS,EAAc3lB,KAAKkY,MAEpBwN,IACHA,EAA0B,IAIGD,KADCE,EAAcD,EzBxmBd,eyB+mB1B3qB,KAAK2M,KAAK6L,2BAA2BoS,SACrC5qB,KAAK4M,IAAIsN,kBACjB,CAEQ,cAAMiO,GACZ,MAAMpP,EAAS/Y,KAAK0oB,WAGd0B,QAAqBpqB,KAAK2M,KAAKsJ,YAEjC8C,EAAO/C,QAA4B,YAAlB+C,EAAO/C,QAAwB+C,EAAO/C,SAAWoU,SAC9DpqB,KAAK4M,IAAI8N,aAAa3B,EAAO/C,QAAQ,GAG7C,MAAM6U,EAAuE,CAC3E,CACE1M,KAAMxQ,UACJ,SAAU3N,KAAK2M,KAAK6J,2BAClB,OAAO,EAET,MAAMsU,QAAoB9qB,KAAK2M,KAAK2J,WACpC,QAASyC,EAAO1C,OAAS0C,EAAO1C,QAAUyU,GAE5CC,KAAMpd,gBACE3N,KAAK4M,IAAI+N,cAAc5B,EAAO1C,OAAQ,KAGhD,CACE8H,KAAMxQ,UACJ,SAAU3N,KAAK2M,KAAKkK,+BAClB,OAAO,EAET,MAAMmU,QAAwBhrB,KAAK2M,KAAKgK,eACxC,QAASoC,EAAOkS,WAAalS,EAAOkS,YAAcD,GAEpDD,KAAMpd,gBACE3N,KAAK4M,IAAI0R,kBAAkBvF,EAAOkS,WAAY,KAGxD,CACE9M,KAAMxQ,UACJ,SAAU3N,KAAK2M,KAAKsK,oCAClB,OAAO,EAET,MAAMiU,QAA6BlrB,KAAK2M,KAAKoK,oBAC7C,QAASgC,EAAOoS,gBAAkBpS,EAAOoS,iBAAmBD,GAE9DH,KAAMpd,gBACE3N,KAAK4M,IAAI2R,uBAAuBxF,EAAOoS,gBAAiB,KAGlE,CACEhN,KAAMxQ,WACKoL,EAAO8E,KAElBkN,KAAMpd,gBACE3N,KAAK4M,IAAI4N,QAAQzB,EAAO8E,eAI9BnW,QAAQ2B,IAAIwhB,EAAMpkB,IAAIkH,MAAOyd,IACjC,UACYA,EAAOjN,cACTiN,EAAOL,MAEjB,CAAE,MAAOxD,GACPngB,QAAQiB,MAAM,4CAA6Ckf,EAC7D,IAEJ,CAEQ,gBAAMqC,GACZ,MAAM1K,QAAelf,KAAK4M,IAAIqN,UAAU,CACtC,aACA,YACA,cACA,SACA,wBAEIrB,EAAWsG,GAAUA,EAAOtG,SAGlC,SAFM5Y,KAAK2M,KAAKgM,YAAYC,GAExBA,EAAU,CAQZ,GANIA,EAASuG,YAAcvG,EAASuG,WAAWkM,gBACvCvhB,EAASW,IzB9oBS,mByB8oBuBmO,EAASuG,WAAW/D,YACnEpb,KAAKuoB,6BAIH3P,EAAS0S,QAAU1S,EAAS0S,OAAOniB,OAAQ,CAClByP,EAAS0S,OAAOC,KACxCpkB,GAA2BA,IAAU,IAGtCnH,KAAKwrB,0BAET,CAGA,GAAI5S,EAAS6S,UAAW,CACtB,MAAMC,QAA0B1rB,KAAK2M,KAAK4I,gCAEpCvV,KAAK2M,KAAK2I,wBAAwBsD,EAAS6S,WAC7CC,IAAsB9S,EAAS6S,iBAC3BzrB,KAAK2M,KAAK6I,mBAAkB,EAEtC,CACF,CACF,CAEQ,2BAAMqU,CAAsB9Q,SAC5B/Y,KAAK2M,KAAKkJ,4BAA4BkD,EAAO4S,gCAC7C3rB,KAAK2M,KAAKmJ,4BAA4BiD,EAAO6S,gCAC7C5rB,KAAK2M,KAAKsL,oBAAoBc,EAAOlW,wBACrC7C,KAAK2M,KAAKwL,sBAAsBY,EAAOX,aAEvCpY,KAAK2M,KAAKmM,cAAcC,SAExB/Y,KAAK6rB,aAGX,UACQ7rB,KAAKsqB,gBACb,CAAE,MAAOjiB,GACPkD,EAAOlD,MAAMA,EAAO,sCACtB,CACF,CAEQ,gBAAMwjB,GACZ,GAAI7rB,KAAKinB,gBAAgBpF,SAAU,CACjC,MAAQiK,oBAAqBxF,SAAwBtmB,KAAK2M,KAAKqM,gBAE/D,OAAKsN,OAKLtmB,KAAKynB,OAAS,IAAIvB,GAAkBlmB,KAAK4M,IAAK5M,KAAK2M,KAAM,CAAE2Z,wBAJzD/a,EAAOlE,KAAK,gFAOhB,CAEAkE,EAAOlE,KAAK,CACV0a,yBAA0B/hB,KAAKinB,gBAAgBlF,2BAG7C/hB,KAAKinB,gBAAgBlF,2BACvB/hB,KAAKynB,OAAS,IAAI1E,GAAmB/iB,KAAK4M,IAAK5M,KAAK2M,KAAM,CAAC,GAE/D,CAEO,wBAAA6e,GACL,MACErb,UAAU,MAAE/B,GACZgC,UAAU,KAAEC,IACVC,OAEJtQ,KAAK4M,IAAIkO,UAAU,EAAgC,CACjD7F,IAAK5E,EACLjC,MAAOA,EACP0P,YAAa9d,KAAKinB,gBAAgBnH,UAEtC,CAQQ,uBAAAsH,CAAwBrc,EAAcoB,GAC5C,IAAI4f,GAAY,EAEhB,QAAQ,GACN,IzBrwB8B,WyBqwBzBhhB,EACHoB,IACA,MAEF,KAAKpB,IAAS,EACZ,GAAI/K,KAAK2mB,MAAO,CACdxa,EAAQnM,KAAK4M,KACb,KACF,CAEA5M,KAAKgS,SAAS9F,gBACZ,QACA,IAAMC,EAAQnM,KAAK4M,MAErB,MAEF,KAAK7B,KAAQrH,EACX1D,KAAKgS,SAAS9F,gBACZxI,EAAgBqH,GAAMpH,KACrB8I,IACC,MAAM,KAAE/L,GAASgD,EAAgBqH,GACjCoB,EAAQnM,KAAK4M,IAAKlM,EAAO+L,EAAQ/L,QAAQoT,KAG7C,MAEF,QACEiY,GAAY,EAGhB,OAAOA,CACT,CAEQ,iCAAAzC,CAAkCve,EAAc0B,GACtD,OAAQ1B,GACN,KAAK,EACH/K,KAAKgS,SAASxF,cAAc,eAAgB,CAAEwf,aAAcvf,IAC5D,MAEF,KAAK,EACHzM,KAAKgS,SAASxF,cAAc,oBAAqB,CAAEwf,aAAcvf,IACjE,MAEF,KAAK,EACHzM,KAAKgS,SAASxF,cAAc,oBAAqB,CAAEwf,aAAcvf,IACjE,MAEF,KAAK,EACHzM,KAAKgS,SAASxF,cAAc,wBAAyB,CAAExB,QAASyB,IAGtE,E","sources":["webpack://web-push-notifications/webpack/universalModuleDefinition","webpack://web-push-notifications/webpack/bootstrap","webpack://web-push-notifications/webpack/runtime/define property getters","webpack://web-push-notifications/webpack/runtime/hasOwnProperty shorthand","webpack://web-push-notifications/webpack/runtime/make namespace object","webpack://web-push-notifications/./src/core/constants.ts","webpack://web-push-notifications/./src/core/defaultInitParams.ts","webpack://web-push-notifications/./src/core/functions.ts","webpack://web-push-notifications/./src/core/legacyEventsMap.ts","webpack://web-push-notifications/./src/modules/storage/migrations/constants.ts","webpack://web-push-notifications/./src/modules/storage/migrations/helpers.ts","webpack://web-push-notifications/./src/modules/storage/migrations/26-11-2018.ts","webpack://web-push-notifications/./src/modules/storage/migrations/initial.ts","webpack://web-push-notifications/./src/modules/DateModule.ts","webpack://web-push-notifications/./src/modules/storage/migrations/Migrations.ts","webpack://web-push-notifications/./src/modules/storage/migrations/MigrationExecutor.ts","webpack://web-push-notifications/./src/core/storage.ts","webpack://web-push-notifications/./src/modules/storage/version.ts","webpack://web-push-notifications/./src/core/logger.ts","webpack://web-push-notifications/./src/core/modules/EventBus/EventBus.ts","webpack://web-push-notifications/./src/modules/InboxMessagesPublic.ts","webpack://web-push-notifications/./src/modules/storage/Store.ts","webpack://web-push-notifications/./src/modules/storage/Storage.ts","webpack://web-push-notifications/./src/models/InboxMessages.ts","webpack://web-push-notifications/./src/modules/Data/Data.ts","webpack://web-push-notifications/./src/modules/ApiClient/ApiClient.ts","webpack://web-push-notifications/./src/modules/Api/Api.ts","webpack://web-push-notifications/./src/modules/PlatformChecker/PlatformChecker.ts","webpack://web-push-notifications/./src/services/PushService/drivers/PushServiceDefault/PushServiceDefault.ts","webpack://web-push-notifications/./src/services/PushService/drivers/PushServiceSafari/PushServiceSafari.ts","webpack://web-push-notifications/./src/core/Pushwoosh.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export const DEFAULT_SERVICE_WORKER_URL = '/pushwoosh-service-worker.js';\nexport const DEFAULT_API_URL = 'https://cp.pushwoosh.com/json/1.3/';\n\nexport const PERIOD_SEND_APP_OPEN = 3600000;\nexport const PERIOD_GOAL_EVENT = 86400000;\n\nexport const DEFAULT_NOTIFICATION_TITLE = 'Pushwoosh notification';\nexport const DEFAULT_NOTIFICATION_IMAGE = 'https://cp.pushwoosh.com/img/logo-medium.png';\n\n// Keys\nexport const KEY_SHOW_SUBSCRIBE_WIDGET = 'WIDGET_SHOWED';\nexport const KEY_CLICK_SUBSCRIBE_WIDGET = 'WIDGET_CLICKED';\n\n// Local storage keys\nexport const KEY_DEVICE_REGISTRATION_STATUS: string = 'deviceRegistrationStatus';\nexport const KEY_SAFARI_PREVIOUS_PERMISSION = 'safariPreviousPermission';\nexport const MANUAL_SET_LOGGER_LEVEL = 'PW_SET_LOGGER_LEVEL';\n\n// Device registration status\nexport const DEVICE_REGISTRATION_STATUS_REGISTERED: string = 'registered';\nexport const DEVICE_REGISTRATION_STATUS_UNREGISTERED: string = 'unregistered';\n\n// Permissions\nexport const PERMISSION_DENIED = 'denied';\nexport const PERMISSION_GRANTED = 'granted';\nexport const PERMISSION_PROMPT = 'default';\n\n// Events\nexport const LEGACY_EVENT_ON_LOAD = 'onLoad';\nexport const LEGACY_EVENT_ON_READY = 'onReady';\nexport const LEGACY_EVENT_ON_SUBSCRIBE = 'onSubscribe';\nexport const LEGACY_EVENT_ON_UNSUBSCRIBE = 'onUnsubscribe';\nexport const LEGACY_EVENT_ON_REGISTER = 'onRegister';\nexport const LEGACY_EVENT_ON_PERMISSION_PROMPT = 'onPermissionPrompt';\nexport const LEGACY_EVENT_ON_PERMISSION_DENIED = 'onPermissionDenied';\nexport const LEGACY_EVENT_ON_PERMISSION_GRANTED = 'onPermissionGranted';\nexport const LEGACY_EVENT_ON_SW_INIT_ERROR = 'onSWInitError';\nexport const LEGACY_EVENT_ON_PUSH_DELIVERY = 'onPushDelivery';\nexport const LEGACY_EVENT_ON_NOTIFICATION_CLICK = 'onNotificationClick';\nexport const LEGACY_EVENT_ON_NOTIFICATION_CLOSE = 'onNotificationClose';\nexport const LEGACY_EVENT_ON_CHANGE_COMMUNICATION_ENABLED = 'onChangeCommunicationEnabled';\nexport const LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE = 'onPutNewMessageToInboxStore';\nexport const LEGACY_EVENT_ON_UPDATE_INBOX_MESSAGES = 'onUpdateInboxMessages';\nexport const LEGACY_EVENT_ON_SHOW_NOTIFICATION_PERMISSION_DIALOG = 'onShowNotificationPermissionDialog';\nexport const LEGACY_EVENT_ON_HIDE_NOTIFICATION_PERMISSION_DIALOG = 'onHideNotificationPermissionDialog';\n\nexport const LEGACY_EVENT_ON_SHOW_SUBSCRIPTION_WIDGET = 'onShowSubscriptionWidget';\nexport const LEGACY_EVENT_ON_HIDE_SUBSCRIPTION_WIDGET = 'onHideSubscriptionWidget';\n\n// Post Events\nexport const EVENT_SHOW_SUBSCRIBE_BUTTON = 'showSubscribeButton';\nexport const EVENT_CLICK_SUBSCRIBE_BUTTON = 'clickSubscribeButton';\nexport const EVENT_GDPR_CONSENT = 'GDPRConsent';\nexport const EVENT_GDPR_DELETE = 'GDPRDelete';\nexport const EVENT_PW_SITE_OPENED = 'PW_SiteOpened'; // for default events\n\n// Page visited\nexport const PAGE_VISITED_URL = 'PAGE_VISITED_URL';\n","import { DEFAULT_SERVICE_WORKER_URL } from './constants';\n\nexport const defaultInitParams = {\n autoSubscribe: true,\n serviceWorkerUrl: DEFAULT_SERVICE_WORKER_URL,\n} as const;\n","export function getGlobal() {\n return globalThis;\n}\n\ndeclare const __VERSION__: string;\nexport function getVersion() {\n return __VERSION__;\n}\n\n// API bad behavior with demo app notification payload fix\nexport function parseSerializedNotificationParams(param: any, defaultValue?: any) {\n if (typeof param === 'string') {\n try {\n return JSON.parse(param);\n } catch (e) {\n console.log(e);\n }\n }\n return param === undefined && defaultValue !== undefined ? defaultValue : param;\n}\n\n// Generates a UUID v4 string.\n// This function first tries to use crypto.randomUUID, which is supported in browsers since 2022.\n// If unavailable, it falls back to a manual UUID generation method.\n// In 2027, consider simplifying this function by removing the fallback.\nexport function v4() {\n return crypto.randomUUID?.() || 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport const isFunction = (value: any): value is ((...args: any[]) => any) => typeof value === 'function';\n","import * as CONSTANTS from './constants';\nimport type { EventName } from './events.types';\n\nexport const legacyEventsMap: Record<string, { name: EventName; prop?: string }> = {\n [CONSTANTS.LEGACY_EVENT_ON_REGISTER]: {\n name: 'register',\n },\n [CONSTANTS.LEGACY_EVENT_ON_SUBSCRIBE]: {\n name: 'subscribe',\n },\n [CONSTANTS.LEGACY_EVENT_ON_UNSUBSCRIBE]: {\n name: 'unsubscribe',\n },\n [CONSTANTS.LEGACY_EVENT_ON_SW_INIT_ERROR]: {\n name: 'initialize-service-worker-error',\n prop: 'error',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PUSH_DELIVERY]: {\n name: 'receive-push',\n prop: 'notification',\n },\n [CONSTANTS.LEGACY_EVENT_ON_NOTIFICATION_CLICK]: {\n name: 'open-notification',\n prop: 'notification',\n },\n [CONSTANTS.LEGACY_EVENT_ON_NOTIFICATION_CLOSE]: {\n name: 'hide-notification',\n prop: 'notification',\n },\n [CONSTANTS.LEGACY_EVENT_ON_CHANGE_COMMUNICATION_ENABLED]: {\n name: 'change-enabled-communication',\n prop: 'isEnabled',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE]: {\n name: 'receive-inbox-message',\n prop: 'message',\n },\n [CONSTANTS.LEGACY_EVENT_ON_UPDATE_INBOX_MESSAGES]: {\n name: 'update-inbox-messages',\n prop: 'messages',\n },\n [CONSTANTS.LEGACY_EVENT_ON_SHOW_NOTIFICATION_PERMISSION_DIALOG]: {\n name: 'show-notification-permission-dialog',\n },\n [CONSTANTS.LEGACY_EVENT_ON_HIDE_NOTIFICATION_PERMISSION_DIALOG]: {\n name: 'hide-notification-permission-dialog',\n prop: 'permission',\n },\n [CONSTANTS.LEGACY_EVENT_ON_SHOW_SUBSCRIPTION_WIDGET]: {\n name: 'show-subscription-widget',\n },\n [CONSTANTS.LEGACY_EVENT_ON_HIDE_SUBSCRIPTION_WIDGET]: {\n name: 'hide-subscription-widget',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PERMISSION_DENIED]: {\n name: 'permission-denied',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PERMISSION_PROMPT]: {\n name: 'permission-default',\n },\n [CONSTANTS.LEGACY_EVENT_ON_PERMISSION_GRANTED]: {\n name: 'permission-granted',\n },\n};\n","import { type TInboxMessagesStoreName, type TKeyValueStoreName, type TMainLogStoreName, type TMessageLogStoreName } from '../Storage.types';\n\nexport const STORE_NAME_KEY_VALUE: TKeyValueStoreName = 'keyValue';\nexport const STORE_NAME_MESSAGE_LOG: TMessageLogStoreName = 'messages';\nexport const STORE_NAME_MAIN_LOG: TMainLogStoreName = 'log';\nexport const STORE_NAME_INBOX_MESSAGES: TInboxMessagesStoreName = 'inboxMessages';\n\nexport const KEY_PATH_BASE_INCREMENT = 'id';\n","import { type TMigrationType, type TSdkStoreName } from '../Storage.types';\n\n/**\n * Check existed store, before create\n * @param name\n * @param storeCreator\n */\nexport function storeCreatorDecorator(name: TSdkStoreName, storeCreator: TMigrationType): TMigrationType {\n return function (database: IDBDatabase) {\n if (database.objectStoreNames.contains(name)) {\n return;\n }\n\n storeCreator(database);\n };\n}\n","import {\n STORE_NAME_INBOX_MESSAGES,\n} from './constants';\nimport { storeCreatorDecorator } from './helpers';\nimport {\n type TInboxMessagesIDBKeyPath,\n type TInboxMessagesIDBRemovalTimeIndex,\n type TInboxMessagesIDBStatusIndex,\n} from '../../../models/InboxMessages.types';\n\nfunction createInboxMessagesStore(database: IDBDatabase) {\n const keyPath: TInboxMessagesIDBKeyPath = 'inbox_id';\n const statusIndex: TInboxMessagesIDBStatusIndex = 'status';\n const removalTimeIndex: TInboxMessagesIDBRemovalTimeIndex = 'rt';\n\n const store = database.createObjectStore(STORE_NAME_INBOX_MESSAGES,\n { keyPath, autoIncrement: false },\n );\n store.createIndex(statusIndex, statusIndex, { unique: false, multiEntry: true });\n store.createIndex(removalTimeIndex, removalTimeIndex, { unique: false, multiEntry: true });\n}\n\nexport default [\n storeCreatorDecorator(STORE_NAME_INBOX_MESSAGES, createInboxMessagesStore),\n];\n","import {\n STORE_NAME_KEY_VALUE,\n STORE_NAME_MAIN_LOG,\n STORE_NAME_MESSAGE_LOG,\n KEY_PATH_BASE_INCREMENT,\n} from './constants';\nimport { storeCreatorDecorator } from './helpers';\n\n/**\n * Create keyValue store migration\n * @param database\n */\nfunction createKeyValueStore(database: IDBDatabase) {\n database.createObjectStore(STORE_NAME_KEY_VALUE, { keyPath: 'key' });\n}\n\n/**\n * Create log store migration\n * @param database\n */\nfunction createLogStore(database: IDBDatabase) {\n const logStore = database.createObjectStore(\n STORE_NAME_MAIN_LOG,\n { keyPath: KEY_PATH_BASE_INCREMENT, autoIncrement: true },\n );\n logStore.createIndex('environment', 'environment', { unique: false });\n logStore.createIndex('date', 'date', { unique: false });\n logStore.createIndex('type', 'type', { unique: false });\n}\n\n/**\n * Create message log store migration\n * @param database\n */\nfunction createMessageLogStore(database: IDBDatabase) {\n const messagesStore = database.createObjectStore(\n STORE_NAME_MESSAGE_LOG,\n { keyPath: KEY_PATH_BASE_INCREMENT, autoIncrement: true },\n );\n messagesStore.createIndex('date', 'date', { unique: false });\n}\n\nexport default [\n storeCreatorDecorator(STORE_NAME_KEY_VALUE, createKeyValueStore),\n storeCreatorDecorator(STORE_NAME_MAIN_LOG, createLogStore),\n storeCreatorDecorator(STORE_NAME_MESSAGE_LOG, createMessageLogStore),\n];\n","export default class DateModule {\n private _date: Date;\n\n constructor(date: Date = new Date()) {\n this._date = date;\n }\n\n set date(date: Date) {\n this._date = date;\n }\n\n get date() {\n return this._date;\n }\n\n /**\n * Timestamp in UTC without milliseconds\n */\n getUtcTimestamp() {\n return Math.floor((this.date.getTime() + this.date.getTimezoneOffset() * 60 * 1000) / 1000);\n }\n\n /**\n * Current date timestamp without milliseconds\n */\n getTimestamp() {\n return Math.round(this.date.getTime() / 1000);\n }\n\n /**\n * Set date to local timezone\n */\n setLocal() {\n const newDateTimestamp = this._date.getTime() - this.date.getTimezoneOffset() * 60 * 1000;\n this._date = new Date(newDateTimestamp);\n }\n\n /**\n * Add days to current date\n * @param days\n */\n addDays(days: number) {\n const newDateTimestamp = this._date.getTime() + days * 24 * 60 * 60 * 1000;\n this._date = new Date(newDateTimestamp);\n }\n\n /**\n * Get inbox fake order\n */\n getInboxFakeOrder(): string {\n return (this._date.getTime() * 100 + 25 * 60 * 60 * 1000 * 100).toString();\n }\n}\n","import { default as migrations26_11_2018 } from './26-11-2018';\nimport { default as migrationsInitial } from './initial';\nimport DateModule from '../../DateModule';\nimport { type TMigrationsObjectType, type TMigrationType } from '../Storage.types';\n\nexport default class Migrations {\n migrations: TMigrationsObjectType;\n dateModule: DateModule;\n\n constructor(dateModule: DateModule = new DateModule()) {\n this.migrations = {\n // initial migrations\n initial: migrationsInitial,\n\n // migrations for 2018-11-26\n '2018/11/26': migrations26_11_2018,\n };\n this.dateModule = dateModule;\n }\n\n /**\n * Initial migration pack\n */\n get initial(): Array<TMigrationType> {\n return this.migrations.initial;\n }\n\n /**\n * Return array of migrations packs sorted by date\n */\n get dateSorted(): Array<Array<TMigrationType>> {\n return Object.keys(this.migrations)\n .filter((key) => key !== 'initial') // remove initial migrations\n .sort((a, b) => { // sort migrations by date YYYY/MM/DD\n const dateA = new DateModule(new Date(a));\n const dateB = new DateModule(new Date(b));\n return dateA.getTimestamp() - dateB.getTimestamp();\n })\n .map((key) => this.migrations[key]); // Array of migrations packs, sorted by date\n }\n}\n","import Migrations from './Migrations';\nimport { type TMigrationType } from '../Storage.types';\n\nexport default class MigrationExecutor {\n db: IDBDatabase;\n migrationsBuilder: Migrations;\n\n constructor(\n db: IDBDatabase,\n migrationsBuilder: Migrations = new Migrations(),\n ) {\n this.db = db;\n this.migrationsBuilder = migrationsBuilder;\n }\n\n applyMigrations() {\n // apply initial migrations\n this.applyMigrationsPack(this.migrationsBuilder.initial);\n\n // apply migrations, sorted by date\n this.migrationsBuilder.dateSorted.forEach((migrationsPack) => {\n this.applyMigrationsPack(migrationsPack);\n });\n }\n\n applyMigrationsPack(migrationsPack: Array<TMigrationType>) {\n migrationsPack.forEach((migration) => {\n migration(this.db);\n });\n }\n}\n","import {\n STORE_NAME_KEY_VALUE,\n STORE_NAME_MAIN_LOG,\n STORE_NAME_MESSAGE_LOG,\n} from '../modules/storage/migrations/constants';\nimport MigrationExecutor from '../modules/storage/migrations/MigrationExecutor';\nimport { type IIDBOpenEventTargetWithResult } from '../modules/storage/Storage.types';\nimport version from '../modules/storage/version';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nfunction onversionchange(database: IDBDatabase, event: Event) {\n console.info('onversionchange', event);\n database.close();\n}\n\nlet databasePromise: Promise<IDBDatabase>;\nexport function getInstance(): Promise<IDBDatabase> {\n if (!databasePromise) {\n databasePromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request: IDBOpenDBRequest = indexedDB.open('PUSHWOOSH_SDK_STORE', version);\n request.onsuccess = (event) => {\n const database: IDBDatabase = (event.target as IIDBOpenEventTargetWithResult).result;\n database.onversionchange = onversionchange.bind(null, database, reject);\n resolve(database);\n };\n\n request.onerror = () => reject(request.error);\n\n request.onupgradeneeded = (event) => {\n const database: IDBDatabase = (event.target as IIDBOpenEventTargetWithResult).result;\n database.onversionchange = onversionchange.bind(null, database, reject);\n\n const migrationExecutor = new MigrationExecutor(database);\n migrationExecutor.applyMigrations();\n };\n });\n }\n return databasePromise;\n}\n\nfunction getInstanceWithPromise(executor: any): any {\n return getInstance().then((database) => (\n new Promise((resolve, reject) => executor(database, resolve, reject))\n ));\n}\n\nfunction createKeyValue(name: string) {\n return {\n get<K extends string, D>(key: K, defaultValue?: D) {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const request = database.transaction(name).objectStore(name).get(key);\n\n /** @TODO\n * we cant invoke \"resolve\" or \"reject\" in onsuccess or onerror because\n * it leads to bugs in Safari when we try to get permissions for notifications\n *\n * Checking status of request in setTimeout fixes this bug\n */\n let isComplete = false;\n let isError = false;\n let timeout: any;\n\n const check = () => {\n clearTimeout(timeout);\n if (isComplete) {\n resolve(request.result?.value || defaultValue);\n } else if (isError) {\n reject(request.error);\n } else {\n timeout = setTimeout(check, 0);\n }\n };\n\n request.onsuccess = () => isComplete = true;\n request.onerror = () => isError = true;\n check();\n });\n },\n\n getAll() {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const result: { [key: string]: any } = {};\n const cursor = database.transaction(name).objectStore(name).openCursor();\n let isComplete = false;\n let isError = false;\n let timeout: any;\n\n /** @TODO\n * we cant invoke \"resolve\" or \"reject\" in onsuccess or onerror because\n * it leads to bugs in Safari when we try to get permissions for notifications\n *\n * Checking status of request in setTimeout fixes this bug\n */\n const check = () => {\n clearTimeout(timeout);\n if (isComplete) {\n resolve(result);\n } else if (isError) {\n reject(cursor.error);\n } else {\n timeout = setTimeout(check, 0);\n }\n };\n\n cursor.onsuccess = (event) => {\n const cursorResult = (event.target as any).result;\n if (cursorResult) {\n result[cursorResult.key] = cursorResult.value.value;\n cursorResult.continue();\n } else {\n isComplete = true;\n }\n };\n cursor.onerror = () => isError = true;\n check();\n });\n },\n\n async extend(key: string, value: any) {\n const oldValues = await this.get(key);\n const { ...newValues } = value;\n await this.set(key, { ...oldValues, ...newValues });\n },\n\n set<K, D>(key: K, value: D) {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const request = database.transaction([name], 'readwrite').objectStore(name).put({ key, value });\n let isComplete = false;\n let isError = false;\n let timeout: any;\n\n /** @TODO\n * we cant invoke \"resolve\" or \"reject\" in onsuccess or onerror because\n * it leads to bugs in Safari when we try to get permissions for notifications\n *\n * Checking status of request in setTimeout fixes this bug\n */\n const check = () => {\n clearTimeout(timeout);\n if (isComplete) {\n resolve(key);\n } else if (isError) {\n reject(request.error);\n } else {\n timeout = setTimeout(check, 0);\n }\n };\n\n request.onsuccess = () => isComplete = true;\n request.onerror = () => isError = true;\n check();\n });\n },\n };\n}\n\nexport abstract class LogBase {\n protected abstract name: string;\n protected abstract maxItems: number;\n _add(obj: any) {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const request = database.transaction([this.name], 'readwrite').objectStore(this.name).add(obj);\n request.onsuccess = () => {\n resolve(obj);\n };\n request.onerror = () => {\n reject(request.error);\n };\n }).then((obj: any) => {\n return this.getAll().then((items: { id: number }[]) => {\n if (Array.isArray(items)) {\n const ids = items.map((i) => i.id).sort((a, b) => {\n if (a == b) return 0;\n return a < b ? 1 : -1;\n });\n if (ids.length > this.maxItems) {\n return Promise.all(ids.slice(this.maxItems).map((id) => this.delete(id))).then(() => obj);\n }\n }\n return obj;\n });\n });\n }\n\n delete(key: any) {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const request = database.transaction([this.name], 'readwrite').objectStore(this.name).delete(key);\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n getAll() {\n return getInstanceWithPromise((database: IDBDatabase, resolve: any, reject: any) => {\n const result: any[] = [];\n const cursor = database.transaction(this.name).objectStore(this.name).openCursor();\n cursor.onsuccess = (ev) => {\n const cursorResult = (ev.target as any).result;\n if (cursorResult) {\n if (cursorResult.value) {\n result.push(cursorResult.value);\n }\n cursorResult.continue();\n } else {\n resolve(result);\n }\n };\n cursor.onerror = () => {\n reject(cursor.error);\n };\n });\n }\n}\n\nexport class LogLog extends LogBase {\n protected name = STORE_NAME_MAIN_LOG;\n protected maxItems = 100;\n protected environment = (typeof self !== 'undefined' && self.registration) ? 'worker' : 'browser';\n add(type: string, message: any, additional?: any) {\n const obj: any = {\n type,\n environment: this.environment,\n message: `${message}`,\n date: new Date(),\n };\n if (message instanceof Error) {\n obj.stack = message.stack;\n }\n if (additional) {\n obj.additional = additional;\n }\n return this._add(obj);\n }\n}\n\nexport class LogMessage extends LogBase {\n protected name = STORE_NAME_MESSAGE_LOG;\n protected maxItems = 25;\n add(log: any) {\n return this._add({\n ...log,\n date: new Date(),\n });\n }\n}\n\nexport const keyValue = createKeyValue(STORE_NAME_KEY_VALUE);\nexport const log = new LogLog();\nexport const message = new LogMessage();\n","// indexed DB version\nexport default 7;\n","import { log as logStorage } from './storage';\n\nconst levels: { [key: string]: number } = {\n error: 1,\n info: 2,\n debug: 3,\n};\n\nlet limitLevel = 3;\n\ntype TWriteType = 'error' | 'apirequest' | 'info';\n\ninterface ILogger {\n setLevel(level: string): void;\n error(...args: any[]): void;\n info(...args: any[]): void;\n debug(...args: any[]): void;\n write(type: TWriteType, message: any, additional?: any): Promise<void>;\n isManualLevel(): boolean;\n [key: string]: any;\n}\n\nconst Logger: ILogger = {\n setLevel(level) {\n if (!levels[level]) {\n level = 'error';\n }\n limitLevel = levels[level];\n },\n write(type: TWriteType, message: any, additional?: any) {\n if (type === 'error') {\n this.error(message);\n } else {\n this.info(message);\n }\n return logStorage.add(type, message, additional);\n },\n} as ILogger;\n\nObject.keys(levels).forEach((levelName: string) => {\n const levelNumber = levels[levelName];\n Logger[levelName] = (...args: any[]) => {\n if (levelNumber <= limitLevel) {\n console.groupCollapsed(levelName);\n console.info('', ...args);\n console.trace('trace');\n console.groupEnd();\n }\n };\n});\n\nexport function logAndThrowError(error: string) {\n const logText = new Error(error);\n Logger.write('error', logText, 'logAndThrowError');\n throw logText;\n}\n\nexport function logAndRejectError(error: string, reject: (e: any) => void) {\n const logText = new Error(error);\n Logger.write('error', logText, 'logAndRejectError');\n reject(logText);\n}\n\nexport { Logger };\n","import { type EventHandlerMap, type EventName } from '../../events.types';\nimport { isFunction, v4 } from '../../functions';\n\ntype SavedEventHandlersMap = {\n // TODO: fix me: https://github.com/microsoft/TypeScript/issues/36390\n // [K in keyof EventHandlerMap]?: Array<EventHandlerMap[K]>\n [K in keyof EventHandlerMap]?: Array<unknown>\n};\n\nexport class EventBus {\n private readonly handlers: SavedEventHandlersMap;\n\n constructor() {\n this.handlers = {};\n }\n\n public addEventHandler = <Name extends EventName = EventName>(\n name: Name,\n handler: EventHandlerMap[Name],\n ): void => {\n let savedEventHandlers = this.handlers[name];\n if (!savedEventHandlers) {\n savedEventHandlers = [];\n }\n\n savedEventHandlers.push(handler);\n this.handlers[name] = savedEventHandlers;\n };\n\n public removeEventHandler = <Name extends EventName = EventName>(\n name: Name,\n handler: EventHandlerMap[Name],\n ): void => {\n const savedEventHandlers = this.handlers[name];\n if (!savedEventHandlers) {\n return;\n }\n\n this.handlers[name] = savedEventHandlers.filter((savedEventHandler) => (\n savedEventHandler !== handler\n ));\n };\n\n public dispatchEvent = <Name extends EventName = EventName>(\n name: Name,\n payload: Omit<Parameters<EventHandlerMap[Name]>[0], 'eventId'> & { eventId?: string },\n ): string => {\n const eventId = payload.eventId || v4();\n const savedEventHandlers = this.handlers[name];\n if (!savedEventHandlers) {\n return eventId;\n }\n\n savedEventHandlers.forEach((handler) => {\n if (!isFunction(handler)) {\n return;\n }\n\n setTimeout(() => {\n handler({ ...payload, eventId });\n }, 0);\n });\n\n return eventId;\n };\n}\n","import { type Api } from './Api/Api';\nimport { type Data } from './Data/Data';\nimport DateModule from './DateModule';\nimport { type default as InboxMessagesModel } from '../models/InboxMessages';\nimport {\n type IInboxMessage,\n type IInboxMessageActionParams,\n type IInboxMessagePublic,\n type IInboxMessages,\n type TInboxActionType,\n type TInboxMessageStatus,\n type TInboxMessageStatusDeleted,\n type TInboxMessageStatusOpen,\n type TInboxMessageStatusRead,\n type TInboxMessageType,\n type TInboxMessageTypeDeeplink,\n type TInboxMessageTypePlain,\n type TInboxMessageTypeRichmedia,\n type TInboxMessageTypeURL,\n} from '../models/InboxMessages.types';\n\nexport default class InboxMessages implements IInboxMessages {\n private readonly data: Data;\n private readonly api: Api;\n private readonly inboxModel: InboxMessagesModel;\n private dateModule: DateModule;\n\n constructor(\n data: Data,\n api: Api,\n inboxModel: InboxMessagesModel,\n dateModule: DateModule = new DateModule(),\n ) {\n this.data = data;\n this.api = api;\n this.inboxModel = inboxModel;\n this.dateModule = dateModule;\n\n this.publicMessageBuilder = this.publicMessageBuilder.bind(this);\n }\n\n /**\n * Get message type by IInboxMessageActionParams\n * @param actionParams\n */\n private messageTypeFactory(action_type: TInboxActionType, actionParams: IInboxMessageActionParams): TInboxMessageType {\n let messageType: TInboxMessageTypePlain = 0;\n if (action_type === 2) { // 2 is Richmedia Action Type for server loaded messages. See TInboxActionType typings comment.\n (<TInboxMessageTypeRichmedia>messageType) = 1;\n } else if ('l' in actionParams && actionParams.l != null) { // 'l' - URL and deeplink parameter\n if (actionParams.l.startsWith('http')) { // Deeplink parameter - relative URL; URL parameter - full URL\n (<TInboxMessageTypeURL>messageType) = 2;\n } else {\n (<TInboxMessageTypeDeeplink>messageType) = 3;\n }\n }\n\n return messageType;\n }\n\n /**\n * Update messages status using codes from arguments\n * @param codes\n * @param messages\n * @param status\n */\n private async updateMessagesStatusWithCodes(\n codes: Array<string>,\n messages: Array<IInboxMessage>,\n status: TInboxMessageStatus,\n ): Promise<void> {\n const updatedMessages: Array<IInboxMessage> = [];\n const inboxStatusQueries: Array<Promise<void>> = [];\n\n messages.forEach(async (msg) => {\n if (codes.indexOf(msg.inbox_id) === -1) {\n return;\n }\n\n msg.status = status;\n updatedMessages.push(msg);\n\n // Set inbox status to server\n inboxStatusQueries.push(this.api.inboxStatus(msg.order, msg.status));\n });\n\n await this.inboxModel.putBulkMessages(updatedMessages);\n await Promise.all(inboxStatusQueries);\n }\n\n /**\n * Build TInboxMessagePublic by TInboxMessage\n * @param message\n */\n async publicMessageBuilder({\n action_type,\n action_params,\n image,\n title,\n send_date,\n inbox_id,\n text,\n status,\n }: IInboxMessage): Promise<IInboxMessagePublic> {\n const imageUrl = image || await this.data.getDefaultNotificationImage();\n const inboxTitle = title || await this.data.getDefaultNotificationTitle();\n const actionParams = JSON.parse(action_params);\n\n this.dateModule.date = new Date(parseInt(send_date) * 1000);\n this.dateModule.setLocal();\n\n return {\n title: inboxTitle,\n imageUrl,\n code: inbox_id,\n message: text,\n sendDate: this.dateModule.date.toISOString(),\n type: this.messageTypeFactory(action_type, actionParams),\n link: actionParams?.l || '/',\n isRead: <TInboxMessageStatusRead> status === 2 || <TInboxMessageStatusOpen> status === 3,\n isActionPerformed: <TInboxMessageStatusOpen> status === 3,\n };\n }\n\n /**\n * Count of messages with no action performed\n */\n messagesWithNoActionPerformedCount(): Promise<number> {\n return this.inboxModel.getDeliveredReadMessagesCount();\n }\n\n /**\n * All unread messages\n */\n unreadMessagesCount() {\n return this.inboxModel.getDeliveredMessagesCount();\n }\n\n /**\n * All messages count\n */\n messagesCount(): Promise<number> {\n return this.inboxModel.messagesCount();\n }\n\n /**\n * Get all active messages\n */\n async loadMessages(): Promise<Array<IInboxMessagePublic>> {\n const readMessages = await this.inboxModel.getReadOpenMessages();\n const unreadMessages = await this.inboxModel.getDeliveredMessages();\n const buildMessagePromises = [...readMessages, ...unreadMessages]\n .sort((msgA: IInboxMessage, msgB: IInboxMessage) => { // sort by send date\n return parseInt(msgB.send_date, 10) - parseInt(msgA.send_date, 10);\n })\n .sort((msgA: IInboxMessage, msgB: IInboxMessage) => { // sort by order\n return parseInt(msgB.order || '0', 10) - parseInt(msgA.order || '0', 10);\n })\n .map(this.publicMessageBuilder);\n return Promise.all(buildMessagePromises);\n }\n\n /**\n * Mark messages as read\n * @param codes\n */\n async readMessagesWithCodes(codes: Array<string>): Promise<void> {\n const unreadMessages = await this.inboxModel.getDeliveredMessages();\n\n const statusRead: TInboxMessageStatusRead = 2;\n await this.updateMessagesStatusWithCodes(\n codes,\n unreadMessages,\n statusRead,\n );\n }\n\n /**\n * Execute message action. Type \"richmedia\" and \"plain\" does not support\n * @param code\n */\n async performActionForMessageWithCode(code: string): Promise<void> {\n const message = await this.inboxModel.getMessage(code);\n const actionParams = JSON.parse(message.action_params);\n const messageType = this.messageTypeFactory(message.action_type, actionParams);\n\n if (<TInboxMessageTypeURL>messageType === 2 && actionParams.l != null) {\n document.location.href = actionParams.l;\n } else if (<TInboxMessageTypeDeeplink>messageType === 3 && actionParams.l != null) {\n window.history.go(actionParams.l);\n }\n\n (<TInboxMessageStatusOpen>message.status) = 3;\n await this.inboxModel.putMessage(message);\n\n // Set inbox status to server\n await this.api.inboxStatus(message.order, message.status);\n }\n\n /**\n * Delete messages by codes\n * @param codes\n */\n async deleteMessagesWithCodes(codes: Array<string>): Promise<void> {\n const readMessages = await this.inboxModel.getReadOpenMessages();\n const unreadMessages = await this.inboxModel.getDeliveredMessages();\n\n const statusDeleted: TInboxMessageStatusDeleted = 4;\n await this.updateMessagesStatusWithCodes(\n codes,\n [...readMessages, ...unreadMessages],\n statusDeleted,\n );\n }\n\n /**\n * Sync inbox messages with server\n */\n async syncMessages() {\n await this.inboxModel.updateMessages();\n }\n}\n","import { type IIDBGetTransactionEventTargetWithResult, type TIDBKeyType, type TIDBQueryValue, type TSdkStoreName } from './Storage.types';\n\nexport default class Store {\n private readonly name: TSdkStoreName;\n private store: IDBObjectStore;\n private _index: IDBIndex;\n\n constructor(\n db: IDBDatabase,\n name: TSdkStoreName,\n ) {\n this.name = name;\n this.store = db.transaction(this.name, 'readwrite').objectStore(this.name);\n }\n\n set index(index: string) {\n const indexNames = this.store.indexNames;\n if (indexNames.contains(index)) {\n this._index = this.store.index(index);\n } else {\n console.warn(`Index \"${index}\" in `);\n }\n }\n\n private writeRequestPromise<T>(request: IDBRequest, result?: T): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => {\n // @ts-ignore\n resolve(result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n private readRequestPromise<Response, D>(request: IDBRequest, defaultValue?: D): Promise<Response | D> {\n return new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n const target: IIDBGetTransactionEventTargetWithResult = <IIDBGetTransactionEventTargetWithResult>event.target;\n // @ts-ignore\n resolve(<Response>target.result || defaultValue);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n put(data: any, key?: TIDBKeyType): Promise<TIDBKeyType> {\n const request = this.store.put(data, key);\n return this.writeRequestPromise<TIDBKeyType>(request, key);\n }\n\n /**\n * Fallback for old interface\n * @param data\n * @param key\n */\n add(data: any, key?: string): Promise<TIDBKeyType> {\n return this.put(data, key);\n }\n\n delete(key: TIDBKeyType): Promise<void> {\n const request = this.store.delete(key);\n return this.writeRequestPromise(request);\n }\n\n get<Response, D>(key: TIDBKeyType, defaultValue?: D) {\n const request = this.store.get(key);\n return this.readRequestPromise<Response, D>(request, defaultValue);\n }\n\n getAll<Response>(): Promise<Array<Response>> {\n const cursor = this.store.openCursor();\n const result: Array<Response> = [];\n\n return new Promise((resolve, reject) => {\n cursor.onsuccess = (event) => {\n const target: IIDBGetTransactionEventTargetWithResult = <IIDBGetTransactionEventTargetWithResult>event.target;\n const cursorResult = target.result;\n if (cursorResult) {\n result.push(cursorResult.value);\n cursorResult.continue();\n } else {\n resolve(result);\n }\n };\n cursor.onerror = () => {\n reject(cursor.error);\n };\n });\n }\n\n count(query?: IDBKeyRange): Promise<number> {\n const request = this.store.count(query);\n return this.readRequestPromise<number, number>(request, 0);\n }\n\n countByIndex(key?: TIDBQueryValue) {\n const request = this._index.count(key);\n return this.readRequestPromise<number, number>(request, 0);\n }\n}\n","import MigrationExecutor from './migrations/MigrationExecutor';\nimport { type IIDBOpenEventTargetWithResult, type TIDBKeyType, type TIDBQueryValue, type TSdkStoreName } from './Storage.types';\nimport Store from './Store';\nimport dbVersion from './version';\n\nexport default class Storage {\n db: Promise<IDBDatabase>;\n\n /**\n * Change database version handler\n * @param db\n * @param event\n */\n private dbVersionChangeHandler(db: IDBDatabase, event: IDBVersionChangeEvent) {\n console.info('onversionchange', event);\n db.close();\n }\n\n /**\n * Success database request handler\n * @param resolve\n * @param event\n */\n private dbRequestSuccessHandler(resolve: (db: IDBDatabase) => void, event: Event) {\n const target: IIDBOpenEventTargetWithResult = <IIDBOpenEventTargetWithResult>event.target;\n const database: IDBDatabase = target.result;\n\n // close db and resolve new db instance on version change\n database.onversionchange = (event: IDBVersionChangeEvent) => {\n this.dbVersionChangeHandler(database, event);\n };\n\n resolve(database);\n }\n\n /**\n * Need upgrade database version handler\n * @param event\n */\n private dbRequestUpgradeNeededHandler(event: Event) {\n const target: IIDBOpenEventTargetWithResult = <IIDBOpenEventTargetWithResult>event.target;\n const database: IDBDatabase = target.result;\n\n // close db and resolve new db instance on version change\n database.onversionchange = (event: IDBVersionChangeEvent) => {\n this.dbVersionChangeHandler(database, event);\n };\n\n // apply migrations\n const migrationExecutor = new MigrationExecutor(database);\n migrationExecutor.applyMigrations();\n }\n\n /**\n * Open db\n */\n getDB(): Promise<IDBDatabase> {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request: IDBOpenDBRequest = indexedDB.open('PUSHWOOSH_SDK_STORE', dbVersion);\n\n request.onsuccess = (event: Event) => {\n this.dbRequestSuccessHandler(resolve, event); // Existing db without updates\n };\n request.onupgradeneeded = (event: Event) => {\n this.dbRequestUpgradeNeededHandler(event); // Upgrade DB\n };\n request.onerror = () => reject(request.error); // Handle errors\n });\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/put\n * @param storeName\n * @param data\n * @param key\n */\n async put(storeName: TSdkStoreName, data: any, key?: string) {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.put(data, key);\n db.close();\n return result;\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/delete\n * @param storeName\n * @param key\n */\n async delete(storeName: TSdkStoreName, key: string | number) {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.delete(key);\n db.close();\n return result;\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/get\n * @param storeName\n * @param key\n * @param defaultValue\n */\n async get<Response, D>(\n storeName: TSdkStoreName,\n key: TIDBKeyType,\n defaultValue?: D,\n ): Promise<Response | D> {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.get<Response, D>(key, defaultValue);\n db.close();\n return result;\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/getAll\n * @param storeName\n */\n async getAll<Response>(\n storeName: TSdkStoreName,\n ): Promise<Array<Response>> {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.getAll<Response>();\n db.close();\n return result || [];\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/count\n * @param storeName\n * @param query\n */\n async count(\n storeName: TSdkStoreName,\n query?: IDBKeyRange,\n ): Promise<number> {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n const result = await store.count(query);\n db.close();\n return result;\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBIndex/count\n * @param storeName\n * @param indexName\n * @param key\n */\n async countByIndex(\n storeName: TSdkStoreName,\n indexName: string,\n key?: TIDBQueryValue,\n ): Promise<number> {\n const db = await this.getDB();\n const store = new Store(db, storeName);\n store.index = indexName;\n const result = await store.countByIndex(key);\n db.close();\n return result;\n }\n}\n","import {\n type IGetInboxMessagesResponse, type IInboxMessage, type TInboxMessagesIDBStatusIndex,\n type TInboxMessageStatusDelivered, type TInboxMessageStatusOpen,\n type TInboxMessageStatusRead, type TReadInboxMessagesStatusRange,\n} from './InboxMessages.types';\nimport { type EventBus } from '../core/modules/EventBus';\nimport { type Api } from '../modules/Api/Api';\nimport { type Data } from '../modules/Data/Data';\nimport DateModule from '../modules/DateModule';\nimport InboxMessagesPublic from '../modules/InboxMessagesPublic';\nimport Storage from '../modules/storage/Storage';\nimport { type TInboxMessagesStoreName } from '../modules/storage/Storage.types';\n\nexport default class InboxMessages {\n eventBus: EventBus;\n data: Data;\n api: Api;\n storage: Storage;\n storeName: TInboxMessagesStoreName;\n dateModule: DateModule;\n\n constructor(\n eventBus: EventBus,\n data: Data,\n api: Api,\n storage: Storage = new Storage(),\n dateModule: DateModule = new DateModule(),\n ) {\n this.eventBus = eventBus;\n this.data = data;\n this.api = api;\n\n this.storage = storage;\n this.storeName = 'inboxMessages';\n this.dateModule = dateModule;\n }\n\n /**\n * Get inbox messages by api\n */\n private async getInboxMessages(): Promise<IGetInboxMessagesResponse> {\n // get inbox messages\n const response: IGetInboxMessagesResponse = await this.api.getInboxMessages();\n await this.storeGetInboxMessagesRequestParams(response.next, response.new_inbox);\n\n return response;\n }\n\n /**\n * Store parameters for next getInboxMessages request\n * @param next\n * @param newMessagesCount\n */\n private async storeGetInboxMessagesRequestParams(next: string, newMessagesCount: number): Promise<void> {\n this.dateModule.date = new Date();\n await this.data.setInboxLastRequestTime(this.dateModule.getUtcTimestamp());\n\n await this.data.setInboxLastRequestCode(next);\n await this.data.setInboxNewMessagesCount(newMessagesCount);\n }\n\n /**\n * Put loaded messages. Add delete status to loaded messages if this status set locally.\n * @param messages\n */\n private async putServerMessages(messages: Array<IInboxMessage>): Promise<Array<string>> {\n const putTransactions = messages.map(async (message: IInboxMessage) => {\n const localMessage = await this.storage.get<IInboxMessage, object>(this.storeName, message.inbox_id, {});\n if ('status' in localMessage) {\n message.status = localMessage.status;\n }\n return this.putMessage(message);\n });\n\n return Promise.all(putTransactions);\n }\n\n /**\n * Create or update inbox message\n */\n putMessage(message: IInboxMessage): Promise<string> {\n return <Promise<string>> this.storage.put(this.storeName, message);\n }\n\n /**\n * Create or update messages pack\n * @param messages\n */\n putBulkMessages(messages: Array<IInboxMessage>): Promise<Array<string>> {\n const putTransactions = messages.map((message) => this.putMessage(message));\n return Promise.all(putTransactions);\n }\n\n /**\n * Delete messages by codes\n * @param codes\n */\n deleteMessages(codes: Array<string>): Promise<Array<void>> {\n const deleteTransactions = codes.map((code) => this.storage.delete(this.storeName, code));\n return Promise.all(deleteTransactions);\n }\n\n /**\n * Delete expired by removal time messages\n */\n async deleteExpiredMessages(): Promise<Array<void>> {\n this.dateModule.date = new Date();\n const upperBound = this.dateModule.getTimestamp().toString();\n const allMessages = await this.storage\n .getAll<IInboxMessage>(this.storeName);\n const codesToDelete = allMessages\n .filter((msg: IInboxMessage) => msg.rt < upperBound)\n .map((msg) => msg.inbox_id);\n return this.deleteMessages(codesToDelete);\n }\n\n /**\n * Get message by code\n * @param code - inbox_id\n */\n getMessage(code: string): Promise<IInboxMessage> {\n return this.storage.get<IInboxMessage, IInboxMessage>(this.storeName, code);\n }\n\n /**\n * Get all read messages\n */\n async getReadOpenMessages(): Promise<Array<IInboxMessage>> {\n const allMessages = await this.storage\n .getAll<IInboxMessage>(this.storeName);\n return allMessages\n .filter((msg: IInboxMessage) => <TInboxMessageStatusRead>msg.status === 2 || <TInboxMessageStatusOpen>msg.status === 3);\n }\n\n /**\n * Get all unread messages\n */\n async getDeliveredMessages(): Promise<Array<IInboxMessage>> {\n const allMessages = await this.storage\n .getAll<IInboxMessage>(this.storeName);\n return allMessages\n .filter((msg: IInboxMessage) => <TInboxMessageStatusDelivered>msg.status === 1);\n }\n\n /**\n * All messages count\n */\n async messagesCount(): Promise<number> {\n return this.storage.count(this.storeName);\n }\n\n /**\n * Get count of messages with status \"Delivered\"\n */\n async getDeliveredMessagesCount(): Promise<number> {\n const deliveredStatus: TInboxMessageStatusDelivered = 1;\n const statusIndexName: TInboxMessagesIDBStatusIndex = 'status';\n return this.storage\n .countByIndex(this.storeName, statusIndexName, deliveredStatus);\n }\n\n /**\n * Get count of messages with status \"Read\"\n */\n async getReadMessagesCount(): Promise<number> {\n const readStatus: TInboxMessageStatusRead = 2;\n const statusIndexName: TInboxMessagesIDBStatusIndex = 'status';\n return this.storage\n .countByIndex(this.storeName, statusIndexName, readStatus);\n }\n\n /**\n * Get count of messages with status \"Delivered\" and \"Read\"\n */\n async getDeliveredReadMessagesCount(): Promise<number> {\n const [readStatus, openStatus]: TReadInboxMessagesStatusRange = [2, 3];\n const keyRange = IDBKeyRange.bound(readStatus, openStatus);\n const statusIndexName: TInboxMessagesIDBStatusIndex = 'status';\n\n return this.storage.countByIndex(this.storeName, statusIndexName, keyRange);\n }\n\n /**\n * Load messages and sync with locally\n */\n async updateMessages(): Promise<void> {\n const response = await this.getInboxMessages();\n await this.deleteExpiredMessages();\n if (response.deleted) {\n await this.deleteMessages(response.deleted); // deleted from cp\n }\n await this.putServerMessages(response.messages);\n\n this.eventBus.dispatchEvent('update-inbox-messages', {\n messages: new InboxMessagesPublic(\n this.data,\n this.api,\n this,\n ),\n });\n }\n}\n","import * as CONSTANTS from '../../core/constants';\nimport { keyValue } from '../../core/storage';\n\nconst getKey = (key: string): string => `params.${key}`;\n\nexport class Data {\n private readonly store: typeof keyValue;\n\n constructor(store: typeof keyValue = keyValue) {\n this.store = store;\n }\n\n public async clearAll(): Promise<void> {\n const keys = [\n 'applicationCode',\n 'apiToken',\n 'hwid',\n 'deviceType',\n 'deviceModel',\n 'language',\n 'apiEntrypoint',\n 'tokens',\n 'applicationServerKey',\n 'isVapidChanged',\n 'webSitePushId',\n 'defaultNotificationImage',\n 'defaultNotificationTitle',\n 'userId',\n 'userIdWasChanged',\n 'email',\n 'emailWasChanged',\n 'isLastPermissionStatus',\n 'isManualUnsubscribed',\n 'isCommunicationDisabled',\n 'communicationEnabled',\n 'isDropAllData',\n 'sdkVersion',\n 'serviceWorkerVersion',\n 'serviceWorkerUrl',\n 'serviceWorkerScope',\n 'lastOpenMessage',\n 'lastOpenApplicationTime',\n 'features',\n 'init',\n 'inbox.lastRequestCode',\n 'inbox.lastRequestTime',\n 'inbox.newMessagesCount',\n 'delayedEvent',\n 'promptDisplayCount',\n 'promptLastSeenTime',\n ];\n\n for (const key of keys) {\n await this.store.set(getKey(key), undefined);\n }\n }\n\n public async setApplicationCode(application: string): Promise<void> {\n await this.store.set(getKey('applicationCode'), application);\n }\n\n public async getApplicationCode(): Promise<string> {\n return this.store.get(getKey('applicationCode'));\n }\n\n public async setApiToken(token: string): Promise<string> {\n return await this.store.set(getKey('apiToken'), token);\n }\n\n public async getApiToken(): Promise<string> {\n return this.store.get(getKey('apiToken'));\n }\n\n public async setHwid(hwid: string): Promise<void> {\n await this.store.set(getKey('hwid'), hwid);\n }\n\n public async getHwid(): Promise<string> {\n return this.store.get(getKey('hwid'));\n }\n\n public async setDeviceType(type: number): Promise<void> {\n await this.store.set(getKey('deviceType'), type);\n }\n\n public async getDeviceType(): Promise<number> {\n return this.store.get(getKey('deviceType'));\n }\n\n public async setDeviceModel(model: string): Promise<void> {\n await this.store.set(getKey('deviceModel'), model);\n }\n\n public async getDeviceModel(): Promise<string> {\n return this.store.get(getKey('deviceModel'));\n }\n\n public async setLanguage(language: string): Promise<void> {\n await this.store.set(getKey('language'), language);\n }\n\n public async getLanguage(): Promise<string> {\n return this.store.get(getKey('language'), 'en');\n }\n\n public async setApiEntrypoint(url: string): Promise<void> {\n await this.store.set(getKey('apiEntrypoint'), url);\n }\n\n public async getApiEntrypoint(): Promise<string> {\n return this.store.get(getKey('apiEntrypoint'), CONSTANTS.DEFAULT_API_URL);\n }\n\n public async setTokens(tokens: any): Promise<void> {\n await this.store.set(getKey('tokens'), tokens);\n }\n\n public getTokens(): Promise<any> {\n return this.store.get(getKey('tokens'));\n }\n\n public async setApplicationServerKey(key: string): Promise<void> {\n await this.store.set(getKey('applicationServerKey'), key);\n }\n\n public async getApplicationServerKey(): Promise<string | undefined> {\n return this.store.get(getKey('applicationServerKey'));\n }\n\n public async setIsVapidChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('isVapidChanged'), status);\n }\n\n public async getIsVapidChanged(): Promise<boolean> {\n return this.store.get(getKey('isVapidChanged'), false);\n }\n\n public async setWebSitePushId(senderId: string): Promise<void> {\n await this.store.set(getKey('webSitePushId'), senderId);\n }\n\n public async getWebSitePushId(): Promise<string> {\n return this.store.get(getKey('webSitePushId'));\n }\n\n public async setDefaultNotificationImage(url?: string): Promise<void> {\n await this.store.set(getKey('defaultNotificationImage'), url);\n }\n\n public async getDefaultNotificationImage(): Promise<string> {\n return this.store.get(getKey('defaultNotificationImage'), CONSTANTS.DEFAULT_NOTIFICATION_IMAGE);\n }\n\n public async setDefaultNotificationTitle(text?: string): Promise<void> {\n await this.store.set(getKey('defaultNotificationTitle'), text);\n }\n\n public async getDefaultNotificationTitle(): Promise<string> {\n return this.store.get(getKey('defaultNotificationTitle'), CONSTANTS.DEFAULT_NOTIFICATION_TITLE);\n }\n\n public async setUserId(userId?: string | number | undefined): Promise<void> {\n await this.store.set(getKey('userId'), userId ? `${userId}` : undefined);\n }\n\n public async getUserId(): Promise<string | undefined> {\n return this.store.get(getKey('userId'));\n }\n\n public async setStatusUserIdWasChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('userIdWasChanged'), status);\n }\n\n public async getStatusUserIdWasChanged(): Promise<boolean> {\n return this.store.get(getKey('userIdWasChanged'), false);\n }\n\n public async setEmail(email?: string): Promise<void> {\n await this.store.set(getKey('email'), email ? `${email}` : undefined);\n }\n\n public async getEmail(): Promise<string | undefined> {\n return this.store.get(getKey('email'));\n }\n\n public async setStatusEmailWasChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('emailWasChanged'), status);\n }\n\n public async getStatusEmailWasChanged(): Promise<boolean> {\n return this.store.get(getKey('emailWasChanged'), false);\n }\n\n public async setSmsNumber(number?: string): Promise<void> {\n await this.store.set(getKey('smsNumber'), number ? `${number}` : undefined);\n }\n\n public async getSmsNumber(): Promise<string | undefined> {\n return this.store.get(getKey('smsNumber'));\n }\n\n public async setStatusSmsNumberWasChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('smsNumberWasChanged'), status);\n }\n\n public async getStatusSmsNumberWasChanged(): Promise<boolean> {\n return this.store.get(getKey('smsNumberWasChanged'), false);\n }\n\n public async setWhatsAppNumber(number?: string): Promise<void> {\n await this.store.set(getKey('whatsAppNumber'), number ? `${number}` : undefined);\n }\n\n public async getWhatsAppNumber(): Promise<string | undefined> {\n return this.store.get(getKey('whatsAppNumber'));\n }\n\n public async setStatusWhatsAppNumberWasChanged(status: boolean): Promise<void> {\n await this.store.set(getKey('whatsAppNumberWasChanged'), status);\n }\n\n public async getStatusWhatsAppNumberWasChanged(): Promise<boolean> {\n return this.store.get(getKey('whatsAppNumberWasChanged'), false);\n }\n\n public async setLastPermissionStatus(status: NotificationPermission): Promise<void> {\n await this.store.set(getKey('isLastPermissionStatus'), status);\n }\n\n public async getLastPermissionStatus(): Promise<NotificationPermission | undefined> {\n return this.store.get(getKey('isLastPermissionStatus'));\n }\n\n public async setStatusManualUnsubscribed(status: boolean): Promise<void> {\n await this.store.set(getKey('isManualUnsubscribed'), status);\n }\n\n public getStatusManualUnsubscribed(): Promise<boolean> {\n return this.store.get(getKey('isManualUnsubscribed'), false);\n }\n\n public async setStatusCommunicationDisabled(status: boolean): Promise<void> {\n await this.store.set(getKey('isCommunicationDisabled'), status);\n }\n\n public getStatusCommunicationDisabled(): Promise<boolean> {\n return this.store.get(getKey('isCommunicationDisabled'), false);\n }\n\n public async setCommunicationEnabled(status?: boolean): Promise<void> {\n await this.store.set(getKey('communicationEnabled'), status);\n }\n\n public getCommunicationEnabled(): Promise<boolean | undefined> {\n return this.store.get(getKey('communicationEnabled'));\n }\n\n public async setStatusDropAllData(status: boolean): Promise<void> {\n await this.store.set(getKey('isDropAllData'), status);\n }\n\n public getStatusDropAllData(): Promise<boolean> {\n return this.store.get(getKey('isDropAllData'), false);\n }\n\n public async setSdkVersion(version: string): Promise<void> {\n await this.store.set(getKey('sdkVersion'), version);\n }\n\n public async getSdkVersion(): Promise<string> {\n return this.store.get(getKey('sdkVersion'));\n }\n\n public async setServiceWorkerVersion(version: string): Promise<void> {\n await this.store.set(getKey('serviceWorkerVersion'), version);\n }\n\n public getServiceWorkerVersion(): Promise<string> {\n return this.store.get(getKey('serviceWorkerVersion'));\n }\n\n public async setServiceWorkerUrl(url?: string | null): Promise<void> {\n if (!url) {\n return;\n }\n\n await this.store.set(getKey('serviceWorkerUrl'), url);\n }\n\n public async getServiceWorkerUrl(): Promise<string> {\n return this.store.get(getKey('serviceWorkerUrl'), CONSTANTS.DEFAULT_SERVICE_WORKER_URL);\n }\n\n public async setServiceWorkerScope(scope?: string): Promise<void> {\n if (!scope) {\n return;\n }\n\n await this.store.set(getKey('serviceWorkerScope'), scope);\n }\n\n public async getServiceWorkerScope(): Promise<string> {\n return this.store.get(getKey('serviceWorkerScope'));\n }\n\n public async setLastOpenMessage(message: any): Promise<void> {\n await this.store.set(getKey('lastOpenMessage'), message);\n }\n\n public getLastOpenMessage(): Promise<any> {\n return this.store.get(getKey('lastOpenMessage'));\n }\n\n public async setLastOpenApplicationTime(time: number): Promise<void> {\n await this.store.set(getKey('lastOpenApplicationTime'), time);\n }\n\n public async getLastOpenApplicationTime(): Promise<number> {\n return this.store.get(getKey('lastOpenApplicationTime'));\n }\n\n public async setFeatures(features: any): Promise<void> {\n await this.store.set(getKey('features'), features);\n }\n\n public async getFeatures(): Promise<any> {\n return this.store.get(getKey('features'));\n }\n\n public async setInitParams(params: any): Promise<any> {\n await this.store.set(getKey('init'), params);\n }\n\n public async getInitParams(): Promise<any> {\n return this.store.get(getKey('init'));\n }\n\n public async setInboxLastRequestCode(lastCode: string): Promise<void> {\n await this.store.set(getKey('inbox.lastRequestCode'), lastCode);\n }\n\n public async getInboxLastRequestCode(): Promise<string> {\n return this.store.get(getKey('inbox.lastRequestCode'), '');\n }\n\n public async setInboxLastRequestTime(lastRequestTime: number): Promise<void> {\n await this.store.set(getKey('inbox.lastRequestTime'), lastRequestTime);\n }\n\n public async getInboxLastRequestTime(): Promise<number> {\n return this.store.get(getKey('inbox.lastRequestTime'), 0);\n }\n\n public async setInboxNewMessagesCount(count: number): Promise<void> {\n await this.store.set(getKey('inbox.newMessagesCount'), count);\n }\n\n public async getInboxNewMessagesCount(): Promise<number> {\n return this.store.get(getKey('inbox.newMessagesCount'), 0);\n }\n\n public async setDelayedEvent(event: any): Promise<void> {\n await this.store.set(getKey('delayedEvent'), event);\n }\n\n public getDelayedEvent(): Promise<any> {\n return this.store.get(getKey('delayedEvent'));\n }\n\n public async setPromptDisplayCount(count: number): Promise<void> {\n await this.store.set(getKey('promptDisplayCount'), count);\n }\n\n public async getPromptDisplayCount(): Promise<number> {\n return this.store.get(getKey('promptDisplayCount'), 0);\n }\n\n public async setPromptLastSeenTime(time: number): Promise<void> {\n await this.store.set(getKey('promptLastSeenTime'), time);\n }\n\n public async getPromptLastSeenTime(): Promise<number> {\n return this.store.get(getKey('promptLastSeenTime'), 0);\n }\n}\n","import { type TMethod, type IMapRequest, type IMapResponse } from './ApiClient.types';\nimport { getGlobal } from '../../core/functions';\nimport { Logger } from '../../core/logger';\nimport { Data } from '../Data/Data';\n\nexport class ApiClient {\n private readonly data: Data;\n private readonly logger: typeof Logger;\n\n constructor(\n data: Data = new Data(),\n logger: typeof Logger = Logger,\n ) {\n this.data = data;\n this.logger = logger;\n }\n\n public checkDevice(options: IMapRequest['checkDevice']): Promise<IMapResponse['checkDevice']> {\n return this.createRequest('checkDevice', options);\n }\n\n public getConfig(options: IMapRequest['getConfig']): Promise<IMapResponse['getConfig']> {\n return this.createRequest('getConfig', options);\n }\n\n public applicationOpen(options: IMapRequest['applicationOpen']): Promise<IMapResponse['applicationOpen']> {\n return this.createRequest('applicationOpen', options);\n }\n\n public registerDevice(options: IMapRequest['registerDevice']): Promise<IMapResponse['registerDevice']> {\n return this.createRequest('registerDevice', options);\n }\n\n public unregisterDevice(options: IMapRequest['unregisterDevice']): Promise<IMapResponse['unregisterDevice']> {\n return this.createRequest('unregisterDevice', options);\n }\n\n public deleteDevice(options: IMapRequest['deleteDevice']): Promise<IMapResponse['deleteDevice']> {\n return this.createRequest('deleteDevice', options);\n }\n\n public messageDeliveryEvent(options: IMapRequest['messageDeliveryEvent']): Promise<IMapResponse['messageDeliveryEvent']> {\n return this.createRequest('messageDeliveryEvent', options);\n }\n\n public pushStat(options: IMapRequest['pushStat']): Promise<IMapResponse['pushStat']> {\n return this.createRequest('pushStat', options);\n }\n\n public setTags(options: IMapRequest['setTags']): Promise<IMapResponse['setTags']> {\n return this.createRequest('setTags', options);\n }\n\n public getTags(options: IMapRequest['getTags']): Promise<IMapResponse['getTags']> {\n return this.createRequest('getTags', options);\n }\n\n public registerUser(options: IMapRequest['registerUser']): Promise<IMapResponse['registerUser']> {\n return this.createRequest('registerUser', options);\n }\n\n public registerEmail(options: IMapRequest['registerEmail']): Promise<IMapResponse['registerEmail']> {\n return this.createRequest('registerEmail', options);\n }\n\n public registerEmailUser(options: IMapRequest['registerEmailUser']): Promise<IMapResponse['registerEmailUser']> {\n return this.createRequest('registerEmailUser', options);\n }\n\n public setEmailTags(options: IMapRequest['setEmailTags']): Promise<IMapResponse['setEmailTags']> {\n return this.createRequest('setEmailTags', options);\n }\n\n public postEvent(options: IMapRequest['postEvent']): Promise<IMapResponse['postEvent']> {\n return this.createRequest('postEvent', options);\n }\n\n public getInboxMessages(options: IMapRequest['getInboxMessages']): Promise<IMapResponse['getInboxMessages']> {\n return this.createRequest('getInboxMessages', options);\n }\n\n public inboxStatus(options: IMapRequest['inboxStatus']): Promise<IMapResponse['inboxStatus']> {\n return this.createRequest('inboxStatus', options);\n }\n\n public pageVisit(options: IMapRequest['pageVisit'], url: string): Promise<IMapResponse['pageVisit']> {\n return this.createRequest('pageVisit', options, url);\n }\n\n public setPurchase(options: IMapRequest['setPurchase']): Promise<IMapResponse['setPurchase']> {\n return this.createRequest('setPurchase', options);\n }\n\n public multiRegisterDevice(options: IMapRequest['multiRegisterDevice']): Promise<IMapResponse['multiRegisterDevice']> {\n return this.createRequest('multiRegisterDevice', options);\n }\n\n private async createRequest<T extends TMethod>(\n methodName: T,\n request: IMapRequest[T],\n customUrl?: string,\n ): Promise<IMapResponse[T]> {\n const entrypoint = await this.data.getApiEntrypoint();\n const apiToken = await this.data.getApiToken();\n const url = customUrl || entrypoint + methodName;\n\n const authRequestOptions = apiToken ? {\n headers: {\n Authorization: `Token ${apiToken}`,\n 'Content-Type': 'text/plain;charset=UTF-8',\n Origin: getGlobal().location.origin,\n },\n credentials: 'include' as RequestCredentials,\n } : {};\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'text/plain;charset=UTF-8',\n },\n body: JSON.stringify({\n request,\n }),\n ...authRequestOptions,\n });\n\n const result = await this.checkResponse(response);\n\n // reset api entrypoint if need\n if (result.base_url) {\n await this.data.setApiEntrypoint(result.base_url);\n }\n\n await this.logger.write(\n 'apirequest',\n `${methodName} call with arguments: ${JSON.stringify(request)} to Pushwoosh has been successful. Result: ${JSON.stringify(result.response)}`,\n );\n\n return result.response as IMapResponse[T];\n }\n\n private async checkResponse(response: Response): Promise<any> {\n if (response.status !== 200) {\n let errorMessage = `status: ${response.status}. statusText: ${response.statusText}.`;\n try {\n const json = await response.json();\n if (json && json.status_message) {\n errorMessage += ` status_code: ${json.status_code}. status_message: ${json.status_message}.`;\n }\n } catch (_e) { /* empty */ }\n throw new Error(errorMessage);\n }\n\n const data = await response.json();\n\n if (data.status_code !== 200) {\n throw new Error(`Error code: ${data.status_code}. Error text: ${data.status_message}`);\n }\n\n return data;\n }\n}\n","import {\n type SetPurchaseAttributes,\n type MultiRegisterDeviceRequest,\n type PushDevice,\n type WebPushPlatformData,\n} from './Api.types';\nimport * as CONSTANTS from '../../core/constants';\nimport { type EventBus } from '../../core/modules/EventBus';\nimport { ApiClient } from '../ApiClient/ApiClient';\nimport {\n type IMapResponse,\n type IRequest,\n} from '../ApiClient/ApiClient.types';\nimport { Data } from '../Data/Data';\nimport { type TPlatform } from '../PlatformChecker/PlatformChecker.types';\n\nexport class Api {\n private readonly data: Data;\n private readonly apiClient: ApiClient;\n private readonly eventBus: EventBus;\n private readonly getIsCommunicationDisabled: () => boolean | undefined;\n\n constructor(\n eventBus: EventBus,\n data: Data = new Data(),\n apiClient: ApiClient = new ApiClient(),\n getIsCommunicationDisabled: () => boolean | undefined = () => false,\n ) {\n this.eventBus = eventBus;\n this.data = data;\n this.apiClient = apiClient;\n this.getIsCommunicationDisabled = getIsCommunicationDisabled;\n }\n\n public async checkDevice(): Promise<IMapResponse['checkDevice']> {\n const params = await this.getRequestParams();\n\n return await this.apiClient.checkDevice(params);\n }\n\n public async checkDeviceSubscribeForPushNotifications(useCache: boolean = true): Promise<boolean> {\n // get current subscription status from local storage\n let status = localStorage.getItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS);\n\n // check need force update\n if (typeof status === 'undefined' || !useCache) {\n const { exist, push_token_exist } = await this.checkDevice();\n localStorage.setItem(\n CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS,\n (exist && push_token_exist)\n ? CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED\n : CONSTANTS.DEVICE_REGISTRATION_STATUS_UNREGISTERED,\n );\n\n status = localStorage.getItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS);\n }\n\n return status === CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED;\n }\n\n public async getConfig(features: string[]): Promise<IMapResponse['getConfig']> {\n const params = await this.getRequestParams();\n\n return this.apiClient.getConfig({\n ...params,\n features,\n });\n }\n\n public async applicationOpen(): Promise<IMapResponse['applicationOpen']> {\n const params = await this.getRequestParams();\n\n // set do database latest sending time\n await this.data.setLastOpenApplicationTime(Date.now());\n\n return this.apiClient.applicationOpen(params);\n }\n\n public async registerDevice(): Promise<IMapResponse['registerDevice']> {\n // check communication disabled\n const isCommunicationDisabled = await this.data.getStatusCommunicationDisabled();\n\n // if communication disabled -> can't register device\n if (isCommunicationDisabled) {\n throw new Error(`Can't register device: Communication is disabled!`);\n }\n\n const params = await this.getRequestParams();\n const tokens = await this.data.getTokens();\n\n // if there is no pushToken -> user did not grant permission to send push notifications\n if (!tokens.pushToken) {\n throw new Error(`Can't register device: pushToken is not exist!`);\n }\n\n // register device into Pushwoosh\n const response = await this.apiClient.registerDevice({\n ...params,\n push_token: tokens.pushToken,\n auth_token: tokens.authToken,\n public_key: tokens.publicKey,\n });\n\n // set info to database, that the device IS NOT manual unsubscribed\n await this.data.setStatusManualUnsubscribed(false);\n\n // set info to local storage, that device is subscribed\n localStorage.setItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS, CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED);\n\n // emit event\n this.eventBus.dispatchEvent('register', {});\n\n return response;\n }\n\n public async unregisterDevice(): Promise<IMapResponse['unregisterDevice']> {\n const params = await this.getRequestParams();\n const response = await this.apiClient.unregisterDevice(params);\n\n // set info to local storage, that device is unsubscribed\n localStorage.setItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS, CONSTANTS.DEVICE_REGISTRATION_STATUS_UNREGISTERED);\n\n // emit event\n this.eventBus.dispatchEvent('unsubscribe', {});\n\n return response;\n }\n\n public async deleteDevice(): Promise<IMapResponse['deleteDevice']> {\n const params = await this.getRequestParams();\n\n const response = await this.apiClient.deleteDevice(params);\n\n // set info to database, that the device IS manual unsubscribed\n await this.data.setStatusManualUnsubscribed(true);\n\n // set info to local storage, that device is unsubscribed\n localStorage.setItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS, CONSTANTS.DEVICE_REGISTRATION_STATUS_UNREGISTERED);\n\n // emit event\n this.eventBus.dispatchEvent('unsubscribe', {});\n\n return response;\n }\n\n public async messageDeliveryEvent(hash: string, isTrackingLogOnFailure?: boolean, metaData: { [key: string]: any } = {}): Promise<IMapResponse['messageDeliveryEvent']> {\n const params = await this.getRequestParams();\n\n return await this.apiClient.messageDeliveryEvent({\n ...params,\n hash,\n metaData,\n });\n }\n\n public async pushStat(hash: string, isTrackingLogOnFailure?: boolean, metaData: { [key: string]: any } = {}): Promise<IMapResponse['pushStat']> {\n const params = await this.getRequestParams();\n\n return await this.apiClient.pushStat({\n ...params,\n hash,\n metaData,\n });\n }\n\n public async setTags(tags: { [key: string]: any }): Promise<IMapResponse['setTags']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n const { hwid, device_type, ...params } = await this.getRequestParams();\n const email = await this.data.getEmail();\n\n // set email tags in pushwoosh\n if (email) {\n await this.apiClient.setEmailTags({\n ...params,\n email,\n tags,\n });\n }\n\n return this.apiClient.setTags({\n ...params,\n hwid,\n device_type,\n tags,\n });\n }\n\n public async getTags(): Promise<IMapResponse['getTags']> {\n const params = await this.getRequestParams();\n\n return this.apiClient.getTags(params);\n }\n\n public async registerUser(userId: string | number, isManual = true): Promise<IMapResponse['registerUser']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n const {\n hwid,\n device_type: _device_type,\n ...params\n } = await this.getRequestParams();\n const deviceType = await this.data.getDeviceType();\n\n const id = `${userId}`;\n\n // register user in pushwoosh\n const response = await this.apiClient.registerUser({\n ...params,\n hwid,\n userId: id,\n ts_offset: -(new Date()).getTimezoneOffset() * 60,\n device_type: deviceType,\n });\n\n // set user id to database\n await this.data.setUserId(id);\n\n // set info to database that user id was change\n if (isManual) {\n await this.data.setStatusUserIdWasChanged(true);\n }\n\n return response;\n }\n\n public async registerEmail(email: string, isManual = true): Promise<IMapResponse['registerEmail']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n if (!/^\\S+@\\S+\\.\\S+$/.test(email)) {\n return Promise.reject(new Error('Invalid Email format'));\n }\n const {\n hwid: _hwid,\n device_type: _device_type,\n ...requestParams\n } = await this.getRequestParams();\n\n // register user email in pushwoosh\n const response = await this.apiClient.registerEmail({\n ...requestParams,\n email,\n ts_offset: -(new Date()).getTimezoneOffset() * 60,\n });\n\n // set user email to database\n await this.data.setEmail(email);\n\n // set info to database that user email was change\n if (isManual) {\n await this.data.setStatusEmailWasChanged(true);\n }\n\n return response;\n }\n\n public async registerSmsNumber(number: string, isManual = true): Promise<IMapResponse['registerSmsNumber']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n if (!/^\\+?[0-9]+$/.test(number)) {\n return Promise.reject(new Error('Invalid Phone number format: +1234567890'));\n }\n const { application, userId } = await this.getRequestParams();\n\n const response = await this.apiClient.registerDevice({\n application,\n userId,\n hwid: number,\n device_type: 18,\n });\n\n await this.data.setSmsNumber(number);\n\n if (isManual) {\n await this.data.setStatusSmsNumberWasChanged(true);\n }\n\n return response;\n }\n\n public async registerWhatsappNumber(number: string, isManual = true): Promise<IMapResponse['registerWhatsappNumber']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n if (!/^(whatsapp:)?\\+?[0-9]+$/.test(number)) {\n return Promise.reject(new Error('Invalid WhatsApp number format: +1234567890'));\n }\n const { application, userId } = await this.getRequestParams();\n\n const response = await this.apiClient.registerDevice({\n application,\n userId,\n hwid: number,\n device_type: 21,\n });\n\n await this.data.setWhatsAppNumber(number);\n\n if (isManual) {\n await this.data.setStatusWhatsAppNumberWasChanged(true);\n }\n\n return response;\n }\n\n public async postEvent(event: string, attributes: { [key: string]: any }): Promise<IMapResponse['postEvent']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n const params = await this.getRequestParams();\n\n const date = new Date();\n const time = date.getTime();\n const timestampUTC = Math.floor(time / 1000);\n const timestampCurrent = timestampUTC - (date.getTimezoneOffset() / 60 * 3600);\n\n // if post event send after notification open:\n // need add message hash to event\n const lastOpenMessage = await this.data.getLastOpenMessage();\n\n if (lastOpenMessage && lastOpenMessage.expiry > Date.now()) {\n if (attributes['msgHash']) {\n return Promise.reject(new Error('attribute msgHash already defined'));\n }\n\n attributes = {\n ...attributes,\n msgHash: lastOpenMessage.messageHash,\n };\n }\n\n // remove last open message\n await this.data.setLastOpenMessage(undefined);\n\n const response = await this.apiClient.postEvent({\n ...params,\n event,\n timestampUTC,\n timestampCurrent,\n attributes,\n });\n\n if (response && response.code) {\n this.eventBus.dispatchEvent('receive-in-app-code', {\n code: response.code,\n });\n }\n\n return response;\n }\n\n public async getInboxMessages(count: number = 0): Promise<IMapResponse['getInboxMessages']> {\n const params = await this.getRequestParams();\n\n const lastCode = await this.data.getInboxLastRequestCode();\n const lastRequestTime = await this.data.getInboxLastRequestTime();\n\n return this.apiClient.getInboxMessages({\n ...params,\n count,\n last_code: lastCode,\n last_request_time: lastRequestTime,\n });\n }\n\n public async inboxStatus(order: string, status: number): Promise<IMapResponse['inboxStatus']> {\n const params = await this.getRequestParams();\n\n return this.apiClient.inboxStatus({\n ...params,\n inbox_code: order,\n status,\n time: (new Date()).getTime(),\n });\n }\n\n public async pageVisit(config: { title: string; url_path: string; url: string }): Promise<IMapResponse['pageVisit']> {\n const params = await this.getRequestParams();\n const features = await this.data.getFeatures();\n\n const url = features && features.page_visit && features.page_visit.entrypoint;\n\n if (!url) {\n return;\n }\n\n return this.apiClient.pageVisit({\n ...params,\n ...config,\n }, url);\n }\n\n public async setPurchase(attributes: SetPurchaseAttributes): Promise<IMapResponse['setPurchase']> {\n const params = await this.getRequestParams();\n\n return this.apiClient.setPurchase({\n ...params,\n ...attributes,\n });\n }\n\n public async multiRegisterDevice(request: Partial<MultiRegisterDeviceRequest>): Promise<IMapResponse['multiRegisterDevice']> {\n if (this.getIsCommunicationDisabled()) {\n return Promise.reject(new Error('Communication is disabled'));\n }\n\n const applicationCode = await this.data.getApplicationCode();\n const deviceModel = await this.data.getDeviceModel();\n const deviceType = await this.data.getDeviceType();\n const language = await this.data.getLanguage();\n const version = await this.data.getSdkVersion();\n const tokens = await this.data.getTokens();\n const hwid = await this.data.getHwid();\n\n const fullRequest: MultiRegisterDeviceRequest = {\n application: applicationCode,\n ...request,\n };\n\n if (request.user_id) {\n fullRequest.user_id = String(request.user_id);\n const currentUserId = await this.data.getUserId();\n if (currentUserId !== fullRequest.user_id) {\n await this.data.setUserId(fullRequest.user_id);\n await this.data.setStatusUserIdWasChanged(true);\n }\n }\n\n if (request.email) {\n if (!/^\\S+@\\S+\\.\\S+$/.test(request.email)) {\n return Promise.reject(new Error('Invalid Email format'));\n }\n const currentEmail = await this.data.getEmail();\n if (currentEmail !== request.email) {\n await this.data.setEmail(request.email);\n await this.data.setStatusEmailWasChanged(true);\n }\n }\n\n if (request.sms_phone_number) {\n if (!/^\\+?[0-9]+$/.test(request.sms_phone_number)) {\n return Promise.reject(new Error('Invalid Phone number format: +1234567890'));\n }\n const currentSmsNumber = await this.data.getSmsNumber();\n if (currentSmsNumber !== request.sms_phone_number) {\n await this.data.setSmsNumber(request.sms_phone_number);\n await this.data.setStatusSmsNumberWasChanged(true);\n }\n }\n\n if (request.whatsapp_phone_number) {\n if (!/^(whatsapp:)?\\+?[0-9]+$/.test(request.whatsapp_phone_number)) {\n return Promise.reject(new Error('Invalid WhatsApp number format: +1234567890'));\n }\n const currentWhatsAppNumber = await this.data.getWhatsAppNumber();\n if (currentWhatsAppNumber !== request.whatsapp_phone_number) {\n await this.data.setWhatsAppNumber(request.whatsapp_phone_number);\n await this.data.setStatusWhatsAppNumberWasChanged(true);\n }\n }\n\n if (fullRequest.language) {\n await this.data.setLanguage(fullRequest.language);\n } else {\n fullRequest.language = language;\n }\n\n if (!fullRequest.timezone) {\n const timezone = -(new Date()).getTimezoneOffset() * 60;\n fullRequest.timezone = String(timezone);\n }\n\n if (!fullRequest.push_devices && tokens.pushToken) {\n const pushDevice: PushDevice = {\n hwid: hwid,\n platform: deviceType as TPlatform,\n push_token: tokens.pushToken,\n sdk_version: version,\n };\n\n if (tokens.publicKey || tokens.authToken || deviceModel) {\n const webPushData: WebPushPlatformData = {};\n if (tokens.publicKey) webPushData.public_key = tokens.publicKey;\n if (tokens.authToken) webPushData.auth_token = tokens.authToken;\n if (deviceModel) webPushData.browser = deviceModel;\n pushDevice.platformData = webPushData;\n }\n\n fullRequest.push_devices = [pushDevice];\n }\n\n const response = await this.apiClient.multiRegisterDevice(fullRequest);\n\n if (fullRequest.push_devices?.length) {\n await this.data.setStatusManualUnsubscribed(false);\n localStorage.setItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS, CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED);\n this.eventBus.dispatchEvent('register', {});\n }\n\n return response;\n }\n\n public async getParams() {\n const applicationCode = await this.data.getApplicationCode();\n const hwid = await this.data.getHwid();\n const apiParams = await this.data.getTokens();\n const initParams = await this.data.getInitParams();\n\n return {\n applicationCode,\n hwid,\n ...apiParams,\n ...initParams,\n };\n }\n\n private async getRequestParams(): Promise<IRequest> {\n const applicationCode = await this.data.getApplicationCode();\n const hwid = await this.data.getHwid();\n const userId = await this.data.getUserId();\n const deviceType = await this.data.getDeviceType();\n const deviceModel = await this.data.getDeviceModel();\n const language = await this.data.getLanguage();\n const version = await this.data.getSdkVersion();\n\n const timezone = -(new Date()).getTimezoneOffset() * 60;\n\n return {\n application: applicationCode,\n hwid: hwid,\n\n userId: userId || hwid,\n device_type: deviceType,\n device_model: deviceModel,\n timezone: timezone,\n language: language,\n v: version,\n };\n };\n}\n","import { type TPlatform, type TPlatformChrome, type TPlatformEdge, type TPlatformFirefox, type TPlatformSafari } from './PlatformChecker.types';\n\nexport class PlatformChecker {\n private readonly global: typeof globalThis;\n\n private readonly _isSafari: boolean;\n private readonly _isOpera: boolean;\n private readonly _isEdge: boolean;\n private readonly _isFirefox: boolean;\n private readonly _isChrome: boolean;\n\n private readonly _isMacOS: boolean;\n\n private readonly _isAvailableServiceWorker: boolean;\n private readonly _isAvailableNotifications: boolean;\n\n /**\n * Browser name + version\n * Example: \"Chrome 70\"\n */\n private readonly _browserVersion: string;\n private readonly _platform: TPlatform;\n\n constructor(global: typeof globalThis) {\n this.global = global;\n\n this._isSafari = this.isSafariBrowser();\n this._isOpera = this.isOperaBrowser();\n this._isEdge = this.isEdgeBrowser();\n this._isFirefox = this.isFirefoxBrowser();\n this._isChrome = this.isChromeBrowser();\n\n this._isMacOS = this.isMacOS();\n\n this._isAvailableServiceWorker = this.canUseServiceWorkers();\n this._isAvailableNotifications = this.canReceiveNotifications();\n\n this._platform = this.getPlatformType();\n this._browserVersion = this.getBrowserVersion();\n }\n\n // Platform flags\n get isEdge() {\n return this._isEdge;\n }\n\n get isSafari() {\n return this._isSafari;\n }\n\n get isOpera() {\n return this._isOpera;\n }\n\n get isAvailableServiceWorker() {\n return this._isAvailableServiceWorker;\n }\n\n get isAvailableNotifications() {\n return this._isAvailableNotifications;\n }\n\n // Platform values\n\n get platform() {\n return this._platform;\n }\n\n get browserVersion() {\n return this._browserVersion;\n }\n\n isSafariBrowser(): boolean {\n return 'safari' in this.global && navigator.userAgent.indexOf('Safari') > -1;\n }\n\n isOperaBrowser(): boolean {\n return navigator.userAgent.indexOf('Opera') !== -1 || navigator.userAgent.indexOf('OPR') !== -1;\n }\n\n isEdgeBrowser(): boolean {\n return navigator.userAgent.indexOf('Edge') > -1;\n }\n\n isFirefoxBrowser(): boolean {\n return navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n }\n\n isChromeBrowser(): boolean {\n return /Chrome/.test(navigator.userAgent)\n && /Google Inc/.test(navigator.vendor)\n && !this._isOpera\n && !this._isEdge;\n }\n\n isMacOS(): boolean {\n return 'platform' in navigator && navigator.platform.toLowerCase().indexOf('mac') !== -1;\n }\n\n canUseServiceWorkers(): boolean {\n return !!navigator.serviceWorker && 'PushManager' in this.global && 'Notification' in this.global;\n }\n\n /**\n * Check availability ServiceWorker or safari browser on macos\n */\n canReceiveNotifications(): boolean {\n return (this._isSafari && this._isMacOS) || (this._isAvailableServiceWorker && !this._isEdge);\n }\n\n /**\n * Get Pushwoosh system platform code\n */\n getPlatformType(): TPlatform {\n let platform: TPlatformChrome = 11;\n\n switch (true) {\n case this._isSafari:\n (<TPlatformSafari>platform) = 10;\n break;\n\n case this._isOpera || this._isChrome:\n (<TPlatformChrome>platform) = 11;\n break;\n\n case this._isFirefox:\n (<TPlatformFirefox>platform) = 12;\n break;\n\n case this._isEdge:\n (<TPlatformEdge>platform) = 150;\n break;\n }\n\n return platform;\n }\n\n /**\n * Get browser name + version from userAgent\n */\n getBrowserVersion(): string {\n const { userAgent } = navigator;\n const matchOperaVersion = userAgent.match(/\\bOPR\\/(\\d+)/);\n if (matchOperaVersion !== null) {\n return `Opera ${matchOperaVersion[1]}`;\n }\n\n const matchEdgeVersion = userAgent.match(/\\bEdge\\/(\\d+)/);\n if (matchEdgeVersion !== null) {\n return `Edge ${matchEdgeVersion[1]}`;\n }\n\n // edge on chromium\n const matchEdgVersion = userAgent.match(/\\bEdg\\/(\\d+)/);\n if (matchEdgVersion !== null) {\n return `Edge ${matchEdgVersion[1]}`;\n }\n\n let match = userAgent.match(/(opera|chrome|safari|firefox(?=\\/))\\/?\\s*(\\d+)/i) || [];\n const [, browser = ''] = match;\n\n match = match[2] ? [browser, match[2]] : [navigator.appName, navigator.appVersion, '-?'];\n const version = userAgent.match(/version\\/([.\\d]+)/i);\n if (version !== null) {\n match.splice(1, 1, version[1]);\n }\n\n return match.join(' ');\n }\n}\n","import {\n type IPushServiceDefaultConfig,\n} from './PushServiceDefault.types';\nimport * as CONSTANTS from '../../../../core/constants';\nimport { v4 } from '../../../../core/functions';\nimport { Logger } from '../../../../core/logger';\nimport { type Api } from '../../../../modules/Api/Api';\nimport { type Data } from '../../../../modules/Data/Data';\nimport {\n type IPushService,\n type IPushServiceSubscriptionKeys,\n} from '../../PushService.types';\n\nexport class PushServiceDefault implements IPushService {\n private readonly api: Api;\n private readonly data: Data;\n private readonly config: IPushServiceDefaultConfig;\n private registration?: ServiceWorkerRegistration;\n\n constructor(api: Api, data: Data, config: IPushServiceDefaultConfig) {\n this.api = api;\n this.data = data;\n this.config = config;\n }\n\n public getPermission(): NotificationPermission {\n return Notification.permission;\n }\n\n public checkIsPermissionGranted(): boolean {\n return this.getPermission() === CONSTANTS.PERMISSION_GRANTED;\n }\n\n public checkIsPermissionDefault(): boolean {\n return this.getPermission() === CONSTANTS.PERMISSION_PROMPT;\n }\n\n public async checkIsManualUnsubscribed(): Promise<boolean> {\n return this.data.getStatusManualUnsubscribed();\n }\n\n public async askPermission(): Promise<void> {\n await Notification.requestPermission();\n }\n\n public async getTokens(): Promise<IPushServiceSubscriptionKeys> {\n return this.data.getTokens();\n }\n\n public async subscribe(subscription?: PushSubscription): Promise<void> {\n const currentSubscription = subscription || await this.trySubscribe();\n const isPermissionGranted = this.checkIsPermissionGranted();\n\n if (!isPermissionGranted) {\n Logger.error('You must have permission granted before subscribe!');\n\n return;\n }\n\n const pushToken = this.getPushToken(currentSubscription);\n const _p256dn = currentSubscription.getKey('p256dh');\n const _auth = currentSubscription.getKey('auth');\n\n if (!_p256dn || !_auth) {\n throw new Error('Can\\'t get subscription keys!');\n }\n\n const p256dh = btoa(String.fromCharCode.apply(String, new Uint8Array(_p256dn))); // eslint-disable-line prefer-spread\n const auth = btoa(String.fromCharCode.apply(String, new Uint8Array(_auth))); // eslint-disable-line prefer-spread\n\n await this.data.setTokens({\n publicKey: p256dh,\n pushToken: pushToken,\n authToken: auth,\n endpoint: currentSubscription.endpoint,\n });\n\n // register device into pushwoosh\n await this.api.registerDevice();\n }\n\n public async unsubscribe(): Promise<void> {\n // get service worker registration\n const registration = await this.getServiceWorkerRegistration();\n\n // get current subscription\n const subscription = await registration.pushManager.getSubscription();\n\n // remove tokens\n await this.data.setTokens({});\n\n // set info to database, that the device IS manual unsubscribed\n await this.data.setStatusManualUnsubscribed(true);\n\n // unregister device in pushwoosh\n await this.api.unregisterDevice();\n\n if (!subscription) {\n return;\n }\n\n // remove subscription\n await subscription.unsubscribe();\n }\n\n public async checkIsRegister(): Promise<boolean> {\n return this.api.checkDeviceSubscribeForPushNotifications();\n }\n\n public async checkIsNeedResubscribe(): Promise<boolean> {\n // check change permission status\n const lastPermission = await this.data.getLastPermissionStatus();\n const permission = this.getPermission();\n\n if (lastPermission !== permission) {\n await this.data.setLastPermissionStatus(permission);\n\n return true;\n }\n\n // check if pushTokens not equal from pushSubscription and store\n const credentials = await this.getCredentials();\n const pushTokenFromSubscription = this.getPushToken(credentials);\n\n const subscriptionTokensFromStore = await this.data.getTokens();\n const pushTokenFromStore = subscriptionTokensFromStore && subscriptionTokensFromStore.pushToken || '';\n\n const isEqualPushTokens = pushTokenFromSubscription === pushTokenFromStore;\n\n const isVapidChanged = await this.data.getIsVapidChanged();\n\n return !isEqualPushTokens || isVapidChanged;\n }\n\n private async getServiceWorkerRegistration(): Promise<ServiceWorkerRegistration> {\n if (!this.registration) {\n await this.registerServiceWorker();\n\n const url = await this.data.getServiceWorkerUrl();\n this.registration = await navigator.serviceWorker.getRegistration(url);\n\n await (this.registration as ServiceWorkerRegistration).update();\n }\n\n if (!this.registration) {\n throw new Error(`Internal Error: Can't register service worker!`);\n }\n\n return this.registration;\n }\n\n private async registerServiceWorker(): Promise<void> {\n const url = await this.data.getServiceWorkerUrl();\n const scope = await this.data.getServiceWorkerScope();\n const sdkVersion = await this.data.getSdkVersion();\n const serviceWorkerVersion = await this.data.getServiceWorkerVersion();\n\n // add clean cache get parameter only if\n // sdk version and service worker version is not equals\n let cleanCache = '';\n\n if (sdkVersion !== serviceWorkerVersion) {\n cleanCache = `?cache_clean=${v4()}`;\n }\n\n await navigator\n .serviceWorker\n .register(`${url}${cleanCache}`, {\n scope,\n });\n }\n\n private async trySubscribe(): Promise<PushSubscription> {\n try {\n return await this.subscribePushManager();\n } catch (error) {\n console.error(error);\n // if get subscription filed\n // try unsubscribe and resubscribe again\n // it may be if changed vapid or sender id\n await this.unsubscribe();\n return this.subscribePushManager();\n }\n }\n\n private async subscribePushManager(): Promise<PushSubscription> {\n // get service worker registration\n const registration = await this.getServiceWorkerRegistration();\n const applicationServerKey = await this.getApplicationServerKey();\n\n return registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: applicationServerKey ? this.urlBase64ToUint8Array(applicationServerKey) as BufferSource : null,\n });\n }\n\n private async getCredentials(): Promise<PushSubscription | null> {\n const registration = await this.getServiceWorkerRegistration();\n return await registration.pushManager.getSubscription();\n }\n\n private getPushToken(subscription: PushSubscription | null): string {\n if (!subscription) {\n return '';\n }\n\n return subscription.endpoint;\n }\n\n private async getApplicationServerKey(): Promise<string | undefined> {\n return await this.data.getApplicationServerKey();\n }\n\n private urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n }\n}\n","import { type IPushServiceSafariConfig } from './PushServiceSafari.types';\nimport * as CONSTANTS from '../../../../core/constants';\nimport { Logger } from '../../../../core/logger';\nimport { type Api } from '../../../../modules/Api/Api';\nimport { type Data } from '../../../../modules/Data/Data';\nimport {\n type IPushService,\n type IPushServiceSubscriptionKeys,\n} from '../../PushService.types';\n\nexport class PushServiceSafari implements IPushService {\n private readonly api: Api;\n private readonly data: Data;\n private readonly config: IPushServiceSafariConfig;\n\n constructor(\n api: Api,\n data: Data,\n config: IPushServiceSafariConfig,\n ) {\n this.api = api;\n this.config = config;\n this.data = data;\n }\n\n public getPermission(): NotificationPermission {\n const { permission } = this.getPermissionInfo();\n\n return permission;\n }\n\n public checkIsPermissionGranted(): boolean {\n return this.getPermission() === CONSTANTS.PERMISSION_GRANTED;\n }\n\n public checkIsPermissionDefault(): boolean {\n return this.getPermission() === CONSTANTS.PERMISSION_PROMPT;\n }\n\n public async checkIsManualUnsubscribed(): Promise<boolean> {\n return await this.data.getStatusManualUnsubscribed();\n }\n\n public async askPermission(): Promise<void> {\n const application = await this.data.getApplicationCode();\n const hwid = await this.data.getHwid();\n const payload = {\n application,\n hwid,\n };\n\n return new Promise((resolve) => {\n // safari send payload by apns to entrypoint 'https://cp.pushwoosh.com/json/1.3/safari'\n // and then take push token to browser\n safari.pushNotification.requestPermission(\n this.config.entrypoint || 'https://cp.pushwoosh.com/json/1.3/safari',\n this.config.webSitePushId,\n payload,\n () => resolve(),\n );\n });\n }\n\n public getTokens(): Promise<IPushServiceSubscriptionKeys> {\n return this.data.getTokens();\n }\n\n public async subscribe(): Promise<void> {\n const isPermissionGranted = this.checkIsPermissionGranted();\n\n if (!isPermissionGranted) {\n Logger.error('You must have permission granted before subscribe!');\n\n return;\n }\n\n const { deviceToken } = this.getPermissionInfo();\n\n await this.data.setTokens({\n pushToken: deviceToken,\n });\n\n await this.api.registerDevice();\n }\n\n public async unsubscribe(): Promise<void> {\n // remove tokens\n await this.data.setTokens({});\n\n // set info to database, that the device IS manual unsubscribed\n await this.data.setStatusManualUnsubscribed(true);\n\n // unregister device in pushwoosh\n await this.api.unregisterDevice();\n }\n\n public async checkIsRegister(): Promise<boolean> {\n return this.api.checkDeviceSubscribeForPushNotifications();\n }\n\n public async checkIsNeedResubscribe(): Promise<boolean> {\n // check web site id\n const savedWebSitePushId = await this.data.getWebSitePushId();\n const isExistSavedWebSitePushId = typeof savedWebSitePushId !== 'undefined';\n const isChangeWebSitePushId = isExistSavedWebSitePushId && this.config.webSitePushId !== savedWebSitePushId;\n\n await this.data.setWebSitePushId(this.config.webSitePushId);\n\n // check change permission status\n const lastPermission = await this.data.getLastPermissionStatus();\n const permission = this.getPermission();\n\n if (lastPermission !== permission) {\n await this.data.setLastPermissionStatus(permission);\n\n return true;\n }\n\n return isChangeWebSitePushId;\n }\n\n private getPermissionInfo(): IPushServiceSafariInfo {\n return safari.pushNotification.permission(this.config.webSitePushId);\n }\n}\n","import * as CONSTANTS from './constants';\nimport { defaultInitParams } from './defaultInitParams';\nimport { type EventHandlerMap, type EventName } from './events.types';\nimport { getGlobal, getVersion, isFunction, v4 } from './functions';\nimport { legacyEventsMap } from './legacyEventsMap';\nimport { Logger } from './logger';\nimport { EventBus } from './modules/EventBus';\nimport { type IInitParams, type PWInput } from './Pushwoosh.types';\nimport { keyValue, log as logStorage, message as messageStorage } from './storage';\nimport InboxMessagesModel from '../models/InboxMessages';\nimport { Api } from '../modules/Api/Api';\nimport { ApiClient } from '../modules/ApiClient/ApiClient';\nimport { Data } from '../modules/Data/Data';\nimport InboxMessagesPublic from '../modules/InboxMessagesPublic';\nimport { PlatformChecker } from '../modules/PlatformChecker';\nimport { PushServiceDefault, PushServiceSafari } from '../services/PushService/PushService';\nimport { type IPushService } from '../services/PushService/PushService.types';\n\nexport class Pushwoosh {\n public ready: boolean = false;\n\n public initParams: IInitParams;\n\n private readonly eventBus: EventBus;\n\n public readonly data: Data;\n private readonly apiClient: ApiClient;\n private isCommunicationDisabled?: boolean;\n public readonly api: Api;\n public driver: IPushService;\n public platformChecker: PlatformChecker;\n\n // Inbox messages public interface\n public pwinbox: InboxMessagesPublic;\n private inboxModel: InboxMessagesModel;\n\n public moduleRegistry: Record<string, any> = {};\n\n constructor() {\n this.eventBus = new EventBus();\n\n this.data = new Data();\n this.apiClient = new ApiClient(this.data);\n\n this.api = new Api(this.eventBus, this.data, this.apiClient, () => this.isCommunicationDisabled);\n\n this.platformChecker = new PlatformChecker(getGlobal());\n this.inboxModel = new InboxMessagesModel(this.eventBus, this.data, this.api);\n this.pwinbox = new InboxMessagesPublic(this.data, this.api, this.inboxModel);\n }\n\n /**\n * Add Web SDK Event Handler.\n * Alias to addEventHandler method of EventBus module.\n *\n * @public\n * @readonly\n *\n * @param {string} name - name of Web SDK event.\n * @param {function} handler - handler of Web SDK event.\n *\n * @returns {void}\n */\n public addEventHandler = <Name extends EventName>(\n name: Name,\n handler: EventHandlerMap[Name],\n ): void => this.eventBus.addEventHandler(name, handler);\n\n /**\n * Remove Web SDK Event Handler.\n * Alias to removeEventHandler method of EventBus module.\n *\n * @public\n * @readonly\n *\n * @param {string} name - name of Web SDK event.\n * @param {function} handler - handler of Web SDK event.\n *\n * @returns {void}\n */\n public removeEventHandler = <Name extends EventName>(\n name: Name,\n handler: EventHandlerMap[Name],\n ): void => this.eventBus.removeEventHandler(name, handler);\n\n /**\n * Dispatch Web SDK Event.\n * Alias to dispatchEvent method of EventBus module.\n *\n * @public\n * @readonly\n *\n * @param {string} name - name of Web SDK event.\n * @param {object} payload - event payload.\n *\n * @returns {string} - event id.\n */\n public dispatchEvent = <Name extends EventName>(\n name: Name,\n payload: Omit<Parameters<EventHandlerMap[Name]>[0], 'eventId'> & { eventId?: string },\n ): string => this.eventBus.dispatchEvent(name, payload);\n\n /**\n * Method that puts the stored error/info messages to browser console.\n * @type {{showLog: (() => Promise<any>); showKeyValues: (() => Promise<any>); showMessages: (() => Promise<any>)}}\n */\n public debug = {\n async showLog() {\n const items = await logStorage.getAll();\n console.log(items);\n },\n async showKeyValues() {\n const items = await keyValue.getAll();\n console.log(items);\n },\n async showMessages() {\n const items = await messageStorage.getAll();\n items.forEach((i: any) => console.log(i));\n },\n };\n\n /**\n * Polymorph PW method.\n * Can get array in format [string, params | callback] or function.\n *\n * // with callback:\n * Pushwoosh.push(['onNotificationClick', function(api, payload) {\n * // click on the notificationn\n * }]);\n *\n * // with function:\n * Pushwoosh.push(function(api) {\n * // this is a bit easier way to subscribe to onReady\n * });\n *\n * // with params:\n * // initiates Pushwoosh service and notification subscription\n * Pushwoosh.push(['init', {\n * applicationCode: 'XXXXX-XXXXX',\n * // see more about params in documentation\n * // https://docs.pushwoosh.com/docs/web-push-sdk-30#section-integration\n * }]);\n *\n * @param command\n */\n public push(command: PWInput) {\n if (isFunction(command)) {\n this.subscribeToLegacyEvents(CONSTANTS.LEGACY_EVENT_ON_READY, command);\n return;\n }\n\n if (!Array.isArray(command)) {\n throw new Error('Invalid command!');\n }\n\n if (command[0] === 'init') {\n this.initialize(command[1]).catch((err) => {\n console.error('Pushwoosh: Error during initialization', err);\n });\n } else if (!this.subscribeToLegacyEvents(command[0], command[1])) {\n console.log('Pushwoosh: Unknown command', command);\n throw new Error('Unknown command!');\n }\n }\n\n /**\n * Method initializes the permission dialog on the device\n * and registers through the API in case the device hasn't been registered before.\n * @returns {Promise<void>}\n */\n public async subscribe(isForceSubscribe = true): Promise<void> {\n if (this.isCommunicationDisabled) {\n throw new Error('Communication is disabled!');\n }\n\n const isPermissionDefault = this.driver.checkIsPermissionDefault();\n\n // if permission granted need ask permission for send notifications\n if (isPermissionDefault) {\n // emit event when permission dialog show\n this.eventBus.dispatchEvent('show-notification-permission-dialog', {});\n // all action before this MUST be a synchrony because\n // in new release in ff 72 we must call this event by user\n // ask permission\n // ask permissions only show prompt window, not register device for send push notifications\n await this.driver.askPermission();\n\n const permission = this.driver.getPermission();\n\n // emit event when permission dialog hide with permission state\n this.eventBus.dispatchEvent('hide-notification-permission-dialog', { permission });\n }\n\n const permission = this.driver.getPermission();\n const isManualUnsubscribed = await this.data.getStatusManualUnsubscribed();\n const isDeviceRegister = await this.api.checkDeviceSubscribeForPushNotifications(false);\n\n // if permission granted emit event and register device into pushwoosh\n if (permission === CONSTANTS.PERMISSION_GRANTED) {\n this.eventBus.dispatchEvent('permission-granted', {});\n const needSubscribe = !isDeviceRegister && !isManualUnsubscribed;\n\n if (needSubscribe || isForceSubscribe) {\n await this.driver.subscribe();\n }\n\n this.eventBus.dispatchEvent('subscribe', {});\n\n return;\n }\n\n // if permission denied emit event\n if (permission === CONSTANTS.PERMISSION_DENIED) {\n this.eventBus.dispatchEvent('permission-denied', {});\n\n if (isDeviceRegister) {\n await this.driver.unsubscribe();\n }\n\n return;\n }\n }\n\n /**\n * Unsubscribe device.\n * @returns {Promise<void>}\n */\n public async unsubscribe(): Promise<void> {\n try {\n await this.driver.unsubscribe();\n } catch (error) {\n Logger.error(error, 'Error occurred during the unsubscribe');\n throw error;\n }\n }\n\n /**\n * force subscribe if there was a manual unsubscribe\n * @returns {Promise<void>}\n */\n public async forceSubscribe(): Promise<void> {\n await this.subscribe(true);\n }\n\n /**\n * Check device's registration status\n * @returns {boolean}\n */\n public isDeviceRegistered(): boolean {\n return localStorage.getItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS) === CONSTANTS.DEVICE_REGISTRATION_STATUS_REGISTERED;\n }\n\n public isDeviceUnregistered(): boolean {\n return localStorage.getItem(CONSTANTS.KEY_DEVICE_REGISTRATION_STATUS) === CONSTANTS.DEVICE_REGISTRATION_STATUS_UNREGISTERED;\n }\n\n /**\n * Check device's subscription status\n * @returns {Promise<boolean>}\n */\n public async isSubscribed(): Promise<boolean> {\n return this.api.checkDeviceSubscribeForPushNotifications();\n }\n\n /**\n * Check current communication state\n * @returns {Promise<boolean>}\n */\n public async isCommunicationEnabled(): Promise<boolean> {\n const isCommunicationDisabled = await this.data.getStatusCommunicationDisabled();\n\n return !isCommunicationDisabled;\n }\n\n /**\n * Send \"GDPRConsent\" postEvent and depends on param \"isEnabled\"\n * device will be registered/unregistered from all communication channels.\n * @param {boolean} isEnabled\n * @returns {Promise<void>}\n */\n public async setCommunicationEnabled(isEnabled: boolean = true): Promise<void> {\n await this.data.setCommunicationEnabled(isEnabled);\n\n if (isEnabled) {\n this.isCommunicationDisabled = false;\n await this.data.setStatusDropAllData(false);\n await this.finishInit();\n const isPermissionGranted = this.driver.checkIsPermissionGranted();\n if (isPermissionGranted) {\n await this.api.registerDevice();\n await this.sendData();\n }\n } else {\n await this.api.unregisterDevice();\n }\n\n this.eventBus.dispatchEvent('change-enabled-communication', { isEnabled });\n\n const deviceType = await this.data.getDeviceType();\n await this.api.postEvent(CONSTANTS.EVENT_GDPR_CONSENT, {\n channel: isEnabled,\n device_type: deviceType,\n });\n }\n\n /**\n * Send \"GDPRDelete\" postEvent and remove all device device data from Pushwoosh.\n * @returns {Promise<void>}\n */\n public async removeAllDeviceData(): Promise<void> {\n const deviceType = await this.data.getDeviceType();\n\n await this.api.postEvent(CONSTANTS.EVENT_GDPR_DELETE, {\n status: true,\n device_type: deviceType,\n });\n\n await this.api.deleteDevice();\n await this.data.clearAll();\n\n await this.data.setStatusDropAllData(true);\n }\n\n /**\n * Method returns hardware id.\n * @returns {Promise<string>}\n */\n public async getHWID(): Promise<string> {\n return await this.data.getHwid();\n }\n\n /**\n * Method returns push token.\n * @returns {Promise<string>}\n */\n public async getPushToken(): Promise<string | undefined> {\n const { pushToken } = await this.data.getTokens();\n\n return pushToken;\n }\n\n /**\n * Method returns userId\n * @returns {Promise<string | null>}\n */\n public async getUserId(): Promise<string | undefined> {\n return await this.data.getUserId();\n }\n\n /**\n * Method returns an object with all params.\n */\n public async getParams(): Promise<IInitParams> {\n return await this.api.getParams();\n }\n\n /**\n * Method returns true if notifications available.\n * @returns {boolean}\n */\n public isAvailableNotifications(): boolean {\n return this.platformChecker.isAvailableNotifications;\n }\n\n public async sendStatisticsVisitedPage() {\n const {\n document: { title },\n location: { origin, pathname, href },\n } = window;\n\n await this.api.pageVisit({\n title,\n url_path: `${origin}${pathname}`,\n url: href,\n });\n }\n\n private async initialize(params: IInitParams) {\n this.initParams = {\n ...defaultInitParams,\n ...params,\n };\n // base logger configuration\n const manualDebug = localStorage.getItem(CONSTANTS.MANUAL_SET_LOGGER_LEVEL);\n Logger.setLevel(manualDebug || params.logLevel || 'error');\n\n // if not available push notifications -> exit\n if (!this.isAvailableNotifications()) {\n return;\n }\n\n if (!params.applicationCode) {\n throw new Error('Can\\'t find application code!');\n }\n\n // check communication disabled\n const initDisabled = params.communicationEnabled === false;\n const storedCommunicationEnabled = await this.data.getCommunicationEnabled();\n const storedOldCommunicationDisabled = await this.data.getStatusCommunicationDisabled();\n\n if (\n (initDisabled && storedCommunicationEnabled !== true)\n || storedCommunicationEnabled === false\n || storedOldCommunicationDisabled\n ) {\n this.isCommunicationDisabled = true;\n }\n\n // get current application code\n const currentApplicationCode = await this.data.getApplicationCode();\n const isUserIdChanged = await this.isUserIdChanged();\n const isApplicationCodeChanged = !currentApplicationCode || currentApplicationCode !== params.applicationCode;\n\n // if there is no previous application code or the application code has changed or user is has changed => remove all info about init params and subscription\n if (isApplicationCodeChanged || isUserIdChanged) {\n await this.data.setHwid('');\n await this.data.setUserId();\n await this.data.setEmail();\n }\n\n await this.data.setApplicationCode(params.applicationCode);\n\n // add info about platform\n await this.data.setDeviceType(this.platformChecker.getPlatformType());\n await this.data.setDeviceModel(this.platformChecker.getBrowserVersion());\n await this.data.setLanguage(params.tags?.Language || navigator.language);\n\n // set configuration info\n await this.data.setApiEntrypoint(params.pushwooshUrl || '');\n await this.data.setApiToken(params.apiToken || '');\n await this.data.setSdkVersion(getVersion());\n\n if (!this.isCommunicationDisabled) {\n await this.finishInit();\n\n // init submodules (inbox)\n try {\n await this.inboxModel.updateMessages();\n } catch (error) {\n Logger.write('error', error);\n }\n\n const delayedEvent = await this.data.getDelayedEvent();\n\n if (delayedEvent) {\n const { type, payload } = delayedEvent;\n this.emitLegacyEventsFromServiceWorker(type, payload);\n await this.data.setDelayedEvent(null);\n }\n\n // send push stat only in safari, because safari hasn't service worker\n // in other browsers stat will be sent in service worker\n if (this.platformChecker.isSafari) {\n const hashReg = /#P(.*)/;\n const hash = decodeURIComponent(document.location.hash);\n\n if (hashReg.test(hash)) {\n this.api\n .pushStat(hashReg.exec(hash)![1])\n .then(() => history.pushState(null, '', '#'));\n }\n }\n } else {\n this.eventBus.dispatchEvent('communication-disabled', {});\n }\n }\n\n private async finishInit(): Promise<void> {\n await this.ensureHwid();\n\n await this.loadConfig();\n\n await this.open();\n\n await this.sendData();\n\n // init push notification\n const applicationServerKey = await this.data.getApplicationServerKey();\n if (applicationServerKey) {\n await this.initPushNotifications(this.initParams);\n } else {\n Logger.error('Pushwoosh: No vapid key found! Please, check your application settings in Pushwoosh dashboard.');\n }\n\n // ready\n this.ready = true;\n this.eventBus.dispatchEvent('ready', {});\n\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.onmessage = (event: MessageEvent) => this.onServiceWorkerMessage(event);\n }\n\n localStorage.setItem('pushwoosh-websdk-status', 'init');\n\n // Dispatch 'pushwoosh.initialized' event\n document.dispatchEvent(new CustomEvent('pushwoosh.initialized', {\n detail: {\n pw: this,\n },\n }));\n }\n\n private async ensureHwid(reinit: boolean = false): Promise<void> {\n const hwid = await this.data.getHwid();\n if (!hwid || reinit) {\n await this.data.setHwid(this.initParams.applicationCode + '_' + v4());\n }\n }\n\n private async isUserIdChanged(): Promise<boolean> {\n const { userId } = this.initParams;\n const storedUserId = await this.data.getUserId();\n const userIdWasChanged = await this.data.getStatusUserIdWasChanged();\n\n return !!userId && userId !== 'user_id' && userId !== storedUserId && !userIdWasChanged;\n }\n\n /**\n * Default process during PW initialization.\n * Init API. Subscription to notifications.\n * Emit delayed events.\n */\n private async defaultProcess(): Promise<void> {\n const permission = this.driver.getPermission();\n\n if (permission === 'granted') {\n await this.data.setLastPermissionStatus(permission);\n }\n\n const isCommunicationDisabled = await this.data.getStatusCommunicationDisabled();\n const isDropAllData = await this.data.getStatusDropAllData();\n const isNeedResubscribe = await this.driver.checkIsNeedResubscribe();\n\n if (isCommunicationDisabled || isDropAllData) {\n await this.unsubscribe();\n\n return;\n }\n\n if (isNeedResubscribe) {\n await this.unsubscribe();\n await this.data.setStatusManualUnsubscribed(false);\n await this.data.setIsVapidChanged(false);\n }\n\n const isManualUnsubscribed = await this.data.getStatusManualUnsubscribed();\n\n // update status is register\n const isRegister = await this.api.checkDeviceSubscribeForPushNotifications(false);\n\n // Actions depending of the permissions\n switch (permission) {\n case CONSTANTS.PERMISSION_PROMPT:\n {\n // emit event permission default\n this.eventBus.dispatchEvent('permission-default', {});\n\n // device can't be register if permission default\n if (isRegister) {\n await this.unsubscribe();\n }\n\n break;\n }\n\n case CONSTANTS.PERMISSION_DENIED:\n // emit event permission denied\n this.eventBus.dispatchEvent('permission-denied', {});\n\n // device can't be register if permission default\n if (isRegister) {\n await this.unsubscribe();\n }\n\n break;\n case CONSTANTS.PERMISSION_GRANTED:\n // emit event permission granted\n this.eventBus.dispatchEvent('permission-granted', {});\n\n // device can't be register if manual unsubscribed\n if (isManualUnsubscribed && isRegister) {\n await this.unsubscribe();\n }\n\n // device must be register if not manual unsubscribed\n // or if change configuration -> resubscribe device for get new push token\n if (!isRegister && !isManualUnsubscribed || isNeedResubscribe) {\n await this.subscribe(true);\n }\n\n break;\n }\n }\n\n /**\n *\n * @param {MessageEvent} event\n */\n private onServiceWorkerMessage(event: MessageEvent) {\n const { data = {} } = event || {};\n const { type = '', payload = {} } = data || {};\n this.emitLegacyEventsFromServiceWorker(type, payload);\n }\n\n /**\n * Check device's session and call the appOpen method,\n * no more than once an hour.\n * Force need to Safari await subscribe status\n * @param {boolean} isForce\n * @returns {Promise<void>}\n */\n private async open(isForce?: boolean): Promise<void> {\n let lastApplicationOpenTime = await this.data.getLastOpenApplicationTime();\n const currentTime = Date.now();\n\n if (!lastApplicationOpenTime) {\n lastApplicationOpenTime = 0;\n }\n\n const isSendingPeriodExceeded = currentTime - lastApplicationOpenTime < CONSTANTS.PERIOD_SEND_APP_OPEN;\n const needSendOpenStatistics = isForce || !isSendingPeriodExceeded;\n\n if (!needSendOpenStatistics) {\n return;\n }\n\n await this.data.setLastOpenApplicationTime(currentTime);\n await this.api.applicationOpen();\n }\n\n private async sendData() {\n const params = this.initParams;\n\n // check user id\n const storedUserId = await this.data.getUserId();\n\n if (params.userId && params.userId !== 'user_id' && params.userId !== storedUserId) {\n await this.api.registerUser(params.userId, false);\n }\n\n const tasks: { test: () => Promise<boolean>; task: () => Promise<void> }[] = [\n {\n test: async () => {\n if (await this.data.getStatusEmailWasChanged()) {\n return false;\n }\n const storedEmail = await this.data.getEmail();\n return !!params.email && params.email !== storedEmail;\n },\n task: async () => {\n await this.api.registerEmail(params.email!, false);\n },\n },\n {\n test: async () => {\n if (await this.data.getStatusSmsNumberWasChanged()) {\n return false;\n }\n const storedSmsNumber = await this.data.getSmsNumber();\n return !!params.smsNumber && params.smsNumber !== storedSmsNumber;\n },\n task: async () => {\n await this.api.registerSmsNumber(params.smsNumber!, false);\n },\n },\n {\n test: async () => {\n if (await this.data.getStatusWhatsAppNumberWasChanged()) {\n return false;\n }\n const storedWhatsAppNumber = await this.data.getWhatsAppNumber();\n return !!params.whatsAppNumber && params.whatsAppNumber !== storedWhatsAppNumber;\n },\n task: async () => {\n await this.api.registerWhatsappNumber(params.whatsAppNumber!, false);\n },\n },\n {\n test: async () => {\n return !!params.tags;\n },\n task: async () => {\n await this.api.setTags(params.tags!);\n },\n },\n ];\n await Promise.all(tasks.map(async (worker) => {\n try {\n if (await worker.test()) {\n await worker.task();\n }\n } catch (err) {\n console.error('Pushwoosh: Error during data registration', err);\n }\n }));\n }\n\n private async loadConfig() {\n const config = await this.api.getConfig([\n 'page_visit',\n 'vapid_key',\n 'web_in_apps',\n 'events',\n 'subscription_prompt',\n ]);\n const features = config && config.features;\n await this.data.setFeatures(features);\n\n if (features) {\n // page visited feature\n if (features.page_visit && features.page_visit.enabled) {\n await keyValue.set(CONSTANTS.PAGE_VISITED_URL, features.page_visit.entrypoint);\n this.sendStatisticsVisitedPage();\n }\n\n // send default event, page visited\n if (features.events && features.events.length) {\n const isPageVisitedEvent = features.events.some(\n (event: string): boolean => event === CONSTANTS.EVENT_PW_SITE_OPENED,\n );\n if (isPageVisitedEvent) {\n this.sendPostEventVisitedPage();\n }\n }\n\n // vapid key\n if (features.vapid_key) {\n const previousServerKey = await this.data.getApplicationServerKey();\n\n await this.data.setApplicationServerKey(features.vapid_key);\n if (previousServerKey !== features.vapid_key) {\n await this.data.setIsVapidChanged(true);\n }\n }\n }\n }\n\n private async initPushNotifications(params: IInitParams): Promise<void> {\n await this.data.setDefaultNotificationImage(params.defaultNotificationImage);\n await this.data.setDefaultNotificationTitle(params.defaultNotificationTitle);\n await this.data.setServiceWorkerUrl(params.serviceWorkerUrl);\n await this.data.setServiceWorkerScope(params.scope);\n\n await this.data.setInitParams(params);\n\n await this.initDriver();\n\n // Default actions on init\n try {\n await this.defaultProcess();\n } catch (error) {\n Logger.error(error, 'Internal error: defaultProcess fail');\n }\n }\n\n private async initDriver(): Promise<void> {\n if (this.platformChecker.isSafari) {\n const { safariWebsitePushID: webSitePushId } = await this.data.getInitParams();\n\n if (!webSitePushId) {\n Logger.info('For work with Safari Push Notification add safariWebsitePushID to initParams!');\n return;\n }\n\n this.driver = new PushServiceSafari(this.api, this.data, { webSitePushId });\n\n return;\n }\n\n Logger.info({\n isAvailableServiceWorker: this.platformChecker.isAvailableServiceWorker,\n });\n\n if (this.platformChecker.isAvailableServiceWorker) {\n this.driver = new PushServiceDefault(this.api, this.data, {});\n }\n }\n\n public sendPostEventVisitedPage() {\n const {\n document: { title },\n location: { href },\n } = window;\n\n this.api.postEvent(CONSTANTS.EVENT_PW_SITE_OPENED, {\n url: href,\n title: title,\n device_type: this.platformChecker.platform,\n });\n }\n\n /**\n * @private\n *\n * @param {string} type - legacy event type\n * @param {function} handler - legacy handler\n */\n private subscribeToLegacyEvents(type: string, handler: (api?: Api, payload?: any) => void): boolean {\n let isHandled = true;\n\n switch (true) {\n case type === CONSTANTS.LEGACY_EVENT_ON_LOAD:\n handler();\n break;\n\n case type === CONSTANTS.LEGACY_EVENT_ON_READY:\n if (this.ready) {\n handler(this.api);\n break;\n }\n\n this.eventBus.addEventHandler(\n 'ready',\n () => handler(this.api),\n );\n break;\n\n case type in legacyEventsMap:\n this.eventBus.addEventHandler(\n legacyEventsMap[type].name as keyof EventHandlerMap,\n (payload: any) => {\n const { prop } = legacyEventsMap[type];\n handler(this.api, prop ? payload[prop] : undefined);\n },\n );\n break;\n\n default:\n isHandled = false;\n }\n\n return isHandled;\n }\n\n private emitLegacyEventsFromServiceWorker(type: string, payload?: any): void {\n switch (type) {\n case CONSTANTS.LEGACY_EVENT_ON_PUSH_DELIVERY:\n this.eventBus.dispatchEvent('receive-push', { notification: payload });\n break;\n\n case CONSTANTS.LEGACY_EVENT_ON_NOTIFICATION_CLICK:\n this.eventBus.dispatchEvent('open-notification', { notification: payload });\n break;\n\n case CONSTANTS.LEGACY_EVENT_ON_NOTIFICATION_CLOSE:\n this.eventBus.dispatchEvent('hide-notification', { notification: payload });\n break;\n\n case CONSTANTS.LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE:\n this.eventBus.dispatchEvent('receive-inbox-message', { message: payload });\n break;\n }\n }\n}\n"],"names":["root","factory","exports","module","define","amd","a","i","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","DEFAULT_SERVICE_WORKER_URL","KEY_DEVICE_REGISTRATION_STATUS","DEVICE_REGISTRATION_STATUS_REGISTERED","DEVICE_REGISTRATION_STATUS_UNREGISTERED","PERMISSION_DENIED","PERMISSION_GRANTED","PERMISSION_PROMPT","LEGACY_EVENT_ON_READY","LEGACY_EVENT_ON_SUBSCRIBE","LEGACY_EVENT_ON_UNSUBSCRIBE","LEGACY_EVENT_ON_REGISTER","LEGACY_EVENT_ON_PERMISSION_PROMPT","LEGACY_EVENT_ON_PERMISSION_DENIED","LEGACY_EVENT_ON_PERMISSION_GRANTED","LEGACY_EVENT_ON_SW_INIT_ERROR","LEGACY_EVENT_ON_PUSH_DELIVERY","LEGACY_EVENT_ON_NOTIFICATION_CLICK","LEGACY_EVENT_ON_NOTIFICATION_CLOSE","LEGACY_EVENT_ON_CHANGE_COMMUNICATION_ENABLED","LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE","LEGACY_EVENT_ON_UPDATE_INBOX_MESSAGES","LEGACY_EVENT_ON_SHOW_NOTIFICATION_PERMISSION_DIALOG","LEGACY_EVENT_ON_HIDE_NOTIFICATION_PERMISSION_DIALOG","LEGACY_EVENT_ON_SHOW_SUBSCRIPTION_WIDGET","LEGACY_EVENT_ON_HIDE_SUBSCRIPTION_WIDGET","EVENT_PW_SITE_OPENED","defaultInitParams","autoSubscribe","serviceWorkerUrl","getGlobal","globalThis","v4","crypto","randomUUID","replace","c","r","Math","random","toString","isFunction","legacyEventsMap","name","STORE_NAME_KEY_VALUE","STORE_NAME_MESSAGE_LOG","STORE_NAME_MAIN_LOG","STORE_NAME_INBOX_MESSAGES","storeCreatorDecorator","storeCreator","database","objectStoreNames","contains","statusIndex","store","createObjectStore","keyPath","autoIncrement","createIndex","unique","multiEntry","logStore","DateModule","constructor","date","Date","_date","getUtcTimestamp","floor","getTime","getTimezoneOffset","getTimestamp","round","setLocal","newDateTimestamp","addDays","days","getInboxFakeOrder","Migrations","dateModule","migrations","initial","dateSorted","keys","filter","sort","b","dateA","dateB","map","MigrationExecutor","db","migrationsBuilder","applyMigrations","applyMigrationsPack","forEach","migrationsPack","migration","onversionchange","event","console","info","close","databasePromise","getInstanceWithPromise","executor","Promise","resolve","reject","request","indexedDB","open","onsuccess","target","result","bind","onerror","error","onupgradeneeded","then","LogBase","_add","transaction","objectStore","add","getAll","items","Array","isArray","ids","id","length","maxItems","all","slice","delete","cursor","openCursor","ev","cursorResult","push","continue","keyValue","defaultValue","timeout","isComplete","isError","check","clearTimeout","setTimeout","extend","oldValues","newValues","set","put","log","environment","self","registration","type","message","additional","Error","stack","levels","debug","limitLevel","Logger","setLevel","level","write","levelName","levelNumber","args","groupCollapsed","trace","groupEnd","EventBus","addEventHandler","handler","savedEventHandlers","handlers","removeEventHandler","savedEventHandler","dispatchEvent","payload","eventId","data","api","inboxModel","publicMessageBuilder","messageTypeFactory","action_type","actionParams","messageType","l","startsWith","updateMessagesStatusWithCodes","codes","messages","status","updatedMessages","inboxStatusQueries","async","msg","indexOf","inbox_id","inboxStatus","order","putBulkMessages","action_params","image","title","send_date","text","imageUrl","getDefaultNotificationImage","inboxTitle","getDefaultNotificationTitle","JSON","parse","parseInt","code","sendDate","toISOString","link","isRead","isActionPerformed","messagesWithNoActionPerformedCount","getDeliveredReadMessagesCount","unreadMessagesCount","getDeliveredMessagesCount","messagesCount","loadMessages","buildMessagePromises","getReadOpenMessages","getDeliveredMessages","msgA","msgB","readMessagesWithCodes","unreadMessages","performActionForMessageWithCode","getMessage","document","location","href","window","history","go","putMessage","deleteMessagesWithCodes","readMessages","syncMessages","updateMessages","Store","index","indexNames","_index","warn","writeRequestPromise","readRequestPromise","count","query","countByIndex","Storage","dbVersionChangeHandler","dbRequestSuccessHandler","dbRequestUpgradeNeededHandler","getDB","storeName","indexName","InboxMessages","eventBus","storage","getInboxMessages","response","storeGetInboxMessagesRequestParams","next","new_inbox","newMessagesCount","setInboxLastRequestTime","setInboxLastRequestCode","setInboxNewMessagesCount","putServerMessages","putTransactions","localMessage","deleteMessages","deleteTransactions","deleteExpiredMessages","upperBound","codesToDelete","rt","getReadMessagesCount","readStatus","openStatus","keyRange","IDBKeyRange","bound","deleted","getKey","Data","clearAll","undefined","setApplicationCode","application","getApplicationCode","setApiToken","token","getApiToken","setHwid","hwid","getHwid","setDeviceType","getDeviceType","setDeviceModel","model","getDeviceModel","setLanguage","language","getLanguage","setApiEntrypoint","url","getApiEntrypoint","setTokens","tokens","getTokens","setApplicationServerKey","getApplicationServerKey","setIsVapidChanged","getIsVapidChanged","setWebSitePushId","senderId","getWebSitePushId","setDefaultNotificationImage","setDefaultNotificationTitle","setUserId","userId","getUserId","setStatusUserIdWasChanged","getStatusUserIdWasChanged","setEmail","email","getEmail","setStatusEmailWasChanged","getStatusEmailWasChanged","setSmsNumber","number","getSmsNumber","setStatusSmsNumberWasChanged","getStatusSmsNumberWasChanged","setWhatsAppNumber","getWhatsAppNumber","setStatusWhatsAppNumberWasChanged","getStatusWhatsAppNumberWasChanged","setLastPermissionStatus","getLastPermissionStatus","setStatusManualUnsubscribed","getStatusManualUnsubscribed","setStatusCommunicationDisabled","getStatusCommunicationDisabled","setCommunicationEnabled","getCommunicationEnabled","setStatusDropAllData","getStatusDropAllData","setSdkVersion","version","getSdkVersion","setServiceWorkerVersion","getServiceWorkerVersion","setServiceWorkerUrl","getServiceWorkerUrl","setServiceWorkerScope","scope","getServiceWorkerScope","setLastOpenMessage","getLastOpenMessage","setLastOpenApplicationTime","time","getLastOpenApplicationTime","setFeatures","features","getFeatures","setInitParams","params","getInitParams","lastCode","getInboxLastRequestCode","lastRequestTime","getInboxLastRequestTime","getInboxNewMessagesCount","setDelayedEvent","getDelayedEvent","setPromptDisplayCount","getPromptDisplayCount","setPromptLastSeenTime","getPromptLastSeenTime","ApiClient","logger","checkDevice","options","createRequest","getConfig","applicationOpen","registerDevice","unregisterDevice","deleteDevice","messageDeliveryEvent","pushStat","setTags","getTags","registerUser","registerEmail","registerEmailUser","setEmailTags","postEvent","pageVisit","setPurchase","multiRegisterDevice","methodName","customUrl","entrypoint","apiToken","authRequestOptions","headers","Authorization","Origin","origin","credentials","fetch","method","body","stringify","checkResponse","base_url","errorMessage","statusText","json","status_message","status_code","_e","Api","apiClient","getIsCommunicationDisabled","getRequestParams","checkDeviceSubscribeForPushNotifications","useCache","localStorage","getItem","exist","push_token_exist","setItem","now","pushToken","push_token","auth_token","authToken","public_key","publicKey","hash","isTrackingLogOnFailure","metaData","tags","device_type","isManual","_device_type","deviceType","ts_offset","test","_hwid","requestParams","registerSmsNumber","registerWhatsappNumber","attributes","timestampUTC","timestampCurrent","lastOpenMessage","expiry","msgHash","messageHash","last_code","last_request_time","inbox_code","config","page_visit","applicationCode","deviceModel","fullRequest","user_id","String","sms_phone_number","whatsapp_phone_number","timezone","push_devices","pushDevice","platform","sdk_version","webPushData","browser","platformData","getParams","device_model","v","PlatformChecker","global","_isSafari","isSafariBrowser","_isOpera","isOperaBrowser","_isEdge","isEdgeBrowser","_isFirefox","isFirefoxBrowser","_isChrome","isChromeBrowser","_isMacOS","isMacOS","_isAvailableServiceWorker","canUseServiceWorkers","_isAvailableNotifications","canReceiveNotifications","_platform","getPlatformType","_browserVersion","getBrowserVersion","isEdge","isSafari","isOpera","isAvailableServiceWorker","isAvailableNotifications","browserVersion","navigator","userAgent","toLowerCase","vendor","serviceWorker","matchOperaVersion","match","matchEdgeVersion","matchEdgVersion","appName","appVersion","splice","join","PushServiceDefault","getPermission","Notification","permission","checkIsPermissionGranted","checkIsPermissionDefault","checkIsManualUnsubscribed","askPermission","requestPermission","subscribe","subscription","currentSubscription","trySubscribe","getPushToken","_p256dn","_auth","p256dh","btoa","fromCharCode","apply","Uint8Array","auth","endpoint","unsubscribe","getServiceWorkerRegistration","pushManager","getSubscription","checkIsRegister","checkIsNeedResubscribe","lastPermission","getCredentials","pushTokenFromSubscription","subscriptionTokensFromStore","isEqualPushTokens","isVapidChanged","registerServiceWorker","getRegistration","update","cleanCache","register","subscribePushManager","applicationServerKey","userVisibleOnly","urlBase64ToUint8Array","base64String","base64","repeat","rawData","atob","outputArray","charCodeAt","PushServiceSafari","getPermissionInfo","safari","pushNotification","webSitePushId","deviceToken","savedWebSitePushId","isChangeWebSitePushId","Pushwoosh","ready","moduleRegistry","showLog","showKeyValues","showMessages","isCommunicationDisabled","platformChecker","pwinbox","command","subscribeToLegacyEvents","initialize","catch","err","isForceSubscribe","driver","isManualUnsubscribed","isDeviceRegister","forceSubscribe","isDeviceRegistered","isDeviceUnregistered","isSubscribed","isCommunicationEnabled","isEnabled","finishInit","sendData","channel","removeAllDeviceData","getHWID","sendStatisticsVisitedPage","pathname","url_path","initParams","manualDebug","logLevel","initDisabled","communicationEnabled","storedCommunicationEnabled","storedOldCommunicationDisabled","currentApplicationCode","isUserIdChanged","Language","pushwooshUrl","delayedEvent","emitLegacyEventsFromServiceWorker","hashReg","decodeURIComponent","exec","pushState","ensureHwid","loadConfig","initPushNotifications","onmessage","onServiceWorkerMessage","CustomEvent","detail","pw","reinit","storedUserId","userIdWasChanged","defaultProcess","isDropAllData","isNeedResubscribe","isRegister","isForce","lastApplicationOpenTime","currentTime","tasks","storedEmail","task","storedSmsNumber","smsNumber","storedWhatsAppNumber","whatsAppNumber","worker","enabled","events","some","sendPostEventVisitedPage","vapid_key","previousServerKey","defaultNotificationImage","defaultNotificationTitle","initDriver","safariWebsitePushID","isHandled","notification"],"sourceRoot":""}
|