web-push-notifications 3.44.15 → 3.45.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"service-worker.js","mappings":"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","sources":["webpack://web-push-notifications/webpack/universalModuleDefinition","webpack://web-push-notifications/./src/core/constants.ts","webpack://web-push-notifications/./src/core/functions.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/helpers/pwlogger/Logger.constants.ts","webpack://web-push-notifications/./src/helpers/pwlogger/handlers/handler-console/handler-console.ts","webpack://web-push-notifications/./src/helpers/logger.ts","webpack://web-push-notifications/./src/helpers/pwlogger/Logger.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/helpers/unescape.ts","webpack://web-push-notifications/./src/modules/Data/Data.ts","webpack://web-push-notifications/./src/models/NotificationPayload.ts","webpack://web-push-notifications/./src/modules/ApiClient/ApiClient.ts","webpack://web-push-notifications/./src/services/PushService/drivers/PushServiceDefault/PushServiceDefault.ts","webpack://web-push-notifications/./src/worker/notification.ts","webpack://web-push-notifications/./src/service-worker.ts","webpack://web-push-notifications/./src/core/modules/EventBus/EventBus.ts","webpack://web-push-notifications/./src/modules/Api/Api.ts","webpack://web-push-notifications/./src/worker/global.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 ","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","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 { 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 {\n type TLoggerLevelSilent,\n type TLoggerLevelFatal,\n type TLoggerLevelError,\n type TLoggerLevelWarn,\n type TLoggerLevelInfo,\n type TLoggerLevelDebug,\n} from './Logger.types';\n\nexport const LOGGER_LEVEL_SILENT: TLoggerLevelSilent = 'silent';\nexport const LOGGER_LEVEL_FATAL: TLoggerLevelFatal = 'fatal';\nexport const LOGGER_LEVEL_ERROR: TLoggerLevelError = 'error';\nexport const LOGGER_LEVEL_WARN: TLoggerLevelWarn = 'warn';\nexport const LOGGER_LEVEL_INFO: TLoggerLevelInfo = 'info';\nexport const LOGGER_LEVEL_DEBUG: TLoggerLevelDebug = 'debug';\n\nexport const LOGGER_LEVEL_VALUE_SILENT = 0;\nexport const LOGGER_LEVEL_VALUE_FATAL = 10;\nexport const LOGGER_LEVEL_VALUE_ERROR = 20;\nexport const LOGGER_LEVEL_VALUE_WARN = 30;\nexport const LOGGER_LEVEL_VALUE_INFO = 40;\nexport const LOGGER_LEVEL_VALUE_DEBUG = 50;\n\nexport const loggerRelationsMap = {\n [LOGGER_LEVEL_SILENT]: LOGGER_LEVEL_VALUE_SILENT,\n [LOGGER_LEVEL_FATAL]: LOGGER_LEVEL_VALUE_FATAL,\n [LOGGER_LEVEL_ERROR]: LOGGER_LEVEL_VALUE_ERROR,\n [LOGGER_LEVEL_WARN]: LOGGER_LEVEL_VALUE_WARN,\n [LOGGER_LEVEL_INFO]: LOGGER_LEVEL_VALUE_INFO,\n [LOGGER_LEVEL_DEBUG]: LOGGER_LEVEL_VALUE_DEBUG,\n};\n","import {\n type ILoggerMessage,\n type TLoggerOutputLevels,\n} from './../../Logger';\n\nexport function handlerConsole(message: ILoggerMessage) {\n const {\n code,\n text,\n type,\n } = message;\n\n const log = getOutputFunction(type);\n // tslint:disable-next-line\n console.groupCollapsed(type);\n\n if (code) {\n log(`${code}: ${text}`);\n } else {\n log(text);\n }\n\n // tslint:disable-next-line\n console.groupEnd();\n}\n\nfunction getOutputFunction(type: TLoggerOutputLevels): (text: string) => void {\n switch (type) {\n case 'fatal':\n case 'error':\n // tslint:disable-next-line\n return console.error;\n\n case 'warn':\n case 'info':\n case 'debug':\n // tslint:disable-next-line\n return console.log;\n }\n}\n","import {\n Logger,\n handlerConsole,\n} from './pwlogger';\n\ntype TLogMessage = {\n message: string;\n code: string;\n error: any;\n\n [key: string]: any;\n};\n\nconst logger = new Logger({\n level: 'error',\n subscribers: [\n {\n level: 'fatal',\n handler: handlerConsole,\n },\n {\n level: 'error',\n handler: handlerConsole,\n },\n ],\n});\n\nasync function sendFatalLogToRemoteServer(params: TLogMessage) {\n const message = makeMessage(params);\n\n return logger.fatal(message.text, message.code, message.options);\n}\n\nasync function sendErrorLogToRemoteServer(params: TLogMessage) {\n const message = makeMessage(params);\n\n return logger.error(message.text, message.code, message.options);\n}\n\nfunction makeMessage(params: TLogMessage) {\n const {\n message,\n code,\n error,\n ...data\n } = params;\n\n const cleanError = makeCleanError(error);\n\n const options = {\n ...data,\n errorText: cleanError.message,\n errorStack: cleanError.stack,\n };\n\n return {\n text: message,\n code,\n options,\n };\n}\n\nfunction makeCleanError(error: any): Error {\n let cleanError: Error = new Error('unknown error');\n\n if (typeof error === 'string' || typeof error === 'number' || typeof error === 'boolean') {\n cleanError.message = error.toString();\n }\n\n if (error instanceof Error) {\n cleanError = error;\n }\n\n return cleanError;\n}\n\nexport {\n logger,\n sendFatalLogToRemoteServer,\n sendErrorLogToRemoteServer,\n};\n","import {\n loggerRelationsMap,\n LOGGER_LEVEL_FATAL,\n LOGGER_LEVEL_ERROR,\n LOGGER_LEVEL_WARN,\n LOGGER_LEVEL_INFO,\n LOGGER_LEVEL_DEBUG, LOGGER_LEVEL_SILENT,\n} from './Logger.constants';\nimport {\n type ILoggerConfig,\n type TLoggerLevels,\n type TLoggerApplicationType,\n type ILoggerLogOptions,\n type ILoggerLogParams,\n type ILoggerMessage,\n type TLoggerHandler,\n type ILoggerSubscriber,\n type TLoggerOutputLevels,\n type TReject,\n} from './Logger.types';\n\nexport * from './Logger.types';\nexport * from './Logger.constants';\n\nexport class Logger {\n public readonly relations: typeof loggerRelationsMap = loggerRelationsMap;\n public applicationType: TLoggerApplicationType;\n public level: TLoggerLevels;\n public readonly subscribers: ILoggerSubscriber[];\n\n public applicationCode: string | undefined;\n public domain: string | undefined;\n public deviceInfo: { [key: string]: any } | undefined;\n\n constructor(config?: ILoggerConfig) {\n this.level = config && typeof (config.level) !== 'undefined' ? config.level : LOGGER_LEVEL_ERROR;\n this.applicationType = config && typeof (config.applicationType) !== 'undefined' ? config.applicationType : 'sdk';\n this.subscribers = config && typeof (config.subscribers) !== 'undefined' ? config.subscribers : [];\n }\n\n public updateLogLevel(level: TLoggerLevels): void {\n this.level = level;\n }\n\n public updateApplicationType(applicationType: TLoggerApplicationType): void {\n this.applicationType = applicationType;\n }\n\n public updateApplicationCode(applicationCode: string): void {\n this.applicationCode = applicationCode;\n }\n\n public updateDomain(domain: string): void {\n this.domain = domain;\n }\n\n public updateDeviceInfo(deviceInfo: { [key: string]: any }): void {\n this.deviceInfo = deviceInfo;\n }\n\n public subscribe(level: TLoggerOutputLevels, handler: TLoggerHandler) {\n this.subscribers.push({\n handler,\n level,\n });\n }\n\n public async log(params: ILoggerLogParams): Promise<void> {\n const actions: Array<Promise<void> | void> = [];\n const {\n options,\n ...other\n } = params;\n\n let data = other;\n\n if (options) {\n const {\n handler: _handler,\n ...additionalData\n } = options;\n\n data = {\n ...other,\n ...additionalData,\n };\n }\n const message = this.getMessage(data);\n\n this.subscribers.forEach((subscriber) => {\n if (subscriber.level === params.type && this.relations[subscriber.level] <= this.relations[this.level]) {\n actions.push(subscriber.handler.call(null, message));\n }\n });\n\n if (options && options.handler && this.level !== LOGGER_LEVEL_SILENT) {\n options.handler.call(null, message);\n }\n\n await Promise.all(actions);\n return;\n }\n\n public async debug(text: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_DEBUG,\n text,\n options,\n });\n }\n\n public async info(text: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_INFO,\n text,\n options,\n });\n }\n\n public async warn(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_WARN,\n text,\n code,\n options,\n });\n }\n\n public async error(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_ERROR,\n text,\n code,\n options,\n });\n }\n\n public async fatal(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_FATAL,\n text,\n code,\n options,\n });\n }\n\n public async errorAndThrow(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.logAndThrow({\n type: LOGGER_LEVEL_ERROR,\n text,\n code,\n options,\n });\n }\n\n public async errorAndReject(cb: TReject, text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.logAndReject(cb, {\n type: LOGGER_LEVEL_ERROR,\n text,\n code,\n options,\n });\n }\n\n public async fatalAndThrow(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.logAndThrow({\n type: LOGGER_LEVEL_FATAL,\n text,\n code,\n options,\n });\n }\n\n public async fatalAndReject(cb: TReject, text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.logAndReject(cb, {\n type: LOGGER_LEVEL_FATAL,\n text,\n code,\n options,\n });\n }\n\n private async logAndThrow(params: ILoggerLogParams): Promise<void> {\n await this.log(params);\n\n const error = new Error(params.text);\n\n if (params.code) {\n // @ts-ignore\n error.code = params.code;\n }\n\n throw error;\n }\n\n private async logAndReject(reject: TReject, params: ILoggerLogParams): Promise<void> {\n await this.log(params);\n\n const error = new Error(params.text);\n\n if (params.code) {\n // @ts-ignore\n error.code = params.code;\n }\n\n reject(error);\n }\n\n private getMessage(params: ILoggerLogParams): ILoggerMessage {\n return {\n applicationCode: this.applicationCode,\n domain: this.domain,\n applicationType: this.applicationType,\n deviceInfo: this.deviceInfo,\n ...params,\n };\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","/** Used to map HTML entities to characters. */\nconst htmlUnescapes: { [key: string]: string } = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': '\\'',\n};\n\n/** Used to match HTML entities and HTML characters. */\nconst reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;\nconst reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `escape`this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;` and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @see escape, escapeRegExp\n * @example\n *\n * unescape('fred, barney, &amp; pebbles')\n * // => 'fred, barney, & pebbles'\n */\nexport function unescape(string: string) {\n return (string && reHasEscapedHtml.test(string))\n ? string.replace(reEscapedHtml, (entity) => htmlUnescapes[entity])\n : string;\n}\n","import * as CONSTANTS from '../../core/constants';\nimport { keyValue } from '../../core/storage';\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 await this.store.set('params.applicationCode', undefined);\n await this.store.set('params.hwid', undefined);\n await this.store.set('params.deviceType', undefined);\n await this.store.set('params.deviceModel', undefined);\n await this.store.set('params.language', undefined);\n await this.store.set('params.apiEntrypoint', undefined);\n await this.store.set('params.tokens', undefined);\n await this.store.set('params.applicationServerKey', undefined);\n await this.store.set('params.senderId', undefined);\n await this.store.set('params.webSitePushId', undefined);\n await this.store.set('params.defaultNotificationImage', undefined);\n await this.store.set('params.defaultNotificationTitle', undefined);\n await this.store.set('params.userId', undefined);\n await this.store.set('params.email', undefined);\n await this.store.set('params.userIdWasChanged', undefined);\n\n await this.store.set('params.isLastPermissionStatus', undefined);\n await this.store.set('params.isManualUnsubscribed', undefined);\n await this.store.set('params.isCommunicationDisabled', undefined);\n await this.store.set('params.isDropAllData', undefined);\n\n await this.store.set('params.sdkVersion', undefined);\n await this.store.set('params.serviceWorkerVersion', undefined);\n await this.store.set('params.serviceWorkerUrl', undefined);\n await this.store.set('params.serviceWorkerScope', undefined);\n\n await this.store.set('params.lastOpenMessage', undefined);\n await this.store.set('params.lastOpenApplicationTime', undefined);\n\n await this.store.set('params.features', undefined);\n\n await this.store.set('params.init', undefined);\n }\n\n public async setApplicationCode(application: string): Promise<void> {\n await this.store.set('params.applicationCode', application);\n }\n\n public async getApplicationCode(): Promise<string> {\n return await this.store.get('params.applicationCode');\n }\n\n public async setApiToken(token: string): Promise<string> {\n return await this.store.set('params.apiToken', token);\n }\n\n public async getApiToken(): Promise<string> {\n return await this.store.get('params.apiToken');\n }\n\n public async setHwid(hwid: string): Promise<void> {\n await this.store.set('params.hwid', hwid);\n }\n\n public async getHwid(): Promise<string> {\n return await this.store.get('params.hwid');\n }\n\n public async setDeviceType(type: number): Promise<void> {\n await this.store.set('params.deviceType', type);\n }\n\n public async getDeviceType(): Promise<number> {\n return await this.store.get('params.deviceType');\n }\n\n public async setDeviceModel(model: string): Promise<void> {\n await this.store.set('params.deviceModel', model);\n }\n\n public async getDeviceModel(): Promise<string> {\n return await this.store.get('params.deviceModel');\n }\n\n public async setLanguage(language: string): Promise<void> {\n await this.store.set('params.language', language);\n }\n\n public async getLanguage(): Promise<string> {\n return await this.store.get('params.language', 'en');\n }\n\n public async setApiEntrypoint(url: string): Promise<void> {\n await this.store.set('params.apiEntrypoint', url);\n }\n\n public async getApiEntrypoint(): Promise<string> {\n return await this.store.get('params.apiEntrypoint', CONSTANTS.DEFAULT_API_URL);\n }\n\n public async setTokens(tokens: any): Promise<void> {\n await this.store.set('params.tokens', tokens);\n }\n\n public getTokens(): Promise<any> {\n return this.store.get('params.tokens');\n }\n\n public async setApplicationServerKey(key: string): Promise<void> {\n await this.store.set('params.applicationServerKey', key);\n }\n\n public async getApplicationServerKey(): Promise<string | undefined> {\n return await this.store.get('params.applicationServerKey');\n }\n\n public async setIsVapidChanged(status: boolean): Promise<void> {\n await this.store.set('params.isVapidChanged', status);\n }\n\n public async getIsVapidChanged(): Promise<boolean> {\n return await this.store.get('params.isVapidChanged', false);\n }\n\n public async setWebSitePushId(senderId: string): Promise<void> {\n await this.store.set('params.webSitePushId', senderId);\n }\n\n public async getWebSitePushId(): Promise<string> {\n return await this.store.get('params.webSitePushId');\n }\n\n public async setDefaultNotificationImage(url?: string): Promise<void> {\n await this.store.set('params.defaultNotificationImage', url);\n }\n\n public async getDefaultNotificationImage(): Promise<string> {\n return await this.store.get('params.defaultNotificationImage', CONSTANTS.DEFAULT_NOTIFICATION_IMAGE);\n }\n\n public async setDefaultNotificationTitle(text?: string): Promise<void> {\n await this.store.set('params.defaultNotificationTitle', text);\n }\n\n public async getDefaultNotificationTitle(): Promise<string> {\n return await this.store.get('params.defaultNotificationTitle', CONSTANTS.DEFAULT_NOTIFICATION_TITLE);\n }\n\n public async setUserId(userId?: string | number): Promise<void> {\n if (!userId) {\n await this.store.set('params.userId', undefined);\n\n return;\n }\n\n await this.store.set('params.userId', userId.toString());\n }\n\n public async getUserId(): Promise<string | undefined> {\n return await this.store.get('params.userId');\n }\n\n public async setStatusUserIdWasChanged(status: boolean): Promise<void> {\n await this.store.set('params.userIdWasChanged', status);\n }\n\n public async getStatusUserIdWasChanged(): Promise<boolean> {\n return await this.store.get('params.userIdWasChanged', false);\n }\n\n public async setEmail(email?: string): Promise<void> {\n if (!email) {\n await this.store.set('params.email', undefined);\n\n return;\n }\n\n await this.store.set('params.email', email.toString());\n }\n\n public async getEmail(): Promise<string | undefined> {\n return await this.store.get('params.email');\n }\n\n public async setStatusEmailWasChanged(status: boolean): Promise<void> {\n await this.store.set('params.emailWasChanged', status);\n }\n\n public async getStatusEmailWasChanged(): Promise<boolean> {\n return await this.store.get('params.emailWasChanged', false);\n }\n\n public async setLastPermissionStatus(status: NotificationPermission): Promise<void> {\n await this.store.set('params.isLastPermissionStatus', status);\n }\n\n public async getLastPermissionStatus(): Promise<NotificationPermission | undefined> {\n return await this.store.get('params.isLastPermissionStatus');\n }\n\n public async setStatusManualUnsubscribed(status: boolean): Promise<void> {\n await this.store.set('params.isManualUnsubscribed', status);\n }\n\n public getStatusManualUnsubscribed(): Promise<boolean> {\n return this.store.get('params.isManualUnsubscribed', false);\n }\n\n public async setStatusCommunicationDisabled(status: boolean): Promise<void> {\n await this.store.set('params.isCommunicationDisabled', status);\n }\n\n public getStatusCommunicationDisabled(): Promise<boolean> {\n return this.store.get('params.isCommunicationDisabled', false);\n }\n\n public async setStatusDropAllData(status: boolean): Promise<void> {\n await this.store.set('params.isDropAllData', status);\n }\n\n public getStatusDropAllData(): Promise<boolean> {\n return this.store.get('params.isDropAllData', false);\n }\n\n public async setSdkVersion(version: string): Promise<void> {\n await this.store.set('params.sdkVersion', version);\n }\n\n public async getSdkVersion(): Promise<string> {\n return await this.store.get('params.sdkVersion');\n }\n\n public async setServiceWorkerVersion(version: string): Promise<void> {\n await this.store.set('params.serviceWorkerVersion', version);\n }\n\n public getServiceWorkerVersion(): Promise<string> {\n return this.store.get('params.serviceWorkerVersion');\n }\n\n public async setServiceWorkerUrl(url?: string | null): Promise<void> {\n if (!url) {\n return;\n }\n\n await this.store.set('params.serviceWorkerUrl', url);\n }\n\n public async getServiceWorkerUrl(): Promise<string> {\n return await this.store.get('params.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('params.serviceWorkerScope', scope);\n }\n\n public async getServiceWorkerScope(): Promise<string> {\n return await this.store.get('params.serviceWorkerScope');\n }\n\n public async setLastOpenMessage(message: any): Promise<void> {\n await this.store.set('params.lastOpenMessage', message);\n }\n\n public getLastOpenMessage(): Promise<any> {\n return this.store.get('params.lastOpenMessage');\n }\n\n public async setLastOpenApplicationTime(time: number): Promise<void> {\n await this.store.set('params.lastOpenApplicationTime', time);\n }\n\n public async getLastOpenApplicationTime(): Promise<number> {\n return await this.store.get('params.lastOpenApplicationTime');\n }\n\n public async setFeatures(features: any): Promise<void> {\n await this.store.set('params.features', features);\n }\n\n public async getFeatures(): Promise<any> {\n return await this.store.get('params.features');\n }\n\n public async setInitParams(params: any): Promise<any> {\n await this.store.set('params.init', params);\n }\n\n public async getInitParams(): Promise<any> {\n return await this.store.get('params.init');\n }\n\n public async setInboxLastRequestCode(lastCode: string): Promise<void> {\n await this.store.set('params.inbox.lastRequestCode', lastCode);\n }\n\n public async getInboxLastRequestCode(): Promise<string> {\n return await this.store.get('params.inbox.lastRequestCode', '');\n }\n\n public async setInboxLastRequestTime(lastRequestTime: number): Promise<void> {\n await this.store.set('params.inbox.lastRequestTime', lastRequestTime);\n }\n\n public async getInboxLastRequestTime(): Promise<number> {\n return this.store.get('params.inbox.lastRequestTime', 0);\n }\n\n public async setInboxNewMessagesCount(count: number): Promise<void> {\n await this.store.set('params.inbox.newMessagesCount', count);\n }\n\n public async getInboxNewMessagesCount(): Promise<number> {\n return this.store.get('params.inbox.newMessagesCount', 0);\n }\n\n public async setDelayedEvent(event: any): Promise<void> {\n await this.store.set('params.delayedEvent', event);\n }\n\n public getDelayedEvent(): Promise<any> {\n return this.store.get('params.delayedEvent');\n }\n\n public async setPromptDisplayCount(count: number): Promise<void> {\n await this.store.set('params.promptDisplayCount', count);\n }\n\n public async getPromptDisplayCount(): Promise<number> {\n return this.store.get('params.promptDisplayCount', 0);\n }\n\n public async setPromptLastSeenTime(time: number): Promise<void> {\n await this.store.set('params.promptLastSeenTime', time);\n }\n\n public async getPromptLastSeenTime(): Promise<number> {\n return this.store.get('params.promptLastSeenTime', 0);\n }\n}\n","import { type IInboxMessage, type TInboxActionLink, type TInboxMessageStatusDelivered } from './InboxMessages.types';\nimport {\n type IChromeNotificationPayload,\n type INotificationButton,\n type INotificationOptionsPayload,\n type INotificationPayload,\n type INotificationPayloadInboxParams,\n type IShowNotificationOptions,\n} from './NotificationPayload.types';\nimport { parseSerializedNotificationParams } from '../core/functions';\nimport { unescape } from '../helpers/unescape';\nimport { Data } from '../modules/Data/Data';\nimport DateModule from '../modules/DateModule';\n\n/**\n * Build notification payload for different usage (show notification, use in sdk, inbox messages)\n */\nexport default class NotificationPayload {\n payload: INotificationPayload;\n data: Data;\n code: string;\n dateModule: DateModule;\n\n constructor(\n payload: INotificationPayload | IChromeNotificationPayload,\n data: Data = new Data(),\n dateModule: DateModule = new DateModule(),\n ) {\n // Set payload\n if ('data' in payload) {\n const chromePayload = <IChromeNotificationPayload>payload;\n this.payload = chromePayload.data;\n } else {\n this.payload = <INotificationPayload>payload;\n }\n\n this.data = data;\n this.code = `notificationCode-${Date.now()}-${Math.random().toString(16).slice(2, 10)}`;\n this.dateModule = dateModule;\n }\n\n async getIcon(): Promise<string> {\n return this.payload.i || await this.data.getDefaultNotificationImage();\n }\n\n async getTitle(): Promise<string> {\n return this.payload.header || await this.data.getDefaultNotificationTitle();\n }\n\n get silent(): boolean {\n return Boolean(this.payload.silent);\n }\n\n get body(): string {\n return this.payload.body;\n }\n\n get messageHash(): string {\n return this.payload.p || '';\n }\n\n get metaData(): { [key: string]: any } {\n return this.payload.md\n ? parseSerializedNotificationParams(this.payload.md)\n : {};\n }\n\n get image(): string {\n return this.payload.image || '';\n }\n\n get buttons(): Array<INotificationButton> {\n return this.payload.buttons\n ? parseSerializedNotificationParams(this.payload.buttons)\n : [];\n }\n\n get customData(): { [key: string]: any } {\n return this.payload.u\n ? parseSerializedNotificationParams(this.payload.u)\n : {};\n }\n\n get campaignCode(): string {\n return this.payload.pwcid || '';\n }\n\n get link(): string {\n return this.payload.l ? unescape(this.payload.l) : '/';\n }\n\n get inboxId(): string {\n return this.payload.pw_inbox || '';\n }\n\n get inboxParams(): INotificationPayloadInboxParams {\n // Parse inbox params\n if (this.payload.inbox_params) {\n return parseSerializedNotificationParams(this.payload.inbox_params);\n }\n\n return {};\n }\n\n get inboxRemovalTime(): string {\n if (this.inboxParams && this.inboxParams.rt) {\n return this.inboxParams.rt;\n }\n\n this.dateModule.date = new Date();\n this.dateModule.addDays(1); // one day removal time\n return this.dateModule.getUtcTimestamp().toString();\n }\n\n async getInboxImage(): Promise<string> {\n if (this.inboxParams && this.inboxParams.image) {\n return this.inboxParams.image;\n }\n\n return '';\n }\n\n get rootParams(): { [key: string]: any } {\n const {\n body: _body,\n p: _p,\n header: _header,\n i: _i,\n u: _u,\n l: _l,\n pwcid: _pwcid,\n image: _image,\n buttons: _buttons,\n pw_inbox: _pw_inbox,\n inbox_params: _inbox_params,\n ...rootParams\n } = this.payload;\n return rootParams;\n }\n\n async getNotificationOptionsPayload(): Promise<INotificationOptionsPayload> {\n const title = await this.getTitle();\n const icon = await this.getIcon();\n\n return {\n ...this.rootParams,\n body: this.body,\n title,\n icon,\n image: this.image,\n buttons: this.buttons,\n customData: this.customData,\n metaData: this.metaData,\n campaignCode: this.campaignCode,\n openUrl: this.link,\n messageHash: this.messageHash,\n };\n }\n\n async getShowNotificationOptions(): Promise<IShowNotificationOptions> {\n const icon = await this.getIcon();\n\n const buttons = this.buttons.map((button: INotificationButton, key: number) => {\n button.action = `action-${key}`;\n return button;\n });\n\n return {\n renotify: true,\n ...this.rootParams,\n body: this.body,\n icon,\n tag: JSON.stringify({\n url: this.link,\n messageHash: this.messageHash,\n customData: this.customData,\n metaData: this.metaData,\n }),\n data: {\n code: this.code,\n buttons,\n image: this.image,\n campaignCode: this.campaignCode,\n inboxId: this.inboxId,\n },\n silent: this.silent,\n actions: buttons,\n image: this.image,\n buttons, // old notification api artifact\n };\n }\n\n async getInboxMessage(): Promise<IInboxMessage> {\n this.dateModule.date = new Date();\n const sendDate = this.dateModule.getTimestamp().toString();\n const title = this.payload.header || '';\n const image = await this.getInboxImage();\n const actionType: TInboxActionLink = 1;\n const status: TInboxMessageStatusDelivered = 1;\n\n return {\n title,\n image,\n status,\n order: this.dateModule.getInboxFakeOrder(),\n inbox_id: this.inboxId,\n send_date: sendDate,\n rt: this.inboxRemovalTime,\n text: this.body,\n action_type: actionType,\n action_params: JSON.stringify({\n l: this.link,\n }),\n };\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\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, '', true);\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 private async createRequest<T extends TMethod>(\n methodName: T,\n request: IMapRequest[T],\n customUrl?: string,\n ignoreAuth?: boolean,\n ): Promise<IMapResponse[T]> {\n const entrypoint = await this.data.getApiEntrypoint();\n const apiToken = ignoreAuth ? '' : 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 throw new Error(`Error code: ${response.status}. Error text: ${response.statusText}`);\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 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) : 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 const deviceType = await this.data.getDeviceType();\n\n // if not chrome\n if (deviceType !== 11) {\n return;\n }\n\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","declare const self: ServiceWorkerGlobalScope;\n\nexport default class PushwooshNotification {\n private _canceled = false;\n\n private readonly showNotificationOptions: NotificationOptions;\n private readonly body: string;\n private readonly title: string;\n\n constructor(\n showNotificationOptions: NotificationOptions,\n body: string,\n title: string,\n ) {\n this.showNotificationOptions = showNotificationOptions;\n this.body = body;\n this.title = title;\n }\n\n async show() {\n if (this._canceled) {\n return;\n }\n\n const showNotificationOptions = this.showNotificationOptions;\n if (!showNotificationOptions.silent) {\n await self.registration.showNotification(this.title, showNotificationOptions);\n }\n }\n\n cancel() {\n this._canceled = true;\n }\n}\n","import {\n PERIOD_GOAL_EVENT,\n LEGACY_EVENT_ON_PUSH_DELIVERY,\n LEGACY_EVENT_ON_NOTIFICATION_CLICK,\n LEGACY_EVENT_ON_NOTIFICATION_CLOSE,\n LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE,\n} from './core/constants';\nimport { getVersion, parseSerializedNotificationParams } from './core/functions';\nimport { Logger } from './core/logger';\nimport { EventBus } from './core/modules/EventBus';\nimport { type INotificationOptions, type IPWBroadcastClientsParams, type IWorkerPushwooshGlobal } from './core/Pushwoosh.types';\nimport { message as messagesLog } from './core/storage';\nimport { sendFatalLogToRemoteServer } from './helpers/logger';\nimport InboxMessages from './models/InboxMessages';\nimport { type TInboxMessageStatusOpen } from './models/InboxMessages.types';\nimport NotificationPayload from './models/NotificationPayload';\nimport { type INotificationButton } from './models/NotificationPayload.types';\nimport { Api } from './modules/Api/Api';\nimport { Data } from './modules/Data/Data';\nimport InboxMessagesPublic from './modules/InboxMessagesPublic';\nimport { PushServiceDefault } from './services/PushService/drivers/PushServiceDefault/PushServiceDefault';\nimport WorkerPushwooshGlobal from './worker/global';\nimport PushwooshNotification from './worker/notification';\nimport { type PushSubscriptionChangeEvent } from './worker/worker.types';\n\ndeclare const self: ServiceWorkerGlobalScope & {\n Pushwoosh: IWorkerPushwooshGlobal;\n};\n\nconst eventBus = new EventBus();\nconst data = new Data();\nconst api = new Api(eventBus, data);\n\nconst Pushwoosh = self.Pushwoosh = new WorkerPushwooshGlobal(eventBus, data, api);\nconst clickedNotifications: string[] = [];\n\nself.addEventListener('install', onInstallEventHandler);\n\nself.addEventListener('activate', onActivateEventHandler);\n\nself.addEventListener('push', onPushEventHandler);\n\nself.addEventListener('notificationclick', onClickNotificationEventHandler);\n\nself.addEventListener('notificationclose', onCloseNotificationEventHandler);\n\nself.addEventListener('pushsubscriptionchange', onPushSubscriptionChange);\n\n/**\n * On install SW event handler\n * Update indexedDB SW version and skip waiting stage\n * @param event\n */\nfunction onInstallEventHandler(event: ExtendableEvent): void {\n async function onInstall(): Promise<void> {\n await Promise.all([\n Pushwoosh.data.setServiceWorkerVersion(getVersion()),\n Logger.write('info', 'install'),\n ]);\n\n // PUSH-21674 - not auto closing push if push receive when chrome is closed\n await self.skipWaiting();\n }\n\n return event.waitUntil(\n onInstall()\n .catch(onInstallFailure),\n );\n}\n\n/**\n * On activate SW event handler\n * Do nothing, only write log\n * @param event\n */\nfunction onActivateEventHandler(event: ExtendableEvent) {\n async function onActivate(): Promise<void> {\n await Promise.all([\n Logger.write('info', 'activate'),\n ]);\n\n await self.clients.claim();\n }\n\n event.waitUntil(\n onActivate()\n .catch(onActivateFailure),\n );\n}\n\n/**\n * On push SW event handler\n * @param event\n */\nfunction onPushEventHandler(event: PushEvent): void {\n async function onPush(event: PushEvent): Promise<void> {\n // wake up SW on all pages\n await self.clients.claim();\n\n // get payload\n const payload = await event.data!.json();\n\n // create notification payload\n const notificationPayload = new NotificationPayload(payload);\n\n // get notification options\n const notificationOptions = await notificationPayload.getNotificationOptionsPayload();\n\n // get notification show options\n const notificationShowOptions = await notificationPayload.getShowNotificationOptions();\n\n // get message hash\n const messageHash = notificationPayload.messageHash;\n\n // logging in indexedDB;\n await Logger.write('info', JSON.stringify(notificationOptions), 'onPush');\n\n // show notification instance\n const notification = new PushwooshNotification(\n notificationShowOptions,\n notificationPayload.body,\n await notificationPayload.getTitle(),\n );\n\n // Call receive push listeners\n const callbacks = Pushwoosh.getListeners('onPush');\n\n await callbacks.reduce((pr, fun) => pr.then(() => fun(notification)), Promise.resolve());\n\n // Execute receive push actions\n const onPushActions = [\n notification.show(), // Show notification\n messagesLog.add({ // Put message to messages store\n payload: payload,\n parsedPayload: notificationOptions,\n showOptions: notificationShowOptions,\n }),\n broadcastClients({ type: LEGACY_EVENT_ON_PUSH_DELIVERY, payload: notificationOptions }), // post message to window clients\n ];\n\n // Send delivery statistic\n if (messageHash) {\n onPushActions.push(\n Pushwoosh.initApi().then(() => Pushwoosh.api.messageDeliveryEvent(messageHash, true, notificationOptions.metaData)),\n );\n }\n\n // Inbox message actions\n if (notificationPayload.inboxId !== '') {\n const inboxMessages = new InboxMessages(Pushwoosh.eventBus, Pushwoosh.data, Pushwoosh.api);\n const inboxMessagesPublic = new InboxMessagesPublic(Pushwoosh.data, Pushwoosh.api, inboxMessages);\n const inboxMessagePayload = await notificationPayload.getInboxMessage();\n\n const payload = await inboxMessagesPublic.publicMessageBuilder(inboxMessagePayload);\n onPushActions.push(\n inboxMessages.putMessage(inboxMessagePayload), // put message to inboxMessages store\n broadcastClients({ // post message to window clients\n type: LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE,\n payload,\n }),\n );\n }\n\n await Promise.all(onPushActions);\n }\n\n event.waitUntil(\n onPush(event)\n .catch((error) => onPushFailure(error, event)),\n );\n}\n\n/**\n * On click notification event handler\n * @param event\n */\nfunction onClickNotificationEventHandler(event: NotificationEvent): void {\n async function onClickNotification(event: NotificationEvent) {\n await self.clients.claim();\n\n // get notification options\n const notificationOptions = await parseNotificationEvent(event);\n\n const {\n messageHash,\n metaData,\n url,\n code,\n inboxId,\n } = notificationOptions;\n\n if (code) {\n clickedNotifications.push(code);\n }\n\n if (inboxId !== '') {\n const inboxMessages = new InboxMessages(Pushwoosh.eventBus, Pushwoosh.data, Pushwoosh.api);\n\n const message = await inboxMessages.getMessage(inboxId);\n (<TInboxMessageStatusOpen>message.status) = 3;\n await inboxMessages.putMessage(message);\n }\n\n event.notification.close();\n\n const message = { type: LEGACY_EVENT_ON_NOTIFICATION_CLICK, payload: notificationOptions };\n\n if (url) {\n event.waitUntil(\n self.clients.matchAll({ type: 'window' })\n .then((windowClients) => {\n return focusWindow(windowClients as any, url);\n })\n .then((isFocusOnNewWindowClient) => {\n if (isFocusOnNewWindowClient) {\n Pushwoosh.data.setDelayedEvent(message);\n }\n }),\n );\n }\n\n return Promise.all([\n Pushwoosh.initApi().then(() => Pushwoosh.api.pushStat(messageHash, true, metaData)),\n Pushwoosh.data.setLastOpenMessage({\n url,\n messageHash,\n expiry: Date.now() + PERIOD_GOAL_EVENT,\n }),\n broadcastClients(message),\n ]);\n }\n\n event.waitUntil(\n onClickNotification(event)\n .catch(onClickNotificationFailure),\n );\n}\n\n/**\n * On close notification event handler\n * @param event\n */\nfunction onCloseNotificationEventHandler(event: NotificationEvent) {\n async function closeNotification(event: NotificationEvent): Promise<void> {\n await self.clients.claim();\n\n const notificationOptions = await parseNotificationEvent(event);\n const { code } = notificationOptions;\n\n event.notification.close();\n\n if (!code) {\n return;\n }\n\n const index = clickedNotifications.indexOf(code);\n if (index >= 0) {\n clickedNotifications.splice(index, 1);\n } else {\n return broadcastClients({ type: LEGACY_EVENT_ON_NOTIFICATION_CLOSE, payload: notificationOptions });\n }\n }\n\n event.waitUntil(\n closeNotification(event)\n .catch(closeNotificationFailure),\n );\n}\n\nasync function onPushSubscriptionChange(event: PushSubscriptionChangeEvent): Promise<void> {\n async function changePushSubscription(event: PushSubscriptionChangeEvent): Promise<void> {\n let subscription = event.newSubscription;\n if (!subscription) {\n subscription = await self.registration.pushManager.getSubscription();\n if (!subscription) {\n return;\n }\n }\n\n const pushService = new PushServiceDefault(api, data, {});\n await pushService.subscribe(subscription);\n }\n\n event.waitUntil(\n changePushSubscription(event)\n .catch(pushSubscriptionChangeFailure),\n );\n}\n\n/**\n * Post message to all Window Clients\n * @param msg\n */\nasync function broadcastClients(msg: IPWBroadcastClientsParams) {\n const clients = await self.clients.matchAll();\n clients.forEach((client) => client.postMessage(msg));\n}\n\nasync function focusWindow(windowClients: Array<WindowClient>, url: string): Promise<boolean> {\n // if opened url without location, use service worker origin\n const {\n hostname: openedHostname,\n pathname: openedPathname,\n } = new URL(url, self.location.origin);\n\n const clientWithSameAddress = windowClients.find((windowClient) => {\n const {\n hostname: windowClientHostname,\n pathname: windowClientPathname,\n } = new URL(windowClient.url);\n\n // opened url is equal with current window client url if hostname and pathname are equals\n return windowClientHostname === openedHostname && windowClientPathname === openedPathname;\n });\n if (clientWithSameAddress) {\n await clientWithSameAddress.focus();\n return false; // focus on exist window client\n }\n\n // if not window client with opened url we must open new window and focus it\n await self.clients.openWindow(url)\n .then((newClientWindow) => {\n // if new client window url does not match\n // of service worker domain then new client window is null\n if (!newClientWindow) {\n return;\n }\n\n newClientWindow.focus();\n });\n return true; // focus on new window client\n}\n\nasync function parseNotificationEvent(event: NotificationEvent): Promise<INotificationOptions> {\n const { notification = {} as Notification } = event;\n const { data: notificationData } = notification;\n const notificationTag = parseSerializedNotificationParams(notification.tag, {});\n\n let url = '';\n\n if (event.action && Array.isArray(notificationData.buttons)) {\n const button = notificationData.buttons.find((button: INotificationButton) => button.action === event.action) || {};\n url = button.url;\n } else {\n url = notificationTag.url;\n }\n\n return {\n title: notification.title,\n body: notification.body,\n icon: notification.icon,\n\n buttons: notificationData.buttons,\n image: notificationData.image,\n code: notificationData.code,\n campaignCode: notificationData.campaignCode,\n inboxId: notificationData.inboxId,\n\n messageHash: notificationTag.messageHash,\n customData: notificationTag.customData,\n metaData: notificationTag.metaData,\n openUrl: notificationTag.url,\n\n tag: notification.tag,\n url,\n };\n}\n\nasync function onInstallFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onInstallEventHandler',\n code: 'FATAL-SW-001',\n error,\n applicationCode,\n workerVersion,\n });\n}\n\nasync function onActivateFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onActivateEventHandler',\n code: 'FATAL-SW-002',\n error,\n applicationCode,\n workerVersion,\n });\n}\n\nasync function onPushFailure(error: Error | string, event: PushEvent): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onPushEventHandler',\n code: 'FATAL-SW-003',\n error,\n applicationCode,\n workerVersion,\n });\n\n if (!(error instanceof Error)) {\n error = new Error(error);\n }\n\n return messagesLog.add({\n error: `${error}`,\n stack: error.stack,\n payload: event.data && event.data.text(),\n });\n}\n\nasync function onClickNotificationFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onNotificationClickEventHandler',\n code: 'FATAL-SW-004',\n error,\n applicationCode,\n workerVersion,\n });\n}\n\nasync function closeNotificationFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onNotificationCloseEventHandler',\n code: 'FATAL-SW-005',\n error,\n applicationCode,\n workerVersion,\n });\n}\n\nasync function pushSubscriptionChangeFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onPushSubscriptionChange',\n code: 'FATAL-SW-006',\n error,\n applicationCode,\n workerVersion,\n });\n}\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 SetPurchaseAttributes } from './Api.types';\nimport * as CONSTANTS from '../../core/constants';\nimport { type EventBus } from '../../core/modules/EventBus';\nimport { ApiClient } from '../ApiClient/ApiClient';\nimport {\n type IMapRequest,\n type IMapResponse,\n type IRequest,\n} from '../ApiClient/ApiClient.types';\nimport { Data } from '../Data/Data';\n\nexport class Api {\n private readonly data: Data;\n private readonly apiClient: ApiClient;\n private readonly eventBus: EventBus;\n\n constructor(\n eventBus: EventBus,\n data: Data = new Data(),\n apiClient: ApiClient = new ApiClient(),\n ) {\n this.eventBus = eventBus;\n this.data = data;\n this.apiClient = apiClient;\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 have not pushToken -> user not get permission for 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 = 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 = 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 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): Promise<IMapResponse['registerUser']> {\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 const email = await this.data.getEmail();\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 // register user email in pushwoosh\n if (email) {\n await this.apiClient.registerEmailUser({\n ...params,\n email,\n userId: id,\n ts_offset: -(new Date()).getTimezoneOffset() * 60,\n });\n }\n\n // set user id to database\n await this.data.setUserId(`${userId}`);\n\n // set info to database that user id was change\n await this.data.setStatusUserIdWasChanged(true);\n\n return response;\n }\n\n public async registerEmail(email: string, params?: IMapRequest['registerEmail']): Promise<IMapResponse['registerEmail']> {\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 ...params,\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 await this.data.setStatusEmailWasChanged(true);\n\n return response;\n }\n\n public async postEvent(event: string, attributes: { [key: string]: any }): Promise<IMapResponse['postEvent']> {\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('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 triggerEvent(): Promise<void> {\n throw new Error(`Method has been deprecated, because we don't aggregate this statistics.`);\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 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 public get params(): void {\n throw new Error('Property \"Pushwoosh.api.params\" have been deprecated. Use the async method \"Pushwoosh.api.getParams()\"');\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 { isFunction } from '../core/functions';\nimport { type EventBus } from '../core/modules/EventBus';\nimport { type TPWCanWaitCallback } from '../core/Pushwoosh.types';\nimport { type Api } from '../modules/Api/Api';\nimport { type Data } from '../modules/Data/Data';\n\nexport default class WorkerPushwooshGlobal {\n public readonly eventBus: EventBus;\n public readonly api: Api;\n public readonly data: Data;\n\n constructor(eventBus: EventBus, data: Data, api: Api) {\n this.eventBus = eventBus;\n this.data = data;\n this.api = api;\n }\n\n _listeners: { [key: string]: TPWCanWaitCallback[] } = {};\n\n push(f: ['onPush', TPWCanWaitCallback]) {\n if (Array.isArray(f) && f[0] === 'onPush' && isFunction(f[1])) {\n if (!this._listeners[f[0]]) {\n this._listeners[f[0]] = [];\n }\n this._listeners[f[0]].push(f[1]);\n }\n }\n\n getListeners(eventName: string) {\n return this._listeners[eventName] || [];\n }\n\n public async initApi() {\n return Promise.resolve();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","a","i","this","KEY_DEVICE_REGISTRATION_STATUS","DEVICE_REGISTRATION_STATUS_REGISTERED","DEVICE_REGISTRATION_STATUS_UNREGISTERED","parseSerializedNotificationParams","param","defaultValue","JSON","parse","e","console","log","undefined","v4","crypto","randomUUID","replace","c","r","Math","random","toString","isFunction","value","STORE_NAME_KEY_VALUE","STORE_NAME_MESSAGE_LOG","STORE_NAME_MAIN_LOG","STORE_NAME_INBOX_MESSAGES","storeCreatorDecorator","name","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","Object","keys","filter","key","sort","b","dateA","dateB","map","MigrationExecutor","db","migrationsBuilder","applyMigrations","applyMigrationsPack","forEach","migrationsPack","migration","onversionchange","event","info","close","databasePromise","getInstanceWithPromise","executor","Promise","resolve","reject","request","indexedDB","open","onsuccess","target","result","bind","onerror","error","onupgradeneeded","then","LogBase","_add","obj","transaction","objectStore","add","getAll","items","Array","isArray","ids","id","length","maxItems","all","slice","delete","cursor","openCursor","ev","cursorResult","push","continue","keyValue","get","timeout","isComplete","isError","check","clearTimeout","setTimeout","extend","oldValues","newValues","set","put","environment","self","registration","type","message","additional","Error","stack","levels","debug","limitLevel","Logger","setLevel","level","write","levelName","levelNumber","args","groupCollapsed","trace","groupEnd","LOGGER_LEVEL_SILENT","LOGGER_LEVEL_FATAL","LOGGER_LEVEL_ERROR","LOGGER_LEVEL_WARN","LOGGER_LEVEL_INFO","LOGGER_LEVEL_DEBUG","loggerRelationsMap","handlerConsole","code","text","getOutputFunction","logger","config","relations","applicationType","subscribers","updateLogLevel","updateApplicationType","updateApplicationCode","applicationCode","updateDomain","domain","updateDeviceInfo","deviceInfo","subscribe","handler","params","actions","options","other","data","_handler","additionalData","getMessage","subscriber","call","warn","fatal","errorAndThrow","logAndThrow","errorAndReject","cb","logAndReject","fatalAndThrow","fatalAndReject","async","sendFatalLogToRemoteServer","makeMessage","cleanError","makeCleanError","errorText","errorStack","api","inboxModel","publicMessageBuilder","messageTypeFactory","action_type","actionParams","messageType","l","startsWith","updateMessagesStatusWithCodes","codes","messages","status","updatedMessages","inboxStatusQueries","msg","indexOf","inbox_id","inboxStatus","order","putBulkMessages","action_params","image","title","send_date","imageUrl","getDefaultNotificationImage","inboxTitle","getDefaultNotificationTitle","parseInt","sendDate","toISOString","link","isRead","isActionPerformed","messagesWithNoActionPerformedCount","getDeliveredReadMessagesCount","unreadMessagesCount","getDeliveredMessagesCount","messagesCount","loadMessages","buildMessagePromises","getReadOpenMessages","getDeliveredMessages","msgA","msgB","readMessagesWithCodes","unreadMessages","performActionForMessageWithCode","document","location","href","window","history","go","putMessage","deleteMessagesWithCodes","readMessages","syncMessages","updateMessages","Store","index","indexNames","_index","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","dispatchEvent","htmlUnescapes","reEscapedHtml","reHasEscapedHtml","RegExp","source","Data","clearAll","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","setLastPermissionStatus","getLastPermissionStatus","setStatusManualUnsubscribed","getStatusManualUnsubscribed","setStatusCommunicationDisabled","getStatusCommunicationDisabled","setStatusDropAllData","getStatusDropAllData","setSdkVersion","version","getSdkVersion","setServiceWorkerVersion","getServiceWorkerVersion","setServiceWorkerUrl","getServiceWorkerUrl","setServiceWorkerScope","scope","getServiceWorkerScope","setLastOpenMessage","getLastOpenMessage","setLastOpenApplicationTime","time","getLastOpenApplicationTime","setFeatures","features","getFeatures","setInitParams","getInitParams","lastCode","getInboxLastRequestCode","lastRequestTime","getInboxLastRequestTime","getInboxNewMessagesCount","setDelayedEvent","getDelayedEvent","setPromptDisplayCount","getPromptDisplayCount","setPromptLastSeenTime","getPromptLastSeenTime","NotificationPayload","payload","chromePayload","now","getIcon","getTitle","header","silent","Boolean","body","messageHash","p","metaData","md","buttons","customData","u","campaignCode","pwcid","string","test","entity","inboxId","pw_inbox","inboxParams","inbox_params","inboxRemovalTime","getInboxImage","rootParams","_body","_p","_header","_i","_u","_l","_pwcid","_image","_buttons","_pw_inbox","_inbox_params","getNotificationOptionsPayload","icon","openUrl","getShowNotificationOptions","button","action","renotify","tag","stringify","getInboxMessage","ApiClient","checkDevice","createRequest","getConfig","applicationOpen","registerDevice","unregisterDevice","deleteDevice","messageDeliveryEvent","pushStat","setTags","getTags","registerUser","registerEmail","registerEmailUser","setEmailTags","postEvent","pageVisit","setPurchase","methodName","customUrl","ignoreAuth","entrypoint","apiToken","authRequestOptions","headers","Authorization","Origin","globalThis","origin","credentials","fetch","method","checkResponse","base_url","statusText","json","status_code","status_message","PushServiceDefault","getPermission","Notification","permission","checkIsPermissionGranted","checkIsPermissionDefault","checkIsManualUnsubscribed","askPermission","requestPermission","subscription","currentSubscription","trySubscribe","pushToken","getPushToken","_p256dn","getKey","_auth","p256dh","btoa","String","fromCharCode","apply","Uint8Array","auth","publicKey","authToken","endpoint","unsubscribe","getServiceWorkerRegistration","pushManager","getSubscription","checkIsRegister","checkDeviceSubscribeForPushNotifications","checkIsNeedResubscribe","lastPermission","getCredentials","pushTokenFromSubscription","subscriptionTokensFromStore","isEqualPushTokens","isVapidChanged","registerServiceWorker","navigator","serviceWorker","getRegistration","update","cleanCache","register","subscribePushManager","applicationServerKey","userVisibleOnly","urlBase64ToUint8Array","base64String","base64","repeat","rawData","atob","outputArray","charCodeAt","PushwooshNotification","showNotificationOptions","_canceled","show","showNotification","cancel","addEventHandler","savedEventHandlers","handlers","removeEventHandler","savedEventHandler","eventId","apiClient","getRequestParams","useCache","localStorage","getItem","exist","push_token_exist","setItem","push_token","auth_token","public_key","hash","isTrackingLogOnFailure","tags","device_type","_device_type","deviceType","ts_offset","_hwid","requestParams","attributes","timestampUTC","timestampCurrent","lastOpenMessage","expiry","msgHash","last_code","last_request_time","inbox_code","triggerEvent","page_visit","getParams","deviceModel","device_model","timezone","v","Pushwoosh","_listeners","f","getListeners","eventName","initApi","clickedNotifications","broadcastClients","clients","matchAll","client","postMessage","parseNotificationEvent","notification","notificationData","notificationTag","find","onInstallFailure","workerVersion","onActivateFailure","onClickNotificationFailure","closeNotificationFailure","pushSubscriptionChangeFailure","addEventListener","waitUntil","skipWaiting","onInstall","catch","claim","onActivate","notificationPayload","notificationOptions","notificationShowOptions","callbacks","reduce","pr","fun","onPushActions","parsedPayload","showOptions","inboxMessages","inboxMessagesPublic","inboxMessagePayload","onPush","onPushFailure","windowClients","hostname","openedHostname","pathname","openedPathname","URL","clientWithSameAddress","windowClient","windowClientHostname","windowClientPathname","focus","openWindow","newClientWindow","focusWindow","isFocusOnNewWindowClient","onClickNotification","splice","closeNotification","newSubscription","pushService","changePushSubscription"],"sourceRoot":""}
1
+ {"version":3,"file":"service-worker.js","mappings":"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","sources":["webpack://web-push-notifications/webpack/universalModuleDefinition","webpack://web-push-notifications/./src/core/constants.ts","webpack://web-push-notifications/./src/core/functions.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/helpers/pwlogger/Logger.constants.ts","webpack://web-push-notifications/./src/helpers/pwlogger/handlers/handler-console/handler-console.ts","webpack://web-push-notifications/./src/helpers/logger.ts","webpack://web-push-notifications/./src/helpers/pwlogger/Logger.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/helpers/unescape.ts","webpack://web-push-notifications/./src/modules/Data/Data.ts","webpack://web-push-notifications/./src/models/NotificationPayload.ts","webpack://web-push-notifications/./src/modules/ApiClient/ApiClient.ts","webpack://web-push-notifications/./src/services/PushService/drivers/PushServiceDefault/PushServiceDefault.ts","webpack://web-push-notifications/./src/worker/notification.ts","webpack://web-push-notifications/./src/service-worker.ts","webpack://web-push-notifications/./src/core/modules/EventBus/EventBus.ts","webpack://web-push-notifications/./src/modules/Api/Api.ts","webpack://web-push-notifications/./src/worker/global.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 ","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","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 { 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 {\n type TLoggerLevelSilent,\n type TLoggerLevelFatal,\n type TLoggerLevelError,\n type TLoggerLevelWarn,\n type TLoggerLevelInfo,\n type TLoggerLevelDebug,\n} from './Logger.types';\n\nexport const LOGGER_LEVEL_SILENT: TLoggerLevelSilent = 'silent';\nexport const LOGGER_LEVEL_FATAL: TLoggerLevelFatal = 'fatal';\nexport const LOGGER_LEVEL_ERROR: TLoggerLevelError = 'error';\nexport const LOGGER_LEVEL_WARN: TLoggerLevelWarn = 'warn';\nexport const LOGGER_LEVEL_INFO: TLoggerLevelInfo = 'info';\nexport const LOGGER_LEVEL_DEBUG: TLoggerLevelDebug = 'debug';\n\nexport const LOGGER_LEVEL_VALUE_SILENT = 0;\nexport const LOGGER_LEVEL_VALUE_FATAL = 10;\nexport const LOGGER_LEVEL_VALUE_ERROR = 20;\nexport const LOGGER_LEVEL_VALUE_WARN = 30;\nexport const LOGGER_LEVEL_VALUE_INFO = 40;\nexport const LOGGER_LEVEL_VALUE_DEBUG = 50;\n\nexport const loggerRelationsMap = {\n [LOGGER_LEVEL_SILENT]: LOGGER_LEVEL_VALUE_SILENT,\n [LOGGER_LEVEL_FATAL]: LOGGER_LEVEL_VALUE_FATAL,\n [LOGGER_LEVEL_ERROR]: LOGGER_LEVEL_VALUE_ERROR,\n [LOGGER_LEVEL_WARN]: LOGGER_LEVEL_VALUE_WARN,\n [LOGGER_LEVEL_INFO]: LOGGER_LEVEL_VALUE_INFO,\n [LOGGER_LEVEL_DEBUG]: LOGGER_LEVEL_VALUE_DEBUG,\n};\n","import {\n type ILoggerMessage,\n type TLoggerOutputLevels,\n} from './../../Logger';\n\nexport function handlerConsole(message: ILoggerMessage) {\n const {\n code,\n text,\n type,\n } = message;\n\n const log = getOutputFunction(type);\n // tslint:disable-next-line\n console.groupCollapsed(type);\n\n if (code) {\n log(`${code}: ${text}`);\n } else {\n log(text);\n }\n\n // tslint:disable-next-line\n console.groupEnd();\n}\n\nfunction getOutputFunction(type: TLoggerOutputLevels): (text: string) => void {\n switch (type) {\n case 'fatal':\n case 'error':\n // tslint:disable-next-line\n return console.error;\n\n case 'warn':\n case 'info':\n case 'debug':\n // tslint:disable-next-line\n return console.log;\n }\n}\n","import {\n Logger,\n handlerConsole,\n} from './pwlogger';\n\ntype TLogMessage = {\n message: string;\n code: string;\n error: any;\n\n [key: string]: any;\n};\n\nconst logger = new Logger({\n level: 'error',\n subscribers: [\n {\n level: 'fatal',\n handler: handlerConsole,\n },\n {\n level: 'error',\n handler: handlerConsole,\n },\n ],\n});\n\nasync function sendFatalLogToRemoteServer(params: TLogMessage) {\n const message = makeMessage(params);\n\n return logger.fatal(message.text, message.code, message.options);\n}\n\nasync function sendErrorLogToRemoteServer(params: TLogMessage) {\n const message = makeMessage(params);\n\n return logger.error(message.text, message.code, message.options);\n}\n\nfunction makeMessage(params: TLogMessage) {\n const {\n message,\n code,\n error,\n ...data\n } = params;\n\n const cleanError = makeCleanError(error);\n\n const options = {\n ...data,\n errorText: cleanError.message,\n errorStack: cleanError.stack,\n };\n\n return {\n text: message,\n code,\n options,\n };\n}\n\nfunction makeCleanError(error: any): Error {\n let cleanError: Error = new Error('unknown error');\n\n if (typeof error === 'string' || typeof error === 'number' || typeof error === 'boolean') {\n cleanError.message = error.toString();\n }\n\n if (error instanceof Error) {\n cleanError = error;\n }\n\n return cleanError;\n}\n\nexport {\n logger,\n sendFatalLogToRemoteServer,\n sendErrorLogToRemoteServer,\n};\n","import {\n loggerRelationsMap,\n LOGGER_LEVEL_FATAL,\n LOGGER_LEVEL_ERROR,\n LOGGER_LEVEL_WARN,\n LOGGER_LEVEL_INFO,\n LOGGER_LEVEL_DEBUG, LOGGER_LEVEL_SILENT,\n} from './Logger.constants';\nimport {\n type ILoggerConfig,\n type TLoggerLevels,\n type TLoggerApplicationType,\n type ILoggerLogOptions,\n type ILoggerLogParams,\n type ILoggerMessage,\n type TLoggerHandler,\n type ILoggerSubscriber,\n type TLoggerOutputLevels,\n type TReject,\n} from './Logger.types';\n\nexport * from './Logger.types';\nexport * from './Logger.constants';\n\nexport class Logger {\n public readonly relations: typeof loggerRelationsMap = loggerRelationsMap;\n public applicationType: TLoggerApplicationType;\n public level: TLoggerLevels;\n public readonly subscribers: ILoggerSubscriber[];\n\n public applicationCode: string | undefined;\n public domain: string | undefined;\n public deviceInfo: { [key: string]: any } | undefined;\n\n constructor(config?: ILoggerConfig) {\n this.level = config && typeof (config.level) !== 'undefined' ? config.level : LOGGER_LEVEL_ERROR;\n this.applicationType = config && typeof (config.applicationType) !== 'undefined' ? config.applicationType : 'sdk';\n this.subscribers = config && typeof (config.subscribers) !== 'undefined' ? config.subscribers : [];\n }\n\n public updateLogLevel(level: TLoggerLevels): void {\n this.level = level;\n }\n\n public updateApplicationType(applicationType: TLoggerApplicationType): void {\n this.applicationType = applicationType;\n }\n\n public updateApplicationCode(applicationCode: string): void {\n this.applicationCode = applicationCode;\n }\n\n public updateDomain(domain: string): void {\n this.domain = domain;\n }\n\n public updateDeviceInfo(deviceInfo: { [key: string]: any }): void {\n this.deviceInfo = deviceInfo;\n }\n\n public subscribe(level: TLoggerOutputLevels, handler: TLoggerHandler) {\n this.subscribers.push({\n handler,\n level,\n });\n }\n\n public async log(params: ILoggerLogParams): Promise<void> {\n const actions: Array<Promise<void> | void> = [];\n const {\n options,\n ...other\n } = params;\n\n let data = other;\n\n if (options) {\n const {\n handler: _handler,\n ...additionalData\n } = options;\n\n data = {\n ...other,\n ...additionalData,\n };\n }\n const message = this.getMessage(data);\n\n this.subscribers.forEach((subscriber) => {\n if (subscriber.level === params.type && this.relations[subscriber.level] <= this.relations[this.level]) {\n actions.push(subscriber.handler.call(null, message));\n }\n });\n\n if (options && options.handler && this.level !== LOGGER_LEVEL_SILENT) {\n options.handler.call(null, message);\n }\n\n await Promise.all(actions);\n return;\n }\n\n public async debug(text: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_DEBUG,\n text,\n options,\n });\n }\n\n public async info(text: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_INFO,\n text,\n options,\n });\n }\n\n public async warn(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_WARN,\n text,\n code,\n options,\n });\n }\n\n public async error(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_ERROR,\n text,\n code,\n options,\n });\n }\n\n public async fatal(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.log({\n type: LOGGER_LEVEL_FATAL,\n text,\n code,\n options,\n });\n }\n\n public async errorAndThrow(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.logAndThrow({\n type: LOGGER_LEVEL_ERROR,\n text,\n code,\n options,\n });\n }\n\n public async errorAndReject(cb: TReject, text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.logAndReject(cb, {\n type: LOGGER_LEVEL_ERROR,\n text,\n code,\n options,\n });\n }\n\n public async fatalAndThrow(text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.logAndThrow({\n type: LOGGER_LEVEL_FATAL,\n text,\n code,\n options,\n });\n }\n\n public async fatalAndReject(cb: TReject, text: string, code?: string, options?: ILoggerLogOptions): Promise<void> {\n return this.logAndReject(cb, {\n type: LOGGER_LEVEL_FATAL,\n text,\n code,\n options,\n });\n }\n\n private async logAndThrow(params: ILoggerLogParams): Promise<void> {\n await this.log(params);\n\n const error = new Error(params.text);\n\n if (params.code) {\n // @ts-ignore\n error.code = params.code;\n }\n\n throw error;\n }\n\n private async logAndReject(reject: TReject, params: ILoggerLogParams): Promise<void> {\n await this.log(params);\n\n const error = new Error(params.text);\n\n if (params.code) {\n // @ts-ignore\n error.code = params.code;\n }\n\n reject(error);\n }\n\n private getMessage(params: ILoggerLogParams): ILoggerMessage {\n return {\n applicationCode: this.applicationCode,\n domain: this.domain,\n applicationType: this.applicationType,\n deviceInfo: this.deviceInfo,\n ...params,\n };\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","/** Used to map HTML entities to characters. */\nconst htmlUnescapes: { [key: string]: string } = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': '\\'',\n};\n\n/** Used to match HTML entities and HTML characters. */\nconst reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;\nconst reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `escape`this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;` and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @see escape, escapeRegExp\n * @example\n *\n * unescape('fred, barney, &amp; pebbles')\n * // => 'fred, barney, & pebbles'\n */\nexport function unescape(string: string) {\n return (string && reHasEscapedHtml.test(string))\n ? string.replace(reEscapedHtml, (entity) => htmlUnescapes[entity])\n : string;\n}\n","import * as CONSTANTS from '../../core/constants';\nimport { keyValue } from '../../core/storage';\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 await this.store.set('params.applicationCode', undefined);\n await this.store.set('params.hwid', undefined);\n await this.store.set('params.deviceType', undefined);\n await this.store.set('params.deviceModel', undefined);\n await this.store.set('params.language', undefined);\n await this.store.set('params.apiEntrypoint', undefined);\n await this.store.set('params.tokens', undefined);\n await this.store.set('params.applicationServerKey', undefined);\n await this.store.set('params.senderId', undefined);\n await this.store.set('params.webSitePushId', undefined);\n await this.store.set('params.defaultNotificationImage', undefined);\n await this.store.set('params.defaultNotificationTitle', undefined);\n await this.store.set('params.userId', undefined);\n await this.store.set('params.email', undefined);\n await this.store.set('params.userIdWasChanged', undefined);\n\n await this.store.set('params.isLastPermissionStatus', undefined);\n await this.store.set('params.isManualUnsubscribed', undefined);\n await this.store.set('params.isCommunicationDisabled', undefined);\n await this.store.set('params.isDropAllData', undefined);\n\n await this.store.set('params.sdkVersion', undefined);\n await this.store.set('params.serviceWorkerVersion', undefined);\n await this.store.set('params.serviceWorkerUrl', undefined);\n await this.store.set('params.serviceWorkerScope', undefined);\n\n await this.store.set('params.lastOpenMessage', undefined);\n await this.store.set('params.lastOpenApplicationTime', undefined);\n\n await this.store.set('params.features', undefined);\n\n await this.store.set('params.init', undefined);\n }\n\n public async setApplicationCode(application: string): Promise<void> {\n await this.store.set('params.applicationCode', application);\n }\n\n public async getApplicationCode(): Promise<string> {\n return await this.store.get('params.applicationCode');\n }\n\n public async setApiToken(token: string): Promise<string> {\n return await this.store.set('params.apiToken', token);\n }\n\n public async getApiToken(): Promise<string> {\n return await this.store.get('params.apiToken');\n }\n\n public async setHwid(hwid: string): Promise<void> {\n await this.store.set('params.hwid', hwid);\n }\n\n public async getHwid(): Promise<string> {\n return await this.store.get('params.hwid');\n }\n\n public async setDeviceType(type: number): Promise<void> {\n await this.store.set('params.deviceType', type);\n }\n\n public async getDeviceType(): Promise<number> {\n return await this.store.get('params.deviceType');\n }\n\n public async setDeviceModel(model: string): Promise<void> {\n await this.store.set('params.deviceModel', model);\n }\n\n public async getDeviceModel(): Promise<string> {\n return await this.store.get('params.deviceModel');\n }\n\n public async setLanguage(language: string): Promise<void> {\n await this.store.set('params.language', language);\n }\n\n public async getLanguage(): Promise<string> {\n return await this.store.get('params.language', 'en');\n }\n\n public async setApiEntrypoint(url: string): Promise<void> {\n await this.store.set('params.apiEntrypoint', url);\n }\n\n public async getApiEntrypoint(): Promise<string> {\n return await this.store.get('params.apiEntrypoint', CONSTANTS.DEFAULT_API_URL);\n }\n\n public async setTokens(tokens: any): Promise<void> {\n await this.store.set('params.tokens', tokens);\n }\n\n public getTokens(): Promise<any> {\n return this.store.get('params.tokens');\n }\n\n public async setApplicationServerKey(key: string): Promise<void> {\n await this.store.set('params.applicationServerKey', key);\n }\n\n public async getApplicationServerKey(): Promise<string | undefined> {\n return await this.store.get('params.applicationServerKey');\n }\n\n public async setIsVapidChanged(status: boolean): Promise<void> {\n await this.store.set('params.isVapidChanged', status);\n }\n\n public async getIsVapidChanged(): Promise<boolean> {\n return await this.store.get('params.isVapidChanged', false);\n }\n\n public async setWebSitePushId(senderId: string): Promise<void> {\n await this.store.set('params.webSitePushId', senderId);\n }\n\n public async getWebSitePushId(): Promise<string> {\n return await this.store.get('params.webSitePushId');\n }\n\n public async setDefaultNotificationImage(url?: string): Promise<void> {\n await this.store.set('params.defaultNotificationImage', url);\n }\n\n public async getDefaultNotificationImage(): Promise<string> {\n return await this.store.get('params.defaultNotificationImage', CONSTANTS.DEFAULT_NOTIFICATION_IMAGE);\n }\n\n public async setDefaultNotificationTitle(text?: string): Promise<void> {\n await this.store.set('params.defaultNotificationTitle', text);\n }\n\n public async getDefaultNotificationTitle(): Promise<string> {\n return await this.store.get('params.defaultNotificationTitle', CONSTANTS.DEFAULT_NOTIFICATION_TITLE);\n }\n\n public async setUserId(userId?: string | number): Promise<void> {\n if (!userId) {\n await this.store.set('params.userId', undefined);\n\n return;\n }\n\n await this.store.set('params.userId', userId.toString());\n }\n\n public async getUserId(): Promise<string | undefined> {\n return await this.store.get('params.userId');\n }\n\n public async setStatusUserIdWasChanged(status: boolean): Promise<void> {\n await this.store.set('params.userIdWasChanged', status);\n }\n\n public async getStatusUserIdWasChanged(): Promise<boolean> {\n return await this.store.get('params.userIdWasChanged', false);\n }\n\n public async setEmail(email?: string): Promise<void> {\n if (!email) {\n await this.store.set('params.email', undefined);\n\n return;\n }\n\n await this.store.set('params.email', email.toString());\n }\n\n public async getEmail(): Promise<string | undefined> {\n return await this.store.get('params.email');\n }\n\n public async setStatusEmailWasChanged(status: boolean): Promise<void> {\n await this.store.set('params.emailWasChanged', status);\n }\n\n public async getStatusEmailWasChanged(): Promise<boolean> {\n return await this.store.get('params.emailWasChanged', false);\n }\n\n public async setLastPermissionStatus(status: NotificationPermission): Promise<void> {\n await this.store.set('params.isLastPermissionStatus', status);\n }\n\n public async getLastPermissionStatus(): Promise<NotificationPermission | undefined> {\n return await this.store.get('params.isLastPermissionStatus');\n }\n\n public async setStatusManualUnsubscribed(status: boolean): Promise<void> {\n await this.store.set('params.isManualUnsubscribed', status);\n }\n\n public getStatusManualUnsubscribed(): Promise<boolean> {\n return this.store.get('params.isManualUnsubscribed', false);\n }\n\n public async setStatusCommunicationDisabled(status: boolean): Promise<void> {\n await this.store.set('params.isCommunicationDisabled', status);\n }\n\n public getStatusCommunicationDisabled(): Promise<boolean> {\n return this.store.get('params.isCommunicationDisabled', false);\n }\n\n public async setStatusDropAllData(status: boolean): Promise<void> {\n await this.store.set('params.isDropAllData', status);\n }\n\n public getStatusDropAllData(): Promise<boolean> {\n return this.store.get('params.isDropAllData', false);\n }\n\n public async setSdkVersion(version: string): Promise<void> {\n await this.store.set('params.sdkVersion', version);\n }\n\n public async getSdkVersion(): Promise<string> {\n return await this.store.get('params.sdkVersion');\n }\n\n public async setServiceWorkerVersion(version: string): Promise<void> {\n await this.store.set('params.serviceWorkerVersion', version);\n }\n\n public getServiceWorkerVersion(): Promise<string> {\n return this.store.get('params.serviceWorkerVersion');\n }\n\n public async setServiceWorkerUrl(url?: string | null): Promise<void> {\n if (!url) {\n return;\n }\n\n await this.store.set('params.serviceWorkerUrl', url);\n }\n\n public async getServiceWorkerUrl(): Promise<string> {\n return await this.store.get('params.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('params.serviceWorkerScope', scope);\n }\n\n public async getServiceWorkerScope(): Promise<string> {\n return await this.store.get('params.serviceWorkerScope');\n }\n\n public async setLastOpenMessage(message: any): Promise<void> {\n await this.store.set('params.lastOpenMessage', message);\n }\n\n public getLastOpenMessage(): Promise<any> {\n return this.store.get('params.lastOpenMessage');\n }\n\n public async setLastOpenApplicationTime(time: number): Promise<void> {\n await this.store.set('params.lastOpenApplicationTime', time);\n }\n\n public async getLastOpenApplicationTime(): Promise<number> {\n return await this.store.get('params.lastOpenApplicationTime');\n }\n\n public async setFeatures(features: any): Promise<void> {\n await this.store.set('params.features', features);\n }\n\n public async getFeatures(): Promise<any> {\n return await this.store.get('params.features');\n }\n\n public async setInitParams(params: any): Promise<any> {\n await this.store.set('params.init', params);\n }\n\n public async getInitParams(): Promise<any> {\n return await this.store.get('params.init');\n }\n\n public async setInboxLastRequestCode(lastCode: string): Promise<void> {\n await this.store.set('params.inbox.lastRequestCode', lastCode);\n }\n\n public async getInboxLastRequestCode(): Promise<string> {\n return await this.store.get('params.inbox.lastRequestCode', '');\n }\n\n public async setInboxLastRequestTime(lastRequestTime: number): Promise<void> {\n await this.store.set('params.inbox.lastRequestTime', lastRequestTime);\n }\n\n public async getInboxLastRequestTime(): Promise<number> {\n return this.store.get('params.inbox.lastRequestTime', 0);\n }\n\n public async setInboxNewMessagesCount(count: number): Promise<void> {\n await this.store.set('params.inbox.newMessagesCount', count);\n }\n\n public async getInboxNewMessagesCount(): Promise<number> {\n return this.store.get('params.inbox.newMessagesCount', 0);\n }\n\n public async setDelayedEvent(event: any): Promise<void> {\n await this.store.set('params.delayedEvent', event);\n }\n\n public getDelayedEvent(): Promise<any> {\n return this.store.get('params.delayedEvent');\n }\n\n public async setPromptDisplayCount(count: number): Promise<void> {\n await this.store.set('params.promptDisplayCount', count);\n }\n\n public async getPromptDisplayCount(): Promise<number> {\n return this.store.get('params.promptDisplayCount', 0);\n }\n\n public async setPromptLastSeenTime(time: number): Promise<void> {\n await this.store.set('params.promptLastSeenTime', time);\n }\n\n public async getPromptLastSeenTime(): Promise<number> {\n return this.store.get('params.promptLastSeenTime', 0);\n }\n}\n","import { type IInboxMessage, type TInboxActionLink, type TInboxMessageStatusDelivered } from './InboxMessages.types';\nimport {\n type IChromeNotificationPayload,\n type INotificationButton,\n type INotificationOptionsPayload,\n type INotificationPayload,\n type INotificationPayloadInboxParams,\n type IShowNotificationOptions,\n} from './NotificationPayload.types';\nimport { parseSerializedNotificationParams } from '../core/functions';\nimport { unescape } from '../helpers/unescape';\nimport { Data } from '../modules/Data/Data';\nimport DateModule from '../modules/DateModule';\n\n/**\n * Build notification payload for different usage (show notification, use in sdk, inbox messages)\n */\nexport default class NotificationPayload {\n payload: INotificationPayload;\n data: Data;\n code: string;\n dateModule: DateModule;\n\n constructor(\n payload: INotificationPayload | IChromeNotificationPayload,\n data: Data = new Data(),\n dateModule: DateModule = new DateModule(),\n ) {\n // Set payload\n if ('data' in payload) {\n const chromePayload = <IChromeNotificationPayload>payload;\n this.payload = chromePayload.data;\n } else {\n this.payload = <INotificationPayload>payload;\n }\n\n this.data = data;\n this.code = `notificationCode-${Date.now()}-${Math.random().toString(16).slice(2, 10)}`;\n this.dateModule = dateModule;\n }\n\n async getIcon(): Promise<string> {\n return this.payload.i || await this.data.getDefaultNotificationImage();\n }\n\n async getTitle(): Promise<string> {\n return this.payload.header || await this.data.getDefaultNotificationTitle();\n }\n\n get silent(): boolean {\n return Boolean(this.payload.silent);\n }\n\n get body(): string {\n return this.payload.body;\n }\n\n get messageHash(): string {\n return this.payload.p || '';\n }\n\n get metaData(): { [key: string]: any } {\n return this.payload.md\n ? parseSerializedNotificationParams(this.payload.md)\n : {};\n }\n\n get image(): string {\n return this.payload.image || '';\n }\n\n get buttons(): Array<INotificationButton> {\n return this.payload.buttons\n ? parseSerializedNotificationParams(this.payload.buttons)\n : [];\n }\n\n get customData(): { [key: string]: any } {\n return this.payload.u\n ? parseSerializedNotificationParams(this.payload.u)\n : {};\n }\n\n get campaignCode(): string {\n return this.payload.pwcid || '';\n }\n\n get link(): string {\n return this.payload.l ? unescape(this.payload.l) : '/';\n }\n\n get inboxId(): string {\n return this.payload.pw_inbox || '';\n }\n\n get inboxParams(): INotificationPayloadInboxParams {\n // Parse inbox params\n if (this.payload.inbox_params) {\n return parseSerializedNotificationParams(this.payload.inbox_params);\n }\n\n return {};\n }\n\n get inboxRemovalTime(): string {\n if (this.inboxParams && this.inboxParams.rt) {\n return this.inboxParams.rt;\n }\n\n this.dateModule.date = new Date();\n this.dateModule.addDays(1); // one day removal time\n return this.dateModule.getUtcTimestamp().toString();\n }\n\n async getInboxImage(): Promise<string> {\n if (this.inboxParams && this.inboxParams.image) {\n return this.inboxParams.image;\n }\n\n return '';\n }\n\n get rootParams(): { [key: string]: any } {\n const {\n body: _body,\n p: _p,\n header: _header,\n i: _i,\n u: _u,\n l: _l,\n pwcid: _pwcid,\n image: _image,\n buttons: _buttons,\n pw_inbox: _pw_inbox,\n inbox_params: _inbox_params,\n ...rootParams\n } = this.payload;\n return rootParams;\n }\n\n async getNotificationOptionsPayload(): Promise<INotificationOptionsPayload> {\n const title = await this.getTitle();\n const icon = await this.getIcon();\n\n return {\n ...this.rootParams,\n body: this.body,\n title,\n icon,\n image: this.image,\n buttons: this.buttons,\n customData: this.customData,\n metaData: this.metaData,\n campaignCode: this.campaignCode,\n openUrl: this.link,\n messageHash: this.messageHash,\n };\n }\n\n async getShowNotificationOptions(): Promise<IShowNotificationOptions> {\n const icon = await this.getIcon();\n\n const buttons = this.buttons.map((button: INotificationButton, key: number) => {\n button.action = `action-${key}`;\n return button;\n });\n\n return {\n renotify: true,\n ...this.rootParams,\n body: this.body,\n icon,\n tag: JSON.stringify({\n url: this.link,\n messageHash: this.messageHash,\n customData: this.customData,\n metaData: this.metaData,\n }),\n data: {\n code: this.code,\n buttons,\n image: this.image,\n campaignCode: this.campaignCode,\n inboxId: this.inboxId,\n },\n silent: this.silent,\n actions: buttons,\n image: this.image,\n buttons, // old notification api artifact\n };\n }\n\n async getInboxMessage(): Promise<IInboxMessage> {\n this.dateModule.date = new Date();\n const sendDate = this.dateModule.getTimestamp().toString();\n const title = this.payload.header || '';\n const image = await this.getInboxImage();\n const actionType: TInboxActionLink = 1;\n const status: TInboxMessageStatusDelivered = 1;\n\n return {\n title,\n image,\n status,\n order: this.dateModule.getInboxFakeOrder(),\n inbox_id: this.inboxId,\n send_date: sendDate,\n rt: this.inboxRemovalTime,\n text: this.body,\n action_type: actionType,\n action_params: JSON.stringify({\n l: this.link,\n }),\n };\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\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, '', true);\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 private async createRequest<T extends TMethod>(\n methodName: T,\n request: IMapRequest[T],\n customUrl?: string,\n ignoreAuth?: boolean,\n ): Promise<IMapResponse[T]> {\n const entrypoint = await this.data.getApiEntrypoint();\n const apiToken = ignoreAuth ? '' : 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 throw new Error(`Error code: ${response.status}. Error text: ${response.statusText}`);\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 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) : 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 const deviceType = await this.data.getDeviceType();\n\n // if not chrome\n if (deviceType !== 11) {\n return;\n }\n\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","declare const self: ServiceWorkerGlobalScope;\n\nexport default class PushwooshNotification {\n private _canceled = false;\n\n private readonly showNotificationOptions: NotificationOptions;\n private readonly body: string;\n private readonly title: string;\n\n constructor(\n showNotificationOptions: NotificationOptions,\n body: string,\n title: string,\n ) {\n this.showNotificationOptions = showNotificationOptions;\n this.body = body;\n this.title = title;\n }\n\n async show() {\n if (this._canceled) {\n return;\n }\n\n const showNotificationOptions = this.showNotificationOptions;\n if (!showNotificationOptions.silent) {\n await self.registration.showNotification(this.title, showNotificationOptions);\n }\n }\n\n cancel() {\n this._canceled = true;\n }\n}\n","import {\n PERIOD_GOAL_EVENT,\n LEGACY_EVENT_ON_PUSH_DELIVERY,\n LEGACY_EVENT_ON_NOTIFICATION_CLICK,\n LEGACY_EVENT_ON_NOTIFICATION_CLOSE,\n LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE,\n} from './core/constants';\nimport { getVersion, parseSerializedNotificationParams } from './core/functions';\nimport { Logger } from './core/logger';\nimport { EventBus } from './core/modules/EventBus';\nimport { type INotificationOptions, type IPWBroadcastClientsParams, type IWorkerPushwooshGlobal } from './core/Pushwoosh.types';\nimport { message as messagesLog } from './core/storage';\nimport { sendFatalLogToRemoteServer } from './helpers/logger';\nimport InboxMessages from './models/InboxMessages';\nimport { type TInboxMessageStatusOpen } from './models/InboxMessages.types';\nimport NotificationPayload from './models/NotificationPayload';\nimport { type INotificationButton } from './models/NotificationPayload.types';\nimport { Api } from './modules/Api/Api';\nimport { Data } from './modules/Data/Data';\nimport InboxMessagesPublic from './modules/InboxMessagesPublic';\nimport { PushServiceDefault } from './services/PushService/drivers/PushServiceDefault/PushServiceDefault';\nimport WorkerPushwooshGlobal from './worker/global';\nimport PushwooshNotification from './worker/notification';\nimport { type PushSubscriptionChangeEvent } from './worker/worker.types';\n\ndeclare const self: ServiceWorkerGlobalScope & {\n Pushwoosh: IWorkerPushwooshGlobal;\n};\n\nconst eventBus = new EventBus();\nconst data = new Data();\nconst api = new Api(eventBus, data);\n\nconst Pushwoosh = self.Pushwoosh = new WorkerPushwooshGlobal(eventBus, data, api);\nconst clickedNotifications: string[] = [];\n\nself.addEventListener('install', onInstallEventHandler);\n\nself.addEventListener('activate', onActivateEventHandler);\n\nself.addEventListener('push', onPushEventHandler);\n\nself.addEventListener('notificationclick', onClickNotificationEventHandler);\n\nself.addEventListener('notificationclose', onCloseNotificationEventHandler);\n\nself.addEventListener('pushsubscriptionchange', onPushSubscriptionChange);\n\n/**\n * On install SW event handler\n * Update indexedDB SW version and skip waiting stage\n * @param event\n */\nfunction onInstallEventHandler(event: ExtendableEvent): void {\n async function onInstall(): Promise<void> {\n await Promise.all([\n Pushwoosh.data.setServiceWorkerVersion(getVersion()),\n Logger.write('info', 'install'),\n ]);\n\n // PUSH-21674 - not auto closing push if push receive when chrome is closed\n await self.skipWaiting();\n }\n\n return event.waitUntil(\n onInstall()\n .catch(onInstallFailure),\n );\n}\n\n/**\n * On activate SW event handler\n * Do nothing, only write log\n * @param event\n */\nfunction onActivateEventHandler(event: ExtendableEvent) {\n async function onActivate(): Promise<void> {\n await Promise.all([\n Logger.write('info', 'activate'),\n ]);\n\n await self.clients.claim();\n }\n\n event.waitUntil(\n onActivate()\n .catch(onActivateFailure),\n );\n}\n\n/**\n * On push SW event handler\n * @param event\n */\nfunction onPushEventHandler(event: PushEvent): void {\n async function onPush(event: PushEvent): Promise<void> {\n // wake up SW on all pages\n await self.clients.claim();\n\n // get payload\n const payload = await event.data!.json();\n\n // create notification payload\n const notificationPayload = new NotificationPayload(payload);\n\n // get notification options\n const notificationOptions = await notificationPayload.getNotificationOptionsPayload();\n\n // get notification show options\n const notificationShowOptions = await notificationPayload.getShowNotificationOptions();\n\n // get message hash\n const messageHash = notificationPayload.messageHash;\n\n // logging in indexedDB;\n await Logger.write('info', JSON.stringify(notificationOptions), 'onPush');\n\n // show notification instance\n const notification = new PushwooshNotification(\n notificationShowOptions,\n notificationPayload.body,\n await notificationPayload.getTitle(),\n );\n\n // Call receive push listeners\n const callbacks = Pushwoosh.getListeners('onPush');\n\n await callbacks.reduce((pr, fun) => pr.then(() => fun(notification)), Promise.resolve());\n\n // Execute receive push actions\n const onPushActions = [\n notification.show(), // Show notification\n messagesLog.add({ // Put message to messages store\n payload: payload,\n parsedPayload: notificationOptions,\n showOptions: notificationShowOptions,\n }),\n broadcastClients({ type: LEGACY_EVENT_ON_PUSH_DELIVERY, payload: notificationOptions }), // post message to window clients\n ];\n\n // Send delivery statistic\n if (messageHash) {\n onPushActions.push(\n Pushwoosh.initApi().then(() => Pushwoosh.api.messageDeliveryEvent(messageHash, true, notificationOptions.metaData)),\n );\n }\n\n // Inbox message actions\n if (notificationPayload.inboxId !== '') {\n const inboxMessages = new InboxMessages(Pushwoosh.eventBus, Pushwoosh.data, Pushwoosh.api);\n const inboxMessagesPublic = new InboxMessagesPublic(Pushwoosh.data, Pushwoosh.api, inboxMessages);\n const inboxMessagePayload = await notificationPayload.getInboxMessage();\n\n const payload = await inboxMessagesPublic.publicMessageBuilder(inboxMessagePayload);\n onPushActions.push(\n inboxMessages.putMessage(inboxMessagePayload), // put message to inboxMessages store\n broadcastClients({ // post message to window clients\n type: LEGACY_EVENT_ON_PUT_NEW_MESSAGE_TO_INBOX_STORE,\n payload,\n }),\n );\n }\n\n await Promise.all(onPushActions);\n }\n\n event.waitUntil(\n onPush(event)\n .catch((error) => onPushFailure(error, event)),\n );\n}\n\n/**\n * On click notification event handler\n * @param event\n */\nfunction onClickNotificationEventHandler(event: NotificationEvent): void {\n async function onClickNotification(event: NotificationEvent) {\n await self.clients.claim();\n\n // get notification options\n const notificationOptions = await parseNotificationEvent(event);\n\n const {\n messageHash,\n metaData,\n url,\n code,\n inboxId,\n } = notificationOptions;\n\n if (code) {\n clickedNotifications.push(code);\n }\n\n if (inboxId !== '') {\n const inboxMessages = new InboxMessages(Pushwoosh.eventBus, Pushwoosh.data, Pushwoosh.api);\n\n const message = await inboxMessages.getMessage(inboxId);\n (<TInboxMessageStatusOpen>message.status) = 3;\n await inboxMessages.putMessage(message);\n }\n\n event.notification.close();\n\n const message = { type: LEGACY_EVENT_ON_NOTIFICATION_CLICK, payload: notificationOptions };\n\n if (url) {\n event.waitUntil(\n self.clients.matchAll({ type: 'window' })\n .then((windowClients) => {\n return focusWindow(windowClients as any, url);\n })\n .then((isFocusOnNewWindowClient) => {\n if (isFocusOnNewWindowClient) {\n Pushwoosh.data.setDelayedEvent(message);\n }\n }),\n );\n }\n\n return Promise.all([\n Pushwoosh.initApi().then(() => Pushwoosh.api.pushStat(messageHash, true, metaData)),\n Pushwoosh.data.setLastOpenMessage({\n url,\n messageHash,\n expiry: Date.now() + PERIOD_GOAL_EVENT,\n }),\n broadcastClients(message),\n ]);\n }\n\n event.waitUntil(\n onClickNotification(event)\n .catch(onClickNotificationFailure),\n );\n}\n\n/**\n * On close notification event handler\n * @param event\n */\nfunction onCloseNotificationEventHandler(event: NotificationEvent) {\n async function closeNotification(event: NotificationEvent): Promise<void> {\n await self.clients.claim();\n\n const notificationOptions = await parseNotificationEvent(event);\n const { code } = notificationOptions;\n\n event.notification.close();\n\n if (!code) {\n return;\n }\n\n const index = clickedNotifications.indexOf(code);\n if (index >= 0) {\n clickedNotifications.splice(index, 1);\n } else {\n return broadcastClients({ type: LEGACY_EVENT_ON_NOTIFICATION_CLOSE, payload: notificationOptions });\n }\n }\n\n event.waitUntil(\n closeNotification(event)\n .catch(closeNotificationFailure),\n );\n}\n\nasync function onPushSubscriptionChange(event: PushSubscriptionChangeEvent): Promise<void> {\n async function changePushSubscription(event: PushSubscriptionChangeEvent): Promise<void> {\n let subscription = event.newSubscription;\n if (!subscription) {\n subscription = await self.registration.pushManager.getSubscription();\n if (!subscription) {\n return;\n }\n }\n\n const pushService = new PushServiceDefault(api, data, {});\n await pushService.subscribe(subscription);\n }\n\n event.waitUntil(\n changePushSubscription(event)\n .catch(pushSubscriptionChangeFailure),\n );\n}\n\n/**\n * Post message to all Window Clients\n * @param msg\n */\nasync function broadcastClients(msg: IPWBroadcastClientsParams) {\n const clients = await self.clients.matchAll();\n clients.forEach((client) => client.postMessage(msg));\n}\n\nasync function focusWindow(windowClients: Array<WindowClient>, url: string): Promise<boolean> {\n // if opened url without location, use service worker origin\n const {\n hostname: openedHostname,\n pathname: openedPathname,\n } = new URL(url, self.location.origin);\n\n const clientWithSameAddress = windowClients.find((windowClient) => {\n const {\n hostname: windowClientHostname,\n pathname: windowClientPathname,\n } = new URL(windowClient.url);\n\n // opened url is equal with current window client url if hostname and pathname are equals\n return windowClientHostname === openedHostname && windowClientPathname === openedPathname;\n });\n if (clientWithSameAddress) {\n await clientWithSameAddress.focus();\n return false; // focus on exist window client\n }\n\n // if not window client with opened url we must open new window and focus it\n await self.clients.openWindow(url)\n .then((newClientWindow) => {\n // if new client window url does not match\n // of service worker domain then new client window is null\n if (!newClientWindow) {\n return;\n }\n\n newClientWindow.focus();\n });\n return true; // focus on new window client\n}\n\nasync function parseNotificationEvent(event: NotificationEvent): Promise<INotificationOptions> {\n const { notification = {} as Notification } = event;\n const { data: notificationData } = notification;\n const notificationTag = parseSerializedNotificationParams(notification.tag, {});\n\n let url = '';\n\n if (event.action && Array.isArray(notificationData.buttons)) {\n const button = notificationData.buttons.find((button: INotificationButton) => button.action === event.action) || {};\n url = button.url;\n } else {\n url = notificationTag.url;\n }\n\n return {\n title: notification.title,\n body: notification.body,\n icon: notification.icon,\n\n buttons: notificationData.buttons,\n image: notificationData.image,\n code: notificationData.code,\n campaignCode: notificationData.campaignCode,\n inboxId: notificationData.inboxId,\n\n messageHash: notificationTag.messageHash,\n customData: notificationTag.customData,\n metaData: notificationTag.metaData,\n openUrl: notificationTag.url,\n\n tag: notification.tag,\n url,\n };\n}\n\nasync function onInstallFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onInstallEventHandler',\n code: 'FATAL-SW-001',\n error,\n applicationCode,\n workerVersion,\n });\n}\n\nasync function onActivateFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onActivateEventHandler',\n code: 'FATAL-SW-002',\n error,\n applicationCode,\n workerVersion,\n });\n}\n\nasync function onPushFailure(error: Error | string, event: PushEvent): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onPushEventHandler',\n code: 'FATAL-SW-003',\n error,\n applicationCode,\n workerVersion,\n });\n\n if (!(error instanceof Error)) {\n error = new Error(error);\n }\n\n return messagesLog.add({\n error: `${error}`,\n stack: error.stack,\n payload: event.data && event.data.text(),\n });\n}\n\nasync function onClickNotificationFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onNotificationClickEventHandler',\n code: 'FATAL-SW-004',\n error,\n applicationCode,\n workerVersion,\n });\n}\n\nasync function closeNotificationFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onNotificationCloseEventHandler',\n code: 'FATAL-SW-005',\n error,\n applicationCode,\n workerVersion,\n });\n}\n\nasync function pushSubscriptionChangeFailure(error: Error | string): Promise<void> {\n const applicationCode = await Pushwoosh.data.getApplicationCode();\n const workerVersion = await Pushwoosh.data.getServiceWorkerVersion();\n\n await sendFatalLogToRemoteServer({\n message: 'Error in onPushSubscriptionChange',\n code: 'FATAL-SW-006',\n error,\n applicationCode,\n workerVersion,\n });\n}\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 SetPurchaseAttributes } from './Api.types';\nimport * as CONSTANTS from '../../core/constants';\nimport { type EventBus } from '../../core/modules/EventBus';\nimport { ApiClient } from '../ApiClient/ApiClient';\nimport {\n type IMapRequest,\n type IMapResponse,\n type IRequest,\n} from '../ApiClient/ApiClient.types';\nimport { Data } from '../Data/Data';\n\nexport class Api {\n private readonly data: Data;\n private readonly apiClient: ApiClient;\n private readonly eventBus: EventBus;\n\n constructor(\n eventBus: EventBus,\n data: Data = new Data(),\n apiClient: ApiClient = new ApiClient(),\n ) {\n this.eventBus = eventBus;\n this.data = data;\n this.apiClient = apiClient;\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 have not pushToken -> user not get permission for 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 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): Promise<IMapResponse['registerUser']> {\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 const email = await this.data.getEmail();\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 // register user email in pushwoosh\n if (email) {\n await this.apiClient.registerEmailUser({\n ...params,\n email,\n userId: id,\n ts_offset: -(new Date()).getTimezoneOffset() * 60,\n });\n }\n\n // set user id to database\n await this.data.setUserId(`${userId}`);\n\n // set info to database that user id was change\n await this.data.setStatusUserIdWasChanged(true);\n\n return response;\n }\n\n public async registerEmail(email: string, params?: IMapRequest['registerEmail']): Promise<IMapResponse['registerEmail']> {\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 ...params,\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 await this.data.setStatusEmailWasChanged(true);\n\n return response;\n }\n\n public async postEvent(event: string, attributes: { [key: string]: any }): Promise<IMapResponse['postEvent']> {\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('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 triggerEvent(): Promise<void> {\n throw new Error(`Method has been deprecated, because we don't aggregate this statistics.`);\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 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 public get params(): void {\n throw new Error('Property \"Pushwoosh.api.params\" have been deprecated. Use the async method \"Pushwoosh.api.getParams()\"');\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 { isFunction } from '../core/functions';\nimport { type EventBus } from '../core/modules/EventBus';\nimport { type TPWCanWaitCallback } from '../core/Pushwoosh.types';\nimport { type Api } from '../modules/Api/Api';\nimport { type Data } from '../modules/Data/Data';\n\nexport default class WorkerPushwooshGlobal {\n public readonly eventBus: EventBus;\n public readonly api: Api;\n public readonly data: Data;\n\n constructor(eventBus: EventBus, data: Data, api: Api) {\n this.eventBus = eventBus;\n this.data = data;\n this.api = api;\n }\n\n _listeners: { [key: string]: TPWCanWaitCallback[] } = {};\n\n push(f: ['onPush', TPWCanWaitCallback]) {\n if (Array.isArray(f) && f[0] === 'onPush' && isFunction(f[1])) {\n if (!this._listeners[f[0]]) {\n this._listeners[f[0]] = [];\n }\n this._listeners[f[0]].push(f[1]);\n }\n }\n\n getListeners(eventName: string) {\n return this._listeners[eventName] || [];\n }\n\n public async initApi() {\n return Promise.resolve();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","a","i","this","KEY_DEVICE_REGISTRATION_STATUS","DEVICE_REGISTRATION_STATUS_REGISTERED","DEVICE_REGISTRATION_STATUS_UNREGISTERED","parseSerializedNotificationParams","param","defaultValue","JSON","parse","e","console","log","undefined","v4","crypto","randomUUID","replace","c","r","Math","random","toString","isFunction","value","STORE_NAME_KEY_VALUE","STORE_NAME_MESSAGE_LOG","STORE_NAME_MAIN_LOG","STORE_NAME_INBOX_MESSAGES","storeCreatorDecorator","name","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","Object","keys","filter","key","sort","b","dateA","dateB","map","MigrationExecutor","db","migrationsBuilder","applyMigrations","applyMigrationsPack","forEach","migrationsPack","migration","onversionchange","event","info","close","databasePromise","getInstanceWithPromise","executor","Promise","resolve","reject","request","indexedDB","open","onsuccess","target","result","bind","onerror","error","onupgradeneeded","then","LogBase","_add","obj","transaction","objectStore","add","getAll","items","Array","isArray","ids","id","length","maxItems","all","slice","delete","cursor","openCursor","ev","cursorResult","push","continue","keyValue","get","timeout","isComplete","isError","check","clearTimeout","setTimeout","extend","oldValues","newValues","set","put","environment","self","registration","type","message","additional","Error","stack","levels","debug","limitLevel","Logger","setLevel","level","write","levelName","levelNumber","args","groupCollapsed","trace","groupEnd","LOGGER_LEVEL_SILENT","LOGGER_LEVEL_FATAL","LOGGER_LEVEL_ERROR","LOGGER_LEVEL_WARN","LOGGER_LEVEL_INFO","LOGGER_LEVEL_DEBUG","loggerRelationsMap","handlerConsole","code","text","getOutputFunction","logger","config","relations","applicationType","subscribers","updateLogLevel","updateApplicationType","updateApplicationCode","applicationCode","updateDomain","domain","updateDeviceInfo","deviceInfo","subscribe","handler","params","actions","options","other","data","_handler","additionalData","getMessage","subscriber","call","warn","fatal","errorAndThrow","logAndThrow","errorAndReject","cb","logAndReject","fatalAndThrow","fatalAndReject","async","sendFatalLogToRemoteServer","makeMessage","cleanError","makeCleanError","errorText","errorStack","api","inboxModel","publicMessageBuilder","messageTypeFactory","action_type","actionParams","messageType","l","startsWith","updateMessagesStatusWithCodes","codes","messages","status","updatedMessages","inboxStatusQueries","msg","indexOf","inbox_id","inboxStatus","order","putBulkMessages","action_params","image","title","send_date","imageUrl","getDefaultNotificationImage","inboxTitle","getDefaultNotificationTitle","parseInt","sendDate","toISOString","link","isRead","isActionPerformed","messagesWithNoActionPerformedCount","getDeliveredReadMessagesCount","unreadMessagesCount","getDeliveredMessagesCount","messagesCount","loadMessages","buildMessagePromises","getReadOpenMessages","getDeliveredMessages","msgA","msgB","readMessagesWithCodes","unreadMessages","performActionForMessageWithCode","document","location","href","window","history","go","putMessage","deleteMessagesWithCodes","readMessages","syncMessages","updateMessages","Store","index","indexNames","_index","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","dispatchEvent","htmlUnescapes","reEscapedHtml","reHasEscapedHtml","RegExp","source","Data","clearAll","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","setLastPermissionStatus","getLastPermissionStatus","setStatusManualUnsubscribed","getStatusManualUnsubscribed","setStatusCommunicationDisabled","getStatusCommunicationDisabled","setStatusDropAllData","getStatusDropAllData","setSdkVersion","version","getSdkVersion","setServiceWorkerVersion","getServiceWorkerVersion","setServiceWorkerUrl","getServiceWorkerUrl","setServiceWorkerScope","scope","getServiceWorkerScope","setLastOpenMessage","getLastOpenMessage","setLastOpenApplicationTime","time","getLastOpenApplicationTime","setFeatures","features","getFeatures","setInitParams","getInitParams","lastCode","getInboxLastRequestCode","lastRequestTime","getInboxLastRequestTime","getInboxNewMessagesCount","setDelayedEvent","getDelayedEvent","setPromptDisplayCount","getPromptDisplayCount","setPromptLastSeenTime","getPromptLastSeenTime","NotificationPayload","payload","chromePayload","now","getIcon","getTitle","header","silent","Boolean","body","messageHash","p","metaData","md","buttons","customData","u","campaignCode","pwcid","string","test","entity","inboxId","pw_inbox","inboxParams","inbox_params","inboxRemovalTime","getInboxImage","rootParams","_body","_p","_header","_i","_u","_l","_pwcid","_image","_buttons","_pw_inbox","_inbox_params","getNotificationOptionsPayload","icon","openUrl","getShowNotificationOptions","button","action","renotify","tag","stringify","getInboxMessage","ApiClient","checkDevice","createRequest","getConfig","applicationOpen","registerDevice","unregisterDevice","deleteDevice","messageDeliveryEvent","pushStat","setTags","getTags","registerUser","registerEmail","registerEmailUser","setEmailTags","postEvent","pageVisit","setPurchase","methodName","customUrl","ignoreAuth","entrypoint","apiToken","authRequestOptions","headers","Authorization","Origin","globalThis","origin","credentials","fetch","method","checkResponse","base_url","statusText","json","status_code","status_message","PushServiceDefault","getPermission","Notification","permission","checkIsPermissionGranted","checkIsPermissionDefault","checkIsManualUnsubscribed","askPermission","requestPermission","subscription","currentSubscription","trySubscribe","pushToken","getPushToken","_p256dn","getKey","_auth","p256dh","btoa","String","fromCharCode","apply","Uint8Array","auth","publicKey","authToken","endpoint","unsubscribe","getServiceWorkerRegistration","pushManager","getSubscription","checkIsRegister","checkDeviceSubscribeForPushNotifications","checkIsNeedResubscribe","lastPermission","getCredentials","pushTokenFromSubscription","subscriptionTokensFromStore","isEqualPushTokens","isVapidChanged","registerServiceWorker","navigator","serviceWorker","getRegistration","update","cleanCache","register","subscribePushManager","applicationServerKey","userVisibleOnly","urlBase64ToUint8Array","base64String","base64","repeat","rawData","atob","outputArray","charCodeAt","PushwooshNotification","showNotificationOptions","_canceled","show","showNotification","cancel","addEventHandler","savedEventHandlers","handlers","removeEventHandler","savedEventHandler","eventId","apiClient","getRequestParams","useCache","localStorage","getItem","exist","push_token_exist","setItem","push_token","auth_token","public_key","hash","isTrackingLogOnFailure","tags","device_type","_device_type","deviceType","ts_offset","_hwid","requestParams","attributes","timestampUTC","timestampCurrent","lastOpenMessage","expiry","msgHash","last_code","last_request_time","inbox_code","triggerEvent","page_visit","getParams","deviceModel","device_model","timezone","v","Pushwoosh","_listeners","f","getListeners","eventName","initApi","clickedNotifications","broadcastClients","clients","matchAll","client","postMessage","parseNotificationEvent","notification","notificationData","notificationTag","find","onInstallFailure","workerVersion","onActivateFailure","onClickNotificationFailure","closeNotificationFailure","pushSubscriptionChangeFailure","addEventListener","waitUntil","skipWaiting","onInstall","catch","claim","onActivate","notificationPayload","notificationOptions","notificationShowOptions","callbacks","reduce","pr","fun","onPushActions","parsedPayload","showOptions","inboxMessages","inboxMessagesPublic","inboxMessagePayload","onPush","onPushFailure","windowClients","hostname","openedHostname","pathname","openedPathname","URL","clientWithSameAddress","windowClient","windowClientHostname","windowClientPathname","focus","openWindow","newClientWindow","focusWindow","isFocusOnNewWindowClient","onClickNotification","splice","closeNotification","newSubscription","pushService","changePushSubscription"],"sourceRoot":""}